commit 51cc9df14fd1ddc6d0c13108c828aaa034ed5ff4 Author: Katboi01 Date: Sun Oct 8 18:51:40 2023 +0200 Add project files. diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..58cbc82 --- /dev/null +++ b/.gitignore @@ -0,0 +1,72 @@ +# This .gitignore file should be placed at the root of your Unity project directory +# +# Get latest from https://github.com/github/gitignore/blob/main/Unity.gitignore +# +/[Ll]ibrary/ +/[Tt]emp/ +/[Oo]bj/ +/[Bb]uild/ +/[Bb]uilds/ +/[Ll]ogs/ +/[Uu]ser[Ss]ettings/ + +# MemoryCaptures can get excessive in size. +# They also could contain extremely sensitive data +/[Mm]emoryCaptures/ + +# Recordings can get excessive in size +/[Rr]ecordings/ + +# Uncomment this line if you wish to ignore the asset store tools plugin +# /[Aa]ssets/AssetStoreTools* + +# Autogenerated Jetbrains Rider plugin +/[Aa]ssets/Plugins/Editor/JetBrains* + +# Visual Studio cache directory +.vs/ + +# Gradle cache directory +.gradle/ + +# Autogenerated VS/MD/Consulo solution and project files +ExportedObj/ +.consulo/ +*.csproj +*.unityproj +*.sln +*.suo +*.tmp +*.user +*.userprefs +*.pidb +*.booproj +*.svd +*.pdb +*.mdb +*.opendb +*.VC.db + +# Unity3D generated meta files +*.pidb.meta +*.pdb.meta +*.mdb.meta + +# Unity3D generated file on crash reports +sysinfo.txt + +# Builds +*.apk +*.aab +*.unitypackage +*.app + +# Crashlytics generated file +crashlytics-build.properties + +# Packed Addressables +/[Aa]ssets/[Aa]ddressable[Aa]ssets[Dd]ata/*/*.bin* + +# Temporary auto-generated Android Assets +/[Aa]ssets/[Ss]treamingAssets/aa.meta +/[Aa]ssets/[Ss]treamingAssets/aa/* diff --git a/.vsconfig b/.vsconfig new file mode 100644 index 0000000..aade28f --- /dev/null +++ b/.vsconfig @@ -0,0 +1,6 @@ +{ + "version": "1.0", + "components": [ + "Microsoft.VisualStudio.Workload.ManagedGame" + ] +} diff --git a/Assets/AmplifyShaderEditor.meta b/Assets/AmplifyShaderEditor.meta new file mode 100644 index 0000000..298a9bd --- /dev/null +++ b/Assets/AmplifyShaderEditor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c35641688406e2147a73ff99c330c53f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/AmplifyShaderEditor.asmdef b/Assets/AmplifyShaderEditor/AmplifyShaderEditor.asmdef new file mode 100644 index 0000000..9cb8cff --- /dev/null +++ b/Assets/AmplifyShaderEditor/AmplifyShaderEditor.asmdef @@ -0,0 +1,15 @@ +{ + "name": "AmplifyShaderEditor", + "references": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": true, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/AmplifyShaderEditor/AmplifyShaderEditor.asmdef.meta b/Assets/AmplifyShaderEditor/AmplifyShaderEditor.asmdef.meta new file mode 100644 index 0000000..594d160 --- /dev/null +++ b/Assets/AmplifyShaderEditor/AmplifyShaderEditor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f540dafdfbc0586439d98823585550d4 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/ChangeLog.txt b/Assets/AmplifyShaderEditor/ChangeLog.txt new file mode 100644 index 0000000..35fc813 --- /dev/null +++ b/Assets/AmplifyShaderEditor/ChangeLog.txt @@ -0,0 +1,4603 @@ +Release Notes: +v1.8.9 rev 00: +* Improvements: + * Added Safe Normalize option into 'Normalize' node to prevent division by zero warnings + * Added Safe option when Normalize is toggled on 'Transform Direction' node to prevent division by zero warnings + +* Fixes: + * Fixed issues with HDRP Decal template on v10.3.2 + * Fixed issue on 'Get Local Var' node syncing with its 'Register Local Var' node counterparts type change too late leading to port type issues over nested shader functions + +v1.8.8 rev 14: +* Improvements: + * Added new Receive SSR Transparent into HDRP Lit v10.x.x + +* Fixes: + * Removed unnecessary DX11 debug symbols from all URP PBR templates + * They were causing compilation errors over users on Windows 7 + +v1.8.8 rev 13: +* New Shader Function: + * Stereo Screen Pos + * Transforms a Screen Position value from non Stereo to VR Stereo + +* Fixes: + * Fixed View to World transform over 'Transform Position' node + * Fixed issue on concurrent late opening over materials, shaders and shader functions + +* Improvements: + * ASE shaders can now be opened while in Play Mode over Unity 2018.4 if no SRP template is required to be imported + * Renamed legacy HDRP and URP 7xx packages to explicitly show version range + * 'HDSRPTemplates 7xx (Legacy)' to 'HDSRPTemplates 7xx - 9xx (Legacy)' + * 'USRPTemplates 7xx (Legacy)' to 'USRPTemplates 7xx - 9xx (Legacy)' + * To avoid GUID conflicts renamed files have new GUID + * Due to how Unity importer works old files are maintained in project + * These can be safely deleted from project + +v1.8.8 rev 12: +* Improvements: + * Added directive ASE_USING_SAMPLING_MACROS when Use Sampling Macros is active + * To be used inside 'Custom Expressions' for multiple sampling behaviors + * Added Sampler State port into Bidirectional Parallax Mapping SF + * Only visible when new Unity 2018 or Higher toggle is active + * Added option "Update on Scene save" into ASE Preferences to lock SceneSaveCallback usage (Ctrl+S) + +* Fixes: + * Fixed incorrect sampler declaration on 'Custom expression' node over Standard surface when Use Sampling Macros is active + * Fixed Bidirectional Parallax Mapping SF issues when Use Sampling Macros is active + * Fixed issue with incorrect loading of Depth Vffset values on Standard Surface node + * Fixed potential issue with trying to set custom data types into 'Texture Sample node's Tex port + +v1.8.8 rev 11: +* Fixes: + * Fixed issue with Reconstruct World Position From Depth SF on both URP and HDRP v7.5.3 + +* Improvements: + * Ported Omni Decal sample to URP + +v1.8.8 rev 10: +* Fixes: + * Fixed incorrect templates package import over new SRP v7.5.3 + * Fixed visual issue with both Remap Sliders and Remap Sliders Full custom material drawers + +v1.8.8 rev 09: +* Improvements: + * Added new Write Depth option over URP PBR templates + * If Early Z option is selected SV_DepthLessEqual semantic is used instead of SV_Depth + * Added new Sample interpolator attribute on 'Vertex To Fragment' node + * Interpolates at sample location rather than at the pixel center + +v1.8.8 rev 08: +* Fixes: + * Fixed retro-compatibility issue on 'Texture Sample' node input port data + * Fixed code redefinition issue on 'Triplanar Sampler' node + +v1.8.0 rev 07: +* Improvements: + * Internaly deprecating custom NoKeywordToggle attribute in favor of Unity's native ToggleUI when on Unity 2018.1 or higher + * 'Toggle Switch' node now has option to deactivate keyword creation by its drawer + +* Fixes: + * Fixed missing end pass tag over Double Pass Unlit template used on Multipass Distortion sample + +v1.8.8 rev 06: +* Fixes: + * Fixed issue on custom values set on template modules (Blend,Cull,Depth,etc) being overwritten when reloading shader + * Fixed issue on duplicating local variables when registered with different precisions across multiple nodes + +v1.8.8 rev 05: +* Fixes: + * Fixed compilation error on 'Linear Depth' node both on URP and HDRP + * Fixed issue with canvas screenshot while window is maximized over Unity 2020.2 + * Fixed issue with sampling macros usage on 'Outline' node leading to compilation errors + +* Improvements: + * Added info message for Unity 2019.4 or higher when async shader compilation is active + * Can be turned off via Preferences > Amplify Shader Editor > Show Shader Async. Compilation Message + * 'Diffusion Profile' node now makes use of new Material Property Drawer introduced on HDRP 10 + * Only on Unity 2020.2 or higher + +v1.8.8 rev 04: +* Fixes: + * Fixed Decals not showing correctly on HDRP 10 Lit template + +v1.8.8 rev 03: +* Fixes: + * Fixed issue with Distortion feature over HD Unlit templates + * After compiling, the user may need to switch Surface Type from Transparent to Opaque and then back to Transparent over the Material Inspector + * This is due to some internal properties which need to be set by Unity's internal HD Unlit material inspector + * Fixed compilation issue with Tessellation when creating a URP/HDRP shader with multiple shader lods + * Fixed issue when updating shaders with multiple lods using deprecated templates + +v1.8.8 rev 02: +* Fixes: + * Fixed Update button message not refreshing correctly + * Fixed multiple editor visual issues when using ASE under the iOS platform + * Fixed Fetch Lightmap Value SF setting incorrect instructions for its Decode function over URP on Gamma color space + * Fixed issue with new Shadowmask feature over URP PBR 10 + +* Improvements: + * Added better fallback to shaders created with deprecated (and already inexistent) templates + * Refactored shown message by Update button tooltip + * Added new Exposure option and LOD port for 'Grab Screen Color' node (Only active on HDRP) + +v1.8.8 rev 01: +* Fixes: + * Fixed issue on 'Billboard' node with Ignore Rotation toggled over HDRP + * 'Custom Expression' node non void return test now takes internal expression mode into account + * Fixed issue with Final Color x Alpha option deactivation on Universal PBR + +* Improvements: + * Refactored how custom ASEBegin and ASEEnd decorators are placed over shader properties + * Responsible for adding the Open In Shader Editor button over Unity native inspectors and refreshing material property values over ASE canvas respectively + +v1.8.8 rev 00: +* Fixes: + * Fixed SSAO issue over Universal 10 PBR template + * Fixed issue with GPU instancing and Stereo VR on multiple Builtin Legacy templates + +v1.8.7 rev 18: +* Fixes: + * Fixed missing ASE Pragma tag over HDRP 10 Decal template + +* Improvements: + * Added new DepthNormals and GBuffer passes over Universal 10 PBR template + +v1.8.7 rev 17: +* Fixes: + * Fixed issue with debug display across multiple HDRP 10 templates + * Fixed 'Compile and show code' button not working over ASE custom shader inspector on Unity 2020.2 + +* Improvements: + * Added new strip #line directives over ASE custom shader inspector on Unity 2020.2 + +v1.8.7 rev 16: +* Fixes: + * Fixed multiple _BlendMode issues across all HDRP templates + * Fixed issue with using custom meshes on standard surface custom material inspector over 2020.1 and above + +v1.8.7 rev 15: +* Fixes: + * Automatically converting obsolete custom inspectors from HDRP v.7/8/9 when reading shaders into HDRP 10 + * Bumped internal HDRP version control to force new HDRP 10 templates to be unpacked + +v1.8.7 rev 14: +* New Node: + * Sticky Note + * Allows user to add notes directly on the ASE canvas + +* Improvements: + * Updated HDRP templates to be compatible with SRP 10 + +* Fixes: + * Fixed issue with inverted depth dir on Reconstruct World Position From Depth SF over HDRP 8 and above + * Fixed minor issue over Tags foldout on templates node properties + * Added missing SRP versions into ASE Package Manager + * SRP v.8.3.1 + * SRP v.7.5.1 + * SRP v.7.5.2 + * SRP v.9.0.0 Preview 71 + +v1.8.7 rev 13: +* Fixes: + * Fixed issue with capturing canvas screen shot while maximized + * Removed multiple incorrect port restrictions over 'Triplanar Sample' node + * Fixed issue on incorrect template behavior if on a template inline option its internal property is selected via the the inline dropdown + * Fixed issue on template options type set to inline but with no inline property selected + * Fixed issue on losing inline properties between canvas + +* Improvements: + * 'Dither' node now has new SS input port to be able to use custom sampler states + +v1.8.7 rev 12: +* Fixes: + * Fixed issue with removing Header attributes + +v1.8.7 rev 11: +* New Sample: + * Transparent Cutout for both URP and HDRP + +v1.8.7 rev 10: +* Fixes: + * Fixed issue on user not being able to use the dot/period character on Header attributes + * Fixed issue on Header attributes not being correctly shown on 'Color' node + +v1.8.7 rev 09: +* Improvements: + * User can now specify multiple headers for each property + +v1.8.7 rev 08: +* Improvements: + * Added new No Interpolation option into 'Vertex To Fragment' node + * Added new Header attribute for property type nodes + * Added new No Keyword Toggle attribute for 'Float' node + * Added new Remap Slider custom drawer for 'Vector4' node + * User must specify min limit and max limit on Z and W coordinate respectively + +v1.8.7 rev 07: +* Fixes: + * Fixed issue on 'Texture Sampler' node incorrectly generating sampler states when its R,G,B,A ports were being used + +v1.8.7 rev 06: +* Fixes: + * Fixed compilation error on Built-in RP with 'Grab Screen Color' node when Auto-Register is turned on over Unity 5.6 and above + +v1.8.7 rev 05: +* Fixes: + * Fixed issue on 'Indirect Diffuse Light' node not showing correct results over Builtin templates on Unity 2019 + * Fixed issue on SubShader body not being correctly filled if main master node's pass is disabled + * Fixed issue on incorrect clip over holes usage on URP Terrain sample + +v1.8.7 rev 04: +* New Shader Function: + * Normal From Texture + +Fixes: + * Fixed issues on Normal From Height shader function + * Fixed issue on ASE window attempting to import templates when entering in Play mode + * Fixed issue on 'Function Switch' node not updating correctly when on Reference mode + +* Improvements: + * Empty textfield value on 'Function Subtitle' node now removes the sub-title over its shader function node + * Added new Clear Log on Update option into ASE preferences (on by default) + * Clears an ASE log window each time the user hits the Update button + +v1.8.7 rev 03: +* Shader Functions: + * Removed High Quality option from Normal From Height shader function + * This will be later added on a separate shader function + +* Fixes: + * Inline code from set by 'Custom Expression' node now placed under their own scope { (...) } to prevent duplication errors + * Fixed issue on Procedural Texture type not having a texture to wire correspondence over 'Texture Sampler' node + +v1.8.7 rev 02: +* IMPORTANT - Node renamed: + * 'Break To Components' node renamed to 'Split' to decrease its canvas size + +* New Shader Functions: + * Bicubic Precompute + * Bicubic Sample + +* Fixes: + * Fixed issue on 'Break To Components' node disabling connections on loading it from disk + * Fixed issue on duplicate error thrown when multiple Normal From Height shader functions are used + +v1.8.7 rev 01: +* Shader Function Removed: + * Procedural Sample 2D Array was removed + * Procedural Sample 2D now renamed to Procedural Sample and has internal options that allow usage with 2D Array and more + +* Improvements: + * Added Fast and High Quality options to Normal From Height shader function + * Improved error messages thrown by 'Custom Expression' node + * Renamed Procedural Sample 2D to Procedural Sample and added Sample Mode option + * Planar 2D + * Planar 2D Array + * Triplanar 2D + * Triplanar 2D Array + +* Fixes: + * Fixed issue on only converting CRLF to LF and not CR to LF when reading templates or using pasted code on 'Custom Expression' nodes + * This lead to inconsistent line ending warnings being thrown + * Fixed issue on some warnings from 'Custom Expression' node no being clickable on log to select which node they were thrown from + +v1.8.7 rev 00: +* New Shader Function: + * Procedural Sample 2D Array + +* Improvements: + * Improved Procedural Sample 2D shader function + +v1.8.6 rev 02: +* Fixes: + * Fixed division by zero warning on 'Gradient Sample' node + * Fixed issue on 'Static Switch ' node incorrectly adding suffixes into fetched custom keywords + * Fixed issue with attempting to register duplicate property names when reading 'Static Switch' node meta from old ASE versions + +v1.8.6 rev 01: +* New Shader Function: + * Procedural Sample 2D + +* Fixes: + * Fixed issue with duplicate generated code over 'World Reflection' node + +v1.8.6 rev 00: +* Improvements: + * Improved Plane Clip sample + +v1.8.5 rev 06: +* Fixes: +    * Locking 'Decode Depth Normals' usage to Builtin pipeline and informing of that when used on SRP +        * Was currently generating compilation errors over SRP +    * Fixed issue on Auto-Register flag over property nodes not being correctly registered in certain cases +    * Fixed issue where graph sampling macro flag was incorrectly being set by non main master nodes + +* Improvements: +    * Auto-register check on texture property type node also register sampler if 'Use Sampling Macros' flag is enabled on master node +    * Adding support for mask maps over 'Four Splats First Pass Terrain' shader function +        * Only available on SRP and output node must have 'Use Sampling Macros' flag turned on + +v1.8.5 rev 05: +* Fixes: + * Fixed issue with incorrect values returned from nodes using internal 'Texture Object' instances + * Fixed duplicate uv declarations issue when being requested different sizes by 'Texture Sampler' nodes + * Fixed duplicate directives issue caused by adding directives on both 'Outline' node generated surface and main one + +v1.8.5 rev 04: +* Fixes: + * Fixed issue on texture node types auto-sampler generator + +v1.8.5 rev 03: +* New Sample: + * Plane Clip + +* Fixes: + * Fixed issue on 'Blend Normals' node preview not taking SRP options into account + * Fixed visual issue on node properties menu over nodes: + * Template Parameter + * Template Local Var + * Template Vertex Data + * Template Fragment Data + +* Improvements: + * Simplified 'Template Parameter' usage + * User no longer need to choose scope to parameters to be available + * New Advanced View toggle added to switch to old view + * Added widget on 'Texture Coordinates' node to change output size directly from the node + +v1.8.5 rev 02: +* New Community Shader Function + * Depth Masked Refraction by @saismirk + +Fixes: + * Fixed incorrect uv variable name being used when set is greater that 3 + * Fixed incorrect swizzling when using texture sets on vertex data over surface shaders + * Fixed issue over texture array tool on not being able to use compressed formats + +v1.8.5 rev 01: +* Fixes: + * Fixed issue regarding uv coordinates usage with tessellation on URP PBR template + +* Improvements: + * Replaced fmod instruction usage on 'Remainder' node by faster true remainder calculation + +v1.8.5 rev 00: +* Fixes: + * Fixed desync issue between graph and master node sampling macro flag + * Fixed unknown INSTANCEID_SEMANTICS enum value being thrown on legacy HDRP + +v1.8.4 rev 04: +* Fixes: + * Fixed issue on 'Substance Sampler' node + * Fixed incorrectly drawn preview on Unity 2018 and above + * Prevented incorrect ports types being set when texture order is internally changed on Substance + * Fixed variable redefinition on 'Gradient' node when used on shader functions + * Fixed duplicate issue when declaring cbuffers on both outline and main surface shaders + * Fixed URP Terrain sample layer composition + +* Improvements: + * 'FWidth' node now throws an ASE console error when connected to non-fragment ports + * Also generates dummy value to prevent compilation error + * Added terrain holes support on Four Splats First Pass Terrain shader function + * Activate Holes option + * Added new Final Color x Alpha option on URP PBR template + * Required to correctly blend terrain layers + +v1.8.4 rev 03: +* Fixes: + * Fixed Color Mask MRT Id not being written on inline properties + * Caused HDRP Lit shaders to become invisible when compiled in some versions + +v1.8.4 rev 02: +* New Template: + * Legacy/Lit + * Mimics behavior of standard surface but without some of its limitations + * Can override Baked GI + * Removes limitation of using nodes like 'Indirect Specular Light' only on Custom Lighting + +* Fixes: + * Added missing support for per-pixel normals in terrain shaders for URP (still requires adding the keyword separately) + * Fixed issue with alpha clip threshold not working properly in all cases when using the HDRP Lit template + * Fixed issue with template loading that was not catching global variable in certain situations (API) + * Fixed rare issue where changing shader templates could cause the options to fail to load properly due to not finding the new master node + * Fixed issue on Depth Texture macro declaration being incorrectly duplicated when already present on template + * Now depth related nodes can be correctly used on Particle Alpha Blended template + * Fixed issue on uncaught exception when attempting to load an in-existent Assembly-CSharp-Editor assembly + * Could happen when attempting to load invalid nodes + * Fixed issue on not being able to connect 'Texture Object' nodes to 'Register Local Var' node + * Fixed issue on vertex instructions generated by outline fragment ports to be correctly written on its vertex code + * Fixes 'Camera Depth Fade' usage on 'Outline' node + +* Improvements: + * Updated the Four Splats First Pass Terrain shader function to include a new option for SRP terrain to allow per pixel normals + * 'Static Switch' node + * Now allows editing of certain parameters while in Fetch mode + * Now allow the explicit naming of the keyword created besides the automatic one with a lock button + * Forcing vertex position w component to 1 when setting a new offset or position over Standard Surface type shaders + * Prevent real-time shadow issues on vertex manipulation + +v1.8.4 rev 01: +* Improvements: + * Added "Open in Shader Editor" button into SRP materials (needs shader save) + * Now SRP materials update ASE editor property values while the editor is open (needs shader save) + * Remove dependencies for custom shader inspector (now, allows deleting the file) + +* Fixes: + * Fixed Dots instancing option in URP unlit + * Fixed UV generation in Mesh Decals template + * Fixed Normals and Emission Bias in Mesh Decals template + +v1.8.4 rev 00: +* New HDRP Samples: + * Added new 'Decal Muddy Ground' and 'Decal Scifi Panel' HDRP samples using various types of decals + +* Improvements: + * Added automatic 'Open and Save All' button in shader function files that tries to compiled all dependency shaders and shader functions + * Texture Array tool now allows to create an asset file representing all options in order to save work for later + * Texture Array no longer locks width and height at power of two for more recent versions of unity + * Added clip shadow threshold and alpha to coverage options to URP PBR and URP Unlit shaders + +* Fixes: + * Fixed leak in the automatic template importer + * Template importer now properly skips non-shaders files when checking for changes + * Fixed issue with properties in fetch mode not loading correctly and making some property names hostage + * Fixed issue with UVs generation in specific situations where it would create variables with the same name + +v1.8.3 rev 03: +* Improvements: + * Global macros sampling option has been removed in favor of another that is set by the shader (older shader load with this option OFF while new ones start with it ON) + * Made property panel option labels flexible to the width of the panel + * Some help text added to 'Sampler State' node + +* Fixes: + * Fixed issue with assembly definition files where nodes outside of the assembly would fail to load + * Fixed issue of emission channel not working in HDRP decal template + +v1.8.3 rev 02: +* New 'Sampler State' Node: + * Allows using the default sampler state of a texture or the creation of a new one with specific options (versions prior to Unity 2018.1 have limited support) + +* Improvements: + * You can now use custom sampler states when sampling, however, in order for this to work you need to activate the option at Preferences > Amplify Shader Editor > Sampling Macros + * Activating this may cause some issues in specific situations, namely, custom expressions that do sampling must be converted to use macros as well so for now this option is OFF by default + * There are two new connection types, one for texture arrays and another for sampler states which are supported in function nodes and custom expression nodes + * Texture Array node as been deprecated in favor of the regular 'Sampler' node which now supports texture arrays and works inside shader functions + * 'Parallax Occlusion Mapping' node and 'Triplanar Sample' node now automatically detect if the input is a texture array and no longer use a toggle to turn ON the support + +* Fixes: + * Fixed issue with URP 2D templates accessing the wrong uv set + * Fixed Bitangent calculation in SRP which wasn't taking tangent sign into account + * Fixed issue with 'show and compile' button in shader inspector in unity 2020.1 + +v1.8.3 rev 01: +* Fixes: + * Fixed issues over 'Substance Sample' node + * Fixed compilation error on Unity 2018 and above + * Fixed normal texture port detection on Unity 2018 and above + +v1.8.3 rev 00: +* New HDRP Sample: + * Added new 'TV' HDRP sample using Vector Displacement Maps (VDMs) + +* New Shader Option: + * URP PBR template now has a 'Fragment Normal Space' option that allows selecting between Object, World and Tangent space outputs for the master node + +* Improvements: + * Added normal space output option for 'Triplanar' node + * Added help text for the PPS helper tool + +* Fixes: + * Fixed issue with world view dir calculation in URP PBR template + * Fixed issue with normal unpacking and scaling in SRP + * Removed HDRP dependency in ASE asmdef file + * Fixed the mosaic PPS sample that was conflicting with assembly definition files + * Fixed issues with focusing the editor window would sometimes select text fields or prevent nodes from being interactive + * Fixed 'Diffusion Profile' for HDRP 6.X.X + +v1.8.2 rev 01: +* Fixes: + * Fixed Fixed issue with auto generated UVs sometimes generate the UVs twice and failing to compile + +v1.8.2 rev 00: +* Fixes: + * Fixed 'Rejection' node to support multiple length input types just like 'Projection' node does + +v1.8.1 rev 04: +* New HDRP Template + * Decal + +* Improvements: + * Added new port to 'Voronoi' node that outputs the UVs of the current voronoi cells + * Added support for MRT for ColorMask, Blend and BlendOp in templates and template Options + * AlphaToMask is now it's own separate module that can be activated independently and supports inline properties + * Changed UV creation to support pre-calculated UVs in templates (ie: decals) + +* Fixes: + * Fixed Texture Array Creator tool in order to properly allow signed and higher bit texture formats + * Voronoi now properly creates UVs in all situations and preview was updated accordingly + * Fixed issue with instancing macro not being detected properly and being included in the wrong place occasionally generating errors in URP + +v1.8.1 rev 03: +* Improvements: + * Improved URP and HDRP templates in order to minimize their CBUFFER contents + * Updated libraries for SRP 7.3.1 and 7.4.1 + +* Fixes: + * Fixed issue with instance ID node not working correctly in URP due to templates not properly detecting the existing ones + * Fixed issue with unused tessellation properties showing up in the shader inspector + * Fixed issue with 'Reconstruct World Position From Depth' node that was preventing from compiling when used with 'Depth Fade' node + * Fixed issue with 'Reconstruct World Position From Depth' node that wasn't working correctly in SRP 7.4.X and up + +v1.8.1 rev 02: +* New Shader Functions: + * And + * Or + * Projection + * Rejection + +* Improvements: + * Added more description text to custom expression node + * Live update doesn't kick in when editing a field + * Shader Functions options label size resize according to the panel width + +* Fixes: + * Fixed 'Texture Sample' node and 'Texel Size' node previews so that they update when it's referenced texture changes + * Fixed issue with certain namespaces not being available when Assembly Definitions files are present + * Fixed samples by adding new Assembly Definition files for samples that contain their own scripts + * Fixed issue with sampler states option not working if reference node was not compiled + +v1.8.1 rev 01: +* Improvements: + * Added AssemblyDefinition file and made it so nodes can be found in the main editor assembly besides ASE assembly + * If you which to extend ASE with your own node and you already use your own assembly file you need to add ASE as a dependency + +* Fixes: + * Fixed issue with function nodes not saving their GUID correctly to the metadata + * Fixed issue with function switch nodes not saving correctly when inputs were left unconnected + * Fixed issue with reading options due to system cultural differences + * Fixed issue where clipboard copy/pasting was not respecting system cultural differences + +v1.8.1 rev 00: +* New Shader Options: + * Added new option called 'DOTS Instancing' that provides initial support for hybrid renderer for URP and HDRP + * Works for both latest V1 and V2 (check unity docs) + * URP requires shader model 4.5 in order for it to work + * Some properties nodes now have a new 'Hybrid Instanced' option when set to property mode + +* Improvements: + * CBuffer properties are now ordered by datatype for performance reasons + +* Fixes: + * Fixed issue with tessellation in HDRP where tessellation was not measuring the position correctly when relative camera was ON + * Fixed issue with the new 'Field' option type that wasn't reading float values correctly in all situations due to system cultural differences + * Fixed typo with the 'Trigonometry Operators' category + +v1.8.0 rev 03: +* New Shader Options: + * Added Translucency and Transmission options for URP + * Options are based on Built-in renderer ports respectively + * New fields are generated for both but can be manipulated as 'Inline Properties' in property panel + +* New 'Compare' node: + * Replaces all the now deprecated 'Compare XXX' nodes, this node should be easier to work with since it does ternary operations and allows for any kind of vector comparison + +* Improvements: + * 'Voronoi' node ID port now returns a vector 2 ID instead of a single float value + +* Fixes: + * Fixed issue with instanced properties marked as auto register not working inside shader functions + * Fixed issue with 'Function Switch' node that was causing some nodes to run even if unconnected + * Fixed issue with 'Decode Lightmap' node that was not compiling correctly in all situations + * Other small changes and fixes to last revision + +v1.8.0 rev 02: +* New Shader Options: + * Added Tessellation options for URP and HDRP + * Options are based on Built-in renderer options supporting Fixed, Distance-Based, Edge Length and Edge Length With Cull mode, with or without Phong displacement + * By default Float fields are generated at the bottom of the materials inspector but can be replaced by 'Inline Properties' allowing for further field customization + +* Improvements: + * Templates API now supports new 'Field' options that create Int or Float fields that can act when values change + * Templates API now support 'SetMaterialProperty' action that allows a 'Field' to interact with the value in the material inspector + * Added Q as an alternative panning modifier key (for trackpad users) while Q+Alt zooms (order is important due to Alt being used for other actions) + +* Fixes: + * Fixed issue with Start Screen icon on MacOS editors + * Fixed issue with templates not properly detecting floating values + * Fixed issue with log window and palette window producing layout errors + * Fixed issue with live editing mode not working properly with shader functions and producing errors + * Fixed 'Texel Size' node issue where variable declaration was not respecting the SRP batcher and breaking it in the process + * Fixed issue with auto spacing of shader function titles + * Fixed/Changed refraction for both URP and Built-in due to issues with webGL version + +v1.8.0 rev 01: +* Improvements: + * Now 'Texel Size' and 'Texture Transfom' nodes also contain the 'None' option for consistency + +* Fixes: + * Fixed issue with start screen window in Unity 5.6 + * Fixed issue with 'Texture Coordinates' node generating multiple texture references in some occasions + * Fixed 'Texture Coordinates' losing it's selected reference option on port connection + +v1.8.0 rev 00: +* New Shader Functions: + * Bacteria + * Bricks Pattern + * Dots Pattern + * Grid + * Herringbone + * Hex Lattice + * Houndstooth + * Smooth Wave + * Spiral + * Stripes + * Truchet + * Whirl + * Zig Zag + +* Improvements: + * Updated some shader functions to expose their internal data + +* Fixes: + * Fixed default value for start screen option + * Fixed context menu showing shader templates not yet imported on first install + * Fixed drawing issues with slider in 'Float' node in the new Unity UI + +v1.7.9 rev 02: +* Improvements: + * Added Refraction option with respective ports to URP that works like the built-in Refraction port + * Added versioning to templates so that they can track changes and import new versions if necessary + +* Fixes: + * Fixed issue with start screen showing the wrong change log + * Fixed issue with start screen not always respecting the selected option + * Fixed issue with 'Fresnel' node when loading a shader from an older version of ASE + * Fixed loop detection check for 'Get' node in certain situations + * Fixed menu listing for templates with duplicated names + * Fixed 'VertexID' node for HDRP causing errors due to motion vectors + * Fixed inline properties being broken on certain template internal pass ordering + +v1.7.9 rev 01: +* Improvements: + * Start screen option is now a dropdown to allow for more control of how it behaves + * Added more options to the preference window + * Option to prevent automatic import of SRP templates + * Option to force the use of Unity's macros for sampling + * Option to allow or prevent the use of ASE define symbol + +* Fixes: + * Included missing files for 'Diffusion Profile' node from last release which prevented the use of the new default inspector option + * Fixed issue with 'Gradient Sample' node that was not generating the component channel correctly + +v1.7.9 rev 00: +* New Start Screen: + * New window that will popup when on a new session starts and/or if a new version is released (can be dismissed) + * Provides easy start up links for the wiki and contact channels + * Streamlines the process of importing ASE samples for each rendering pipeline + * Automatically tracks the release of new versions + +* New Preferences Entry: + * Currently only controls the start screen settings but in the future it will contain many more options that are currently hidden + +* New Shader Function: + * Random Range + * Returns random value between a minimum and maximum range values + +* Improvements: + * Removed alpha to coverage alpha test check for consistency between pipeline and setups + * Added check to custom shader inspector and updated missing features like keywords popups and other small changes that came with unity 2019.3 + * Added new option to 'Diffusion Profile' node to be able to create the unity default profile inspector for users that need to share their shaders + * Changed the color of Int ports to white for proper differentiation between Float and Int + +* Fixes: + * Depth texture is now uses proper macros even when using global texture samplers to prevent duplication errors + * Added infinite loop detection to 'Get Local Var' nodes to prevent the case where you can change the 'Get Local Var' node reference to itself + * Fixed Issue with diffusion profile drawer not being able to change profiles if ASE window wasn't open + * Fixed issue with outline in surface shaders not respecting the selected precision type + +v1.7.8 rev 02: +* New Property Attributes: + * Remap Sliders attribute for Vector2 node that creates a min-max slider in the 0-1 range + * Single Line Texture attribute for texture properties nodes that minimizes texture object field into single line fields + +* Fixes: + * Fixed fog color and ambient color node values in HDRP + * Fixed issue with Fabric and Hair HDRP templates not correctly writing to depth offset in all shader passes + * Fixed custom expression precision types that didn't respect the selected choice in all cases and added a new Inherit option + * Fixed possible issue with saving files when path is null + +* Improvements: + * Improved loading of shaders by preventing unnecessary loads of other types of assets + * Added warning with fix button to diffusion profile property drawer for when profile isn't present in the profile list + * Shader functions names now have automatic spacing when searched in the palette + * Added a direct dependency check for shader function files that allows to search which shaders and shader function are currently directly using it + * Templates context entry generation is now done by name to prevent random sorting + +v1.7.8 rev 01: +* New HDRP Templates: + * Hair + * Fabric + +* New Shader Function: + * Inverse Lerp + * Inverse operation of the 'Lerp' node + +* Improvements: + * Update HD templates to v.7.1.8 and above + +* Fixes: + * Fixed issue with 'Component Mask' node preview not correctly showing alpha channel in all situations + +v1.7.8 rev 00: +* Fixes: + * Fixed issues with 'Function Switch' node incorrectly displaying reference nodes and not properly ordering when in Reference mode + +v1.7.7 rev 06: +* Fixes: + * Fixed 'Parallax Occlusion Mapping' node texture array sampling in LW/URP + * Fixed issue with 'Light Attenuation' node not taking into account vertex offset in URP templates + +* Improvements: + * Added extra pre pass option for Lightweight and Universal RP that allows for custom outline passes + * World position dependent nodes will now take vertex offset into account over LW templates + +v1.7.7 rev 05: +* Fixes: + * Fixed issues when reading shader over updated template + * Fixed 'Light Attenuation' issue on URP 7.2.X which was causing rendering errors + +* Improvements: + * World position dependent nodes will now take vertex offset into account over default Unlit and URP templates + * Improved Diffusion Profile support in HDRP 7.2.X + +v1.7.7 rev 04: +* Fixes: + * Fixed compatibility issues with HDRP v7.2.0 and above + * Fixed issue with 'Indirect Diffuse Light' node on Normal port not properly working over Lightweight RP + +v1.7.7 rev 03: +* Fixes: + * Fixed issue on Unity ignoring Emission channel values set over Debug Port + * Fixed issue with multiple uses of 'Voronoi' node over a graph + * Fixed helper window colors in personal skin + * Fixed emission contribution on baked lighting + * Fixed GUID conflicts between Lightweight and Universal samples + +v1.7.7 rev 02: +* Fixes: + * Fixed incorrect values given by time related nodes + * Fixed shadow compilation issue on HD Lit template + * Added null checks on updating shader over master node to prevent saving issues + +* Improvements: + * Decode Directional Lightmap shader function now compatible with all pipelines + * Added events that can be registered externally which indicate shader type change and shader save (API) + * IOUtils.OnShaderSavedEvent called when shader is saved + * IOUtils.OnShaderTypeChangedEvent called when shader + * Registered functions must receive three arguments + * Shader shader: Current shader being modified + * bool isTemplate: Current shader type is template based + * string type: GUID of template in use or string.empty if Standard Surface + +v1.7.7 rev 01: +* Improvements: + * Some adjustments were made to the Decode Lightmap's Instructions port + * Port is set be only visible when on SRP + * ASE automatically sets Unity's default instruction values if no value is connected to it + +v1.7.7 rev 00: +* Fixes: + * Fixed multiple connections on Wire node when Alt + dragging nodes from it + * Fixed issue with normal map usage over URP PBR + +* Improvements: + * Added new previews: + * Heightmap Texture Blend + * Parallax Offset + * Clip Planes + * Fog and Ambient Colors + * Fog Params + * Instance ID + * Object To Clip + * Object To View + * Shade Vertex Lights + +v1.7.6 rev 02: +* Fixes: + * Assured latest fix for time related nodes over SRP is only applied on latest versions + * Fixed issue on declaring variables inside CBuffer that are already on native template + +v1.7.6 rev 01: +* Fixes: + * Fixed usage of legacy variables over SRP on time related nodes + * Time + * Time Parameters + * Sin Time + * Cos Time + * Fixed issue on HD Unlit Vertex Offset input code not being set on all passes + +v1.7.6 rev 00: +* New Shader Function: + * SRP Additional Light + * Returns SRP's additional lights information calculated with a selected lighting mode + +* Improvements: + * 'Light Attenuation' node on Lightweight/Universal now outputs only the attenuation of the main light + * Before it outputted the sum of all light attenuations which didn't have a practical use + +v1.7.5 rev 03: +* New Templates: + * Universal Experimental 2D Lit + * Universal Experimental 2D Unlit + +* Fixes: + * Fixed issue on incorrectly setting a wrong instanced block name on non-main passes when using GPU Instancing over templates + * Added Safe Power option into both 'Power' and 'Fresnel' nodes + * Ensures base for power operation is always greater than zero to prevent NaN over the result + * Fixed 'Indirect Diffuse Light' and 'Indirect Specular Light' nodes preview when Normal Space option is set to World + * Fixed 'Fresnel' node preview as it wasn't showing the correct result when scale was different than 1 + * Fixed Alpha Clip issue across multiple Unlit Lightweight and Universal template versions + +* Improvements: + * Improved mouse focus behavior when ASE is not focused + * Migrated Lightweight samples into Universal RP + +v1.7.5 rev 02: +* Fixes: + * Fixed issue with incorrect _ST variable declaration on templates over 'Texture Array' node + * Fixed issue on 'Grab Screen Color' node creating a default Grab Pass when using the default grab name with Custom Grab Pass activated + * Fixed issue on 'Texture Transform' node giving incorrect values on certain connections + * Fixed node preview update for missing shader functions + * Fixed issue on 'Static Switch' node using in-existent keyword indices + * Fixed 'Static Switch' reordering issues when in Reference mode + +* Improvements: + * Added missing previews to nodes + * Ortho Param + * Projection Param + * Screen Param + * ZBuffer Param + * Clip + * Compute Screen Pos + * Texel Size + * Texture Transform + * Tweaked 'Texture Object' and 'Texture Sampler' node previews to avoid recent for AMD crashes + +v1.7.5 rev 01: +* Fixes: + * Fixed 'Color Space Double' node issue in SRP + * Fixed 'Texture Array' node ordering issue in the material inspector when on Reference mode + * Fixed issue with references lost over 'Texture Sample' on shader functions + * Small fixes and optimizations to the URP unlit template + * Fixed texture fields not being modifiable on 'Texture Sample' nodes when ASE window was not focused + +* Improvements: + * Updated 'Flow' shader function to make Strength a Vector2 input + * Improved registered local variables usage on templates + * Removed hard-code directives declaration on LWRP and added them as Port options on templates + +v1.7.5 rev 00: +* New Nodes: + * Inverse Projection Matrix + * Inverse View Projection Matrix + +* New Shader Functions: + * Noise Sine Wave + * Creates a sine wave from a given input with an added pseudo-random value + * Sawtooth Wave + * Creates a saw-tooth wave from a given input + * Square Wave + * Creates a square wave from a given input + * Triangle Wave + * Creates a triangle wave from a given input + * Checkerboard + * Created a checkerboard pattern with given colors where Frequency controls its tiling + * Ellipse + * Creates an ellipse based on given uv and dimensions + * Polygon + * Creates a polygon shape with a specified amount of sides + * Rectangle + * Creates a rectangle shape with a specified size + * Rounded Rectangle + * Creates a round rectangle shape from a given size and radius + +* Improvements: + * Added new Smooth toggle option to 'Voronoi' node + * Only available under the Cells Method + * Improved selection box inside the editor graph to match Unity's and not be version dependent + * Ported terrain sample to Universal Rendering Pipeline + * Packed inside Examples > Universal SRP Samples.unitypackage + +* Fixes: + * Fixed multiple issues regarding using instanced properties over 'Outline' node + * Fixed hard-crash when modifying pass amount over template (API) + * Fixed Native Directives display over Templates in Unity 2019.3 + * Fixed GPU instancing on Particles Alpha Blended template + * Removed Clip from From option over 'Transform Position' and 'Transform Direction' nodes + * Transform matrix was incorrect and there's no viable replacement over those nodes context + +v1.7.4 rev 02: +* New Shader Functions: + * Flow + * Creates a flow effect which can be given from a flow map. + * Twirl + * Sets a twirl effect to a given input UV. Created by The C.reator @cayou66 + * Normal From Height + * Extrapolate a normal vector from an height value + +* New Sample: + * Scale Independent Tile + +* Improvements: + * Added new Rotation Independent Scale option into 'Object Scale' node + * Tweaked 'Remainder' node to always use the % operator on Unity 2018.1 and above + +* Fixes: + * Fixed issue on loading multipass multi visible master nodes losing their names + * Fixed issue with point lights not working with instanced terrain shaders + * Fixed issue on terrain getting black when drawn instanced + * Fixed alpha test issues over deprecated HDRP Lit + * Fixed issue where not setting pass name on port options lead to incorrect option behavior (API) + * Fixed previews not updating correctly in shader functions + +v1.7.4 rev 01: +* New Template: + * Unlit for HD SRPv6.x.x + +* New Node: + * Luminance + +* Fixes: + * Fixed alpha-clip issues with legacy HD templates + * Fixed issue on incorrectly initializing custom type variables on 'Custom Expression' node + * Fixed nodes preview getting lost on loading scenes + * Fixed preview issue on 'Noise Generator' node + * Fixed preview issue on 'Panner' node + * Fixed preview issue on 'Rotator' node + * Fixed issue on ignored Passes over SubShader options appearing on both shader reload hot code reload + * Fixed issue with 'Parallax Occlusion Mapping' node when used on shader functions + * Fixed issue with setting directly the property name over its textfield wouldn't trigger the duplicates prevention system + +* Improvements: + * Updated 6.9.2 Lightweight templates to includes the same options as URP templates + +v1.7.4 rev 00: +* Fixes: + * Fixed critical error where users could not create a surface shader if no ASE window was opened + +v1.7.3 rev 00: +* Fixes: + * Fixed preview issues on multiple nodes + * Fixed incorrect template reload when multiple shaders using the same template are opened + * Fixed Ignore Rotation issues on 'Billboard' node over Lightweight RP + * Fixed issue on not importing latest SRP templates when an unregistered version is detected + * HDRP templates no longer throw console errors on Unity 2019.3 + * Fixed Alpha Clip issue on deprecated HDRPLit template + * Fixed issue on incorrectly resetting port internal data on load with matrices types + +* Improvement: + * Minor renaming on 'Baked GI' node name to 'SRP Baked GI' + * Updated URP templates to include a Baked GI port similarly to HDRP + +v1.7.2 rev 03: +* Fixes: + * Fixed issue on templates not capturing properties with certain attributes + * Fixed issue on templates inline properties not being properly set on modules if main master node wasn't the first pass + +* Improvements: + * Added Builtin Fog toggle option into Lightweight PBR template + +v1.7.2 rev 02: +* Fixes: + * Fixed issue on 'Toggle Switch' node + * Fixed abnormal behavior when reading template with more interpolators than the ones allowed by its Shader Model (API) + +* Improvements: + * Template can now read Shader Model from area outside SubShader (API) + +v1.7.2 rev 01: +* Fixes: + * Fixed issues on generating incorrect precision inputs on both 'Screen Position' and 'World Position' node + * Fixed issue on multi-pass master nodes not setting correct given shader name when created from file + * Fixed issue on WaterSample shader + * Fixed issue on 'Custom Expression' node not generating correct function code without a return statement + +* Improvements: + * Users can, like on Shader Functions, immediately name shader when creating it + * Adding Instanced option into 'Texture Transform' node + * Determines if the _ST texture transform variable is created as an instanced property + +v1.7.2 rev 00: +* Improvements: + * 'Toggle Switch' node now uses a ternary operator to prevent incorrect results on NaN inputs + +v1.7.1 rev 13: +* Fixes: + * Fixed issue duplicating certain nodes + +v1.7.1 rev 12: +* Fixes: + * Fixed issue when using more than one Octave on 'Voronoi' node + * Fixed issue on Motion Vectors pass over HD templates + * Fixed issue on generating incorrect keyword value on 'Static Switch' node using Reference Mode + +v1.7.1 rev 11: +* Fixes: + * Fixed issue on registering/unregistering internal template generated nodes over the reorder node event + * Fixed multiple issues on 'Custom Expression' node + * Fixed issue on using 'Voronoi' node over shader functions + +v1.7.1 rev 09/10: +* New Node: + * HD Emission + +* Fixes: + * Fixed issue when reading shader with missing shader function + * Fixed issue when duplicating property nodes on Fetch mode would reset property name + * Fixed issue on 'Parallax Occlusion Mapping' node incorrectly generating instanced _ST vars outside the CBuffer + * Fixed alpha cutoff issues on HD Lit templates v5.7.2 and v5.16.1 + * Fixed issue on not declaring both BakedGI and BakedBackGI on Lit template + * Fixed issue on not setting some ports with graph data over templates + +* Improvements: + * Listing on nodes is now alphabetically ordered + * Get Local Var + * Grab Screen Color + * Static Switch + * Texture Array + * Texture Sample + * Node search bar text now takes property name and inspector name into account + +v1.7.1 rev 08: +* Fixes: + * Fixed issue on 'Register Local Var' not allowing to reset name to loaded one + * Fixed Console Log issues with Personal Skin + * Fixed issue on overwriting Render Type custom values over a template(API) + * Fixed issue on local variables generation over the 'Unpack Scale Normal' node + * Fixed issue with setting special tags over template options (API) + +* Improvements: + * Added more flexibility to 'Static Switch' node + * Can have empty property names when Material Toggle is toggled off + * It no longer modifies keywords ( setting to upper, adding _ON, etc ) if Material Toggle is toggled off + * Tweaked visible options when on Fetch mode + * Added hot-fix to 2019.2 Lit template in order to generate shaders without errors when used on HDRP v7.x.x + +v1.7.1 rev 07: +* New Shader Functions: + * Derive Tangent Basis + * Height-based Blending + +* Improvements: + * Clicking on node specific messages over ASE log now jumps to which node generated it + * Changing ports types to matrix now sets the identity matrix into its internal data + * Relevant on nodes like 'Custom Expression' + +* Fixes: + * Fixed issue on incorrectly adding 0 to W channel when creating position vectors + * Fixed issue on not auto-importing templates correctly over Unity 2019 + * Fixed multiple issues regarding shader function previews + * Fixed compilation issue when using unreferenced 'Get Local Var' nodes + * Fixed issue on changing 'Static Switch' name not being reflected on referenced list + * Fixed issues with 'Texture Coordinates' and 'Texture Sampler' nodes with 'Relay' or 'Wire' nodes on Tex port + +v1.7.1 rev 06: +* Fixes: + * Fixed new and old shader templates for HDRP 6.9.X so the diffusion profile value is passed around correctly + * Fixed issue on 'Texture Coordinates' node not correctly swizzling data on template vertex functions + * Prevented Additional Directives reference lost when saving certain shader functions + +v1.7.1 rev 05: +* Fixes: + * Fixed issue on getting incorrect inline properties on templates + +v1.7.1 rev 04: +* Fixes: + * Fixed 'Diffusion Profile' node issues on SRP v6.9.X + * Fixed multiple issues regarding shader functions Additional Directives usage + +v1.7.1 rev 02/03: +* Fixes: + * Fixed issue both on creating duplicate texture ST constants and being declared out of the cbuffer + * Fixed possible issues on 'Texture Transform' node over SRP + * Fixed baked lighmap issues over Lightweight/Universal PBR templates + * Fixed SimpleTerrain sample water shader which was broken due to recent 'Screen Depth' node changes + * Fixed compilation errors on 'Voronoi' node + * Fixed issue on registering duplicate instanced variables which are already on template as non-instanced + +v1.7.1 rev 01: +* Fixes: + * Removed unused variable warning + * Broadened up Shader Function versions to apply serialized fix on Origin field + +v1.7.1 rev 00: +* Fixes: + * Fixed issue with Face related nodes not working in HDRP v6.9.0 due to bad version handling + * Fixed retro-compatibility issue with incorrectly reading Shader Function Custom Directives as Native + +* Improvements: + * Tweaked 'Get Local Var' node message thrown when no Reference is selected + * Natives UI listing is now locked on Unity 2019.3 to prevent incorrect behaviors on new UI system + +v1.7.0 rev 09: +* Improvements: + * Changing Variable Mode from Fetch to Create no longer rewrites property name on Property Nodes + * Improved property renaming when duplicating Property nodes + * Added property name to items on Material Properties list + * Can be clicked to focus on specified node + +v1.7.0 rev 08: +* Fixes: + * Fixed issue on HD Lit Diffusion Profile port being incorrectly set as type Int + * Multi Pass Master Nodes no longer reads/writes input port meta data as this must always be given by template + +v1.7.0 rev 07: +* Fixes: + * Fixed issue with the 'Diffusion Profile' node not updating from and to the material inspector + +* Improvements: + * Added new internal console inside shader canvas to more easily check ASE related messages + +v1.7.0 rev 06: +* New Shader Function: + * Non Stereo Screen Pos + * Converts a VR screen position into a non-VR one + +* Fixes: + * Fixed issue with both 'Gradient' and 'Gradient Sample' nodes on Lightweight/Universal + * Fixed 'Voronoi' node issue over templates + * 'Reconstruct World Position From Depth' now correctly works on VR + +* Improvements + * Tweaked Lightweight and Universal templates + * Pragma tag now after native includes + * Removed unused _MainTex_ST variable from Meta pass + * Shader Properties can now be fully rewritten through template options(API) + * Added Vulkan to Standard Surface Rendering Platforms + +v1.7.0 rev 05: +* New Templates: + * Added templates for Universal Rendering Pipeline + * Packed inside AmplifyShaderEditor\Plugins\EditorResources\Templates\USRPTemplates.unitypackage + +* Fixes: + * Fixed multiple issues with Lit HDRP template + * Fixed issue on not taking the 'Int' node as SRP compatible + * Fixed both 'Transform Direction' and 'Transform Position' nodes issues regarding Tangent space + * Fixed multiple issues regarding template options + * Fixed issue on incorrect reading over Depth Offset values from shader + * Minor fix on templates post-processor to prevent null pointer exceptions + +* Improvements: + * Unity global variables used as inline properties on templates are now registered so they can be correctly maintained over the final shaders + * Added LOD Cross Fade into Lightweight RP templates + * Added Inherit type into precision popup and made sure most nodes can now compile with the proper precision type + * Some nodes have a specific precision on purpose + * Improved 'Diffusion Profile' node behavior + * Added material property attribute + * Updated source code able to create profile properties in HDRP 7.X + +v1.7.0 rev 04: +* Improvements: + * When switching between shader type the connections with the same port name are kept intact + * Custom inspector for SRP 7.X is now detected automatically and upgraded from previous versions + * Templates master nodes now display the shader name in their title for better consistency +* Fixes: + * Fixed issue in SRP 7.X where certain auto defines were overriding the selected options + * Fixed issue in templates system where in certain situations defines would be set forever + * Fixed stencil options in HDRP 7.X + * Thickness port in HDRP 7.X is now always visible + * Some properties in HDRP 7.X are now override-able + +v1.7.0 rev 03: +* Improvements: + * Added support for pragma options to the template system +* Fixes: + * Fixed issue where dependent template options would be visible when it's dependency was off in some situations + * Fixed issue with wrong connection types on creation of new nodes when dragging from ports + * Fixed issue with detecting LOD parameter in templates + +v1.7.0 rev 02: +* Fixes: + * Fixed issue when selecting a shader that contains errors in 2019.3 would generate inspector errors + +v1.7.0 rev 01: +* Fixes: + * Fixed issue on incorrect initial node setup from previously saved options + +v1.7.0 rev 00: +* New Node: + * Voronoi + +* Fixes: + * Fixed issue on all templates not being available to choose over the Creates > Amplify Shader menu + * Fixed issue on Unlit absolute mode + * Fixed issue on both Lightweight templates absolute mode + * Fixed issue on 'World Space View Dir' node preview + * Fixed blinking window when 'Add'or 'Mul' nodes are dynamically changing their input ports + * Fixed issue with detection loop function that was causing massive slow downs on node connection on big graphs + * Fixed multiple issues with new Lit template + * 'Face' and 'Switch By Face' now correctly work on the latest HDRP version + * Fixed multiple issue on latest HD Lit template + * Fixed issue when selecting shaders on Unity 2019.3 + * Fixed incorrect local variable generation on multiple nodes over Standard Surface's Vertex ports + +* Improvements: + * Improved editor performance by only refreshing when needed and only updating previews that are necessary to update + * Texture array auto sorting on texture drop over Texture Array tool + * Directives can now be written both before or after (via mouse drag ) to native directives detected on template + * Added dropdown for custom editor in templates that contain the HD material inspector + * 'Depth Fade' and 'Screen Depth' can now be used on vertex shader + * Improved and optimized node search on context menu + * Node developers can now associate tags to their nodes + * Small improvement to shader function properties order when multiple shader functions are inside each other + * Improved 'Noise Generator' node + * Added new Gradient type + * Added new option to auto set noise generator values to a 0-1 range + * Added new scale input port to scale its Size input + * Extended Port options versatility when declared on SubShader (API) + * Shader Properties default values can now be set through the SetShaderProperty action (API) + * Refactored templates paths + +* Deprecated: + * Disabled ASE custom texture array inspector on Unity 2019 and above + * Marked old templates as deprecated + * These will be eliminated from the package on a future build + +v1.6.9 rev 02: +* New Template: + * Re-designed a new HD Lit template for SRP v6 and above + * Compatible with Unity's default HD material inspector + +* Fixes: + * Fixed division by zero issues on 'Blend Operations' node + * Fixed VR stereo issue in Standard Surface custom shadow caster + * Fixed issue with reorderable properties in shader function being stuck when two or more of the same SF was used inside another one + * Fixed incorrect variable naming on certain operations over both 'Transform Position' and 'Transform Direction' nodes + * Fixed issue on Input Port internal wrapper creating float3x3 with float4x4 contents + * Minor tab fixing on Unlit template + * Fixed issue on HD templates Auto-Importer + * Fixed issue on not always capturing the template custom inspector correctly + * Fixed compatibility issue with 'Diffusion Profile' node on Unity 2019.3 + +* Improvements: + * Added tag system to node search and improved how nodes are searched + * Now words don't have to be in the same order of the name to match + * Reactivated SRP Batcher compatibility + * Each UnityPerMaterial Cbuffer set in pass now contains all declared property variables + +v1.6.9 rev 01: +* Improvements: + * Added support for HDRP v6xx over Unity 2019.2 + * HDRP v5xx now set as legacy and moved into the SRP (Legacy) folder + * LWRP templates remain the same between v5 and v6 + * 'Swizzle' node is now non-destructive when connecting data with less info than selected options + +v1.6.9 rev 00: +* Fixes: + * Fixed 'Component Mask' node preview + +v1.6.8 rev 07: +* New Nodes: + * Gradient + * Gradient Sample + +* Fixes: + * Fixed nodes incorrectly moving when interacting with popup fields in recent Unity versions + * Fixed issue on incorrect size for vertex normal data on LWRP Unlit template + +* Improvements: + * Added Built-in Fog option to LWRP Unlit template + +v1.6.8 rev 06: +* Fixes: + * Fixed issue on incorrectly selecting Shader Name textfield when opening an ASE shader + * Fixed issues on incorrect uv coordinates size over 'Grab Screen Color' node + * Fixed GPU instancing and vertex offset issues on all HDRP templates + * Fixed parse issues when capturing structs inside templates (API) + * Temporarily disabled SRP Batcher as it was not properly working + +v1.6.8 rev 05: +* Fixes: + * 'Grab Screen Color' now prevents Unity macro inconsistent behavior between Unity versions + +v1.6.8 rev 04: +* Fixes: + * Fixed issues regarding Diffusion Profile usage on HDRP + +v1.6.8 rev 03: +* Fixes: + * 'Grab Screen Color' now prevents Unity macro inconsistent declaration ending between VR and non-VR compilation + * Preventing compilation errors related to GPU Instancing on SRP + +v1.6.8 rev 02: +* Fixes: + * Added missing stereo config on LW Unlit template + * Fixed Blend Mode config on HD Lit template when choosing Opaque mode + +v1.6.8 rev 01: +* Fixes: + * Fixed compilation issue with 'Grab Screen Color' node on VR + * Fixed issue on Shadow Caster pass over HD Lit template v5.16.1 + * 'Grab Screen Color' node now takes VR into account on LWRP + +* Improvements: + * Share links now have permanent lifetime + * Added new Depth Offset option into HD Lit template v5.16.1 + +v1.6.8 rev 00: +* New features: + * Added Share button that uploads select data to the cloud for easy sharing + * Added Screenshot button that takes a screenshot of the whole graph and saves it to disk + * For now this is a Windows only feature + +* Fixes: + * Fixed issue on 'Toggle Switch' node registering a toggle drawer twice causing inspector warnings + * Fixed issue on not always capturing the Fallback library on templates + * Fixed both 'HSV to RBG' and 'RGB to HSV' node previews + * Fixed issue on sometimes losing directives info on Shader Functions after being moved into a different path + * Fixed issue on Shader Function being incorrectly loaded into a separate tab after being moved into a different path + * Fixed issue on certain Pass Options only being applied to main pass Master Node + +* Improvements: + * ASE now auto-imports SRP templates if they are installed via Package Manager + * It will also import correct templates in case of user switches between versions + * User still need to open the shaders and hit the Update button so they are compiled on the correct version + * Improved canvas buttons to better represent their purpose + * Improved PPS Template under Single Pass VR + * Mosaic Effect PPS sample now fully works across VR + * Set Port Name action can now be registered on Port options block(API) + +v1.6.7 rev 06: +* Fixes: + * Fixed multiple issues on 'Custom Expression' node + * Fixed layout issue when writing input names + * Fixed issue on updating InOut/Out ports when reordering inputs + * Fixed custom loading issue on void Output or Call mode when no inputs are declared + * Fixed issue where user could set main output type as OBJECT type + * Fixed incorrect text replacement on Call mode code + * Fixed Custom Types not being correctly declared + * Fixed compilation issues both on HD Lit and PBR when WRITE_MSAA_DEPTH directive is used + * Possible fix on VR issue with Lightweight RP + * Possible fix on issue with Unlit template when using Single Pass Stereo VR + * Possible fix on issue with 'Grab Screen Color' node when using Single Pass Stereo VR + +* Improvements: + * Added Variable Mode to 'Grab Screen Color' node + * Added new Alpha port on 'Blend Operations' node to enable a more layered like behavior + * Added support to SRP 5.16.1 + +v1.6.7 rev 05: +* Fixes: + * Fixed issue with alpha cutoff on both HD Lit 5.7.2 and 5.13 templates + +* Improvements: + * Added new template option functionality to copy properties from sub shader module (API) + +v1.6.7 rev 04: +* Fixes: + * Fixed issue on not taking variables declared on template into account when registering instanced variables + +v1.6.7 rev 03: +* Fixes: + * Fixed issue on 'Static Switch' node when setting default value on Enum type + * Fixed issue on 'Triplanar Sampler' node incorrectly activating mid and bottom index ports + * Fixed normal map unpacking issues with Lightweight RP over mobile + +* Improvements: + * Adding INTERNALTESSPOS into template semantics to prevent user issues + +v1.6.7 rev 02: +* Fixes: + * Fixed exposure issue on both diffuse and specular components over HDRP templates + +* New Templates: + * Adding specific templates for legacy HDRP v5.7.2 + +v1.6.7 rev 01: +* Fixes: + * Changed how depth fetch is done to prevent issues on single pass vr + * Tweaked 'World Position' node preview shader to prevent issues over PS4 + * Fixed issue on 'World to Object' node when used on templates + * Fixed 'Custom Expression' node issue with Auto-Register on shader functions + +* Improvements: + * Post-Processing Tool now works under a InvariantCulture to be region independent + * 'Static Switch' node now supports both shader_feature_local and multi_compile_local + * Only available on Unity 2019.1 and above + * Activate the Is Local toggle over the node properties + +v1.6.7 rev 00: +* New Sample: + * Volumetric Pixelize by Raphael Ernaelsten + +* New Nodes: + * Diffusion Profile + * Packed inside HDSRPTemplates.unitypackage + * To be used on Unity 2019 with HDRP 5.13 + * Baked GI + +* Improvements: + * 'Grab Screen Color' node now works on both HDRP 4.x.x and 5.x.x + * Added new Is Variable toggle on 'Custom Expression' node + +* Fixes: + * Fixed possible null pointer access when losing focus on a ASE window + * 'Texture Sample' and 'Texture Coordinates' nodes no longer breaks GPU Instancing/SRP Batcher + +v1.6.6 rev 00: +* Improvements: + * Added support for both Lightweight and HD SRP v5.13.0 on Unity 2019 + * Templates for SRP v4.x.x on Unity 2018.3 are still accessible through packages + * HDSRPTemplates 4xx (Legacy) + * LWSRPTemplates 4xx (Legacy) + * Updated 'Triplanar Sample' node to include a new position port + * Also updated TriplanarProjection sample to include this node usage + +* Fixes: + * Fixed issue with using vertex tangent data over SRP templates + +v1.6.5 rev 00: +* Fixes: + * Fixed issue on interpolator usage on template based shaders when current shader model max amount is reached + +v1.6.4 rev 03: +* Improvements: + * Improved Post-Processing Tool behavior + * Removed dependencies on Unity's Post-Processing Stack libs to prevent compilation issues + * Added new 'Allow In Scene View' option + +v1.6.4 rev 02: +* Fixes: + * Added missing ase_pragma tag over PPS template + +v1.6.4 rev 01: +* Fixes: + * Fixed issue with using 'Indirect Diffuse Light' node with Lightweight PBR template + +v1.6.4 rev 00: +* Fixes: + * 'Indirect Diffuse Light' node now works on the HD SRP templates + * Fixed memory leak on closing ASE windows + * Fixed port define issue with linked ports over template options (API) + * Fixed loading issue on 'Reconstruct World Position From Depth' shader function + +v1.6.3 rev 09: +* Fixes: + * Added missing ase_frag_input tag on Lightweight Unlit SRP template + * Fixed compiler issues when using 'Face' and 'Switch by Face' nodes on Vertex Ports + +* Improvements: + * Minor tweak on Simple GPU Instancing sample for GPU Instancing behavior to be more evident + +v1.6.3 rev 08: +* Improvements: + * Standard Surface custom ASE shadow caster can now be turned off + * Toggle on new 'Use Default Shadowcaster' option over Rendering Options group + +* Fixes: + * Nodes 'Face' and 'Switch by Face' now properly work over the HD Unlit template + * Fixed issue on missing ase_frag_input tags over HD Unlit + * Template Port Options can now be properly registered over SubShader (API) + +v1.6.3 rev 07: +* Fixes: + * Removed unnecessary code being used when on Custom Lighting + * Fixed 'Light Color' node not being correctly reset when on subtractive lightmaps + * Removed gi.light.color usage from Blinn Phong Light shader function as it was a temporary fix for the above + +v1.6.3 rev 06: +* Fixes: + * Fixed issues on 'Light Attenuation' node over Lightweight SRP + * Removed incorrect N.L contribution + * Fixed issue on duplicate variables when using multiple nodes + +v1.6.3 rev 05: +* New Sample: + * SRP HD Omni Decal + +* Fixes: + * 'Indirect Diffuse Light', 'Indirect Specular Light' and 'Light Attenuation' now works on Lightweight SRP + * Fixed issue on 'Screen Position' node previewer when on Screen Mode + * Fixed 'Screen Depth' node issue over Particle Alpha Blended template + +* Improvements: + * 'Static Switch' nodes now have a Reference mode + * Can use other nodes as reference, similar to 'Texture Sample' node + * Minor cleanup on 'Reconstruct World Position From Depth' shader function + * Can set shader functions as hidden so it wont show on context menu + * Activate Hidden toggle over shader function General options + +v1.6.3 rev 04: +* Fixes: + * Minor fix on Screen Space Detail sample + * Fixed issue on instanced surface terrains not being able to be picked/selected + * Fixed issue with lightmaps and instanced standard surface terrains + * Fixed issue with 'Four Splats First Pass Terrain' shader function on default templates + * Fixed issue with duplicate local variables on 'Texture Coordinates' + * Fixed issue on duplicate ST variable when using Particle Texture Parameter over Particles template + +* Improvements: + * 'Switch By Pipeline' node now takes default template and surface into account + * UsePasses can be directly registered by nodes on data collector(API) + * ASE Custom Shader Inspector now also shows SRP Batcher compatibility status + +v1.6.3 rev 03: +* Fixes: + * Fixed issues with Custom Lighting on Subtractive Lighting Mode + * Fixed issue on Diffusion Profile Id not being correctly written when Transmission is activated on HD Lit template + +v1.6.3 rev 02: +* Fixes: + * Fixed issue with Mosaic Effect PPS sample not opening correctly on Unity 2018.1 and 2018.2 + * Fixed issue on Multi Pass Distortion sample not taking skybox into account + +* Improvements: + * User can now specify sub-shader tags + * Moved RenderType tag to sub-shader level + +v1.6.3 rev 01: +* Fixes: + * Fixed issue on screen position calculation across all templates + * Fixed issue with 'Parallax Occlusion Mapping' node + +* Improvements: + * Minor tweak on Post-Processing Stack template + +v1.6.3 rev 00: +* Fixes: + * Fixed multiple issues with 'Triplanar Sample' node over SRP + +v1.6.2 rev 11: +* Fixes: + * Fixed issue on ST registry at 'Parallax Occlusion Mapping' node not taking SRP name convention into account + * 'Reconstruct World Position From Depth' shader function now compatible with HDRP + * Fixed crash caused by the 'Outline' node when attempting to be used on nested shader functions + * Fixed issues with 'Screen Position', 'Depth Fade' and 'Screen Depth' nodes on PPS template + +v1.6.2 rev 10: +* New Template: + * PostProcessStack + * Post-Processing shader based on Unity provided example + +* New Sample: + * Mosaic Effect PPS + +* New Tool: + * Post-Processing Stack Tool + * Generates a cs script with a PPS Renderer and Settings from a given shader + +* New Shader Function: + * Decoding Directional Lightmap + +* Improvements: + * Added inline property for Alpha to Coverage option on Standard Surface Shader Type + +* Fixes: + * Fixed 'Triplanar Sample' and 'Parallax Occlusion Mapping' nodes issues with texture arrays on SRP + * Fixed crash caused by the 'Outline' node when attempting to be used on templates + * This node is specific to Standard Surface Shader Type + * Fixed issue with using Lightweight PBR legacy template + +v1.6.2 rev 08/09: +* Fixes: + * Fixed issue with depth texture fetching on Lightweight SRP + +v1.6.2 rev 07: +* Fixes: + * Fixed issue on template asset post processor + +v1.6.2 rev 06: +* Improvements: + * Updated Decals code and removed warnings from HD Lit template + * Improved behavior when loading outdated meta from shaders using modified templates + * Added No Scale and Offset attribute to 'Texture Array' node + +* Fixes: + * Fixed instancing issues over HD Lit template + +v1.6.2 rev 05: +* New Shader Function: + * Blinn Phong Light Wrap + +* Fixes: + * Fixed issue with null pointer exception when hacking selection on dynamic ports + * Input ports which appear on p.e. 'Add' and 'Multiply' nodes when dragging wires + * Fixed shadow issues on HD PBR samples + * Fixed 'Billboard' node issues on HD SRP + * Fixed D3D11 internal compiler error on Android + VR over multiple templates + * Fixed issue with Depth Texture declaration on particles template over Android + VR + * Fixed issue with local var declaration of custom types on 'Custom Expression' node + * Fixed issue with 'Object To World','World To Object' and 'Transform Position' nodes + +* Improvements: + * Added the action of (de)activating ZWrite when Surface type is selected on HD Lit template + * Added the action of selecting correct Blend RGB when Surface Type is selected on HD Lit template + * Improved failsafe to when template creators changes order on passes, removes or add new ones + * Depth Texture now being declared with Unity's own macro on Unity 5.6 and above to prevent issues + * Updated HD templates and samples to v.4.9.0 + * Users can still use v4.8.0 although template shaders will present an error + * Final compiled shader will have error removed + * Added Refraction's Chromatic Aberration as an Inline Property on Standard Surface + * Located on Blend Mode menu, bellow Refraction Layer option + * Only shows when Refraction port is connected + * 'DecodeLightmap' now working on latest SRP templates + * 'Fetch Lightmap Value' shader function now takes SRP into account + +v1.6.2 rev 04: +* Fixes: + * Fixed World To Object and Object To World operations on Lightweight SRP + +* Improvements: + * Added support for Terrain instancing over Unity 2018.3 + * Correctly handling when user wants to disable main output node + * Minor tweaks over SRP templates global tags to be able to properly inject code dependent on vertex data + +v1.6.2 rev 03: +* Fixes: + * Fixed issue on HD Lit Motion Vector's pass + * Fixed issue with Default UI template when used on Sprite Renderers + +* Improvements: + * SRP templates no longer have CBuffer block pre-written + * Instanced Properties now correctly declare CBlocks + * Added new Receive Shadows option into Lightweight templates to correctly handle shadows + +v1.6.2 rev 02: +* New Node: + * Instance Id + +* Fixes: + * Fixed issue on not being able to have multiple property nodes fetching the same variable + * Fixed version issue on both HD and LW samples + +* Improvements: + * Removed hard cap on interpolator usage on templates + * Message is thrown to the user if maximum allowed by shader model is reached + +v1.6.2 rev 01: +* New Template: + * HD Lit + +* New Sample: + * SRP HD Lit Refraction + +* Improvements: + * Can add options on template which lets users change its behavior when using it on ASE + * Added Vertex Position option into Unlit and SRP templates + * Specified value on Vertex input port can now be either a relative value or an absolute one + * Passes can now be excluded from final shader through Available Passes menu over SubShader Properties + +* Fixes: + * Fixed issues with Lightweight PBR Shadow Caster on WebGL and Android + +v1.6.2 rev 00 / v1.6.1 rev 05: +* New Template: + * Unlit Lightmap + +* New Sample: + * Unlit With Lightmap + +* Fixes: + * Fixed issue on 'Depth Fade' node with custom Vertex Positions + * Fixed issue with using the X,Y,Z,W output ports on 'Object To World' node + +v1.6.1 rev 04: +* New Node: + * Linear Depth + * Converts values given on logarithmic space to linear + +* Improvements: + * Minor improvement on nodes loading time when initializing ASE + +* Fixes: + * Fixed local variable duplicate issue when using 'Depth Fade' and 'Screen Position' nodes + * Fixed serialization issue with Additional Use Passes and Fallback data when going into play mode + * Fixed HDRP issues on Motion Vectors pass + * Fixed issue with uniform keyword usage inside cbuffers (SRP templates) over PS4 + * Fixed issue with 'Common Transform Matrices' node over SRP templates + * Fixed object to world/world to object space transform on transform nodes over HD templates + * 'Transform Position', 'Object To World' and 'World To Object' nodes + * They now take SHADEROPTIONS_CAMERA_RELATIVE_RENDERING keyword into account + * Fixed issue with 'Pixelate UV' node when used over vertex functions + * Fixed foldout issue between Additional Surface Options and Custom SubShader Tags on Surface node properties + +v1.6.1 rev 03: +* New Shader Functions: + * Terrain Wind Value + * Terrain Wind Animate Vertex + * Updated Simple Terrain sample to use this shader function + +* Improvements: + * Updated HDRP PBR template to v4.6.0 + * Added Alpha To Coverage/Alpha To Mask option into templates + * Set under the Blend Mode area + +* Fixes: + * Fixed issue on Emission color being added over Forward Add pass when using 'Standard Surface Light' node + +v1.6.1 rev 02: +* Fixes: + * Fixed issue with reordering material properties for Translucency and Refraction port's properties + * Fixed issue with 'Texture Sample' node when referencing an unconnected node + +v1.6.1 rev 01: +* Improvements: + * Updated HDRP templates to v4.3.0 + * 'Vertex Tangent' node now has Size option + * Added access to all 8 UV sets on Surface shaders + * Re-added 'Clip' node + * First Input Port acts as a relay + * Clip uses difference between Alpha and Threshold ( Alpha - Threshold ) + +* Fixes: + * Fixed issue with late directives being injected on globals tag when functions area is available + * Affected usage of 'World Space Light' nodes on HDRP templates + * Fixed division by 0 issue on 'Triplanar Sample' node + * Fixed incorrect directional light vector usage on HDRP templates + +v1.6.1 rev 00: +* Fixes: + * Excluding Primitive ID source code from MacOS + +v1.6.0 rev 00: +* Improvements: + * Updated SRP templates to v4.2.0 + +* Fixes: + * Fixed issue on GBuffer pass over HD PBR template + * Fixed alpha clip issues on Legacy HD PBR template + +v1.5.9 rev 02: +* New Nodes: + * Vertex Id + * Primitive ID + +* New Shader Functions: + * Perturb Normal HQ + * Prepare Perturb Normal HQ + +* Improvements: + * Matrix type nodes can now be GPU instanced + +* Fixes: + * Fixed issue with 'Fresnel' node with Tangent Normal vectors on Surface shaders + * Fixed issues on Motion Vector pass on both 3.x.x. and 4.x.x templates + * Fixed issue with world pos generation on HD 4.x.x + +v1.5.9 rev 01: +* Improvements: + * Added Auto Gamma to Linear option into 'Color' nodes when set to Constant + * Added access to all 8 uv channels on 'Texture Coordinates' and 'Vertex TexCoord' nodes + * Only for 2018.2 and above + +* Fixes: + * Fixed 'Gamma To Linear' and 'Linear To Gamma' compiler errors on SRP v.4.x.x + +v1.5.9 rev 00: +* Fixes: + * 'Grab Screen Color' node now also working on Lightweight SRP v3.x.x + * Fixed possible issue with Shader Function creation callback not being inside AmplifyShaderEditor namespace + +v1.5.8 rev 03: +* Fixes: + * Fixed multiple issues in both PBR and Unlit templates for HD SRP v4.x.x + * Fixed issue over clip space transforms on HD SRP + * Fixed issue on sampling depth buffer on HD SRP + +v1.5.8 rev 02: +* Improvements: + * Multiple improvements over 'Global Array' node + * Added support for jagged arrays + * Added Auto-Register toggle + * Can reference other nodes through new Mode dropdown ( similar to 'Grab Screen Color' node ) + +* Fixes: + * Fixed memory leak over 'Template Local Var' node + * Fixed HD templates issues over new HD 4.1.0 + +v1.5.8 rev 01: +* Fixes: + * Fixed issue on Live Mode writing on non ase shaders when loaded into canvas + * Fixed issue on MacOS with scroll bar over Texture Array Creator tool + * Fixed issue on MacOS with 'Function Input' node generated default Sampler 2D value + +* New Shader Function: + * Substance Blend Metallic + +* Improvements: + * 'Grab Screen Color' node is now supported on LW SRP + * Uses the new _CameraOpaqueTexture which must be requested on the pipeline asset + * Must toggle on the Opaque Texture option over its General foldout + * Added Clip and Tangent spaces into 'Transform Direction' node + * Added Tangent space into 'Transform Position' node + +v1.5.8 rev 00: +* New Sample: + * Substance 2018 + +* Fixes: + * Fixed canvas crash when loading shaders with missing templates + * Fixed issue on UV Coords creation over 'Substance Sample' Node + * Fixed issue with loosing Substance reference on 'Substance Sample' node when applying new changes on it + * Only happened on Unity 2018 with Substance in Unity plugin + * Fixed issue on nested instanced properties over shader functions not being taken into account + +* Improvements: + * Upgraded Lightweight and HD templates to v5.0.0 + * Maintained templates for v.3.x.x under the packages HDSRPTemplates (Legacy) and LWSRPTemplates (Legacy) + +v1.5.7 rev 02: +* Fixes: + * Fixed issues on 'Static Switch' node + * Property Name wasn't available in all options + * Keys on Keyword Enum over Fetch Mode were being automatically upper cased + * Fixed issue on 'Get Local Var' node not propagating node data correctly after being loaded + +v1.5.7 rev 01: +* New Templates: + * Custom RT Init + * Packed inside AmplifyShaderEditor > Plugins > EditorResources > Templates > CustomRTTemplates + * Custom RT Update + * Packed inside AmplifyShaderEditor > Plugins > EditorResources > Templates > CustomRTTemplates + +* New Sample: + * Custom Render Texture Rain + * Packed inside AmplifyShaderEditor > Examples > Custom RT Samples + * Needs both Custom RT Init and Custom RT Update templates to be imported into project + +* Fixes: + * Fixed issue on Queue Offset incorrect writing over templates + * Fixed issue on templates not recognizing uint + * Fixed minor issue over Directives UI + * Fixed Shadow Coord macro registry differences between Unity 5.5 and above + +* Improvements: + * Added Substance Plugin integration over ASE for Unity 2018 and above + * Added Mirror option into 'Depth Fade' node + * Enabled by default, which was older behavior + * If toggled on, sets an abs operation over the final value + * Custom Render Textures can now be used/dragged over ASE + * Can Pan and Zoom ASE canvas camera through keyboard directional keys + * Up/Down/Left/Right Arrow keys pan camera + * Alt+Up/Alt+Down/Alt+Left/Alt+Right Arrow keys zoom camera + +v1.5.7 rev 00: +* Fixes: + * Fixed issue with using FACE type nodes over both Lightweight and HD Unlit templates + * Fixed issue regarding 'Lerp' node's Alpha input port always loading as a Float type + * Fixed minor issue on 'Function Subtitle' node tooltip + * Fixed minor issue on 'Posterize' node + * Power variable should not be shown on property window if its input port is connected + * Fixed minor issue with auto-spacing over shader function names + +v1.5.6 rev 08: +* Fixes: + * Fixed Queue Offset not being correctly set when loading certain template based shaders + * Fixed HSV nodes previews + * Fixed multiple issues with Directives over shaders functions + * Fixed issue on nodes not being correctly set up over template's invisible passes with linked ports + +* Improvements: + * Directives in Include mode now fully support cgincs and hlsl files to be dragged into them + * Similar behavior of inline properties, click on button right next to Include textfield to activate object drop UI + * Adding GPU Instancing support to Unlit template + * Adding new Vertex Position port into 'Depth Fade' node + * Adding new Saturate option into 'Depth Fade' node + * Can now set precision to each 'Custom Expression' node items individually + +v1.5.6 rev 07: +* Fixes: + * Fixed duplicated events registry when loading graphs + * Fixed incorrect instanced variables reset over shader functions + +v1.5.6 rev 06: +* Fixes: + * Out variables on 'Custom Expression' node no longer appears as inputs + * Fixed issue on not updating output port names correctly over 'Custom Expression' node + * Fixed issue on properties with Header(...) not being written on shader + * Fixed incorrect read/write on MRT Blend Mode and Op over template based shaders + * Fixed possible infinite loops caused by 'Register/Get Local Var' nodes + * Fixed Shader Type dropdown items not updating names correctly according to changes on template + * Fixed issue on adding multiple ASE tabs on Unity 2018.3 + * Fixed WebGL error over 2018.3b + * Fixed 'Parallax Offset' node issues when used on Lightweight and HD SRP templates + * Fixed dynamically created outputs over shader function not being correctly set after hot code reload + +* Improvements: + * Property Name and Values get its label clamped when too big + * Full original name and value is shown over its node tooltip + * Hidden tag on template shader names no longer created a category called Hidden + * Adding new ase_funcs tag functionality to determine where function code should be injected + * If not specified, functions are grouped with global variables as before + * Improved template reloading after being manually edited + +v1.5.6 rev 05: +* Fixes: + * Fixed 'Smoothstep' node code generation issue + * Fixed ASE item grouping issue on Create menu over Unity 2017 and above + +v1.5.6 rev 04: +* Fixes: + * Fixed shortcut manager to take 2018.3 new event behavior into account + +v1.5.6 rev 03: +* Fixes: + * Fixed several shader functions issues + * Fixed Undo issue when using directives textfields + * Fixed issue of null references being set on directives list when loaded + * Fixed directives not being correctly written on shader + * Fixed incorrect Refraction port activation issue on Standard Surface Custom Lighting + * Fixed issue on Property nodes with Auto-Register toggled on not being registered + * Fixed cascaded shadows issue on HD PBR template + +* Improvements: + * Minor update on 'Smoothstep' node ports behavior + * Added preview to 'Swizzle' node + +v1.5.6 rev 02 +* Fixes: + * Fixed issue on multi-pass templates not getting correct interpolator count from subshader info + * Fixed issue on Depth Offset template option auto enabling after hot code reload + +* Improvements: + * Using current world position and world view direction when getting indirect specular light values on templates + +v1.5.6 rev 01 +* Fixes: + * Fixed issue with global variables on Property type nodes being ignored by Auto-Register toggle + * Fixed Native Directives capture issue over templates + * Fixed issues on adding duplicate directives if they are already natively on the template + * Fixed compilation errors from Gamma/Linear nodes on SRP templates + * Fixed ArgumentOutOfRangeException over file path on new shader creation + * Fixed issues over Motion Vector pass on HD PBR template + * Fixed issue on 'Light Color' node with HD templates + * Fixed issue on 'World Space Light Dir' node with HD templates + * Fixed issue on 'Object Space Light Dir' node with HD templates + +* Improvements: + * Added support for Variable Mode over Texture Objects type nodes + * Adding UI Widget helper for setting Render Type and Queue for templates + * On SubShader Tags group, Value UI changes as soon as user writes RenderType or Queue on the Name textfield + +v1.5.6 rev 00 +* New Samples: + * SRP Lightweight Terrain + * Multi Pass Distortion + +* New Node: + * Switch by Pipeline + * Shader function specific node to choose different paths according to current pipeline + +* New Shader Function: + * Fetch HD Color Pyramid + +* Fixes: + * Fixed world position issues over HD PBR Template + * Fixed transparent issues over HD PBR template + * Prevented WorldNormalVector macro to confuse lerp operations + * Fixed issue on created shaders being placed in incorrect folders when on two column node + * Fixed issue on property registering over multi-pass shaders + +* Improvements: + * Custom Options can now be added directly over templates + * Adding Final Color x Alpha custom option into LW PBR + * If toggled on multiples fragment final color by its alpha + * Apply Fog on LW PBR takes Add Pass directive into account + * Adding SRP support to Four Splats First Pass Terrain shader function + * Material Global lIllumination flags for emission can now be modified over Surface Rendering Options + * Activated Variable mode into 'Texture Sample' nodes + +v1.5.5 rev 01 +* Fixes: + * Fixed issue over incorrect name registration over 'Register Local Var' on pasting into another shader + * Fixed issue on reading shaders using old shader functions with deprecated nodes + * Fixed 'World Pos' node issue on HD SRP template + * Fixed issue on 'World Normal' node when used in 'Lerp' node + +* Improvements: + * 'Register/Get Local Var' nodes maintain connections even if copied to another shader + +v1.5.5 rev 00 +* New Node: + * Diffuse And Specular From Metallic + +* Fixes: + * Fixed issues on graph not being updated with material changes on inspector if tab is opened but not selected + * Preventing Culture difference issues on material copy-paste + * Fixed issue on all modules template tag conflict with existing shader model definition + * Fixed HD issue on 'World Position' node + * Fixed issue on losing name when copy-pasting property nodes between shaders + * Fixed issue on resetting custom inspector to ASE default when loading or hot code reloading shader with its textfield empty + * Fixed issue on not setting importer correctly on 'Texture Sample' node when setting a normal map type texture from inspector + +* Improvements: + * Properties on invisible passes can now be synced with main pass over templates + +v1.5.4 dev 10: +* New Sample: + * SRP HD Material Types + * Please notice that for SSS to work properly, a Diffusion profile must be attached to the HD pipeline asset + * We already supply one over the sample folder ( Diffusion Profile Settings ) + +* Fixes: + * Fixed UX issue with Auto-Register/Set Unique flags on 'Custom Expression' node + * Fixed issue with cascade shadows over Lightweight template + +* Improvements: + * Added Material Types selector into HD template + * Subsurface Scattering + * Standard (Metallic) + * Specular + * Anisotropy + * Iridescence + * Translucent + +v1.5.4 dev 09: +* Fixes: + * Fixed Grab Pass issue with 'Outline' node + * Fixed PreviewRenderUtility leak over shader and material inspector on 2018.2 + * Fixed issue with 'PI' node over HD SRP + +* Improvements: + * Minor improvement over shader save time + +v1.5.4 dev 08: +* Fixes: + * Fixed issue on 'Component Mask' node generating compilation errors inside shader functions with auto-cast inputs + * Fixed issue on loop unroll error over 'Parallax Occlusion Mapping' node + * Fixed issue on crashing ASE when loading a shader or shader function with a missing shader function reference + * Adding error message when loading a shader or shader function with missing shader functions + +* Improvements: + * Added support to Vertex Normal modification on both Unlit and PBR HD templates + * Adding 'Global Array' variable name info directly on node + +v1.5.4 dev 07: +* New Templates: + * HD PBR + * HD Unlit + +* Fixes: + * Fixed issue on incorrectly capturing module tags + * Fixed issues with 'Flipbook UV Animation' node + * Fixed multiple issues with Directives usage under shader functions with templates + * Fixed issue on 'Custom Expression' node loading on Call mode + * Fixed issue on unpacking normals with scale on templates over multiple nodes + * Changing tessellation on Procedural Wall sample shader from edge to distanced based to prevent metal issues on Mac + +v1.5.4 dev 06: +* Fixes: + * Fixed issue on 'Toggle Switch' node not taking Custom Attributes into account + * Fixed out of bounds exception over 'Static Switch' node + * Fixed issue on templates port linking behavior + * Fixed issues on 'Texture Array', 'Triplanar Sample' and 'Unpack Scale Normal' nodes on Lightweight SRP + * Fixed issue on shader function directives not being written on template based shaders + * Fixed serialization issue on saving/loading shader function directives + * Fixed issue with using 'Texture Array' node inside shader functions + * Fixed shader compilation errors on'Parallax Occlusion Mapping' + * Now it does not generate code if no 'Texture Object' node is connected to it + * Fixed issue on 'Grab Screen Color' node not updating reference list correctly when copy/pasted + * Fixed issue with Undo'ing a 'Grab Screen Color' node on reference mode + +* Improvements: + * Min and Max Samples options on 'Parallax Occlusion Mapping' node are now inline options + +v1.5.4 dev 05: +* Fixes: + * Fixed issue with Vector and Matrix UI spacing on 'Custom Expression' node + * Fixed issue on functions being generated twice over a 'Custom Expression' node when auto register and connection are both on + * Fixed Blend Op issues with OFF state + +* Improvements: + * Can now use a custom screen position into 'Dither' node + * Added Normalize option into 'Compute Screen Pos' node + +v1.5.4 dev 04: +* Fixes: + * Fixed issue on resetting material's Render Queue setting when compiling the shader in Material mode + * Fixed issue on Blend Op menu not showing when loading a template based shader + +* Improvements: + * Re-adding DX11 specific Blend Ops into its respective dropdowns + * 'Custom Expression' node items are now reorderable + * 'Custom Expression' node can now register dependencies to other ones + * Can now better control function register order on final shader + +v1.5.4 dev 02/dev 03: +* New Shader Function: + * Color Mask + +* Fixes: + * Fixed issue on template Unlit SRP generating an error when creating a Color or MainTex named property + * Fixed issue on both 'Surface Depth' and 'Camera Depth Fade' nodes when inputting a custom vertex position + * Stencil module on Pass now uses SubShader Cull mode if it's not specified on it + * Important since Cull determines if separate stencil ops are show for each face + * Fixed issue with Fallback shader selector not updating if its textfield is focused + * Fixed issue on Grab Pass only being registered on first pass when on multi-pass templates + +* Improvements: + * Added auto register option into 'Grab Screen Color' node + * Adding UsePass support + * New Additional Use Passes section on both Surface and Template output nodes + * Can add UsePass before or after Surface code via a Location dropdown + * On Templates the Below location is still under development and its not available + +v1.5.4 dev 01: +* New Shader Function: + * Fetch Lightmap Value + +* Improvements: + * Simple Terrain sample now support more than four splats + +* Fixes: + * Fixed issue on Node Palette reading incorrect maximized value when opening ASE window + +v1.5.3 dev 12: +* Fixes: + * Fixed null pointer exception with texture arrays over shader functions + * Fixed memory leak on shader functions destruction + +* Improvements: + * Improved templates loading behavior after hot code reload + * Replaced individual lists for pragmas, defines and includes by a single reorderable list + * Now user select what each line represents via a dropdown + * Additional surface options can now be added via the Additional Surface Options tab on the Output node + * Added custom type for 'Custom Expression' node data type specification + +v1.5.3 dev 11: +* Fixes: + * Fixed issue on not correctly cleaning Undo stack when changing master node + * Fixed multiple issues with safe normalize operation over world light dir and view dir + * Fixed world light dir issues over Lightweight SRP + * Fixed GPU instancing compile issues on Lightweight SRP + * Fixed issue on Includes/Pragmas/Defines UI not showing when no other modules over a template + +* Improvements: + * Optimizing property block allocation for instanced variables to have less internal padding involved + * Added custom attributes to 'Toggle Switch' node + * Added toggle to 'Matrix from Vector' node use each input as column + +v1.5.3 dev 10: +* Fixes: + * Fixed issue with being able to duplicate output nodes on templates + * Fixed issue on foldout flag values being shared between multiple ASE tabs + +* Improvements: + * 'Get Local Var' port is locked until a valid reference is set to prevent incorrect connections + * Updated About image and added Manual link on Amplify Shader Editor menu group + * Adding unique id duplicate prevention over shader load + * Added support for stencil operations on Lightweight templates + +v1.5.3 dev 09: +* New Shader Functions: + * Lerp White To + * Detail Albedo + +* Fixes: + * Fixed API library excluding tool for custom nodes + +* Improvements: + * Template creators can now register all modules + * Simply add the /*ase_all_modules*/ either on the Pass or SubShader body + * Templates now support Fallback definition on shader + * Templates now support Dependencies definition on shader + +v1.5.3 dev 08: +* Fixes: + * Fixed Instance ID issue over Lightweight SRP template + +* Improvements: + * Added API option to remove includes on data collector + * Stencil can now be toggled off on templates which have it + +v1.5.3 dev 07: +* New Sample: + * Projectors + * Exemplify Unity Projectors usage under ASE + +* Improvements: + * Improved Texture Array Tool + * Now also creates Texture3D by hitting the Texture 3D toggle + * Can drag and drop multiple textures into tool + * Can drag and drop a folder and it will include all its nested textures + * Added Clear button to remove all textures from Texture List ( UI still work in progress ) + * 'Parallax Occlusion Mapping' node now also supports Texture 3D + * Replaced the Texture Array toggle by a Texture Type dropdown + * User must explicitly set the current 3D texture slice via the Tex3D Slice input port + * Removed Fixed precision type since it's no longer available on Unity 2018 + * Updated Lightweight PBR template to v1.1.8 + * Re-factored Templates location and names + * New and more flexible templates will be gradually added to replace legacy ones + * A cleaner Unlit template shader was already added on this build + +* Fixes: + * Fixed issue on using depth operations on particle template + * Fixed sometimes light attenuation not showing up correctly + * Fixed allowing to open unity built-in shaders on ASE + * Fixed issue on using incorrect port value on 'Refract' node + * Fixed issue on Texture Object type nodes loosing texture type after load + +v1.5.3 dev 06: +* New Sample: + * XRay + * Object has different drawing behavior in front and behind a wall + * Wall pattern is procedurally generated + +* Improvements: + * Template internal properties can be used as inline properties on modules + * Modules can now read inline properties from the template original source + * Unreadable data message is no longer shown on node properties + * Added more options to 'Fresnel' node + * Now supports custom view vector + * Preventing cast warning with object to clip internal function usage when building shader code for Lightweight SRP + * Added new icons for inline properties to the Unity personal skin to make them easier to spot + * Updated Lightweight SRP templates + * Cull Mode now shared across base, shadow and depth pass + * Added new Normal input port + +* Fixes: + * Fixed issue over templates on not assuming inline properties when loading/saving Cull Mode module + * Fixed incorrect cast and type assignment on connections between 'Texture Object' and 'Texture Sample' nodes + * Fixed issue on deleting outputs on shader functions and later opening the shaders that use it + * Fixed issues on Vertex Offset port on Lightweight PBR template + * Fixed issue on not correctly loading 'Rotate About Axis' node from old shaders + * Fixed issue on header not showing with texture properties with the NoScaleOffset attribute + +v1.5.3 dev 05: +* Fixes: + * Fixed world normal issues over 'Outline' node + * Fixed issues on reading/writing cull mode on templates meta + * Fixed issue on capturing includes over templates + * Fixed issue on Specular workflow over Lightweight PBR template + +* Improvements: + * Cull Mode can now be modified over outline node + +v1.5.3 dev 04: +* New nodes: + * Transform Position + * Transform Direction + +* Improvements: + * Added inline property support over templates modules + * Also added inline property support over Depth Offset values in both template and standard surface + * Minor tweak over 'Clamp' node + * Internal max value defaulted to 1 + * Adding additional modules into Lightweight templates + * Enabling ZTest over Particles Alpha Blended template + +* Fixes: + * Fixed issue on Lightweight PBR template over tangents on objects with non-uniform scales + * Fixed issue on Lightweight PBR not receiving real time shadows + * Fixed issue on Lightweight Unlit template available interpolators + * Fixed issue on Lightweight Unlit template not showing correctly on dropdown menu + * Fixed issue on tab titles not being correctly written on shader mode over templates + * Fixed issue on property names incorrectly appearing over inline properties + * Fixed issue with copy/pasting 'Append' nodes + * Fixed issue on 'Global Array' node loading from older shaders + +v1.5.3 dev 03: +* New Template: + * Lightweight Unlit + * Renamed already existing SRP Template to Lightweight PBR + +* New Sample: + * SRP Lightweight 2D Fractal + +* Fixes: + * Fixed issue with 'Parallax Occlusion Mapping' node over Lightweight templates + * Fixed Safe Normalize issues with 'View Dir' node on templates + +* Improvements: + * Added Auto-Register option into 'Static Switch' node + * Minor improvement over 'Parallax Occlusion Mapping' node generated code to avoid duplicate calculations + +v1.5.3 dev 02: +* Fixes: + * Fixed infinite loop via context menu issue + +* Improvements: + * Added support for Specular workflow into Lightweight SRP template + * Use either the new Specular port or the already existing Metallic port to choose which workflow to use + * Added extra ASE null pointer exception prevention test on attempting loading shader with missing shader functions + +v1.5.3 dev 01: +* Improvements: + * Conditional 'If' node also support Int as compare values + * Added Triplanar scale port for normal scaling when using normals in 'Triplanar Sample' node + * Improved code generation for 'Texture Coordinates' node + * Changed way float values were being generated when their value was an integer + * Removes warnings and makes sure some operations are done in the correct space, like divisions + * Improved operations order on 'Panner' node + * Added Force Disable Instancing option into Surface output node Rendering Options + * Updated Lightweight SRP template to be compatible with Unity latest LW SRP version 1.1.5 + +* Fixes: + * Fixed issue on 'Global Array' node not being correctly detected by ASE + * Fixed texture array sampling error caused by 'Parallax Occlusion Mapping' node on Unity 2018 + * Fixed issue on local variable excluded reset method + * Fixed issue on 'Triplanar Sample' node Material Mode not being correctly set + +v1.5.2 dev 05: +* New Samples: + * Single Channel Masking by Sarah Akers and David Marshall + * Dithering Fade Blue Noise + +* New Node: + * Inverse View Matrix + +* Fixes: + * Fixed issue on not copying defaults to material values when changing Type from Global to Property over property type nodes + * Fixed Stencil Comparison not being correctly written on shader when set as an inline property + * Fixed issue on Reference mode not being taken into account when registering 'Texture Sample' properties + * Fixed infinite loop on 'Texture Sample' nodes with Reference mode + * Fixed custom outline alpha mask mode + * Fixed issues on compare type nodes accessing their Wiki page + * Fixed dropdown left title padding for nodes that have it but don't have a preview arrow + +* Improvements: + * Improved 'Unpack Scale Normal' node usage on Burn Effect sample + * Now compatible across all Unity versions + * Re-factored Global variables behavior over property type nodes + * Material values can no longer be edited + * Auto-fetching global variables values every 2 seconds + * Parameter type can be changed in node over texture type nodes + * Removing automatic header creation by properties under shader functions + * User now can manually set headers on property type nodes via its attributes + * Turned the main Mask Clip Value an inline property so users can set it to be a specific node + * Updated 'Screen Position' node preview + +* New Previews: + * Compare ( A > B ) + * Compare ( A >= B ) + * Compare ( A < B ) + * Compare ( A <= B ) + * Compare ( A == B ) + * Compare ( A != B ) + * Compare With Range + * If [Community] + * Decode Float RG + * Encode Float RG + * Decode Float RGBA + * Encode Float RGBA + * Decode View Normal Stereo + * Encode View Normal Stereo + * Decode Lightmap + * ColorSpaceDouble + * Face + * Switch By Face + * LOD Fade + * Layered Blend + * Weighted Blend + * Summed Blend + +v1.5.2 dev 04: +* Fixes: + * Fixed issue on Post-Process sample scenes crashing on lower Unity versions + * Fixed issue on fallback behavior when required template on loaded shader is not found + * Fixes issue on texture type nodes moving when a texture is selected over it's picker + * ASE window now aware when ObjectSelectorClosed command is fired to ignore incorrect mouse delta values + +* Improvements: + * View Dir vector on templates is now calculated on fragment by default + * World Reflection vector on templates is now calculated on fragment by default + * Native View Dir vector calculation on Lightweight SRP template is now done on fragment + * Shader function 'Reconstruct World Position From Depth' now also works with screen shaders + * Updated Skybox - Cubemap Extended by Cristian Pop sample + +v1.5.2 dev 03: +* Fixes: + * Fixed issue with 'Grab Screen Color' node on Lightweight SRP template + * Fixed multiple issues with Shader Model selection over templates + * Fixed issue on not correctly syncing module data from modified template + +* Improvements: + * Re-factored local variable creation over ports to make it more robust + * Vertex ports are now analyzed before fragment ones + * Vertex position dependent operations now take applied offsets into account + * Pragmas, Includes and Defines are copied from linked nodes if Pass is set as invisible + * Added preview to 'Vertex To Frag' node + * Small optimization on drawing connections + * Minor tweak over Particles Alpha Blended template + * Assigned dynamic interpolators now take both sub shader and pass info into account + * Modified Lightweight SRP template to share dynamic interpolators amount over hidden passes + +v1.5.2 dev 02: +* Improvements: + * Added Safe Normalize option to 'World Space Light Dir' node + * Assures vector is not zero even if there's no lights in scene + * Added Safe Normalize option to 'View Dir' node + * Assures vector is not zero even if there's no cameras on scene + * Property names can neither be or start with numerical values nor Unity reserved names + * Variables from 'Register Local Var' nodes cannot start or be numerical + +* Fixes: + * Fixed shader function subtitles not being shown after being set with the 'Function Subtitle' node + * Fixed Custom Lighting using opacity and opacity mask duplicating code + +v1.5.2 dev 01: +* Fixes: + * Changed alpha generation for Custom Lighting to work correctly with alpha mask + * Fixed issue on shader function reloading not being taken as a load operation + * Fixed instanced properties not being correctly taken into account inside shader functions + +* Improvements: + * Improved shader function asset loading on Shader Function node + +v1.5.1 dev 06: +* Improvements: + * Added preview to 'Noise Generator' node + * Improved node internal data viewer performance + * Improved the shader changed/dirty flag behavior + * Improved graph canvas position adjust on loading from a previously different window configuration + * Renamed 'Melting' sample shader to be in accordance with other community samples + +* Fixes: + * Fixed property node auto-register issue on 'Skybox - Cubemap Extended' sample + * Fixed issues with 'World Normal' and 'World Reflection' nodes on PS4 + * Fixed multiple cast issues across multiple nodes + * Fixed incorrect port behavior on 'Refract' node + * Fixed issue on undoing instanced properties assignment + * Fixed 'Break To Components' node duplicating code and generating errors + +v1.5.1 dev 05: +* Improvements: + * Added previews to nodes + * Desaturate + * Grayscale + * Posterize + * Simple Contrast + * Normal type input ports now show the correct default tangent vector on nodes internal value previewer + * Indirect Diffuse Light + * Indirect Specular Light + * Fresnel + * World Normal + +* Fixes: + * Fixed possible issue with 'Desaturate' node on PS4 + * Fixed issues with Undo/Redo operations over Wire nodes + * Fixed light color and light dir info on 'Light Color' + * Now takes into account Unity different behaviors between versions + * Fixed issue on loading canvas on ASE tabs pointing to inexistent resources + +v1.5.1 dev 04: +* New Node: + * Function Subtitle + * Allows creation for custom subtitles on Shader Functions + +* New Shader Functions: + * Perturb Normal + * Cotangent Frame + +* Improvements: + * Can now assign property to both blend modes and operations + * Removing carriage return when saving 'Custom Expression' node code on meta + * Improved restrictions on Shader Functions outputting Matrix type data + * Name is carried over Pasted/Duplicated 'Custom Expression' nodes + * Custom Editor/Inspector option is now available over templates + * Updated both Lightweight template and samples to new beta version + * Template now support vertex offset and alpha test + * Nodes internal data can be viewed directly on canvas + * Can be turned on/off through the 'I' key + * Added Editable If Custom Drawer by BinaryCats + * Dynamic interpolator cap now respecting pass choice on graph + * Updating current templates to be dynamically cap'ed + * 'Light Color' and 'World Space Light Dir' nodes now behave properly when used with lightmaps + +* Fixes: + * Fixed issue with incorrectly trying to write fragment instructions on template without specified frag code area + * Fixed issue where reference 'Function Switch' nodes were not displaying their option in all cases + * Fixed wire node Undo issues + +v1.5.1 dev 03: +* New Samples: + * Simple Potion Liquid + * Melting by Gil Damoiseaux + +* Improvements: + * Extended functionalities on 'Custom Expression' node + * Added Auto-Register toggle to create custom functions even if not connected to output node + * Added void to Output Type + * Call Mode toggle is now a Mode dropdown + * Mode Call now only allows external function calls or inline instructions + * If a return instruction is detected on code, Mode is set to Create and return type set to void + +* Fixes: + * Fixed Undo issue with property type nodes auto-register option + * Fixed issue on calculation view direction on tangent space over templates + +v1.5.1 dev 02: +* Fixes: + * Fixed issue with 'Standard Surface Light' not taking Normal Space option into account + * Fixed minor issue over 'Outline' node + * Fixed issue on Undo not resetting correctly ports internal values + * Fixed issue on incorrectly assigning main output node status into copy-pasted 'Function Output' nodes + +* Improvements: + * Added custom attributes to 'Static Switch' node + * Custom Material Inspector now properly copies texture scale and offset values + +v1.5.1 dev 01: +* Fixes: + * Fixed 'Static Switch' node not properly generating Enum code in the correct order + * Fixed normal generation issue on 'Standard Surface Light' node + * Fixed issue when attempting to load shader using inexistent template on project folder + * Now fall-backing to Standard Surface when template is not found + * Fixed issue capturing properties with attributes on templates + * Fixed incorrect tool-tip on 'Template Multi-Pass Switch' node + * Fixed issue on normal generation over 'Fresnel' node + * Fixed initialization issue on Default UI template + * Fixed issue with accessing uninitialized textures on 'Triplanar Sample' node + * Fixed preview issue on 'Template Parameter' node + * Fixed issue locking picker on texture type nodes to current type when auto-cast is on + +* Improvements: + * Improved 'Break To Components' generated code + * Preventing duplicates/re-definition of Pragmas, Defines and Includes over templates + +v1.5.0 dev 02: +Fixes: + * Fixed issue on template capturing commented properties + * Fixed multiple issues over templates with multiple sub-shaders + * Fixed issue on master nodes attempting to access uninitialized UI texture + * Fixed issue with sometimes not extracting the correct pass name from template + * Fixed issue on incorrectly catching shader name on fetching modules info + * Fixed issue with correctly setting the shader name + +v1.5.0 dev 01: +* New Samples: + * SRP Lightweight GlintSparkle + * SRP Lightweight Coverage + +* Fixes: + * Fixed issue on loading shader with missing shader functions + * Fixed issue on duplicate pragmas over generated shader + * Fixed issue with template post processor not correctly registering new templates + * Fixed issue on template output nodes modules incorrectly sharing foldout value + * Fixed Undo issue when undoing deleted property type nodes after saving shader + * Fixed 'Static Switch' node registering duplicates in the material properties group + +* Improvements: + * Reorganized samples shader paths + * Reorganized template menu items + * Canvas and output node title now shows shader name without relative paths + * 'Register Local Var' node now generates a new name when duplicated + * 'Indirect Diffuse Light', 'Indirect Specular Light' and 'Light Attenuation' nodes now work on templates + +v1.4.5 dev 04: +* New features: + * Added support for multi-pass templates + * Added support for Lightweight Scriptable Rendering Pipeline + +* New Shader Function: + * Create Normal : Generates a normal map from a height map + +* New Template: + * LightweightSRP + +* Fixes: + * Fixed texture coordinates generation in templates + * Changed initialization in 'Triplanar Sample' node to prevent null pointer errors + +v1.4.5 dev 03: +* Improvements: + * Exposed Specular Color property into the Output node material list when Blinn Phong Light Model is selected + +v1.4.5 dev 02: +* Fixes: + * Fixed Auto-Register option not being saved for property type nodes + * Fixed issues with generated normalized screen position values over templates + +* Improvements: + * Cull, Stencil, Color Mask and Depth options can now reference properties instead of standard options + * Redone visuals of property type nodes Attributes list to be easier to use + * Added new Enum and Custom attributes to property type nodes + * Enum on Create Enum mode creates an Enum attribute using the specified Name/Value pairs + * Enum on Use Engine Enum Class mode creates an Enum attribute from the specified class + * Custom attribute allows to specify completely custom attributes + * Outline now forces shader to be Forward only to prevent visual inconsistencies + +v1.4.5 dev 01: +* New Shader Function: + * Constant Bias Scale + +* Fixes: + * Fixed null pointer issue with removing connections with Alt key + * Fixed issue on 'Template Local Var' node only working on fragment function + +v1.4.4 dev 06: +* Fixes: + * Fixed issue on 'Texture Sample' nodes not automatically setting the texture type on AUTO + * Fixed connection type mismatch after CTRL + swap shortcut + * Fixed issue on 'Dither' node + +v1.4.4 dev 05: +* Fixes: + * Fixed multiple Undo issues on shader functions + * Fixed serialization issue with both nodes and graph when hitting Unity play button + +v1.4.4 dev 04: +* Fixes: + * Fixed issue on Specular Highlights and Reflection toggle not being read/written into shader meta + * Fixed issue on not correctly taking templates global variables into account when building shader + * Fixed issue where 'Triplanar Sample' node wasn't being initialized properly + * Fixed Undo issues on create/delete nodes + * Fixed Undo issues on preview node resizing + +* Improvements: + * Added new Enum Property Attributes for both 'Float' and 'Int' nodes + * Added new Keyword Enums option to 'Static Switch' node Type option + * Improved its interface to better accommodate new options + * Added new keywords to 'Static Switch' Keyword dropdown + * Increase max port count for 'Function Switch' node to 9 + * Added/Changed shortcuts for various nodes + * R - Create 'Register Local Var' node + * G - Create 'Get Local Var' node + * Z - Create 'Swizzle' node + * X - Create 'Cross' product node + * Period(.) - Create 'Dot' product node + * B - Create 'Break to Components' node + * K - Create 'Component Mask' node + * V - Create 'Append' node + +v1.4.4 dev 03: +* New Sample: + * Skybox - Cubemap Extended by Cristian Pop + +* New Shader Functions: + * Step Antialiasing + * Create Orthogonal Vector + +* Improvements: + * Node graph is now a ScriptableObject to better deal with automatic serialization + * Templates can now register and use local variables + * Use /*ase_local_var*/ before the variable declaration over the template + * Access the local variable through the new 'Template Local Var Data' node over the graph + * Added new Normal Space option into 'Standard Surface Light' node + * Optimized nodes port internal data usage + * Node tooltip no longer shown online link for shader function nodes + * Small optimizations to node previews + +* Fixes: + * Fixed function registry on 'Custom Expression' node to correctly deal with dependencies + * Fixed issue on linear textures over the texture creator tool + * Fixed issue where the editor was being called on play mode but no window was present + * Fixed issue on texture coordinates of different sizes being created with the same name + +v1.4.4 dev 02: +* Fixes: + * Fixed issue on templates where vertex normal was being declared as a float4 on vertex data + * Fixed PS4 issue on billboards generated code + * Updated Orientation Based Sprite sample to include fix + +* Improvements: + * Changed texture array creator to support compressed formats + * Added custom inspector for texture arrays to allows previewing their contents on the inspector window + * Added new Set Unique option into 'Custom Expression' node + * If toggled off, generated internal function doesn't use unique id on its name + +v1.4.4 dev 01: +* Improvements: + * Custom Pragmas, Includes and Defines are now also included on the Outline pass + * Automatically removing crlf from copy-pasted code over the 'Custom Expression' node + * Custom Render Type can now be specified on the Render Type dropdown over the Output node properties + +* Fixes: + * Fixed issues on 'Remainder' node + +v1.4.3 dev 05: +* Fixes: + * Fixed issue on excluding Add Pass independently of Debug port connection + +v1.4.3 dev 04: +* New Shader Function: + * Radial UV Distortion + * Sample with the same name was also added to demonstrate its usage + +* Fixes: + * Fixed multiple issues related to Debug port usage on Output node + * It now works as a custom lighting port instead of emission + * Fixed issue on incorrectly opening standard materials into ASE + * Fixed issue on duplicate local variable creation when using 'Parallax Mapping' node on shader functions + +v1.4.3 dev 03: +* Fixes: + * Fixed issue on 'Vertex Tangent' node internally outputting float4 data in templates instead of float3 + * Fixed shader function category typos + * Fixed issue on ports accessing already destroyed nodes for previews + * Fixed issue on precision type used in shader functions + +* Improvements: + * Added ZWrite and ZTest options to 'Outline' node + +v1.4.3 dev 02: +* Improvements: + * Shader tags can now be modified on templates based shaders + * Added new Particle Additive option on Blend RGB and Blend Alpha dropdown + * Sets Source to 'Source Alpha' and Destination to 'One' + * Added new options to 'Shade Vertex Lights' node + * Can now select amount of lights to take into account and if as spot or point light + +* Fixes: + * Fixed issue on incorrectly indented code generated by some nodes on template shaders + +v1.4.3 dev 01: +* New Samples: + * Orientation Based Sprite + * UI Sprite FX + +* New Shader Function: + * Box Mask + * UI-Sprite Effect Layer + +* Fixes: + * Fixed issue on attempting to deactivate destroyed nodes + +* Improvements: + * Updated Sprite and UI templates to better support normal maps + * Changed way logic is updated in some nodes to be more consistent and work inside shader functions + +v1.4.2 dev 06: +* Fixes: + * Fixed incorrect wire highlighting caused by 'Register Local Var' node + * Fixed issue with 'Texture Sample' node not generating proper UVs in specific cases when using templates + * Minor UI and refresh fixes to 'Function Switch' node + * Fixed issue on incorrectly loading SimpleTerrain sample + * Fixed issue on unnecessary loading when opening a changed shader or function + +* Improvements: + * Added compatibility with Unity 2018 + * For now 'Substance Sample' node is unavailable on this version + * Substance example is now inside a unity package to prevent sbsar importing error + * Removed Substance and API update warnings on Unity 2017 + * Added new Vertex Position input port into 'Surface Depth' and 'Camera Depth Fade' nodes + * Can now take custom vertex positions into account + * Added some minor improvements into 'Register Local Var'/'Get Local Var' node usage + * 'Register Local Var' node is now highlighted if one of its 'Get Local Var' nodes are selected + * 'Register Local Var' node now lists and can focus each 'Get Local Var' which uses it + * Added reference capabilities to 'Function Switch' + * One node can now control different paths of a shader function graph + +v1.4.2 dev 05: +* Fixes: + * Fixed Undo issues with connections created/deleted by drag + Alt + * Fixed issue on templates vertex local variables when using 'Vertex To Fragment' node + * Fixed bug where 'Function Switch' node options were being incorrectly saved which caused a crash on load + * Fixed shader 'Function Switch' node options not being correctly ordered all the time + * Fixed connection signal detection to make 'Function Switch' nodes know when to turn on + +v1.4.2 dev 04: +* New Node: + * Function Switch + * Node specific to shader functions which allows switching options at compile time on them + +* New Shader Function: + * Flipbook + +* Improvements: + * Changed switch type nodes port order to match 'Function Switch' and maintain consistency + +* Fixes: + * Fixed issue on duplicated functions when both outline and shadow caster passes are active + * Fixed issue with calculating label size for nodes + * Fixed UI issue when not being able to read depth info from template + +v1.4.2 dev 03: +* Improvements: + * Added Depth module into templates + * Minor improvement on Four Splats First Pass Terrain shader function + * Minor improvement on TerrainSnowCoverage and SimpleTerrain samples + * Added preview and access to internal data into 'HSV To RGB' and 'RGB To HSV' nodes + * Added preview to 'If' node + * Added new Normalize option into 'World Normal' and 'World Reflection' nodes + * 'Outline' node now supports transparency and mask operations through the new Alpha Mode option + * An additional depth pass can be added via the new Extra Depth Pass option on the Output Node properties + * Property nodes can now register its properties/global variables without being connected to Output node + * Done via the new Auto-Register option + +* Fixes: + * Fixed minor issue on 'Rotate About Axis' node UI + * Fixed issue with 'World Reflection' node on templates + +v1.4.2 dev 02: +* Improvements: + * 'Toggle Switch' node can now share properties + * Added lock button to property name on property type nodes + * Allows to customize the internal variable name used + * Added support for 'View Dir' node on templates + * Added preview position selection to shader functions to further customize function nodes + +* Fixes: + * Fixed issue where custom shadows were ignoring vertex colors + * Fixed issue on 'Fresnel' node using a non-normalized normal vector + * Small fix on 'Static Switch' node getting and setting values from the material + +v1.4.2 dev 01: +* Improvements: + * Lowered Shader Model target of Custom Lighting Toon example to be compatible with MacOs + * Improved generated code for 'Grab Screen Color' and 'Grab Screen Position' nodes + * Changed automatic generation of 'Grab Screen Color' node to make sure normalization is happening only once + * Added a toggle on 'Grab Screen Color' node which chooses if it normalizes/projects the input or not (default OFF) + +* Fixes: + * Fixed issue on generating default values for shader functions + * Fixed issue on normal generation with the following nodes: + * 'Fresnel' + * 'Indirect Specular Light' + * 'World Reflection' + +v1.4.1 dev 02: +* New Nodes: + * Decode Depth Normal + * Encode Depth Normal + +* Improvements: + * Added internal data into shader functions + * If inputs are unconnected is now possible to change the default value from its node property panel + * Property type nodes can now keep material value when not connected to an Output node + * Tweaked 'Static Switch' node properties + * Initial opened tab on property nodes depends on material mode + +* Fixes: + * Fixed issue on 'Custom Expression' node when using out variables in Call mode + * Preventing 'Commentary' node from generating infinite loops when copy-pasted + * Fixed issue with incorrect refresh call order on pasted nodes + * Fixed issue on nodes are not being correctly nested into their parent 'Commentary' node when copy-pasted + * Fixed issue on 'Toggle Switch' node not updating port names correctly after loading + * Fixed focus issue on pickers with Mac + +v1.4.1 dev 01: +* Fixes: + * Fixed issue on 'Texture Sampler' node getting incorrectly configured on load + * When default texture type different from material texture type + +v1.4.0 dev 06: +* New Samples: + * Simple Terrain + * Terrain Snow Coverage + * Custom Outline Toon + +* New Nodes: + * Rotate About Axis + * Outline + +* New Shader Functions: + * Four Splats First Pass Terrain + +* Improvements: + * Tweaked 'Scale And Offset' node behavior + * Added Defines tab into Output node properties + * Preventing possible compilation errors on Experimental .NET 4.6 + +* Fixes: + * Fixed issue on 'Texture Sampler' node not previewing a connected 'Texture Object' node + * Fixed issue on texture picker not working correctly on texture nodes + * Fixed incorrect version reading Convert To Linear parameter at 'Screen Depth' and 'Depth Fade' node + * Fixed issue on duplicate UV Set on 'Texture Sampler' node when connected to a 'Texture Object' + * Fixed issue shader function inputs and outputs getting lost when re-focusing on them by double clicking the shader function node + * Fixed issue on 'Custom Expression' node name editing on node body + +v1.4.0 dev 05: +* Fixes: + * Fixed issue on shadow caster for legacy samples: + * Matcap + * Parallax Mapping Iterations + * Reflect Refract Soap Bubble + * Screen Space Curvature + * Fixed typo in 'Toggle Switch' node + * Fixed issue on incorrectly accessing port through array id instead of unique id + * Fixed issue on deprecated internal data not being correctly read into new 'Append' node + +* Improvements: + * Up and Down arrow keys can now change the focus of the node element in the context palette search similar to the Tab key + +v1.4.0 dev 04: +* New Samples: + * Animated UV Distortion + +* Fixes: + * Fixed issue on a shader function node crashing when its corresponding asset is not found + * Fixed issue on applying Undo on Material Inspector not being caught by ASE canvas + * Fixed issue on 'Float' node slider not being registered on Undo stack + * Fixed issue on generating duplicate function names at 'Noise Generator' node + * Fixed issue on returning to from a shader function to a main graph using with that shader function selected + +* Improvements: + * Added new Variable Mode property into property nodes when their type are not Constant + * Create Mode, this is the current option on which an uniform variable is always created when the node is analyzed + * Fetch Mode, assumes that this variable is already declared elsewhere, p.e. an external lib and doesn't declare it + * When Property Type is selected, the property declaration is still created + * Added explicit call to both Thread and CultureInfo system classes to avoid conflicts with user classes without proper namespace + * Shader function's input and output ports maintain correct connections after being internally re-ordered + * Automatically adding spaces into camelcase'd shader function node titles + +v1.4.0 dev 03: +* Improvements: + * Added validity check on Output and Input data types + * Improved color code request for ports + +v1.4.0 dev 02: +* New Shader Functions: + * Compute Filter Width + +* Improvements: + * Explicitly calling System.Globalization on TextInfo usage to avoid compilation errors + * Added custom pragmas for shader functions + * Updated Vertex Normal Reconstruction sample + * Added Reflection and Specular Highlight toggles into the Rendering Options group that mimic Unity's Standard + * Added ToggleOff option to 'Static Switch' node which should now allow the creation of OFF toggles + +* Fixes: + * Fixed issue of properties not being properly ordered if their material property group wasn't open + * Blend modes now update properly even if group is collapsed + +v1.4.0 dev 01: +* Fixes: + * Fixed issue with 'World Space Light Pos', 'World Space Light Dir' and 'Object Space Light Dir' nodes + * Fixed issue on 'Texture Coordinates' node forcing a sampler to be picked even when none was selected + * Fixed issue on 'Indirect Diffuse Light'node ignoring the tangent space normal completely + * Small fix to shader functions so they can refresh their custom include list properly on change + +* Improvements: + * Added node previews for 'Light Attenuation' and both Indirect Light nodes + * Added explicit call to Unity Editor ShaderUtil on Material Inspector to prevent class issues + * Added Dependencies List on the Output Node properties + +v1.3.9 dev 03: +* New Nodes: + * 'Projector Matrix' + * 'Projector Clip Matrix' + * 'Texture Transform' + +* Improvements: + * Properties can be re-ordered on Template shaders + * Cull, Blend Mode, Blend Ops, Color Mask and Stencil Buffer data can be read and modified on Template shaders + * Added new custom Time port into 'Flipbook UV Animation' node + * Templates no longer need /*ase_pass*/ tag to be declared + * Adding UnityEngine.Object redundancy on its usage to prevent issues with other plugins + * Outline can now take fog into account + +* Fixes: + * Fixed issue on shader function headers being placed last on shader property list + +v1.3.9 dev 02: +* Fixes: + * Additional fix on custom colored categories + +v1.3.9 dev 01: +* Fixes: + * Fixed issue with 'Texture Coordinates' node not generating proper code for sizes bigger than float2 + * Fixed issue on reading old shaders data into new ASE versions + * Fixed issue on custom colored categories + +* Improvements: + * Updated various samples that were still compiled on older ASE versions + * ASE window now loses text focus when losing its focus to prevent UI issues + * Added proper Texcoord support in custom shadow caster + * Added new toggle on 'Screen Depth' and 'Depth Fade' nodes to disable conversion from log to linear space + * Important for Orthographic camera projections where Depth Buffer values are already stored in linear space + +v1.3.8 dev 02/03: +* Improvements: + * Added new custom lighting port and migrated the emission connection to this port + * Now custom lighting display both albedo and emission to be used in baking + * 'Function Input' and 'Function Output' names can be edited through node body + +* Fixes: + * Fixed indentation issue on some templates generated code + * Fixed issue in texture property that would forget it's auto cast type on load + * Fixed issue on 'Triplanar Sample' node being initialized with incorrect internal tiling value + * Fixed issue on screen position for 'Dither' node + * Now it changes the screen position interpolator globally to make it work on the shadow caster + +v1.3.8 dev 01 ( the same as v1.3.7 dev 07 but bumped version for Asset Store release ): +* Improvements: + * Added Shader Function previews + * Improved node list update on current focused window when renaming a shader function + +* Fixes: + * Fixed issue on tabs node list not being updated with shader function renaming + * Fixed issue with opacity mask not working correctly in custom lighting mode + +v1.3.7 dev 05/06: +* New Shader Functions: + * Half Lambert Term + * Blinn-Phong Light + +* Fixes: + * Fixed issue with setting the proper canvas mode when load the shader or the editor window on hotcode reload + * Fixed issue with shader function titles not supporting hyphen characters + * Fixed issue on not refreshing shader function include files on load + * Fixed issue on shader function tab name not being renamed when its file is renamed from the editor + * Fixed 'Texture Sampler' node preview when in reference mode + * Fixed stack overflow crash with pasting 'Commentary' nodes + +* Improvements: + * Premultiplied options now multiply RGB values with Alpha when in custom lighting mode + * Shader Functions are now loaded by guid and fallback to name search method if load fails + * Added custom categories for shader functions + * Recompiled existing shader functions to account for new categories + * Improved 'Triplanar Sample' node texture array support + * Now allows different index for each texture when doing triplanar in cylindrical mode + * Area from picking inputs from connections now only take the port icon into account and only include the label when dropping the connection + * Added preview for 'Static Switch' node + +v1.3.7 dev 04: +* Fixes: + * Fixes issue on Shader Function includes + +v1.3.7 dev 03: +* Fixes: + * Fixed issue on custom lighting nodes not compiling correctly when inside a shader function + * Fixed dithermask being declared when not in use + * Fixed texture array support with 'Triplanar Sample' node generating index code inside the function instead of outside of it + * Fixed issue with 'Append' node preview + +* Improvements: + * Replacing '\' with '/' instead of removing it when writing Additional Include path names + * Added Additional Include list into shader functions + +v1.3.7 dev 02: +* Fixes: + * Fixed issue with 'Texture Coordinates' node not generating local variables correctly + * Fixed issue with Refraction port not correctly working with Tessellation + * Fixed issue on applying vertex offset in certain Templates + * Fixed cast and per channel operation issues on remaining blends on 'Blend Ops' node + * Fixed issue on Soft Light Blend Op on 'Blend Ops' node + * Fixed issue of Shader Function nodes not propagating data when generating code + * Fixed focus issues when adding new items on Additional Includes, Pragmas, Sub-Shaders Tags and 'Custom Expression' node tools + +v1.3.7 dev 01: +* Fixes: + * Fixed 'Fmod' node issue with Int type connections + * Small fix to the path button in the new Texture Array Creator tool + +* Improvements: + * Adding fallback when searching template by guid fails + +v1.3.6 dev 01: +* Fixes: + * Fixed error when setting previews for texture related nodes + +* Improvements: + * Improved cubemap support into texture related nodes + * Removing Texture 0-3 and Scale Matrix options from 'Common Transform Matrices' node + * Major rewrite for 'Triplanar Sample' node to make it easy to extend on the future + * Small performance increase to 'Triplanar Sample' node + +* Deprecated nodes: + * 'Texture 0 Matrix' + * 'Texture 1 Matrix' + * 'Texture 2 Matrix' + * 'Texture 3 Matrix' + * 'Scale Matrix' + +v1.3.5 dev 02: +* New Tool: + * Added Texture Array Creator tool + * Available at Window > Amplify Shader Editor > Texture Array Creator + +* Fixes: + * Fixed Undo not being able to recover some nodes + +* Improvements: + * Changed Custom Material Inspector to be able to set and show custom meshes in it's Preview + * Template Data nodes now expand individual channels if data selected is from vector/color type + * Expanded individual channels ports on: + * 'Object Space Light Dir' + *'World Space Light Dir' + * 'World Space Camera Pos' + * 'Position From Transform' + * 'Vector From Matrix' + +v1.3.5 dev 01: +* New Shader Functions: + * Blinn-Phong Half Vector + +* Fixes: + * Fixed issue on 'Toggle Switch' node not being correctly registered when created + +v1.3.4 dev 02: +* Fixes: + * Fixed issue on text fields in nodes picking up values from other text fields in the editor + * Fixed cast issue on 'Flipbook UV Animation' node + * Fixed issue on creating sampler wire nodes + * Small fix for resize buttons of 'Comment' nodes + * Small fix to focus and select search text in the context menu not happening in specific situations + * Fixed issue with 'Object To View Pos' local variable + * Fixed 'Triplanar Sample' node normal mode signs in certain situations + * Fixed issue on adding the same grab pass declaration multiple times + * Fixed issue on incorrectly getting separate channels from transform nodes after local variables are created + * Fixed issue on duplicate uniforms with some templates + * Fixed issue where shader function properties were resetting after every save + +* Improvements: + * Locking blend type nodes from sampler and matrix type connections + * Expanded 'Object To View Pos' vector output vector into individual ports + * Changed 'Triplanar Sample' node base UV direction to match unity terrain + * Expanded vector ports for 'Object Space View Dir' and 'World Space View Dir' + * 'Lerp' node now converts int types in the alpha input port to float types to prevent errors + +v1.3.4 dev 01 +* Fixes: + * Fixed issue with Opacity Mask port incorrect type + * Fixed issue with incorrectly saving/loading multilines state in editor prefs + * Fixed issue on not being able to create relays on texture type connections + +v1.3.3 dev 01: +* Fixes: + * Fixed multiple issues with 'Append' node behavior + * Fixed null pointer exception when Shift + Tabbing helper window + * Fixed duplication error on UV generation code + +* Improvements: + * Added Alpha To Coverage option ( tied to Opacity port being active ) + * Opacity Mask now only generates code if connected + * Blend ops defaults are now OFF instead of ADD + * Blend ops now pick the respective refined options when a specific blend mode is selected to make it easy to switch between them and the custom option ( opaque doesn't change anything ) + +v1.3.2 dev 04/05: +* Fixes: + * Fixed Asset Post Processor issue with Templates renaming + * Fixed middle clicking on reference preview focusing on referenced node + * Fixed graphic glitch on 'Static Switch' node button + * Fixed issue with copy/pasting nodes taking incorrect property names + * Fixed issue on 'Toggle Switch' incorrectly being read from older ASE versions + * Minor fix on 'Object To Clip Pos' node + * Fixed Undo issue with pasted property nodes + * Fixed issue with duplicate local variables on templates when having multiple ports from the same category + +* Improvements: + * Minor visual tweak on 'Standard Surface Light' node + * Removed dependencies on custom shader inspector over the main ASE window so it can be removed by users + * Setting first vector port automatically invisible ( if unconnected ) on nodes representing Unity built-in parameters ( since they are never used as vectors ) + * Improved custom template reader behavior + * Minor improvement on Undo node paste behavior + * Added Stencil Buffer Back and Front face options ( only visible when Culling is Off ) + * Changed input ports number of connections and data type visualization to represent the data being transferred in each cast + * Improved crooked lines when nodes are too close to each other + * Added custom single line texture properties for when the texture is marked to not have scale and offset properties + +v1.3.2 dev 03: +* Fixes: + * Fixed issue with 'Texture Sampler' node not taking procedural textures correctly into account + * Matrices can no longer be connected into 'Vertex To Fragment' nodes input port + * Fixed reordering issues with shader functions when these were updated + * Fixed rare compile issue where shader function headers were created but no property was present + * Fixed issue where view direction vector shader code was being generated with different precision types + * Fixed issue with Matrix nodes being able to choose its type as Property and add Attributes + * Fixed issue with Matrix nodes initial value not corresponding to internal draw data + * Fixed issue with Matrix3x3 not working correctly when its type was set as Global + * Fixed issue on function nodes generating local variables for Sampler data type variables + +* Improvements: + * Activating internal data for tessellation nodes + * Minor tweak on vertex position data across all templates + * Preventing 'DDX' and 'DDY' nodes to generate code when in vertex function + * Removed Sampler data types as valid 'Custom Expression' output valid type + +v1.3.2 dev 02: +* New Shader Functions: + * 'Bidirectional Parallax Mapping' + * Mimics iterative Parallax Mapping with reference plane + * 'Reconstruct World Position From Depth' + +* New Samples: + * Added new Vertex Normal Reconstruction sample + +* Fixes: + * Fixed issue with shader function nodes generating the same code multiple times + * Fixed issue with function input generating duplicated code + * Fixed issue with 'Texture Coordinates' node generating code in the vertex function when used inside a shader function + * Fixed issue on 'Texture Coordinates' node in templates not respecting the size of the Coord Size option + * Fixed issue on matrix multiplication via the 'Multiply' node not taking correct output type into account + * Minor fix on Search Bar positioning + * Recompiled Triplanar sample to be PS4 compatible + * Recompiled Translucency sample to be PS4 compatible + * Recompiled Hologram sample to be PS4 compatible + * Fixed compilation issue with Billboard generated code in PS4 + * Fixed hot code reload issue with 'Template Parameter', 'Template Vertex Data' and 'Template Fragment Data' + * Fixed issue on 'Fresnel' node not read/writing new normal space option + * Fixed issue on 'Screen Position' node when used on Templates + +* Improvements: + * Functions inputs now allow the use of node default graph trees supporting complex default operations + * Particle Alpha Blend template now uses a float4 on its TEXCOORD0 semantic both for vertex and interpolator data + * Added pragma tag into Default Sprites template + * Added port failsafe config into 'Texture Sample' node after reading all its internal data + * Making vector port invisible in Unity Parameters type nodes if not being used + * 'Component Mask' node only creates local variables if needed + * Multi-wire colored connections now active by default + * 'Fresnel' node now have Normal Space option set to Tangent by default + * Shader functions now display their description on its Inspector window + * Fixed 'Grab Screen Position' and 'Grab Screen Color' nodes for VR and updated the respective samples accordingly + +v1.3.2 dev 01: +* New nodes: + * 'Camera To World Matrix' + * 'World To Camera Matrix' + +* Fixes: + * Fixed issues with 'Toggle Switch' node + * It now properly creates a toggle property and lets user change material in the editor + * Fixed issue on vertex local variables not being registered correctly on custom lighting + * Precision selection on 'Grab Screen Color' node is no longer locked when Custom Grab pass is disabled + * Fixed issue with 'Depth Fade' node on OpenGL platforms + * Normalized screen position code now works properly in all platforms + * Fixed issue with 'Texture Array' node preview + * Fixed issue with 'Vertex To Fragment' node generating duplicated code + +* Improvements: + * Added toggle button into 'Static Switch' node + * Improved wire auto-connection to node when its created from the context palette when dragging a wire + * Auto screen UVs from 'Grab Screen Color' node now also take Unity Single Pass Stereo into account + * Improved code generation on screen position related nodes + * Activating internal port data into 'Toggle Switch' node + * Updated Simple Blur and Simple noise examples to be fully android compatible + * Tweaked 'Desaturate' node to prevent issues with PS4 + * Tweaked 'Parallax Occlusion Mapping' node to prevent issues with PS4 + +v1.3.1 dev 11: +* Fixes: + * Fixed incorrect UV variable name on Post-Process template + * Fixed Perforce integration again + * Fixed preview on 'Fresnel' node for the new tangent mode + * Fixed issue with 'Screen Position' subtitle + * Fixed issue with 'Vertex to Fragment' node on templates + +* Improvements: + * Added two additional nodes to templates,'Template Vertex Data' and 'Template Fragment Data' + * These nodes allow direct access to vertex and interpolated fragment data from the template + * Adding vertex code entry tag into Post-Process template + * Improved fail-safe behavior on attempt to write vertex code on template with no vertex tag declared + * Minor tweaks on some nodes port names and order + * 'Dither' node now has a input port that allows the use of a custom dither pattern + * 'Vertex to Fragment' node no longer generates unnecessary code and now acts as a relay if connected to a vertex path + +v1.3.1 dev 10: +* Fixes: + * Fixed cast issues on 'Smoothstep' node + +v1.3.1 dev 09: +* Fixes: + * Multiple fixes on custom shadow caster + * Fixed issue on Templates Manager being incorrectly destroyed in some situations + * Fixed issue on Template data not being correctly synced when user changes its source code and returns to ASE + * Fixed issue where referenced 'Texture Sampler' nodes was not respecting the original property order + * Fixed issue on 'Grab Screen Color' node not using Unity default grab pass when selected to use it + * Fixed small issues on multiple examples + +* Improvements: + * Added tangent space normals to 'Fresnel' node and removed the internal normal value from its properties + +v1.3.1 dev 08: +* Fixes: + * Fixed issue on 'Simple Contrast' node + * Fixed boundaries issues on 'Dither' node + +* Improvements: + * Minor tweak on 'Smoothstep' ports order + * Added new Color and Intensity ports into 'Light Color' node + * Minor overall optimizations on node previews + * Added preview for 'Substance Sample' node + * Added preview for 'Blend Operations' + * Added input port for automatic texture dithering into 'Dither' node + +v1.3.1 dev 07: +* Fixes: + * Fixed issue on 'Simple Contrast' node ignoring Value internal data + * Fixed issue on nodes preview data not being written when its internal data is read from shader + * Fixed 'Texture Sampler' node to output a Color instead of Vector type + * Fixed 'Swizzle' node not detecting changes on its input ports + * Fixed issue on allowing invalid characters when typing a custom keyword on the 'Static Switch' node + +* Improvements: + * Improved code generated by 'If' node and hides unused internal data + * Improved 'Rotator' node behavior + * Improved 'Panner' node behavior + * Added checkout for version control systems that need it to edit files like perforce. + * Changed labels and port order for various nodes in the Image Effects category to improve consistency + +v1.3.1 dev 06: +* Fixes: + * Fixed issue on template output node attempting to access template data before its initialization is complete + * Fixed issue with validate/execute commands like duplicate on Mac + * Fixed issue on not updating correctly mouse position when doing multiple pastes/duplicates + * Fixed disappearing titles when selecting 'Register Local Var' nodes being used by 'Get Local Var' nodes located outside the visible graph area + * 'Toggle Switch' node now properly casts its main port type for both input ports + +v1.3.1 dev 05: +* Fixes: + * 'Indirect Specular Light' and 'Indirect Diffuse Light' now compile properly in vertex functions but provide dynamic baking results only + * Changed mask clip variable name to be compatible with internal unity functions + * Fixed issue with texture arrays derivatives not being declared in 'Parallax Occlusion Mapping' nodes + * Fixed 'Texture Sample' node not changing cast mode automatically when in reference mode + * 'Lerp' node now works as the hlsl/cg specification and allows for component based interpolation + * Fixed issue on template native properties getting lost when hot code reloading + +* Improvements: + * 'Get Local Var' nodes now get highlighted in green when their referenced 'Register Local Var' node are selected + * It should be now easier to spot how many and which nodes use a determined Register node, we intend to expand this idea to other similar cases + * 'Static Switch' now allows to use define symbols and material toggle is now optional + * 'Keyword Switch' is now deprecated (opening the shader in newer versions should replace it by 'Static Switch') + * 'Static Switch' and 'Grab Screen Color' nodes now show their node name in title but still allows to edit their variable by double clicking + * Reorganized toolbar buttons for consistency + * Showing internal value name at the node properties window when selecting a property on the 'Template Parameter' node + +v1.3.1 dev 04: + +* Fixes: + * Fixed issue with 'Static Switch' node duplicatnig code + * 'Static Switch' node now properly allows the use of the same keyword + * Fixed issue with Int ports generating black previews + * Fixed issue where 'Custom Standard Lighting' node was generating garbage code when connected multiple times + * Fixed dynamic baked lightmapping for 'Indirect Diffuse Light' node + * Default fallback is now only added if shader doesn't use it's own + +* Improvements: + * Changed 'Template Parameter' node to mimic the same look from the equivalent property nodes + * Changed some labels and warning texts to be more clear on what's going on for texture objects + * Int port color now uses the same color as float nodes + * Added ASE custom inspector to the default templates + * Added support for Texture Arrays with 'Parallax Occlusion Mapping' node + +v1.3.1 dev 03: +* New Features: + * Added custom pragmas support to the main property panel + +* Fixes: + * Fixed issue with texture arrays when in reference mode creating multiple properties + * Fixed issue of 'Vertex To Frag' node not generating code in certain situations + * Fixed issue with 'World Reflection' node not generating code correctly in vertex functions + * Fixed issue of custom shadow caster not using the correct shader model + * Fixed issue with dynamic port nodes not updating correctly in some occasions + * Fixed issue of some nodes not properly using the selected precision type + * Matrix 3x3 port types now display properly in the node property panel and compile correctly + +* Improvements: + * 'World Position' node now forces float precision + * Some more changes for the nodes subtitles for consistency + * Minor performance and GC improvements + +v1.3.1 dev 02: +* Fixes: + * Fixed issue with 'World Normal' node not generating it's components values properly in some occasions + * Fixed issue with some parameters foldouts not displaying correctly and added a new context message for empty foldouts + +* Improvements: + * Changed some subtitles prefixes to be more consistent about what they represent + * Changed dropdown icon to a less confusing and more intuitive one + * More editor performance improvements and reduction of GC in various places + +v1.3.1 dev 01: +* Fixes: + * Fixed issue on copy-pasting custom lighting nodes + * Fixed issue on null pointer reference on preview material when hitting play mode + +* Improvements: + * Added upper left widgets into several nodes to change important properties directly on node body + * Added secondary title into several nodes to show its current state directly from node body + +v1.3.0 dev 03: +* Improvements: + * Completely refactored and changed the graph and node rendering to use a semi-MVC model + * Improves the overall performance in several orders of magnitude + * Various small visual fixes and improvements + * Various changes to prevent most memory allocations heavily reducing GC + * Changed zoom and auto-pan to a smooth version and fixed its auto-boundaries + * This should make the editor feel more snappy and responsive + * New object pickers for 'Substance Sampler' and 'Triplanar Sampler' + * New outline for selected Wire nodes + * Now is easier to see in all situations + * Various previews were added,improved or fixed + * 'Texture Sampler' nodes now properly display default values + * Tweaked Input Type labels on 'Custom Expression' nodes to match shader variable type names + * Custom Lighting nodes now show internal data and have additional Normal options + +* Fixes: + * Fixed 'Texture Array' node issue when referencing an un-connected node + * Fixed UI issue on 'Custom Expression' qualifiers + * Fixed issue on shader name being overwritten when changing template + * Fixed issue on copy/cut/paste not being correctly caught by nodes search bar + +v1.3.0 dev 02: +* Fixes: + * Fixed issue with Output Node Opacity Mask port not working with Custom Lighting + * Fixed errors with some nodes inside shader function + +* Improvements: + * Improved internal file reader to be more robust in case of trying to load in-existent files + * Templates Manager can now also be initialized by its post processor in case of an ASE window is not open + * 'Blend Operations' node show current selected Blend Op on node body + * Locked Custom Light nodes from being used on Templates + +v1.3.0 dev 01: +* New Features: + * Templates + * Create new shaders from already existing ones which serves as base/templates + +* Fixes: + * Fixed issue on ports internal data not showing on 'Append' node + * Fixed infinite loop on 'Texture Coordinates' and 'Texel Size' nodes + +v1.2.1 dev 02: +* Fixes: + * Fixed issues with previews on 'Multiply' node + * Fixed incorrect tooltip on 'Face' node + * Fixed issue on 'Standard Surface Light' node where GI wasn't correctly picking normals + * Fixed 'Texture Sampler' node not correctly generating code when connected to relays or shader functions + * Fixed issue on 'Texel Size' and 'Texture Coordinate' nodes when referencing nodes not connected to Master Node + +* Improvements: + * 'Grab Screen Color' node now uses Unity default grab texture and allows overriding it like it's previous behavior + +v1.2.1 dev 01: +* Improvements: + * Major refactor on all nodes categories and colors to improve consistency + * Added subtitle to 'Swizzle' and 'Component Mask' nodes to reflect their options + * Added configurable background color for 'Commentary' nodes + +* Fixes: + * Fixed issue with lightmaps when using the 'Standard Surface Light' node on Custom Lighting Light Model + * Fixed issue on overwriting default texture values on 'Texture Sample' node when loading values from material + +v1.2.0 dev 02: +* Improvements: + * Adding Call Mode into 'Custom Expression' node + * On this mode all code written into the Code area will be directly injected into the shader code without being assigned to a local variable + * The result written on the output port will be what is directly connected to the first input port ( named In ) which is not taken into account by the code expression. The In/Out pair will act as a simple relay. + +v1.2.0 dev 01: +* Fixes: + * Fixed issue on generating UI exception when sometimes iterating between Search Node Bar results + * Fixed issue on Output node size increasing infinitely with shader name + * Fixed issue on incorrect serialization on 'Texture Sampler' node + +* Improvements: + * Texture Object type nodes no longer auto-set the 'Texture Sampler' Normal Map option + * Normal Map option was renamed to Unpack Normal Map + * A warning is shown if a Texture Object marked as normal map is connected to a 'Texture Sampler' node with the Unpack Normal Map options turned off + +v1.1.0 dev 13: +* Fixes: + * Fixed issue with reading incorrect legacy port info into 'Lerp' node + * Fixed issue on cycling through deleted nodes when using the Nodes Search Bar + * Fixed issue with incorrectly moving nodes nested into multiple 'Commentary' nodes + * Fixed issue on Undo not registering internal node movement on 'Commentary' nodes + * Fixed issue when using 'Virtual Texture Object' node on Vertex ports + * Fixed issue with incorrectly moving selected nodes while resizing side menus + +* Improvements: + * 'Simple Contrast' node now always store its result on a local variable + * Greatly improved 'Commentary' node: + * You now can use box selection inside the node body + * You now can create Wire nodes by double clicking on a wire inside the node body + * You now select and drag the node via its header or by pressing anywhere on the node body having the Alt key down + * You now need to double click the node header to be able to modify its comment directly from there + +v1.1.0 dev 12: +* Fixes: + * Fixed issue with creating legacy code for LOD Cross Fade on Unity v.2017 and above + * Fixed issue on 'Lerp' node not adjusting correctly when disconnecting input ports + * Fixing issue with node drag with snap + * Now done by having both Ctrl+Shift pressed + +* Improvements: + * 'Blend Operations' node now automatically adapts to input ports + * Improving Search Bar focus behavior + +v1.1.0 dev 11: +* Fixes: + * Fixed incorrect behavior on creating connections through Alt + Shift + * Fixed out of bounds exception caused by removing ports on shader functions + * Fixed issue with 'Triplanar Sampler' node not deleting correctly in some occasions + * Fixed ordering issues with Stencil Buffer example + +* Improvements: + * Overall improvements on nodes descriptions + +v1.1.0 dev 10: +* Fixes: + * Fixed new Billboard Ignore Rotation option incorrectly ignoring game object translation + +v1.1.0 dev 09: +* Fixes: + * Fixed issue with deprecated nodes warning message throwing an exception on recent Unity versions + * Fixed 'Texel Size' node issues on Shader Functions + +v1.1.0 dev 08: +* New Features: + * New 'Keyword Switch' node + +* Improvements: + * Improved 'Lerp' and 'Clamp' nodes behavior + * Added new improved dynamic 'Append' node which adapts to inputs and deprecated the old one + * Billboards can now ignore object original rotation via its new Ignore Rotation toggle + * New Soft Light option was added to 'Blend Operations' node + +v1.1.0 dev 07: +* New Features: + * Added support for Custom Subshader Tags on Output Node properties + +* Fixes: + * Fixed issue with having 'Custom Expression' nodes with similar port names + +* Improvements + * Small improvements on canvas zoom behavior + +v1.1.0 dev 06: +* New Features: + * Added new nodes: + * 'World Transform Params' + * 'Vertex Bitangent' + * 'Vertex Tangent Sign' + +* Improvements: + * Able to specify an HDR color on 'Color' node if the HDR attribute is set + * Added previews to nodes: + * Time + * Object Scale + * Improved how vertex data is being generated to prevent future issues + +* Fixes: + * Fixed incorrect order of instruction write on 'Texture Coordinates' node + +v1.1.0 dev 05: +* New Features: + * New 'Standard Surface Light' node ( exclusive to Custom Lighting Light Model ) + +* New Samples: + * Double Layer Custom Surface + +* Fixes: + * Fixed issue with pasting nodes not refreshing external references from original ones + * Fixed issue with generating helper local variable ids on several nodes which may lead to issues on shader functions + * Fixed issue on 'Depth Fade' node + * Fixed issue with not registering sampler dummies correctly when using 'Texture Coordinates' node with Tessellation + * Fixed issue on multi-tabs with breaking all tabs except the focused one when dragging wires + +* Improvements: + * Added previews to nodes: + *'World Space Camera Pos' + *'Object Space Light Dir' + *'World Space Light Dir' + *'Light Color' + *'Object To World' + *'World To Object' + +v1.1.0 dev 04: +* Fixes: + * Fixed issue on 'Texture Coordinates' node generating wrong dummies on UV Sets different than 1 + * Fixed issue on 'Register Local Var' node usage with shader functions + +* Improvements: + * Setting Enable Instancing option default value to false + * Adding Exact Conversion option into 'Gamma To Linear' and 'Linear To Gamma' nodes for more accurate results + +v1.1.0 dev 03: +* Fixes: + * Fixed issue on 'Pi' node + * Fixed issue on 'Texture Coordinates' node not generating unique names when used on vertex body + * Fixed issue with incorrectly counting amount of 'Virtual Texture Object' nodes on graphs + * Fixed issue on 'Texture Array' drawers + * Fixed issue on 'Remap' node preview preventing division by zero + +* Improvements: + * 'Texture Array' node: + * Now work with shader functions + * Added derivative option to 'Texture Array' node + * Minor tweak on tooltip text + +* New Features: + * New Community Node 'GlobalArray' submitted by Vincent van Brummen and created by Johann van Berkel + * Added new Enable Instancing toggle into Rendering Options to be able to activate instancing without having to use Property nodes + +v1.1.0 dev 02: +* Improvements: + * 'Vertex TexCoord' and 'Swizzle' node types can be selected from node body + +* Fixes: + * Fixed issue with 'Grab Screen Color', 'Get Local Var' and 'Texture Sample' nodes loosing references inside Shader Functions + * Fixed issue on not correctly registering all Grab Passes from multiple 'Grab Screen Color' nodes + * Fixed small issue on 'Commentary' node not being able to focus on comment text field when created + +v1.1.0 dev 01: +* Fixes: + * Fixed issue with being able to open recently created shader multiple times + +* Improvements: + * Added preview for 'Screen Position' node + * 'Append' output type can be selected from node body + * Small overall optimizations + +v1.0.0 dev 12: +* Fixes: + * Fixed wrong casting issues on dynamic type nodes + * Fixed lost reference when deleting 'Grab Screen Color' node + +v1.0.0 dev 11: +* New Features: + * Additional includes (.cginc) can now be used into an ASE shader via the Additional Includes sections on the Output node + * Their contents can be accessed via the 'Custom Expression' node + * Added Node Search bar to quickly find nodes on the canvas + * Ctrl + F: Shows Search Bar + * Enter/Return/F3: Goes to next occurrence + * Shift + (Enter/Return/F3): Goes to previous occurrence + * Escape: Hides Search Bar + +* New samples: + * UV Light Reveal + +* Fixes: + * Fixed issue on creating unnecessary casts from floats + * Fixed minor issue on GPU Instancing sample + * Fixed minor UI issues on 'Reflect' and 'Refract' nodes + * Fixing shader paths for Community Shaders + * Fixed issue on incorrect cast when using Floats and Ints in certain nodes + * Fixed issue on resetting in certain situations vertex local variables generated during Output Node fragment code generation + * Fixed issue on property name update in 'Grab Screen Color' node + +* Improvements: + * Improved nodes local variables reset behavior to prevent future issues + * Added previews to 'Gamma To Linear' and 'Linear To Gamma' nodes + * Forcing 'Dot' and 'Normalize' nodes to store results in local value and prevent with power operations + +v1.0.0 dev 10: +* Fixes: + * Fixed issue with temporary variable assignment Id on 'Texture Coordinates' node + +v1.0.0 dev 09: +* New Features: + * New 'Static Switch' node which allows creation of shader variants + +* Fixes: + * Fixed minor issue on reading inputs from dynamic 'Add' and 'Multiply' nodes on older shader versions + * Fixed issue on Parent Graph attempting to delete in-existent connections + * Fixed issue with always disabling Light Maps when using Tessellation + * Fixed issue with Texture Nodes reference drop down selector showing incorrect labels both on 'Texture Sampler' and 'Texture Coordinates' nodes + * Fixed issues on incorrect loosing references with 'Texture Sampler' node on Reference mode + +* Improvements: + * Improved 'Append' node connection management + * Added Local Var selector directly on 'Get Local Var' node body + +v1.0.0 dev 08: +* New Features: + * New Output node Rendering Options + * Disable Batching + * Ignore Projector + * Force No Shadow Casting + +* Fixes: + * Fixed issue with new dynamic 'Add' and 'Multiply' nodes not registering port creation/destruction into Undo system + * Fixed issue on 'Grab Screen Color' node duplicating code + * Fixed issue with Opacity Mask port being incorrectly Enabled/Disabled on certain situations + * Fixed issue on 'Get Local Var' nodes getting wrong ids on certain situations when a 'Register Local Var' node is deleted + * Small fix to force property name update when changing type on property nodes + * Fixed issue where 'View Dir' node was generating code in the wrong space when in vertex function for both world space and tangent space + +v1.0.0 dev 07: +* Fixes: + * Fixed name conflict on 'Custom Expression' node + * Fixed issue for both normal input in indirect lighting nodes that were asking from normal in world space instead of tangent space + +v1.0.0 dev 06: +* New Features: + * Added LOD Cross Fade support for LOD groups ( located in the Output node Rendering Options tab ) + +* Improvements: + * 'Add' and 'Multiply' nodes can have more than 2 input ports ( max 10 ) + * Minor improvements on several nodes + * Refraction port use Unity's grabpass by default so it can pick other refraction materials + * Avoiding possible compiler misunderstandings with System.Type calls + * Ensuring variables/functions created by custom expressions have unique names + * Auto enabling instance mode on material ( if on Unity 5.6 or above ) when detecting instance mode on ASE shader + * Improved zoom behavior + +* Fixes: + * Fixed issue when remapping ports from very old shaders + * Fixed swizzle issue on 'Vertex Position' node + * Fixed matrix 'Invert' node + * Fixed SimpleGPUInstancing sample not fully batching on Unity 5.6 + * Fixed opening a SF in more than one tab after creation + * Fixed header click to edit name when zoomed out + * Fixed both Commentary node side menus resize not following the mouse movement correctly + +* New Shader Functions: ( AmplifyShaderEditor/Examples/Assets/ShaderFunctions ) + * Simple HUE + * SphereMask + +v1.0.0 dev 05: +* Fixes: + * Fixed issue with conditional 'If' node + * Fixed issue with 'Vertex Position' node swizzle in Local Vertex Ports + +* Improvements: + * Caching instanced property nodes into local variables to prevent multiple UNITY_ACCESS_INSTANCED_PROP() on them + * Added support for samplers types into 'Custom Expression' node + +v1.0.0 dev 04: +* Fixes: + * Fixed node drag and drop issue from palette + * Fixed issue with online reference button having a "too-large" click box + * Palette Menus now display the correct cursor on mouse hover + * Fixed clicking Enter on palette without selecting a node + * Changing lighting models should now show the error messages correctly + * Fixed issue of Custom Light nodes not loading properly + +* Improvements: + * Added Per Renderer Data tag to Properties available Attributes + * Adding help box into 'Virtual Texture Object' with additional info + +v1.0.0 dev 03: +* New Features: + * Custom Lighting + * New Nodes: ( can only be used on this light model ) + * Indirect Diffuse Light + * Indirect Specular Light + * Light Attenuation + +* New Samples: + * Custom Lighting Toon + +* Fixes: + * Fixed issue when zooming with Alt + Right Mouse button + * Fixed issue with window not detecting graph type on Unity load + * Fixed issue on 'Debug Switch' node not loading properly + * Fixed issue on assigning invalid cultures when an error/exception occurred inside ASE + +* Improvements: + * Context Palettes now allow Tab / Shift Tab to select between nodes instead of mouse selection (confirms with Return/Enter key) + * Added previews for 'Debug Switch' and 'Toggle Switch' nodes + * Added link to node documentation on its tooltip + * Small optimization on all nodes overall + * Preventing ASE to crash if some faulty class/dll is present on the project + +v1.0.0 dev 02: +* Fixes: + * Preventing shadow caster error on using 'Vertex TexCoord' with 'Vertex Normal' + +v1.0.0 dev 01: +* Fixes: + * Fixed issue on not recognizing Tessellation port correctly when at Lambert or BlinnPhong light models + * Fixed issue on dragging nodes via Alt mode not respecting ports unique ids when creating connections + * Fixed minor typo on 'Switch by Face' node + * Fixed minor issue when loading LoadPolyWater example + +v0.7.2 dev 08: +* Fixes: + * Fixed issue generating input ports instructions on 'Custom Expression' node + +v0.7.2 dev 07: +* New Features: + * Added support for multiple ASE windows opened simultaneously + +* New Samples: + * Animated Fire with Shader Functions + +* Improvements: + * Forcing InvariantCulture on ASE execution cycle to prevent issues with number parsing + * 'Texture Sampler' node no longer shows it's sampler properties when a 'Texture Object' node is connected to it + * Improved redundancy awareness on 'Virtual Texture Object' and 'Texture Sampler' nodes + * Improved 'Virtual Texture Object' tooltip + * Removed Return button from Shader Functions since it is now useless with new multi-tab behavior + +* Fixes: + * Fixed issue on changing Normal map option in 'Texture Sampler' node not changing its output type + * Changed 'Virtual Texture Object' node channel name to 'Layer' and fixed its default value not showing up correctly + * Virtual textures now generate properties with their correct name (requires user changes to the virtual texture itself) + * Fixed issue that break compiling when a missing shader function was present + * Forcing internal data update for shader function Output nodes to prevent errors when they are disconnected + * Fixed small issue with shader function nodes being stuck on selection when double clicking on them + +v0.7.2 dev 06: +* New Features: + * Added 'HSV To RGB' and 'RGB To HSV' nodes + +* Improvements: + * 'Custom Expression' node with a return instruction on its Code text area generates a function with the code contents thus enabling multiple instructions lines on its body + * Added small info text on node properties to explain its behavior + * Added new name field ( can also be edited directly on node by double clicking on it ) which is used to name the generated function/ local variable + * Small refactoring on some classes for consistency and warning removal from Visual Studio + +* Fixes: + * Fixed issue on some changes not being correctly caught on setting Blend Render Type + * Fixed issue with Unlit Light model doubling the value set on the Emission output port + * Small fix on title updates when using Shader Functions + * Removed warning from unused legacy source code on 'Register Local Var' and 'Get Local Var' nodes + * Fixed issues on incorrect casts on 'Texture Sampler' node + * Fixed issues on incorrectly snapping wires into hidden ports + +v0.7.2 dev 05: +* Improvements: + * Changed tool tip display to trigger when mouse is on top of the node ( now displays below the node) + * Shader Functions + * Added default values for input node in SF (these are used when there's no connection) + * Added port restrictions to dynamic node types + * Changed way input node work with restrictions when changing type to prevent invalid connections + +* Fixes: + * Fixed minor typo on 'Rotator' node + +v0.7.2 dev 04: +* Fixes: + * Fixed multiple issues on save behavior when changing modes + * Fixed issue with shader functions not assigning the main node correctly + * Fixed issue on Project Window Change callback + * Fixed graph count increasing on shader switch + * Fixed version numbering in function nodes + * Fixed nested SF issue with inputs + +v0.7.2 dev 03: +* Fixes: + * Fixed issue with 'Vertex TexCoord' not writing properties correctly into shader meta + +v0.7.2 dev 02: +* Fixes: + * Fixed cast and port activation issues on Blend Nodes + * Fixed various issues with SF: + * Saving no longer deselects + * Reordering is now working properly + * Autocast now has port restrictions into account and deletes with warning when possible + * Sampler types no longer duplicate + +* Improvements: + * Texture Objects node family can now be set as Globals + +v0.7.2 dev 01: +* New Features: + * Added Shader Functions + * Added new 'Object Scale' node + +* Fixes: + * Fixed multiple issues with Copy/Paste + * Fixed issues with nodes on Vertex Function + * 'Fresnel' + * 'Posterize' + * 'Heightmap Texture Blend' + * 'Unpack Scale Normal' + * Fixed issue with incorrect data read from 'Texture Coordinates' nodes on versions below 0.5.0 dev 003 + * Fixed issue on inverted Receive Shadows toggle + +* Improvements: + * Can Copy/Paste between different Shaders and Shader Functions + * Shader properties created by Refraction, Translucency, Mask Value and Tessellation now appear on the Output node Material Properties list and can be reordered + * Preventing UndoParentNode to generate DefaultValue conflicts caused by other plugins + * Removed warnings generated on some situations by the 'Screen Position' node + +* New Samples: + * LowPolyWater by The Four Headed Cat + * ForceShield by The Four Headed Cat + +v0.7.1 dev 02: +* Improvements: + * Improved 'Texture Coordinates' node and added new Tex input port into it + * Improved local variable usage on several node generated code to improve overall shader instruction count + * 'Vertex Position' node now has new Size property + +* Fixes: + * Fixed issues on 'Vertex to Fragment' node + * Fixed issue on loading an ASE shader with its window already opened but tabbed and not visible during play mode + * Fixed multiple issues with 'Grab Screen Position' node usage on Vertex function + * Fixed issue with Forward Shadows not being correctly written when Custom Shadow Caster was active + * Fixed issues with Blend nodes usage on Vertex function + * Fixed issues with 'Dithering' node usage on vertex function and when Tessellation is active + * Fixed issues with 'Screen Depth' node usage on vertex function and when Tessellation is active + * Dithering sample now works while Tessellation is active + +v0.7.1 dev 01: +* New Features: + * Alt + Node Drag to Auto-(dis)connect node on existing wire connection + +* Improvements: + * Added new Tex Input Port into 'Texel Size' node + * Optimized nodes list usage on palettes (API) + * Improved retro-compatibility handling with adding new ports on already existing nodes (API) + +* Fixes: + * Fixed issue on horizontal scroll bar not appearing on Helper Window + +v0.7.0 dev 03: +* New Features: + * Added 'Face' node + * Added 'Switch by Face' node + +* Fixes: + * Fixed issue on not setting shader version on graph when creating a new empty one which lead to copy/paste issues + * Fixed wrong port type assignment and incorrect conditional operator usage on community 'Compare ...' nodes + * Fixed issue with creating a material from a shader already with properties in Unity 5.6 + * Fixed multiple UI issues on Retina MacBook + +* New Samples: + * Highlight Animated by The Four Headed Cat + * 2 Sided by The Four Headed Cat + * Two Sided with Face + +v0.7.0 dev 02: +* Improvements: + * Improved Float to Vector auto-cast + * Double-clicking on a 'Get Local Var' node focus on its referenced 'Register Local Var' node + +* Fixes: + * Fixed issue with keyboard shortcuts on Mac + * Fixed renaming issues with 'Triplanar Sampler' node + * Fixed issue on property nodes UI not refreshing on Undo + * Fixed issues on 'Fresnel' and 'Vertex Normal' related with normal generation + * Fixed typos on POM + * Fixed issue with Wire node deletion + * Fixed auto-change port types issues on all Compare nodes + +v0.7.0 dev 01: +* Improvements: + * Greatly improved Undo + * Colored Port Mode behaves as a normal toggle and doesn't require double tap on W key + +* New Samples: + * Hologram by The Four Headed Cat + +* Fixes: + * Fixed issue on deleting nodes with Wire nodes on their connections + +v0.6.1 dev 05: +* Fixes: + * Fixed issue with custom Shadow Caster on Vulkan + +v0.6.1 dev 04: +* Improvement: + * Renaming 'Texture Sampler' Type property Instance to Reference and prevent confusion with GPU Instanced properties + +* Fixes: + * Fixed issue on unnecessary saves on Live mode + * Also increased Inactivity time from 0.5s to 1s + * Fixed issues on some node interactions not being detected by live mode ( and thus not being flagged to save ) + * Fixed issue on 'Rotator' node not correctly generating local values according to vertex/frag + * Fixed issue on 'Texture Coordinates' node when defining its Inputs with Tessellation active + * Fixed issue with custom Shadow Caster on Metal IOs + * Fixed small typo on Tessellation Shader Model warning message + +v0.6.1 dev 03: +* New Features: + * Adding Fallback shader picker on Master Node + * Adding Shader LOD value modifier on Master Node + +* Improvements: + * Node property title changes according to selected node + * Added Multi-Line mode to wires ( Ctrl + W ) + * Added ability to change 'Triplanar Sampler' node name + * Improved wire connections rendering while zoomed + * Tweaked live mode to save only when user is inactive for 0.5s + +* Fixes: + * Small node resizing issues fixed + * Fixed issues on Live mode not catching node connections and creation correctly + +v0.6.1 dev 02: +* New Features: + * Added 'Triplanar Sampler' node + * Added Vertex Output ( can now change from Relative/Local Vertex Offset to Absolute/Local Vertex Position ) + * Added Smear Sample + * Added Unlit Light Model + * Added simpler 'Time' node + * Added 'Depth Fade' node + * Added 'Camera Depth' Fade node + +* Improvements: + * Adding node info into Helper Window + * Adding drag and drag valid unity assets list to helper window + * 'Screen Position' and 'Grab Screen Position' now have a Output dropdown on its properties instead of a Toggle + * Improved GPU instancing example by adding a C# illustrating how to set instanced properties + +* Fixes: + * Fixed issue on preview materials not being initialized after returning from play mode + * Fixed issue on local variables reset + * Fixed issue with tangent and bitangent previews + * Fixed billboard issue with non-uniform scaling + * Fixed issue on Tex ports counting as having valid internal data on Node Properties UI + * Fixed issue on using 'Texture Sampler' or 'Screen Color instances on Master Node Debug port + +v0.6.1 dev 01: +* Improvements: + * Activating internal data into 'Object To World' and 'World To Object' nodes and setting it to (0,0,0,1) by default + * 'Texture Array' nodes can be created by dragging a Texture 2D Array object into ASE canvas +* Fixes: + * Fixed issue on 'Texture Array' node when connecting it to Vertex Ports + * Fixed issue on 'Vertex TexCoord' not generating correct source according to their properties + * Fixed issues on MourEnvironment, SandPOM and WaterSample shaders + +v0.6.0 dev 01: +* Improvements: + * Added Texture Coordinate Coord Size parameter for 'Vertex TexCoord' node +* Fixes: + * Fixed issue when doing custom shadow caster with translucency on deferred mode + * Fix for texture coordinates zeroing out Z and W + * Fixed issue with input port internal name not being set correctly + * Fixed issue with custom shader inspector on unity 5.6 + * Fixed shadows issue on Matcap example + * Fixed 'Virtual Texture Object' sampling the correct UVs when not connected + +v0.5.1 dev 012: +* Fixed issue with LightColor node not generating the proper values +* Fixed issue when doing custom shadow caster with translucency on deferred mode +* Made the code generation compiler friendly because of unity 5.5 and up changes + +v0.5.1 dev 011: +* Adding new Billboard option into Master Node +* Control key can be also used to append nodes to selection +* Fixed issue with not updating material inspector in real time ( because out of focus ) when changing properties on canvas +* Fixed cast issues on object picker with 'Texture Sample' and 'Texture Object' nodes +* Added Mask buttons on Previews +* Improved overall editor performance + +v0.5.1 dev 010: +* Added 'Desaturate' node +* Fixed small visual issue with Color Mask UI +* Improved overall UI performance + +v0.5.1 dev 009: +* Linking both Up/Down keys and right mouse dragging to scroll behavior into menus +* Canvas zoom can be changed by right mouse dragging while pressing Alt key +* Fixing multiple issues with 'Swizzle' node +* Heavily optimized drawing the node lines +* Fixed issue with loading default shaders to ports + +v0.5.1 dev 008: +* Fixed issues when using line feed on 'Custom Expression' node code area +* Fixed wires and previews displaying on top of the title bar +* Fixed order issues on 'Commentary' node +* Fixed issue with BurnEffect sample +* Majorly improved Previews update speed +* Added LOD levels to previews ( sampler and texture arrays ) +* Added many more node previews +* Updated TriplanarProjection and ParallaxMappingIterations samples +* Optimization on drawing wires +* 'World Normal', 'World Reflection' and 'Fresnel' input ports now modify their previews +* Improved Nodes Graph internal ordering to correctly create connections on shader load + +v0.5.1 dev 007: +* Fixed issues with 'Texture Coordinates' node usage with Tessellation +* Fixed swizzling issues on 'View Dir' node + +v0.5.1 dev 006: +* Added new Helper Window accessible via the right most button on the graph window +* (De)Activating Tessellation and Outlines forces shader to save +* Expanded the amount of nodes with available preview +* Added fail safe to continue loading shader if in-existing community nodes are detected +* Added Normal Map unpacking to 'Texture Array' node and updated its sample +* Fixed issues on Debug Port usage +* Fixed issues on 'Flipbook UV Animation' when property nodes are connected to rows and column input ports +* Fixed issues on Not configuring 'Texture Array' node ports after read +* Fixed issues on Major fix on register/get local var mechanics +* Fixed issues on Adding a space on the node palette search when opening it via space bar +* Fixed issue on ignoring color masks setup on certain situations +* Forcing default values on input port internal data if an exception is caught + +v0.5.1 dev 005: +* Added new Curvature Parameter for 'Parallax Occlusion Mapping' Node +* Added 'World To Object' node +* Added 'Object To World' node +* Fixed issue on 'World Normal' node +* Fixed issue on 'World Tangent' node +* Fixed issue on 'World Bitangent' node +* Fixed issue on 'World Reflection' node +* Fixed issue on 'Register Local Var' node +* Fixed issue with Tessellation used with Custom Shadow Caster +* Fixed issue with Mip Level not being used with 'Texture Sampler' nodes on Vertex Ports +* Fixed issues with Master Node Debug port usage + +v0.5.0 dev 005: +* Applied overall UI changes from Master Node into all other nodes +* Added Node Previews +* Added new Frame Title parameter on 'Commentary' nodes + * Auto focus on new Frame Title textfield when node is created +* Added new Soap Bubble sample using both Reflection and Refraction +* Fixed issue with 'Custom Expression' node +* Fixed issues on 'Scale' node +* Fixed issues on 'Panner' node +* Fixed issues on 'View Dir' node +* Fixed issues on 'Substance Sample' node +* Fixed Repaint issues on ASE custom material editor +* Fixed issue with texture defaults not being correctly written on shader meta +* Fixed issue on reading alpha:fade option from older versions +* Tweaked 'Component Mask' node +* Tweaked 'Pi' node +* Improved 'Substance Sample' node previewer +* Refraction to now have Specularity into account +* Removed warnings on importing ASE to Unity v5.6.0 + +v0.5.0 dev 004: +* Added new Outline option on Master Node properties +* Tweaked Tessellation material update + +v0.5.0 dev 003: +* Fixed issue with Live Mode load/save state +* Fixed repaint issue with picking ports +* Tweaked 'Substance Sample' node preview +* Adding Toggle Attribute to 'Switch Toggle' node + +v0.5.0 dev 002: +* 'Texture Coordinate' now support float3 or float4 output types +* Changed Colored ports saving mechanism +* Tweaked how ports are saved/loaded via shader meta to easily modify existing nodes port amount without breaking older versions (API) +* Tweaked Simple Noise example +* Tweaked Read Atlas examples +* Tweaked Translucency example +* Minor tweak on 'Texture Sample' node +* Fixed issue with local variable declaration on Master Node Debug port +* Fixed issue with Screen Space Curvature example +* Fixed issue with reading fade parameter on master node +* Fixed issue with Transparency shader + +v0.5.0 dev 001: +* Fixed issues with 'Texture Array' node +* Fixed issues with 'Texture Coordinates' node +* Fixed issues with Tessellation example on MacOs +* Fixed issues on multiple examples with Unity beta version 6 and above +* Added new 'Substance Sample' Node +* Added example using the new 'Substance Sample' node located at Examples/Official/Substance +* Added Attributes to Property Nodes +* Added Conditional 'If' Node with Dynamic Branching option +* Tweaked 'Flipbook UV Animation' node + +v0.4.1 dev 002: +* Fixed issue 'Flipbook UV Animation' node not resetting properly and added a start frame parameter + +v0.4.1 dev 001: +* Fixed issue with Texture Array sample + +v0.4.0 dev 003: +* Default Alpha mode set to Transparent and not Alpha Pre-Multiply +* Minor tweak on node sorting on palette windows +* Minor tweak on Master Node Property UI +* Added new Rendering Options foldout on Master Node properties +* Added check to prevent division by zero warning with 'Grab Screen Position' and 'Screen Position' nodes + +v0.4.0 dev 002: +* Forcing LF on all shaders to prevent CRLF mixed with LF when upgrading them +* Fixed issues with custom shader inspector + +v0.4.0 dev 001: +* Minor fix on 'Grab Screen Position' node +* Added new Refraction port into Master Node. Only works correctly with Unity 5.5.1 p1 and above due to an internal unity issue +* Added new Refraction Example ( AmplifyShaderEditor/Official/ObjectNormalRefraction ) +* Added new Vertex Normal port into Master Node +* Small update to Material and Shader mode borders +* Parameter types can now be changed from node itself on property nodes via dropdown on its upper left corner +* Various fixes from the way the Blend Mode works to take new translucent option into account +* Fixed issue with connections from cache when changing Light Mode on Master Node not respecting port availability +* Changed Refracted Shadow demo blend mode +* Fixed Vertex Offset issue with custom shadow caster +* Small fix to auto change blend mode on rendertype and render queue changes +* Fixed some samples with wrong version or wrong connections +* Fixed UI problems in Unity Personal skin + +v0.3.2 dev 003: +* Fixed issue with 'Multiply' node +* Fixed issue with 'Divide' node +* Fixed issue with 'Texture Sample' node +* Fixed issue with 'Dot' node +* Tweaked 'Fresnel' node to use Unity's interpolators and made the default values match Schlick Fresnel +* Tweaked 'World Normal' node to prevent multiple normals generation +* Added 'Texture Array' node +* Added 'Linear to Gamma' and 'Gamma to Linear' nodes +* Majorly revamped the UI for the master nodes options +* Revamped Blend Modes and added additional options +* Added pos-load test on nodes invalid connections to prevent issues with older ASE versions + +v0.3.2 dev 001: +* Added custom shadow caster +* Small fix to both emission and alpha on Fade mode +* Fixed minor issues on reading shaders from older versions( < v0.2.0 dev 002 ) +* Fixed issues on 'Custom Expression' node +* Fixed issues with 'Grab Screen Position' node +* Property nodes with Parameter Type set to Global doesn't force _ on the parameter internal name + +v0.3.1 dev 009: +* Fixed 'Grab Screen Color' node issues +* Minor tweaks on Context menu +* Tweaked 'Screen Position' and 'Grab Screen Position' behavior +* Added switching of input ports connections by holding the CTRL key +* Added removing of input ports connections by double clicking with the left mouse button on them +* Forcing Shader Model to at least 4.6 if Tessellation is active + +v0.3.1 dev 008: +* Small fix to 'Virtual Texture Object' node +* Fixed issues on 'Texture Sample' node +* Fixed issue on not correctly unregistering nodes from 'Commentary' nodes when they were deleted +* Fixed issue when reading old shaders created with v0.2.4 dev 004 +* Fixed issue with 'Texture Coordinates' node when using Tessellation +* Fixed issues and tweaked overall normals generation +* Fixed issue on 'Vector From Matrix' node +* Fixed issue on ASE canvas camera incorrectly panning when hitting a tooltip with Middle/Right Mouse Button +* Fixed connection errors with 'Vector From Matrix' node +* Fixed issue with 'Vertex To Fragment' node +* Deprecated 'Local Position' node +* Added 'Grab Screen Position' node +* Tweaks on nodes and ports names to maintain overall consistency +* Added new Scale and Offset option on 'Screen Position' node +* 'Register Local Var' node now also has system to prevent duplicate names + +v0.3.1 dev 007: +* Added auto-order option into 'Register Local Var' node +* Added new 'Improved Read From Atlas Tiled' example +* Added 'Simplified Fmod' node + +v0.3.1 dev 006: +* Fixed control argument exception when deleting connection with Alt key on selected node +* Fixed issue with 'Switch Toggle' node + +v0.3.1 dev 005 +* Side menus are now resizable +* Tweaked 'Weighted Blend' node +* Added 'Summed Blend' node +* Added 'Toggle Switch' node +* Added new 'Scale and Offset' node +* Fixed issues on 'Vertex Binormal World' and '[VS]Vertex Tangent' nodes +* Fixed issues with 'Texture Sample' nodes created via dragging a texture to ASE +* Fixed issue with 'Scale' node +* Fixed issues on incorrectly reading 'Receive Shadows' parameter from ASE shader previous to v0.2.5 + +v0.3.1 dev 004 +* Fixed issues with accessing 'Texture Coordinates' node when tessellation is active + +v0.3.1 dev 003 +* Fixed yet another issue with accessing 'Texture Coordinates' node on vertex function +* Reverted shader update mechanism after save to previous old one until issue reported by Seith is fixed + +v0.3.1 dev 002 +* Fixed issues with accessing 'Texture Coordinates' node on vertex function + +v0.3.1 dev 001 +* Improved overall editor UI +* Improved Live Mode +* Nodes can generate shader comments ( API ) +* Each port can now have multiple restrictions ( API ) +* 'Texture Object' can now only be connected to 'Texture Sample' nodes +* Added 'Switch' toggle node + +v0.3.0 dev 005 +* Auto adding AMPLIFY_SHADER_EDITOR symbol on current target group when initializing ASE ( API - to be used on external community nodes ) +* Added keyboard shortcut [F5] to force available nodes refresh ( API ) + +v0.3.0 dev 004 +* Fixed yet another issue with local variables generation + +v0.3.0 dev 003 +* Fixed crash from infinite loop generated on port 'Tex' at 'Texture Sample' node +* Fixed cast issue when using internal port data on some nodes +* Fixed issues with local variables generation +* Tweaked Vertex Displacement port on Master Node +* Added ability to specify range of valid data types for input ports ( API ) +* Locked 'Tex' port from 'Texture Sample' node to only allow connections to 'Texture Object' nodes + +v0.3.0 dev 002 +* Updated POM to clip edges using a tilling parameter +* Updated the sand POM example and its height texture +* Updated Water sample +* 'Vertex NormalWorld', 'World Position' and 'View Dir' nodes now also output into vertex offset correctly +* All editor resources are loaded via their own guid +* Added Tessellation port into master node to be able to create custom Tessellation behaviors + * Tessellation parameters ( excluding Phong ) on Master Node Properties will be deactivated if its port is being used + * Created Nodes for each of the builtin Tessellation functions + * Distance-base Tessellation + * Edge Length Tessellation + * Edge Length Tessellation with Cull +* Fixed issues with not creating local variable correctly if graph is shared between vertex and frag ports +* Fixed issue with local variables created on automatic casting not taking port category into account +* Fixed node width issue regarding its header title size + +v0.3.0 dev 001 +* Fixed issue on where deprecated nodes needed to be available to be replaced by their replacement type +* Fixed issues on all conditional nodes +* Fixed issue on local variable creations on vertex shader +* Fixed issue on 'Commentary' node +* Amplify Texture dependency is dynamically set through asset guid +* Texture Sampler will quietly ignore virtual object if AT is not found in project and will not generate a broken shader +* Deprecated nodes are automatically excluded from the palette +* Updated version in all samples +* Optimized 'Multiply' and 'Divide' nodes +* Added Edge Length based tessellation +* Added Fixed Amount based tessellation + +v0.2.6 dev 001 +* Fixed issue on 'Virtual Texture Object' node +* Fixed issue on 'If' node +* Fixed issues in 'Parallax Occlusion Mapping' node +* Fixed issues on 'Texture Sampler' node +* Fixed issue for translucency on point lights +* Fixed issues on 'Texture Coordinates' node +* Fixed issue on not correctly syncing ASE when when hitting paste button on our custom inspector +* Avoiding null pointer exception when compiling a 'Texel Size' node without references +* Re-Organized ASE folder system and added initial pop-up window to clean old/deprecated data +* Tweaked Default/Material values UI on Property nodes +* Node Properties window can now be show by double clicking a node +* Renamed Uniform parameter type to Global +* Added Distance-Based tessellation. Can be activated/configured on Master Node properties + * Added Tessellation sample +* Added emission baking support. Queue must be set to "Geometry" to work properly +* Added Tiled Atlas sample +* Added scenes for each sample +* Added tool tips for Master Node properties + +v0.2.5 dev 004 +* Added Parallax Occlusion Mapping node (uses linear search with customizable samples in conjuntion with interval mapping for refinement of sidewalls) +* Added simple snapping behavior when moving nodes (left-control) +* Fixed background grid image sliding when zooming +* Fixed issue with 'Texcoord Vertex Data' on writing +* Fixed issues with default values of 'Virtual Texture Object' +* Fixed issues when drawing 'Matrix3x3' and 'Matrix4x4' nodes +* Fixed compilation error when creating builds + +v0.2.5 dev 003 +* Fixed issues on 'Texture Coordinate' node +* Fixed issues with 'Texture Sample' node not reading the correct values from older shaders versions +* Fixed issues with instanced texture samples +* Fixed issues with 'Texel Size' node +* Fixed issues with adding new categories on community created nodes + * Custom category colors can now also be set up via NodeAttributes(...) +* Created simpler method ( GeneratePortInstructions(...) ) to generate input instructions. Handy for community members which are creating new custom nodes +* Fixed issue with propagating incorrect port types on master node when loading shader from older versions +* Fixed issues with parallax example +* Alpha channel/Opacity port is forced to 1 if Keep Alpha is set to true and port is not connected to prevent UI issues +* Added index property in '[VS] Vertex TexCoord' node and marked '[VS] Vertex TexCoord1' node as deprecated +* Tweaked collision area on minimize/maximize buttons on lateral windows +* Small optimization on 'Custom Expression' node +* Added support for virtual texturing via Amplify Texture +* Community Node additions + * Jason Booth + * Added 'Vertex To Fragment' node + +v0.2.5 dev 002 +* Added 'Texture Object' node +* Tweaked 'Texture Sample' node behavior to use the new 'Texture Object' node +* Added Stencil Buffer support +* Added Depth foldout with access to ZWrite, ZTest and Offset configuration +* Added AMPLIFY_SHADER_EDITOR preprocessor directive +* Fixed issue on not resetting instance variables counter on reset/load +* Overall fixes on node UI and its adaptation when zooming out + + +v0.2.5 dev 001 +* Added Color Mask option on Master Node +* Added access to additional UV sets on "Texture Sample" and "Texture Coordinates" nodes +* Fixed issue when attempting to connect a wire to a locked port +* Fixed issue with incorrectly adding '#pragma multi_compile_instancing' on non instanced property shaders +* Minor tweak on palette foldout behavior + + +v0.2.4 dev 007 +* Fixed issue on wrong auto-snapping wires with invisible, locked ports +* Fixed issue with version control on Master Node +* Added Transmission input port on Master Node +* Added 'Mip Mode' in 'Texture Sample' node +* Property names can now be changed directly on node by double clicking on it +* Properties can be reordered through drag and drop operations on the Master Node properties via the Available Properties foldout area +* Min/Max values on 'Ranged Float' nodes can be modified directly on canvas + +v0.2.4 dev 006 ( for internal reasons we had to skip dev 005 ) +* Fixes issues on 'Panner' node +* Fixed issues with not correctly generating local variables according to port category +* Tweaked behavior and fixed issues on the 'Texture Coordinate' node +* Fixed issues on 'Texel Size' node +* Fixed issues on 'Local Vertex Pos' node +* Fixed issues with Burn Effect Sample +* Removed positive number restriction from Master Node 'Queue Index' property +* Custom Material Inspector can be selected/changed on Master Node + * Done through the Custom Editor property + * You can always reset to our own by hitting the Reset button next to hit +* Updated Rim Light Sample to use the new Space option on the 'View Dir' node +* Updated Parallax Sample to use the new Space option on the 'View Dir' node +* Added 'Translucency' input port into Master Node +* Added 'Dithering' node +* Added Matcap Sample +* Added Dithering Sample +* Added Rendering Platforms selector on Master node +* Added Water Sample on a small terrain in the Sample Scene + +v0.2.4 dev 004 +* Fixed issues with wire shader +* Fixed issues with 'Texture Coordinates' node +* Removed warnings occurring on Unity v5.5 +* Fixed issue with 'Append' Node +* Fixed issue with ASE Custom Material Inspector +* Tweaked 'Local Vertex Pos' node to output differently if generating code for vertex or fragment ports + +v0.2.4 dev 003 +* Added Texture Reference dropdown to 'Texture Coordinates' node +* Added Render Path dropdown in Master Node +* Tweaked 'View Dir' node so you're able to choose between getting the result in tangent or world space +* Tweaked 'World Space Light Dir' to no longer use internal input port data when nothing is connected, instead worldPos is automaticaly fed into it +* Added Unity version check for wires shader and fix compatibility issues +* Added Normalize toggle into 'Screen Position' node +* Community Node additions + * Tobias Pott + * Added 'Swizzle' node + +v0.2.4 dev 002 +* Added 'Layered Blend' node +* Added 'Weighted Blend' node +* Added 'Texel Size' node +* Merged '[VS] Vertex Color' and 'Vertex Color' nodes in order to avoid further confusions and marked the first one as deprecated + * Node internally changes its output if it's writing to a vertex or fragment port +* Added 'Surface Depth' node +* Added 'Screen Depth' node +* Fixed issue with property nodes uniform variables not taking selected precision into account + +v0.2.4 dev 001 +* Added 'Parallax Mapping' node +* Added 'Negate' node +* Added Fake Window user sample +* Added Parallax Mapping example with 4 iterations using the basic Parallax Mapping node + +v0.2.3 dev 002 +* Added 'Custom Expression' node +* Precision used is now the least between the one selected in the node and main one selected on the master node +* 'Register Local Var' and 'Get Local Var' nodes can now be used on Master Node Vertex ports +* Improved wires visuals +* Fixed issue with local variables generation +* Fixed issue with switching port internal data from float to int +* Fixed cast issue with 'Remap' node +* Added all the supported shader models into the Master Node dropdown + * When creating a shader the default selected is now 2.5 to match Unity default +* Community Node additions + * The Four Headed Cat + * Added 'Grayscale' node + +v0.2.3 dev 001 +* New control points can be added to wires to better manipulate its shape + * Double click a wire to create an additional control point + * Control points are selected, moved and deleted similar to regular nodes +* Fixed issue with box selection being active when dragging nodes with the 'Shift' key held down +* Fixed issues with wire resources not being correctly released when ASE is shut down +* Fixed issues with 'Pixel Normal World' and 'Vertex Normal World' nodes +* Fixed issue with 'Multiply' node on Matrix/Vector multiplications +* Fixed issue with 'Break To Components' node +* Fixed issue with 'Component Mask' node +* Fixed issue with wrong type propagation when replacing node connections +* Fixed issue with instance references being lost on 'Texture Sample' and 'Screen Color' nodes +* Tweaked 'Object to World' and 'World to Object' nodes to be more compile friendly +* Added 'Model' matrix node +* Added 'Relay' node +* Added 'TriplanarObjectSpace' sample to Samples folder +* Added precision selector for variables ( known issue: precision info is not being taken into account when auto local vars are created ) +* Community Node additions + * The Four Headed Cat + * Added 'Tau' node + * Rea + * Added 'Height Map Blend' node + +v0.2.2 dev 001 +* Fixed issue with 'Mask Clip Value' not being correctly synced between material and shader +* Added colored Debug Mode ... this is an experimental feature where each port and wire are colored according to its data type. Each color/type pair are not final + * Hold 'P' key to enable debug mode and release it to disable it + * Double hit 'P' key to toggle debug mode on. Double hit 'P' key again to disable it. +* Added 'Matrix From Vectors' node +* Fixed issue with 'Vertex Binormal World' node +* Added 'Shader Model' dropdown on Master Node properties +* Community Node additions + * The Four Headed Cat + * Fixed issues with 'Logical Operator' nodes + +v0.2.1 dev 001 +* Fixed multiple issues importing current version on top of v0.1.0 dev 001 + +v0.2.0 dev 003 +* Mask Clip Value when used is registered as a Material Property + +v0.2.0 dev 002 +* Improved duplicate code detection system +* Slight improvement on save/update times ( important for Live Mode ) +* Fixed issue with 'Texture Sample' node incorrectly outputting a float4 when no texture assigned and on Normal mode +* Fixed issue on not opening the correct shader from a material inspector if a new one is selected from its dropdown +* Fixed issue with 'Length' node incorrectly changing its output type +* Community Node additions + * The Four Headed Cat + * Flipbook UV Animation + +v0.2.0 dev 001 +* Fixed issues with 'Get Local Var' node + * Output port type is now correctly set to its reference type + * Changed how references are saved so it won't be affected by order index re-ordering +* Fixed issue with 'Power' node +* Fixed issue with 'ATan2' node +* Fixed issue with 'Cross' node +* Community Node additions + * The Four Headed Cat + * Logical If + * Pixelate +* Community Samples additions + * The Four Headed Cat + * DissolveBurn + * Mourelas Konstantinos + * EnvironmentGradient + +v0.1.5 dev 001 +* Community Node additions + * The Four Headed Cat ( moved to a separate 'Logical Operators' category ) + * Compare With Range + * Compare Not Equal + * Compare Lower Equal + * Compare Greater Equal + * Compare Lower + * Compare Greater + * Kebrus + * Vertex Tangent World + * Vertex Binormal World +* 'Register Local Var' node changes: + * Is now independent from Master Node execution order and generates activation signals + * Will always be executed even if not connected to Master Node + * Fixed issue updating name string array when loading from file + * Added order index to control their declaration order( lesser index declared first ) +* Fixed issue on port type change not propagating in certain nodes +* Hitting Escape key will disable context palette menu if active +* Fixed issue where right mouse clicking on certain port areas would delete their wire connection +* Minor improvement on nodes performance + +v0.1.4 dev 002 +* Dynamic type nodes now also reacting to input port disconnections +* Updated TFHCRemap node from benderete + +0.1.4 dev 001 +* Fixed issue with order index not being correctly read/written +* Redone Refraction Shader according to rea suggestion +* Register Local Var node now has a title style similar to Property Nodes with the local var name always visible +* Added Get Local Var Node. It allows the user to use already registered local vars anywhere in the graph +* Added Custom Node Remap ("TFHC - Remap") created by user benderete +* Fixed issue on Texture Sample UV port not correctly casting to float2 when needed +* Fixed issue with Texture Sample node not adapting layout when reference is in normal mode + +v0.1.3 dev 003 +* Added RegisterLocalVar node. This is a node to improve shader readability in certain situations, as it forces the shader to create a local var containing its input value and always use that as output +* Added Screen Color Texture Reference feature +* Created Simple Refraction example ( Samples/SimpleRefraction ) +* Fixed issues with sampler instance resizing +* Fixed issue with Fresnel node incident vector +* Fixed issue with attempting connection removal on inexistent nodes ( bug affecting Append node ) +* Fixed issue with overwriting render type and queue values with Blend Mode default values on read from file + +v0.1.3 dev 002 +* Fixed multiple issues with deleting a Texture Sample node being referenced by other nodes +* Tweaked Texture Sample reference UI + +v0.1.3 dev 001 +* Fixed issue when releasing mouse drag on menu areas not resetting auto*pan +* Tweaked Shader Instancing UI +* Fixed issue with material inspector crashing when updating a property with ASE window turned off +* Fixed issue with custom UI skins not being correctly initialized under some conditions +* Added Texture Reference feature +* Added 'Simple Blur' example to demonstrate how Texture referencing works +* Added small 'Made with Amplify Shader Editor' info as comment on generated shaders + +v0.1.2 dev 003 +* Fixed issues with opening materials via inspector with no ASE window initialized + +v0.1.2 dev 002 +* Added GPU Instancing ( see Samples/SimpleGPUInstancing example ) +* Added Screen Color node +* Fixed issue on version testing +* Tweaked Master Node icon +* Added additional icon into top-left master node node indicating if gpu instancing is being used or not + +v0.1.2 dev 001 +* Fixed typo on Texture Coordinate node +* Added explicit control on Render Type and Queue. They will be automatically set when a Blend Mode is selected. +* Added Fresnel node +* Fixed Trigonometry typo +* Improved local var generation on op nodes +* Added FWidth node +* Fixed issue with not immediately updating shader when hitting the Live Shader Mode button + +v0.1.1 dev 001 +* Community Contribution from kebrus: Added Rotator node, rotates UV Coordinates/ Vector2 nodes +* Fixed Vector2 Append Node bug +* Fixed Int to Float cast issues +* Added Shader title area on top canvas to forbidden node interaction area +* Adjusted Auto-Pan behavior +* Fixed issue with nodes infinite loop detection +* Tweaked mouse detection inside main canvas +* Fixed Queue Order typo when building shader +* Improved notifications when impossible cast is requested +* Added new VectorFromMatrix which gets a specific row or column from a 3x3 or 4x4 matrix +* Automatically hiding Order Index on Uniform Property Type nodes +* Simpler Searchable Node List also being called by hitting the space bar if focus is on main node canvas diff --git a/Assets/AmplifyShaderEditor/ChangeLog.txt.meta b/Assets/AmplifyShaderEditor/ChangeLog.txt.meta new file mode 100644 index 0000000..e6fba31 --- /dev/null +++ b/Assets/AmplifyShaderEditor/ChangeLog.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 580cccd3e608b7f4cac35ea46d62d429 +timeCreated: 1481127071 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/CreatingTerrainsWithASE.txt b/Assets/AmplifyShaderEditor/CreatingTerrainsWithASE.txt new file mode 100644 index 0000000..e0d0e96 --- /dev/null +++ b/Assets/AmplifyShaderEditor/CreatingTerrainsWithASE.txt @@ -0,0 +1,58 @@ +Creating terrains with Amplify Shader Editor is really quick and easy. We will give you a brief explanation on how you can start creating terrain shaders with ASE in no time. + +A standard unity terrain is a regular surface shader using properties with a specific naming. +Besides these properties, a small configuration is necessary. +[Create Shader] +As with any other ASE shaders, right-click on the Project view, select Create > Amplify Shader > Surface Shader and name it as you like. We advise you to have 'First-Pass' included on the shader name since it performs what is called a first pass over the terrain. + +[Queue Index] +Set the Queue Index to -100 on the Output Node Properties General tab. + +[Render Type] +By default a created shader already comes with the Opaque shader type selected, which is required by the terrain, but please go to the Blend Mode tab and check that Opaque is the selected option. + +[Specify Base Shader] +A Base shader must be specified. This shader will be responsible to render the terrain when over a certain distance specified at the Base Map Distance on the terrain settings. Beyond this distance, a lower resolution composite image will be used with this shader for efficiency reasons. + +We already have a base shader created and ready to be used, so you only need to: +- Go to your Dependencies Tab on the Output Node Properties +- Click on the Add Button to add a new entry +- Write BaseMapShader into the Name textfield +- Write ASESampleShaders/SimpleTerrainBase on the Value textfield + +Feel free to open the ASESampleShaders/SimpleTerrainBase shader located at AmplifyShaderEditor > Examples > Official > SimpleTerrain > SimpleTerrainBase.shader and check what is being done. Please note that property naming in the base shader is very strict and property names must be maintained. + +[Specify Splat Count] +ASE only supports up to four splats (single-pass) for now, this needs to be specified into the shader through a custom tag. +In order to do that: +- Go to Custom SubShader Tags tab on the Output Node Properties +- Click on the Add Button to add a new entry +- Write SplatCount into the Name textfield +- Write 4 into the Value textfield + +Future versions will introduce multi-pass support for more complex effects. + +[Create Properties] +This is the meat of how the terrain shader will behave. +We already have a shader function, Four Splats First Pass Terrain, which replicates Unity standard terrain and should be used as starting point on creating your own shader. + +[[Diffuse]] +Each splat can be accessed via their properties, having yet again strict naming to be maintained. +The splat diffuse colors are accessed through the sampler variables _Splat0 through _Splat3, so in your shader you must create four Texture Sampler nodes with the names Splat 0 through Splat 3 as the _ is automatically placed and the empty spaces are also automatically removed from the created variable name. + +[[Normal]] +The same goes to normal maps, they are accessed through the sampler variables _Normal0 through _Normal3 so, like with diffuse, in your shader you must create four Texture Sampler nodes with the names Normal 0 through Normal 3. One detail to take into account is that Unpack Normal Map should be turned off for each one of the nodes and an Unpack Scale Normal node should be applied after their values are combined. + +[[Smoothness + Metallic]] +Smoothness and Metallic values must also have specific variable names, _Smoothness0 through _Smoothness3 and _Metallic0 through _Metallic3 respectively. + +These variables however are Float properties, so to access them you need to create Float nodes, set them to Properties with the names Smoothness 0 through Smoothness 3 and Metallic 0 through Metallic 3 respectively. + +To maintain consistency with the Unity terrain shader, you should add the Gamma attribute to the Metallic property nodes. + +[[Combining Maps]] +The weight of each layer is given by yet another sampler variable. The _Control sampler variable contains, in each of its channels, the contribution each layer/splat have on the final result. +To get access to it, simply create a Texture Sampler node in your shader with its name being Control. +This Control texture is dynamically created when you paint your terrain with the Terrain tools and can be inspected by selecting the terrain asset on the Project view. + +Again, we invite you to check the Four Splats First Pass Terrain shader function located at AmplifyShaderEditor > Plugins > EditorResources > ShaderFunctions > Four Splats First Pass Terrain for a more in-depth view on how the Control texture is used. diff --git a/Assets/AmplifyShaderEditor/CreatingTerrainsWithASE.txt.meta b/Assets/AmplifyShaderEditor/CreatingTerrainsWithASE.txt.meta new file mode 100644 index 0000000..4a3259b --- /dev/null +++ b/Assets/AmplifyShaderEditor/CreatingTerrainsWithASE.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f11d5aaf59fc38544b8419242801ff97 +timeCreated: 1513615640 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Examples.meta b/Assets/AmplifyShaderEditor/Examples.meta new file mode 100644 index 0000000..607a472 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Examples.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 425c3aed47dd05444960ca41af18e591 +folderAsset: yes +timeCreated: 1481126943 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Examples/Built-In Samples.unitypackage.meta b/Assets/AmplifyShaderEditor/Examples/Built-In Samples.unitypackage.meta new file mode 100644 index 0000000..ee1d5e4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Examples/Built-In Samples.unitypackage.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e00e6f90ab8233e46a41c5e33917c642 +timeCreated: 1585839223 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Examples/Credits.txt b/Assets/AmplifyShaderEditor/Examples/Credits.txt new file mode 100644 index 0000000..3a22bde --- /dev/null +++ b/Assets/AmplifyShaderEditor/Examples/Credits.txt @@ -0,0 +1,8 @@ +Fire texture - http://suicidecrew.deviantart.com/art/Fire-Seamless-tile-116721709 +Screen Space Curvature - http://madebyevan.com/shaders/curvature/ + +Grass Blades texture from: +http://www.fuzzimo.com/free-hi-res-ornamental-grass-blade-textures/ + +Keep them coming, contribute today! +http://amplify.pt/unity/amplify-shader-editor/contribute diff --git a/Assets/AmplifyShaderEditor/Examples/Credits.txt.meta b/Assets/AmplifyShaderEditor/Examples/Credits.txt.meta new file mode 100644 index 0000000..48f5980 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Examples/Credits.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 451790f45b4e5434586d16e924540ee7 +timeCreated: 1481127071 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Examples/DownloadSamplesInstructions.txt b/Assets/AmplifyShaderEditor/Examples/DownloadSamplesInstructions.txt new file mode 100644 index 0000000..87035e7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Examples/DownloadSamplesInstructions.txt @@ -0,0 +1,8 @@ +Use your Unity Asset Store invoice number in the Amplify Product download page to download the latest Amplify Shader Editor package and Shader Samples package. + +1 - Go to http://amplify.pt/download +2 - Enter your Unity Asset Store and click Unlock +3 - Scroll down to the Amplify Shader Editor entry +4 - Click the Sample button to download the sample package. + +NOTE: You can also use the product download page to download the latest Amplify Shader Editor package. Due to Asset Store review times and update cycles, the version hosted there is usually more recent. \ No newline at end of file diff --git a/Assets/AmplifyShaderEditor/Examples/DownloadSamplesInstructions.txt.meta b/Assets/AmplifyShaderEditor/Examples/DownloadSamplesInstructions.txt.meta new file mode 100644 index 0000000..a82e19c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Examples/DownloadSamplesInstructions.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 03fe3bdcb7262a84ca060ff336c7d8d1 +timeCreated: 1481127071 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Examples/HDRP Samples (Legacy).unitypackage.meta b/Assets/AmplifyShaderEditor/Examples/HDRP Samples (Legacy).unitypackage.meta new file mode 100644 index 0000000..f31ed09 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Examples/HDRP Samples (Legacy).unitypackage.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dff05fea7446d7b4e9029bfab77455d2 +timeCreated: 1559836117 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Examples/HDRP Samples.unitypackage.meta b/Assets/AmplifyShaderEditor/Examples/HDRP Samples.unitypackage.meta new file mode 100644 index 0000000..59379f1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Examples/HDRP Samples.unitypackage.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d1c0b77896049554fa4b635531caf741 +timeCreated: 1533059192 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Examples/LWRP Samples (Legacy).unitypackage.meta b/Assets/AmplifyShaderEditor/Examples/LWRP Samples (Legacy).unitypackage.meta new file mode 100644 index 0000000..9098be8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Examples/LWRP Samples (Legacy).unitypackage.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f7c4e22642de60d448f4e4809190f7b1 +timeCreated: 1559837332 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Examples/LWRP Samples.unitypackage.meta b/Assets/AmplifyShaderEditor/Examples/LWRP Samples.unitypackage.meta new file mode 100644 index 0000000..0aa21b5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Examples/LWRP Samples.unitypackage.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6ecbfd0a046659943a69328c98ff0442 +timeCreated: 1520956522 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Examples/README Samples.txt b/Assets/AmplifyShaderEditor/Examples/README Samples.txt new file mode 100644 index 0000000..62fc082 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Examples/README Samples.txt @@ -0,0 +1,12 @@ +Samples are provided by pipeline, if you want to import the samples please use the "Start Screen" to do so instead of unpacking manually, this will ensure that they are imported correctly. Go to Windows > Amplify Shader Editor > Start Screen and under "Shader Samples" select the ones you want to import. Do be aware that importing any SRP samples requires to first install the respective pipeline using the package manager. + +However if you still want to import them manually here is the breakdown of the included packages: + * "Sample Resources": constains the assets shared between all pipelines, like textures and meshes, this should always be imported first + * "Built-In Samples": contains the samples shaders with their scenes for the built-in rendering system + * "HDRP Samples": contains the samples shaders with their scenes for HDRP 7.X.X and up (Unity 2019.3 and up) + * "HDRP Samples (Legacy)": contains the samples shaders with their scenes for HDRP 6.X.X and down (from Unity 2018.2 to Unity 2019.2) + * "URP Samples": contains the samples shaders with their scenes for URP 7.X.X and up (Unity 2019.3 and up) + * "LWRP Samples": contains the samples shaders with their scenes for LWRP between 4.X.X and 6.X.X (from Unity 2018.3 to Unity 2019.2) + * "LWRP Samples (Legacy)": contains the samples shaders with their scenes for LWRP 3.X.X (Unity 2018.2) + +Please notice that in some cases the sample may have been created in a different version from the SRP that you are using which can produce "pink" shaders. If that happens it's usually the case that you only need to open the shader in ASE and save it to update it. diff --git a/Assets/AmplifyShaderEditor/Examples/README Samples.txt.meta b/Assets/AmplifyShaderEditor/Examples/README Samples.txt.meta new file mode 100644 index 0000000..a893d0a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Examples/README Samples.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5c5208e121a880c4fbb9de7aaeaa8aa2 +timeCreated: 1541776170 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Examples/Sample Resources.unitypackage.meta b/Assets/AmplifyShaderEditor/Examples/Sample Resources.unitypackage.meta new file mode 100644 index 0000000..2de62af --- /dev/null +++ b/Assets/AmplifyShaderEditor/Examples/Sample Resources.unitypackage.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c0a0a980c9ba86345bc15411db88d34f +timeCreated: 1585839223 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Examples/URP Samples.unitypackage.meta b/Assets/AmplifyShaderEditor/Examples/URP Samples.unitypackage.meta new file mode 100644 index 0000000..10f67fa --- /dev/null +++ b/Assets/AmplifyShaderEditor/Examples/URP Samples.unitypackage.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a9d68dd8913f05d4d9ce75e7b40c6044 +timeCreated: 1575902011 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins.meta b/Assets/AmplifyShaderEditor/Plugins.meta new file mode 100644 index 0000000..301d404 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 3306ce0ede814a84c8d289893da72b7a +folderAsset: yes +timeCreated: 1481126943 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor.meta b/Assets/AmplifyShaderEditor/Plugins/Editor.meta new file mode 100644 index 0000000..e703561 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4a66239afbf6d2c4eb99238642c8d40f +folderAsset: yes +timeCreated: 1481126943 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Actions.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Actions.meta new file mode 100644 index 0000000..060fde1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Actions.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a2ba8588f45692f4ea2fa5afa9faf434 +folderAsset: yes +timeCreated: 1481126944 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Actions/ActionData.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Actions/ActionData.cs new file mode 100644 index 0000000..67572b4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Actions/ActionData.cs @@ -0,0 +1,336 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + + +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + public class ActionData + { + public virtual void ExecuteForward() { } + public virtual void ExecuteReverse() { } + } + + // NODES + // Create node + public class CreateNodeActionData : ActionData + { + private int m_nodeId; + private System.Type m_nodeType; + private Vector2 m_nodePos; + + public CreateNodeActionData( ParentNode node ) + { + m_nodeId = node.UniqueId; + m_nodePos = node.Vec2Position; + m_nodeType = node.GetType(); + } + + + public CreateNodeActionData( int nodeId, System.Type nodeType, Vector2 nodePos ) + { + m_nodeId = nodeId; + m_nodePos = nodePos; + m_nodeType = nodeType; + } + + public override void ExecuteForward() + { + UIUtils.CreateNode( m_nodeType, false, m_nodePos, m_nodeId ); + } + + public override void ExecuteReverse() + { + UIUtils.DestroyNode( m_nodeId ); + } + + public override string ToString() + { + return "Create Node - Type: " + m_nodeType + " Node: " + m_nodeId + " Position: " + m_nodePos; + } + } + + // Destroy node + public class DestroyNodeActionData : ActionData + { + private int m_nodeId; + private System.Type m_nodeType; + private Vector2 m_nodePos; + + public DestroyNodeActionData( ParentNode node ) + { + m_nodeId = node.UniqueId; + m_nodePos = node.Vec2Position; + m_nodeType = node.GetType(); + } + + public DestroyNodeActionData( int nodeId, System.Type nodeType, Vector2 nodePos ) + { + m_nodeId = nodeId; + m_nodePos = nodePos; + m_nodeType = nodeType; + } + + public override void ExecuteForward() + { + UIUtils.DestroyNode( m_nodeId ); + } + + public override void ExecuteReverse() + { + UIUtils.CreateNode( m_nodeType, false, m_nodePos, m_nodeId ); + } + + public override string ToString() + { + return "Destroy Node - Type: " + m_nodeType + " Node: " + m_nodeId + " Position: " + m_nodePos; + } + } + + // Move node + public class MoveNodeActionData : ActionData + { + private int m_nodeId; + private Vector2 m_nodeInitalPos; + private Vector2 m_nodeFinalPos; + + public MoveNodeActionData( int nodeId, Vector2 nodeInitialPos, Vector2 nodeFinalPos ) + { + m_nodeId = nodeId; + m_nodeInitalPos = nodeInitialPos; + m_nodeFinalPos = nodeFinalPos; + } + + public override void ExecuteForward() + { + ParentNode node = UIUtils.GetNode( m_nodeId ); + if ( node != null ) + node.Vec2Position = m_nodeFinalPos; + } + + public override void ExecuteReverse() + { + ParentNode node = UIUtils.GetNode( m_nodeId ); + if ( node != null ) + node.Vec2Position = m_nodeInitalPos; + } + + public override string ToString() + { + return "Move Node - Node: " + m_nodeId + " Initial Position: " + m_nodeInitalPos + " Final Position: " + m_nodeFinalPos; + } + } + + // CONNECTIONS + // Create connection + public class CreateConnectionActionData : ActionData + { + private int m_inputNodeId; + private int m_inputPortId; + + private int m_outputNodeId; + private int m_outputPortId; + + public CreateConnectionActionData( int inputNodeId, int inputPortId, int outputNodeId, int outputPortId ) + { + m_inputNodeId = inputNodeId; + m_inputPortId = inputPortId; + m_outputNodeId = outputNodeId; + m_outputPortId = outputPortId; + } + + public override void ExecuteForward() + { + UIUtils.ConnectInputToOutput( m_inputNodeId, m_inputPortId, m_outputNodeId, m_outputPortId ); + } + + public override void ExecuteReverse() + { + UIUtils.DeleteConnection( true, m_inputNodeId, m_inputPortId, false, true ); + } + + public override string ToString() + { + return "Create Connection Node - Input Node: " + m_inputNodeId + " Input Port: " + m_inputPortId + " Output Node: " + m_outputNodeId + " Output Port: " + m_outputPortId; + } + } + + // Destroy connection + public class DestroyConnectionActionData : ActionData + { + private int m_inputNodeId; + private int m_inputPortId; + + private int m_outputNodeId; + private int m_outputPortId; + + public DestroyConnectionActionData( int inputNodeId, int inputPortId, int outputNodeId, int outputPortId ) + { + m_inputNodeId = inputNodeId; + m_inputPortId = inputPortId; + m_outputNodeId = outputNodeId; + m_outputPortId = outputPortId; + } + + public override void ExecuteForward() + { + UIUtils.DeleteConnection( true, m_inputNodeId, m_inputPortId, false, true ); + } + + public override void ExecuteReverse() + { + UIUtils.ConnectInputToOutput( m_inputNodeId, m_inputPortId, m_outputNodeId, m_outputPortId ); + } + + public override string ToString() + { + return "Destroy Connection Node - Input Node: " + m_inputNodeId + " Input Port: " + m_inputPortId + " Output Node: " + m_outputNodeId + " Output Port: " + m_outputPortId; + } + } + + // Move connection + public class MoveInputConnectionActionData : ActionData + { + private int m_oldInputNodeId; + private int m_oldInputNodePortId; + + private int m_newInputNodeId; + private int m_newInputNodePortId; + + private int m_outputNodeId; + private int m_outputPortId; + + public MoveInputConnectionActionData( int oldInputNodeId, int oldInputPortId, int newInputNodeId, int newInputPortId, int outputNodeId, int outputPortId ) + { + m_oldInputNodeId = oldInputNodeId; + m_oldInputNodePortId = oldInputPortId; + + m_newInputNodeId = newInputNodeId; + m_newInputNodePortId = newInputPortId; + + m_outputNodeId = outputNodeId; + m_outputPortId = outputPortId; + } + + public override void ExecuteForward() + { + UIUtils.DeleteConnection( true, m_oldInputNodeId, m_oldInputNodePortId, false, true ); + UIUtils.ConnectInputToOutput( m_newInputNodeId, m_newInputNodePortId, m_outputNodeId, m_outputPortId ); + } + + public override void ExecuteReverse() + { + base.ExecuteReverse(); + UIUtils.DeleteConnection( true, m_newInputNodeId, m_newInputNodePortId, false, true ); + UIUtils.ConnectInputToOutput( m_oldInputNodeId, m_oldInputNodePortId, m_outputNodeId, m_outputPortId ); + } + + public override string ToString() + { + return "Move Input Connection Node - Old Input Node: " + m_oldInputNodeId + " Old Input Port: " + m_oldInputNodePortId + " New Input Node: " + m_newInputNodeId + " New Input Port: " + m_newInputNodePortId + " Output Node: " + m_outputNodeId + " Output Port: " + m_outputPortId; + } + } + + public class MoveOutputConnectionActionData : ActionData + { + private int m_inputNodeId; + private int m_inputPortId; + + private int m_newOutputNodeId; + private int m_newOutputPortId; + + private int m_oldOutputNodeId; + private int m_oldOutputPortId; + + public MoveOutputConnectionActionData( int inputNodeId, int inputPortId, int newOutputNodeId, int newOutputPortId, int oldOutputNodeId, int oldOutputPortId ) + { + m_inputNodeId = inputNodeId; + m_inputPortId = inputPortId; + + m_newOutputNodeId = newOutputNodeId; + m_newOutputPortId = newOutputPortId; + + m_oldOutputNodeId = oldOutputNodeId; + m_oldOutputPortId = oldOutputPortId; + } + + public override void ExecuteForward() + { + UIUtils.DeleteConnection( false, m_oldOutputNodeId, m_oldOutputNodeId, false, true ); + UIUtils.ConnectInputToOutput( m_inputNodeId, m_inputPortId, m_newOutputNodeId, m_newOutputPortId ); + } + + public override void ExecuteReverse() + { + base.ExecuteReverse(); + UIUtils.DeleteConnection( false, m_newOutputNodeId, m_newOutputPortId, false, true ); + UIUtils.ConnectInputToOutput( m_inputNodeId, m_inputPortId, m_oldOutputNodeId, m_oldOutputPortId ); + } + + public override string ToString() + { + return "Move Input Connection Node - Input Node: " + m_inputNodeId + " Input Port: " + m_inputPortId + " Old Output Node: " + m_oldOutputNodeId + " Old Output Port: " + m_oldOutputPortId + " New Output Node: " + m_newOutputNodeId + " New Output Port: " + m_newOutputPortId; + } + } + + public class CreateNewGraphActionData : ActionData + { + private string m_name; + + public CreateNewGraphActionData( string name ) + { + m_name = name; + } + + public override void ExecuteForward() + { + UIUtils.CreateNewGraph( m_name ); + } + } + + public class ChangeNodePropertiesActionData : ActionData + { + private string m_originalProperties; + private string m_newProperties; + private int m_nodeId; + + public ChangeNodePropertiesActionData( ParentNode node, string originalProperties ) + { + m_nodeId = node.UniqueId; + m_originalProperties = originalProperties; + + m_newProperties = string.Empty; + string trash = string.Empty; + node.WriteToString( ref m_newProperties, ref trash ); + } + + public ChangeNodePropertiesActionData( int nodeId, string originalProperties ) + { + m_nodeId = nodeId; + m_originalProperties = originalProperties; + + m_newProperties = string.Empty; + string trash = string.Empty; + UIUtils.GetNode( nodeId ).WriteToString( ref m_newProperties, ref trash ); + } + + public override void ExecuteForward() + { + string[] properties = m_newProperties.Split( IOUtils.FIELD_SEPARATOR ); + UIUtils.GetNode( m_nodeId ).ReadFromString( ref properties ); + } + + public override void ExecuteReverse() + { + string[] properties = m_originalProperties.Split( IOUtils.FIELD_SEPARATOR ); + UIUtils.GetNode( m_nodeId ).ReadFromString( ref properties ); + } + + public override string ToString() + { + return "Change Node Propertie - Node: " + m_nodeId + "\nOriginal Properties:\n" + m_originalProperties + "\nNew Properties:\n" + m_newProperties; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Actions/ActionData.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Actions/ActionData.cs.meta new file mode 100644 index 0000000..0c1b5d4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Actions/ActionData.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 29204f353101f46439a93f1c503d3197 +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Actions/ActionLog.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Actions/ActionLog.cs new file mode 100644 index 0000000..666c902 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Actions/ActionLog.cs @@ -0,0 +1,58 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + public class ActionLog + { + private int m_maxCount; + private int m_index; + private List m_sequence; + + public ActionLog(int maxCount) + { + m_maxCount = maxCount; + m_index = 0; + m_sequence = new List(); + } + + public void AddToLog(ActionData actionData) + { + if (m_sequence.Count > m_maxCount) + { + m_sequence.RemoveAt(0); + } + + m_sequence.Add(actionData); + m_index = m_sequence.Count - 1; + } + + + public void UndoLastAction() + { + if ( m_index > -1 && m_index < m_sequence.Count ) + m_sequence[m_index--].ExecuteReverse(); + } + + public void RedoLastAction() + { + if (m_index < (m_sequence.Count - 1)) + m_sequence[++m_index].ExecuteForward(); + + } + + public void ClearLog() + { + m_sequence.Clear(); + m_index = 0; + } + + public void Destroy() + { + m_sequence.Clear(); + m_sequence = null; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Actions/ActionLog.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Actions/ActionLog.cs.meta new file mode 100644 index 0000000..4547013 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Actions/ActionLog.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: bc089a69595d8994cb89946a919517c2 +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Actions/ActionSequence.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Actions/ActionSequence.cs new file mode 100644 index 0000000..c60480e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Actions/ActionSequence.cs @@ -0,0 +1,39 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System.Collections.Generic; +namespace AmplifyShaderEditor +{ + public class ActionSequence + { + private string m_name; + private List m_sequence; + + public ActionSequence( string name ) + { + m_name = name; + m_sequence = new List(); + } + + public void AddToSequence( ActionData actionData ) + { + m_sequence.Add( actionData ); + } + + public void Execute() + { + for ( int i = 0; i < m_sequence.Count; i++ ) + { + m_sequence[ i ].ExecuteForward(); + } + } + + public void Destroy() + { + m_sequence.Clear(); + m_sequence = null; + } + + public string Name { get { return m_name; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Actions/ActionSequence.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Actions/ActionSequence.cs.meta new file mode 100644 index 0000000..58a732b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Actions/ActionSequence.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 43bd963fa46ee9c4680dacff1d8dc0b9 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Constants.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Constants.cs new file mode 100644 index 0000000..c136c9c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Constants.cs @@ -0,0 +1,664 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + + public struct Constants + { + /*public readonly static string[] CustomASEStandardArgsMacros = + { + "#if defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC)//ASE Args Macros", + "#define ASE_TEXTURE2D_ARGS(textureName) Texture2D textureName, SamplerState sampler##textureName", + "#define ASE_TEXTURE3D_ARGS(textureName) Texture3D textureName, SamplerState sampler##textureName", + "#define ASE_TEXTURECUBE_ARGS(textureName) TextureCube textureName, SamplerState sampler##textureName", + "#define ASE_TEXTURE2D_PARAMS(textureName) textureName, sampler##textureName", + "#define ASE_TEXTURE3D_PARAMS(textureName) textureName, sampler##textureName", + "#define ASE_TEXTURECUBE_PARAMS(textureName) textureName, sampler##textureName", + "#define ASE_TEXTURE2D_ARRAY_PARAMS(textureName) textureName, sampler##textureName", + "#else//ASE Args Macros", + "#define ASE_TEXTURE2D_ARGS(textureName) sampler2D textureName", + "#define ASE_TEXTURE3D_ARGS(textureName) sampler3D textureName", + "#define ASE_TEXTURECUBE_ARGS(textureName) samplerCUBE textureName", + "#define ASE_TEXTURE2D_PARAMS(textureName) textureName", + "#define ASE_TEXTURE3D_PARAMS(textureName) textureName", + "#define ASE_TEXTURECUBE_PARAMS(textureName) textureName", + "#define ASE_TEXTURE2D_ARRAY_PARAMS(textureName) textureName", + "#endif//ASE Args Macros\n" + }; + + public readonly static string[] CustomASEDeclararionMacros = + { + "#define ASE_TEXTURE2D(textureName) {0}2D(textureName)", + "#define ASE_TEXTURE2D_ARRAY(textureName) {0}2D_ARRAY(textureName)", + "#define ASE_TEXTURE3D(textureName) {0}3D(textureName)", + "#define ASE_TEXTURECUBE(textureName) {0}CUBE(textureName)\n" + }; + + public readonly static string[] CustomASEStandarSamplingMacrosHelper = + { + "#if defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC)//ASE Sampling Macros", + "#else//ASE Sampling Macros", + "#endif//ASE Sampling Macros\n" + };*/ + + /*public readonly static string[] CustomASESamplingMacros = + { + "#define ASE_SAMPLE_TEXTURE2D(textureName,{0}coords) {1}2D{2}(textureName,{0}coords)", + "#define ASE_SAMPLE_TEXTURE2D_LOD(textureName, {0}coord2, lod) {1}2D{2}_LOD(textureName, {0}coord2, lod)", + "#define ASE_SAMPLE_TEXTURE2D_BIAS(textureName,{0}coord2, bias) {1}2D{2}_BIAS(textureName,{0}coord2, bias)", + "#define ASE_SAMPLE_TEXTURE2D_GRAD(textureName,{0}coord2, dpdx, dpdy) {1}2D{2}_GRAD(textureName,{0}coord2, dpdx, dpdy)", + + "#define ASE_SAMPLE_TEXTURE3D(textureName,{0}coord3) {1}3D{2}(textureName,{0}coord3)", + "#define ASE_SAMPLE_TEXTURE3D_LOD(textureName,{0}coord3, lod) {1}3D{2}_LOD(textureName,{0}coord3, lod)", + "#define ASE_SAMPLE_TEXTURE3D_BIAS(textureName,{0}coord3, bias) {1}3D{2}_BIAS(textureName,{0}coord3, bias)", + "#define ASE_SAMPLE_TEXTURE3D_GRAD(textureName,{0}coord3, dpdx, dpdy) {1}3D{2}_GRAD(textureName,{0}coord3, dpdx, dpdy)", + + "#define ASE_SAMPLE_TEXTURECUBE(textureName,{0}coord3) {1}CUBE{2}(textureName,{0}coord3)", + "#define ASE_SAMPLE_TEXTURECUBE_LOD(textureName,{0}coord3, lod) {1}CUBE{2}_LOD(textureName,{0}coord3, lod)", + "#define ASE_SAMPLE_TEXTURECUBE_BIAS(textureName,{0}coord3, bias) {1}CUBE{2}_BIAS(textureName,{0}coord3, bias)\n" + };*/ + + // SRP + /*public readonly static string[] CustomASESRPArgsMacros = + { + "#define ASE_TEXTURE2D_ARGS(textureName) TEXTURE2D(textureName), SAMPLER(textureName)", + "#define ASE_TEXTURE3D_ARGS(textureName) TEXTURE3D(textureName), SAMPLER(textureName)", + "#define ASE_TEXTURECUBE_ARGS(textureName) TEXTURECUBE(textureName), SAMPLER(textureName)", + "#define ASE_TEXTURE2D_PARAMS(textureName) textureName, sampler##textureName", + "#define ASE_TEXTURE3D_PARAMS(textureName) textureName, sampler##textureName", + "#define ASE_TEXTURECUBE_PARAMS(textureName) textureName, sampler##textureName", + "#define ASE_TEXTURE2D_ARRAY_PARAMS(textureName) textureName, sampler##textureName\n" + };*/ + + public readonly static List UnityNativeInspectors = new List + { + "Rendering.HighDefinition.LightingShaderGraphGUI", + "Rendering.HighDefinition.HDUnlitGUI", + "UnityEditor.Rendering.HighDefinition.HDLitGUI", + "UnityEditor.ShaderGraph.PBRMasterGUI", + "UnityEditor.Rendering.HighDefinition.DecalGUI", + "UnityEditor.Rendering.HighDefinition.FabricGUI", + "UnityEditor.Experimental.Rendering.HDPipeline.HDLitGUI", + "Rendering.HighDefinition.DecalGUI", + "Rendering.HighDefinition.LitShaderGraphGUI", + }; + + public readonly static Dictionary CustomInspectorHD7To10 = new Dictionary + { + { "UnityEditor.Rendering.HighDefinition.DecalGUI","Rendering.HighDefinition.DecalGUI"}, + { "UnityEditor.Rendering.HighDefinition.FabricGUI","Rendering.HighDefinition.LightingShaderGraphGUI"}, + { "UnityEditor.Rendering.HighDefinition.HDLitGUI","Rendering.HighDefinition.LitShaderGraphGUI"}, + { "UnityEditor.Experimental.Rendering.HDPipeline.HDLitGUI","Rendering.HighDefinition.LitShaderGraphGUI"}, + }; + + public readonly static string CustomASEStandardSamplerParams = "#define ASE_TEXTURE_PARAMS(textureName) textureName\n"; + public readonly static string[] CustomASESRPTextureArrayMacros = + { + "#define ASE_TEXTURE2D_ARRAY_ARGS(textureName) TEXTURE2D_ARRAY_ARGS(textureName,sampler##textureName)\n" , + "#define ASE_TEXTURE2D_ARRAY_PARAM(textureName) TEXTURE2D_ARRAY_PARAM(textureName,sampler##textureName)\n" , + "#define ASE_SAMPLE_TEXTURE2D_ARRAY(textureName, coord3) textureName.Sample(sampler##textureName, coord3)", + "#define ASE_SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, coord3, lod) textureName.SampleLevel(sampler##textureName, coord3, lod)" + }; + public readonly static string CustomASESRPSamplerParams = "#define ASE_TEXTURE_PARAMS(textureName) textureName, sampler##textureName\n"; + + public readonly static string[] CustomSRPSamplingMacros = + { + "#if defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (defined(SHADER_TARGET_SURFACE_ANALYSIS) && !defined(SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))//3D SRP MACROS", + "#define SAMPLE_TEXTURE3D_GRAD(textureName, samplerName, coord3, dpdx, dpdy) textureName.SampleGrad(samplerName, coord3, dpdx, dpdy)", + "#define SAMPLE_TEXTURE3D_BIAS(textureName, samplerName, coord3, bias) textureName.SampleBias(samplerName, coord3, bias)", + "#else//3D SRP MACROS", + "#define SAMPLE_TEXTURE3D_GRAD(textureName, samplerName, coord3, dpdx, dpdy) SAMPLE_TEXTURE3D(textureName, samplerName, coord3)", + "#define SAMPLE_TEXTURE3D_BIAS(textureName, samplerName, coord3, bias) SAMPLE_TEXTURE3D(textureName, samplerName, coord3)", + "#endif//3D SRP MACROS\n" + }; + + public readonly static Dictionary TexDeclarationSRPMacros = new Dictionary + { + { TextureType.Texture2D,"TEXTURE2D({0}); SAMPLER(sampler{0});"}, + { TextureType.Texture3D,"TEXTURE3D({0}); SAMPLER(sampler{0});"}, + { TextureType.Cube,"TEXTURECUBE({0}); SAMPLER(sampler{0});"}, + { TextureType.Texture2DArray,"TEXTURE2D_ARRAY({0}); SAMPLER(sampler{0});"}, + }; + + public readonly static Dictionary SamplerDeclarationSRPMacros = new Dictionary + { + { TextureType.Texture2D,"SAMPLER(sampler{0});"}, + { TextureType.Texture3D,"SAMPLER(sampler{0});"}, + { TextureType.Cube,"SAMPLER(sampler{0});"}, + { TextureType.Texture2DArray,"SAMPLER(sampler{0});"}, + }; + + public readonly static Dictionary TexDeclarationNoSamplerSRPMacros = new Dictionary + { + { TextureType.Texture2D,"TEXTURE2D({0})"}, + { TextureType.Texture3D,"TEXTURE3D({0})"}, + { TextureType.Cube,"TEXTURECUBE({0})"}, + { TextureType.Texture2DArray,"TEXTURE2D_ARRAY({0})"}, + }; + + public readonly static Dictionary TexSampleSRPMacros = new Dictionary + { + { TextureType.Texture2D,"SAMPLE_TEXTURE2D{0}( {1}, {2}, {3} )"}, + { TextureType.Texture3D,"SAMPLE_TEXTURE3D{0}( {1}, {2}, {3} )"}, + { TextureType.Cube,"SAMPLE_TEXTURECUBE{0}( {1}, {2}, {3} )"}, + { TextureType.Texture2DArray,"SAMPLE_TEXTURE2D_ARRAY{0}( {1}, {2}, {3} )"}, + }; + + public readonly static Dictionary TexParams = new Dictionary + { + { TextureType.Texture2D,"ASE_TEXTURE2D_PARAMS({0})"}, + { TextureType.Texture3D,"ASE_TEXTURE3D_PARAMS({0})"}, + { TextureType.Cube,"ASE_TEXTURECUBE_PARAMS({0})"}, + { TextureType.Texture2DArray,"ASE_TEXTURE2D_ARRAY_PARAMS({0})"}, + }; + + public readonly static Dictionary WireToTexture = new Dictionary + { + { WirePortDataType.SAMPLER1D,TextureType.Texture1D}, + { WirePortDataType.SAMPLER2D,TextureType.Texture2D}, + { WirePortDataType.SAMPLER3D,TextureType.Texture3D}, + { WirePortDataType.SAMPLERCUBE,TextureType.Cube}, + { WirePortDataType.SAMPLER2DARRAY,TextureType.Texture2DArray}, + }; + + public readonly static Dictionary TextureToWire = new Dictionary + { + { TextureType.Texture1D,WirePortDataType.SAMPLER1D}, + { TextureType.Texture2D,WirePortDataType.SAMPLER2D}, + { TextureType.Texture3D, WirePortDataType.SAMPLER3D}, + { TextureType.Cube,WirePortDataType.SAMPLERCUBE}, + { TextureType.Texture2DArray,WirePortDataType.SAMPLER2DARRAY}, + { TextureType.ProceduralTexture,WirePortDataType.SAMPLER2D}, + }; + + public readonly static string SamplingMacrosDirective = "#define ASE_USING_SAMPLING_MACROS 1"; + + // STANDARD + public readonly static string[] CustomASEStandarSamplingMacrosHelper = + { +#if UNITY_2018_1_OR_NEWER + "#if defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL) || (defined(SHADER_TARGET_SURFACE_ANALYSIS) && !defined(SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER))//ASE Sampler Macros", +#else + "#if defined(SHADER_API_D3D11) || defined(SHADER_API_XBOXONE) || defined(UNITY_COMPILER_HLSLCC) || defined(SHADER_API_PSSL)//ASE Sampler Macros", +#endif + "#else//ASE Sampling Macros", + "#endif//ASE Sampling Macros\n" + }; + + public readonly static string[] CustomASEArraySamplingMacrosRecent = + { + "#define UNITY_SAMPLE_TEX2DARRAY(tex,coord) tex.Sample(sampler##tex,coord)", + "#define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) tex.SampleLevel(sampler##tex,coord, lod)", + "#define UNITY_SAMPLE_TEX2DARRAY_BIAS(tex,coord,bias) tex.SampleBias(sampler##tex,coord,bias)", + "#define UNITY_SAMPLE_TEX2DARRAY_GRAD(tex,coord,ddx,ddy) tex.SampleGrad(sampler##tex,coord,ddx,ddy)", + }; + + public readonly static string[] CustomASEArraySamplingMacrosOlder = + { + "#define UNITY_SAMPLE_TEX2DARRAY(tex,coord) tex2DArray(tex,coord)", + "#define UNITY_SAMPLE_TEX2DARRAY_LOD(tex,coord,lod) tex2DArraylod(tex, float4(coord,lod))", + "#define UNITY_SAMPLE_TEX2DARRAY_BIAS(tex,coord,bias) tex2DArray(tex,coord)", + "#define UNITY_SAMPLE_TEX2DARRAY_GRAD(tex,coord,ddx,ddy) tex2DArray(tex,coord)", + }; + + public readonly static string[] CustomASEStandarSamplingMacrosRecent = + { + "#define SAMPLE_TEXTURE2D(tex,samplerTex,coord) tex.Sample(samplerTex,coord)", + "#define SAMPLE_TEXTURE2D_LOD(tex,samplerTex,coord,lod) tex.SampleLevel(samplerTex,coord, lod)", + "#define SAMPLE_TEXTURE2D_BIAS(tex,samplerTex,coord,bias) tex.SampleBias(samplerTex,coord,bias)", + "#define SAMPLE_TEXTURE2D_GRAD(tex,samplerTex,coord,ddx,ddy) tex.SampleGrad(samplerTex,coord,ddx,ddy)", + + "#define SAMPLE_TEXTURE3D(tex,samplerTex,coord) tex.Sample(samplerTex,coord)", + "#define SAMPLE_TEXTURE3D_LOD(tex,samplerTex,coord,lod) tex.SampleLevel(samplerTex,coord, lod)", + "#define SAMPLE_TEXTURE3D_BIAS(tex,samplerTex,coord,bias) tex.SampleBias(samplerTex,coord,bias)", + "#define SAMPLE_TEXTURE3D_GRAD(tex,samplerTex,coord,ddx,ddy) tex.SampleGrad(samplerTex,coord,ddx,ddy)", + + "#define SAMPLE_TEXTURECUBE(tex,samplerTex,coord) tex.Sample(samplerTex,coord)", + "#define SAMPLE_TEXTURECUBE_LOD(tex,samplerTex,coord,lod) tex.SampleLevel(samplerTex,coord, lod)", + "#define SAMPLE_TEXTURECUBE_BIAS(tex,samplerTex,coord,bias) tex.SampleBias(samplerTex,coord,bias)", + "#define SAMPLE_TEXTURECUBE_GRAD(tex,samplerTex,coord,ddx,ddy) tex.SampleGrad(samplerTex,coord,ddx,ddy)", + + "#define SAMPLE_TEXTURE2D_ARRAY(tex,samplerTex,coord) tex.Sample(samplerTex,coord)", + "#define SAMPLE_TEXTURE2D_ARRAY_LOD(tex,samplerTex,coord,lod) tex.SampleLevel(samplerTex,coord, lod)", + "#define SAMPLE_TEXTURE2D_ARRAY_BIAS(tex,samplerTex,coord,bias) tex.SampleBias(samplerTex,coord,bias)", + "#define SAMPLE_TEXTURE2D_ARRAY_GRAD(tex,samplerTex,coord,ddx,ddy) tex.SampleGrad(samplerTex,coord,ddx,ddy)", + }; + + public readonly static string[] CustomASEStandarSamplingMacrosOlder = + { + "#define SAMPLE_TEXTURE2D(tex,samplerTex,coord) tex2D(tex,coord)", + "#define SAMPLE_TEXTURE2D_LOD(tex,samplerTex,coord,lod) tex2Dlod(tex,float4(coord,0,lod))", + "#define SAMPLE_TEXTURE2D_BIAS(tex,samplerTex,coord,bias) tex2Dbias(tex,float4(coord,0,bias))", + "#define SAMPLE_TEXTURE2D_GRAD(tex,samplerTex,coord,ddx,ddy) tex2Dgrad(tex,coord,ddx,ddy)", + + "#define SAMPLE_TEXTURE3D(tex,samplerTex,coord) tex3D(tex,coord)", + "#define SAMPLE_TEXTURE3D_LOD(tex,samplerTex,coord,lod) tex3Dlod(tex,float4(coord,lod))", + "#define SAMPLE_TEXTURE3D_BIAS(tex,samplerTex,coord,bias) tex3D(tex,coord)", + "#define SAMPLE_TEXTURE3D_GRAD(tex,samplerTex,coord,ddx,ddy) tex3D(tex,coord)", + + "#define SAMPLE_TEXTURECUBE(tex,samplertex,coord) texCUBE(tex,coord)", + "#define SAMPLE_TEXTURECUBE_LOD(tex,samplertex,coord,lod) texCUBElod (tex,half4(coord,lod))", + "#define SAMPLE_TEXTURECUBE_BIAS(tex,samplertex,coord,bias) texCUBE(tex,coord)", + "#define SAMPLE_TEXTURECUBE_GRAD(tex,samplertex,coord,ddx,ddy) texCUBE(tex,coord)", + + "#define SAMPLE_TEXTURE2D_ARRAY(tex,samplertex,coord) tex2DArray(tex,coord)", + "#define SAMPLE_TEXTURE2D_ARRAY_LOD(tex,samplertex,coord,lod) tex2DArraylod(tex, float4(coord,lod))", + "#define SAMPLE_TEXTURE2D_ARRAY_BIAS(tex,samplerTex,coord,bias) tex2DArray(tex,coord)", + "#define SAMPLE_TEXTURE2D_ARRAY_GRAD(tex,samplerTex,coord,ddx,ddy) tex2DArray(tex,coord)", + }; + + public readonly static string[] CustomArraySamplingMacros = + { + "#if defined(UNITY_COMPILER_HLSL2GLSL) || defined(SHADER_TARGET_SURFACE_ANALYSIS)//ASE Array Sampler Macros", + "#define ASE_SAMPLE_TEX2DARRAY_GRAD(tex,coord,dx,dy) UNITY_SAMPLE_TEX2DARRAY (tex,coord)", + "#else//ASE Array Sampler Macros", + "#define ASE_SAMPLE_TEX2DARRAY_GRAD(tex,coord,dx,dy) tex.SampleGrad (sampler##tex,coord,dx,dy)", + "#endif//ASE Array Sampler Macros\n" + }; + + public readonly static Dictionary TexDeclarationStandardMacros = new Dictionary + { + { TextureType.Texture2D,"UNITY_DECLARE_TEX2D({0});"}, + { TextureType.Texture3D,"UNITY_DECLARE_TEX3D({0});"}, + { TextureType.Cube,"UNITY_DECLARE_TEXCUBE({0});"}, + { TextureType.Texture2DArray,"UNITY_DECLARE_TEX2DARRAY({0});"} + }; + + public readonly static Dictionary TexDeclarationNoSamplerStandardMacros = new Dictionary + { + { TextureType.Texture2D,"UNITY_DECLARE_TEX2D_NOSAMPLER({0})"}, + { TextureType.Texture3D,"UNITY_DECLARE_TEX3D_NOSAMPLER({0})"}, + { TextureType.Cube,"UNITY_DECLARE_TEXCUBE_NOSAMPLER({0})"}, + { TextureType.Texture2DArray,"UNITY_DECLARE_TEX2DARRAY_NOSAMPLER({0})"} + }; + + public readonly static Dictionary TexSampleStandardMacros = new Dictionary + { + { TextureType.Texture2D,"UNITY_SAMPLE_TEX2D{0}( {1}, {3} )"}, + { TextureType.Texture3D,"UNITY_SAMPLE_TEX3D{0}( {1}, {3} )"}, + { TextureType.Cube,"UNITY_SAMPLE_TEXCUBE{0}( {1}, {3} )"}, + { TextureType.Texture2DArray,"UNITY_SAMPLE_TEX2DARRAY{0}( {1}, {3} )"} + }; + + public readonly static Dictionary TexSampleSamplerStandardMacros = new Dictionary + { + { TextureType.Texture2D,"SAMPLE_TEXTURE2D{0}( {1}, {2}, {3} )"}, + { TextureType.Texture3D,"SAMPLE_TEXTURE3D{0}( {1}, {2}, {3} )"}, + { TextureType.Cube,"SAMPLE_TEXTURECUBE{0}( {1}, {2}, {3} )"}, + { TextureType.Texture2DArray,"SAMPLE_TEXTURE2D_ARRAY{0}( {1}, {2}, {3} )"} + }; + + public readonly static Dictionary TexSampleStandard = new Dictionary + { + { TextureType.Texture2D,"tex2D{0}( {1}, {2} )"}, + { TextureType.Texture3D,"tex3D{0}( {1}, {2} )"}, + { TextureType.Cube,"texCUBE{0}( {1}, {2} )"}, + { TextureType.Texture2DArray,"tex2DArray{0}( {1}, {2} )"} + }; + public readonly static char LineFeedSeparator = '$'; + public readonly static char SemiColonSeparator = '@'; + public readonly static string AppDataFullName = "appdata_full"; + public readonly static string CustomAppDataFullName = "appdata_full_custom"; + public readonly static string CustomAppDataFullBody = + "\n\t\tstruct appdata_full_custom\n" + + "\t\t{\n" + + "\t\t\tfloat4 vertex : POSITION;\n" + + "\t\t\tfloat4 tangent : TANGENT;\n" + + "\t\t\tfloat3 normal : NORMAL;\n" + + "\t\t\tfloat4 texcoord : TEXCOORD0;\n" + + "\t\t\tfloat4 texcoord1 : TEXCOORD1;\n" + + "\t\t\tfloat4 texcoord2 : TEXCOORD2;\n" + + "\t\t\tfloat4 texcoord3 : TEXCOORD3;\n" + + "\t\t\tfixed4 color : COLOR;\n" + + "\t\t\tUNITY_VERTEX_INPUT_INSTANCE_ID\n"; + + public readonly static string IncludeFormat = "#include \"{0}\""; + public readonly static string PragmaFormat = "#pragma {0}"; + public readonly static string DefineFormat = "#define {0}"; + + public readonly static string RenderTypeHelperStr = "RenderType"; + public readonly static string RenderQueueHelperStr = "Queue"; + public readonly static string DisableBatchingHelperStr = "DisableBatching"; + + public readonly static string DefaultShaderName = "New Amplify Shader"; + + public readonly static string UndoReplaceMasterNodeId = "Replacing Master Node"; + public readonly static string UnityLightingLib = "Lighting.cginc"; + public readonly static string UnityAutoLightLib = "AutoLight.cginc"; + public readonly static string UnityBRDFLib = "UnityStandardBRDF.cginc"; + public readonly static string LocalValueDecWithoutIdent = "{0} {1} = {2};"; + public readonly static string CustomTypeLocalValueDecWithoutIdent = "{0} {1} =({0}){2};"; + public readonly static string LocalValueDefWithoutIdent = "{0} {1} {2};"; + public readonly static string TilingOffsetFormat = "{0} * {1} + {2}"; + public static string InvalidPostProcessDatapath = "__DELETED_GUID_Trash"; + //TEMPLATES + + public static float PlusMinusButtonLayoutWidth = 15; + + public static float NodeButtonSizeX = 16; + public static float NodeButtonSizeY = 16; + public static float NodeButtonDeltaX = 5; + public static float NodeButtonDeltaY = 11; + + public readonly static string SafeNormalizeInfoStr = "With Safe Normalize division by 0 is prevented over the normalize operation at the expense of additional instructions on shader."; + public readonly static string ReservedPropertyNameStr = "Property name '{0}' is reserved and cannot be used"; + public readonly static string NumericPropertyNameStr = "Property name '{0}' is numeric thus cannot be used"; + public readonly static string DeprecatedMessageStr = "Node '{0}' is deprecated. Use node '{1}' instead."; + public readonly static string DeprecatedNoAlternativeMessageStr = "Node '{0}' is deprecated and should be removed."; + public readonly static string UndoChangePropertyTypeNodesId = "Changing Property Types"; + public readonly static string UndoChangeTypeNodesId = "Changing Nodes Types"; + public readonly static string UndoMoveNodesId = "Moving Nodes"; + public readonly static string UndoRegisterFullGrapId = "Register Graph"; + public readonly static string UndoAddNodeToCommentaryId = "Add node to Commentary"; + public readonly static string UndoRemoveNodeFromCommentaryId = "Remove node from Commentary"; + public readonly static string UndoCreateDynamicPortId = "Create Dynamic Port"; + public readonly static string UndoDeleteDynamicPortId = "Destroy Dynamic Port"; + public readonly static string UndoRegisterNodeId = "Register Object"; + public readonly static string UndoUnregisterNodeId = "Unregister Object"; + public readonly static string UndoCreateNodeId = "Create Object"; + public readonly static string UndoPasteNodeId = "Paste Object"; + public readonly static string UndoDeleteNodeId = "Destroy Object"; + public readonly static string UndoDeleteConnectionId = "Destroy Connection"; + public readonly static string UndoCreateConnectionId = "Create Connection"; + + public readonly static float MenuDragSpeed = -0.5f; + public readonly static string DefaultCustomInspector = "ASEMaterialInspector"; + public readonly static string ReferenceTypeStr = "Mode"; + public readonly static string AvailableReferenceStr = "Reference"; + public readonly static string InstancePostfixStr = " (Reference) "; + + public readonly static string ASEMenuName = "Amplify Shader"; + + public readonly static string LodCrossFadeOption2017 = "dithercrossfade"; + + public readonly static string UnityShaderVariables = "UnityShaderVariables.cginc"; + public readonly static string UnityCgLibFuncs = "UnityCG.cginc"; + public readonly static string UnityStandardUtilsLibFuncs = "UnityStandardUtils.cginc"; + public readonly static string UnityPBSLightingLib = "UnityPBSLighting.cginc"; + public readonly static string UnityDeferredLightLib = "UnityDeferredLibrary.cginc"; + public readonly static string ATSharedLibGUID = "ba242738c4be3324aa88d126f7cc19f9"; +#if UNITY_5_6_OR_NEWER + public readonly static string CameraDepthTextureValue = "UNITY_DECLARE_DEPTH_TEXTURE( _CameraDepthTexture );"; + +#else + public readonly static string CameraDepthTextureValue = "uniform sampler2D _CameraDepthTexture;"; +#endif + //public readonly static string CameraDepthTextureSRPVar = "TEXTURE2D(_CameraDepthTexture);"; + //public readonly static string CameraDepthTextureSRPSampler = "SAMPLER(sampler_CameraDepthTexture);"; + public readonly static string CameraDepthTextureLWEnabler = "REQUIRE_DEPTH_TEXTURE 1"; + + public readonly static string CameraDepthTextureTexelSize = "uniform float4 _CameraDepthTexture_TexelSize;"; + public readonly static string InstanceIdMacro = "UNITY_VERTEX_INPUT_INSTANCE_ID"; + public readonly static string InstanceIdVariable = "UNITY_GET_INSTANCE_ID({0})"; + + + public readonly static string HelpURL = "http://wiki.amplify.pt/index.php?title=Unity_Products:Amplify_Shader_Editor"; + //public readonly static string NodeCommonUrl = "http://wiki.amplify.pt/index.php?title=Unity_Products:Amplify_Shader_Editor/Nodes#"; + //public readonly static string CommunityNodeCommonUrl = "http://wiki.amplify.pt/index.php?title=Unity_Products:Amplify_Shader_Editor/Community_Nodes#"; + public readonly static string NodeCommonUrl = "http://wiki.amplify.pt/index.php?title=Unity_Products:Amplify_Shader_Editor/"; + public readonly static string CommunityNodeCommonUrl = "http://wiki.amplify.pt/index.php?title=Unity_Products:Amplify_Shader_Editor/"; + public readonly static Color InfiniteLoopColor = Color.red; + + public readonly static Color DefaultCategoryColor = new Color( 0.26f, 0.35f, 0.44f, 1.0f ); + public readonly static Color NodeBodyColor = new Color( 1f, 1f, 1f, 1.0f ); + + public readonly static Color ModeTextColor = new Color( 1f, 1f, 1f, 0.25f ); + public readonly static Color ModeIconColor = new Color( 1f, 1f, 1f, 0.75f ); + + public readonly static Color PortTextColor = new Color( 1f, 1f, 1f, 0.5f ); + public readonly static Color PortLockedTextColor = new Color( 1f, 1f, 1f, 0.35f ); + public readonly static Color BoxSelectionColor = new Color( 0.5f, 0.75f, 1f, 0.33f ); + public readonly static Color SpecialRegisterLocalVarSelectionColor = new Color( 0.27f, 0.52f, 1.0f, 1f ); + public readonly static Color SpecialGetLocalVarSelectionColor = new Color( 0.2f, 0.8f, 0.4f, 1f ); + public readonly static Color NodeSelectedColor = new Color( 0.85f, 0.56f, 0f, 1f ); + public readonly static Color NodeDefaultColor = new Color( 1f, 1f, 1f, 1f ); + public readonly static Color NodeConnectedColor = new Color( 1.0f, 1f, 0.0f, 1f ); + public readonly static Color NodeErrorColor = new Color( 1f, 0.5f, 0.5f, 1f ); + public readonly static string NoSpecifiedCategoryStr = ""; + + public readonly static int MINIMIZE_WINDOW_LOCK_SIZE = 630; + + public readonly static int FoldoutMouseId = 0; // Left Mouse Button + + public readonly static float SNAP_SQR_DIST = 200f; + public readonly static int INVALID_NODE_ID = -1; + public readonly static float WIRE_WIDTH = 7f; + public readonly static float WIRE_CONTROL_POINT_DIST = 0.7f; + public readonly static float WIRE_CONTROL_POINT_DIST_INV = 1.7f; + + public readonly static float IconsLeftRightMargin = 5f; + public readonly static float PropertyPickerWidth = 16f; + public readonly static float PropertyPickerHeight = 16f; + public readonly static float PreviewExpanderWidth = 16f; + public readonly static float PreviewExpanderHeight = 16f; + public readonly static float TextFieldFontSize = 11f; + public readonly static float DefaultFontSize = 15f; + public readonly static float DefaultTitleFontSize = 13f; + public readonly static float PropertiesTitleFontSize = 11f; + public readonly static float MessageFontSize = 40f; + public readonly static float SelectedObjectFontSize = 30f; + + public readonly static float PORT_X_ADJUST = 10; + public readonly static float PORT_INITIAL_X = 10; + + public readonly static float PORT_INITIAL_Y = 40; + public readonly static float INPUT_PORT_DELTA_Y = 5; + public readonly static float PORT_TO_LABEL_SPACE_X = 5; + + public readonly static float NODE_HEADER_HEIGHT = 32; + public readonly static float NODE_HEADER_EXTRA_HEIGHT = 5; + public readonly static float NODE_HEADER_LEFTRIGHT_MARGIN = 10; + + public readonly static float MULTIPLE_SELECION_BOX_ALPHA = 0.5f; + public readonly static float RMB_CLICK_DELTA_TIME = 0.1f; + public readonly static float RMB_SCREEN_DIST = 10f; + + public readonly static float CAMERA_MAX_ZOOM = 2f; + public readonly static float CAMERA_MIN_ZOOM = 1f; + public readonly static float CAMERA_ZOOM_SPEED = 0.1f; + public readonly static float ALT_CAMERA_ZOOM_SPEED = -0.05f; + + public readonly static object INVALID_VALUE = null; + + public readonly static float HORIZONTAL_TANGENT_SIZE = 100f; + public readonly static float OUTSIDE_WIRE_MARGIN = 5f; + + public readonly static string SubTitleNameFormatStr = "Name( {0} )"; + public readonly static string SubTitleSpaceFormatStr = "Space( {0} )"; + public readonly static string SubTitleTypeFormatStr = "Type( {0} )"; + public readonly static string SubTitleValueFormatStr = "Value( {0} )"; + public readonly static string SubTitleConstFormatStr = "Const( {0} )"; + public readonly static string SubTitleVarNameFormatStr = "Var( {0} )"; + public readonly static string SubTitleRefNameFormatStr = "Ref( {0} )"; + + public readonly static string CodeWrapper = "( {0} )"; + public readonly static string InlineCodeWrapper = "{{\n{0}\n}}"; + + public readonly static string NodesDumpFormat = "{0}:,{1},{2}\n"; + public readonly static string TagFormat = " \"{0}\" = \"{1}\""; + + public readonly static string LocalVarIdentation = "\t\t\t"; + public readonly static string SimpleLocalValueDec = LocalVarIdentation + "{0} {1};\n"; + + public readonly static string LocalValueDec = LocalVarIdentation + LocalValueDecWithoutIdent + '\n'; + public readonly static string LocalValueDef = LocalVarIdentation + "{0} = {1};\n"; + public readonly static string CastHelper = "({0}).{1}"; + public readonly static string PropertyLocalVarDec = "{0} {1} = {0}({2});"; + public readonly static string[] UniformDec = { "uniform {0} {1};", "{0} {1};" }; + + public readonly static string PropertyValueLabel = "Value( {0} )"; + public readonly static string ConstantsValueLabel = "Const( {0} )"; + + public readonly static string PropertyFloatFormatLabel = "0.###"; + public readonly static string PropertyBigFloatFormatLabel = "0.###e+0"; + + public readonly static string PropertyIntFormatLabel = "0"; + public readonly static string PropertyBigIntFormatLabel = "0e+0"; + + + public readonly static string PropertyVectorFormatLabel = "0.##"; + public readonly static string PropertyBigVectorFormatLabel = "0.##e+0"; + + + public readonly static string PropertyMatrixFormatLabel = "0.#"; + public readonly static string PropertyBigMatrixFormatLabel = "0.#e+0"; + + public readonly static string NoPropertiesLabel = "No assigned properties"; + + public readonly static string ValueLabel = "Value"; + public readonly static string DefaultValueLabel = "Default Value"; + public readonly static string MaterialValueLabel = "Material Value"; + public readonly static GUIContent DefaultValueLabelContent = new GUIContent( "Default Value" ); + public readonly static GUIContent MaterialValueLabelContent = new GUIContent( "Material Value" ); + + public readonly static string InputVarStr = "i";//"input"; + public readonly static string OutputVarStr = "o";//"output"; + + public readonly static string CustomLightOutputVarStr = "s"; + public readonly static string CustomLightStructStr = "Custom"; + + public readonly static string VertexShaderOutputStr = "o"; + public readonly static string VertexShaderInputStr = "v";//"vertexData"; + public readonly static string VertexDataFunc = "vertexDataFunc"; + + public readonly static string VirtualCoordNameStr = "vcoord"; + + public readonly static string VertexVecNameStr = "vertexVec"; + public readonly static string VertexVecDecStr = "float3 " + VertexVecNameStr; + public readonly static string VertexVecVertStr = VertexShaderOutputStr + "." + VertexVecNameStr; + + public readonly static string NormalVecNameStr = "normalVec"; + public readonly static string NormalVecDecStr = "float3 " + NormalVecNameStr; + public readonly static string NormalVecFragStr = InputVarStr + "." + NormalVecNameStr; + public readonly static string NormalVecVertStr = VertexShaderOutputStr + "." + NormalVecNameStr; + + + public readonly static string IncidentVecNameStr = "incidentVec"; + public readonly static string IncidentVecDecStr = "float3 " + IncidentVecNameStr; + public readonly static string IncidentVecDefStr = VertexShaderOutputStr + "." + IncidentVecNameStr + " = normalize( " + VertexVecNameStr + " - _WorldSpaceCameraPos.xyz)"; + public readonly static string IncidentVecFragStr = InputVarStr + "." + IncidentVecNameStr; + public readonly static string IncidentVecVertStr = VertexShaderOutputStr + "." + IncidentVecNameStr; + public readonly static string WorldNormalLocalDecStr = "WorldNormalVector( " + Constants.InputVarStr + " , {0}( 0,0,1 ))"; + + public readonly static string VFaceVariable = "ASEVFace"; + public readonly static string VFaceInput = "half ASEVFace : VFACE"; + + public readonly static string ColorVariable = "vertexColor"; + public readonly static string ColorInput = "float4 vertexColor : COLOR"; + + public readonly static string NoStringValue = "None"; + public readonly static string EmptyPortValue = " "; + + public readonly static string[] OverallInvalidChars = { "\r", "\n", "\\", " ", ".", ">", ",", "<", "\'", "\"", ";", ":", "[", "{", "]", "}", "=", "+", "`", "~", "/", "?", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "-" }; + public readonly static string[] ShaderInvalidChars = { "\r", "\n", "\\", "\'", "\"", }; + public readonly static string[] EnumInvalidChars = { "\r", "\n", "\\", ".", ">", ",", "<", "\'", "\"", ";", ":", "[", "{", "]", "}", "=", "+", "`", "~", "/", "?", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "-" }; + public readonly static string[] AttrInvalidChars = { "\r", "\n", "\\", ">", "<", "\'", "\"", ";", ":", "[", "{", "]", "}", "=", "+", "`", "~", "/", "?", "!", "@", "#", "$", "%", "^", "&", "*" }; + public readonly static string[] HeaderInvalidChars = { "\r", "\n", "\\", ">", ",", "<", "\'", "\"", ";", ":", "[", "{", "]", "}", "=", "+", "`", "~", "/", "?", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "-" }; + + public readonly static string[] WikiInvalidChars = { "#", "<", ">", "[", "]", "|", "{", "}", "%", "+", "?", "\\", "/", ",", ";", "." }; + + public readonly static string[,] UrlReplacementStringValues = + { + { " = ", "Equals" }, + { " == ", "Equals" }, + { " != ", "NotEqual" }, + { " \u2260 ", "NotEqual" }, + { " > ", "Greater" }, + { " \u2265 " , "GreaterOrEqual" }, + { " >= ", "GreaterOrEqual" }, + { " < ", "Less" }, + { " \u2264 ", "LessOrEqual" }, + { " <= ", "LessOrEqual" }, + { " ", "_" }, + { "[", string.Empty }, + { "]", string.Empty } + }; + + public readonly static int UrlReplacementStringValuesLen = UrlReplacementStringValues.Length / 2; + + public readonly static string[,] ReplacementStringValues = + { + { " = ", "Equals" }, + { " == ", "Equals" }, + { " != ", "NotEqual" }, + { " \u2260 ", "NotEqual" }, + { " > ", "Greater" }, + { " \u2265 ", "GreaterOrEqual" }, + { " >= ", "GreaterOrEqual" }, + { " < ", "Less" }, + { " \u2264 ", "LessOrEqual" }, + { " <= ", "LessOrEqual" } + }; + public readonly static int ReplacementStringValuesLen = ReplacementStringValues.Length / 2; + + public readonly static string InternalData = "INTERNAL_DATA"; + + + + public readonly static string NoMaterialStr = "None"; + + public readonly static string OptionalParametersSep = " "; + + public readonly static string NodeUndoId = "NODE_UNDO_ID"; + public readonly static string NodeCreateUndoId = "NODE_CREATE_UNDO_ID"; + public readonly static string NodeDestroyUndoId = "NODE_DESTROY_UNDO_ID"; + + // Custom node tags + //[InPortBegin:Id:Type:Name:InPortEnd] + public readonly static string CNIP = "#IP"; + + public readonly static float FLOAT_DRAW_HEIGHT_FIELD_SIZE = 16f; + public readonly static float FLOAT_DRAW_WIDTH_FIELD_SIZE = 45f; + public readonly static float FLOAT_WIDTH_SPACING = 3f; + + public readonly static Color LockedPortColor = new Color( 0.3f, 0.3f, 0.3f, 0.5f ); + +#if UNITY_2018_2_OR_NEWER + public readonly static int[] AvailableUVChannels = { 0, 1, 2, 3, 4, 5, 6, 7 }; + public readonly static string[] AvailableUVChannelsStr = { "0", "1", "2", "3", "4", "5", "6", "7"}; + public readonly static string AvailableUVChannelLabel = "UV Channel"; + + public readonly static int[] AvailableUVSets = { 0, 1, 2, 3, 4, 5, 6, 7 }; + public readonly static string[] AvailableUVSetsStr = { "1", "2", "3", "4","5", "6", "7", "8" }; + public readonly static string AvailableUVSetsLabel = "UV Set"; +#else + public readonly static int[] AvailableUVChannels = { 0, 1, 2, 3 }; + public readonly static string[] AvailableUVChannelsStr = { "0", "1", "2", "3" }; + public readonly static string AvailableUVChannelLabel = "UV Channel"; + + public readonly static int[] AvailableUVSets = { 0, 1, 2, 3 }; + public readonly static string[] AvailableUVSetsStr = { "1", "2", "3", "4" }; + public readonly static string AvailableUVSetsLabel = "UV Set"; +#endif + + public readonly static int[] AvailableUVSizes = { 2, 3, 4 }; + public readonly static string[] AvailableUVSizesStr = { "Float 2", "Float 3", "Float 4" }; + public readonly static string AvailableUVSizesLabel = "Coord Size"; + + + public readonly static string LineSeparator = "________________________________"; + + public readonly static Vector2 CopyPasteDeltaPos = new Vector2( 40, 40 ); + + public readonly static string[] VectorSuffixes = { ".x", ".y", ".z", ".w" }; + public readonly static string[] ColorSuffixes = { ".r", ".g", ".b", ".a" }; + + + public const string InternalDataLabelStr = "Internal Data"; + public const string AttributesLaberStr = "Attributes"; + public const string ParameterLabelStr = "Parameters"; + + public static readonly string[] ReferenceArrayLabels = { "Object", "Reference" }; + + public static readonly string[] ChannelNamesVector = { "X", "Y", "Z", "W" }; + public static readonly string[] ChannelNamesColor = { "R", "G", "B", "A" }; + + public static readonly string SamplerFormat = "sampler{0}"; + public static readonly string SamplerDeclFormat = "SamplerState {0}"; + public static readonly string SamplerDeclSRPFormat = "SAMPLER({0})"; + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Constants.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Constants.cs.meta new file mode 100644 index 0000000..59d7bad --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Constants.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d833dd0968f913f449477da6bcd56b48 +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers.meta new file mode 100644 index 0000000..a217729 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2206c4bd7f3d18643a6a3452b0c070d1 +folderAsset: yes +timeCreated: 1522769470 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/ASEBeginDecorator.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/ASEBeginDecorator.cs new file mode 100644 index 0000000..6a82186 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/ASEBeginDecorator.cs @@ -0,0 +1,32 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; +using AmplifyShaderEditor; + +public class ASEBeginDecorator : MaterialPropertyDrawer +{ + const int Separator = 2; + public override void OnGUI( Rect position, MaterialProperty prop, String label, MaterialEditor editor ) + { + Rect button = position; + button.height = EditorGUIUtility.singleLineHeight; + + if( GUI.Button( button, "Open in Shader Editor" ) ) + { + Material mat = editor.target as Material; +#if UNITY_2018_3_OR_NEWER + ASEPackageManagerHelper.SetupLateMaterial( mat ); +#else + AmplifyShaderEditorWindow.LoadMaterialToASE( mat ); +#endif + } + } + + public override float GetPropertyHeight( MaterialProperty prop, string label, MaterialEditor editor ) + { + return EditorGUIUtility.singleLineHeight + Separator; + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/ASEBeginDecorator.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/ASEBeginDecorator.cs.meta new file mode 100644 index 0000000..007b33e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/ASEBeginDecorator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 508788a7fa76e1d42ad5fdfb1c941ed2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/ASEEndDecorator.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/ASEEndDecorator.cs new file mode 100644 index 0000000..718b074 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/ASEEndDecorator.cs @@ -0,0 +1,36 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; +using AmplifyShaderEditor; + +public class ASEEndDecorator : MaterialPropertyDrawer +{ + bool m_applyNext = false; + + public override void OnGUI( Rect position, MaterialProperty prop, String label, MaterialEditor editor ) + { + if( prop.applyPropertyCallback == null ) + prop.applyPropertyCallback = Testc; + + if( GUI.changed || m_applyNext ) + { + m_applyNext = false; + Material mat = editor.target as Material; + UIUtils.CopyValuesFromMaterial( mat ); + } + } + + bool Testc( MaterialProperty prop, int changeMask, object previousValue ) + { + m_applyNext = true; + return false; + } + + public override float GetPropertyHeight( MaterialProperty prop, string label, MaterialEditor editor ) + { + return 0; + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/ASEEndDecorator.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/ASEEndDecorator.cs.meta new file mode 100644 index 0000000..cfe07a1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/ASEEndDecorator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fdf2e52babbbbf040b3b9f6df50243f3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/EditableIf.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/EditableIf.cs new file mode 100644 index 0000000..e94e02e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/EditableIf.cs @@ -0,0 +1,294 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +// +// Donated by BinaryCats +// https://forum.unity.com/threads/best-tool-asset-store-award-amplify-shader-editor-node-based-shader-creation-tool.430959/page-60#post-3414465 +////////////////////// +// README / HOW TO USE +////////////////////// +// Examples: +// +// Floats: +// +// x Equals value +// EditableIf( _float1, Equalto, 1) +// This will allow the value to be edited, if the property _float1 is equal to 1. (_float1==1) +// Note: NotEqualTo is also a valid argument which will do the opposite of this example.EditableIf(_float1, NotEqualTo, 1) (NotEqualTo != 1) +// +// x Greater than value +// EditableIf(_Float1,GreaterThan,1) +// This will allow the value to be edited if the property _float1 is Greater than 1. (_float1>1) +// +// x Greater Than Or Equal to value +// EditableIf(_Float1,GreaterThanOrEqualTo,1) +// This will allow the value to be edited if the property _float1 is Greater than or equal to 1. (_float1>=1) +// +// +// x Less Than value +// EditableIf(_Float1,LessThan,1) +// This will allow the value to be edited if the property _float1 is Less than 1. (_float1<1) +// +// x Less Than Or Equal to value +// EditableIf(_Float1,LessThanOrEqualTo,1) +// This will allow the value to be edited if the property _float1 is Less than or equal to 1. (_float1<=1) +// +// +// Colour: +// +// x Equals r,g,b,a +// EditableIf(_Color0,EqualTo,255,255,255,255) +// This will allow the value to be edited, if the property _Color0 R,G,B and A value all Equal 255. (_Color0.R==255 && _Color0.G==255 & _Color0.B == 255 && _Color0.A == 255) +// +// x Equals alpha +// EditableIf(_Color0,EqualTo,null,null,null,255) +// This will allow the value to be edited, if the property _Color0 Alpha value is Equal to 255. (_Color0.A == 255) +// +// a Greater than blue +// EditableIf(_Color0,GreaterThan,null,null,125) +// This will allow the value to be edited, if the property _Color0 Blue value is Greater Than 125. (_Color0.B > 125) +// Note: as I do not want to check the Red or Green Values, i have entered "null" for the parameter +// Note: I have not inputted a value to check for Alpha, as i do not want to check it. Simularly, if I wanted to Only check the Red Value I could have used EditableIf(_Color0,GreaterThan,125) +// +// Like wise with floats GreaterThanOrEqualTo, LessThan, LessThanOrEqualTo +// +// Vector: +// Vector Checks work the same as colour checks +// +// Texture: +// x Does Not have a Texture +// EditableIf(_TextureSample0,Equals,null) +// This will allow the value to be edited, if the property _TextureSample0 does NOT have a texture +// +// x Does have a Texture +// EditableIf(_TextureSample0,NotEqualTo,null) +// This will allow the value to be edited, if the property _TextureSample0 does have a texture + +using UnityEngine; +using UnityEditor; +using System; + +public enum ComparisonOperators +{ + EqualTo, NotEqualTo, GreaterThan, LessThan, EqualsOrGreaterThan, EqualsOrLessThan, ContainsFlags, + DoesNotContainsFlags +} + +public class EditableIf : MaterialPropertyDrawer +{ + ComparisonOperators op; + string FieldName = ""; + object ExpectedValue; + bool InputError; + public EditableIf() + { + InputError = true; + } + public EditableIf( object fieldname, object comparison, object expectedvalue ) + { + if( expectedvalue.ToString().ToLower() == "true" ) + { + expectedvalue = (System.Single)1; + } + else if( expectedvalue.ToString().ToLower() == "false" ) + { + expectedvalue = (System.Single)0; + + } + Init( fieldname, comparison, expectedvalue ); + + } + public EditableIf( object fieldname, object comparison, object expectedvaluex, object expectedvaluey ) + { + float? x = expectedvaluex as float?; + float? y = expectedvaluey as float?; + float? z = float.NegativeInfinity; + float? w = float.NegativeInfinity; + x = GetVectorValue( x ); + y = GetVectorValue( y ); + + Init( fieldname, comparison, new Vector4( x.Value, y.Value, z.Value, w.Value ) ); + } + public EditableIf( object fieldname, object comparison, object expectedvaluex, object expectedvaluey, object expectedvaluez ) + { + float? x = expectedvaluex as float?; + float? y = expectedvaluey as float?; + float? z = expectedvaluez as float?; + float? w = float.NegativeInfinity; + x = GetVectorValue( x ); + y = GetVectorValue( y ); + z = GetVectorValue( z ); + + Init( fieldname, comparison, new Vector4( x.Value, y.Value, z.Value, w.Value ) ); + + } + public EditableIf( object fieldname, object comparison, object expectedvaluex, object expectedvaluey, object expectedvaluez, object expectedvaluew ) + { + var x = expectedvaluex as float?; + var y = expectedvaluey as float?; + var z = expectedvaluez as float?; + var w = expectedvaluew as float?; + x = GetVectorValue( x ); + y = GetVectorValue( y ); + z = GetVectorValue( z ); + w = GetVectorValue( w ); + + Init( fieldname, comparison, new Vector4( x.Value, y.Value, z.Value, w.Value ) ); + + } + + private void Init( object fieldname, object comparison, object expectedvalue ) + { + FieldName = fieldname.ToString(); + var names = Enum.GetNames( typeof( ComparisonOperators ) ); + var name = comparison.ToString().ToLower().Replace( " ", "" ); + + for( int i = 0; i < names.Length; i++ ) + { + if( names[ i ].ToLower() == name ) + { + op = (ComparisonOperators)i; + break; + } + } + + ExpectedValue = expectedvalue; + } + + private static float? GetVectorValue( float? x ) + { + if( x.HasValue == false ) + { + x = float.NegativeInfinity; + } + + return x; + } + + // Draw the property inside the given rect + public override void OnGUI( Rect position, MaterialProperty prop, String label, MaterialEditor editor ) + { + if( InputError ) + { + EditorGUI.LabelField( position, "EditableIf Attribute Error: Input parameters are invalid!" ); + return; + } + var LHSprop = MaterialEditor.GetMaterialProperty( prop.targets, FieldName ); + if( string.IsNullOrEmpty( LHSprop.name ) ) + { + LHSprop = MaterialEditor.GetMaterialProperty( prop.targets, "_" + FieldName.Replace( " ", "" ) ); + if( string.IsNullOrEmpty( LHSprop.name ) ) + { + EditorGUI.LabelField( position, "EditableIf Attribute Error: " + FieldName + " Does not exist!" ); + return; + } + } + object LHSVal = null; + + bool test = false; + switch( LHSprop.type ) + { + case MaterialProperty.PropType.Color: + case MaterialProperty.PropType.Vector: + LHSVal = LHSprop.type == MaterialProperty.PropType.Color ? (Vector4)LHSprop.colorValue : LHSprop.vectorValue; + var v4 = ExpectedValue as Vector4?; + v4 = v4.HasValue ? v4 : new Vector4( (System.Single)ExpectedValue, float.NegativeInfinity, float.NegativeInfinity, float.NegativeInfinity ); + + if( LHSprop.type == MaterialProperty.PropType.Color ) + { + test = VectorCheck( (Vector4)LHSVal, op, v4 / 255 ); + + } + else + test = VectorCheck( (Vector4)LHSVal, op, v4 ); + break; + case MaterialProperty.PropType.Range: + case MaterialProperty.PropType.Float: + LHSVal = LHSprop.floatValue; + test = ( Check( LHSVal, op, ExpectedValue ) ); + break; + case MaterialProperty.PropType.Texture: + LHSVal = LHSprop.textureValue; + test = ( CheckObject( LHSVal, op, ExpectedValue ) ); + break; + } + + GUI.enabled = test; + editor.DefaultShaderProperty( position, prop, label ); + GUI.enabled = true; + } + + private bool VectorCheck( Vector4 LHS, ComparisonOperators op, object expectedValue ) + { + var RHS = (Vector4)expectedValue; + if( RHS.x != float.NegativeInfinity ) + { + if( !Check( LHS.x, op, RHS.x ) ) + return false; + } + if( RHS.y != float.NegativeInfinity ) + { + if( !Check( LHS.y, op, RHS.y ) ) + return false; + } + if( RHS.z != float.NegativeInfinity ) + { + if( !Check( LHS.z, op, RHS.z ) ) + return false; + } + if( RHS.w != float.NegativeInfinity ) + { + if( !Check( LHS.w, op, RHS.w ) ) + return false; + } + + return true; + } + + protected bool Check( object LHS, ComparisonOperators op, object RHS ) + { + if( !( LHS is IComparable ) || !( RHS is IComparable ) ) + throw new Exception( "Check using non basic type" ); + + switch( op ) + { + case ComparisonOperators.EqualTo: + return ( (IComparable)LHS ).CompareTo( RHS ) == 0; + + case ComparisonOperators.NotEqualTo: + return ( (IComparable)LHS ).CompareTo( RHS ) != 0; + + case ComparisonOperators.EqualsOrGreaterThan: + return ( (IComparable)LHS ).CompareTo( RHS ) >= 0; + + case ComparisonOperators.EqualsOrLessThan: + return ( (IComparable)LHS ).CompareTo( RHS ) <= 0; + + case ComparisonOperators.GreaterThan: + return ( (IComparable)LHS ).CompareTo( RHS ) > 0; + + case ComparisonOperators.LessThan: + return ( (IComparable)LHS ).CompareTo( RHS ) < 0; + case ComparisonOperators.ContainsFlags: + return ( (int)LHS & (int)RHS ) != 0; // Dont trust LHS values, it has been casted to a char and then to an int again, first bit will be the sign + case ComparisonOperators.DoesNotContainsFlags: + return ( ( (int)LHS & (int)RHS ) == (int)LHS ); // Dont trust LHS values, it has been casted to a char and then to an int again, first bit will be the sign + + default: + break; + } + return false; + } + private bool CheckObject( object LHS, ComparisonOperators comparasonOperator, object RHS ) + { + switch( comparasonOperator ) + { + case ComparisonOperators.EqualTo: + return ( LHS == null ); + + case ComparisonOperators.NotEqualTo: + return ( LHS != null ); + } + return true; + } + +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/EditableIf.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/EditableIf.cs.meta new file mode 100644 index 0000000..363e2ad --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/EditableIf.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7a5504a2b7d04a846978416748dc6e0a +timeCreated: 1520330108 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/NoKeywordToggle.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/NoKeywordToggle.cs new file mode 100644 index 0000000..dfce2c0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/NoKeywordToggle.cs @@ -0,0 +1,25 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +public class NoKeywordToggle : MaterialPropertyDrawer +{ + + public override void OnGUI(Rect position, MaterialProperty prop, String label, MaterialEditor editor) { + bool value = (prop.floatValue != 0.0f); + + EditorGUI.BeginChangeCheck(); + { + EditorGUI.showMixedValue = prop.hasMixedValue; + value = EditorGUI.Toggle( position, label, value ); + EditorGUI.showMixedValue = false; + } + if (EditorGUI.EndChangeCheck()) + { + prop.floatValue = value ? 1.0f : 0.0f; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/NoKeywordToggle.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/NoKeywordToggle.cs.meta new file mode 100644 index 0000000..6c25900 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/NoKeywordToggle.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e1a000d43a26286499b39a7571e5c61b +timeCreated: 1605540234 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/RemapSliders.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/RemapSliders.cs new file mode 100644 index 0000000..185077d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/RemapSliders.cs @@ -0,0 +1,36 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +public class RemapSliders : MaterialPropertyDrawer +{ + public override void OnGUI( Rect position, MaterialProperty prop, String label, MaterialEditor editor ) + { + EditorGUI.BeginChangeCheck(); + Vector4 value = prop.vectorValue; + + EditorGUI.showMixedValue = prop.hasMixedValue; + + var cacheLabel = EditorGUIUtility.labelWidth; + var cacheField = EditorGUIUtility.fieldWidth; + if( cacheField <= 64 ) + { + float total = position.width; + EditorGUIUtility.labelWidth = Mathf.Ceil( 0.45f * total ) - 30; + EditorGUIUtility.fieldWidth = Mathf.Ceil( 0.55f * total ) + 30; + } + + EditorGUI.MinMaxSlider(position, label, ref value.x, ref value.y, 0, 1 ); + + EditorGUIUtility.labelWidth = cacheLabel; + EditorGUIUtility.fieldWidth = cacheField; + EditorGUI.showMixedValue = false; + if( EditorGUI.EndChangeCheck() ) + { + prop.vectorValue = value; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/RemapSliders.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/RemapSliders.cs.meta new file mode 100644 index 0000000..4c45d1a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/RemapSliders.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 314af1bcecbba6c4d92cbb5843c221ba +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/RemapSlidersFull.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/RemapSlidersFull.cs new file mode 100644 index 0000000..2bc4438 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/RemapSlidersFull.cs @@ -0,0 +1,36 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +public class RemapSlidersFull : MaterialPropertyDrawer +{ + public override void OnGUI( Rect position, MaterialProperty prop, String label, MaterialEditor editor ) + { + EditorGUI.BeginChangeCheck(); + Vector4 value = prop.vectorValue; + + EditorGUI.showMixedValue = prop.hasMixedValue; + + var cacheLabel = EditorGUIUtility.labelWidth; + var cacheField = EditorGUIUtility.fieldWidth; + if( cacheField <= 64 ) + { + float total = position.width; + EditorGUIUtility.labelWidth = Mathf.Ceil( 0.45f * total ) - 30; + EditorGUIUtility.fieldWidth = Mathf.Ceil( 0.55f * total ) + 30; + } + + EditorGUI.MinMaxSlider( position, label, ref value.x, ref value.y, value.z, value.w ); + + EditorGUIUtility.labelWidth = cacheLabel; + EditorGUIUtility.fieldWidth = cacheField; + EditorGUI.showMixedValue = false; + if( EditorGUI.EndChangeCheck() ) + { + prop.vectorValue = value; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/RemapSlidersFull.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/RemapSlidersFull.cs.meta new file mode 100644 index 0000000..58e7813 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/RemapSlidersFull.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9a724dcf5c5ddef40bcef06f0b2c8ec0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/SingleLineTexture.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/SingleLineTexture.cs new file mode 100644 index 0000000..b2d6754 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/SingleLineTexture.cs @@ -0,0 +1,23 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +public class SingleLineTexture : MaterialPropertyDrawer +{ + public override void OnGUI( Rect position, MaterialProperty prop, String label, MaterialEditor editor ) + { + EditorGUI.BeginChangeCheck(); + EditorGUI.showMixedValue = prop.hasMixedValue; + + Texture value = editor.TexturePropertyMiniThumbnail( position, prop, label, string.Empty ); + + EditorGUI.showMixedValue = false; + if( EditorGUI.EndChangeCheck() ) + { + prop.textureValue = value; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/SingleLineTexture.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/SingleLineTexture.cs.meta new file mode 100644 index 0000000..33bacf1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/CustomDrawers/SingleLineTexture.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 85da32683d237ac4f8665251e2ac38dc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/DoCreateFunction.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/DoCreateFunction.cs new file mode 100644 index 0000000..791b758 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/DoCreateFunction.cs @@ -0,0 +1,17 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEditor; +using UnityEditor.ProjectWindowCallback; +namespace AmplifyShaderEditor +{ + public class DoCreateFunction : EndNameEditAction + { + public override void Action( int instanceId, string pathName, string resourceFile ) + { + UnityEngine.Object obj = EditorUtility.InstanceIDToObject( instanceId ); + AssetDatabase.CreateAsset( obj, AssetDatabase.GenerateUniqueAssetPath( pathName ) ); + AmplifyShaderEditorWindow.LoadShaderFunctionToASE( (AmplifyShaderFunction)obj, false ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/DoCreateFunction.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/DoCreateFunction.cs.meta new file mode 100644 index 0000000..3db405d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/DoCreateFunction.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3f2c950b0ed192943b7484f6b551965f +timeCreated: 1493906087 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/DoCreateShader.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/DoCreateShader.cs new file mode 100644 index 0000000..5fa1424 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/DoCreateShader.cs @@ -0,0 +1,48 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using UnityEditor.ProjectWindowCallback; +using System.IO; +namespace AmplifyShaderEditor +{ + public class DoCreateStandardShader : EndNameEditAction + { + public override void Action( int instanceId, string pathName, string resourceFile ) + { + string uniquePath = AssetDatabase.GenerateUniqueAssetPath( pathName ); + string shaderName = Path.GetFileName( uniquePath ); + + if( IOUtils.AllOpenedWindows.Count > 0 ) + { + EditorWindow openedWindow = AmplifyShaderEditorWindow.GetWindow(); + AmplifyShaderEditorWindow currentWindow = AmplifyShaderEditorWindow.CreateTab(); + WindowHelper.AddTab( openedWindow, currentWindow ); + UIUtils.CurrentWindow = currentWindow; + } + else + { + AmplifyShaderEditorWindow currentWindow = AmplifyShaderEditorWindow.OpenWindow( shaderName, UIUtils.ShaderIcon ); + UIUtils.CurrentWindow = currentWindow; + } + + Shader shader = UIUtils.CreateNewEmpty( uniquePath, shaderName ); + ProjectWindowUtil.ShowCreatedAsset( shader ); + } + } + + public class DoCreateTemplateShader : EndNameEditAction + { + public override void Action( int instanceId, string pathName, string resourceFile ) + { + string uniquePath = AssetDatabase.GenerateUniqueAssetPath( pathName ); + string shaderName = Path.GetFileName( uniquePath ); + if( !string.IsNullOrEmpty( UIUtils.NewTemplateGUID ) ) + { + Shader shader = AmplifyShaderEditorWindow.CreateNewTemplateShader( UIUtils.NewTemplateGUID, uniquePath, shaderName ); + ProjectWindowUtil.ShowCreatedAsset( shader ); + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/DoCreateShader.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/DoCreateShader.cs.meta new file mode 100644 index 0000000..f2573fb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/DoCreateShader.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2cfa7290f61ad684f99f8d81328ad52c +timeCreated: 1573664425 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/EditorOptions.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/EditorOptions.cs new file mode 100644 index 0000000..89cc8ed --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/EditorOptions.cs @@ -0,0 +1,67 @@ +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [System.Serializable] + public class OptionsWindow + { + private AmplifyShaderEditorWindow m_parentWindow = null; + + private bool m_coloredPorts = true; + private bool m_multiLinePorts = true; + private const string MultiLineId = "MultiLinePortsDefault"; + private const string ColorPortId = "ColoredPortsDefault"; + public OptionsWindow( AmplifyShaderEditorWindow parentWindow ) + { + m_parentWindow = parentWindow; + //Load (); + } + + public void Init() + { + Load(); + } + + public void Destroy() + { + Save(); + } + + public void Save() + { + EditorPrefs.SetBool( ColorPortId, ColoredPorts ); + EditorPrefs.SetBool( MultiLineId, m_multiLinePorts ); + } + + public void Load() + { + ColoredPorts = EditorPrefs.GetBool( ColorPortId, true ); + m_multiLinePorts = EditorPrefs.GetBool( MultiLineId, true ); + } + + public bool ColoredPorts + { + get { return m_coloredPorts; } + set + { + if ( m_coloredPorts != value ) + EditorPrefs.SetBool( ColorPortId, value ); + + m_coloredPorts = value; + } + } + + public bool MultiLinePorts + { + get { return m_multiLinePorts; } + set + { + if ( m_multiLinePorts != value ) + EditorPrefs.SetBool( MultiLineId, value ); + + m_multiLinePorts = value; + } + } + public AmplifyShaderEditorWindow ParentWindow { get { return m_parentWindow; } set { m_parentWindow = value; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/EditorOptions.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/EditorOptions.cs.meta new file mode 100644 index 0000000..18f0193 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/EditorOptions.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 44cb06bc7bfe6e84aa8b5e8b702eb2dd +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Graphs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Graphs.meta new file mode 100644 index 0000000..e542e0f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Graphs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 52f451731ec183e43ab18f0896f7172a +folderAsset: yes +timeCreated: 1481126944 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Graphs/NodeGrid.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Graphs/NodeGrid.cs new file mode 100644 index 0000000..748d28b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Graphs/NodeGrid.cs @@ -0,0 +1,283 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + public class NodeGrid + { + private bool m_debugGrid = false; + private const float GRID_SIZE_X = 100; + private const float GRID_SIZE_Y = 100; + + private const float GRID_AREA_X = 1000; + private const float GRID_AREA_Y = 1000; + + private Dictionary>> m_grid; + + private int m_xMin = int.MaxValue; + private int m_yMin = int.MaxValue; + + private int m_xMax = int.MinValue; + private int m_yMax = int.MinValue; + + public NodeGrid() + { + m_grid = new Dictionary>>(); + } + + public void AddNodeToGrid( ParentNode node ) + { + Rect pos = node.Position; + if ( Mathf.Abs( pos.width ) < 0.001f || Mathf.Abs( pos.height ) < 0.001f ) + { + return; + } + + float initialXf = pos.x / GRID_SIZE_X; + float initialYf = pos.y / GRID_SIZE_Y; + + int endX = Mathf.CeilToInt( initialXf + pos.width / GRID_SIZE_X ); + int endY = Mathf.CeilToInt( initialYf + pos.height / GRID_SIZE_Y ); + + int initialX = Mathf.FloorToInt( initialXf ); + int initialY = Mathf.FloorToInt( initialYf ); + + + if ( initialX < m_xMin ) + { + m_xMin = initialX; + } + + if ( initialY < m_yMin ) + { + m_yMin = initialY; + } + + if ( endX > m_xMax ) + { + m_xMax = endX; + } + + if ( endY > m_yMax ) + { + m_yMax = endY; + } + + for ( int x = initialX; x < endX; x += 1 ) + { + for ( int y = initialY; y < endY; y += 1 ) + { + if ( !m_grid.ContainsKey( x ) ) + { + m_grid.Add( x, new Dictionary>() ); + + } + + if ( !m_grid[ x ].ContainsKey( y ) ) + { + m_grid[ x ].Add( y, new List() ); + } + + m_grid[ x ][ y ].Add( node ); + } + } + node.IsOnGrid = true; + //DebugLimits(); + } + + public void RemoveNodeFromGrid( ParentNode node, bool useCachedPos ) + { + Rect pos = useCachedPos ? node.CachedPos : node.Position; + if ( Mathf.Abs( pos.width ) < 0.001f || Mathf.Abs( pos.height ) < 0.001f ) + { + return; + } + + float initialXf = pos.x / GRID_SIZE_X; + float initialYf = pos.y / GRID_SIZE_Y; + + int endX = Mathf.CeilToInt( initialXf + pos.width / GRID_SIZE_X ); + int endY = Mathf.CeilToInt( initialYf + pos.height / GRID_SIZE_Y ); + + int initialX = Mathf.FloorToInt( initialXf ); + int initialY = Mathf.FloorToInt( initialYf ); + bool testLimits = false; + + int xMinCount = 0; + int xMaxCount = 0; + + int yMinCount = 0; + int yMaxCount = 0; + + + for ( int x = initialX; x < endX; x += 1 ) + { + for ( int y = initialY; y < endY; y += 1 ) + { + if ( m_grid.ContainsKey( x ) ) + { + if ( m_grid[ x ].ContainsKey( y ) ) + { + m_grid[ x ][ y ].Remove( node ); + node.IsOnGrid = false; + + if ( initialX == m_xMin && x == initialX ) + { + testLimits = true; + if ( m_grid[ x ][ y ].Count != 0 ) + { + xMinCount += 1; + } + } + + if ( endX == m_xMax && x == endX ) + { + testLimits = true; + if ( m_grid[ x ][ y ].Count != 0 ) + { + xMaxCount += 1; + } + } + + if ( initialY == m_yMin && y == initialY ) + { + testLimits = true; + if ( m_grid[ x ][ y ].Count != 0 ) + { + yMinCount += 1; + } + } + + if ( endY == m_yMax && y == endY ) + { + testLimits = true; + if ( m_grid[ x ][ y ].Count != 0 ) + { + yMaxCount += 1; + } + } + } + } + } + } + + + if ( testLimits ) + { + if ( xMinCount == 0 || xMaxCount == 0 || yMinCount == 0 || yMaxCount == 0 ) + { + m_xMin = int.MaxValue; + m_yMin = int.MaxValue; + + m_xMax = int.MinValue; + m_yMax = int.MinValue; + foreach ( KeyValuePair>> entryX in m_grid ) + { + foreach ( KeyValuePair> entryY in entryX.Value ) + { + if ( entryY.Value.Count > 0 ) + { + if ( entryX.Key < m_xMin ) + { + m_xMin = entryX.Key; + } + + if ( entryY.Key < m_yMin ) + { + m_yMin = entryY.Key; + } + + if ( entryX.Key > m_xMax ) + { + m_xMax = entryX.Key; + } + + if ( entryY.Key > m_yMax ) + { + m_yMax = entryY.Key; + } + } + } + } + // The += 1 is to maintain consistence with AddNodeToGrid() ceil op on max values + m_xMax += 1; + m_yMax += 1; + } + } + //DebugLimits(); + } + + public void DebugLimits() + { + Debug.Log( "[ " + m_xMin + " , " + m_yMin + " ] " + "[ " + m_xMax + " , " + m_yMax + " ] " ); + } + + //pos must be the transformed mouse position to local canvas coordinates + public List GetNodesOn( Vector2 pos ) + { + int x = Mathf.FloorToInt( pos.x / GRID_SIZE_X ); + int y = Mathf.FloorToInt( pos.y / GRID_SIZE_Y ); + + if ( m_grid.ContainsKey( x ) ) + { + if ( m_grid[ x ].ContainsKey( y ) ) + { + return m_grid[ x ][ y ]; + } + } + + return null; + } + + public List GetNodesOn( int x, int y ) + { + if ( m_grid.ContainsKey( x ) ) + { + if ( m_grid[ x ].ContainsKey( y ) ) + { + return m_grid[ x ][ y ]; + } + } + return null; + } + + public void DrawGrid( DrawInfo drawInfo ) + { + if ( m_debugGrid ) + { + Handles.CircleHandleCap( 0, drawInfo.InvertedZoom * ( new Vector3( drawInfo.CameraOffset.x, drawInfo.CameraOffset.y, 0f ) ), Quaternion.identity, 5,EventType.Layout ); + for ( int x = -( int ) GRID_AREA_X; x < GRID_AREA_X; x += ( int ) GRID_SIZE_X ) + { + Handles.DrawLine( drawInfo.InvertedZoom * ( new Vector3( x + drawInfo.CameraOffset.x, drawInfo.CameraOffset.y - GRID_AREA_Y, 0 ) ), drawInfo.InvertedZoom * ( new Vector3( drawInfo.CameraOffset.x + x, drawInfo.CameraOffset.y + GRID_AREA_Y, 0 ) ) ); + } + + for ( int y = -( int ) GRID_AREA_Y; y < GRID_AREA_X; y += ( int ) GRID_SIZE_Y ) + { + Handles.DrawLine( drawInfo.InvertedZoom * ( new Vector3( drawInfo.CameraOffset.x - GRID_AREA_X, drawInfo.CameraOffset.y + y, 0 ) ), drawInfo.InvertedZoom * ( new Vector3( drawInfo.CameraOffset.x + GRID_AREA_X, drawInfo.CameraOffset.y + y, 0 ) ) ); + } + } + } + + public void Destroy() + { + foreach ( KeyValuePair>> entryX in m_grid ) + { + foreach ( KeyValuePair> entryY in entryX.Value ) + { + entryY.Value.Clear(); + } + entryX.Value.Clear(); + } + m_grid.Clear(); + } + + public float MaxNodeDist + { + get { return Mathf.Max( ( m_xMax - m_xMin )*GRID_SIZE_X, ( m_yMax - m_yMin )*GRID_SIZE_Y ); } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Graphs/NodeGrid.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Graphs/NodeGrid.cs.meta new file mode 100644 index 0000000..46d9f0f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Graphs/NodeGrid.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6344917ce0eed6b43840632b98a2ed57 +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Graphs/ParentGraph.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Graphs/ParentGraph.cs new file mode 100644 index 0000000..5ca7202 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Graphs/ParentGraph.cs @@ -0,0 +1,4041 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class ParentGraph : ScriptableObject, ISerializationCallbackReceiver + { + private const int MasterNodeLODIncrement = 100; + private const int MaxLodAmount = 9; + + public enum NodeLOD + { + LOD0, + LOD1, + LOD2, + LOD3, + LOD4, + LOD5 + } + + [SerializeField] + private bool m_samplingThroughMacros = false; + + private NodeLOD m_lodLevel = NodeLOD.LOD0; + private GUIStyle nodeStyleOff; + private GUIStyle nodeStyleOn; + private GUIStyle nodeTitle; + private GUIStyle commentaryBackground; + + public delegate void LODMasterNodesAdded( int lod ); + public event LODMasterNodesAdded OnLODMasterNodesAddedEvent; + + public delegate void EmptyGraphDetected( ParentGraph graph ); + public event EmptyGraphDetected OnEmptyGraphDetectedEvt; + + public delegate void NodeEvent( ParentNode node ); + public event NodeEvent OnNodeEvent = null; + public event NodeEvent OnNodeRemovedEvent; + + public delegate void DuplicateEvent(); + public event DuplicateEvent OnDuplicateEvent; + + public event MasterNode.OnMaterialUpdated OnMaterialUpdatedEvent; + public event MasterNode.OnMaterialUpdated OnShaderUpdatedEvent; + + private bool m_afterDeserializeFlag = true; + private bool m_lateOptionsRefresh = false; + private bool m_foundDuplicates = false; + + //[SerializeField] + private AmplifyShaderEditorWindow m_parentWindow = null; + + [SerializeField] + private int m_validNodeId; + + [SerializeField] + private List m_nodes = new List(); + + // Sampler Nodes registry + [SerializeField] + private UsageListSamplerNodes m_samplerNodes = new UsageListSamplerNodes(); + + [SerializeField] + private UsageListFloatIntNodes m_floatNodes = new UsageListFloatIntNodes(); + + [SerializeField] + private UsageListTexturePropertyNodes m_texturePropertyNodes = new UsageListTexturePropertyNodes(); + + [SerializeField] + private UsageListTextureArrayNodes m_textureArrayNodes = new UsageListTextureArrayNodes(); + + [SerializeField] + private UsageListPropertyNodes m_propertyNodes = new UsageListPropertyNodes(); + + [SerializeField] + private UsageListPropertyNodes m_rawPropertyNodes = new UsageListPropertyNodes(); + + [SerializeField] + private UsageListScreenColorNodes m_screenColorNodes = new UsageListScreenColorNodes(); + + [SerializeField] + private UsageListRegisterLocalVarNodes m_localVarNodes = new UsageListRegisterLocalVarNodes(); + + [SerializeField] + private UsageListGlobalArrayNodes m_globalArrayNodes = new UsageListGlobalArrayNodes(); + + [SerializeField] + private UsageListFunctionInputNodes m_functionInputNodes = new UsageListFunctionInputNodes(); + + [SerializeField] + private UsageListFunctionNodes m_functionNodes = new UsageListFunctionNodes(); + + [SerializeField] + private UsageListFunctionOutputNodes m_functionOutputNodes = new UsageListFunctionOutputNodes(); + + [SerializeField] + private UsageListFunctionSwitchNodes m_functionSwitchNodes = new UsageListFunctionSwitchNodes(); + + [SerializeField] + private UsageListFunctionSwitchCopyNodes m_functionSwitchCopyNodes = new UsageListFunctionSwitchCopyNodes(); + + [SerializeField] + private UsageListTemplateMultiPassMasterNodes m_multiPassMasterNodes = new UsageListTemplateMultiPassMasterNodes(); + + [SerializeField] + private List m_lodMultiPassMasterNodes; + + [SerializeField] + private UsageListCustomExpressionsOnFunctionMode m_customExpressionsOnFunctionMode = new UsageListCustomExpressionsOnFunctionMode(); + + [SerializeField] + private UsageListStaticSwitchNodes m_staticSwitchNodes = new UsageListStaticSwitchNodes(); + + [SerializeField] + private int m_masterNodeId = Constants.INVALID_NODE_ID; + + [SerializeField] + private bool m_isDirty; + + [SerializeField] + private bool m_saveIsDirty = false; + + [SerializeField] + private int m_nodeClicked; + + [SerializeField] + private int m_loadedShaderVersion; + + [SerializeField] + private int m_instancePropertyCount = 0; + + [SerializeField] + private int m_virtualTextureCount = 0; + + [SerializeField] + private int m_graphId = 0; + + [SerializeField] + private PrecisionType m_currentPrecision = PrecisionType.Float; + + [SerializeField] + private NodeAvailability m_currentCanvasMode = NodeAvailability.SurfaceShader; + + [SerializeField] + private TemplateSRPType m_currentSRPType = TemplateSRPType.BuiltIn; + + //private List m_visibleNodes = new List(); + + private List m_nodePreviewList = new List(); + + private Dictionary m_nodesDict = new Dictionary(); + + [NonSerialized] + private List m_selectedNodes = new List(); + + [NonSerialized] + private List m_markedForDeletion = new List(); + + [SerializeField] + private List m_highlightedWires = new List(); + private System.Type m_masterNodeDefaultType; + + [SerializeField] + private List m_internalTemplateNodesList = new List(); + private Dictionary m_internalTemplateNodesDict = new Dictionary(); + + private NodeGrid m_nodeGrid; + + private bool m_markedToDeSelect = false; + private int m_markToSelect = -1; + private bool m_markToReOrder = false; + + private bool m_hasUnConnectedNodes = false; + + private bool m_checkSelectedWireHighlights = false; + + // Bezier info + [SerializeField] + private List m_bezierReferences; + private const int MaxBezierReferences = 50; + private int m_wireBezierCount = 0; + + protected int m_normalDependentCount = 0; + private bool m_forceCategoryRefresh = false; + + [SerializeField] + private bool m_forceRepositionCheck = false; + + private bool m_isLoading = false; + private bool m_isDuplicating = false; + + private bool m_changedLightingModel = false; + + public void ResetEvents() + { + OnNodeEvent = null; + OnMaterialUpdatedEvent = null; + OnShaderUpdatedEvent = null; + OnEmptyGraphDetectedEvt = null; + OnNodeRemovedEvent = null; + } + + public void Init() + { + Undo.undoRedoPerformed += OnUndoRedoCallback; + m_normalDependentCount = 0; + m_nodes = new List(); + m_samplerNodes = new UsageListSamplerNodes(); + m_samplerNodes.ContainerGraph = this; + m_samplerNodes.ReorderOnChange = true; + m_floatNodes = new UsageListFloatIntNodes(); + m_floatNodes.ContainerGraph = this; + m_texturePropertyNodes = new UsageListTexturePropertyNodes(); + m_texturePropertyNodes.ContainerGraph = this; + m_textureArrayNodes = new UsageListTextureArrayNodes(); + m_textureArrayNodes.ContainerGraph = this; + m_textureArrayNodes.ReorderOnChange = true; + m_propertyNodes = new UsageListPropertyNodes(); + m_propertyNodes.ContainerGraph = this; + m_rawPropertyNodes = new UsageListPropertyNodes(); + m_rawPropertyNodes.ContainerGraph = this; + m_customExpressionsOnFunctionMode = new UsageListCustomExpressionsOnFunctionMode(); + m_customExpressionsOnFunctionMode.ContainerGraph = this; + m_staticSwitchNodes = new UsageListStaticSwitchNodes(); + m_staticSwitchNodes.ContainerGraph = this; + m_staticSwitchNodes.ReorderOnChange = true; + m_screenColorNodes = new UsageListScreenColorNodes(); + m_screenColorNodes.ContainerGraph = this; + m_screenColorNodes.ReorderOnChange = true; + m_localVarNodes = new UsageListRegisterLocalVarNodes(); + m_localVarNodes.ContainerGraph = this; + m_localVarNodes.ReorderOnChange = true; + m_globalArrayNodes = new UsageListGlobalArrayNodes(); + m_globalArrayNodes.ContainerGraph = this; + m_functionInputNodes = new UsageListFunctionInputNodes(); + m_functionInputNodes.ContainerGraph = this; + m_functionNodes = new UsageListFunctionNodes(); + m_functionNodes.ContainerGraph = this; + m_functionOutputNodes = new UsageListFunctionOutputNodes(); + m_functionOutputNodes.ContainerGraph = this; + m_functionSwitchNodes = new UsageListFunctionSwitchNodes(); + m_functionSwitchNodes.ContainerGraph = this; + m_functionSwitchCopyNodes = new UsageListFunctionSwitchCopyNodes(); + m_functionSwitchCopyNodes.ContainerGraph = this; + m_multiPassMasterNodes = new UsageListTemplateMultiPassMasterNodes(); + m_multiPassMasterNodes.ContainerGraph = this; + m_lodMultiPassMasterNodes = new List( MaxLodAmount ); + for( int i = 0; i < MaxLodAmount; i++ ) + { + m_lodMultiPassMasterNodes.Add( new UsageListTemplateMultiPassMasterNodes() ); + } + m_selectedNodes = new List(); + m_markedForDeletion = new List(); + m_highlightedWires = new List(); + m_validNodeId = 0; + IsDirty = false; + SaveIsDirty = false; + m_masterNodeDefaultType = typeof( StandardSurfaceOutputNode ); + + m_bezierReferences = new List( MaxBezierReferences ); + for( int i = 0; i < MaxBezierReferences; i++ ) + { + m_bezierReferences.Add( new WireBezierReference() ); + } + } + + private void OnUndoRedoCallback() + { + DeSelectAll(); + } + + private void OnEnable() + { + hideFlags = HideFlags.HideAndDontSave; + m_nodeGrid = new NodeGrid(); + m_internalTemplateNodesDict = new Dictionary(); + m_nodesDict = new Dictionary(); + nodeStyleOff = UIUtils.GetCustomStyle( CustomStyle.NodeWindowOff ); + nodeStyleOn = UIUtils.GetCustomStyle( CustomStyle.NodeWindowOn ); + nodeTitle = UIUtils.GetCustomStyle( CustomStyle.NodeHeader ); + commentaryBackground = UIUtils.GetCustomStyle( CustomStyle.CommentaryBackground ); + } + + public void UpdateRegisters() + { + m_samplerNodes.UpdateNodeArr(); + m_propertyNodes.UpdateNodeArr(); + m_rawPropertyNodes.UpdateNodeArr(); + m_customExpressionsOnFunctionMode.UpdateNodeArr(); + m_staticSwitchNodes.UpdateNodeArr(); + m_functionInputNodes.UpdateNodeArr(); + m_functionNodes.UpdateNodeArr(); + m_functionOutputNodes.UpdateNodeArr(); + m_functionSwitchNodes.UpdateNodeArr(); + m_functionSwitchCopyNodes.UpdateNodeArr(); + m_multiPassMasterNodes.UpdateNodeArr(); + for( int i = 0; i < m_lodMultiPassMasterNodes.Count; i++ ) + { + m_lodMultiPassMasterNodes[ i ].UpdateNodeArr(); + } + m_texturePropertyNodes.UpdateNodeArr(); + m_textureArrayNodes.UpdateNodeArr(); + m_screenColorNodes.UpdateNodeArr(); + m_localVarNodes.UpdateNodeArr(); + m_globalArrayNodes.UpdateNodeArr(); + } + + public int GetValidId() + { + return m_validNodeId++; + } + + void UpdateIdFromNode( ParentNode node ) + { + if( node.UniqueId >= m_validNodeId ) + { + m_validNodeId = node.UniqueId + 1; + } + } + + public void ResetNodeConnStatus() + { + for( int i = 0; i < m_nodes.Count; i++ ) + { + if( m_nodes[ i ].ConnStatus == NodeConnectionStatus.Connected ) + { + m_nodes[ i ].ConnStatus = NodeConnectionStatus.Not_Connected; + } + } + } + + public void CleanUnusedNodes() + { + List unusedNodes = new List(); + for( int i = 0; i < m_nodes.Count; i++ ) + { + if( m_nodes[ i ].ConnStatus == NodeConnectionStatus.Not_Connected ) + { + unusedNodes.Add( m_nodes[ i ] ); + } + } + + for( int i = 0; i < unusedNodes.Count; i++ ) + { + DestroyNode( unusedNodes[ i ] ); + } + unusedNodes.Clear(); + unusedNodes = null; + + IsDirty = true; + } + + // Destroy all nodes excluding Master Node + public void ClearGraph() + { + List list = new List(); + int count = m_nodes.Count; + for( int i = 0; i < count; i++ ) + { + if( m_nodes[ i ].UniqueId != m_masterNodeId ) + { + list.Add( m_nodes[ i ] ); + } + } + + while( list.Count > 0 ) + { + DestroyNode( list[ 0 ] ); + list.RemoveAt( 0 ); + } + } + + public void CleanNodes() + { + for( int i = 0; i < m_nodes.Count; i++ ) + { + if( m_nodes[ i ] != null ) + { + Undo.ClearUndo( m_nodes[ i ] ); + m_nodes[ i ].Destroy(); + GameObject.DestroyImmediate( m_nodes[ i ] ); + } + } + ClearInternalTemplateNodes(); + + m_masterNodeId = Constants.INVALID_NODE_ID; + m_validNodeId = 0; + m_instancePropertyCount = 0; + m_virtualTextureCount = 0; + + m_nodesDict.Clear(); + m_nodes.Clear(); + m_samplerNodes.Clear(); + m_propertyNodes.Clear(); + m_rawPropertyNodes.Clear(); + m_customExpressionsOnFunctionMode.Clear(); + m_staticSwitchNodes.Clear(); + m_functionInputNodes.Clear(); + m_functionNodes.Clear(); + m_functionOutputNodes.Clear(); + m_functionSwitchNodes.Clear(); + m_functionSwitchCopyNodes.Clear(); + m_multiPassMasterNodes.Clear(); + for( int i = 0; i < m_lodMultiPassMasterNodes.Count; i++ ) + { + m_lodMultiPassMasterNodes[ i ].Clear(); + } + + m_texturePropertyNodes.Clear(); + m_textureArrayNodes.Clear(); + m_screenColorNodes.Clear(); + m_localVarNodes.Clear(); + m_globalArrayNodes.Clear(); + m_selectedNodes.Clear(); + m_markedForDeletion.Clear(); + } + + public void ResetHighlightedWires() + { + for( int i = 0; i < m_highlightedWires.Count; i++ ) + { + m_highlightedWires[ i ].WireStatus = WireStatus.Default; + } + m_highlightedWires.Clear(); + } + + public void HighlightWiresStartingNode( ParentNode node ) + { + for( int outputIdx = 0; outputIdx < node.OutputPorts.Count; outputIdx++ ) + { + for( int extIdx = 0; extIdx < node.OutputPorts[ outputIdx ].ExternalReferences.Count; extIdx++ ) + { + WireReference wireRef = node.OutputPorts[ outputIdx ].ExternalReferences[ extIdx ]; + ParentNode nextNode = GetNode( wireRef.NodeId ); + if( nextNode && nextNode.ConnStatus == NodeConnectionStatus.Connected ) + { + InputPort port = nextNode.GetInputPortByUniqueId( wireRef.PortId ); + if( port.ExternalReferences.Count == 0 || port.ExternalReferences[ 0 ].WireStatus == WireStatus.Highlighted ) + { + // if even one wire is already highlighted then this tells us that this node was already been analysed + return; + } + + port.ExternalReferences[ 0 ].WireStatus = WireStatus.Highlighted; + m_highlightedWires.Add( port.ExternalReferences[ 0 ] ); + HighlightWiresStartingNode( nextNode ); + } + } + } + + RegisterLocalVarNode regNode = node as RegisterLocalVarNode; + if( (object)regNode != null ) + { + int count = regNode.NodeReferences.Count; + for( int i = 0; i < count; i++ ) + { + HighlightWiresStartingNode( regNode.NodeReferences[ i ] ); + } + } + } + + void PropagateHighlightDeselection( ParentNode node, int portId = -1 ) + { + if( portId > -1 ) + { + InputPort port = node.GetInputPortByUniqueId( portId ); + port.ExternalReferences[ 0 ].WireStatus = WireStatus.Default; + } + + if( node.Selected ) + return; + + for( int i = 0; i < node.InputPorts.Count; i++ ) + { + if( node.InputPorts[ i ].ExternalReferences.Count > 0 && node.InputPorts[ i ].ExternalReferences[ 0 ].WireStatus == WireStatus.Highlighted ) + { + // even though node is deselected, it receives wire highlight from a previous one + return; + } + } + + for( int outputIdx = 0; outputIdx < node.OutputPorts.Count; outputIdx++ ) + { + for( int extIdx = 0; extIdx < node.OutputPorts[ outputIdx ].ExternalReferences.Count; extIdx++ ) + { + WireReference wireRef = node.OutputPorts[ outputIdx ].ExternalReferences[ extIdx ]; + ParentNode nextNode = GetNode( wireRef.NodeId ); + PropagateHighlightDeselection( nextNode, wireRef.PortId ); + } + } + + RegisterLocalVarNode regNode = node as RegisterLocalVarNode; + if( (object)regNode != null ) + { + int count = regNode.NodeReferences.Count; + for( int i = 0; i < count; i++ ) + { + PropagateHighlightDeselection( regNode.NodeReferences[ i ], -1 ); + } + } + } + + + public void ResetNodesData() + { + int count = m_nodes.Count; + for( int i = 0; i < count; i++ ) + { + m_nodes[ i ].ResetNodeData(); + } + } + + public void FullCleanUndoStack() + { + Undo.ClearUndo( this ); + int count = m_nodes.Count; + for( int i = 0; i < count; i++ ) + { + if( m_nodes[ i ] != null ) + { + Undo.ClearUndo( m_nodes[ i ] ); + } + } + } + + public void FullRegisterOnUndoStack() + { + Undo.RegisterCompleteObjectUndo( this, Constants.UndoRegisterFullGrapId ); + int count = m_nodes.Count; + for( int i = 0; i < count; i++ ) + { + if( m_nodes[ i ] != null ) + { + Undo.RegisterCompleteObjectUndo( m_nodes[ i ], Constants.UndoRegisterFullGrapId ); + } + } + } + + public void CheckPropertiesAutoRegister( ref MasterNodeDataCollector dataCollector ) + { + List propertyNodesList = m_rawPropertyNodes.NodesList; + int propertyCount = propertyNodesList.Count; + for( int i = 0; i < propertyCount; i++ ) + { + propertyNodesList[ i ].CheckIfAutoRegister( ref dataCollector ); + } + propertyNodesList = null; + + List globalArrayNodeList = m_globalArrayNodes.NodesList; + int globalArrayCount = globalArrayNodeList.Count; + for( int i = 0; i < globalArrayCount; i++ ) + { + globalArrayNodeList[ i ].CheckIfAutoRegister( ref dataCollector ); + } + globalArrayNodeList = null; + + //List propertyNodesList = m_propertyNodes.NodesList; + //int propertyCount = propertyNodesList.Count; + //for( int i = 0; i < propertyCount; i++ ) + //{ + // propertyNodesList[ i ].CheckIfAutoRegister( ref dataCollector ); + //} + //propertyNodesList = null; + + //List screenColorNodes = m_screenColorNodes.NodesList; + //int screenColorNodesCount = screenColorNodes.Count; + //for( int i = 0; i < screenColorNodesCount; i++ ) + //{ + // screenColorNodes[ i ].CheckIfAutoRegister( ref dataCollector ); + //} + //screenColorNodes = null; + } + + public void SoftDestroy() + { + OnNodeRemovedEvent = null; + + m_masterNodeId = Constants.INVALID_NODE_ID; + m_validNodeId = 0; + + m_nodeGrid.Destroy(); + //m_nodeGrid = null; + + ClearInternalTemplateNodes(); + + for( int i = 0; i < m_nodes.Count; i++ ) + { + if( m_nodes[ i ] != null ) + { + m_nodes[ i ].Destroy(); + GameObject.DestroyImmediate( m_nodes[ i ] ); + } + } + + m_instancePropertyCount = 0; + + m_nodes.Clear(); + //m_nodes = null; + + m_nodesDict.Clear(); + //m_nodesDict = null; + + m_samplerNodes.Clear(); + //m_samplerNodes = null; + + m_propertyNodes.Clear(); + m_rawPropertyNodes.Clear(); + //m_propertyNodes = null; + + m_customExpressionsOnFunctionMode.Clear(); + + m_staticSwitchNodes.Clear(); + + m_functionInputNodes.Clear(); + //m_functionInputNodes = null; + + m_functionNodes.Clear(); + //m_functionNodes = null; + + m_functionOutputNodes.Clear(); + //m_functionOutputNodes = null; + + m_functionSwitchNodes.Clear(); + //m_functionSwitchNodes = null; + + m_functionSwitchCopyNodes.Clear(); + //m_functionSwitchCopyNodes = null; + + m_texturePropertyNodes.Clear(); + //m_texturePropertyNodes = null; + + m_textureArrayNodes.Clear(); + //m_textureArrayNodes = null; + + m_screenColorNodes.Clear(); + //m_screenColorNodes = null; + + m_localVarNodes.Clear(); + //m_localVarNodes = null; + + m_globalArrayNodes.Clear(); + + m_selectedNodes.Clear(); + //m_selectedNodes = null; + + m_markedForDeletion.Clear(); + //m_markedForDeletion = null; + + m_nodePreviewList.Clear(); + //m_nodePreviewList = null; + + IsDirty = true; + + OnNodeEvent = null; + OnDuplicateEvent = null; + //m_currentShaderFunction = null; + + OnMaterialUpdatedEvent = null; + OnShaderUpdatedEvent = null; + OnEmptyGraphDetectedEvt = null; + + nodeStyleOff = null; + nodeStyleOn = null; + nodeTitle = null; + commentaryBackground = null; + OnLODMasterNodesAddedEvent = null; + } + + + + + public void Destroy() + { + Undo.undoRedoPerformed -= OnUndoRedoCallback; + for( int i = 0; i < m_nodes.Count; i++ ) + { + if( m_nodes[ i ] != null ) + { + Undo.ClearUndo( m_nodes[ i ] ); + m_nodes[ i ].Destroy(); + GameObject.DestroyImmediate( m_nodes[ i ] ); + } + } + + //Must be before m_propertyNodes.Destroy(); + ClearInternalTemplateNodes(); + m_internalTemplateNodesDict = null; + m_internalTemplateNodesList = null; + + OnNodeRemovedEvent = null; + + m_masterNodeId = Constants.INVALID_NODE_ID; + m_validNodeId = 0; + m_instancePropertyCount = 0; + + m_nodeGrid.Destroy(); + m_nodeGrid = null; + + m_nodes.Clear(); + m_nodes = null; + + m_samplerNodes.Destroy(); + m_samplerNodes = null; + + m_propertyNodes.Destroy(); + m_propertyNodes = null; + + m_rawPropertyNodes.Destroy(); + m_rawPropertyNodes = null; + + m_customExpressionsOnFunctionMode.Destroy(); + m_customExpressionsOnFunctionMode = null; + + m_staticSwitchNodes.Destroy(); + m_staticSwitchNodes = null; + + m_functionInputNodes.Destroy(); + m_functionInputNodes = null; + + m_functionNodes.Destroy(); + m_functionNodes = null; + + m_functionOutputNodes.Destroy(); + m_functionOutputNodes = null; + + m_functionSwitchNodes.Destroy(); + m_functionSwitchNodes = null; + + m_functionSwitchCopyNodes.Destroy(); + m_functionSwitchCopyNodes = null; + + m_multiPassMasterNodes.Destroy(); + m_multiPassMasterNodes = null; + + for( int i = 0; i < m_lodMultiPassMasterNodes.Count; i++ ) + { + m_lodMultiPassMasterNodes[ i ].Destroy(); + m_lodMultiPassMasterNodes[ i ] = null; + } + m_lodMultiPassMasterNodes.Clear(); + m_lodMultiPassMasterNodes = null; + + m_texturePropertyNodes.Destroy(); + m_texturePropertyNodes = null; + + m_textureArrayNodes.Destroy(); + m_textureArrayNodes = null; + + m_screenColorNodes.Destroy(); + m_screenColorNodes = null; + + m_localVarNodes.Destroy(); + m_localVarNodes = null; + + m_globalArrayNodes.Destroy(); + m_globalArrayNodes = null; + + m_selectedNodes.Clear(); + m_selectedNodes = null; + + m_markedForDeletion.Clear(); + m_markedForDeletion = null; + + + m_nodesDict.Clear(); + m_nodesDict = null; + + m_nodePreviewList.Clear(); + m_nodePreviewList = null; + + IsDirty = true; + + OnNodeEvent = null; + OnDuplicateEvent = null; + //m_currentShaderFunction = null; + + OnMaterialUpdatedEvent = null; + OnShaderUpdatedEvent = null; + OnEmptyGraphDetectedEvt = null; + + nodeStyleOff = null; + nodeStyleOn = null; + nodeTitle = null; + commentaryBackground = null; + + OnLODMasterNodesAddedEvent = null; + } + + void OnNodeChangeSizeEvent( ParentNode node ) + { + m_nodeGrid.RemoveNodeFromGrid( node, true ); + m_nodeGrid.AddNodeToGrid( node ); + } + + public void OnNodeFinishMoving( ParentNode node, bool testOnlySelected, InteractionMode interactionMode ) + { + if( OnNodeEvent != null ) + { + OnNodeEvent( node ); + SaveIsDirty = true; + } + + m_nodeGrid.RemoveNodeFromGrid( node, true ); + m_nodeGrid.AddNodeToGrid( node ); + + //if( testOnlySelected ) + //{ + // for( int i = m_visibleNodes.Count - 1; i > -1; i-- ) + // { + // if( node.UniqueId != m_visibleNodes[ i ].UniqueId ) + // { + // switch( interactionMode ) + // { + // case InteractionMode.Target: + // { + // node.OnNodeInteraction( m_visibleNodes[ i ] ); + // } + // break; + // case InteractionMode.Other: + // { + // m_visibleNodes[ i ].OnNodeInteraction( node ); + // } + // break; + // case InteractionMode.Both: + // { + // node.OnNodeInteraction( m_visibleNodes[ i ] ); + // m_visibleNodes[ i ].OnNodeInteraction( node ); + // } + // break; + // } + // } + // } + //} + //else + { + for( int i = m_nodes.Count - 1; i > -1; i-- ) + { + if( node.UniqueId != m_nodes[ i ].UniqueId ) + { + switch( interactionMode ) + { + case InteractionMode.Target: + { + node.OnNodeInteraction( m_nodes[ i ] ); + } + break; + case InteractionMode.Other: + { + m_nodes[ i ].OnNodeInteraction( node ); + } + break; + case InteractionMode.Both: + { + node.OnNodeInteraction( m_nodes[ i ] ); + m_nodes[ i ].OnNodeInteraction( node ); + } + break; + } + } + } + } + } + + + public void OnNodeReOrderEvent( ParentNode node, int index ) + { + if( node.Depth < index ) + { + Debug.LogWarning( "Reorder canceled: This is a specific method for when reordering needs to be done and a its original index is higher than the new one" ); + } + else + { + m_nodes.Remove( node ); + m_nodes.Insert( index, node ); + m_markToReOrder = true; + } + } + + public void AddNode( ParentNode node, bool updateId = false, bool addLast = true, bool registerUndo = true, bool fetchMaterialValues = true ) + { + if( registerUndo ) + { + UIUtils.MarkUndoAction(); + Undo.RegisterCompleteObjectUndo( ParentWindow, Constants.UndoCreateNodeId ); + Undo.RegisterCompleteObjectUndo( this, Constants.UndoCreateNodeId ); + Undo.RegisterCreatedObjectUndo( node, Constants.UndoCreateNodeId ); + } + + if( OnNodeEvent != null ) + { + OnNodeEvent( node ); + } + if( updateId ) + { + node.UniqueId = GetValidId(); + } + else + { + UpdateIdFromNode( node ); + } + + + + if( addLast ) + { + m_nodes.Add( node ); + node.Depth = m_nodes.Count; + } + else + { + m_nodes.Insert( 0, node ); + node.Depth = 0; + } + + if( m_nodesDict.ContainsKey( node.UniqueId ) ) + { + //m_nodesDict[ node.UniqueId ] = node; + m_foundDuplicates = true; + } + else + { + m_nodesDict.Add( node.UniqueId, node ); + node.SetMaterialMode( CurrentMaterial, fetchMaterialValues ); + } + + m_nodeGrid.AddNodeToGrid( node ); + node.OnNodeChangeSizeEvent += OnNodeChangeSizeEvent; + node.OnNodeReOrderEvent += OnNodeReOrderEvent; + IsDirty = true; + } + + public void CheckForDuplicates() + { + if( m_foundDuplicates ) + { + Debug.LogWarning( "Found duplicates:" ); + m_foundDuplicates = false; + m_nodesDict.Clear(); + int count = m_nodes.Count; + for( int i = 0; i < count; i++ ) + { + if( m_nodesDict.ContainsKey( m_nodes[ i ].UniqueId ) ) + { + m_nodes[ i ].UniqueId = GetValidId(); + m_nodesDict.Add( m_nodes[ i ].UniqueId, m_nodes[ i ] ); + Debug.LogWarning( "Assigning new ID to " + m_nodes[ i ].TypeName ); + } + else + { + m_nodesDict.Add( m_nodes[ i ].UniqueId, m_nodes[ i ] ); + } + } + } + } + + public ParentNode GetClickedNode() + { + if( m_nodeClicked < 0 ) + return null; + return GetNode( m_nodeClicked ); + } + + public PropertyNode GetInternalTemplateNode( int nodeId ) + { + if( m_internalTemplateNodesDict.Count != m_internalTemplateNodesList.Count ) + { + m_internalTemplateNodesDict.Clear(); + int count = m_internalTemplateNodesList.Count; + for( int i = 0; i < m_internalTemplateNodesList.Count; i++ ) + { + if( m_internalTemplateNodesList[ i ] != null ) + m_internalTemplateNodesDict.Add( m_internalTemplateNodesList[ i ].UniqueId, m_internalTemplateNodesList[ i ] ); + } + } + + if( m_internalTemplateNodesDict.ContainsKey( nodeId ) ) + return m_internalTemplateNodesDict[ nodeId ]; + + return null; + } + + public PropertyNode GetInternalTemplateNode( string propertyName ) + { + return m_internalTemplateNodesList.Find( ( x ) => x.PropertyName.Equals( propertyName ) ); + } + + public void AddInternalTemplateNode( TemplateShaderPropertyData data ) + { + PropertyNode propertyNode = null; + switch( data.PropertyDataType ) + { + case WirePortDataType.FLOAT: + propertyNode = CreateInstance(); break; + case WirePortDataType.FLOAT4: + propertyNode = CreateInstance(); + break; + case WirePortDataType.COLOR: + propertyNode = CreateInstance(); + break; + case WirePortDataType.INT: + propertyNode = CreateInstance(); break; + case WirePortDataType.SAMPLER1D: + case WirePortDataType.SAMPLER2D: + case WirePortDataType.SAMPLER3D: + case WirePortDataType.SAMPLERCUBE: + case WirePortDataType.SAMPLER2DARRAY: + propertyNode = CreateInstance(); + break; + default: return; + } + + propertyNode.PropertyNameFromTemplate( data ); + + // Create a negative unique Id to separate it from + // the regular ids on the main nodes list + // Its begins at -2 since -1 is used to detect invalid values + int uniqueId = -( m_internalTemplateNodesList.Count + 2 ); + propertyNode.SetBaseUniqueId( uniqueId ); + + //Register into Float/Int Nodes list to be available inline + // Unique Id must be already set at this point to properly + // create array + if( data.PropertyDataType == WirePortDataType.FLOAT || + data.PropertyDataType == WirePortDataType.INT ) + m_floatNodes.AddNode( propertyNode ); + + m_internalTemplateNodesList.Add( propertyNode ); + m_internalTemplateNodesDict.Add( uniqueId, propertyNode ); + } + + public void ClearInternalTemplateNodes() + { + if( m_internalTemplateNodesList != null ) + { + int count = m_internalTemplateNodesList.Count; + for( int i = 0; i < count; i++ ) + { + m_internalTemplateNodesList[ i ].Destroy(); + GameObject.DestroyImmediate( m_internalTemplateNodesList[ i ] ); + } + + m_internalTemplateNodesList.Clear(); + m_internalTemplateNodesDict.Clear(); + } + } + + public ParentNode GetNode( int nodeId ) + { + if( m_nodesDict.Count != m_nodes.Count ) + { + m_nodesDict.Clear(); + int count = m_nodes.Count; + for( int i = 0; i < count; i++ ) + { + if( m_nodes[ i ] != null && !m_nodesDict.ContainsKey( m_nodes[ i ].UniqueId ) ) + m_nodesDict.Add( m_nodes[ i ].UniqueId, m_nodes[ i ] ); + } + } + + if( m_nodesDict.ContainsKey( nodeId ) ) + return m_nodesDict[ nodeId ]; + + return null; + } + + public void ForceReOrder() + { + m_nodes.Sort( ( x, y ) => x.Depth.CompareTo( y.Depth ) ); + } + + public bool Draw( DrawInfo drawInfo ) + { + MasterNode masterNode = GetNode( m_masterNodeId ) as MasterNode; + if( m_forceCategoryRefresh && masterNode != null ) + { + masterNode.RefreshAvailableCategories(); + m_forceCategoryRefresh = false; + } + + SaveIsDirty = false; + if( m_afterDeserializeFlag ) + { + // this is now done after logic update... templates needs it this way + //m_afterDeserializeFlag = false; + + CleanCorruptedNodes(); + if( m_nodes.Count == 0 ) + { + //TODO: remove this temp from here + NodeAvailability cachedCanvas = CurrentCanvasMode; + ParentWindow.CreateNewGraph( "Empty" ); + CurrentCanvasMode = cachedCanvas; + if( OnEmptyGraphDetectedEvt != null ) + { + OnEmptyGraphDetectedEvt( this ); + SaveIsDirty = false; + } + else + { + SaveIsDirty = true; + } + } + + //for( int i = 0; i < m_nodes.Count; i++ ) + //{ + // m_nodes[ i ].SetContainerGraph( this ); + //} + } + + if( drawInfo.CurrentEventType == EventType.Repaint ) + { + if( m_markedToDeSelect ) + DeSelectAll(); + + if( m_markToSelect > -1 ) + { + AddToSelectedNodes( GetNode( m_markToSelect ) ); + m_markToSelect = -1; + } + + if( m_markToReOrder ) + { + m_markToReOrder = false; + int nodesCount = m_nodes.Count; + for( int i = 0; i < nodesCount; i++ ) + { + m_nodes[ i ].Depth = i; + } + } + } + + if( drawInfo.CurrentEventType == EventType.Repaint ) + { + // Resizing Nods per LOD level + NodeLOD newLevel = NodeLOD.LOD0; + float referenceValue; + if( drawInfo.InvertedZoom > 0.5f ) + { + newLevel = NodeLOD.LOD0; + referenceValue = 4; + } + else if( drawInfo.InvertedZoom > 0.25f ) + { + newLevel = NodeLOD.LOD1; + referenceValue = 2; + } + else if( drawInfo.InvertedZoom > 0.15f ) + { + newLevel = NodeLOD.LOD2; + referenceValue = 1; + } + else if( drawInfo.InvertedZoom > 0.1f ) + { + newLevel = NodeLOD.LOD3; + referenceValue = 0; + } + else if( drawInfo.InvertedZoom > 0.07f ) + { + newLevel = NodeLOD.LOD4; + referenceValue = 0; + } + else + { + newLevel = NodeLOD.LOD5; + referenceValue = 0; + } + + // Just a sanity check + nodeStyleOff = UIUtils.GetCustomStyle( CustomStyle.NodeWindowOff ); + nodeStyleOn = UIUtils.GetCustomStyle( CustomStyle.NodeWindowOn );//= UIUtils.GetCustomStyle( CustomStyle.NodeWindowOn ); + nodeTitle = UIUtils.GetCustomStyle( CustomStyle.NodeHeader ); + commentaryBackground = UIUtils.GetCustomStyle( CustomStyle.CommentaryBackground ); + + if( newLevel != m_lodLevel || ( UIUtils.MainSkin != null && UIUtils.MainSkin.textField.border.left != referenceValue ) ) + { + m_lodLevel = newLevel; + switch( m_lodLevel ) + { + default: + case NodeLOD.LOD0: + { + UIUtils.MainSkin.textField.border = UIUtils.RectOffsetFour; + nodeStyleOff.border = UIUtils.RectOffsetSix; + UIUtils.NodeWindowOffSquare.border = UIUtils.RectOffsetFour; + + nodeStyleOn.border = UIUtils.RectOffsetSix; + UIUtils.NodeWindowOnSquare.border = UIUtils.RectOffsetSix; + + nodeTitle.border.left = 6; + nodeTitle.border.right = 6; + nodeTitle.border.top = 6; + nodeTitle.border.bottom = 4; + + UIUtils.NodeHeaderSquare.border = UIUtils.RectOffsetFour; + commentaryBackground.border = UIUtils.RectOffsetSix; + } + break; + case NodeLOD.LOD1: + { + UIUtils.MainSkin.textField.border = UIUtils.RectOffsetTwo; + nodeStyleOff.border = UIUtils.RectOffsetFive; + UIUtils.NodeWindowOffSquare.border = UIUtils.RectOffsetFive; + + nodeStyleOn.border = UIUtils.RectOffsetFive; + UIUtils.NodeWindowOnSquare.border = UIUtils.RectOffsetFour; + + nodeTitle.border.left = 5; + nodeTitle.border.right = 5; + nodeTitle.border.top = 5; + nodeTitle.border.bottom = 2; + + UIUtils.NodeHeaderSquare.border = UIUtils.RectOffsetThree; + commentaryBackground.border = UIUtils.RectOffsetFive; + } + break; + case NodeLOD.LOD2: + { + UIUtils.MainSkin.textField.border = UIUtils.RectOffsetOne; + + nodeStyleOff.border.left = 2; + nodeStyleOff.border.right = 2; + nodeStyleOff.border.top = 2; + nodeStyleOff.border.bottom = 3; + + UIUtils.NodeWindowOffSquare.border = UIUtils.RectOffsetThree; + + nodeStyleOn.border.left = 4; + nodeStyleOn.border.right = 4; + nodeStyleOn.border.top = 4; + nodeStyleOn.border.bottom = 3; + + UIUtils.NodeWindowOnSquare.border = UIUtils.RectOffsetThree; + + nodeTitle.border = UIUtils.RectOffsetTwo; + UIUtils.NodeHeaderSquare.border = UIUtils.RectOffsetTwo; + + commentaryBackground.border.left = 2; + commentaryBackground.border.right = 2; + commentaryBackground.border.top = 2; + commentaryBackground.border.bottom = 3; + } + break; + case NodeLOD.LOD3: + case NodeLOD.LOD4: + case NodeLOD.LOD5: + { + UIUtils.MainSkin.textField.border = UIUtils.RectOffsetZero; + + nodeStyleOff.border.left = 1; + nodeStyleOff.border.right = 1; + nodeStyleOff.border.top = 1; + nodeStyleOff.border.bottom = 2; + + UIUtils.NodeWindowOffSquare.border = UIUtils.RectOffsetTwo; + + nodeStyleOn.border = UIUtils.RectOffsetTwo; + UIUtils.NodeWindowOnSquare.border = UIUtils.RectOffsetTwo; + + nodeTitle.border = UIUtils.RectOffsetOne; + UIUtils.NodeHeaderSquare.border = UIUtils.RectOffsetOne; + + commentaryBackground.border.left = 1; + commentaryBackground.border.right = 1; + commentaryBackground.border.top = 1; + commentaryBackground.border.bottom = 2; + } + break; + } + } + } + + //m_visibleNodes.Clear(); + //int nullCount = 0; + m_hasUnConnectedNodes = false; + bool repaint = false; + Material currentMaterial = masterNode != null ? masterNode.CurrentMaterial : null; + EditorGUI.BeginChangeCheck(); + bool repaintMaterialInspector = false; + + int nodeCount = m_nodes.Count; + for( int i = 0; i < nodeCount; i++ ) + { + m_nodes[ i ].OnNodeLogicUpdate( drawInfo ); + } + + if( m_afterDeserializeFlag || m_lateOptionsRefresh ) + { + m_afterDeserializeFlag = false; + m_lateOptionsRefresh = false; + if( CurrentCanvasMode == NodeAvailability.TemplateShader ) + { + RefreshLinkedMasterNodes( true ); + OnRefreshLinkedPortsComplete(); + //If clipboard has cached nodes then a master node replacement will take place + //We need to re-cache master nodes to ensure applied options are correctly cached + //As first cache happens before that + if( m_parentWindow.ClipboardInstance.HasCachedMasterNodes ) + { + m_parentWindow.ClipboardInstance.AddMultiPassNodesToClipboard( MultiPassMasterNodes.NodesList,true,-1 ); + for( int i = 0; i < m_lodMultiPassMasterNodes.Count; i++ ) + { + if( m_lodMultiPassMasterNodes[ i ].Count > 0 ) + m_parentWindow.ClipboardInstance.AddMultiPassNodesToClipboard( m_lodMultiPassMasterNodes[ i ].NodesList, false, i ); + } + } + //RepositionTemplateNodes( CurrentMasterNode ); + } + } + + if( m_forceRepositionCheck ) + { + RepositionTemplateNodes( CurrentMasterNode ); + } + + //for( int i = 0; i < m_functionNodes.NodesList.Count; i++ ) + //{ + // m_functionNodes.NodesList[ i ].LogicGraph(); + //} + + //for( int i = 0; i < UIUtils.FunctionSwitchCopyList().Count; i++ ) + //{ + // UIUtils.FunctionSwitchCopyList()[ i ].CheckReference(); + //} + + + + // Dont use nodeCount variable because node count can change in this loop??? + nodeCount = m_nodes.Count; + ParentNode node = null; + for( int i = 0; i < nodeCount; i++ ) + { + node = m_nodes[ i ]; + if( !node.IsOnGrid ) + { + m_nodeGrid.AddNodeToGrid( node ); + } + + node.MovingInFrame = false; + + if( drawInfo.CurrentEventType == EventType.Repaint ) + node.OnNodeLayout( drawInfo ); + + m_hasUnConnectedNodes = m_hasUnConnectedNodes || + ( node.ConnStatus != NodeConnectionStatus.Connected && node.ConnStatus != NodeConnectionStatus.Island ); + + if( node.RequireMaterialUpdate && currentMaterial != null ) + { + node.UpdateMaterial( currentMaterial ); + repaintMaterialInspector = true; + } + + //if( node.IsVisible ) + // m_visibleNodes.Add( node ); + + IsDirty = ( m_isDirty || node.IsDirty ); + SaveIsDirty = ( m_saveIsDirty || node.SaveIsDirty ); + } + + // Handles GUI controls + nodeCount = m_nodes.Count; + for( int i = nodeCount - 1; i >= 0; i-- ) + //for ( int i = 0; i < nodeCount; i++ ) + { + node = m_nodes[ i ]; + bool restoreMouse = false; + if( drawInfo.CurrentEventType == EventType.MouseDown && m_nodeClicked > -1 && node.UniqueId != m_nodeClicked ) + { + restoreMouse = true; + drawInfo.CurrentEventType = EventType.Ignore; + } + + node.DrawGUIControls( drawInfo ); + + if( restoreMouse ) + { + drawInfo.CurrentEventType = EventType.MouseDown; + } + } + + // Draw connection wires + if( drawInfo.CurrentEventType == EventType.Repaint ) + DrawWires( ParentWindow.WireTexture, drawInfo, ParentWindow.WindowContextPallete.IsActive, ParentWindow.WindowContextPallete.CurrentPosition ); + + // Master Draw + nodeCount = m_nodes.Count; + for( int i = 0; i < nodeCount; i++ ) + { + node = m_nodes[ i ]; + bool restoreMouse = false; + if( drawInfo.CurrentEventType == EventType.MouseDown && m_nodeClicked > -1 && node.UniqueId != m_nodeClicked ) + { + restoreMouse = true; + drawInfo.CurrentEventType = EventType.Ignore; + } + + node.Draw( drawInfo ); + + if( restoreMouse ) + { + drawInfo.CurrentEventType = EventType.MouseDown; + } + } + + // Draw Tooltip + if( drawInfo.CurrentEventType == EventType.Repaint || drawInfo.CurrentEventType == EventType.MouseDown ) + { + nodeCount = m_nodes.Count; + for( int i = nodeCount - 1; i >= 0; i-- ) + { + node = m_nodes[ i ]; + if( node.IsVisible && !node.IsMoving ) + { + bool showing = node.ShowTooltip( drawInfo ); + if( showing ) + break; + } + } + } + + if( repaintMaterialInspector ) + { + if( ASEMaterialInspector.Instance != null ) + { + ASEMaterialInspector.Instance.Repaint(); + } + } + + if( m_checkSelectedWireHighlights ) + { + m_checkSelectedWireHighlights = false; + ResetHighlightedWires(); + for( int i = 0; i < m_selectedNodes.Count; i++ ) + { + HighlightWiresStartingNode( m_selectedNodes[ i ] ); + } + } + + if( EditorGUI.EndChangeCheck() ) + { + SaveIsDirty = true; + repaint = true; + } + + if( drawInfo.CurrentEventType == EventType.Repaint ) + { + // Revert LOD changes to LOD0 (only if it's different) + if( UIUtils.MainSkin.textField.border.left != 4 ) + { + UIUtils.MainSkin.textField.border = UIUtils.RectOffsetFour; + nodeStyleOff.border = UIUtils.RectOffsetSix; + UIUtils.NodeWindowOffSquare.border = UIUtils.RectOffsetFour; + + nodeStyleOn.border = UIUtils.RectOffsetSix; + UIUtils.NodeWindowOnSquare.border = UIUtils.RectOffsetSix; + + nodeTitle.border.left = 6; + nodeTitle.border.right = 6; + nodeTitle.border.top = 6; + nodeTitle.border.bottom = 4; + + UIUtils.NodeHeaderSquare.border = UIUtils.RectOffsetFour; + commentaryBackground.border = UIUtils.RectOffsetSix; + } + } + + //if ( nullCount == m_nodes.Count ) + // m_nodes.Clear(); + + ChangedLightingModel = false; + + return repaint; + } + + public bool UpdateMarkForDeletion() + { + if( m_markedForDeletion.Count != 0 ) + { + DeleteMarkedForDeletionNodes(); + return true; + } + return false; + } + + public void DrawWires( Texture2D wireTex, DrawInfo drawInfo, bool contextPaletteActive, Vector3 contextPalettePos ) + { + //Handles.BeginGUI(); + //Debug.Log(GUI.depth); + // Draw connected node wires + m_wireBezierCount = 0; + for( int nodeIdx = 0; nodeIdx < m_nodes.Count; nodeIdx++ ) + { + ParentNode node = m_nodes[ nodeIdx ]; + if( (object)node == null ) + return; + + for( int inputPortIdx = 0; inputPortIdx < node.InputPorts.Count; inputPortIdx++ ) + { + InputPort inputPort = node.InputPorts[ inputPortIdx ]; + if( inputPort.ExternalReferences.Count > 0 && inputPort.Visible ) + { + bool cleanInvalidConnections = false; + for( int wireIdx = 0; wireIdx < inputPort.ExternalReferences.Count; wireIdx++ ) + { + WireReference reference = inputPort.ExternalReferences[ wireIdx ]; + if( reference.NodeId != -1 && reference.PortId != -1 ) + { + ParentNode outputNode = GetNode( reference.NodeId ); + if( outputNode != null ) + { + OutputPort outputPort = outputNode.GetOutputPortByUniqueId( reference.PortId ); + Vector3 endPos = new Vector3( inputPort.Position.x, inputPort.Position.y ); + Vector3 startPos = new Vector3( outputPort.Position.x, outputPort.Position.y ); + float x = ( startPos.x < endPos.x ) ? startPos.x : endPos.x; + float y = ( startPos.y < endPos.y ) ? startPos.y : endPos.y; + float width = Mathf.Abs( startPos.x - endPos.x ) + outputPort.Position.width; + float height = Mathf.Abs( startPos.y - endPos.y ) + outputPort.Position.height; + Rect portsBoundingBox = new Rect( x, y, width, height ); + + bool isVisible = node.IsVisible || outputNode.IsVisible; + if( !isVisible ) + { + isVisible = drawInfo.TransformedCameraArea.Overlaps( portsBoundingBox ); + } + + if( isVisible ) + { + + Rect bezierBB = DrawBezier( drawInfo.InvertedZoom, startPos, endPos, inputPort.DataType, outputPort.DataType, node.GetInputPortVisualDataTypeByArrayIdx( inputPortIdx ), outputNode.GetOutputPortVisualDataTypeById( reference.PortId ), reference.WireStatus, wireTex, node, outputNode ); + bezierBB.x -= Constants.OUTSIDE_WIRE_MARGIN; + bezierBB.y -= Constants.OUTSIDE_WIRE_MARGIN; + + bezierBB.width += Constants.OUTSIDE_WIRE_MARGIN * 2; + bezierBB.height += Constants.OUTSIDE_WIRE_MARGIN * 2; + + if( m_wireBezierCount < m_bezierReferences.Count ) + { + m_bezierReferences[ m_wireBezierCount ].UpdateInfo( ref bezierBB, inputPort.NodeId, inputPort.PortId, outputPort.NodeId, outputPort.PortId ); + } + else + { + m_bezierReferences.Add( new WireBezierReference( ref bezierBB, inputPort.NodeId, inputPort.PortId, outputPort.NodeId, outputPort.PortId ) ); + } + m_wireBezierCount++; + + } + } + else + { + if( DebugConsoleWindow.DeveloperMode ) + UIUtils.ShowMessage( "Detected Invalid connection from node " + node.UniqueId + " port " + inputPortIdx + " to Node " + reference.NodeId + " port " + reference.PortId, MessageSeverity.Error ); + cleanInvalidConnections = true; + inputPort.ExternalReferences[ wireIdx ].Invalidate(); + } + } + } + + if( cleanInvalidConnections ) + { + inputPort.RemoveInvalidConnections(); + } + } + } + } + + //Draw selected wire + if( m_parentWindow.WireReferenceUtils.ValidReferences() ) + { + if( m_parentWindow.WireReferenceUtils.InputPortReference.IsValid ) + { + InputPort inputPort = GetNode( m_parentWindow.WireReferenceUtils.InputPortReference.NodeId ).GetInputPortByUniqueId( m_parentWindow.WireReferenceUtils.InputPortReference.PortId ); + Vector3 endPos = Vector3.zero; + if( m_parentWindow.WireReferenceUtils.SnapEnabled ) + { + Vector2 pos = ( m_parentWindow.WireReferenceUtils.SnapPosition + drawInfo.CameraOffset ) * drawInfo.InvertedZoom; + endPos = new Vector3( pos.x, pos.y ) + UIUtils.ScaledPortsDelta; + } + else + { + endPos = contextPaletteActive ? contextPalettePos : new Vector3( Event.current.mousePosition.x, Event.current.mousePosition.y ); + } + + Vector3 startPos = new Vector3( inputPort.Position.x, inputPort.Position.y ); + DrawBezier( drawInfo.InvertedZoom, endPos, startPos, inputPort.DataType, inputPort.DataType, inputPort.DataType, inputPort.DataType, WireStatus.Default, wireTex ); + } + + if( m_parentWindow.WireReferenceUtils.OutputPortReference.IsValid ) + { + OutputPort outputPort = GetNode( m_parentWindow.WireReferenceUtils.OutputPortReference.NodeId ).GetOutputPortByUniqueId( m_parentWindow.WireReferenceUtils.OutputPortReference.PortId ); + Vector3 endPos = Vector3.zero; + if( m_parentWindow.WireReferenceUtils.SnapEnabled ) + { + Vector2 pos = ( m_parentWindow.WireReferenceUtils.SnapPosition + drawInfo.CameraOffset ) * drawInfo.InvertedZoom; + endPos = new Vector3( pos.x, pos.y ) + UIUtils.ScaledPortsDelta; + } + else + { + endPos = contextPaletteActive ? contextPalettePos : new Vector3( Event.current.mousePosition.x, Event.current.mousePosition.y ); + } + Vector3 startPos = new Vector3( outputPort.Position.x, outputPort.Position.y ); + DrawBezier( drawInfo.InvertedZoom, startPos, endPos, outputPort.DataType, outputPort.DataType, outputPort.DataType, outputPort.DataType, WireStatus.Default, wireTex ); + } + } + //Handles.EndGUI(); + } + + Rect DrawBezier( float invertedZoom, Vector3 startPos, Vector3 endPos, WirePortDataType inputDataType, WirePortDataType outputDataType, WirePortDataType inputVisualDataType, WirePortDataType outputVisualDataType, WireStatus wireStatus, Texture2D wireTex, ParentNode inputNode = null, ParentNode outputNode = null ) + { + startPos += UIUtils.ScaledPortsDelta; + endPos += UIUtils.ScaledPortsDelta; + + // Calculate the 4 points for bezier taking into account wire nodes and their automatic tangents + float mag = ( endPos - startPos ).magnitude; + float resizedMag = Mathf.Min( mag * 0.66f, Constants.HORIZONTAL_TANGENT_SIZE * invertedZoom ); + + Vector3 startTangent = new Vector3( startPos.x + resizedMag, startPos.y ); + Vector3 endTangent = new Vector3( endPos.x - resizedMag, endPos.y ); + + if( (object)inputNode != null && inputNode.GetType() == typeof( WireNode ) ) + endTangent = endPos + ( ( inputNode as WireNode ).TangentDirection ) * mag * 0.33f; + + if( (object)outputNode != null && outputNode.GetType() == typeof( WireNode ) ) + startTangent = startPos - ( ( outputNode as WireNode ).TangentDirection ) * mag * 0.33f; + + ///////////////Draw tangents + //Rect box1 = new Rect( new Vector2( startTangent.x, startTangent.y ), new Vector2( 10, 10 ) ); + //box1.x -= box1.width * 0.5f; + //box1.y -= box1.height * 0.5f; + //GUI.Label( box1, string.Empty, UIUtils.Box ); + + //Rect box2 = new Rect( new Vector2( endTangent.x, endTangent.y ), new Vector2( 10, 10 ) ); + //box2.x -= box2.width * 0.5f; + //box2.y -= box2.height * 0.5f; + //GUI.Label( box2, string.Empty, UIUtils.Box ); + + //m_auxRect.Set( 0, 0, UIUtils.CurrentWindow.position.width, UIUtils.CurrentWindow.position.height ); + //GLDraw.BeginGroup( m_auxRect ); + + int ty = 1; + float wireThickness = 0; + + + if( ParentWindow.Options.MultiLinePorts ) + { + GLDraw.MultiLine = true; + Shader.SetGlobalFloat( "_InvertedZoom", invertedZoom ); + + WirePortDataType smallest = ( (int)outputDataType < (int)inputDataType ? outputDataType : inputDataType ); + smallest = ( (int)smallest < (int)outputVisualDataType ? smallest : outputVisualDataType ); + smallest = ( (int)smallest < (int)inputVisualDataType ? smallest : inputVisualDataType ); + + switch( smallest ) + { + case WirePortDataType.FLOAT2: ty = 2; break; + case WirePortDataType.FLOAT3: ty = 3; break; + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: + { + ty = 4; + } + break; + default: ty = 1; break; + } + wireThickness = Mathf.Lerp( Constants.WIRE_WIDTH * ( ty * invertedZoom * -0.05f + 0.15f ), Constants.WIRE_WIDTH * ( ty * invertedZoom * 0.175f + 0.3f ), invertedZoom + 0.4f ); + } + else + { + GLDraw.MultiLine = false; + wireThickness = Mathf.Lerp( Constants.WIRE_WIDTH * ( invertedZoom * -0.05f + 0.15f ), Constants.WIRE_WIDTH * ( invertedZoom * 0.175f + 0.3f ), invertedZoom + 0.4f ); + } + + Rect boundBox = new Rect(); + int segments = 11; + if( LodLevel <= ParentGraph.NodeLOD.LOD4 ) + segments = Mathf.Clamp( Mathf.FloorToInt( mag * 0.2f * invertedZoom ), 11, 35 ); + else + segments = (int)( invertedZoom * 14.28f * 11 ); + + if( ParentWindow.Options.ColoredPorts && wireStatus != WireStatus.Highlighted ) + boundBox = GLDraw.DrawBezier( startPos, startTangent, endPos, endTangent, UIUtils.GetColorForDataType( outputVisualDataType, false, false ), UIUtils.GetColorForDataType( inputVisualDataType, false, false ), wireThickness, segments, ty ); + else + boundBox = GLDraw.DrawBezier( startPos, startTangent, endPos, endTangent, UIUtils.GetColorFromWireStatus( wireStatus ), wireThickness, segments, ty ); + //GLDraw.EndGroup(); + + //GUI.Box( m_auxRect, string.Empty, UIUtils.CurrentWindow.CustomStylesInstance.Box ); + //GUI.Box( boundBox, string.Empty, UIUtils.CurrentWindow.CustomStylesInstance.Box ); + //if ( UIUtils.CurrentWindow.Options.ColoredPorts && wireStatus != WireStatus.Highlighted ) + // Handles.DrawBezier( startPos, endPos, startTangent, endTangent, UIUtils.GetColorForDataType( outputDataType, false, false ), wireTex, wiresTickness ); + //else + // Handles.DrawBezier( startPos, endPos, startTangent, endTangent, UIUtils.GetColorFromWireStatus( wireStatus ), wireTex, wiresTickness ); + + //Handles.DrawLine( startPos, startTangent ); + //Handles.DrawLine( endPos, endTangent ); + + float extraBound = 30 * invertedZoom; + boundBox.xMin -= extraBound; + boundBox.xMax += extraBound; + boundBox.yMin -= extraBound; + boundBox.yMax += extraBound; + + return boundBox; + } + + public void DrawBezierBoundingBox() + { + for( int i = 0; i < m_wireBezierCount; i++ ) + { + m_bezierReferences[ i ].DebugDraw(); + } + } + + public WireBezierReference GetWireBezierInPos( Vector2 position ) + { + for( int i = 0; i < m_wireBezierCount; i++ ) + { + if( m_bezierReferences[ i ].Contains( position ) ) + return m_bezierReferences[ i ]; + } + return null; + } + + + public List GetWireBezierListInPos( Vector2 position ) + { + List list = new List(); + for( int i = 0; i < m_wireBezierCount; i++ ) + { + if( m_bezierReferences[ i ].Contains( position ) ) + list.Add( m_bezierReferences[ i ] ); + } + + return list; + } + + + public void MoveSelectedNodes( Vector2 delta, bool snap = false ) + { + //bool validMovement = delta.magnitude > 0.001f; + //if ( validMovement ) + //{ + // Undo.RegisterCompleteObjectUndo( ParentWindow, Constants.UndoMoveNodesId ); + // for ( int i = 0; i < m_selectedNodes.Count; i++ ) + // { + // if ( !m_selectedNodes[ i ].MovingInFrame ) + // { + // Undo.RecordObject( m_selectedNodes[ i ], Constants.UndoMoveNodesId ); + // m_selectedNodes[ i ].Move( delta, snap ); + // } + // } + // IsDirty = true; + //} + + bool performUndo = delta.magnitude > 0.01f; + if( performUndo ) + { + Undo.RegisterCompleteObjectUndo( ParentWindow, Constants.UndoMoveNodesId ); + Undo.RegisterCompleteObjectUndo( this, Constants.UndoMoveNodesId ); + } + + for( int i = 0; i < m_selectedNodes.Count; i++ ) + { + if( !m_selectedNodes[ i ].MovingInFrame ) + { + if( performUndo ) + m_selectedNodes[ i ].RecordObject( Constants.UndoMoveNodesId ); + m_selectedNodes[ i ].Move( delta, snap ); + } + } + + IsDirty = true; + } + + public void SetConnection( int InNodeId, int InPortId, int OutNodeId, int OutPortId ) + { + ParentNode inNode = GetNode( InNodeId ); + ParentNode outNode = GetNode( OutNodeId ); + InputPort inputPort = null; + OutputPort outputPort = null; + if( inNode != null && outNode != null ) + { + inputPort = inNode.GetInputPortByUniqueId( InPortId ); + outputPort = outNode.GetOutputPortByUniqueId( OutPortId ); + if( inputPort != null && outputPort != null ) + { + if( inputPort.IsConnectedTo( OutNodeId, OutPortId ) || outputPort.IsConnectedTo( InNodeId, InPortId ) ) + { + if( DebugConsoleWindow.DeveloperMode ) + UIUtils.ShowMessage( "Node/Port already connected " + InNodeId, MessageSeverity.Error ); + return; + } + + if( !inputPort.CheckValidType( outputPort.DataType ) ) + { + if( DebugConsoleWindow.DeveloperMode ) + UIUtils.ShowIncompatiblePortMessage( true, inNode, inputPort, outNode, outputPort ); + return; + } + + if( !outputPort.CheckValidType( inputPort.DataType ) ) + { + + if( DebugConsoleWindow.DeveloperMode ) + UIUtils.ShowIncompatiblePortMessage( false, outNode, outputPort, inNode, inputPort ); + return; + } + if( !inputPort.Available || !outputPort.Available ) + { + if( DebugConsoleWindow.DeveloperMode ) + UIUtils.ShowMessage( "Ports not available to connection", MessageSeverity.Warning ); + + return; + } + + if( inputPort.ConnectTo( OutNodeId, OutPortId, outputPort.DataType, false ) ) + { + inNode.OnInputPortConnected( InPortId, OutNodeId, OutPortId ); + } + + + if( outputPort.ConnectTo( InNodeId, InPortId, inputPort.DataType, inputPort.TypeLocked ) ) + { + outNode.OnOutputPortConnected( OutPortId, InNodeId, InPortId ); + } + } + else if( (object)inputPort == null ) + { + if( DebugConsoleWindow.DeveloperMode ) + UIUtils.ShowMessage( "Input Port " + InPortId + " doesn't exist on node " + InNodeId, MessageSeverity.Error ); + } + else + { + if( DebugConsoleWindow.DeveloperMode ) + UIUtils.ShowMessage( "Output Port " + OutPortId + " doesn't exist on node " + OutNodeId, MessageSeverity.Error ); + } + } + else if( (object)inNode == null ) + { + if( DebugConsoleWindow.DeveloperMode ) + UIUtils.ShowMessage( "Input node " + InNodeId + " doesn't exist", MessageSeverity.Error ); + } + else + { + if( DebugConsoleWindow.DeveloperMode ) + UIUtils.ShowMessage( "Output node " + OutNodeId + " doesn't exist", MessageSeverity.Error ); + } + } + + public void CreateConnection( int inNodeId, int inPortId, int outNodeId, int outPortId, bool registerUndo = true ) + { + ParentNode outputNode = GetNode( outNodeId ); + if( outputNode != null ) + { + OutputPort outputPort = outputNode.GetOutputPortByUniqueId( outPortId ); + if( outputPort != null ) + { + ParentNode inputNode = GetNode( inNodeId ); + InputPort inputPort = inputNode.GetInputPortByUniqueId( inPortId ); + + if( !inputPort.CheckValidType( outputPort.DataType ) ) + { + UIUtils.ShowIncompatiblePortMessage( true, inputNode, inputPort, outputNode, outputPort ); + return; + } + + if( !outputPort.CheckValidType( inputPort.DataType ) ) + { + UIUtils.ShowIncompatiblePortMessage( false, outputNode, outputPort, inputNode, inputPort ); + return; + } + + inputPort.DummyAdd( outputPort.NodeId, outputPort.PortId ); + outputPort.DummyAdd( inNodeId, inPortId ); + + if( UIUtils.DetectNodeLoopsFrom( inputNode, new Dictionary() ) ) + { + inputPort.DummyRemove(); + outputPort.DummyRemove(); + m_parentWindow.WireReferenceUtils.InvalidateReferences(); + UIUtils.ShowMessage( "Infinite Loop detected" ); + Event.current.Use(); + return; + } + + inputPort.DummyRemove(); + outputPort.DummyRemove(); + + if( inputPort.IsConnected ) + { + DeleteConnection( true, inNodeId, inPortId, true, false, registerUndo ); + } + + //link output to input + if( outputPort.ConnectTo( inNodeId, inPortId, inputPort.DataType, inputPort.TypeLocked ) ) + outputNode.OnOutputPortConnected( outputPort.PortId, inNodeId, inPortId ); + + //link input to output + if( inputPort.ConnectTo( outputPort.NodeId, outputPort.PortId, outputPort.DataType, inputPort.TypeLocked ) ) + inputNode.OnInputPortConnected( inPortId, outputNode.UniqueId, outputPort.PortId ); + + MarkWireHighlights(); + } + SaveIsDirty = true; + //ParentWindow.ShaderIsModified = true; + } + } + + public void DeleteInvalidConnections() + { + int count = m_nodes.Count; + for( int nodeIdx = 0; nodeIdx < count; nodeIdx++ ) + { + { + int inputCount = m_nodes[ nodeIdx ].InputPorts.Count; + for( int inputIdx = 0; inputIdx < inputCount; inputIdx++ ) + { + if( !m_nodes[ nodeIdx ].InputPorts[ inputIdx ].Visible && + m_nodes[ nodeIdx ].InputPorts[ inputIdx ].IsConnected && + !m_nodes[ nodeIdx ].InputPorts[ inputIdx ].IsDummy ) + { + DeleteConnection( true, m_nodes[ nodeIdx ].UniqueId, m_nodes[ nodeIdx ].InputPorts[ inputIdx ].PortId, true, true ); + } + } + } + { + int outputCount = m_nodes[ nodeIdx ].OutputPorts.Count; + for( int outputIdx = 0; outputIdx < outputCount; outputIdx++ ) + { + if( !m_nodes[ nodeIdx ].OutputPorts[ outputIdx ].Visible && m_nodes[ nodeIdx ].OutputPorts[ outputIdx ].IsConnected ) + { + DeleteConnection( false, m_nodes[ nodeIdx ].UniqueId, m_nodes[ nodeIdx ].OutputPorts[ outputIdx ].PortId, true, true ); + } + } + } + } + } + + public void DeleteAllConnectionFromNode( int nodeId, bool registerOnLog, bool propagateCallback, bool registerUndo ) + { + ParentNode node = GetNode( nodeId ); + if( (object)node == null ) + return; + DeleteAllConnectionFromNode( node, registerOnLog, propagateCallback, registerUndo ); + } + + public void DeleteAllConnectionFromNode( ParentNode node, bool registerOnLog, bool propagateCallback, bool registerUndo ) + { + + for( int i = 0; i < node.InputPorts.Count; i++ ) + { + if( node.InputPorts[ i ].IsConnected ) + DeleteConnection( true, node.UniqueId, node.InputPorts[ i ].PortId, registerOnLog, propagateCallback, registerUndo ); + } + + for( int i = 0; i < node.OutputPorts.Count; i++ ) + { + if( node.OutputPorts[ i ].IsConnected ) + DeleteConnection( false, node.UniqueId, node.OutputPorts[ i ].PortId, registerOnLog, propagateCallback, registerUndo ); + } + } + + public void DeleteConnection( bool isInput, int nodeId, int portId, bool registerOnLog, bool propagateCallback, bool registerUndo = true ) + { + ParentNode node = GetNode( nodeId ); + if( (object)node == null ) + return; + + if( registerUndo ) + { + UIUtils.MarkUndoAction(); + Undo.RegisterCompleteObjectUndo( ParentWindow, Constants.UndoDeleteConnectionId ); + Undo.RegisterCompleteObjectUndo( this, Constants.UndoDeleteConnectionId ); + node.RecordObject( Constants.UndoDeleteConnectionId ); + } + + if( isInput ) + { + InputPort inputPort = node.GetInputPortByUniqueId( portId ); + if( inputPort != null && inputPort.IsConnected ) + { + + if( node.ConnStatus == NodeConnectionStatus.Connected ) + { + node.DeactivateInputPortNode( portId, false ); + //inputPort.GetOutputNode().DeactivateNode( portId, false ); + m_checkSelectedWireHighlights = true; + } + + for( int i = 0; i < inputPort.ExternalReferences.Count; i++ ) + { + WireReference inputReference = inputPort.ExternalReferences[ i ]; + ParentNode outputNode = GetNode( inputReference.NodeId ); + if( registerUndo ) + outputNode.RecordObject( Constants.UndoDeleteConnectionId ); + outputNode.GetOutputPortByUniqueId( inputReference.PortId ).InvalidateConnection( inputPort.NodeId, inputPort.PortId ); + if( propagateCallback ) + outputNode.OnOutputPortDisconnected( inputReference.PortId ); + } + inputPort.InvalidateAllConnections(); + if( propagateCallback ) + node.OnInputPortDisconnected( portId ); + } + } + else + { + OutputPort outputPort = node.GetOutputPortByUniqueId( portId ); + if( outputPort != null && outputPort.IsConnected ) + { + if( propagateCallback ) + node.OnOutputPortDisconnected( portId ); + + for( int i = 0; i < outputPort.ExternalReferences.Count; i++ ) + { + WireReference outputReference = outputPort.ExternalReferences[ i ]; + ParentNode inputNode = GetNode( outputReference.NodeId ); + if( registerUndo ) + inputNode.RecordObject( Constants.UndoDeleteConnectionId ); + if( inputNode.ConnStatus == NodeConnectionStatus.Connected ) + { + node.DeactivateNode( portId, false ); + m_checkSelectedWireHighlights = true; + } + inputNode.GetInputPortByUniqueId( outputReference.PortId ).InvalidateConnection( outputPort.NodeId, outputPort.PortId ); + if( propagateCallback ) + { + // Removing WireNodes fires this after the rewiring ( and the OnInputPortConnected callback ) which causes incorrect behaviors + // If is connected is true then we're on that case so we don't fire the OnInputPortDisconnected + if( !inputNode.GetInputPortByUniqueId( outputReference.PortId ).IsConnected ) + inputNode.OnInputPortDisconnected( outputReference.PortId ); + } + } + outputPort.InvalidateAllConnections(); + } + } + IsDirty = true; + SaveIsDirty = true; + } + + //public void DeleteSelectedNodes() + //{ + // bool invalidateMasterNode = false; + // int count = m_selectedNodes.Count; + // for( int nodeIdx = 0; nodeIdx < count; nodeIdx++ ) + // { + // ParentNode node = m_selectedNodes[ nodeIdx ]; + // if( node.UniqueId == m_masterNodeId ) + // { + // invalidateMasterNode = true; + // } + // else + // { + // DestroyNode( node ); + // } + // } + + // if( invalidateMasterNode ) + // { + // CurrentOutputNode.Selected = false; + // } + // //Clear all references + // m_selectedNodes.Clear(); + // IsDirty = true; + //} + + public void DeleteNodesOnArray( ref ParentNode[] nodeArray ) + { + bool invalidateMasterNode = false; + for( int nodeIdx = 0; nodeIdx < nodeArray.Length; nodeIdx++ ) + { + ParentNode node = nodeArray[ nodeIdx ]; + if( node.UniqueId == m_masterNodeId ) + { + FunctionOutput fout = node as FunctionOutput; + if( fout != null ) + { + for( int i = 0; i < m_nodes.Count; i++ ) + { + FunctionOutput secondfout = m_nodes[ i ] as FunctionOutput; + if( secondfout != null && secondfout != fout ) + { + secondfout.Function = fout.Function; + AssignMasterNode( secondfout, false ); + + DeselectNode( fout ); + DestroyNode( fout ); + break; + } + } + } + invalidateMasterNode = true; + } + else + { + DeselectNode( node ); + DestroyNode( node ); + } + nodeArray[ nodeIdx ] = null; + } + + if( invalidateMasterNode && CurrentMasterNode != null ) + { + CurrentMasterNode.Selected = false; + } + + //Clear all references + nodeArray = null; + IsDirty = true; + } + + public void MarkWireNodeSequence( WireNode node, bool isInput ) + { + if( node == null ) + { + return; + } + + if( m_markedForDeletion.Contains( node ) ) + return; + + m_markedForDeletion.Add( node ); + + if( isInput && node.InputPorts[ 0 ].IsConnected ) + { + MarkWireNodeSequence( GetNode( node.InputPorts[ 0 ].ExternalReferences[ 0 ].NodeId ) as WireNode, isInput ); + } + else if( !isInput && node.OutputPorts[ 0 ].IsConnected ) + { + MarkWireNodeSequence( GetNode( node.OutputPorts[ 0 ].ExternalReferences[ 0 ].NodeId ) as WireNode, isInput ); + } + } + + public void UndoableDeleteSelectedNodes( List nodeList ) + { + if( nodeList.Count == 0 ) + return; + + List validNode = new List(); + + for( int i = 0; i < nodeList.Count; i++ ) + { + if( nodeList[ i ] != null && nodeList[ i ].UniqueId != m_masterNodeId ) + { + validNode.Add( nodeList[ i ] ); + } + } + UIUtils.ClearUndoHelper(); + ParentNode[] selectedNodes = new ParentNode[ validNode.Count ]; + for( int i = 0; i < selectedNodes.Length; i++ ) + { + if( validNode[ i ] != null ) + { + selectedNodes[ i ] = validNode[ i ]; + UIUtils.CheckUndoNode( selectedNodes[ i ] ); + } + } + + //Check nodes connected to deleted nodes to preserve connections on undo + List extraNodes = new List(); + for( int selectedNodeIdx = 0; selectedNodeIdx < selectedNodes.Length; selectedNodeIdx++ ) + { + // Check inputs + if( selectedNodes[ selectedNodeIdx ] != null ) + { + int inputIdxCount = selectedNodes[ selectedNodeIdx ].InputPorts.Count; + if( inputIdxCount > 0 ) + { + for( int inputIdx = 0; inputIdx < inputIdxCount; inputIdx++ ) + { + if( selectedNodes[ selectedNodeIdx ].InputPorts[ inputIdx ].IsConnected ) + { + int nodeIdx = selectedNodes[ selectedNodeIdx ].InputPorts[ inputIdx ].ExternalReferences[ 0 ].NodeId; + if( nodeIdx > -1 ) + { + ParentNode node = GetNode( nodeIdx ); + if( node != null && UIUtils.CheckUndoNode( node ) ) + { + extraNodes.Add( node ); + } + } + } + } + } + } + + // Check outputs + if( selectedNodes[ selectedNodeIdx ] != null ) + { + int outputIdxCount = selectedNodes[ selectedNodeIdx ].OutputPorts.Count; + if( outputIdxCount > 0 ) + { + for( int outputIdx = 0; outputIdx < outputIdxCount; outputIdx++ ) + { + int inputIdxCount = selectedNodes[ selectedNodeIdx ].OutputPorts[ outputIdx ].ExternalReferences.Count; + if( inputIdxCount > 0 ) + { + for( int inputIdx = 0; inputIdx < inputIdxCount; inputIdx++ ) + { + int nodeIdx = selectedNodes[ selectedNodeIdx ].OutputPorts[ outputIdx ].ExternalReferences[ inputIdx ].NodeId; + if( nodeIdx > -1 ) + { + ParentNode node = GetNode( nodeIdx ); + if( UIUtils.CheckUndoNode( node ) ) + { + extraNodes.Add( node ); + } + } + } + } + } + } + + } + } + + UIUtils.ClearUndoHelper(); + //Record deleted nodes + UIUtils.MarkUndoAction(); + Undo.RegisterCompleteObjectUndo( ParentWindow, Constants.UndoDeleteNodeId ); + Undo.RegisterCompleteObjectUndo( this, Constants.UndoDeleteNodeId ); + Undo.RecordObjects( selectedNodes, Constants.UndoDeleteNodeId ); + Undo.RecordObjects( extraNodes.ToArray(), Constants.UndoDeleteNodeId ); + + //Record deleting connections + for( int i = 0; i < selectedNodes.Length; i++ ) + { + CurrentOutputNode.Selected = false; + selectedNodes[ i ].Alive = false; + DeleteAllConnectionFromNode( selectedNodes[ i ], false, true, true ); + } + //Delete + DeleteNodesOnArray( ref selectedNodes ); + + extraNodes.Clear(); + extraNodes = null; + + EditorUtility.SetDirty( ParentWindow ); + + ParentWindow.ForceRepaint(); + } + + public void DeleteMarkedForDeletionNodes() + { + UndoableDeleteSelectedNodes( m_markedForDeletion ); + m_markedForDeletion.Clear(); + IsDirty = true; + + //bool invalidateMasterNode = false; + //int count = m_markedForDeletion.Count; + //for ( int nodeIdx = 0; nodeIdx < count; nodeIdx++ ) + //{ + // ParentNode node = m_markedForDeletion[ nodeIdx ]; + // if ( node.UniqueId == m_masterNodeId ) + // { + // invalidateMasterNode = true; + // } + // else + // { + // if ( node.Selected ) + // { + // m_selectedNodes.Remove( node ); + // node.Selected = false; + // } + // DestroyNode( node ); + // } + //} + + //if ( invalidateMasterNode ) + //{ + // CurrentMasterNode.Selected = false; + //} + ////Clear all references + //m_markedForDeletion.Clear(); + //IsDirty = true; + } + + public void DestroyNode( int nodeId ) + { + ParentNode node = GetNode( nodeId ); + DestroyNode( node ); + } + + public void DestroyNode( ParentNode node, bool registerUndo = true, bool destroyMasterNode = false ) + { + if( node == null ) + { + UIUtils.ShowMessage( "Attempting to destroying a inexistant node ", MessageSeverity.Warning ); + return; + } + + if( node.ConnStatus == NodeConnectionStatus.Connected && !m_checkSelectedWireHighlights ) + { + ResetHighlightedWires(); + m_checkSelectedWireHighlights = true; + } + + //TODO: check better placement of this code (reconnects wires from wire nodes) + //if ( node.GetType() == typeof( WireNode ) ) + //{ + // if ( node.InputPorts[ 0 ].ExternalReferences != null && node.InputPorts[ 0 ].ExternalReferences.Count > 0 ) + // { + // WireReference backPort = node.InputPorts[ 0 ].ExternalReferences[ 0 ]; + // for ( int i = 0; i < node.OutputPorts[ 0 ].ExternalReferences.Count; i++ ) + // { + // UIUtils.CurrentWindow.ConnectInputToOutput( node.OutputPorts[ 0 ].ExternalReferences[ i ].NodeId, node.OutputPorts[ 0 ].ExternalReferences[ i ].PortId, backPort.NodeId, backPort.PortId ); + // } + // } + //} + if( destroyMasterNode || ( node.UniqueId != m_masterNodeId && !( node is TemplateMultiPassMasterNode )/*!m_multiPassMasterNodes.HasNode( node.UniqueId )*/ ) ) + { + m_nodeGrid.RemoveNodeFromGrid( node, false ); + //Send Deactivation signal if active + if( node.ConnStatus == NodeConnectionStatus.Connected ) + { + node.DeactivateNode( -1, true ); + } + + //Invalidate references + //Invalidate input references + for( int inputPortIdx = 0; inputPortIdx < node.InputPorts.Count; inputPortIdx++ ) + { + InputPort inputPort = node.InputPorts[ inputPortIdx ]; + if( inputPort.IsConnected ) + { + for( int wireIdx = 0; wireIdx < inputPort.ExternalReferences.Count; wireIdx++ ) + { + WireReference inputReference = inputPort.ExternalReferences[ wireIdx ]; + ParentNode outputNode = GetNode( inputReference.NodeId ); + outputNode.GetOutputPortByUniqueId( inputReference.PortId ).InvalidateConnection( inputPort.NodeId, inputPort.PortId ); + outputNode.OnOutputPortDisconnected( inputReference.PortId ); + } + inputPort.InvalidateAllConnections(); + } + } + + //Invalidate output reference + for( int outputPortIdx = 0; outputPortIdx < node.OutputPorts.Count; outputPortIdx++ ) + { + OutputPort outputPort = node.OutputPorts[ outputPortIdx ]; + if( outputPort.IsConnected ) + { + for( int wireIdx = 0; wireIdx < outputPort.ExternalReferences.Count; wireIdx++ ) + { + WireReference outputReference = outputPort.ExternalReferences[ wireIdx ]; + ParentNode outnode = GetNode( outputReference.NodeId ); + if( outnode != null ) + { + outnode.GetInputPortByUniqueId( outputReference.PortId ).InvalidateConnection( outputPort.NodeId, outputPort.PortId ); + outnode.OnInputPortDisconnected( outputReference.PortId ); + } + } + outputPort.InvalidateAllConnections(); + } + } + + //Remove node from main list + //Undo.RecordObject( node, "Destroying node " + ( node.Attributes != null? node.Attributes.Name: node.GetType().ToString() ) ); + if( registerUndo ) + { + UIUtils.MarkUndoAction(); + Undo.RegisterCompleteObjectUndo( ParentWindow, Constants.UndoDeleteNodeId ); + Undo.RegisterCompleteObjectUndo( this, Constants.UndoDeleteNodeId ); + node.RecordObjectOnDestroy( Constants.UndoDeleteNodeId ); + } + + if( OnNodeRemovedEvent != null ) + OnNodeRemovedEvent( node ); + + m_nodes.Remove( node ); + m_nodesDict.Remove( node.UniqueId ); + node.Destroy(); + if( registerUndo ) + Undo.DestroyObjectImmediate( node ); + else + DestroyImmediate( node ); + IsDirty = true; + m_markToReOrder = true; + } + //else if( node.UniqueId == m_masterNodeId && node.GetType() == typeof(FunctionOutput) ) + //{ + // Debug.Log( "Attempting to destroy a output node" ); + // DeselectNode( node ); + // UIUtils.ShowMessage( "Attempting to destroy a output node" ); + //} + else + { + TemplateMultiPassMasterNode templateMasterNode = node as TemplateMultiPassMasterNode; + if( templateMasterNode != null && templateMasterNode.InvalidNode ) + { + DestroyNode( node, false, true ); + return; + } + + DeselectNode( node ); + UIUtils.ShowMessage( "Attempting to destroy a master node" ); + } + } + + void AddToSelectedNodes( ParentNode node ) + { + node.Selected = true; + m_selectedNodes.Add( node ); + node.OnNodeStoppedMovingEvent += OnNodeFinishMoving; + if( node.ConnStatus == NodeConnectionStatus.Connected ) + { + HighlightWiresStartingNode( node ); + } + } + + void RemoveFromSelectedNodes( ParentNode node ) + { + node.Selected = false; + m_selectedNodes.Remove( node ); + node.OnNodeStoppedMovingEvent -= OnNodeFinishMoving; + } + + public void SelectNode( ParentNode node, bool append, bool reorder ) + { + if( node == null ) + return; + + if( append ) + { + if( !m_selectedNodes.Contains( node ) ) + { + AddToSelectedNodes( node ); + } + } + else + { + DeSelectAll(); + AddToSelectedNodes( node ); + } + if( reorder && !node.ReorderLocked ) + { + m_nodes.Remove( node ); + m_nodes.Add( node ); + m_markToReOrder = true; + } + } + + public void MultipleSelection( Rect selectionArea, bool appendSelection = true ) + { + if( !appendSelection ) + { + for( int i = 0; i < m_nodes.Count; i++ ) + { + if( selectionArea.Overlaps( m_nodes[ i ].Position, true ) ) + { + RemoveFromSelectedNodes( m_nodes[ i ] ); + } + } + + m_markedToDeSelect = false; + ResetHighlightedWires(); + } + else + { + for( int i = 0; i < m_nodes.Count; i++ ) + { + if( !m_nodes[ i ].Selected && selectionArea.Overlaps( m_nodes[ i ].Position, true ) ) + { + AddToSelectedNodes( m_nodes[ i ] ); + } + } + } + + // reorder nodes and highlight them + for( int i = 0; i < m_selectedNodes.Count; i++ ) + { + if( !m_selectedNodes[ i ].ReorderLocked ) + { + m_nodes.Remove( m_selectedNodes[ i ] ); + m_nodes.Add( m_selectedNodes[ i ] ); + m_markToReOrder = true; + if( m_selectedNodes[ i ].ConnStatus == NodeConnectionStatus.Connected ) + { + HighlightWiresStartingNode( m_selectedNodes[ i ] ); + } + } + } + } + + public void SelectAll() + { + for( int i = 0; i < m_nodes.Count; i++ ) + { + if( !m_nodes[ i ].Selected ) + AddToSelectedNodes( m_nodes[ i ] ); + } + } + + public void SelectMasterNode() + { + if( m_masterNodeId != Constants.INVALID_NODE_ID ) + { + SelectNode( CurrentMasterNode, false, false ); + } + } + + public void SelectOutputNode() + { + if( m_masterNodeId != Constants.INVALID_NODE_ID ) + { + SelectNode( CurrentOutputNode, false, false ); + } + } + + public void DeselectNode( int nodeId ) + { + ParentNode node = GetNode( nodeId ); + if( node ) + { + m_selectedNodes.Remove( node ); + node.Selected = false; + } + } + + public void DeselectNode( ParentNode node ) + { + m_selectedNodes.Remove( node ); + node.Selected = false; + PropagateHighlightDeselection( node ); + } + + + + public void DeSelectAll() + { + m_markedToDeSelect = false; + for( int i = 0; i < m_selectedNodes.Count; i++ ) + { + m_selectedNodes[ i ].Selected = false; + m_selectedNodes[ i ].OnNodeStoppedMovingEvent -= OnNodeFinishMoving; + } + m_selectedNodes.Clear(); + ResetHighlightedWires(); + } + + public void AssignMasterNode() + { + if( m_selectedNodes.Count == 1 ) + { + OutputNode newOutputNode = m_selectedNodes[ 0 ] as OutputNode; + MasterNode newMasterNode = newOutputNode as MasterNode; + if( newOutputNode != null ) + { + if( m_masterNodeId != Constants.INVALID_NODE_ID && m_masterNodeId != newOutputNode.UniqueId ) + { + OutputNode oldOutputNode = GetNode( m_masterNodeId ) as OutputNode; + MasterNode oldMasterNode = oldOutputNode as MasterNode; + if( oldOutputNode != null ) + { + oldOutputNode.IsMainOutputNode = false; + if( oldMasterNode != null ) + { + oldMasterNode.ClearUpdateEvents(); + } + } + } + m_masterNodeId = newOutputNode.UniqueId; + newOutputNode.IsMainOutputNode = true; + if( newMasterNode != null ) + { + newMasterNode.OnMaterialUpdatedEvent += OnMaterialUpdatedEvent; + newMasterNode.OnShaderUpdatedEvent += OnShaderUpdatedEvent; + } + } + } + + IsDirty = true; + } + + public void AssignMasterNode( OutputNode node, bool onlyUpdateGraphId ) + { + AssignMasterNode( node.UniqueId, onlyUpdateGraphId ); + MasterNode masterNode = node as MasterNode; + if( masterNode != null ) + { + masterNode.OnMaterialUpdatedEvent += OnMaterialUpdatedEvent; + masterNode.OnShaderUpdatedEvent += OnShaderUpdatedEvent; + } + } + + public void AssignMasterNode( int nodeId, bool onlyUpdateGraphId ) + { + if( nodeId < 0 || m_masterNodeId == nodeId ) + return; + + if( m_masterNodeId > Constants.INVALID_NODE_ID ) + { + OutputNode oldOutputNode = ( GetNode( nodeId ) as OutputNode ); + MasterNode oldMasterNode = oldOutputNode as MasterNode; + if( oldOutputNode != null ) + { + oldOutputNode.IsMainOutputNode = false; + if( oldMasterNode != null ) + { + oldMasterNode.ClearUpdateEvents(); + } + } + } + + if( onlyUpdateGraphId ) + { + m_masterNodeId = nodeId; + } + else + { + OutputNode outputNode = ( GetNode( nodeId ) as OutputNode ); + if( outputNode != null ) + { + outputNode.IsMainOutputNode = true; + m_masterNodeId = nodeId; + } + } + + IsDirty = true; + } + + public void RefreshOnUndo() + { + if( m_nodes != null ) + { + int count = m_nodes.Count; + for( int i = 0; i < count; i++ ) + { + if( m_nodes[ i ] != null ) + { + m_nodes[ i ].RefreshOnUndo(); + } + } + } + } + + public void DrawGrid( DrawInfo drawInfo ) + { + m_nodeGrid.DrawGrid( drawInfo ); + } + + public float MaxNodeDist + { + get { return m_nodeGrid.MaxNodeDist; } + } + + public List GetNodesInGrid( Vector2 transformedMousePos ) + { + return m_nodeGrid.GetNodesOn( transformedMousePos ); + } + + public void FireMasterNode( Shader selectedShader ) + { + ( GetNode( m_masterNodeId ) as MasterNode ).Execute( selectedShader ); + } + + public Shader FireMasterNode( string pathname, bool isFullPath ) + { + return ( GetNode( m_masterNodeId ) as MasterNode ).Execute( pathname, isFullPath ); + } + + private void ForceSignalPropagationOnMasterNodeInternal( UsageListTemplateMultiPassMasterNodes masterNodes ) + { + int mpCount = masterNodes.Count; + for( int i = 0; i < mpCount; i++ ) + { + masterNodes.NodesList[ i ].GenerateSignalPropagation(); + } + } + + public void ForceSignalPropagationOnMasterNode() + { + if( m_multiPassMasterNodes.Count > 0 ) + { + ForceSignalPropagationOnMasterNodeInternal( m_multiPassMasterNodes ); + for( int i = 0; i < m_lodMultiPassMasterNodes.Count; i++ ) + { + ForceSignalPropagationOnMasterNodeInternal( m_lodMultiPassMasterNodes[ i ] ); + } + } + else if( CurrentOutputNode != null ) + CurrentOutputNode.GenerateSignalPropagation(); + + List allOutputs = m_functionOutputNodes.NodesList; + for( int i = 0; i < allOutputs.Count; i++ ) + { + allOutputs[ i ].GenerateSignalPropagation(); + } + + //List localVarNodes = m_localVarNodes.NodesList; + //int count = localVarNodes.Count; + //for( int i = 0; i < count; i++ ) + //{ + // localVarNodes[ i ].GenerateSignalPropagation(); + //} + } + + public void UpdateShaderOnMasterNode( Shader newShader ) + { + MasterNode mainMasterNode = ( GetNode( m_masterNodeId ) as MasterNode ); + if( mainMasterNode == null ) + { + Debug.LogError( "No Master Node was detected. Aborting update!" ); + return; + } + mainMasterNode.UpdateFromShader( newShader ); + + if( HasLODs ) + { + int passIdx = ( (TemplateMultiPassMasterNode)mainMasterNode ).PassIdx; + for( int i = 0; i < m_lodMultiPassMasterNodes.Count; i++ ) + { + if( m_lodMultiPassMasterNodes.Count != 0 && m_lodMultiPassMasterNodes[ i ].NodesList.Count > 0 ) + { + if( m_lodMultiPassMasterNodes[ i ].NodesList[ passIdx ] != null ) + { + m_lodMultiPassMasterNodes[ i ].NodesList[ passIdx ].UpdateFromShader( newShader ); + } + else + { + Debug.LogError( "Null master node detected. Aborting update!" ); + return; + } + } + else break; + } + } + } + + public void CopyValuesFromMaterial( Material material ) + { + Material currMaterial = CurrentMaterial; + if( currMaterial == material ) + { + for( int i = 0; i < m_nodes.Count; i++ ) + { + m_nodes[ i ].ForceUpdateFromMaterial( material ); + } + } + } + + public void UpdateMaterialOnMasterNode( Material material ) + { + MasterNode mainMasterNode = ( GetNode( m_masterNodeId ) as MasterNode ); + mainMasterNode.UpdateMasterNodeMaterial( material ); + if( HasLODs ) + { + int passIdx = ( (TemplateMultiPassMasterNode)mainMasterNode ).PassIdx; + for( int i = 0; i < m_lodMultiPassMasterNodes.Count; i++ ) + { + if( m_lodMultiPassMasterNodes.Count != 0 && m_lodMultiPassMasterNodes[ i ].NodesList.Count > 0 ) + { + m_lodMultiPassMasterNodes[ i ].NodesList[ passIdx ].UpdateMasterNodeMaterial( material ); + } + else break; + } + } + } + + public void UpdateMaterialOnPropertyNodes( Material material ) + { + int propertyCount = m_propertyNodes.Count; + for(int i = 0;i< propertyCount;i++ ) + { + m_propertyNodes.NodesList[i].UpdateMaterial( material ); + } + } + + public void SetMaterialModeOnGraph( Material mat, bool fetchMaterialValues = true ) + { + for( int i = 0; i < m_nodes.Count; i++ ) + { + m_nodes[ i ].SetMaterialMode( mat, fetchMaterialValues ); + } + } + + public ParentNode CheckNodeAt( Vector3 pos, bool checkForRMBIgnore = false ) + { + ParentNode selectedNode = null; + + // this is checked on the inverse order to give priority to nodes that are drawn on top ( last on the list ) + for( int i = m_nodes.Count - 1; i > -1; i-- ) + { + if( m_nodes[ i ].Contains( pos ) ) + { + if( checkForRMBIgnore ) + { + if( !m_nodes[ i ].RMBIgnore ) + { + selectedNode = m_nodes[ i ]; + break; + } + } + else + { + selectedNode = m_nodes[ i ]; + break; + } + } + } + return selectedNode; + } + + public void ResetNodesLocalVariables() + { + for( int i = 0; i < m_nodes.Count; i++ ) + { + m_nodes[ i ].Reset(); + m_nodes[ i ].ResetOutputLocals(); + + FunctionNode fnode = m_nodes[ i ] as FunctionNode; + if( fnode != null ) + { + if( fnode.Function != null ) + fnode.FunctionGraph.ResetNodesLocalVariables(); + } + } + } + + public void ResetNodesLocalVariablesIfNot( MasterNodePortCategory category ) + { + for( int i = 0; i < m_nodes.Count; i++ ) + { + m_nodes[ i ].Reset(); + m_nodes[ i ].ResetOutputLocalsIfNot( category ); + + FunctionNode fnode = m_nodes[ i ] as FunctionNode; + if( fnode != null ) + { + if( fnode.Function != null ) + fnode.FunctionGraph.ResetNodesLocalVariablesIfNot( category ); + } + } + } + + public void ResetNodesLocalVariables( ParentNode node ) + { + if( node is GetLocalVarNode ) + { + GetLocalVarNode localVarNode = node as GetLocalVarNode; + if( localVarNode.CurrentSelected != null ) + { + node = localVarNode.CurrentSelected; + } + } + + node.Reset(); + node.ResetOutputLocals(); + int count = node.InputPorts.Count; + for( int i = 0; i < count; i++ ) + { + if( node.InputPorts[ i ].IsConnected ) + { + ResetNodesLocalVariables( m_nodesDict[ node.InputPorts[ i ].GetConnection().NodeId ] ); + } + } + } + + public void ResetNodesLocalVariablesIfNot( ParentNode node, MasterNodePortCategory category ) + { + if( node is GetLocalVarNode ) + { + GetLocalVarNode localVarNode = node as GetLocalVarNode; + if( localVarNode.CurrentSelected != null ) + { + node = localVarNode.CurrentSelected; + } + } + + node.Reset(); + node.ResetOutputLocalsIfNot( category ); + int count = node.InputPorts.Count; + for( int i = 0; i < count; i++ ) + { + if( node.InputPorts[ i ].IsConnected ) + { + ResetNodesLocalVariablesIfNot( m_nodesDict[ node.InputPorts[ i ].GetConnection().NodeId ], category ); + } + } + } + + + public override string ToString() + { + string dump = ( "Parent Graph \n" ); + for( int i = 0; i < m_nodes.Count; i++ ) + { + dump += ( m_nodes[ i ] + "\n" ); + } + return dump; + } + + public void OrderNodesByGraphDepth() + { + if( CurrentMasterNode != null ) + { + //CurrentMasterNode.SetupNodeCategories(); + int count = m_nodes.Count; + for( int i = 0; i < count; i++ ) + { + if( m_nodes[ i ].ConnStatus == NodeConnectionStatus.Island ) + { + m_nodes[ i ].CalculateCustomGraphDepth(); + } + } + } + else + { + //TODO: remove this dynamic list + List allOutputs = new List(); + for( int i = 0; i < AllNodes.Count; i++ ) + { + OutputNode temp = AllNodes[ i ] as OutputNode; + if( temp != null ) + allOutputs.Add( temp ); + } + + for( int j = 0; j < allOutputs.Count; j++ ) + { + allOutputs[ j ].SetupNodeCategories(); + int count = m_nodes.Count; + for( int i = 0; i < count; i++ ) + { + if( m_nodes[ i ].ConnStatus == NodeConnectionStatus.Island ) + { + m_nodes[ i ].CalculateCustomGraphDepth(); + } + } + } + } + + m_nodes.Sort( ( x, y ) => { return y.GraphDepth.CompareTo( x.GraphDepth ); } ); + } + + public void WriteToString( ref string nodesInfo, ref string connectionsInfo ) + { + for( int i = 0; i < m_nodes.Count; i++ ) + { + m_nodes[ i ].FullWriteToString( ref nodesInfo, ref connectionsInfo ); + IOUtils.AddLineTerminator( ref nodesInfo ); + } + } + + public void Reset() + { + SaveIsDirty = false; + IsDirty = false; + } + + public void OnBeforeSerialize() + { + //DeSelectAll(); + } + + public void OnAfterDeserialize() + { + m_afterDeserializeFlag = true; + } + + public void CleanCorruptedNodes() + { + for( int i = 0; i < m_nodes.Count; i++ ) + { + if( (object)m_nodes[ i ] == null ) + { + m_nodes.RemoveAt( i ); + CleanCorruptedNodes(); + } + } + } + + public void OnDuplicateEventWrapper() + { + if( OnDuplicateEvent != null ) + { + AmplifyShaderEditorWindow temp = UIUtils.CurrentWindow; + UIUtils.CurrentWindow = ParentWindow; + OnDuplicateEvent(); + UIUtils.CurrentWindow = temp; + } + } + + public ParentNode CreateNode( AmplifyShaderFunction shaderFunction, bool registerUndo, int nodeId = -1, bool addLast = true ) + { + FunctionNode newNode = ScriptableObject.CreateInstance(); + if( newNode ) + { + newNode.ContainerGraph = this; + newNode.CommonInit( shaderFunction, nodeId ); + newNode.UniqueId = nodeId; + AddNode( newNode, nodeId < 0, addLast, registerUndo ); + } + return newNode; + } + + public ParentNode CreateNode( AmplifyShaderFunction shaderFunction, bool registerUndo, Vector2 pos, int nodeId = -1, bool addLast = true ) + { + ParentNode newNode = CreateNode( shaderFunction, registerUndo, nodeId, addLast ); + if( newNode ) + { + newNode.Vec2Position = pos; + } + return newNode; + } + + public TemplateMultiPassMasterNode CreateMultipassMasterNode( int lodId, bool registerUndo, int nodeId = -1, bool addLast = true ) + { + TemplateMultiPassMasterNode newNode = ScriptableObject.CreateInstance(); + if( newNode ) + { + newNode.LODIndex = lodId; + newNode.ContainerGraph = this; + if( newNode.IsStubNode ) + { + TemplateMultiPassMasterNode stubNode = newNode.ExecuteStubCode() as TemplateMultiPassMasterNode; + ScriptableObject.DestroyImmediate( newNode, true ); + newNode = stubNode; + } + else + { + newNode.UniqueId = nodeId; + AddNode( newNode, nodeId < 0, addLast, registerUndo ); + } + } + return newNode; + } + + public ParentNode CreateNode( System.Type type, bool registerUndo, int nodeId = -1, bool addLast = true ) + { + ParentNode newNode = ScriptableObject.CreateInstance( type ) as ParentNode; + if( newNode ) + { + newNode.ContainerGraph = this; + if( newNode.IsStubNode ) + { + ParentNode stubNode = newNode.ExecuteStubCode(); + ScriptableObject.DestroyImmediate( newNode, true ); + newNode = stubNode; + } + else + { + newNode.UniqueId = nodeId; + AddNode( newNode, nodeId < 0, addLast, registerUndo ); + } + } + return newNode; + } + + public ParentNode CreateNode( System.Type type, bool registerUndo, Vector2 pos, int nodeId = -1, bool addLast = true ) + { + ParentNode newNode = CreateNode( type, registerUndo, nodeId, addLast ); + if( newNode ) + { + newNode.Vec2Position = pos; + } + return newNode; + } + + public void FireMasterNodeReplacedEvent() + { + MasterNode masterNode = CurrentMasterNode; + int count = m_nodes.Count; + for( int i = 0; i < count; i++ ) + { + if( m_nodes[ i ].UniqueId != m_masterNodeId ) + { + m_nodes[ i ].OnMasterNodeReplaced( masterNode ); + } + } + } + + //Used over shader functions to propagate signal into their graphs + public void FireMasterNodeReplacedEvent( MasterNode masterNode ) + { + int count = m_nodes.Count; + for( int i = 0; i < count; i++ ) + { + if( m_nodes[ i ].UniqueId != masterNode.UniqueId ) + { + m_nodes[ i ].OnMasterNodeReplaced( masterNode ); + } + } + } + + + public void CrossCheckTemplateNodes( TemplateDataParent templateData , List mpNodesList , int lodId ) + { + /*Paulo*/ + DeSelectAll(); + TemplateMultiPassMasterNode newMasterNode = null; + Dictionary nodesDict = new Dictionary(); + int mpNodeCount = mpNodesList.Count; + for( int i = 0; i < mpNodeCount; i++ ) + { + string masterNodeId = mpNodesList[ i ].InvalidNode ? mpNodesList[ i ].OriginalPassName + "ASEInvalidMasterNode" + i : mpNodesList[ i ].OriginalPassName; + nodesDict.Add( masterNodeId, new TemplateReplaceHelper( mpNodesList[ i ] ) ); + } + + TemplateMultiPassMasterNode currMasterNode = GetNode( m_masterNodeId ) as TemplateMultiPassMasterNode; + + TemplateMultiPass multipassData = templateData as TemplateMultiPass; + m_currentSRPType = multipassData.SubShaders[ 0 ].Modules.SRPType; + + bool sortTemplatesNodes = false; + Vector2 currentPosition = currMasterNode.Vec2Position; + for( int subShaderIdx = 0; subShaderIdx < multipassData.SubShaders.Count; subShaderIdx++ ) + { + for( int passIdx = 0; passIdx < multipassData.SubShaders[ subShaderIdx ].Passes.Count; passIdx++ ) + { + string currPassName = multipassData.SubShaders[ subShaderIdx ].Passes[ passIdx ].PassNameContainer.Data; + if( nodesDict.ContainsKey( currPassName ) ) + { + bool wasMainNode = nodesDict[ currPassName ].MasterNode.IsMainOutputNode; + + currentPosition.y += nodesDict[ currPassName ].MasterNode.Position.height + 10; + nodesDict[ currPassName ].Used = true; + nodesDict[ currPassName ].MasterNode.SetTemplate( multipassData, false, false, subShaderIdx, passIdx, SetTemplateSource.NewShader ); + if( wasMainNode && !nodesDict[ currPassName ].MasterNode.IsMainOutputNode ) + { + nodesDict[ currPassName ].MasterNode.ReleaseResources(); + } + else if( !wasMainNode && nodesDict[ currPassName ].MasterNode.IsMainOutputNode ) + { + newMasterNode = nodesDict[ currPassName ].MasterNode; + } + } + else + { + sortTemplatesNodes = true; + TemplateMultiPassMasterNode masterNode = CreateMultipassMasterNode( lodId, false ); + if( multipassData.SubShaders[ subShaderIdx ].Passes[ passIdx ].IsMainPass ) + { + newMasterNode = masterNode; + currMasterNode.ReleaseResources(); + } + masterNode.Vec2Position = currentPosition; + masterNode.SetTemplate( multipassData, true, true, subShaderIdx, passIdx, SetTemplateSource.NewShader ); + //currentPosition.y += masterNode.HeightEstimate + 10; + } + } + } + + foreach( KeyValuePair kvp in nodesDict ) + { + if( !kvp.Value.Used ) + DestroyNode( kvp.Value.MasterNode, false, true ); + } + nodesDict.Clear(); + + if( newMasterNode != null ) + { + if( lodId == -1 ) + { + m_masterNodeId = newMasterNode.UniqueId; + } + newMasterNode.OnMaterialUpdatedEvent += OnMaterialUpdatedEvent; + newMasterNode.OnShaderUpdatedEvent += OnShaderUpdatedEvent; + newMasterNode.IsMainOutputNode = true; + } + + if( sortTemplatesNodes ) + { + mpNodesList.Sort( ( x, y ) => ( x.PassIdx.CompareTo( y.PassIdx ) ) ); + } + } + + public void OnRefreshLinkedPortsComplete() + { + OnRefreshLinkedPortsCompleteInternal( m_multiPassMasterNodes ); + for( int i = 0; i < m_lodMultiPassMasterNodes.Count; i++ ) + { + OnRefreshLinkedPortsCompleteInternal( m_lodMultiPassMasterNodes[ i ] ); + } + } + + private void OnRefreshLinkedPortsCompleteInternal( UsageListTemplateMultiPassMasterNodes masterNodes ) + { + int mpCount = masterNodes.Count; + for( int i = 0; i < mpCount; i++ ) + { + masterNodes.NodesList[ i ].OnRefreshLinkedPortsComplete(); + } + } + + public void RefreshLinkedMasterNodes( bool optionsUpdate = false ) + { + if( DebugConsoleWindow.DeveloperMode ) + Debug.Log( "Refresh linked master nodes" ); + + RefreshLinkedMasterNodesInternal( m_multiPassMasterNodes, optionsUpdate ); + for( int i = 0; i < m_lodMultiPassMasterNodes.Count; i++ ) + { + RefreshLinkedMasterNodesInternal( m_lodMultiPassMasterNodes[i], optionsUpdate ); + } + } + + private void RefreshLinkedMasterNodesInternal( UsageListTemplateMultiPassMasterNodes masterNodes, bool optionsUpdate ) + { + int mpCount = masterNodes.Count; + if( mpCount > 1 ) + { + Dictionary> registeredLinks = new Dictionary>(); + for( int i = 0; i < mpCount; i++ ) + { + CheckLinkedPorts( ref registeredLinks, masterNodes.NodesList[ mpCount - 1 - i ] ); + } + + foreach( KeyValuePair> kvp in registeredLinks ) + { + int linkCount = kvp.Value.Count; + if( linkCount == 1 ) + { + kvp.Value[ 0 ].Visible = true; + } + else + { + kvp.Value[ 0 ].Visible = true; + for( int i = 1; i < linkCount; i++ ) + { + kvp.Value[ i ].SetExternalLink( kvp.Value[ 0 ].NodeId, kvp.Value[ 0 ].PortId ); + kvp.Value[ i ].Visible = false; + } + } + kvp.Value.Clear(); + } + registeredLinks.Clear(); + registeredLinks = null; + } + + masterNodes.NodesList.Sort( ( x, y ) => ( x.SubShaderIdx * 1000 + x.PassIdx ).CompareTo( y.SubShaderIdx * 1000 + y.PassIdx ) ); + masterNodes.UpdateNodeArr(); + + m_parentWindow.TemplatesManagerInstance.ResetOptionsSetupData(); + for( int i = 0; i < mpCount; i++ ) + { + int visiblePorts = 0; + for( int j = 0; j < masterNodes.NodesList[ i ].InputPorts.Count; j++ ) + { + if( masterNodes.NodesList[ i ].InputPorts[ j ].Visible ) + { + visiblePorts++; + } + } + + if( masterNodes.NodesList[ i ].VisiblePorts != visiblePorts ) + { + masterNodes.NodesList[ i ].VisiblePorts = visiblePorts; + ForceRepositionCheck = true; + } + + masterNodes.NodesList[ i ].Docking = visiblePorts <= 0; + if( optionsUpdate ) + { + masterNodes.NodesList[ i ].ForceOptionsRefresh(); + } + } + } + + void CheckLinkedPorts( ref Dictionary> registeredLinks, TemplateMultiPassMasterNode masterNode ) + { + if( masterNode.HasLinkPorts ) + { + int inputCount = masterNode.InputPorts.Count; + for( int i = 0; i < inputCount; i++ ) + { + if( !string.IsNullOrEmpty( masterNode.InputPorts[ i ].ExternalLinkId ) ) + { + string linkId = masterNode.InputPorts[ i ].ExternalLinkId; + if( !registeredLinks.ContainsKey( masterNode.InputPorts[ i ].ExternalLinkId ) ) + { + registeredLinks.Add( linkId, new List() ); + } + + if( masterNode.IsMainOutputNode ) + { + registeredLinks[ linkId ].Insert( 0, masterNode.InputPorts[ i ] ); + } + else + { + registeredLinks[ linkId ].Add( masterNode.InputPorts[ i ] ); + } + } + else + { + masterNode.InputPorts[ i ].Visible = true; + } + } + } + else + { + int inputCount = masterNode.InputPorts.Count; + for( int i = 0; i < inputCount; i++ ) + { + masterNode.InputPorts[ i ].Visible = true; + } + } + + } + + public MasterNode ReplaceMasterNode( AvailableShaderTypes newType, bool writeDefaultData = false, TemplateDataParent templateData = null ) + { + DeSelectAll(); + ResetNodeConnStatus(); + MasterNode newMasterNode = null; + List nodesToDelete = null; + int mpNodeCount = m_multiPassMasterNodes.NodesList.Count; + if( mpNodeCount > 0 ) + { + nodesToDelete = new List(); + for( int i = 0; i < mpNodeCount; i++ ) + { + if( m_multiPassMasterNodes.NodesList[ i ].UniqueId != m_masterNodeId ) + { + nodesToDelete.Add( m_multiPassMasterNodes.NodesList[ i ] ); + } + } + + for( int lod = 0; lod < m_lodMultiPassMasterNodes.Count; lod++ ) + { + int lodNodeCount = m_lodMultiPassMasterNodes[ lod ].Count; + for( int i = 0; i < lodNodeCount; i++ ) + { + nodesToDelete.Add( m_lodMultiPassMasterNodes[ lod ].NodesList[ i ] ); + } + } + } + + MasterNode currMasterNode = GetNode( m_masterNodeId ) as MasterNode; + if( currMasterNode != null ) + { + currMasterNode.ReleaseResources(); + } + + bool refreshLinkedMasterNodes = false; + switch( newType ) + { + default: + case AvailableShaderTypes.SurfaceShader: + { + CurrentCanvasMode = NodeAvailability.SurfaceShader; + m_currentSRPType = TemplateSRPType.BuiltIn; + newMasterNode = CreateNode( typeof( StandardSurfaceOutputNode ), false ) as MasterNode; + } + break; + case AvailableShaderTypes.Template: + { + CurrentCanvasMode = NodeAvailability.TemplateShader; + if( templateData.TemplateType == TemplateDataType.LegacySinglePass ) + { + newMasterNode = CreateNode( typeof( TemplateMasterNode ), false ) as MasterNode; + ( newMasterNode as TemplateMasterNode ).SetTemplate( templateData as TemplateData, writeDefaultData, false ); + m_currentSRPType = TemplateSRPType.BuiltIn; + } + else + { + /*Paulo*/ + TemplateMultiPass multipassData = templateData as TemplateMultiPass; + m_currentSRPType = multipassData.SubShaders[ 0 ].Modules.SRPType; + + Vector2 currentPosition = currMasterNode.Vec2Position; + + for( int subShaderIdx = 0; subShaderIdx < multipassData.SubShaders.Count; subShaderIdx++ ) + { + for( int passIdx = 0; passIdx < multipassData.SubShaders[ subShaderIdx ].Passes.Count; passIdx++ ) + { + TemplateMultiPassMasterNode masterNode = CreateNode( typeof( TemplateMultiPassMasterNode ), false ) as TemplateMultiPassMasterNode; + if( multipassData.SubShaders[ subShaderIdx ].Passes[ passIdx ].IsMainPass ) + { + newMasterNode = masterNode; + ParentWindow.IsShaderFunctionWindow = false; + CurrentCanvasMode = NodeAvailability.TemplateShader; + } + masterNode.Vec2Position = currentPosition; + masterNode.SetTemplate( multipassData, true, true, subShaderIdx, passIdx, SetTemplateSource.NewShader ); + //currentPosition.y += masterNode.HeightEstimate + 10; + } + } + refreshLinkedMasterNodes = true; + //RefreshLinkedMasterNodes(); + } + } + break; + } + + if( currMasterNode != null ) + { + newMasterNode.CopyFrom( currMasterNode ); + m_masterNodeId = -1; + DestroyNode( currMasterNode, false, true ); + } + + if( nodesToDelete != null ) + { + for( int i = 0; i < nodesToDelete.Count; i++ ) + { + DestroyNode( nodesToDelete[ i ], false, true ); + } + nodesToDelete.Clear(); + } + + m_masterNodeId = newMasterNode.UniqueId; + + if( refreshLinkedMasterNodes ) + RefreshLinkedMasterNodes( true ); + + newMasterNode.OnMaterialUpdatedEvent += OnMaterialUpdatedEvent; + newMasterNode.OnShaderUpdatedEvent += OnShaderUpdatedEvent; + newMasterNode.IsMainOutputNode = true; + OnRefreshLinkedPortsComplete(); + FullCleanUndoStack(); + return newMasterNode; + } + + private void RepositionTemplateNodes( MasterNode newMasterNode ) + { + m_forceRepositionCheck = false; + + int dockedElementsBefore = 0; + int dockedElementsAfter = 0; + int masterIndex = 0; + bool foundMaster = false; + for( int i = 0; i < MultiPassMasterNodes.Count; i++ ) + { + if( MultiPassMasterNodes.NodesList[ i ].UniqueId == m_masterNodeId ) + { + foundMaster = true; + masterIndex = i; + } + + if( !MultiPassMasterNodes.NodesList[ i ].IsInvisible && MultiPassMasterNodes.NodesList[ i ].Docking ) + { + if( foundMaster ) + dockedElementsAfter++; + else + dockedElementsBefore++; + } + } + + if( dockedElementsBefore > 0 ) + { + newMasterNode.UseSquareNodeTitle = true; + } + + for( int i = masterIndex - 1; i >= 0; i-- ) + { + float forwardTracking = 0; + for( int j = i + 1; j <= masterIndex; j++ ) + { + if( !MultiPassMasterNodes.NodesList[ i ].IsInvisible && !MultiPassMasterNodes.NodesList[ j ].Docking ) + { + forwardTracking += MultiPassMasterNodes.NodesList[ j ].HeightEstimate + 10; + } + } + MasterNode node = MultiPassMasterNodes.NodesList[ i ]; + node.Vec2Position = new Vector2( node.Vec2Position.x, newMasterNode.Position.y - forwardTracking - 33 * ( dockedElementsBefore ) ); + } + + for( int i = masterIndex + 1; i < MultiPassMasterNodes.Count; i++ ) + { + if( MultiPassMasterNodes.NodesList[ i ].UniqueId == newMasterNode.UniqueId || MultiPassMasterNodes.NodesList[ i ].Docking ) + continue; + + float backTracking = 0; + for( int j = i - 1; j >= masterIndex; j-- ) + { + if( !MultiPassMasterNodes.NodesList[ i ].IsInvisible && !MultiPassMasterNodes.NodesList[ j ].Docking ) + { + backTracking += MultiPassMasterNodes.NodesList[ j ].HeightEstimate + 10; + } + } + MasterNode node = MultiPassMasterNodes.NodesList[ i ]; + node.Vec2Position = new Vector2( node.Vec2Position.x, newMasterNode.Position.y + backTracking + 33 * ( dockedElementsAfter ) ); + } + } + + public void CreateNewEmpty( string name ) + { + CleanNodes(); + if( m_masterNodeDefaultType == null ) + m_masterNodeDefaultType = typeof( StandardSurfaceOutputNode ); + + MasterNode newMasterNode = CreateNode( m_masterNodeDefaultType, false ) as MasterNode; + newMasterNode.SetName( name ); + m_masterNodeId = newMasterNode.UniqueId; + + ParentWindow.IsShaderFunctionWindow = false; + CurrentCanvasMode = NodeAvailability.SurfaceShader; + + newMasterNode.OnMaterialUpdatedEvent += OnMaterialUpdatedEvent; + newMasterNode.OnShaderUpdatedEvent += OnShaderUpdatedEvent; + newMasterNode.IsMainOutputNode = true; + LoadedShaderVersion = VersionInfo.FullNumber; + } + + public void CreateNewEmptyTemplate( string templateGUID ) + { + CleanNodes(); + TemplateDataParent templateData = m_parentWindow.TemplatesManagerInstance.GetTemplate( templateGUID ); + if( templateData.TemplateType == TemplateDataType.LegacySinglePass ) + { + TemplateMasterNode newMasterNode = CreateNode( typeof( TemplateMasterNode ), false ) as TemplateMasterNode; + m_masterNodeId = newMasterNode.UniqueId; + + ParentWindow.IsShaderFunctionWindow = false; + CurrentCanvasMode = NodeAvailability.TemplateShader; + m_currentSRPType = TemplateSRPType.BuiltIn; + newMasterNode.OnMaterialUpdatedEvent += OnMaterialUpdatedEvent; + newMasterNode.OnShaderUpdatedEvent += OnShaderUpdatedEvent; + newMasterNode.IsMainOutputNode = true; + + newMasterNode.SetTemplate( templateData as TemplateData, true, true ); + } + else + { + /*Paulo*/ + TemplateMultiPass multipassData = templateData as TemplateMultiPass; + m_currentSRPType = multipassData.SubShaders[ 0 ].Modules.SRPType; + + Vector2 currentPosition = Vector2.zero; + for( int subShaderIdx = 0; subShaderIdx < multipassData.SubShaders.Count; subShaderIdx++ ) + { + for( int passIdx = 0; passIdx < multipassData.SubShaders[ subShaderIdx ].Passes.Count; passIdx++ ) + { + TemplateMultiPassMasterNode newMasterNode = CreateNode( typeof( TemplateMultiPassMasterNode ), false ) as TemplateMultiPassMasterNode; + if( multipassData.SubShaders[ subShaderIdx ].Passes[ passIdx ].IsMainPass ) + { + m_masterNodeId = newMasterNode.UniqueId; + + ParentWindow.IsShaderFunctionWindow = false; + CurrentCanvasMode = NodeAvailability.TemplateShader; + + newMasterNode.OnMaterialUpdatedEvent += OnMaterialUpdatedEvent; + newMasterNode.OnShaderUpdatedEvent += OnShaderUpdatedEvent; + newMasterNode.IsMainOutputNode = true; + } + newMasterNode.Vec2Position = currentPosition; + newMasterNode.SetTemplate( multipassData, true, true, subShaderIdx, passIdx, SetTemplateSource.NewShader ); + + //currentPosition.y += newMasterNode.HeightEstimate + 10; + } + } + + RefreshLinkedMasterNodes( false ); + OnRefreshLinkedPortsComplete(); + } + + LoadedShaderVersion = VersionInfo.FullNumber; + } + + public void CreateNewEmptyFunction( AmplifyShaderFunction shaderFunction ) + { + CleanNodes(); + FunctionOutput newOutputNode = CreateNode( typeof( FunctionOutput ), false ) as FunctionOutput; + m_masterNodeId = newOutputNode.UniqueId; + + ParentWindow.IsShaderFunctionWindow = true; + CurrentCanvasMode = NodeAvailability.ShaderFunction; + + newOutputNode.IsMainOutputNode = true; + } + + public void ForceCategoryRefresh() { m_forceCategoryRefresh = true; } + public void RefreshExternalReferences() + { + int count = m_nodes.Count; + for( int i = 0; i < count; i++ ) + { + m_nodes[ i ].RefreshExternalReferences(); + } + } + + public Vector2 SelectedNodesCentroid + { + get + { + if( m_selectedNodes.Count == 0 ) + return Vector2.zero; + Vector2 pos = new Vector2( 0, 0 ); + for( int i = 0; i < m_selectedNodes.Count; i++ ) + { + pos += m_selectedNodes[ i ].Vec2Position; + } + + pos /= m_selectedNodes.Count; + return pos; + } + } + + public void AddVirtualTextureCount() + { + m_virtualTextureCount += 1; + } + + public void RemoveVirtualTextureCount() + { + m_virtualTextureCount -= 1; + if( m_virtualTextureCount < 0 ) + { + Debug.LogWarning( "Invalid virtual texture count" ); + } + } + + public bool HasVirtualTexture { get { return m_virtualTextureCount > 0; } } + + public void AddInstancePropertyCount() + { + m_instancePropertyCount += 1; +// Debug.Log( "AddInstancePropertyCount "+this.GetInstanceID() + " " + m_instancePropertyCount ); + } + + public void RemoveInstancePropertyCount() + { + m_instancePropertyCount -= 1; + // Debug.Log( "RemoveInstancePropertyCount " + this.GetInstanceID() + " " + m_instancePropertyCount ); + + if( m_instancePropertyCount < 0 ) + { + Debug.LogWarning( "Invalid property instance count" ); + } + } + + public int InstancePropertyCount { get { return m_instancePropertyCount; } set { m_instancePropertyCount = value; } } + + public bool IsInstancedShader { get { return m_instancePropertyCount > 0; } } + + public void AddNormalDependentCount() { m_normalDependentCount += 1; } + + public void RemoveNormalDependentCount() + { + m_normalDependentCount -= 1; + if( m_normalDependentCount < 0 ) + { + Debug.LogWarning( "Invalid normal dependentCount count" ); + } + } + + public void SetModeFromMasterNode() + { + MasterNode masterNode = CurrentMasterNode; + if( masterNode != null ) + { + switch( masterNode.CurrentMasterNodeCategory ) + { + default: + case AvailableShaderTypes.SurfaceShader: + { + if( masterNode is StandardSurfaceOutputNode ) + CurrentCanvasMode = ParentWindow.CurrentNodeAvailability; + else + CurrentCanvasMode = NodeAvailability.SurfaceShader; + } + break; + case AvailableShaderTypes.Template: + { + CurrentCanvasMode = NodeAvailability.TemplateShader; + } + break; + } + } + else + { + + CurrentCanvasMode = NodeAvailability.SurfaceShader; + } + } + + public void MarkToDelete( ParentNode node ) + { + m_markedForDeletion.Add( node ); + } + public bool IsMasterNode( ParentNode node ) + { + return ( node.UniqueId == m_masterNodeId ) || + m_multiPassMasterNodes.HasNode( node.UniqueId ); + } + + public TemplateMultiPassMasterNode GetMainMasterNodeOfLOD( int lod ) + { + if( lod == -1 ) + return CurrentMasterNode as TemplateMultiPassMasterNode; + + return m_lodMultiPassMasterNodes[ lod ].NodesList.Find( x => x.IsMainOutputNode ); + } + + public TemplateMultiPassMasterNode GetMasterNodeOfPass( string passName, int lod ) + { + if( lod == -1 ) + return m_multiPassMasterNodes.NodesList.Find( x => x.PassName.Equals( passName ) ); + + return m_lodMultiPassMasterNodes[lod].NodesList.Find( x => x.PassName.Equals( passName ) ); + } + + public void ForceMultiPassMasterNodesRefresh() + { + int mainOutputId = 0; + int count = m_multiPassMasterNodes.Count; + for( int i = 0; i < count; i++ ) + { + m_multiPassMasterNodes.NodesList[ i ].ForceTemplateRefresh(); + if( m_multiPassMasterNodes.NodesList[ i ].IsMainOutputNode ) + mainOutputId = i; + } + + int lodCount = m_lodMultiPassMasterNodes.Count; + for( int i = 0; i < lodCount; i++ ) + { + if( m_lodMultiPassMasterNodes[ i ] != null ) + { + count = m_lodMultiPassMasterNodes[ i ].Count; + for( int j = 0; j < count; j++ ) + { + m_lodMultiPassMasterNodes[ i ].NodesList[ j ].ForceTemplateRefresh(); + } + } + } + + m_multiPassMasterNodes.NodesList[ mainOutputId ].CheckTemplateChanges(); + } + + public void SetLateOptionsRefresh() + { + m_lateOptionsRefresh = true; + } + + public void CreateLodMasterNodes( TemplateMultiPass templateMultiPass,int index, Vector2 initialPosition ) + { + for( int lod = 0; lod < m_lodMultiPassMasterNodes.Count; lod++ ) + { + if( m_lodMultiPassMasterNodes[ lod ].Count == 0 ) + { + TemplateMultiPassMasterNode reference = CurrentMasterNode as TemplateMultiPassMasterNode; + + int shaderLod = -1; + if( lod == 0 ) + { + shaderLod = reference.ShaderLOD - MasterNodeLODIncrement; + } + else + { + //index == -2 is when user clicks on +/- buttons over the foldout UI + if( index == -2 ) + { + shaderLod = m_lodMultiPassMasterNodes[ lod - 1 ].NodesList[ reference.PassIdx ].ShaderLOD - MasterNodeLODIncrement; + } + //index == -1 is when user clicks on + button over the main lod master node + else if( index == -1 ) + { + int mainShaderLOD = m_lodMultiPassMasterNodes[ 0 ].NodesList[ reference.PassIdx ].ShaderLOD; + shaderLod = ( reference.ShaderLOD + mainShaderLOD )/2; + } + else + { + if( m_lodMultiPassMasterNodes[ index ].Count > 0 ) + { + if( m_lodMultiPassMasterNodes[ index + 1 ].Count > 0 ) + { + shaderLod = (m_lodMultiPassMasterNodes[ index ].NodesList[ reference.PassIdx ].ShaderLOD + + m_lodMultiPassMasterNodes[ index + 1 ].NodesList[ reference.PassIdx ].ShaderLOD )/2; + } + else + { + shaderLod = m_lodMultiPassMasterNodes[ index ].NodesList[ reference.PassIdx ].ShaderLOD - MasterNodeLODIncrement; + } + } + } + } + + int nodeId = 0; + TemplateMultiPassMasterNode mainMasterNode = null; + for( int subShaderIdx = 0; subShaderIdx < templateMultiPass.SubShaders.Count; subShaderIdx++ ) + { + for( int passIdx = 0; passIdx < templateMultiPass.SubShaders[ subShaderIdx ].Passes.Count; passIdx++ ) + { + TemplateMultiPassMasterNode masterNode = ScriptableObject.CreateInstance( typeof( TemplateMultiPassMasterNode ) ) as TemplateMultiPassMasterNode; + masterNode.LODIndex = lod; + masterNode.ContainerGraph = this; + masterNode.Vec2Position = initialPosition; + AddNode( masterNode, true ); + masterNode.SetTemplate( templateMultiPass, true, true, subShaderIdx, passIdx, SetTemplateSource.NewShader ); + masterNode.CopyOptionsFrom( m_multiPassMasterNodes.NodesList[ nodeId++ ] ); + if( masterNode.IsMainOutputNode || ( subShaderIdx == 0 && passIdx == 0 ) ) + { + masterNode.SetShaderLODValueAndLabel( shaderLod ); + mainMasterNode = masterNode; + } + } + } + + mainMasterNode.ForceOptionsRefresh(); + SortLODMasterNodes(); + if( OnLODMasterNodesAddedEvent != null ) + { + OnLODMasterNodesAddedEvent( lod ); + } + + TemplateMultiPassMasterNode lodMainMasterNode = CurrentMasterNode as TemplateMultiPassMasterNode; + lodMainMasterNode.SetShaderLODValueAndLabel( lodMainMasterNode.ShaderLOD ); + return; + } + } + } + + public void DestroyLodMasterNodes( int index ) + { + if( index < 0 ) + { + for( int lod = m_lodMultiPassMasterNodes.Count - 1; lod >= 0; lod-- ) + { + if( m_lodMultiPassMasterNodes[ lod ].Count > 0 ) + { + while( m_lodMultiPassMasterNodes[ lod ].Count > 0 ) + { + DestroyNode( m_lodMultiPassMasterNodes[ lod ].NodesList[ 0 ], false, true ); + } + break; + } + } + } + else + { + while( m_lodMultiPassMasterNodes[ index ].Count > 0 ) + { + DestroyNode( m_lodMultiPassMasterNodes[ index ].NodesList[ 0 ], false, true ); + } + } + SortLODMasterNodes(); + TemplateMultiPassMasterNode lodMainMasterNode = CurrentMasterNode as TemplateMultiPassMasterNode; + lodMainMasterNode.SetShaderLODValueAndLabel( lodMainMasterNode.ShaderLOD ); + } + + public void SortLODMasterNodes() + { + int idx = (CurrentMasterNode as TemplateMultiPassMasterNode).PassIdx; + m_lodMultiPassMasterNodes.Sort( ( x, y ) => + { + if( x.Count > 0 ) + { + if( y.Count > 0 ) + { + return -x.NodesList[ idx ].ShaderLOD.CompareTo( y.NodesList[ idx ].ShaderLOD ); + } + else + { + return -1; + } + } + else + { + if( y.Count > 0 ) + { + return 1; + } + } + return 0; + }); + + for( int lodIdx = 0; lodIdx < m_lodMultiPassMasterNodes.Count; lodIdx++ ) + { + for( int nodeIdx = 0; nodeIdx < m_lodMultiPassMasterNodes[ lodIdx ].Count; nodeIdx++ ) + { + m_lodMultiPassMasterNodes[ lodIdx ].NodesList[ nodeIdx ].LODIndex = lodIdx; + } + } + } + + public List GetMultiPassMasterNodes( int lod ) + { + if( lod == -1 ) + return m_multiPassMasterNodes.NodesList; + + return m_lodMultiPassMasterNodes[ lod ].NodesList; + } + + public bool IsNormalDependent { get { return m_normalDependentCount > 0; } } + + public void MarkToDeselect() { m_markedToDeSelect = true; } + public void MarkToSelect( int nodeId ) { m_markToSelect = nodeId; } + public void MarkWireHighlights() { m_checkSelectedWireHighlights = true; } + public List SelectedNodes { get { return m_selectedNodes; } } + public List MarkedForDeletionNodes { get { return m_markedForDeletion; } } + public int CurrentMasterNodeId { get { return m_masterNodeId; } set { m_masterNodeId = value; } } + + public Shader CurrentShader + { + get + { + MasterNode masterNode = GetNode( m_masterNodeId ) as MasterNode; + if( masterNode != null ) + return masterNode.CurrentShader; + return null; + } + } + + public Material CurrentMaterial + { + get + { + MasterNode masterNode = GetNode( m_masterNodeId ) as MasterNode; + if( masterNode != null ) + return masterNode.CurrentMaterial; + return null; + } + } + + + + public NodeAvailability CurrentCanvasMode { get { return m_currentCanvasMode; } set { m_currentCanvasMode = value; ParentWindow.LateRefreshAvailableNodes(); } } + public OutputNode CurrentOutputNode { get { return GetNode( m_masterNodeId ) as OutputNode; } } + public FunctionOutput CurrentFunctionOutput { get { return GetNode( m_masterNodeId ) as FunctionOutput; } } + public MasterNode CurrentMasterNode { get { return GetNode( m_masterNodeId ) as MasterNode; } } + public StandardSurfaceOutputNode CurrentStandardSurface { get { return GetNode( m_masterNodeId ) as StandardSurfaceOutputNode; } } + public List AllNodes { get { return m_nodes; } } + public int NodeCount { get { return m_nodes.Count; } } + //public List VisibleNodes { get { return m_visibleNodes; } } + + public int NodeClicked + { + set { m_nodeClicked = value; } + get { return m_nodeClicked; } + } + + public bool IsDirty + { + set { m_isDirty = value && UIUtils.DirtyMask; } + get + { + bool value = m_isDirty; + m_isDirty = false; + return value; + } + } + + public bool SaveIsDirty + { + set { m_saveIsDirty = value && UIUtils.DirtyMask; } + get { return m_saveIsDirty; } + } + public int LoadedShaderVersion + { + get { return m_loadedShaderVersion; } + set { m_loadedShaderVersion = value; } + } + + public AmplifyShaderFunction CurrentShaderFunction + { + get { if( CurrentFunctionOutput != null ) return CurrentFunctionOutput.Function; else return null; } + set { if( CurrentFunctionOutput != null ) CurrentFunctionOutput.Function = value; } + } + + public bool HasUnConnectedNodes { get { return m_hasUnConnectedNodes; } } + public UsageListSamplerNodes SamplerNodes { get { return m_samplerNodes; } } + public UsageListFloatIntNodes FloatIntNodes { get { return m_floatNodes; } } + public UsageListTexturePropertyNodes TexturePropertyNodes { get { return m_texturePropertyNodes; } } + public UsageListTextureArrayNodes TextureArrayNodes { get { return m_textureArrayNodes; } } + public UsageListPropertyNodes PropertyNodes { get { return m_propertyNodes; } } + public UsageListPropertyNodes RawPropertyNodes { get { return m_rawPropertyNodes; } } + public UsageListCustomExpressionsOnFunctionMode CustomExpressionOnFunctionMode { get { return m_customExpressionsOnFunctionMode; } } + public UsageListStaticSwitchNodes StaticSwitchNodes { get { return m_staticSwitchNodes; } } + public UsageListScreenColorNodes ScreenColorNodes { get { return m_screenColorNodes; } } + public UsageListRegisterLocalVarNodes LocalVarNodes { get { return m_localVarNodes; } } + public UsageListGlobalArrayNodes GlobalArrayNodes { get { return m_globalArrayNodes; } } + public UsageListFunctionInputNodes FunctionInputNodes { get { return m_functionInputNodes; } } + public UsageListFunctionNodes FunctionNodes { get { return m_functionNodes; } } + public UsageListFunctionOutputNodes FunctionOutputNodes { get { return m_functionOutputNodes; } } + public UsageListFunctionSwitchNodes FunctionSwitchNodes { get { return m_functionSwitchNodes; } } + public UsageListFunctionSwitchCopyNodes FunctionSwitchCopyNodes { get { return m_functionSwitchCopyNodes; } } + public UsageListTemplateMultiPassMasterNodes MultiPassMasterNodes { get { return m_multiPassMasterNodes; } set { m_multiPassMasterNodes = value; } } + public List LodMultiPassMasternodes { get { return m_lodMultiPassMasterNodes; } } + + + public PrecisionType CurrentPrecision + { + get { return m_currentPrecision; } + set { m_currentPrecision = value; } + } + + public NodeLOD LodLevel + { + get { return m_lodLevel; } + } + + public List NodePreviewList { get { return m_nodePreviewList; } set { m_nodePreviewList = value; } } + + public void SetGraphId( int id ) + { + m_graphId = id; + } + + public int GraphId + { + get { return m_graphId; } + } + + public AmplifyShaderEditorWindow ParentWindow + { + get { return m_parentWindow; } + set { m_parentWindow = value; } + } + + + public bool ChangedLightingModel + { + get { return m_changedLightingModel; } + set { m_changedLightingModel = value; } + } + + public bool ForceRepositionCheck + { + get { return m_forceRepositionCheck; } + set { m_forceRepositionCheck = value; } + } + + public bool IsLoading { get { return m_isLoading; } set { m_isLoading = value; } } + public bool IsDuplicating { get { return m_isDuplicating; } set { m_isDuplicating = value; } } + public TemplateSRPType CurrentSRPType { get { return m_currentSRPType; }set { m_currentSRPType = value; } } + public bool IsSRP { get { return m_currentSRPType == TemplateSRPType.Lightweight || m_currentSRPType == TemplateSRPType.HD; } } + public bool IsHDRP { get { return m_currentSRPType == TemplateSRPType.HD; } } + public bool IsLWRP { get { return m_currentSRPType == TemplateSRPType.Lightweight; } } + public bool IsStandardSurface { get { return GetNode( m_masterNodeId ) is StandardSurfaceOutputNode; } } + + public bool SamplingMacros { + get { return m_samplingThroughMacros; } + set { m_samplingThroughMacros = value; } + } + public bool HasLODs { get { return m_lodMultiPassMasterNodes[ 0 ].Count > 0; } } + //public bool HasLodMultiPassNodes + //{ + // get + // { + // for( int i = 0; i < m_lodMultiPassMasterNodes.Count; i++ ) + // { + // if( m_lodMultiPassMasterNodes[ i ].Count > 0 ) + // return true; + // } + // return false; + // } + //} + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Graphs/ParentGraph.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Graphs/ParentGraph.cs.meta new file mode 100644 index 0000000..dd5b308 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Graphs/ParentGraph.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0b814c2a3cbebc047a566a92ed9d4340 +timeCreated: 1481126953 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu.meta new file mode 100644 index 0000000..a627578 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 3b28c70161e2aec4787239fba546bd25 +folderAsset: yes +timeCreated: 1481126944 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/AmplifyShaderEditorWindow.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/AmplifyShaderEditorWindow.cs new file mode 100644 index 0000000..348ab07 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/AmplifyShaderEditorWindow.cs @@ -0,0 +1,6106 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using UnityEditor.Callbacks; +using System; +using System.Collections; +using System.Threading; +using System.Globalization; +using System.Collections.Generic; +using UnityEngine.Networking; + +namespace AmplifyShaderEditor +{ + // Disabling Substance Deprecated warning + + public class AmplifyShaderEditorWindow : SearchableEditorWindow, ISerializationCallbackReceiver + { + public const string PreviewSizeGlobalVariable = "_ASEPreviewSize"; + + public const double InactivitySaveTime = 1.0; + + public const string CopyCommand = "Copy"; + public const string PasteCommand = "Paste"; + public const string SelectAll = "SelectAll"; + public const string Duplicate = "Duplicate"; + public const string ObjectSelectorClosed = "ObjectSelectorClosed"; + public const string LiveShaderError = "Live Shader only works with an assigned Master Node on the graph"; + + public const string AsyncMessage = "Detected Asynchronous Shader Compilation. This can cause slowdowns when saving not only ASE shaders but other shaders as well.\n" + + "Please consider turning it off ( Project Settings > Editor > Asynchronous Shader Compilation ) if detecting big slowdowns on shader save.\n" + + "This message can be turned off via Preferences > Amplify Shader Editor > Show Async Message."; + //public Texture2D MasterNodeOnTexture = null; + //public Texture2D MasterNodeOffTexture = null; + + //public Texture2D GPUInstancedOnTexture = null; + //public Texture2D GPUInstancedOffTexture = null; + + private bool m_initialized = false; + private bool m_checkInvalidConnections = false; + private bool m_afterDeserializeFlag = true; + + + [SerializeField] + private ParentGraph m_customGraph = null; + + // UI + private Rect m_graphArea; + private Texture2D m_graphBgTexture; + private Texture2D m_graphFgTexture; + private GUIStyle m_graphFontStyle; + //private GUIStyle _borderStyle; + private Texture2D m_wireTexture; + + [SerializeField] + TemplatesManager m_templatesManager; + + [SerializeField] + private InnerWindowEditorVariables m_innerEditorVariables; + + [SerializeField] + private string m_lastpath; + + [SerializeField] + private ASESelectionMode m_selectionMode = ASESelectionMode.Shader; + + [SerializeField] + private DuplicatePreventionBuffer m_duplicatePreventionBuffer; + + [SerializeField] + private double m_inactivityTime = 0; + + // Prevent save ops every tick when on live mode + [SerializeField] + private double m_lastTimeSaved = 0; + + [SerializeField] + private bool m_cacheSaveOp = false; + private const double SaveTime = 1; + + private bool m_markedToSave = false; + + // Graph logic + [SerializeField] + private ParentGraph m_mainGraphInstance; + + // Camera control + [SerializeField] + private Vector2 m_cameraOffset; + + private float m_cameraSpeed = 1; + + private Rect m_cameraInfo; + + [SerializeField] + private float m_cameraZoom; + + [SerializeField] + private Vector2 m_minNodePos; + + [SerializeField] + private Vector2 m_maxNodePos; + + [SerializeField] + private bool m_isDirty; + + [SerializeField] + private bool m_saveIsDirty; + + [SerializeField] + private bool m_repaintIsDirty; + + [SerializeField] + private bool m_liveShaderEditing = false; + + [SerializeField] + private bool m_shaderIsModified = false; + + [SerializeField] + private string m_lastOpenedLocation = string.Empty; + + [SerializeField] + private bool m_zoomChanged = true; + + [SerializeField] + private float m_lastWindowWidth = 0; + + [SerializeField] + private int m_graphCount = 0; + + [SerializeField] + private double m_currentInactiveTime = 0; + + private bool m_ctrlSCallback = false; + + private bool m_altBoxSelection = false; + private bool m_altDragStarted = false; + private bool m_altPressDown = false; + private bool m_altAvailable = true; + + // Events + private Vector3 m_currentMousePos; + private Vector2 m_keyEvtMousePos2D; + private Vector2 m_currentMousePos2D; + private Event m_currentEvent; + private string m_currentCommandName = string.Empty; + private bool m_insideEditorWindow; + + private bool m_lostFocus = false; + // Selection box for multiple node selection + private bool m_multipleSelectionActive = false; + private bool m_lmbPressed = false; + private Vector2 m_multipleSelectionStart; + private Rect m_multipleSelectionArea = new Rect( 0, 0, 0, 0 ); + private bool m_autoPanDirActive = false; + private bool m_forceAutoPanDir = false; + private bool m_refreshOnUndo = false; + private bool m_loadShaderOnSelection = false; + private bool m_refreshAvailableNodes = false; + private double m_time; + + //Context Menu + private Vector2 m_rmbStartPos; + private Vector2 m_altKeyStartPos; + private GraphContextMenu m_contextMenu; + private ShortcutsManager m_shortcutManager; + + [SerializeField] + private NodeAvailability m_currentNodeAvailability = NodeAvailability.SurfaceShader; + //Clipboard + private Clipboard m_clipboard; + + //Node Parameters Window + [SerializeField] + private bool m_nodeParametersWindowMaximized = true; + private NodeParametersWindow m_nodeParametersWindow; + + // Tools Window + private ToolsWindow m_toolsWindow; + + private ConsoleLogWindow m_consoleLogWindow; + + //Editor Options + private OptionsWindow m_optionsWindow; + + // Mode Window + private ShaderEditorModeWindow m_modeWindow; + + // Tools Window + private TipsWindow m_tipsWindow; + + //Palette Window + [SerializeField] + private bool m_paletteWindowMaximized = true; + private PaletteWindow m_paletteWindow; + + private ContextPalette m_contextPalette; + private PalettePopUp m_palettePopup; + private System.Type m_paletteChosenType; + private AmplifyShaderFunction m_paletteChosenFunction; + + // In-Editor Message System + GenericMessageUI m_genericMessageUI; + private GUIContent m_genericMessageContent; + + // Drag&Drop Tool + private DragAndDropTool m_dragAndDropTool; + + //Custom Styles + //private CustomStylesContainer m_customStyles; + + private AmplifyShaderFunction m_previousShaderFunction; + + private List m_registeredMenus; + + private PreMadeShaders m_preMadeShaders; + + private AutoPanData[] m_autoPanArea; + + private DrawInfo m_drawInfo; + private KeyCode m_lastKeyPressed = KeyCode.None; + private System.Type m_commentaryTypeNode; + + private int m_onLoadDone = 0; + + private float m_copyPasteDeltaMul = 0; + private Vector2 m_copyPasteInitialPos = Vector2.zero; + private Vector2 m_copyPasteDeltaPos = Vector2.zero; + + private int m_repaintCount = 0; + private bool m_forceUpdateFromMaterialFlag = false; + + private UnityEngine.Object m_delayedLoadObject = null; + private double m_focusOnSelectionTimestamp; + private double m_focusOnMasterNodeTimestamp; + private double m_wiredDoubleTapTimestamp; + + private bool m_globalPreview = false; + private bool m_globalShowInternalData = true; + + private const double AutoZoomTime = 0.25; + private const double ToggleTime = 0.25; + private const double WiredDoubleTapTime = 0.25; + private const double DoubleClickTime = 0.25; + + private Material m_delayedMaterialSet = null; + + private bool m_mouseDownOnValidArea = false; + + private bool m_removedKeyboardFocus = false; + + private int m_lastHotControl = -1; + + [SerializeField] + private bool m_isShaderFunctionWindow = false; + + private string m_currentTitle = string.Empty; + private bool m_currentTitleMod = false; + + //private Material m_maskingMaterial = null; + //private int m_cachedProjectInLinearId = -1; + private int m_cachedEditorTimeId = -1; + private int m_cachedEditorDeltaTimeId = -1; + //private float m_repaintFrequency = 15; + //private double m_repaintTimestamp = 0; + + // Smooth Zoom + private bool m_smoothZoom = false; + private float m_targetZoom; + private double m_zoomTime; + private Vector2 m_zoomPivot; + private float m_targetZoomIncrement; + private float m_zoomVelocity = 0; + + // Smooth Pan + private bool m_smoothOffset = false; + private double m_offsetTime; + private Vector2 m_targetOffset; + private Vector2 m_camVelocity = Vector2.zero; + + // Auto-Compile samples + private bool m_forcingMaterialUpdateFlag = false; + private bool m_forcingMaterialUpdateOp = false; + private List m_materialsToUpdate = new List(); + + private NodeExporterUtils m_nodeExporterUtils; + private bool m_performFullUndoRegister = true; + + [SerializeField] + private AmplifyShaderFunction m_openedShaderFunction; + + [SerializeField] + private bool m_openedAssetFromNode = false; + + private bool m_nodesLoadedCorrectly = false; + private GUIContent NodesExceptionMessage = new GUIContent( "ASE is unable to load correctly due to some faulty other classes/plugin in your project. We advise to review all your imported plugins." ); + + + private bool m_outdatedShaderFromTemplateLoaded = false; + private bool m_replaceMasterNode = false; + private AvailableShaderTypes m_replaceMasterNodeType; + private string m_replaceMasterNodeData; + private bool m_replaceMasterNodeDataFromCache; + private NodeWireReferencesUtils m_wireReferenceUtils = new NodeWireReferencesUtils(); + + private ParentNode m_nodeToFocus = null; + private float m_zoomToFocus = 1.0f; + private bool m_selectNodeToFocus = true; + + [NonSerialized] + public Dictionary VisitedChanged = new Dictionary(); + + [SerializeField] + private List m_messages = new List(); + + [SerializeField] + private float m_maxMsgWidth = 100; + + [SerializeField] + private bool m_maximizeMessages = false; + + [NonSerialized] + private Dictionary m_savedList = new Dictionary(); + + public int m_frameCounter = 0; + public double m_fpsTime = 0; + public string m_fpsDisplay = string.Empty; + +#if UNITY_EDITOR_WIN + // ScreenShot vars + IntPtr m_aseHandle; + private Rect m_prevWindowRect; + private Vector2 m_prevCameraOffset; + private float m_prevCameraZoom; + private bool m_openSavedFolder = false; + private bool m_takeScreenShot = false; +#endif + public bool CheckFunctions = false; + + // Unity Menu item + [MenuItem( "Window/Amplify Shader Editor/Open Canvas", false, 1000 )] + static void OpenMainShaderGraph() + { + if( IOUtils.AllOpenedWindows.Count > 0 ) + { + AmplifyShaderEditorWindow currentWindow = CreateTab( "Empty", UIUtils.ShaderIcon ); + UIUtils.CurrentWindow = currentWindow; + currentWindow.CreateNewGraph( "Empty" ); + currentWindow.Show(); + } + else + { + AmplifyShaderEditorWindow currentWindow = OpenWindow( "Empty", UIUtils.ShaderIcon ); + currentWindow.CreateNewGraph( "Empty" ); + //currentWindow.Show(); + } + } + + public static string GenerateTabTitle( string original, bool modified = false ) + { + GUIContent content = new GUIContent( original ); + GUIStyle tabStyle = new GUIStyle( (GUIStyle)"dragtabdropwindow" );// GUI.skin.FindStyle( "dragtabdropwindow" ); + string finalTitle = string.Empty; + bool addEllipsis = false; + for( int i = 1; i <= original.Length; i++ ) + { + content.text = original.Substring( 0, i ); + Vector2 titleSize = tabStyle.CalcSize( content ); + int maxSize = modified ? 62 : 69; + if( titleSize.x > maxSize ) + { + addEllipsis = true; + break; + } + else + { + finalTitle = content.text; + } + } + if( addEllipsis ) + finalTitle += ".."; + if( modified ) + finalTitle += "*"; + return finalTitle; + } + + public static void ConvertShaderToASE( Shader shader ) + { + if( UIUtils.IsUnityNativeShader( shader ) ) + { + Debug.LogWarningFormat( "Action not allowed. Attempting to load the native {0} shader into Amplify Shader Editor", shader.name ); + return; + } + + string guid = AssetDatabase.AssetPathToGUID( AssetDatabase.GetAssetPath( shader ) ); + if( IOUtils.AllOpenedWindows.Count > 0 ) + { + AmplifyShaderEditorWindow openedTab = null; + for( int i = 0; i < IOUtils.AllOpenedWindows.Count; i++ ) + { + //if( AssetDatabase.GetAssetPath( shader ).Equals( IOUtils.AllOpenedWindows[ i ].LastOpenedLocation ) ) + if( guid.Equals( IOUtils.AllOpenedWindows[ i ].GUID ) ) + { + openedTab = IOUtils.AllOpenedWindows[ i ]; + break; + } + } + + if( openedTab != null ) + { + openedTab.wantsMouseMove = true; + openedTab.ShowTab(); + UIUtils.CurrentWindow = openedTab; + } + else + { + EditorWindow openedWindow = AmplifyShaderEditorWindow.GetWindow(); + AmplifyShaderEditorWindow currentWindow = CreateTab(); + WindowHelper.AddTab( openedWindow, currentWindow ); + UIUtils.CurrentWindow = currentWindow; + } + } + else + { + AmplifyShaderEditorWindow currentWindow = OpenWindow( shader.name, UIUtils.ShaderIcon ); + UIUtils.CurrentWindow = currentWindow; + } + + if( IOUtils.IsASEShader( shader ) ) + { + UIUtils.CurrentWindow.LoadProjectSelected( shader ); + } + else + { + UIUtils.CreateEmptyFromInvalid( shader ); + UIUtils.ShowMessage( "Trying to open shader not created on ASE!\nBEWARE, old data will be lost if saving it here!", MessageSeverity.Warning ); + if( UIUtils.CurrentWindow.LiveShaderEditing ) + { + UIUtils.ShowMessage( "Disabling Live Shader Editing. Must manually re-enable it.", MessageSeverity.Warning ); + UIUtils.CurrentWindow.LiveShaderEditing = false; + } + } + } + + public static void LoadMaterialToASE( Material material ) + { + string guid = AssetDatabase.AssetPathToGUID( AssetDatabase.GetAssetPath( material.shader ) ); + + if( IOUtils.AllOpenedWindows.Count > 0 ) + { + AmplifyShaderEditorWindow openedTab = null; + for( int i = 0; i < IOUtils.AllOpenedWindows.Count; i++ ) + { + //if( AssetDatabase.GetAssetPath( material.shader ).Equals( IOUtils.AllOpenedWindows[ i ].LastOpenedLocation ) ) + if( guid.Equals( IOUtils.AllOpenedWindows[ i ].GUID ) ) + { + openedTab = IOUtils.AllOpenedWindows[ i ]; + break; + } + } + + if( openedTab != null ) + { + openedTab.wantsMouseMove = true; + openedTab.ShowTab(); + UIUtils.CurrentWindow = openedTab; + } + else + { + EditorWindow openedWindow = AmplifyShaderEditorWindow.GetWindow(); + AmplifyShaderEditorWindow currentWindow = CreateTab(); + WindowHelper.AddTab( openedWindow, currentWindow ); + UIUtils.CurrentWindow = currentWindow; + } + } + else + { + AmplifyShaderEditorWindow currentWindow = OpenWindow( material.name, UIUtils.MaterialIcon ); + UIUtils.CurrentWindow = currentWindow; + } + + if( IOUtils.IsASEShader( material.shader ) ) + { + UIUtils.CurrentWindow.LoadProjectSelected( material ); + } + else + { + UIUtils.CreateEmptyFromInvalid( material.shader ); + UIUtils.SetDelayedMaterialMode( material ); + } + } + + public static void LoadShaderFunctionToASE( AmplifyShaderFunction shaderFunction, bool openedAssetFromNode ) + { + string guid = AssetDatabase.AssetPathToGUID( AssetDatabase.GetAssetPath( shaderFunction ) ); + + if( IOUtils.AllOpenedWindows.Count > 0 ) + { + AmplifyShaderEditorWindow openedTab = null; + for( int i = 0; i < IOUtils.AllOpenedWindows.Count; i++ ) + { + //if( AssetDatabase.GetAssetPath( shaderFunction ).Equals( IOUtils.AllOpenedWindows[ i ].LastOpenedLocation ) ) + if( guid.Equals( IOUtils.AllOpenedWindows[ i ].GUID ) ) + { + openedTab = IOUtils.AllOpenedWindows[ i ]; + break; + } + } + + if( openedTab != null ) + { + openedTab.wantsMouseMove = true; + openedTab.ShowTab(); + UIUtils.CurrentWindow = openedTab; + } + else + { + EditorWindow openedWindow = AmplifyShaderEditorWindow.GetWindow(); + AmplifyShaderEditorWindow currentWindow = CreateTab(); + WindowHelper.AddTab( openedWindow, currentWindow ); + UIUtils.CurrentWindow = currentWindow; + } + } + else + { + AmplifyShaderEditorWindow currentWindow = OpenWindow( shaderFunction.FunctionName, UIUtils.ShaderFunctionIcon ); + UIUtils.CurrentWindow = currentWindow; + } + + UIUtils.CurrentWindow.OpenedAssetFromNode = openedAssetFromNode; + if( IOUtils.IsShaderFunction( shaderFunction.FunctionInfo ) ) + { + UIUtils.CurrentWindow.LoadProjectSelected( shaderFunction ); + } + else + { + UIUtils.CurrentWindow.titleContent.text = GenerateTabTitle( shaderFunction.FunctionName ); + UIUtils.CurrentWindow.titleContent.image = UIUtils.ShaderFunctionIcon; + UIUtils.CreateEmptyFunction( shaderFunction ); + } + } + + public static void LoadAndSaveList( string[] assetList ) + { + EditorPrefs.SetString( "ASEfileList", string.Join( ",", assetList ) ); + if( assetList[ 0 ].EndsWith( ".asset" ) ) + { + var obj = AssetDatabase.LoadAssetAtPath( assetList[ 0 ] ); + AmplifyShaderEditorWindow.LoadShaderFunctionToASE( obj, false ); + } + else + { + var obj = AssetDatabase.LoadAssetAtPath( assetList[ 0 ] ); + AmplifyShaderEditorWindow.ConvertShaderToASE( obj ); + } + + UIUtils.CurrentWindow.State = AmplifyShaderEditorWindow.OpenSaveState.OPEN; + UIUtils.CurrentWindow.Repaint(); + } + + public static AmplifyShaderEditorWindow OpenWindow( string title = null, Texture icon = null ) + { + AmplifyShaderEditorWindow currentWindow = (AmplifyShaderEditorWindow)AmplifyShaderEditorWindow.GetWindow( typeof( AmplifyShaderEditorWindow ), false ); + currentWindow.minSize = new Vector2( ( Constants.MINIMIZE_WINDOW_LOCK_SIZE - 150 ), 270 ); + currentWindow.wantsMouseMove = true; + if( title != null ) + currentWindow.titleContent.text = GenerateTabTitle( title ); + if( icon != null ) + currentWindow.titleContent.image = icon; + return currentWindow; + } + + public static AmplifyShaderEditorWindow CreateTab( string title = null, Texture icon = null ) + { + AmplifyShaderEditorWindow currentWindow = EditorWindow.CreateInstance(); + currentWindow.minSize = new Vector2( ( Constants.MINIMIZE_WINDOW_LOCK_SIZE - 150 ), 270 ); + currentWindow.wantsMouseMove = true; + if( title != null ) + currentWindow.titleContent.text = GenerateTabTitle( title ); + if( icon != null ) + currentWindow.titleContent.image = icon; + return currentWindow; + } + + public double CalculateInactivityTime() + { + double currTime = EditorApplication.timeSinceStartup; + switch( Event.current.type ) + { + case EventType.MouseDown: + case EventType.MouseUp: + //case EventType.MouseMove: + case EventType.MouseDrag: + case EventType.KeyDown: + case EventType.KeyUp: + case EventType.ScrollWheel: + case EventType.DragUpdated: + case EventType.DragPerform: + case EventType.DragExited: + case EventType.ValidateCommand: + case EventType.ExecuteCommand: + { + m_inactivityTime = currTime; + return 0; + } + } + return currTime - m_inactivityTime; + } + + + // Shader Graph window + public override void OnEnable() + { + base.OnEnable(); + + Preferences.LoadDefaults(); + +#if UNITY_2018_3_OR_NEWER + ASEPackageManagerHelper.RequestInfo(); + ASEPackageManagerHelper.Update(); +#endif + + Shader.SetGlobalVector( PreviewSizeGlobalVariable, new Vector4( ParentNode.PreviewWidth, ParentNode.PreviewHeight, 0, 0 ) ); + + if( m_templatesManager == null ) + { + m_templatesManager = IOUtils.FirstValidTemplatesManager; + if( m_templatesManager == null ) + { + m_templatesManager = ScriptableObject.CreateInstance(); + m_templatesManager.Init(); + if( TemplatesManager.ShowDebugMessages ) + Debug.Log( "Creating Manager" ); + } + else + { + if( TemplatesManager.ShowDebugMessages ) + Debug.Log( "Assigning Manager" ); + } + } + else if( !m_templatesManager.Initialized ) + { + if( TemplatesManager.ShowDebugMessages ) + Debug.Log( "Re-Initializing Manager" ); + m_templatesManager.Init(); + } + TemplatePostProcessor.Destroy(); + if( m_innerEditorVariables == null ) + { + m_innerEditorVariables = new InnerWindowEditorVariables(); + m_innerEditorVariables.Initialize(); + } + + if( m_mainGraphInstance == null ) + { + m_mainGraphInstance = CreateInstance(); + m_mainGraphInstance.Init(); + m_mainGraphInstance.ParentWindow = this; + m_mainGraphInstance.SetGraphId( 0 ); + } + m_mainGraphInstance.ResetEvents(); + m_mainGraphInstance.OnNodeEvent += OnNodeStoppedMovingEvent; + m_mainGraphInstance.OnMaterialUpdatedEvent += OnMaterialUpdated; + m_mainGraphInstance.OnShaderUpdatedEvent += OnShaderUpdated; + m_mainGraphInstance.OnEmptyGraphDetectedEvt += OnEmptyGraphDetected; + m_mainGraphInstance.OnNodeRemovedEvent += m_toolsWindow.OnNodeRemovedFromGraph; + GraphCount = 1; + + IOUtils.Init(); + IOUtils.AllOpenedWindows.Add( this ); + + // Only runs once for multiple windows + EditorApplication.update -= IOUtils.UpdateIO; + EditorApplication.update += IOUtils.UpdateIO; + + //EditorApplication.update -= UpdateTime; + EditorApplication.update -= UpdateNodePreviewListAndTime; + //EditorApplication.update += UpdateTime; + + EditorApplication.update += UpdateNodePreviewListAndTime; + + + if( CurrentSelection == ASESelectionMode.ShaderFunction ) + { + IsShaderFunctionWindow = true; + } + else + { + IsShaderFunctionWindow = false; + } + + m_optionsWindow = new OptionsWindow( this ); + m_optionsWindow.Init(); + + m_contextMenu = new GraphContextMenu( m_mainGraphInstance ); + m_nodesLoadedCorrectly = m_contextMenu.CorrectlyLoaded; + + m_paletteWindow = new PaletteWindow( this ) + { + Resizable = true + }; + m_paletteWindow.OnPaletteNodeCreateEvt += OnPaletteNodeCreate; + m_registeredMenus.Add( m_paletteWindow ); + + m_contextPalette = new ContextPalette( this ); + m_contextPalette.OnPaletteNodeCreateEvt += OnContextPaletteNodeCreate; + m_registeredMenus.Add( m_contextPalette ); + + m_genericMessageUI = new GenericMessageUI(); + m_genericMessageUI.OnMessageDisplayEvent += ShowMessageImmediately; + + Selection.selectionChanged += OnProjectSelectionChanged; +#if UNITY_2018_1_OR_NEWER + EditorApplication.projectChanged += OnProjectWindowChanged; +#else + EditorApplication.projectWindowChanged += OnProjectWindowChanged; +#endif + m_focusOnSelectionTimestamp = EditorApplication.timeSinceStartup; + m_focusOnMasterNodeTimestamp = EditorApplication.timeSinceStartup; + + m_nodeParametersWindow.IsMaximized = m_innerEditorVariables.NodeParametersMaximized; + if( DebugConsoleWindow.UseShaderPanelsInfo ) + m_nodeParametersWindow.IsMaximized = m_nodeParametersWindowMaximized; + + m_paletteWindow.IsMaximized = m_innerEditorVariables.NodePaletteMaximized; + if( DebugConsoleWindow.UseShaderPanelsInfo ) + m_paletteWindow.IsMaximized = m_paletteWindowMaximized; + + m_shortcutManager = new ShortcutsManager(); + // REGISTER NODE SHORTCUTS + foreach( KeyValuePair kvp in m_contextMenu.NodeShortcuts ) + { + m_shortcutManager.RegisterNodesShortcuts( kvp.Key, kvp.Value.Name ); + } + + // REGISTER EDITOR SHORTCUTS + + m_shortcutManager.RegisterEditorShortcut( true, EventModifiers.FunctionKey, KeyCode.F1, "Open Selected Node Wiki page", () => + { + List selectedNodes = m_mainGraphInstance.SelectedNodes; + if( selectedNodes != null && selectedNodes.Count == 1 ) + { + Application.OpenURL( selectedNodes[ 0 ].Attributes.NodeUrl ); + } + } ); + + + m_shortcutManager.RegisterEditorShortcut( true, KeyCode.C, "Create Commentary", () => + { + // Create commentary + ParentNode[] selectedNodes = m_mainGraphInstance.SelectedNodes.ToArray(); + UIUtils.MarkUndoAction(); + Undo.RegisterCompleteObjectUndo( this, "Adding Commentary Node" ); + CommentaryNode node = m_mainGraphInstance.CreateNode( m_commentaryTypeNode, true, -1, false ) as CommentaryNode; + node.CreateFromSelectedNodes( TranformedMousePos, selectedNodes ); + node.Focus(); + m_mainGraphInstance.DeSelectAll(); + m_mainGraphInstance.SelectNode( node, false, false ); + SetSaveIsDirty(); + ForceRepaint(); + } ); + + + m_shortcutManager.RegisterEditorShortcut( true, KeyCode.F, "Focus On Selection", () => + { + OnToolButtonPressed( ToolButtonType.FocusOnSelection ); + ForceRepaint(); + } ); + + //m_shortcutManager.RegisterEditorShortcut( true, EventModifiers.None, KeyCode.B, "New Master Node", () => + //{ + // OnToolButtonPressed( ToolButtonType.MasterNode ); + // ForceRepaint(); + //} ); + + m_shortcutManager.RegisterEditorShortcut( true, EventModifiers.None, KeyCode.Space, "Open Node Palette", null, () => + { + m_contextPalette.Show( m_currentMousePos2D, m_cameraInfo ); + } ); + + + m_shortcutManager.RegisterEditorShortcut( true, KeyCode.W, "Toggle Colored Line Mode", () => + { + m_optionsWindow.ColoredPorts = !m_optionsWindow.ColoredPorts; + ForceRepaint(); + + } ); + + m_shortcutManager.RegisterEditorShortcut( true, EventModifiers.Control, KeyCode.W, "Toggle Multi-Line Mode", () => + { + m_optionsWindow.MultiLinePorts = !m_optionsWindow.MultiLinePorts; + ForceRepaint(); + } ); + + m_shortcutManager.RegisterEditorShortcut( true, KeyCode.P, "Global Preview", () => + { + GlobalPreview = !GlobalPreview; + EditorPrefs.SetBool( "GlobalPreview", GlobalPreview ); + + ForceRepaint(); + } ); + + GlobalShowInternalData = EditorPrefs.GetBool( "ASEGlobalShowInternalData", true ); + m_shortcutManager.RegisterEditorShortcut( true, KeyCode.I, "Global Show Internal Data", () => + { + GlobalShowInternalData = !GlobalShowInternalData; + EditorPrefs.SetBool( "ASEGlobalShowInternalData", GlobalShowInternalData ); + ForceRepaint(); + } ); + + m_shortcutManager.RegisterEditorShortcut( true, EventModifiers.FunctionKey, KeyCode.Delete, "Delete selected nodes", DeleteSelectedNodeWithRepaint ); + m_shortcutManager.RegisterEditorShortcut( true, EventModifiers.FunctionKey, KeyCode.Backspace, "Delete selected nodes", DeleteSelectedNodeWithRepaint ); + + m_liveShaderEditing = m_innerEditorVariables.LiveMode; + + UpdateLiveUI(); + } + + + public AmplifyShaderEditorWindow() + { + m_minNodePos = new Vector2( float.MaxValue, float.MaxValue ); + m_maxNodePos = new Vector2( float.MinValue, float.MinValue ); + + m_duplicatePreventionBuffer = new DuplicatePreventionBuffer(); + m_commentaryTypeNode = typeof( CommentaryNode ); + titleContent = new GUIContent( "Shader Editor" ); + autoRepaintOnSceneChange = true; + + m_currentMousePos = new Vector3( 0, 0, 0 ); + m_keyEvtMousePos2D = new Vector2( 0, 0 ); + m_multipleSelectionStart = new Vector2( 0, 0 ); + m_initialized = false; + m_graphBgTexture = null; + m_graphFgTexture = null; + + m_cameraOffset = new Vector2( 0, 0 ); + CameraZoom = 1; + + m_registeredMenus = new List(); + + m_nodeParametersWindow = new NodeParametersWindow( this ) + { + Resizable = true + }; + m_registeredMenus.Add( m_nodeParametersWindow ); + + m_modeWindow = new ShaderEditorModeWindow( this ); + //_registeredMenus.Add( _modeWindow ); + + m_toolsWindow = new ToolsWindow( this ); + m_toolsWindow.ToolButtonPressedEvt += OnToolButtonPressed; + + m_consoleLogWindow = new ConsoleLogWindow( this ); + + m_tipsWindow = new TipsWindow( this ); + + m_registeredMenus.Add( m_toolsWindow ); + //m_registeredMenus.Add( m_consoleLogWindow ); + + m_palettePopup = new PalettePopUp(); + + m_clipboard = new Clipboard(); + + m_genericMessageContent = new GUIContent(); + m_dragAndDropTool = new DragAndDropTool(); + m_dragAndDropTool.OnValidDropObjectEvt += OnValidObjectsDropped; + + //_confirmationWindow = new ConfirmationWindow( 100, 100, 300, 100 ); + + m_saveIsDirty = false; + + m_preMadeShaders = new PreMadeShaders(); + + Undo.undoRedoPerformed += UndoRedoPerformed; + + float autoPanSpeed = 2; + m_autoPanArea = new AutoPanData[ 4 ]; + m_autoPanArea[ 0 ] = new AutoPanData( AutoPanLocation.TOP, 25, autoPanSpeed * Vector2.up ); + m_autoPanArea[ 1 ] = new AutoPanData( AutoPanLocation.BOTTOM, 25, autoPanSpeed * Vector2.down ); + m_autoPanArea[ 2 ] = new AutoPanData( AutoPanLocation.LEFT, 25, autoPanSpeed * Vector2.right ); + m_autoPanArea[ 3 ] = new AutoPanData( AutoPanLocation.RIGHT, 25, autoPanSpeed * Vector2.left ); + + m_drawInfo = new DrawInfo(); + UIUtils.CurrentWindow = this; + + m_nodeExporterUtils = new NodeExporterUtils( this ); + m_repaintIsDirty = false; + m_initialized = false; + } + + public void SetStandardShader() + { + m_mainGraphInstance.ReplaceMasterNode( AvailableShaderTypes.SurfaceShader ); + m_mainGraphInstance.FireMasterNodeReplacedEvent(); + } + + public void SetTemplateShader( string templateName, bool writeDefaultData ) + { + TemplateDataParent templateData = m_templatesManager.GetTemplate( ( string.IsNullOrEmpty( templateName ) ? "6e114a916ca3e4b4bb51972669d463bf" : templateName ) ); + m_mainGraphInstance.ReplaceMasterNode( AvailableShaderTypes.Template, writeDefaultData, templateData ); + } + + public void DeleteSelectedNodeWithRepaint() + { + DeleteSelectedNodes(); + SetSaveIsDirty(); + } + + + void UndoRedoPerformed() + { + m_repaintIsDirty = true; + m_saveIsDirty = true; + m_removedKeyboardFocus = true; + m_refreshOnUndo = true; + } + + void Destroy() + { + Undo.ClearUndo( this ); + + m_initialized = false; + + m_nodeExporterUtils.Destroy(); + m_nodeExporterUtils = null; + + m_delayedMaterialSet = null; + + m_materialsToUpdate.Clear(); + m_materialsToUpdate = null; + + GLDraw.Destroy(); + + UIUtils.Destroy(); + m_preMadeShaders.Destroy(); + m_preMadeShaders = null; + + m_registeredMenus.Clear(); + m_registeredMenus = null; + + m_mainGraphInstance.Destroy(); + ScriptableObject.DestroyImmediate( m_mainGraphInstance ); + m_mainGraphInstance = null; + + Resources.UnloadAsset( m_graphBgTexture ); + m_graphBgTexture = null; + + Resources.UnloadAsset( m_graphFgTexture ); + m_graphFgTexture = null; + + Resources.UnloadAsset( m_wireTexture ); + m_wireTexture = null; + + m_contextMenu.Destroy(); + m_contextMenu = null; + + m_shortcutManager.Destroy(); + m_shortcutManager = null; + + m_nodeParametersWindow.Destroy(); + m_nodeParametersWindow = null; + + + m_modeWindow.Destroy(); + m_modeWindow = null; + + m_toolsWindow.Destroy(); + m_toolsWindow = null; + + m_consoleLogWindow.Destroy(); + m_consoleLogWindow = null; + + m_tipsWindow.Destroy(); + m_tipsWindow = null; + + m_optionsWindow.Destroy(); + m_optionsWindow = null; + + m_paletteWindow.Destroy(); + m_paletteWindow = null; + + m_palettePopup.Destroy(); + m_palettePopup = null; + + m_contextPalette.Destroy(); + m_contextPalette = null; + + m_clipboard.ClearClipboard(); + m_clipboard = null; + + m_genericMessageUI.Destroy(); + m_genericMessageUI = null; + m_genericMessageContent = null; + + m_dragAndDropTool.Destroy(); + m_dragAndDropTool = null; + + m_openedShaderFunction = null; + + UIUtils.CurrentWindow = null; + m_duplicatePreventionBuffer.ReleaseAllData(); + m_duplicatePreventionBuffer = null; +#if UNITY_2018_1_OR_NEWER + EditorApplication.projectChanged -= OnProjectWindowChanged; +#else + EditorApplication.projectWindowChanged -= OnProjectWindowChanged; +#endif + Selection.selectionChanged -= OnProjectSelectionChanged; + + IOUtils.AllOpenedWindows.Remove( this ); + + if( IOUtils.AllOpenedWindows.Count == 0 ) + { + m_templatesManager.Destroy(); + ScriptableObject.DestroyImmediate( m_templatesManager ); + } + m_templatesManager = null; + + IOUtils.Destroy(); + + Resources.UnloadUnusedAssets(); + GC.Collect(); + } + + void Init() + { + // = AssetDatabase.LoadAssetAtPath( Constants.ASEPath + "", typeof( Texture2D ) ) as Texture2D; + m_graphBgTexture = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( IOUtils.GraphBgTextureGUID ), typeof( Texture2D ) ) as Texture2D; + if( m_graphBgTexture != null ) + { + m_graphFgTexture = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( IOUtils.GraphFgTextureGUID ), typeof( Texture2D ) ) as Texture2D; + + //Setup usable area + m_cameraInfo = position; + m_graphArea = new Rect( 0, 0, m_cameraInfo.width, m_cameraInfo.height ); + + // Creating style state to show current selected object + m_graphFontStyle = new GUIStyle() + { + fontSize = 32, + alignment = TextAnchor.MiddleCenter, + fixedWidth = m_cameraInfo.width, + fixedHeight = 50, + stretchWidth = true, + stretchHeight = true + }; + m_graphFontStyle.normal.textColor = Color.white; + + m_wireTexture = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( IOUtils.WireTextureGUID ), typeof( Texture2D ) ) as Texture2D; + + m_initialized = m_graphBgTexture != null && + m_graphFgTexture != null && + m_wireTexture != null; + } + } +#if UNITY_2018_3_OR_NEWER + + +#endif + [OnOpenAssetAttribute()] + static bool OnOpenAsset( int instanceID, int line ) + { + if( line > -1 ) + { + return false; + } + Preferences.LoadDefaults(); +#if UNITY_2018_3_OR_NEWER + ASEPackageManagerHelper.RequestInfo(); + ASEPackageManagerHelper.Update(); + if( ASEPackageManagerHelper.IsProcessing ) + { + Shader selectedShader = Selection.activeObject as Shader; + if( selectedShader != null ) + { + if( IOUtils.IsASEShader( selectedShader ) ) + { + ASEPackageManagerHelper.SetupLateShader( selectedShader ); + return true; + } + } + else + { + Material mat = Selection.activeObject as Material; + if( mat != null ) + { + if( IOUtils.IsASEShader( mat.shader ) ) + { + ASEPackageManagerHelper.SetupLateMaterial( mat ); + return true; + } + } + else + { + AmplifyShaderFunction shaderFunction = Selection.activeObject as AmplifyShaderFunction; + if( shaderFunction != null ) + { + if( IOUtils.IsShaderFunction( shaderFunction.FunctionInfo ) ) + { + ASEPackageManagerHelper.SetupLateShaderFunction( shaderFunction ); + return true; + } + } + } + } + } + else +#endif + { + Shader selectedShader = Selection.activeObject as Shader; + if( selectedShader != null ) + { + if( IOUtils.IsASEShader( selectedShader ) ) + { + ConvertShaderToASE( selectedShader ); + return true; + } + } + else + { + Material mat = Selection.activeObject as Material; + if( mat != null ) + { + if( IOUtils.IsASEShader( mat.shader ) ) + { + LoadMaterialToASE( mat ); + return true; + } + } + else + { + AmplifyShaderFunction shaderFunction = Selection.activeObject as AmplifyShaderFunction; + if( shaderFunction != null ) + { + if( IOUtils.IsShaderFunction( shaderFunction.FunctionInfo ) ) + { + LoadShaderFunctionToASE( shaderFunction, false ); + return true; + } + } + } + } + } + + return false; + } + + [MenuItem( "Assets/Create/Amplify Shader/Surface", false, 84 )] + [MenuItem( "Assets/Create/Shader/Amplify Surface Shader" )] + static void CreateConfirmationStandardShader() + { + string path = AssetDatabase.GetAssetPath( Selection.activeObject ); + if( path == "" ) + { + path = "Assets"; + } + else if( System.IO.Path.GetExtension( path ) != "" ) + { + path = path.Replace( System.IO.Path.GetFileName( AssetDatabase.GetAssetPath( Selection.activeObject ) ), "" ); + } + + string assetPathAndName = AssetDatabase.GenerateUniqueAssetPath( path + "/New Amplify Shader.shader" ); + var endNameEditAction = ScriptableObject.CreateInstance(); + ProjectWindowUtil.StartNameEditingIfProjectWindowExists( 0, endNameEditAction, assetPathAndName, AssetPreview.GetMiniTypeThumbnail( typeof( Shader ) ), null ); + } + //static void CreateNewShader( ) + //{ + // CreateNewShader( null, null ); + //} + + static void CreateNewShader( string customPath , string customShaderName ) + { + + string path = string.Empty; + if( string.IsNullOrEmpty( customPath ) ) + { + if( Selection.activeObject != null ) + { + path = ( IOUtils.dataPath + AssetDatabase.GetAssetPath( Selection.activeObject ) ); + } + else + { + UnityEngine.Object[] selection = Selection.GetFiltered( typeof( UnityEngine.Object ), SelectionMode.DeepAssets ); + if( selection.Length > 0 && selection[ 0 ] != null ) + { + path = ( IOUtils.dataPath + AssetDatabase.GetAssetPath( selection[ 0 ] ) ); + } + else + { + path = Application.dataPath; + } + + } + + if( path.IndexOf( '.' ) > -1 ) + { + path = path.Substring( 0, path.LastIndexOf( '/' ) ); + } + path += "/"; + } + else + { + path = customPath; + } + + if( IOUtils.AllOpenedWindows.Count > 0 ) + { + EditorWindow openedWindow = AmplifyShaderEditorWindow.GetWindow(); + AmplifyShaderEditorWindow currentWindow = CreateTab(); + WindowHelper.AddTab( openedWindow, currentWindow ); + UIUtils.CurrentWindow = currentWindow; + Shader shader = UIUtils.CreateNewEmpty( path, customShaderName ); + Selection.activeObject = shader; + } + else + { + AmplifyShaderEditorWindow currentWindow = OpenWindow(); + UIUtils.CurrentWindow = currentWindow; + Shader shader = UIUtils.CreateNewEmpty( path, customShaderName ); + Selection.activeObject = shader; + } + //Selection.objects = new UnityEngine.Object[] { shader }; + } + + public static void CreateConfirmationTemplateShader( string templateGuid ) + { + UIUtils.NewTemplateGUID = templateGuid; + string path = AssetDatabase.GetAssetPath( Selection.activeObject ); + if( path == "" ) + { + path = "Assets"; + } + else if( System.IO.Path.GetExtension( path ) != "" ) + { + path = path.Replace( System.IO.Path.GetFileName( AssetDatabase.GetAssetPath( Selection.activeObject ) ), "" ); + } + + string assetPathAndName = AssetDatabase.GenerateUniqueAssetPath( path + "/New Amplify Shader.shader" ); + var endNameEditAction = ScriptableObject.CreateInstance(); + ProjectWindowUtil.StartNameEditingIfProjectWindowExists( 0, endNameEditAction, assetPathAndName, AssetPreview.GetMiniTypeThumbnail( typeof( Shader ) ), null ); + } + + public static Shader CreateNewTemplateShader( string templateGUID , string customPath = null, string customShaderName = null ) + { + string path = string.Empty; + if( string.IsNullOrEmpty( customPath ) ) + { + path = Selection.activeObject == null ? Application.dataPath : ( IOUtils.dataPath + AssetDatabase.GetAssetPath( Selection.activeObject ) ); + if( path.IndexOf( '.' ) > -1 ) + { + path = path.Substring( 0, path.LastIndexOf( '/' ) ); + } + path += "/"; + } + else + { + path = customPath; + } + Shader shader = null; + if( IOUtils.AllOpenedWindows.Count > 0 ) + { + EditorWindow openedWindow = AmplifyShaderEditorWindow.GetWindow(); + AmplifyShaderEditorWindow currentWindow = CreateTab(); + WindowHelper.AddTab( openedWindow, currentWindow ); + UIUtils.CurrentWindow = currentWindow; + shader = UIUtils.CreateNewEmptyTemplate( templateGUID, path, customShaderName ); + Selection.activeObject = shader; + } + else + { + AmplifyShaderEditorWindow currentWindow = OpenWindow(); + UIUtils.CurrentWindow = currentWindow; + shader = UIUtils.CreateNewEmptyTemplate( templateGUID, path, customShaderName ); + Selection.activeObject = shader; + } + + //Selection.objects = new UnityEngine.Object[] { shader }; + return shader; + } + + [MenuItem( "Assets/Create/Amplify Shader Function", false, 84 )] + [MenuItem( "Assets/Create/Shader/Amplify Shader Function" )] + static void CreateNewShaderFunction() + { + AmplifyShaderFunction asset = ScriptableObject.CreateInstance(); + + string path = AssetDatabase.GetAssetPath( Selection.activeObject ); + if( path == "" ) + { + path = "Assets"; + } + else if( System.IO.Path.GetExtension( path ) != "" ) + { + path = path.Replace( System.IO.Path.GetFileName( AssetDatabase.GetAssetPath( Selection.activeObject ) ), "" ); + } + + string assetPathAndName = AssetDatabase.GenerateUniqueAssetPath( path + "/New ShaderFunction.asset" ); + + var endNameEditAction = ScriptableObject.CreateInstance(); + ProjectWindowUtil.StartNameEditingIfProjectWindowExists( asset.GetInstanceID(), endNameEditAction, assetPathAndName, AssetPreview.GetMiniThumbnail( asset ), null ); + } + + public void UpdateTabTitle( string newTitle, bool modified ) + { + string[] titleArray = newTitle.Split( '/' ); + newTitle = titleArray[ titleArray.Length - 1 ]; + + if( !( m_currentTitle.Equals( newTitle ) && m_currentTitleMod == modified ) ) + { + this.titleContent.text = GenerateTabTitle( newTitle, modified ); + } + m_currentTitle = newTitle; + m_currentTitleMod = modified; + } + + public void OnProjectWindowChanged() + { + Shader selectedShader = Selection.activeObject as Shader; + if( selectedShader != null ) + { + if( m_mainGraphInstance != null && m_mainGraphInstance.CurrentMasterNode != null && selectedShader == m_mainGraphInstance.CurrentMasterNode.CurrentShader ) + { + m_lastOpenedLocation = AssetDatabase.GetAssetPath( selectedShader ); + } + } + } + + public void LoadProjectSelected( UnityEngine.Object selectedObject = null ) + { + bool hasFocus = true; + if( EditorWindow.focusedWindow != this ) + { + hasFocus = false; + } + + if( hasFocus && m_mainGraphInstance != null && m_mainGraphInstance.CurrentMasterNode != null ) + { + LoadObject( selectedObject ?? Selection.activeObject ); + } + else + { + m_delayedLoadObject = selectedObject ?? Selection.activeObject; + } + + if( !hasFocus ) + Focus(); + } + + public void LoadObject( UnityEngine.Object objToLoad ) + { + Shader selectedShader = objToLoad as Shader; + Material selectedMaterial = objToLoad as Material; + AmplifyShaderFunction selectedFunction = objToLoad as AmplifyShaderFunction; + + if( selectedFunction != null ) + { + IsShaderFunctionWindow = true; + m_mainGraphInstance.CurrentCanvasMode = NodeAvailability.ShaderFunction; + } + else + { + IsShaderFunctionWindow = false; + } + + ASESelectionMode selectedFileType = ASESelectionMode.Shader; + if( selectedShader != null ) + { + selectedFileType = ASESelectionMode.Shader; + } + else if( selectedMaterial != null ) + { + selectedFileType = ASESelectionMode.Material; + } + else if( selectedFunction != null ) + { + selectedFileType = ASESelectionMode.ShaderFunction; + } + + + switch( CurrentSelection ) + { + case ASESelectionMode.Shader: + { + if( ShaderIsModified ) + { + Shader currShader = m_mainGraphInstance.CurrentMasterNode.CurrentShader; + bool savePrevious = UIUtils.DisplayDialog( AssetDatabase.GetAssetPath( currShader ) ); + OnSaveShader( savePrevious, currShader, null, null ); + } + } + break; + case ASESelectionMode.Material: + { + if( ShaderIsModified ) + { + Shader currShader = m_mainGraphInstance.CurrentMasterNode.CurrentShader; + bool savePrevious = UIUtils.DisplayDialog( AssetDatabase.GetAssetPath( currShader ) ); + OnSaveShader( savePrevious, currShader, m_mainGraphInstance.CurrentMasterNode.CurrentMaterial, null ); + } + } + break; + case ASESelectionMode.ShaderFunction: + { + if( ShaderIsModified ) + { + bool savePrevious = UIUtils.DisplayDialog( AssetDatabase.GetAssetPath( m_openedShaderFunction ) ); + OnSaveShader( savePrevious, null, null, selectedFunction ); + } + } + break; + } + + switch( selectedFileType ) + { + case ASESelectionMode.Shader: + { + LoadDroppedObject( true, selectedShader, null ); + } + break; + case ASESelectionMode.Material: + { + LoadDroppedObject( true, selectedMaterial.shader, selectedMaterial ); + } + break; + case ASESelectionMode.ShaderFunction: + { + LoadDroppedObject( true, null, null, selectedFunction ); + } + break; + } + + m_openedShaderFunction = m_mainGraphInstance.CurrentShaderFunction; + + //Need to force one graph draw because it wont call OnGui propertly since its focuses somewhere else + // Focus() doesn't fix this since it only changes keyboard focus + m_drawInfo.InvertedZoom = 1 / m_cameraZoom; + + m_mainGraphInstance.IsLoading = true; + m_mainGraphInstance.Draw( m_drawInfo ); + m_mainGraphInstance.IsLoading = false; + ShaderIsModified = false; + Focus(); + Repaint(); + } + + public void OnProjectSelectionChanged() + { + if( m_loadShaderOnSelection ) + { + LoadProjectSelected(); + } + } + + ShaderLoadResult OnSaveShader( bool value, Shader shader, Material material, AmplifyShaderFunction function ) + { + if( value ) + { + SaveToDisk( false ); + } + + return value ? ShaderLoadResult.LOADED : ShaderLoadResult.FILE_NOT_FOUND; + } + + public void ResetCameraSettings() + { + m_cameraInfo = position; + m_cameraOffset = new Vector2( m_cameraInfo.width * 0.5f, m_cameraInfo.height * 0.5f ); + CameraZoom = 1; + } + + public void Reset() + { + if( m_mainGraphInstance == null ) + { + m_mainGraphInstance = CreateInstance(); + m_mainGraphInstance.Init(); + m_mainGraphInstance.ParentWindow = this; + m_mainGraphInstance.SetGraphId( 0 ); + } + m_mainGraphInstance.ResetEvents(); + m_mainGraphInstance.OnNodeEvent += OnNodeStoppedMovingEvent; + m_mainGraphInstance.OnMaterialUpdatedEvent += OnMaterialUpdated; + m_mainGraphInstance.OnShaderUpdatedEvent += OnShaderUpdated; + m_mainGraphInstance.OnEmptyGraphDetectedEvt += OnEmptyGraphDetected; + m_mainGraphInstance.OnNodeRemovedEvent += m_toolsWindow.OnNodeRemovedFromGraph; + m_outdatedShaderFromTemplateLoaded = false; + GraphCount = 1; + + FullCleanUndoStack(); + m_performFullUndoRegister = true; + m_toolsWindow.BorderStyle = null; + m_selectionMode = ASESelectionMode.Shader; + ResetCameraSettings(); + UIUtils.ResetMainSkin(); + m_duplicatePreventionBuffer.ReleaseAllData(); + if( m_genericMessageUI != null ) + m_genericMessageUI.CleanUpMessageStack(); + } + + + public Shader CreateNewGraph( string name ) + { + Reset(); + UIUtils.DirtyMask = false; + m_mainGraphInstance.CreateNewEmpty( name ); + m_lastOpenedLocation = string.Empty; + UIUtils.DirtyMask = true; + return m_mainGraphInstance.CurrentMasterNode.CurrentShader; + } + + public Shader CreateNewTemplateGraph( string templateGUID ) + { + Reset(); + UIUtils.DirtyMask = false; + m_mainGraphInstance.CreateNewEmptyTemplate( templateGUID ); + m_lastOpenedLocation = string.Empty; + UIUtils.DirtyMask = true; + return m_mainGraphInstance.CurrentMasterNode.CurrentShader; + } + + public Shader CreateNewGraph( Shader shader ) + { + Reset(); + UIUtils.DirtyMask = false; + m_mainGraphInstance.CreateNewEmpty( shader.name ); + m_mainGraphInstance.CurrentMasterNode.CurrentShader = shader; + + m_lastOpenedLocation = string.Empty; + UIUtils.DirtyMask = true; + return m_mainGraphInstance.CurrentMasterNode.CurrentShader; + } + + public void CreateNewFunctionGraph( AmplifyShaderFunction shaderFunction ) + { + Reset(); + UIUtils.DirtyMask = false; + m_mainGraphInstance.CreateNewEmptyFunction( shaderFunction ); + m_mainGraphInstance.CurrentShaderFunction = shaderFunction; + + m_lastOpenedLocation = AssetDatabase.GetAssetPath( shaderFunction ); //string.Empty; + UIUtils.DirtyMask = true; + //return m_mainGraphInstance.CurrentMasterNode.CurrentShader; + } + + public bool SaveToDisk( bool checkTimestamp ) + { + if( checkTimestamp ) + { + if( !m_cacheSaveOp ) + { + m_lastTimeSaved = EditorApplication.timeSinceStartup; + m_cacheSaveOp = true; + } + return false; + } + + + System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture; + + m_customGraph = null; + m_cacheSaveOp = false; + ShaderIsModified = false; + m_mainGraphInstance.LoadedShaderVersion = VersionInfo.FullNumber; + m_lastTimeSaved = EditorApplication.timeSinceStartup; + + if( m_mainGraphInstance.CurrentMasterNodeId == Constants.INVALID_NODE_ID ) + { + Shader currentShader = m_mainGraphInstance.CurrentMasterNode != null ? m_mainGraphInstance.CurrentMasterNode.CurrentShader : null; + string newShader; + if( !String.IsNullOrEmpty( m_lastOpenedLocation ) ) + { + newShader = m_lastOpenedLocation; + } + else if( currentShader != null ) + { + newShader = AssetDatabase.GetAssetPath( currentShader ); + } + else + { + newShader = EditorUtility.SaveFilePanel( "Select Shader to save", Application.dataPath, "MyShader", "shader" ); + } + + if( !String.IsNullOrEmpty( newShader ) ) + { + ShowMessage( "No Master node assigned.\nShader file will only have node info" ); + IOUtils.StartSaveThread( GenerateGraphInfo(), newShader ); + AssetDatabase.Refresh(); + LoadFromDisk( newShader ); + System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture; + return true; + } + } + else if( m_mainGraphInstance.CurrentMasterNode != null ) + { + //m_mainGraphInstance.CurrentStandardSurface.ForceReordering(); + Shader currShader = m_mainGraphInstance.CurrentMasterNode.CurrentShader; + if( currShader != null ) + { + m_mainGraphInstance.FireMasterNode( currShader ); + Material material = m_mainGraphInstance.CurrentMaterial; + m_lastpath = ( material != null ) ? AssetDatabase.GetAssetPath( material ) : AssetDatabase.GetAssetPath( currShader ); + EditorPrefs.SetString( IOUtils.LAST_OPENED_OBJ_ID, m_lastpath ); + System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture; + if( IOUtils.OnShaderSavedEvent != null ) + { + string info = string.Empty; + if( !m_mainGraphInstance.IsStandardSurface ) + { + TemplateMultiPassMasterNode masterNode = m_mainGraphInstance.GetMainMasterNodeOfLOD( -1 ); + if( masterNode != null ) + { + info = masterNode.CurrentTemplate.GUID; + } + } + IOUtils.OnShaderSavedEvent( currShader, !m_mainGraphInstance.IsStandardSurface, info ); + } + return true; + } + else + { + + string shaderName; + string pathName; + IOUtils.GetShaderName( out shaderName, out pathName, Constants.DefaultShaderName, UIUtils.LatestOpenedFolder ); + if( !String.IsNullOrEmpty( pathName ) ) + { + UIUtils.CurrentWindow.CurrentGraph.CurrentMasterNode.SetName( shaderName ); + m_mainGraphInstance.FireMasterNode( pathName, true ); + m_lastpath = pathName; + EditorPrefs.SetString( IOUtils.LAST_OPENED_OBJ_ID, pathName ); + System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture; + return true; + } + } + } + else + { + //m_nodeParametersWindow.ForceReordering(); + m_mainGraphInstance.ResetNodesLocalVariables(); + + List functionInputNodes = UIUtils.FunctionInputList(); + functionInputNodes.Sort( ( x, y ) => { return x.OrderIndex.CompareTo( y.OrderIndex ); } ); + for( int i = 0; i < functionInputNodes.Count; i++ ) + { + functionInputNodes[ i ].OrderIndex = i; + } + + List functionOutputNodes = UIUtils.FunctionOutputList(); + functionOutputNodes.Sort( ( x, y ) => { return x.OrderIndex.CompareTo( y.OrderIndex ); } ); + for( int i = 0; i < functionOutputNodes.Count; i++ ) + { + functionOutputNodes[ i ].OrderIndex = i; + } + + m_mainGraphInstance.CurrentShaderFunction.AdditionalDirectives.UpdateSaveItemsFromDirectives(); + m_mainGraphInstance.CurrentShaderFunction.FunctionInfo = GenerateGraphInfo(); + m_mainGraphInstance.CurrentShaderFunction.FunctionInfo = IOUtils.AddAdditionalInfo( m_mainGraphInstance.CurrentShaderFunction.FunctionInfo ); + + if( AssetDatabase.IsMainAsset( m_mainGraphInstance.CurrentShaderFunction ) ) + { + EditorUtility.SetDirty( m_mainGraphInstance.CurrentShaderFunction ); + } + else + { + //Debug.Log( LastOpenedLocation ); + //AssetDatabase.CreateAsset( m_mainGraphInstance.CurrentShaderFunction, LastOpenedLocation ); + } + + AssetDatabase.SaveAssets(); + AssetDatabase.Refresh(); + m_mainGraphInstance.CurrentShaderFunction.AdditionalDirectives.UpdateDirectivesFromSaveItems(); + IOUtils.FunctionNodeChanged = true; + m_lastpath = AssetDatabase.GetAssetPath( m_mainGraphInstance.CurrentShaderFunction ); + System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture; + //EditorPrefs.SetString( IOUtils.LAST_OPENED_OBJ_ID, AssetDatabase.GetAssetPath( m_mainGraphInstance.CurrentShaderFunction ) ); + return true; + } + System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture; + return false; + } + + public void OnToolButtonPressed( ToolButtonType type ) + { + switch( type ) + { + case ToolButtonType.New: + { + UIUtils.CreateNewEmpty(); + } + break; + case ToolButtonType.Open: + { + UIUtils.OpenFile(); + } + break; + case ToolButtonType.Save: + { + SaveToDisk( false ); + } + break; + case ToolButtonType.Library: + { + ShowShaderLibrary(); + } + break; + case ToolButtonType.Options: { } break; + case ToolButtonType.Update: + { + if( Preferences.GlobalClearLog ) + { + m_consoleLogWindow.ClearMessages(); + } +#if UNITY_2019_4_OR_NEWER + if( EditorSettings.asyncShaderCompilation && Preferences.GlobalShowAsyncMsg ) + { + ShowMessage( AsyncMessage ); + } +#endif + SaveToDisk( false ); + } + break; + case ToolButtonType.Live: + { + m_liveShaderEditing = !m_liveShaderEditing; + m_innerEditorVariables.LiveMode = m_liveShaderEditing; + // 0 off + // 1 on + // 2 pending + if( m_liveShaderEditing && m_mainGraphInstance.CurrentMasterNode != null && m_mainGraphInstance.CurrentMasterNode.CurrentShader == null ) + { + m_liveShaderEditing = false; + m_innerEditorVariables.LiveMode = false; + } + + UpdateLiveUI(); + + if( m_liveShaderEditing ) + { + SaveToDisk( false ); + } + } + break; + case ToolButtonType.OpenSourceCode: + { + AssetDatabase.OpenAsset( m_mainGraphInstance.CurrentMasterNode.CurrentShader, 1 ); + } + break; + case ToolButtonType.MasterNode: + { + m_mainGraphInstance.AssignMasterNode(); + } + break; + + case ToolButtonType.FocusOnMasterNode: + { + double currTime = EditorApplication.timeSinceStartup; + bool autoZoom = ( currTime - m_focusOnMasterNodeTimestamp ) < AutoZoomTime; + m_focusOnMasterNodeTimestamp = currTime; + FocusOnNode( m_mainGraphInstance.CurrentMasterNode, autoZoom ? 1 : m_cameraZoom, true ); + } + break; + + case ToolButtonType.FocusOnSelection: + { + FocusZoom( false, true, true ); + } + break; + case ToolButtonType.ShowInfoWindow: + { + PortLegendInfo.OpenWindow(); + } + break; + case ToolButtonType.ShowTipsWindow: + { + TipsWindow.ShowWindow( true ); + } + break; + case ToolButtonType.ShowConsole: + { + m_consoleLogWindow.Toggle(); + } + break; + case ToolButtonType.Share: + { + List selectedNodes = m_mainGraphInstance.SelectedNodes; + if( selectedNodes.Count > 0 ) + { + CopyToClipboard(); + StartPasteRequest(); + } + else + { + ShowMessage( "No nodes selected to share" ); + } + } + break; + case ToolButtonType.TakeScreenshot: + { +#if UNITY_EDITOR_WIN + this.Focus(); + m_aseHandle = WindowsUtil.GetActiveWindow(); + //m_aseHandle = FindASEWindowHandle(); + + bool takeit = EditorUtility.DisplayDialog( "Take Screenshot", "This is a work in progress feature that will undock itself if needed, increase the window outside of your screen resolution to take the shot, if something fails (ie: graph too big) you may need to restart Unity, do you wish to continue?", "Yes", "Cancel" ); + if( !takeit ) + break; + + if( this.IsDocked() ) + { + this.Undock(); + this.Focus(); + m_aseHandle = WindowsUtil.GetActiveWindow(); + } + + int windowLong = WindowsUtil.GetWindowLong( m_aseHandle, WindowsUtil.GWL_STYLE ); + + List selectedNodes = m_mainGraphInstance.AllNodes; + + Vector2 minPos = new Vector2( float.MaxValue, float.MaxValue ); + Vector2 maxPos = new Vector2( float.MinValue, float.MinValue ); + Vector2 centroid = Vector2.zero; + + for( int i = 0; i < selectedNodes.Count; i++ ) + { + Rect currPos = selectedNodes[ i ].TruePosition; + minPos.x = ( currPos.x < minPos.x ) ? currPos.x : minPos.x; + minPos.y = ( currPos.y < minPos.y ) ? currPos.y : minPos.y; + + maxPos.x = ( ( currPos.x + currPos.width ) > maxPos.x ) ? ( currPos.x + currPos.width ) : maxPos.x; + maxPos.y = ( ( currPos.y + currPos.height ) > maxPos.y ) ? ( currPos.y + currPos.height ) : maxPos.y; + } + + centroid = ( maxPos - minPos ); + + m_prevCameraOffset = m_cameraOffset; + m_prevCameraZoom = CameraZoom; + + WindowsUtil.SetWindowLong( m_aseHandle, WindowsUtil.GWL_STYLE, (int)( windowLong & ~( WindowsUtil.WS_SIZEBOX ) ) ); + var rect = new WindowsUtil.Rect(); + WindowsUtil.GetWindowRect( m_aseHandle, ref rect ); + m_prevWindowRect = new Rect( rect.Left, rect.Top, rect.Width, rect.Height ); + + WindowsUtil.SetWindowPos( m_aseHandle, 0, (int)m_prevWindowRect.xMin, (int)m_prevWindowRect.yMin, (int)centroid.x, (int)centroid.y, 0x0040 ); + WindowsUtil.SetWindowLong( m_aseHandle, WindowsUtil.GWL_STYLE, (int)( windowLong ) ); + + m_takeScreenShot = true; +#else + EditorUtility.DisplayDialog( "Take Screenshot", "This is a work in progress feature that only works in Windows environment", "Ok" ); +#endif + } + break; + case ToolButtonType.CleanUnusedNodes: + { + m_mainGraphInstance.CleanUnusedNodes(); + } + break; + case ToolButtonType.Help: + { + Application.OpenURL( Constants.HelpURL ); + } + break; + } + } + +#if UNITY_EDITOR_WIN + IntPtr FindASEWindowHandle() + { + System.Diagnostics.Process process = System.Diagnostics.Process.GetCurrentProcess(); + + IntPtr[] winPtrs = WindowsUtil.GetProcessWindows( process.Id ); + m_aseHandle = IntPtr.Zero; + bool found = false; + for( int i = 0; i < winPtrs.Length; i++ ) + { + WindowsUtil.EnumChildWindows( winPtrs[ i ], delegate ( System.IntPtr hwnd, System.IntPtr param ) + { + System.Text.StringBuilder Title = new System.Text.StringBuilder( 256 ); + WindowsUtil.GetWindowText( hwnd, Title, Title.Capacity ); + + if( Title.ToString().Contains( "AmplifyShaderEditor.AmplifyShaderEditorWindow" ) ) + { + if( !found ) + { + m_aseHandle = winPtrs[ i ]; + found = true; + } + } + + return true; + }, System.IntPtr.Zero ); + } + + return m_aseHandle; + } + + void OpenSavedFolder() + { + m_openSavedFolder = false; + + var path = System.IO.Path.GetFullPath( Application.dataPath + "\\..\\ScreenshotASE.png" ); + EditorUtility.RevealInFinder( path ); + GUIUtility.ExitGUI(); + } + + void TakeScreenShot() + { + m_takeScreenShot = false; + + var cacher = RenderTexture.active; + RenderTexture.active = null; + + Texture2D m_screenshotTex2D = new Texture2D( (int)position.width, (int)position.height, TextureFormat.RGB24, false ); + m_screenshotTex2D.ReadPixels( new Rect( 0, 0, m_screenshotTex2D.width, m_screenshotTex2D.height ), 0, 0 ); + m_screenshotTex2D.Apply(); + + byte[] bytes = m_screenshotTex2D.EncodeToPNG(); + + var path = System.IO.Path.GetFullPath( Application.dataPath + "\\..\\ScreenshotASE.png" ); + System.IO.File.WriteAllBytes( path, bytes ); + + RenderTexture.active = cacher; + + ShowMessage( "[AmplifyShaderEditor] Screenshot successfully taken and saved at: " + path, consoleLog:true ); + + WindowsUtil.SetWindowPos( m_aseHandle, 0, (int)m_prevWindowRect.xMin, (int)m_prevWindowRect.yMin, (int)m_prevWindowRect.width, (int)m_prevWindowRect.height, 0x0040 ); + m_cameraOffset = m_prevCameraOffset; + CameraZoom = m_prevCameraZoom; + + m_openSavedFolder = true; + } +#endif + + + void UpdateLiveUI() + { + if( m_toolsWindow != null ) + { + m_toolsWindow.SetStateOnButton( ToolButtonType.Live, ( m_liveShaderEditing ) ? 1 : 0 ); + } + } + + void FocusZoom( bool forceAllNodes, bool doubleTap, bool smooth = true ) + { + List selectedNodes = ( m_mainGraphInstance.SelectedNodes.Count > 0 ) && !forceAllNodes ? m_mainGraphInstance.SelectedNodes : m_mainGraphInstance.AllNodes; + + Vector2 minPos = new Vector2( float.MaxValue, float.MaxValue ); + Vector2 maxPos = new Vector2( float.MinValue, float.MinValue ); + Vector2 centroid = Vector2.zero; + + for( int i = 0; i < selectedNodes.Count; i++ ) + { + Rect currPos = selectedNodes[ i ].TruePosition; + + minPos.x = ( currPos.x < minPos.x ) ? currPos.x : minPos.x; + minPos.y = ( currPos.y < minPos.y ) ? currPos.y : minPos.y; + + maxPos.x = ( ( currPos.x + currPos.width ) > maxPos.x ) ? ( currPos.x + currPos.width ) : maxPos.x; + maxPos.y = ( ( currPos.y + currPos.height ) > maxPos.y ) ? ( currPos.y + currPos.height ) : maxPos.y; + + } + + centroid = ( maxPos - minPos ); + + double currTime = EditorApplication.timeSinceStartup; + bool autoZoom = ( currTime - m_focusOnSelectionTimestamp ) < AutoZoomTime; + if( !doubleTap ) + autoZoom = true; + m_focusOnSelectionTimestamp = currTime; + + float zoom = m_cameraZoom; + if( autoZoom ) + { + zoom = 1f; + float canvasWidth = m_cameraInfo.width; + if( m_nodeParametersWindow.IsMaximized ) + canvasWidth -= m_nodeParametersWindow.RealWidth; + if( m_paletteWindow.IsMaximized ) + canvasWidth -= m_paletteWindow.RealWidth; + canvasWidth -= 40; + //float canvasWidth = AvailableCanvasWidth;// - 20; + float canvasHeight = AvailableCanvasHeight - 60; + if( centroid.x > canvasWidth || + centroid.y > canvasHeight ) + { + float hZoom = float.MinValue; + float vZoom = float.MinValue; + if( centroid.x > canvasWidth ) + { + hZoom = ( centroid.x ) / canvasWidth; + } + + if( centroid.y > canvasHeight ) + { + vZoom = ( centroid.y ) / canvasHeight; + } + zoom = ( hZoom > vZoom ) ? hZoom : vZoom; + } + } + + minPos.y -= 20 * zoom; + if( m_nodeParametersWindow.IsMaximized ) + minPos.x -= m_nodeParametersWindow.RealWidth * 0.5f * zoom; + if( m_paletteWindow.IsMaximized ) + minPos.x += m_paletteWindow.RealWidth * 0.5f * zoom; + + FocusOnPoint( minPos + centroid * 0.5f, zoom, smooth ); + } + + public void FocusOnNode( int nodeId, float zoom, bool selectNode, bool late = false ) + { + ParentNode node = m_mainGraphInstance.GetNode( nodeId ); + if( node != null ) + { + FocusOnNode( node, zoom, selectNode, late ); + } + } + + public void FocusOnNode( ParentNode node, float zoom, bool selectNode, bool late = false ) + { + if( late ) + { + m_nodeToFocus = node; + m_zoomToFocus = zoom; + m_selectNodeToFocus = selectNode; + return; + } + + if( selectNode ) + { + m_mainGraphInstance.SelectNode( node, false, false ); + } + + Vector2 nodePoint = node.CenterPosition; + nodePoint.x = nodePoint.x - ( m_nodeParametersWindow.RealWidth * 0.5f + m_paletteWindow.RealWidth * 0.5f ) * ( zoom > 0.999f ? zoom : CameraZoom ); + FocusOnPoint( nodePoint, zoom ); + } + + public void FocusOnPoint( Vector2 point, float zoom, bool smooth = true ) + { + if( zoom > 0.999f ) + { + if( smooth ) + SmoothZoom( zoom ); + else + CameraZoom = zoom; + } + + if( smooth ) + SmoothCameraOffset( -point + new Vector2( ( m_cameraInfo.width ) * 0.5f, m_cameraInfo.height * 0.5f ) * CameraZoom ); + else + m_cameraOffset = -point + new Vector2( ( m_cameraInfo.width ) * 0.5f, m_cameraInfo.height * 0.5f ) * CameraZoom; + } + + void SmoothZoom( float newZoom ) + { + m_smoothZoom = true; + m_zoomTime = 0; + m_targetZoom = newZoom; + m_zoomPivot = m_graphArea.center; + } + + void SmoothCameraOffset( Vector2 newOffset ) + { + m_smoothOffset = true; + m_offsetTime = 0; + m_targetOffset = newOffset; + } + + void PreTestLeftMouseDown() + { + if( m_currentEvent.type == EventType.MouseDown && m_currentEvent.button == ButtonClickId.LeftMouseButton ) + { + ParentNode node = m_mainGraphInstance.CheckNodeAt( m_currentMousePos ); + if( node != null ) + { + m_mainGraphInstance.NodeClicked = node.UniqueId; + return; + } + } + + m_mainGraphInstance.NodeClicked = -1; + } + + + + void OnLeftMouseDown() + { + Focus(); + + if( m_lastKeyPressed == KeyCode.Q ) + { + m_rmbStartPos = m_currentMousePos2D; + UseCurrentEvent(); + return; + } + + m_mouseDownOnValidArea = true; + m_lmbPressed = true; + if( m_currentEvent.alt ) + { + m_altBoxSelection = true; + } + + UIUtils.ShowContextOnPick = true; + ParentNode node = ( m_mainGraphInstance.NodeClicked < 0 ) ? m_mainGraphInstance.CheckNodeAt( m_currentMousePos ) : m_mainGraphInstance.GetClickedNode(); + if( node != null ) + { + m_mainGraphInstance.NodeClicked = node.UniqueId; + m_altBoxSelection = false; + + if( m_contextMenu.CheckShortcutKey() ) + { + if( node.ConnStatus == NodeConnectionStatus.Island ) + { + if( !m_multipleSelectionActive ) + { + ParentNode newNode = m_contextMenu.CreateNodeFromShortcutKey(); + if( newNode != null ) + { + newNode.ContainerGraph = m_mainGraphInstance; + newNode.Vec2Position = TranformedMousePos; + m_mainGraphInstance.AddNode( newNode, true ); + m_mainGraphInstance.SelectNode( newNode, false, false ); + ForceRepaint(); + } + ( node as CommentaryNode ).AddNodeToCommentary( newNode ); + } + } + } + else + { + if( node.OnClick( m_currentMousePos2D ) ) + { + if( !node.Selected ) + { + m_mainGraphInstance.SelectNode( node, ( m_currentEvent.modifiers == EventModifiers.Shift || m_currentEvent.modifiers == EventModifiers.Control ), true ); + } + else if( m_currentEvent.modifiers == EventModifiers.Shift || m_currentEvent.modifiers == EventModifiers.Control ) + { + m_mainGraphInstance.DeselectNode( node ); + } + + if( m_currentEvent.alt ) + { + int conn = 0; + for( int i = 0; i < node.InputPorts.Count; i++ ) + { + if( node.InputPorts[ i ].IsConnected ) + conn++; + } + + if( node.InputPorts.Count > 0 && node.OutputPorts.Count > 0 && conn > 0 && node.OutputPorts[ 0 ].IsConnected ) + { + m_altDragStarted = true; + } + } + + } + + if( m_currentEvent.alt ) + { + if( node.InputPorts.Count > 0 && node.OutputPorts.Count > 0 && node.InputPorts[ 0 ].IsConnected && node.OutputPorts[ 0 ].IsConnected ) + { + m_altDragStarted = true; + } + } + + return; + } + } + else if( !m_multipleSelectionActive ) + { + ParentNode newNode = m_contextMenu.CreateNodeFromShortcutKey(); + if( newNode != null ) + { + newNode.ContainerGraph = m_mainGraphInstance; + newNode.Vec2Position = TranformedMousePos; + m_mainGraphInstance.AddNode( newNode, true ); + m_mainGraphInstance.SelectNode( newNode, false, false ); + SetSaveIsDirty(); + ForceRepaint(); + } + else + { + List wireRefs = m_mainGraphInstance.GetWireBezierListInPos( m_currentMousePos2D ); + if( wireRefs != null && wireRefs.Count > 0 ) + { + for( int i = 0; i < wireRefs.Count; i++ ) + { + // Place wire code here + ParentNode outNode = m_mainGraphInstance.GetNode( wireRefs[ i ].OutNodeId ); + ParentNode inNode = m_mainGraphInstance.GetNode( wireRefs[ i ].InNodeId ); + + OutputPort outputPort = outNode.GetOutputPortByUniqueId( wireRefs[ i ].OutPortId ); + InputPort inputPort = inNode.GetInputPortByUniqueId( wireRefs[ i ].InPortId ); + + // Calculate the 4 points for bezier taking into account wire nodes and their automatic tangents + Vector3 endPos = new Vector3( inputPort.Position.x, inputPort.Position.y ); + Vector3 startPos = new Vector3( outputPort.Position.x, outputPort.Position.y ); + + float mag = ( endPos - startPos ).magnitude; + float resizedMag = Mathf.Min( mag, Constants.HORIZONTAL_TANGENT_SIZE * m_drawInfo.InvertedZoom ); + + Vector3 startTangent = new Vector3( startPos.x + resizedMag, startPos.y ); + Vector3 endTangent = new Vector3( endPos.x - resizedMag, endPos.y ); + + if( inNode != null && inNode.GetType() == typeof( WireNode ) ) + endTangent = endPos + ( ( inNode as WireNode ).TangentDirection ) * mag * 0.33f; + + if( outNode != null && outNode.GetType() == typeof( WireNode ) ) + startTangent = startPos - ( ( outNode as WireNode ).TangentDirection ) * mag * 0.33f; + + float dist = HandleUtility.DistancePointBezier( m_currentMousePos, startPos, endPos, startTangent, endTangent ); + if( dist < 10 ) + { + double doubleTapTime = EditorApplication.timeSinceStartup; + bool doubleTap = ( doubleTapTime - m_wiredDoubleTapTimestamp ) < WiredDoubleTapTime; + m_wiredDoubleTapTimestamp = doubleTapTime; + + if( doubleTap ) + { + Undo.RegisterCompleteObjectUndo( this, Constants.UndoCreateConnectionId ); + Undo.RegisterCompleteObjectUndo( m_mainGraphInstance, Constants.UndoCreateConnectionId ); + Undo.RecordObject( outNode, Constants.UndoCreateConnectionId ); + Undo.RecordObject( inNode, Constants.UndoCreateConnectionId ); + + ParentNode wireNode = m_mainGraphInstance.CreateNode( typeof( WireNode ), true ); + if( wireNode != null ) + { + wireNode.Vec2Position = TranformedMousePos; + + m_mainGraphInstance.CreateConnection( wireNode.InputPorts[ 0 ].NodeId, wireNode.InputPorts[ 0 ].PortId, outputPort.NodeId, outputPort.PortId ); + m_mainGraphInstance.CreateConnection( inputPort.NodeId, inputPort.PortId, wireNode.OutputPorts[ 0 ].NodeId, wireNode.OutputPorts[ 0 ].PortId ); + + SetSaveIsDirty(); + ForceRepaint(); + Undo.IncrementCurrentGroup(); + } + } + + break; + } + } + } + //Reset focus from any textfield which may be selected at this time + GUIUtility.keyboardControl = 0; + } + } + + if( m_currentEvent.modifiers != EventModifiers.Shift && m_currentEvent.modifiers != EventModifiers.Control && !m_altBoxSelection ) + m_mainGraphInstance.DeSelectAll(); + + if( m_wireReferenceUtils.ValidReferences() ) + { + m_wireReferenceUtils.InvalidateReferences(); + return; + } + + if( !m_contextMenu.CheckShortcutKey() && m_currentEvent.modifiers != EventModifiers.Shift && m_currentEvent.modifiers != EventModifiers.Control || m_altBoxSelection ) + { + // Only activate multiple selection if no node is selected and shift key not pressed + m_multipleSelectionActive = true; + + m_multipleSelectionStart = TranformedMousePos; + m_multipleSelectionArea.position = m_multipleSelectionStart; + m_multipleSelectionArea.size = Vector2.zero; + } + + UseCurrentEvent(); + } + + void OnLeftMouseDrag() + { + if( m_lostFocus ) + { + m_lostFocus = false; + return; + } + + if( m_lastKeyPressed == KeyCode.Q ) + { + if( m_currentEvent.alt ) + { + ModifyZoom( Constants.ALT_CAMERA_ZOOM_SPEED * ( m_currentEvent.delta.x + m_currentEvent.delta.y ), m_altKeyStartPos ); + } + else + { + m_cameraOffset += m_cameraZoom * m_currentEvent.delta; + } + UseCurrentEvent(); + return; + } + + if( m_altDragStarted ) + { + m_altDragStarted = false; + + if( m_currentEvent.modifiers == EventModifiers.Alt && CurrentGraph.SelectedNodes.Count == 1 ) + { + ParentNode node = CurrentGraph.SelectedNodes[ 0 ]; + int lastId = 0; + int conn = 0; + for( int i = 0; i < node.InputPorts.Count; i++ ) + { + if( node.InputPorts[ i ].IsConnected ) + { + conn++; + lastId = i; + } + } + + if( conn > 1 ) + lastId = 0; + + + + OutputPort outputPort = node.InputPorts[ lastId ].GetOutputConnection( 0 ); + ParentNode outputNode = m_mainGraphInstance.GetNode( outputPort.NodeId ); + bool outputIsWireNode = outputNode is WireNode; + + Undo.RegisterCompleteObjectUndo( this, Constants.UndoCreateConnectionId ); + node.RecordObject( Constants.UndoCreateConnectionId ); + outputNode.RecordObject( Constants.UndoCreateConnectionId ); + + List inputPorts = new List(); + for( int i = 0; i < node.OutputPorts[ 0 ].ConnectionCount; i++ ) + { + InputPort inputPort = node.OutputPorts[ 0 ].GetInputConnection( i ); + ParentNode inputNode = m_mainGraphInstance.GetNode( inputPort.NodeId ); + inputNode.RecordObject( Constants.UndoCreateConnectionId ); + inputPorts.Add( inputPort ); + } + + for( int i = 0; i < inputPorts.Count; i++ ) + { + if( outputIsWireNode ) + { + if( i == 0 ) + { + m_mainGraphInstance.CreateConnection( inputPorts[ i ].NodeId, inputPorts[ i ].PortId, outputPort.NodeId, outputPort.PortId ); + } + else + { + UIUtils.DeleteConnection( true, inputPorts[ i ].NodeId, inputPorts[ i ].PortId, false, true ); + } + } + else + { + m_mainGraphInstance.CreateConnection( inputPorts[ i ].NodeId, inputPorts[ i ].PortId, outputPort.NodeId, outputPort.PortId ); + } + } + + UIUtils.DeleteConnection( true, node.UniqueId, node.InputPorts[ lastId ].PortId, false, true ); + + SetSaveIsDirty(); + ForceRepaint(); + } + } + + if( !m_wireReferenceUtils.ValidReferences() && !m_altBoxSelection ) + { + if( m_mouseDownOnValidArea && m_insideEditorWindow ) + { + if( m_currentEvent.control ) + { + m_mainGraphInstance.MoveSelectedNodes( m_cameraZoom * m_currentEvent.delta, true ); + } + else + { + m_mainGraphInstance.MoveSelectedNodes( m_cameraZoom * m_currentEvent.delta ); + } + //m_mainGraphInstance.MoveSelectedNodes( m_cameraZoom * m_currentEvent.delta ); + m_autoPanDirActive = true; + } + } + else + { + List nodes = m_mainGraphInstance.GetNodesInGrid( m_drawInfo.TransformedMousePos ); + if( nodes != null && nodes.Count > 0 ) + { + Vector2 currentPortPos = new Vector2(); + Vector2 mousePos = TranformedMousePos; + + if( m_wireReferenceUtils.InputPortReference.IsValid ) + { + OutputPort currentPort = null; + float smallestDistance = float.MaxValue; + Vector2 smallestPosition = Vector2.zero; + for( int nodeIdx = 0; nodeIdx < nodes.Count; nodeIdx++ ) + { + List outputPorts = nodes[ nodeIdx ].OutputPorts; + if( outputPorts != null ) + { + for( int o = 0; o < outputPorts.Count; o++ ) + { + if( outputPorts[ o ].Available ) + { + currentPortPos.x = outputPorts[ o ].Position.x; + currentPortPos.y = outputPorts[ o ].Position.y; + + currentPortPos = currentPortPos * m_cameraZoom - m_cameraOffset; + float dist = ( mousePos - currentPortPos ).sqrMagnitude; + if( dist < smallestDistance ) + { + smallestDistance = dist; + smallestPosition = currentPortPos; + currentPort = outputPorts[ o ]; + } + } + } + } + } + + if( currentPort != null && currentPort.Available && ( smallestDistance < Constants.SNAP_SQR_DIST || currentPort.InsideActiveArea( ( mousePos + m_cameraOffset ) / m_cameraZoom ) ) ) + { + m_wireReferenceUtils.ActivateSnap( smallestPosition, currentPort ); + } + else + { + m_wireReferenceUtils.DeactivateSnap(); + } + } + + if( m_wireReferenceUtils.OutputPortReference.IsValid ) + { + InputPort currentPort = null; + float smallestDistance = float.MaxValue; + Vector2 smallestPosition = Vector2.zero; + for( int nodeIdx = 0; nodeIdx < nodes.Count; nodeIdx++ ) + { + List inputPorts = nodes[ nodeIdx ].InputPorts; + if( inputPorts != null ) + { + for( int i = 0; i < inputPorts.Count; i++ ) + { + if( inputPorts[ i ].Available ) + { + currentPortPos.x = inputPorts[ i ].Position.x; + currentPortPos.y = inputPorts[ i ].Position.y; + + currentPortPos = currentPortPos * m_cameraZoom - m_cameraOffset; + float dist = ( mousePos - currentPortPos ).sqrMagnitude; + if( dist < smallestDistance ) + { + smallestDistance = dist; + smallestPosition = currentPortPos; + currentPort = inputPorts[ i ]; + } + } + } + } + } + if( currentPort != null && currentPort.Available && ( smallestDistance < Constants.SNAP_SQR_DIST || currentPort.InsideActiveArea( ( mousePos + m_cameraOffset ) / m_cameraZoom ) ) ) + { + m_wireReferenceUtils.ActivateSnap( smallestPosition, currentPort ); + } + else + { + m_wireReferenceUtils.DeactivateSnap(); + } + } + } + else if( m_wireReferenceUtils.SnapEnabled ) + { + m_wireReferenceUtils.DeactivateSnap(); + } + } + UseCurrentEvent(); + } + + public void OnLeftMouseUp() + { + m_lmbPressed = false; + if( m_multipleSelectionActive ) + { + //m_multipleSelectionActive = false; + UpdateSelectionArea(); + //m_mainGraphInstance.MultipleSelection( m_multipleSelectionArea, ( m_currentEvent.modifiers == EventModifiers.Shift || m_currentEvent.modifiers == EventModifiers.Control ), true ); + if( m_currentEvent.alt && m_altBoxSelection ) + { + m_mainGraphInstance.MultipleSelection( m_multipleSelectionArea, !m_currentEvent.shift ); + } + else + { + m_mainGraphInstance.DeSelectAll(); + m_mainGraphInstance.MultipleSelection( m_multipleSelectionArea ); + } + } + + if( m_wireReferenceUtils.ValidReferences() ) + { + //Check if there is some kind of port beneath the mouse ... if so connect to it + ParentNode targetNode = m_wireReferenceUtils.SnapEnabled ? m_mainGraphInstance.GetNode( m_wireReferenceUtils.SnapPort.NodeId ) : m_mainGraphInstance.CheckNodeAt( m_currentMousePos ); + if( targetNode != null && targetNode.ConnStatus != NodeConnectionStatus.Island ) + { + if( m_wireReferenceUtils.InputPortReference.IsValid && m_wireReferenceUtils.InputPortReference.NodeId != targetNode.UniqueId ) + { + OutputPort outputPort = m_wireReferenceUtils.SnapEnabled ? targetNode.GetOutputPortByUniqueId( m_wireReferenceUtils.SnapPort.PortId ) : targetNode.CheckOutputPortAt( m_currentMousePos ); + if( outputPort != null && !outputPort.Locked && ( !m_wireReferenceUtils.InputPortReference.TypeLocked || + m_wireReferenceUtils.InputPortReference.DataType == WirePortDataType.OBJECT || + ( m_wireReferenceUtils.InputPortReference.TypeLocked && outputPort.DataType == m_wireReferenceUtils.InputPortReference.DataType ) ) ) + { + + ParentNode originNode = m_mainGraphInstance.GetNode( m_wireReferenceUtils.InputPortReference.NodeId ); + InputPort inputPort = originNode.GetInputPortByUniqueId( m_wireReferenceUtils.InputPortReference.PortId ); + UIUtils.MarkUndoAction(); + Undo.RegisterCompleteObjectUndo( this, Constants.UndoCreateConnectionId ); + originNode.RecordObject( Constants.UndoCreateConnectionId ); + targetNode.RecordObject( Constants.UndoCreateConnectionId ); + + if( inputPort.NotFreeForAllTypes && outputPort.NotFreeForAllTypes ) + { + if( !inputPort.CheckValidType( outputPort.DataType ) ) + { + UIUtils.ShowIncompatiblePortMessage( true, originNode, inputPort, targetNode, outputPort ); + m_wireReferenceUtils.InvalidateReferences(); + UseCurrentEvent(); + return; + } + + if( !outputPort.CheckValidType( inputPort.DataType ) ) + { + UIUtils.ShowIncompatiblePortMessage( false, targetNode, outputPort, originNode, inputPort ); + m_wireReferenceUtils.InvalidateReferences(); + UseCurrentEvent(); + return; + } + } + + inputPort.DummyAdd( outputPort.NodeId, outputPort.PortId ); + outputPort.DummyAdd( m_wireReferenceUtils.InputPortReference.NodeId, m_wireReferenceUtils.InputPortReference.PortId ); + + if( UIUtils.DetectNodeLoopsFrom( originNode, new Dictionary() ) ) + { + inputPort.DummyRemove(); + outputPort.DummyRemove(); + m_wireReferenceUtils.InvalidateReferences(); + ShowMessage( "Infinite Loop detected" ); + UseCurrentEvent(); + return; + } + + inputPort.DummyRemove(); + outputPort.DummyRemove(); + + if( inputPort.IsConnected ) + { + DeleteConnection( true, m_wireReferenceUtils.InputPortReference.NodeId, m_wireReferenceUtils.InputPortReference.PortId, true, false ); + } + + //link output to input + if( outputPort.ConnectTo( m_wireReferenceUtils.InputPortReference.NodeId, m_wireReferenceUtils.InputPortReference.PortId, m_wireReferenceUtils.InputPortReference.DataType, m_wireReferenceUtils.InputPortReference.TypeLocked ) ) + targetNode.OnOutputPortConnected( outputPort.PortId, m_wireReferenceUtils.InputPortReference.NodeId, m_wireReferenceUtils.InputPortReference.PortId ); + + //link input to output + if( inputPort.ConnectTo( outputPort.NodeId, outputPort.PortId, outputPort.DataType, m_wireReferenceUtils.InputPortReference.TypeLocked ) ) + originNode.OnInputPortConnected( m_wireReferenceUtils.InputPortReference.PortId, targetNode.UniqueId, outputPort.PortId ); + m_mainGraphInstance.MarkWireHighlights(); + } + else if( outputPort != null && m_wireReferenceUtils.InputPortReference.TypeLocked && m_wireReferenceUtils.InputPortReference.DataType != outputPort.DataType ) + { + ShowMessage( "Attempting to connect a port locked to type " + m_wireReferenceUtils.InputPortReference.DataType + " into a port of type " + outputPort.DataType ); + } + ShaderIsModified = true; + SetSaveIsDirty(); + } + + if( m_wireReferenceUtils.OutputPortReference.IsValid && m_wireReferenceUtils.OutputPortReference.NodeId != targetNode.UniqueId ) + { + InputPort inputPort = m_wireReferenceUtils.SnapEnabled ? targetNode.GetInputPortByUniqueId( m_wireReferenceUtils.SnapPort.PortId ) : targetNode.CheckInputPortAt( m_currentMousePos ); + if( inputPort != null && !inputPort.Locked && ( !inputPort.TypeLocked || + inputPort.DataType == WirePortDataType.OBJECT || + ( inputPort.TypeLocked && inputPort.DataType == m_wireReferenceUtils.OutputPortReference.DataType ) ) ) + { + ParentNode originNode = m_mainGraphInstance.GetNode( m_wireReferenceUtils.OutputPortReference.NodeId ); + OutputPort outputPort = originNode.GetOutputPortByUniqueId( m_wireReferenceUtils.OutputPortReference.PortId ); + + UIUtils.MarkUndoAction(); + Undo.RegisterCompleteObjectUndo( this, Constants.UndoCreateConnectionId ); + originNode.RecordObject( Constants.UndoCreateConnectionId ); + targetNode.RecordObject( Constants.UndoCreateConnectionId ); + + if( inputPort.NotFreeForAllTypes && outputPort.NotFreeForAllTypes ) + { + if( !inputPort.CheckValidType( outputPort.DataType ) ) + { + UIUtils.ShowIncompatiblePortMessage( true, targetNode, inputPort, originNode, outputPort ); + m_wireReferenceUtils.InvalidateReferences(); + UseCurrentEvent(); + return; + } + + if( !outputPort.CheckValidType( inputPort.DataType ) ) + { + UIUtils.ShowIncompatiblePortMessage( false, originNode, outputPort, targetNode, inputPort ); + m_wireReferenceUtils.InvalidateReferences(); + UseCurrentEvent(); + return; + } + } + + inputPort.DummyAdd( m_wireReferenceUtils.OutputPortReference.NodeId, m_wireReferenceUtils.OutputPortReference.PortId ); + outputPort.DummyAdd( inputPort.NodeId, inputPort.PortId ); + if( UIUtils.DetectNodeLoopsFrom( targetNode, new Dictionary() ) ) + { + inputPort.DummyRemove(); + outputPort.DummyRemove(); + m_wireReferenceUtils.InvalidateReferences(); + ShowMessage( "Infinite Loop detected" ); + UseCurrentEvent(); + return; + } + + inputPort.DummyRemove(); + outputPort.DummyRemove(); + + if( inputPort.IsConnected ) + { + if( m_currentEvent.control && m_wireReferenceUtils.SwitchPortReference.IsValid ) + { + ParentNode oldOutputNode = UIUtils.GetNode( inputPort.GetConnection( 0 ).NodeId ); + OutputPort oldOutputPort = oldOutputNode.GetOutputPortByUniqueId( inputPort.GetConnection( 0 ).PortId ); + + ParentNode switchNode = UIUtils.GetNode( m_wireReferenceUtils.SwitchPortReference.NodeId ); + InputPort switchPort = switchNode.GetInputPortByUniqueId( m_wireReferenceUtils.SwitchPortReference.PortId ); + + switchPort.DummyAdd( oldOutputPort.NodeId, oldOutputPort.PortId ); + oldOutputPort.DummyAdd( switchPort.NodeId, switchPort.PortId ); + if( UIUtils.DetectNodeLoopsFrom( switchNode, new Dictionary() ) ) + { + switchPort.DummyRemove(); + oldOutputPort.DummyRemove(); + m_wireReferenceUtils.InvalidateReferences(); + ShowMessage( "Infinite Loop detected" ); + UseCurrentEvent(); + return; + } + + switchPort.DummyRemove(); + oldOutputPort.DummyRemove(); + + DeleteConnection( true, inputPort.NodeId, inputPort.PortId, true, false ); + ConnectInputToOutput( switchPort.NodeId, switchPort.PortId, oldOutputPort.NodeId, oldOutputPort.PortId ); + } + else + { + DeleteConnection( true, inputPort.NodeId, inputPort.PortId, true, false ); + } + } + inputPort.InvalidateAllConnections(); + + + //link input to output + if( inputPort.ConnectTo( m_wireReferenceUtils.OutputPortReference.NodeId, m_wireReferenceUtils.OutputPortReference.PortId, m_wireReferenceUtils.OutputPortReference.DataType, inputPort.TypeLocked ) ) + targetNode.OnInputPortConnected( inputPort.PortId, m_wireReferenceUtils.OutputPortReference.NodeId, m_wireReferenceUtils.OutputPortReference.PortId ); + //link output to input + + if( outputPort.ConnectTo( inputPort.NodeId, inputPort.PortId, inputPort.DataType, inputPort.TypeLocked ) ) + originNode.OnOutputPortConnected( m_wireReferenceUtils.OutputPortReference.PortId, targetNode.UniqueId, inputPort.PortId ); + m_mainGraphInstance.MarkWireHighlights(); + } + else if( inputPort != null && inputPort.TypeLocked && inputPort.DataType != m_wireReferenceUtils.OutputPortReference.DataType ) + { + ShowMessage( "Attempting to connect a " + m_wireReferenceUtils.OutputPortReference.DataType + " to a port locked to type " + inputPort.DataType ); + } + ShaderIsModified = true; + SetSaveIsDirty(); + } + m_wireReferenceUtils.InvalidateReferences(); + } + else + { + if( UIUtils.ShowContextOnPick ) + m_contextPalette.Show( m_currentMousePos2D, m_cameraInfo ); + else + m_wireReferenceUtils.InvalidateReferences(); + } + } + else if( m_currentEvent.modifiers == EventModifiers.Alt && m_altAvailable && CurrentGraph.SelectedNodes.Count == 1 && !m_altBoxSelection && !m_multipleSelectionActive ) + { + List wireRefs = m_mainGraphInstance.GetWireBezierListInPos( m_currentMousePos2D ); + if( wireRefs != null && wireRefs.Count > 0 ) + { + float closestDist = 50; + int closestId = 0; + + for( int i = 0; i < wireRefs.Count; i++ ) + { + ParentNode outNode = m_mainGraphInstance.GetNode( wireRefs[ i ].OutNodeId ); + ParentNode inNode = m_mainGraphInstance.GetNode( wireRefs[ i ].InNodeId ); + + if( outNode == CurrentGraph.SelectedNodes[ 0 ] || inNode == CurrentGraph.SelectedNodes[ 0 ] ) + continue; + + OutputPort outputPort = outNode.GetOutputPortByUniqueId( wireRefs[ i ].OutPortId ); + InputPort inputPort = inNode.GetInputPortByUniqueId( wireRefs[ i ].InPortId ); + + // Calculate the 4 points for bezier taking into account wire nodes and their automatic tangents + Vector3 endPos = new Vector3( inputPort.Position.x, inputPort.Position.y ); + Vector3 startPos = new Vector3( outputPort.Position.x, outputPort.Position.y ); + + float mag = ( endPos - startPos ).magnitude; + float resizedMag = Mathf.Min( mag, Constants.HORIZONTAL_TANGENT_SIZE * m_drawInfo.InvertedZoom ); + + Vector3 startTangent = new Vector3( startPos.x + resizedMag, startPos.y ); + Vector3 endTangent = new Vector3( endPos.x - resizedMag, endPos.y ); + + if( inNode != null && inNode.GetType() == typeof( WireNode ) ) + endTangent = endPos + ( ( inNode as WireNode ).TangentDirection ) * mag * 0.33f; + + if( outNode != null && outNode.GetType() == typeof( WireNode ) ) + startTangent = startPos - ( ( outNode as WireNode ).TangentDirection ) * mag * 0.33f; + + //Vector2 pos = ( CurrentGraph.SelectedNodes[0].CenterPosition + m_cameraOffset ) / m_cameraZoom; + + float dist = HandleUtility.DistancePointBezier( /*pos*/ m_currentMousePos, startPos, endPos, startTangent, endTangent ); + if( dist < 40 ) + { + if( dist < closestDist ) + { + closestDist = dist; + closestId = i; + } + } + } + + if( closestDist < 40 ) + { + ParentNode outNode = m_mainGraphInstance.GetNode( wireRefs[ closestId ].OutNodeId ); + ParentNode inNode = m_mainGraphInstance.GetNode( wireRefs[ closestId ].InNodeId ); + + OutputPort outputPort = outNode.GetOutputPortByUniqueId( wireRefs[ closestId ].OutPortId ); + InputPort inputPort = inNode.GetInputPortByUniqueId( wireRefs[ closestId ].InPortId ); + + ParentNode selectedNode = CurrentGraph.SelectedNodes[ 0 ]; + if( selectedNode.InputPorts.Count > 0 && selectedNode.OutputPorts.Count > 0 ) + { + Undo.RegisterCompleteObjectUndo( this, Constants.UndoCreateConnectionId ); + selectedNode.RecordObject( Constants.UndoCreateConnectionId ); + inNode.RecordObject( Constants.UndoCreateConnectionId ); + outNode.RecordObject( Constants.UndoCreateConnectionId ); + + m_mainGraphInstance.CreateConnection( selectedNode.UniqueId, selectedNode.InputPorts[ 0 ].PortId, outputPort.NodeId, outputPort.PortId ); + m_mainGraphInstance.CreateConnection( inputPort.NodeId, inputPort.PortId, selectedNode.UniqueId, selectedNode.OutputPorts[ 0 ].PortId ); + } + + SetSaveIsDirty(); + ForceRepaint(); + } + } + } + UIUtils.ShowContextOnPick = true; + m_altBoxSelection = false; + m_multipleSelectionActive = false; + UseCurrentEvent(); + } + + public void ConnectInputToOutput( int inNodeId, int inPortId, int outNodeId, int outPortId, bool registerUndo = true ) + { + ParentNode inNode = m_mainGraphInstance.GetNode( inNodeId ); + ParentNode outNode = m_mainGraphInstance.GetNode( outNodeId ); + if( inNode != null && outNode != null ) + { + InputPort inPort = inNode.GetInputPortByUniqueId( inPortId ); + OutputPort outPort = outNode.GetOutputPortByUniqueId( outPortId ); + if( inPort != null && outPort != null ) + { + if( registerUndo ) + { + Undo.RegisterCompleteObjectUndo( this, Constants.UndoCreateConnectionId ); + inNode.RecordObject( Constants.UndoCreateConnectionId ); + outNode.RecordObject( Constants.UndoCreateConnectionId ); + } + + if( inPort.ConnectTo( outNodeId, outPortId, outPort.DataType, inPort.TypeLocked ) ) + { + inNode.OnInputPortConnected( inPortId, outNodeId, outPortId ); + } + + if( outPort.ConnectTo( inNodeId, inPortId, inPort.DataType, inPort.TypeLocked ) ) + { + outNode.OnOutputPortConnected( outPortId, inNodeId, inPortId ); + } + } + m_mainGraphInstance.MarkWireHighlights(); + ShaderIsModified = true; + } + } + + void OnRightMouseDown() + { + Focus(); + m_rmbStartPos = m_currentMousePos2D; + UseCurrentEvent(); + } + + void OnRightMouseDrag() + { + // We look at the control to detect when user hits a tooltip ( which has a hot control of 0 ) + // This needs to be checked because on this first "frame" of hitting a tooltip because it generates incorrect mouse delta values + if( GUIUtility.hotControl == 0 && m_lastHotControl != 0 ) + { + m_lastHotControl = GUIUtility.hotControl; + return; + } + + m_lastHotControl = GUIUtility.hotControl; + if( m_currentEvent.alt ) + { + ModifyZoom( Constants.ALT_CAMERA_ZOOM_SPEED * ( m_currentEvent.delta.x + m_currentEvent.delta.y ), m_altKeyStartPos ); + } + else + { + m_cameraOffset += m_cameraZoom * m_currentEvent.delta; + } + UseCurrentEvent(); + } + + void OnRightMouseUp() + { + //Resetting the hot control test variable so it can be used again on right mouse drag detection ( if we did not do this then m_lastHotControl could be left with a a value of 0 and wouldn't be able to be correctly used on rthe drag ) + m_lastHotControl = -1; + + if( ( m_rmbStartPos - m_currentMousePos2D ).sqrMagnitude < Constants.RMB_SCREEN_DIST ) + { + ParentNode node = m_mainGraphInstance.CheckNodeAt( m_currentMousePos, true ); + if( node == null ) + { + m_contextPalette.Show( m_currentMousePos2D, m_cameraInfo ); + } + } + UseCurrentEvent(); + } + + void UpdateSelectionArea() + { + m_multipleSelectionArea.size = TranformedMousePos - m_multipleSelectionStart; + } + + public void OnValidObjectsDropped( UnityEngine.Object[] droppedObjs ) + { + bool propagateDraggedObjsToNode = true; + // Only supporting single drag&drop object selection + if( droppedObjs.Length == 1 ) + { + ShaderIsModified = true; + SetSaveIsDirty(); + // Check if its a shader, material or game object and if so load the shader graph code from it + Shader newShader = droppedObjs[ 0 ] as Shader; + Material newMaterial = null; + if( newShader == null ) + { + newMaterial = droppedObjs[ 0 ] as Material; +#if UNITY_2018_1_OR_NEWER + bool isProcedural = ( newMaterial != null ); +#else + // Disabling Substance Deprecated warning +#pragma warning disable 0618 + bool isProcedural = ( newMaterial != null && newMaterial is ProceduralMaterial ); +#pragma warning restore 0618 +#endif + if( newMaterial != null && !isProcedural ) + { + if( UIUtils.IsUnityNativeShader( AssetDatabase.GetAssetPath( newMaterial.shader ) ) ) + { + return; + } + //newShader = newMaterial.shader; + LoadMaterialToASE( newMaterial ); + //m_mainGraphInstance.UpdateMaterialOnMasterNode( newMaterial ); + } + else + { + GameObject go = droppedObjs[ 0 ] as GameObject; + if( go != null ) + { + Renderer renderer = go.GetComponent(); + if( renderer ) + { + newMaterial = renderer.sharedMaterial; + newShader = newMaterial.shader; + } + } + } + } + + if( newShader != null ) + { + ConvertShaderToASE( newShader ); + + propagateDraggedObjsToNode = false; + } + + // if not shader loading then propagate the seletion to whats below the mouse + if( propagateDraggedObjsToNode ) + { + ParentNode node = m_mainGraphInstance.CheckNodeAt( m_currentMousePos ); + if( node != null ) + { + // if there's a node then pass the object into it to see if there's a setup with it + node.OnObjectDropped( droppedObjs[ 0 ] ); + } + else + { + // If not then check if there's a node that can be created through the dropped object + ParentNode newNode = m_contextMenu.CreateNodeFromCastType( droppedObjs[ 0 ].GetType() ); + if( newNode ) + { + newNode.ContainerGraph = m_mainGraphInstance; + newNode.Vec2Position = TranformedMousePos; + m_mainGraphInstance.AddNode( newNode, true ); + newNode.SetupFromCastObject( droppedObjs[ 0 ] ); + m_mainGraphInstance.SelectNode( newNode, false, false ); + ForceRepaint(); + bool find = false; + if( newNode is FunctionNode && CurrentGraph.CurrentShaderFunction != null ) + find = SearchFunctionNodeRecursively( CurrentGraph.CurrentShaderFunction ); + + if( find ) + { + DestroyNode( newNode, false ); + ShowMessage( "Shader Function loop detected, new node was removed to prevent errors." ); + } + } + } + } + } + } + + public bool SearchFunctionNodeRecursively( AmplifyShaderFunction function ) + { + List graphList = UIUtils.FunctionList(); + + bool nodeFind = false; + + for( int i = 0; i < graphList.Count; i++ ) + { + ParentGraph temp = CustomGraph; + CustomGraph = graphList[ i ].FunctionGraph; + nodeFind = SearchFunctionNodeRecursively( function ); + CustomGraph = temp; + + //Debug.Log( "tested = " + node.Function.FunctionName + " : " + function.FunctionName ); + + if( graphList[ i ].Function == function ) + return true; + } + + return nodeFind; + } + + public void SetDelayedMaterialMode( Material material ) + { + if( material == null ) + return; + m_delayedMaterialSet = material; + } + + public ShaderLoadResult LoadDroppedObject( bool value, Shader shader, Material material, AmplifyShaderFunction shaderFunction = null ) + { + UIUtils.CurrentWindow = this; + ShaderLoadResult result; + if( shaderFunction != null ) + { + string assetDatapath = AssetDatabase.GetAssetPath( shaderFunction ); + string latestOpenedFolder = Application.dataPath + assetDatapath.Substring( 6 ); + UIUtils.LatestOpenedFolder = latestOpenedFolder.Substring( 0, latestOpenedFolder.LastIndexOf( '/' ) + 1 ); + result = LoadFromDisk( assetDatapath, shaderFunction ); + CurrentSelection = ASESelectionMode.ShaderFunction; + IsShaderFunctionWindow = true; + titleContent.text = GenerateTabTitle( shaderFunction.FunctionName ); + titleContent.image = UIUtils.ShaderFunctionIcon; + m_lastpath = assetDatapath; + m_nodeParametersWindow.OnShaderFunctionLoad(); + //EditorPrefs.SetString( IOUtils.LAST_OPENED_OBJ_ID, assetDatapath ); + } + else if( value && shader != null ) + { + string assetDatapath = AssetDatabase.GetAssetPath( shader ); + string latestOpenedFolder = Application.dataPath + assetDatapath.Substring( 6 ); + UIUtils.LatestOpenedFolder = latestOpenedFolder.Substring( 0, latestOpenedFolder.LastIndexOf( '/' ) + 1 ); + result = LoadFromDisk( assetDatapath ); + switch( result ) + { + case ShaderLoadResult.LOADED: + { + m_mainGraphInstance.UpdateShaderOnMasterNode( shader ); + } + break; + case ShaderLoadResult.ASE_INFO_NOT_FOUND: + { + ShowMessage( "Loaded shader wasn't created with ASE. Saving it will remove previous data." ); + UIUtils.CreateEmptyFromInvalid( shader ); + } + break; + case ShaderLoadResult.FILE_NOT_FOUND: + case ShaderLoadResult.UNITY_NATIVE_PATHS: + { + UIUtils.CreateEmptyFromInvalid( shader ); + } + break; + } + + m_mainGraphInstance.UpdateMaterialOnMasterNode( material ); + m_mainGraphInstance.SetMaterialModeOnGraph( material ); + + if( material != null ) + { + CurrentSelection = ASESelectionMode.Material; + IsShaderFunctionWindow = false; + titleContent.text = GenerateTabTitle( material.name ); + titleContent.image = UIUtils.MaterialIcon; + if( material.HasProperty( IOUtils.DefaultASEDirtyCheckId ) ) + { + material.SetInt( IOUtils.DefaultASEDirtyCheckId, 1 ); + } + m_lastpath = AssetDatabase.GetAssetPath( material ); + EditorPrefs.SetString( IOUtils.LAST_OPENED_OBJ_ID, m_lastpath ); + } + else + { + CurrentSelection = ASESelectionMode.Shader; + IsShaderFunctionWindow = false; + titleContent.text = GenerateTabTitle( shader.name ); + titleContent.image = UIUtils.ShaderIcon; + m_lastpath = AssetDatabase.GetAssetPath( shader ); + EditorPrefs.SetString( IOUtils.LAST_OPENED_OBJ_ID, m_lastpath ); + } + } + else + { + result = ShaderLoadResult.FILE_NOT_FOUND; + } + return result; + } + + bool InsideMenus( Vector2 position ) + { + for( int i = 0; i < m_registeredMenus.Count; i++ ) + { + if( m_registeredMenus[ i ].IsInside( position ) ) + { + return true; + } + } + return false; + } + + void HandleGUIEvents() + { + if( m_currentEvent.type == EventType.KeyDown ) + { + m_contextMenu.UpdateKeyPress( m_currentEvent.keyCode ); + } + else if( m_currentEvent.type == EventType.KeyUp ) + { + m_contextMenu.UpdateKeyReleased( m_currentEvent.keyCode ); + } + + if( InsideMenus( m_currentMousePos2D ) ) + { + if( m_currentEvent.type == EventType.Used ) + m_mouseDownOnValidArea = false; + + if( m_currentEvent.type == EventType.MouseDown ) + { + m_mouseDownOnValidArea = false; + UseCurrentEvent(); + } + return; + } + else if( m_nodeParametersWindow.IsResizing || m_paletteWindow.IsResizing ) + { + m_mouseDownOnValidArea = false; + } + + int controlID = GUIUtility.GetControlID( FocusType.Passive ); + switch( m_currentEvent.GetTypeForControl( controlID ) ) + { + case EventType.MouseDown: + { + GUIUtility.hotControl = controlID; + switch( m_currentEvent.button ) + { + case ButtonClickId.LeftMouseButton: + { + OnLeftMouseDown(); + } + break; + case ButtonClickId.RightMouseButton: + case ButtonClickId.MiddleMouseButton: + { + OnRightMouseDown(); + } + break; + } + } + break; + case EventType.MouseMove: + { + m_keyEvtMousePos2D = m_currentEvent.mousePosition; + } + break; + case EventType.MouseUp: + { + GUIUtility.hotControl = 0; + switch( m_currentEvent.button ) + { + case ButtonClickId.LeftMouseButton: + { + OnLeftMouseUp(); + } + break; + case ButtonClickId.MiddleMouseButton: break; + case ButtonClickId.RightMouseButton: + { + OnRightMouseUp(); + } + break; + } + } + break; + case EventType.MouseDrag: + { + switch( m_currentEvent.button ) + { + case ButtonClickId.LeftMouseButton: + { + OnLeftMouseDrag(); + } + break; + case ButtonClickId.MiddleMouseButton: + case ButtonClickId.RightMouseButton: + { + OnRightMouseDrag(); + } + break; + } + } + break; + case EventType.ScrollWheel: + { + OnScrollWheel(); + } + break; + case EventType.KeyDown: + { + OnKeyboardDown(); + } + break; + case EventType.KeyUp: + { + OnKeyboardUp(); + } + break; + case EventType.ValidateCommand: + { + switch( m_currentEvent.commandName ) + { + case CopyCommand: + case PasteCommand: + case SelectAll: + case Duplicate: + { + m_currentEvent.Use(); + } + break; + case ObjectSelectorClosed: + { + m_mouseDownOnValidArea = false; + } + break; + } + } + break; + case EventType.ExecuteCommand: + { + m_currentEvent.Use(); + switch( m_currentEvent.commandName ) + { + case CopyCommand: + { + CopyToClipboard(); + } + break; + case PasteCommand: + { + PasteFromClipboard( true ); + } + break; + case SelectAll: + { + m_mainGraphInstance.SelectAll(); + ForceRepaint(); + } + break; + case Duplicate: + { + CopyToClipboard(); + PasteFromClipboard( true ); + } + break; + case ObjectSelectorClosed: + { + m_mouseDownOnValidArea = false; + } + break; + } + } + break; + case EventType.Repaint: + { + } + break; + } + + m_dragAndDropTool.TestDragAndDrop( m_graphArea ); + + } + + public void DeleteConnection( bool isInput, int nodeId, int portId, bool registerOnLog, bool propagateCallback ) + { + m_mainGraphInstance.DeleteConnection( isInput, nodeId, portId, registerOnLog, propagateCallback ); + } + + void DeleteSelectedNodes() + { + if( m_mainGraphInstance.SelectedNodes.Count == 0 ) + return; + + UIUtils.ClearUndoHelper(); + ParentNode[] selectedNodes = new ParentNode[ m_mainGraphInstance.SelectedNodes.Count ]; + for( int i = 0; i < selectedNodes.Length; i++ ) + { + selectedNodes[ i ] = m_mainGraphInstance.SelectedNodes[ i ]; + selectedNodes[ i ].Rewire(); + UIUtils.CheckUndoNode( selectedNodes[ i ] ); + } + + //Check nodes connected to deleted nodes to preserve connections on undo + List extraNodes = new List(); + for( int selectedNodeIdx = 0; selectedNodeIdx < selectedNodes.Length; selectedNodeIdx++ ) + { + // Check inputs + { + int inputIdxCount = selectedNodes[ selectedNodeIdx ].InputPorts.Count; + if( inputIdxCount > 0 ) + { + for( int inputIdx = 0; inputIdx < inputIdxCount; inputIdx++ ) + { + if( selectedNodes[ selectedNodeIdx ].InputPorts[ inputIdx ].IsConnected ) + { + int nodeIdx = selectedNodes[ selectedNodeIdx ].InputPorts[ inputIdx ].ExternalReferences[ 0 ].NodeId; + if( nodeIdx > -1 ) + { + ParentNode node = m_mainGraphInstance.GetNode( nodeIdx ); + if( node != null && UIUtils.CheckUndoNode( node ) ) + { + extraNodes.Add( node ); + } + } + } + } + } + } + + // Check outputs + int outputIdxCount = selectedNodes[ selectedNodeIdx ].OutputPorts.Count; + if( outputIdxCount > 0 ) + { + for( int outputIdx = 0; outputIdx < outputIdxCount; outputIdx++ ) + { + int inputIdxCount = selectedNodes[ selectedNodeIdx ].OutputPorts[ outputIdx ].ExternalReferences.Count; + if( inputIdxCount > 0 ) + { + for( int inputIdx = 0; inputIdx < inputIdxCount; inputIdx++ ) + { + int nodeIdx = selectedNodes[ selectedNodeIdx ].OutputPorts[ outputIdx ].ExternalReferences[ inputIdx ].NodeId; + if( nodeIdx > -1 ) + { + ParentNode node = m_mainGraphInstance.GetNode( nodeIdx ); + if( UIUtils.CheckUndoNode( node ) ) + { + extraNodes.Add( node ); + } + } + } + } + } + } + } + + UIUtils.ClearUndoHelper(); + //Undo.IncrementCurrentGroup(); + //Record deleted nodes + UIUtils.MarkUndoAction(); + Undo.RegisterCompleteObjectUndo( this, Constants.UndoDeleteNodeId ); + Undo.RegisterCompleteObjectUndo( m_mainGraphInstance, Constants.UndoDeleteNodeId ); + Undo.RecordObjects( selectedNodes, Constants.UndoDeleteNodeId ); + Undo.RecordObjects( extraNodes.ToArray(), Constants.UndoDeleteNodeId ); + + //Record deleting connections + for( int i = 0; i < selectedNodes.Length; i++ ) + { + selectedNodes[ i ].Alive = false; + m_mainGraphInstance.DeleteAllConnectionFromNode( selectedNodes[ i ], false, true, true ); + } + //Delete + m_mainGraphInstance.DeleteNodesOnArray( ref selectedNodes ); + + + //Undo.IncrementCurrentGroup(); + extraNodes.Clear(); + extraNodes = null; + + EditorUtility.SetDirty( this ); + + ForceRepaint(); + } + + void OnKeyboardUp() + { + CheckKeyboardCameraUp(); + + if( m_altPressDown ) + { + m_altPressDown = false; + } + + if( m_shortcutManager.ActivateShortcut( m_currentEvent.modifiers, m_lastKeyPressed, false ) ) + { + ForceRepaint(); + } + m_lastKeyPressed = KeyCode.None; + } + + bool OnKeyboardPress( KeyCode code ) + { + return ( m_currentEvent.keyCode == code && m_lastKeyPressed == KeyCode.None ); + } + + void CheckKeyboardCameraDown() + { + if( m_contextPalette.IsActive ) + return; + if( m_currentEvent.alt ) + { + bool foundKey = false; + float dir = 0; + switch( m_currentEvent.keyCode ) + { + case KeyCode.UpArrow: foundKey = true; dir = 1; break; + case KeyCode.DownArrow: foundKey = true; dir = -1; break; + case KeyCode.LeftArrow: foundKey = true; dir = 1; break; + case KeyCode.RightArrow: foundKey = true; dir = -1; break; + } + if( foundKey ) + { + ModifyZoom( Constants.ALT_CAMERA_ZOOM_SPEED * dir * m_cameraSpeed, new Vector2( m_cameraInfo.width * 0.5f, m_cameraInfo.height * 0.5f ) ); + if( m_cameraSpeed < 15 ) + m_cameraSpeed += 0.2f; + UseCurrentEvent(); + } + + + } + else + { + bool foundKey = false; + Vector2 dir = Vector2.zero; + switch( m_currentEvent.keyCode ) + { + case KeyCode.UpArrow: foundKey = true; dir = Vector2.up; break; + case KeyCode.DownArrow: foundKey = true; dir = Vector2.down; break; + case KeyCode.LeftArrow: foundKey = true; dir = Vector2.right; break; + case KeyCode.RightArrow: foundKey = true; dir = Vector2.left; break; + } + if( foundKey ) + { + m_cameraOffset += m_cameraZoom * m_cameraSpeed * dir; + if( m_cameraSpeed < 15 ) + m_cameraSpeed += 0.2f; + + UseCurrentEvent(); + } + } + } + + void CheckKeyboardCameraUp() + { + switch( m_currentEvent.keyCode ) + { + case KeyCode.UpArrow: + case KeyCode.DownArrow: + case KeyCode.LeftArrow: + case KeyCode.RightArrow: m_cameraSpeed = 1; break; + } + } + + void OnKeyboardDown() + { + //if( DebugConsoleWindow.DeveloperMode ) + //{ + // if( OnKeyboardPress( KeyCode.F8 ) ) + // { + // Shader currShader = CurrentGraph.CurrentShader; + // ShaderUtilEx.OpenCompiledShader( currShader, ShaderInspectorPlatformsPopupEx.GetCurrentMode(), ShaderInspectorPlatformsPopupEx.GetCurrentPlatformMask(), ShaderInspectorPlatformsPopupEx.GetCurrentVariantStripping() == 0 ); + + // string filename = Application.dataPath; + // filename = filename.Replace( "Assets", "Temp/Compiled-" ); + // string shaderFilename = AssetDatabase.GetAssetPath( currShader ); + // int lastIndex = shaderFilename.LastIndexOf( '/' ) + 1; + // filename = filename + shaderFilename.Substring( lastIndex ); + + // string compiledContents = IOUtils.LoadTextFileFromDisk( filename ); + // Debug.Log( compiledContents ); + // } + + // if( OnKeyboardPress( KeyCode.F9 ) ) + // { + // m_nodeExporterUtils.CalculateShaderInstructions( CurrentGraph.CurrentShader ); + // } + //} + + CheckKeyboardCameraDown(); + + if( m_lastKeyPressed == KeyCode.None ) + { + m_shortcutManager.ActivateShortcut( m_currentEvent.modifiers, m_currentEvent.keyCode, true ); + } + + if( m_currentEvent.control && m_currentEvent.shift && m_currentEvent.keyCode == KeyCode.V ) + { + PasteFromClipboard( false ); + } + + if( !m_altPressDown && ( OnKeyboardPress( KeyCode.LeftAlt ) || OnKeyboardPress( KeyCode.RightAlt ) || OnKeyboardPress( KeyCode.AltGr ) ) ) + { + m_altPressDown = true; + m_altAvailable = true; + m_altKeyStartPos = m_currentMousePos2D; + } + + if( m_currentEvent.keyCode != KeyCode.None && m_currentEvent.modifiers == EventModifiers.None ) + { + m_lastKeyPressed = m_currentEvent.keyCode; + } + } + + IEnumerator m_coroutine; + + private void StartPasteRequest() + { + m_coroutine = SendPostCoroutine( "http://paste.amplify.pt/api/create" ); + EditorApplication.update += PasteRequest; + } + + IEnumerator SendPostCoroutine( string url ) + { + WWWForm form = new WWWForm(); + form.AddField( "text", Clipboard.ClipboardId + ";" + EditorPrefs.GetString( Clipboard.ClipboardId, string.Empty ) ); + form.AddField( "title", "ASE Copy" ); + form.AddField( "name", "ASE" ); + form.AddField( "private", "1" ); + form.AddField( "lang", "text" ); + form.AddField( "expire", "0" ); + + UnityWebRequest www = UnityWebRequest.Post( url, form ); +#if UNITY_2017_2_OR_NEWER + www.SendWebRequest(); +#else + www.Send(); +#endif + + yield return www; + } + + public void PasteRequest() + { + UnityWebRequest www = (UnityWebRequest)m_coroutine.Current; + if( !m_coroutine.MoveNext() ) + { + if( !www.isDone ) + { + m_coroutine.MoveNext(); + } + else + { +#if UNITY_2020_1_OR_NEWER + if( www.result == UnityWebRequest.Result.ConnectionError ) +#elif UNITY_2017_1_OR_NEWER + if( www.isNetworkError ) +#else + if( www.isError ) +#endif + { + Debug.Log( "[AmplifyShaderEditor]\n" + www.error ); + } + else + { + // Print Body + string finalURL = www.downloadHandler.text; + + if( finalURL.IndexOf( "paste.amplify.pt/view/" ) > -1 ) + { + System.Text.RegularExpressions.Regex parser = new System.Text.RegularExpressions.Regex( @".*(http:\/\/paste.amplify.pt\/view\/)([0-9a-z]*).*", System.Text.RegularExpressions.RegexOptions.Singleline ); + finalURL = parser.Replace( finalURL, "$1raw/$2" ); + + ShowMessage( "Link copied to clipboard\n"+ finalURL, consoleLog:false ); + Debug.Log( "[AmplifyShaderEditor] Link copied to clipboard\n"+ finalURL+"\n" ); + // Copy Paste to clipboard + EditorGUIUtility.systemCopyBuffer = finalURL; + } + else + { + Debug.Log( "[AmplifyShaderEditor] Failed to generate paste:\n" + finalURL ); + } + } + EditorApplication.update -= PasteRequest; + } + } + } + + void OnScrollWheel() + { + ModifyZoomSmooth( m_currentEvent.delta.y, m_currentMousePos2D ); + UseCurrentEvent(); + } + + void ModifyZoom( float zoomIncrement, Vector2 pivot ) + { + float minCam = Mathf.Min( ( m_cameraInfo.width - ( m_nodeParametersWindow.RealWidth + m_paletteWindow.RealWidth ) ), ( m_cameraInfo.height - ( m_toolsWindow.Height ) ) ); + if( minCam < 1 ) + minCam = 1; + + float dynamicMaxZoom = m_mainGraphInstance.MaxNodeDist / minCam; + + Vector2 canvasPos = TranformPosition( pivot ); + if( zoomIncrement < 0 ) + CameraZoom = Mathf.Max( m_cameraZoom + zoomIncrement * Constants.CAMERA_ZOOM_SPEED, Constants.CAMERA_MIN_ZOOM ); + else if( CameraZoom < Mathf.Max( Constants.CAMERA_MAX_ZOOM, dynamicMaxZoom ) ) + CameraZoom = m_cameraZoom + zoomIncrement * Constants.CAMERA_ZOOM_SPEED;// Mathf.Min( m_cameraZoom + zoomIncrement * Constants.CAMERA_ZOOM_SPEED, Mathf.Max( Constants.CAMERA_MAX_ZOOM, dynamicMaxZoom ) ); + m_cameraOffset.x = pivot.x * m_cameraZoom - canvasPos.x; + m_cameraOffset.y = pivot.y * m_cameraZoom - canvasPos.y; + } + + void ModifyZoomSmooth( float zoomIncrement, Vector2 pivot ) + { + if( m_smoothZoom && Mathf.Sign( m_targetZoomIncrement * zoomIncrement ) >= 0 ) + m_targetZoomIncrement += zoomIncrement; + else + m_targetZoomIncrement = zoomIncrement; + + m_smoothZoom = true; + m_zoomTime = 0; + + float minCam = Mathf.Min( ( m_cameraInfo.width - ( m_nodeParametersWindow.RealWidth + m_paletteWindow.RealWidth ) ), ( m_cameraInfo.height - ( m_toolsWindow.Height ) ) ); + if( minCam < 1 ) + minCam = 1; + + float dynamicMaxZoom = m_mainGraphInstance.MaxNodeDist / minCam; + if( m_targetZoomIncrement < 0 ) + m_targetZoom = Mathf.Max( m_cameraZoom + m_targetZoomIncrement * Constants.CAMERA_ZOOM_SPEED, Constants.CAMERA_MIN_ZOOM ); + else if( CameraZoom < Mathf.Max( Constants.CAMERA_MAX_ZOOM, dynamicMaxZoom ) ) + m_targetZoom = m_cameraZoom + m_targetZoomIncrement * Constants.CAMERA_ZOOM_SPEED;// Mathf.Min( m_cameraZoom + zoomIncrement * Constants.CAMERA_ZOOM_SPEED, Mathf.Max( Constants.CAMERA_MAX_ZOOM, dynamicMaxZoom ) ); + + m_zoomPivot = pivot; + } + + void OnSelectionChange() + { + ForceRepaint(); + } + + private void OnFocus() + { + EditorGUI.FocusTextInControl( null ); +//#if UNITY_2019_1_OR_NEWER +// m_fixOnFocus = true; +//#endif + } + + void OnLostFocus() + { + m_lostFocus = true; + m_multipleSelectionActive = false; + m_wireReferenceUtils.InvalidateReferences(); + if( m_genericMessageUI != null ) + m_genericMessageUI.CleanUpMessageStack(); + m_nodeParametersWindow.OnLostFocus(); + m_paletteWindow.OnLostFocus(); + m_contextMenu.ResetShortcutKeyStates(); + } + + void CopyToClipboard() + { + m_copyPasteDeltaMul = 0; + m_copyPasteDeltaPos = new Vector2( float.MaxValue, float.MaxValue ); + m_clipboard.ClearClipboard(); + m_copyPasteInitialPos = m_mainGraphInstance.SelectedNodesCentroid; + m_clipboard.AddToClipboard( m_mainGraphInstance.SelectedNodes, m_copyPasteInitialPos, m_mainGraphInstance ); + } + + ParentNode CreateNodeFromClipboardData( int clipId ) + { + string[] parameters = m_clipboard.CurrentClipboardStrData[ clipId ].Data.Split( IOUtils.FIELD_SEPARATOR ); + System.Type nodeType = System.Type.GetType( parameters[ IOUtils.NodeTypeId ] ); + NodeAttributes attributes = m_contextMenu.GetNodeAttributesForType( nodeType ); + if( attributes != null && !UIUtils.GetNodeAvailabilityInBitArray( attributes.NodeAvailabilityFlags, m_mainGraphInstance.CurrentCanvasMode ) && !UIUtils.GetNodeAvailabilityInBitArray( attributes.NodeAvailabilityFlags, m_currentNodeAvailability ) ) + return null; + + ParentNode newNode = (ParentNode)ScriptableObject.CreateInstance( nodeType ); + newNode.IsNodeBeingCopied = true; + if( newNode != null ) + { + newNode.ContainerGraph = m_mainGraphInstance; + newNode.ClipboardFullReadFromString( ref parameters ); + m_mainGraphInstance.AddNode( newNode, true, true, true, false ); + newNode.IsNodeBeingCopied = false; + m_clipboard.CurrentClipboardStrData[ clipId ].NewNodeId = newNode.UniqueId; + return newNode; + } + return null; + } + + void CreateConnectionsFromClipboardData( int clipId ) + { + if( String.IsNullOrEmpty( m_clipboard.CurrentClipboardStrData[ clipId ].Connections ) ) + return; + string[] lines = m_clipboard.CurrentClipboardStrData[ clipId ].Connections.Split( IOUtils.LINE_TERMINATOR ); + + for( int lineIdx = 0; lineIdx < lines.Length; lineIdx++ ) + { + string[] parameters = lines[ lineIdx ].Split( IOUtils.FIELD_SEPARATOR ); + + int InNodeId = 0; + int InPortId = 0; + int OutNodeId = 0; + int OutPortId = 0; + + try + { + InNodeId = Convert.ToInt32( parameters[ IOUtils.InNodeId ] ); + InPortId = Convert.ToInt32( parameters[ IOUtils.InPortId ] ); + + OutNodeId = Convert.ToInt32( parameters[ IOUtils.OutNodeId ] ); + OutPortId = Convert.ToInt32( parameters[ IOUtils.OutPortId ] ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + + + int newInNodeId = m_clipboard.GeNewNodeId( InNodeId ); + int newOutNodeId = m_clipboard.GeNewNodeId( OutNodeId ); + + if( newInNodeId > -1 && newOutNodeId > -1 ) + { + ParentNode inNode = m_mainGraphInstance.GetNode( newInNodeId ); + ParentNode outNode = m_mainGraphInstance.GetNode( newOutNodeId ); + + InputPort inputPort = null; + OutputPort outputPort = null; + + if( inNode != null && outNode != null ) + { + inNode.IsNodeBeingCopied = true; + outNode.IsNodeBeingCopied = true; + inputPort = inNode.GetInputPortByUniqueId( InPortId ); + outputPort = outNode.GetOutputPortByUniqueId( OutPortId ); + if( inputPort != null && outputPort != null ) + { + inputPort.ConnectTo( newOutNodeId, OutPortId, outputPort.DataType, false ); + outputPort.ConnectTo( newInNodeId, InPortId, inputPort.DataType, inputPort.TypeLocked ); + + inNode.OnInputPortConnected( InPortId, newOutNodeId, OutPortId ); + outNode.OnOutputPortConnected( OutPortId, newInNodeId, InPortId ); + } + + inNode.IsNodeBeingCopied = false; + outNode.IsNodeBeingCopied = false; + } + } + } + } + + private void StartGetRequest( string url ) + { + m_coroutine = SendGetCoroutine( url ); + EditorApplication.update += GetRequest; + } + + IEnumerator SendGetCoroutine( string url ) + { + UnityWebRequest www = UnityWebRequest.Get( url ); +#if UNITY_2017_2_OR_NEWER + www.SendWebRequest(); +#else + www.Send(); +#endif + + yield return www; + } + + public void GetRequest() + { + UnityWebRequest www = (UnityWebRequest)m_coroutine.Current; + if( !m_coroutine.MoveNext() ) + { + if( !www.isDone ) + { + m_coroutine.MoveNext(); + } + else + { +#if UNITY_2020_1_OR_NEWER + if( www.result == UnityWebRequest.Result.ConnectionError ) +#elif UNITY_2017_1_OR_NEWER + if( www.isNetworkError ) +#else + if( www.isError ) +#endif + { + Debug.Log( "[AmplifyShaderEditor]\n" + www.error ); + } + else + { + string data = www.downloadHandler.text; + if( data.IndexOf( Clipboard.ClipboardId + ";" ) > -1 ) + { + data = www.downloadHandler.text.Replace( Clipboard.ClipboardId + ";", "" ); + if( data.IndexOf( "
-1 ) + { + System.Text.RegularExpressions.Regex parser = new System.Text.RegularExpressions.Regex( @"(.*)
-1 ) + { + StartGetRequest( result ); + return; + } + + if( result.IndexOf( Clipboard.ClipboardId + ";" ) > -1 ) + { + result = result.Replace( Clipboard.ClipboardId + ";", "" ); + EditorPrefs.SetString( Clipboard.ClipboardId, result ); + } + + m_mainGraphInstance.IsDuplicating = true; + m_copyPasteInitialPos = m_clipboard.GetDataFromEditorPrefs(); + if( m_clipboard.CurrentClipboardStrData.Count == 0 ) + { + return; + } + + Vector2 deltaPos = TranformedKeyEvtMousePos - m_copyPasteInitialPos; + if( ( m_copyPasteDeltaPos - deltaPos ).magnitude > 5.0f ) + { + m_copyPasteDeltaMul = 0; + } + else + { + m_copyPasteDeltaMul += 1; + } + m_copyPasteDeltaPos = deltaPos; + + m_mainGraphInstance.DeSelectAll(); + UIUtils.InhibitMessages = true; + + if( m_clipboard.CurrentClipboardStrData.Count > 0 ) + { + UIUtils.MarkUndoAction(); + Undo.RegisterCompleteObjectUndo( this, Constants.UndoPasteNodeId ); + } + + List createdNodes = new List(); + for( int i = 0; i < m_clipboard.CurrentClipboardStrData.Count; i++ ) + { + ParentNode node = CreateNodeFromClipboardData( i ); + if( node != null ) + { + m_clipboard.CurrentClipboardStrData[ i ].NewNodeId = node.UniqueId; + Vector2 pos = node.Vec2Position; + node.Vec2Position = pos + deltaPos + m_copyPasteDeltaMul * Constants.CopyPasteDeltaPos; + //node.RefreshExternalReferences(); + node.AfterDuplication(); + createdNodes.Add( node ); + m_mainGraphInstance.SelectNode( node, true, false ); + } + } + + if( copyConnections ) + { + for( int i = 0; i < m_clipboard.CurrentClipboardStrData.Count; i++ ) + { + CreateConnectionsFromClipboardData( i ); + } + } + + // Refresh external references must always be called after all nodes are created + for( int i = 0; i < createdNodes.Count; i++ ) + { + createdNodes[ i ].RefreshExternalReferences(); + } + createdNodes.Clear(); + createdNodes = null; + //Need to force increment on Undo because if not Undo may incorrectly group consecutive pastes + Undo.IncrementCurrentGroup(); + + UIUtils.InhibitMessages = false; + ShaderIsModified = true; + SetSaveIsDirty(); + ForceRepaint(); + m_mainGraphInstance.IsDuplicating = false; + } + + public string GenerateGraphInfo() + { + string graphInfo = IOUtils.ShaderBodyBegin + '\n'; + string nodesInfo = ""; + string connectionsInfo = ""; + graphInfo += VersionInfo.FullLabel + '\n'; + graphInfo += ( + m_cameraInfo.x.ToString() + IOUtils.FIELD_SEPARATOR + + m_cameraInfo.y.ToString() + IOUtils.FIELD_SEPARATOR + + m_cameraInfo.width.ToString() + IOUtils.FIELD_SEPARATOR + + m_cameraInfo.height.ToString() + IOUtils.FIELD_SEPARATOR + + m_cameraOffset.x.ToString() + IOUtils.FIELD_SEPARATOR + + m_cameraOffset.y.ToString() + IOUtils.FIELD_SEPARATOR + + m_cameraZoom.ToString() + IOUtils.FIELD_SEPARATOR + + m_nodeParametersWindow.IsMaximized + IOUtils.FIELD_SEPARATOR + + m_paletteWindow.IsMaximized + '\n' + ); + m_mainGraphInstance.OrderNodesByGraphDepth(); + m_mainGraphInstance.WriteToString( ref nodesInfo, ref connectionsInfo ); + graphInfo += nodesInfo; + graphInfo += connectionsInfo; + graphInfo += IOUtils.ShaderBodyEnd + '\n'; + + return graphInfo; + } + + // TODO: this need to be fused to the main load function somehow + public static void LoadFromMeta( ref ParentGraph graph, GraphContextMenu contextMenu, string meta ) + { + graph.IsLoading = true; + graph.CleanNodes(); + + int checksumId = meta.IndexOf( IOUtils.CHECKSUM ); + if( checksumId > -1 ) + { + string checkSumStoredValue = meta.Substring( checksumId ); + string trimmedBuffer = meta.Remove( checksumId ); + + string[] typeValuePair = checkSumStoredValue.Split( IOUtils.VALUE_SEPARATOR ); + if( typeValuePair != null && typeValuePair.Length == 2 ) + { + // Check read checksum and compare with the actual shader body to detect external changes + string currentChecksumValue = IOUtils.CreateChecksum( trimmedBuffer ); + if( DebugConsoleWindow.DeveloperMode && !currentChecksumValue.Equals( typeValuePair[ 1 ] ) ) + { + //ShowMessage( "Wrong checksum" ); + } + + trimmedBuffer = trimmedBuffer.Replace( "\r", string.Empty ); + // find node info body + int shaderBodyId = trimmedBuffer.IndexOf( IOUtils.ShaderBodyBegin ); + if( shaderBodyId > -1 ) + { + trimmedBuffer = trimmedBuffer.Substring( shaderBodyId ); + //Find set of instructions + string[] instructions = trimmedBuffer.Split( IOUtils.LINE_TERMINATOR ); + // First line is to be ignored and second line contains version + string[] versionParams = instructions[ 1 ].Split( IOUtils.VALUE_SEPARATOR ); + if( versionParams.Length == 2 ) + { + int version = 0; + try + { + version = Convert.ToInt32( versionParams[ 1 ] ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + + //if( version > versionInfo.FullNumber ) + //{ + //ShowMessage( "This shader was created on a new ASE version\nPlease install v." + version ); + //} + + if( DebugConsoleWindow.DeveloperMode ) + { + //if( version < versionInfo.FullNumber ) + //{ + //ShowMessage( "This shader was created on a older ASE version\nSaving will update it to the new one." ); + //} + } + + graph.LoadedShaderVersion = version; + } + else + { + //ShowMessage( "Corrupted version" ); + } + + // Dummy values,camera values can only be applied after node loading is complete + Rect dummyCameraInfo = new Rect(); + Vector2 dummyCameraOffset = new Vector2(); + //float dummyCameraZoom = 0; + //bool applyDummy = false; + //bool dummyNodeParametersWindowMaximized = false; + //bool dummyPaletteWindowMaximized = false; + + //Second line contains camera information ( position, size, offset and zoom ) + string[] cameraParams = instructions[ 2 ].Split( IOUtils.FIELD_SEPARATOR ); + if( cameraParams.Length == 9 ) + { + //applyDummy = true; + try + { + dummyCameraInfo.x = Convert.ToSingle( cameraParams[ 0 ] ); + dummyCameraInfo.y = Convert.ToSingle( cameraParams[ 1 ] ); + dummyCameraInfo.width = Convert.ToSingle( cameraParams[ 2 ] ); + dummyCameraInfo.height = Convert.ToSingle( cameraParams[ 3 ] ); + dummyCameraOffset.x = Convert.ToSingle( cameraParams[ 4 ] ); + dummyCameraOffset.y = Convert.ToSingle( cameraParams[ 5 ] ); + + //dummyCameraZoom = Convert.ToSingle( cameraParams[ 6 ] ); + //dummyNodeParametersWindowMaximized = Convert.ToBoolean( cameraParams[ 7 ] ); + //dummyPaletteWindowMaximized = Convert.ToBoolean( cameraParams[ 8 ] ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + else + { + //ShowMessage( "Camera parameters are corrupted" ); + } + + // valid instructions are only between the line after version and the line before the last one ( which contains ShaderBodyEnd ) + for( int instructionIdx = 3; instructionIdx < instructions.Length - 1; instructionIdx++ ) + { + //TODO: After all is working, convert string parameters to ints in order to speed up reading + string[] parameters = instructions[ instructionIdx ].Split( IOUtils.FIELD_SEPARATOR ); + + // All nodes must be created before wiring the connections ... + // Since all nodes on the save op are written before the wires, we can safely create them + // If that order is not maintained the it's because of external editing and its the users responsability + switch( parameters[ 0 ] ) + { + case IOUtils.NodeParam: + { + string typeStr = parameters[ IOUtils.NodeTypeId ]; + typeStr = IOUtils.NodeTypeReplacer.ContainsKey( typeStr ) ? IOUtils.NodeTypeReplacer[ typeStr ] : typeStr; + System.Type type = System.Type.GetType( typeStr ); + if( type == null ) + { +#if UNITY_2017_3_OR_NEWER + try + { + var editorAssembly = System.Reflection.Assembly.Load( "Assembly-CSharp-Editor" ); + if( editorAssembly != null ) + { + type = editorAssembly.GetType( typeStr ); + } + } + catch( Exception ) + { + + } +#endif + } + if( type != null ) + { + System.Type oldType = type; + NodeAttributes attribs = contextMenu.GetNodeAttributesForType( type ); + if( attribs == null ) + { + attribs = contextMenu.GetDeprecatedNodeAttributesForType( type ); + if( attribs != null ) + { + if( attribs.Deprecated && attribs.DeprecatedAlternativeType != null ) + { + type = attribs.DeprecatedAlternativeType; + //ShowMessage( string.Format( "Node {0} is deprecated and was replaced by {1} ", attribs.Name, attribs.DeprecatedAlternative ) ); + } + } + } + + ParentNode newNode = (ParentNode)ScriptableObject.CreateInstance( type ); + if( newNode != null ) + { + try + { + newNode.ContainerGraph = graph; + if( oldType != type ) + { + newNode.ParentReadFromString( ref parameters ); + newNode.ReadFromDeprecated( ref parameters, oldType ); + newNode.WasDeprecated = true; + } + else + newNode.ReadFromString( ref parameters ); + + + if( oldType == type ) + { + newNode.ReadInputDataFromString( ref parameters ); + if( UIUtils.CurrentShaderVersion() > 5107 ) + { + newNode.ReadOutputDataFromString( ref parameters ); + } + } + } + catch( Exception e ) + { + Debug.LogException( e, newNode ); + } + graph.AddNode( newNode, false, true, false ); + } + } + else + { + UIUtils.ShowMessage( string.Format( "{0} is not a valid ASE node ", parameters[ IOUtils.NodeTypeId ] ), MessageSeverity.Error ); + } + } + break; + case IOUtils.WireConnectionParam: + { + int InNodeId = 0; + int InPortId = 0; + int OutNodeId = 0; + int OutPortId = 0; + + try + { + InNodeId = Convert.ToInt32( parameters[ IOUtils.InNodeId ] ); + InPortId = Convert.ToInt32( parameters[ IOUtils.InPortId ] ); + OutNodeId = Convert.ToInt32( parameters[ IOUtils.OutNodeId ] ); + OutPortId = Convert.ToInt32( parameters[ IOUtils.OutPortId ] ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + + ParentNode inNode = graph.GetNode( InNodeId ); + ParentNode outNode = graph.GetNode( OutNodeId ); + + //if ( UIUtils.CurrentShaderVersion() < 5002 ) + //{ + // InPortId = inNode.VersionConvertInputPortId( InPortId ); + // OutPortId = outNode.VersionConvertOutputPortId( OutPortId ); + //} + + InputPort inputPort = null; + OutputPort outputPort = null; + if( inNode != null && outNode != null ) + { + + if( UIUtils.CurrentShaderVersion() < 5002 ) + { + InPortId = inNode.VersionConvertInputPortId( InPortId ); + OutPortId = outNode.VersionConvertOutputPortId( OutPortId ); + + if( inNode.WasDeprecated ) + InPortId = inNode.InputIdFromDeprecated( InPortId ); + if( outNode.WasDeprecated ) + OutPortId = outNode.OutputIdFromDeprecated( OutPortId ); + + inputPort = inNode.GetInputPortByArrayId( InPortId ); + outputPort = outNode.GetOutputPortByArrayId( OutPortId ); + } + else + { + if( inNode.WasDeprecated ) + InPortId = inNode.InputIdFromDeprecated( InPortId ); + if( outNode.WasDeprecated ) + OutPortId = outNode.OutputIdFromDeprecated( OutPortId ); + + inputPort = inNode.GetInputPortByUniqueId( InPortId ); + outputPort = outNode.GetOutputPortByUniqueId( OutPortId ); + } + + if( inputPort != null && outputPort != null ) + { + bool inputCompatible = inputPort.CheckValidType( outputPort.DataType ); + bool outputCompatible = outputPort.CheckValidType( inputPort.DataType ); + if( inputCompatible && outputCompatible ) + { + inputPort.ConnectTo( OutNodeId, OutPortId, outputPort.DataType, false ); + outputPort.ConnectTo( InNodeId, InPortId, inputPort.DataType, inputPort.TypeLocked ); + + inNode.OnInputPortConnected( InPortId, OutNodeId, OutPortId, false ); + outNode.OnOutputPortConnected( OutPortId, InNodeId, InPortId ); + } + else if( DebugConsoleWindow.DeveloperMode ) + { + if( !inputCompatible ) + UIUtils.ShowIncompatiblePortMessage( true, inNode, inputPort, outNode, outputPort ); + + if( !outputCompatible ) + UIUtils.ShowIncompatiblePortMessage( true, outNode, outputPort, inNode, inputPort ); + } + } + else if( DebugConsoleWindow.DeveloperMode ) + { + if( inputPort == null ) + { + UIUtils.ShowMessage( "Input Port " + InPortId + " doesn't exist on node " + InNodeId, MessageSeverity.Error ); + } + else + { + UIUtils.ShowMessage( "Output Port " + OutPortId + " doesn't exist on node " + OutNodeId, MessageSeverity.Error ); + } + } + } + else if( DebugConsoleWindow.DeveloperMode ) + { + if( inNode == null ) + { + UIUtils.ShowMessage( "Input node " + InNodeId + " doesn't exist", MessageSeverity.Error ); + } + else + { + UIUtils.ShowMessage( "Output node " + OutNodeId + " doesn't exist", MessageSeverity.Error ); + } + } + } + break; + } + } + } + } + } + + graph.CheckForDuplicates(); + graph.UpdateRegisters(); + graph.RefreshExternalReferences(); + graph.ForceSignalPropagationOnMasterNode(); + graph.LoadedShaderVersion = VersionInfo.FullNumber; + //Reset(); + graph.IsLoading = false; + } + + public ShaderLoadResult LoadFromDisk( string pathname, AmplifyShaderFunction shaderFunction = null ) + { + m_mainGraphInstance.IsLoading = true; + System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture; + + FullCleanUndoStack(); + m_performFullUndoRegister = true; + + UIUtils.DirtyMask = false; + if( UIUtils.IsUnityNativeShader( pathname ) ) + { + ShowMessage( "Cannot edit native unity shaders.\nReplacing by a new one." ); + return ShaderLoadResult.UNITY_NATIVE_PATHS; + } + + m_lastOpenedLocation = pathname; + Lastpath = pathname; + + string buffer = string.Empty; + if( shaderFunction == null ) + buffer = IOUtils.LoadTextFileFromDisk( pathname ); + else + buffer = shaderFunction.FunctionInfo; + + if( String.IsNullOrEmpty( buffer ) ) + { + ShowMessage( "Could not open file " + pathname ); + return ShaderLoadResult.FILE_NOT_FOUND; + } + + if( !IOUtils.HasValidShaderBody( ref buffer ) ) + { + return ShaderLoadResult.ASE_INFO_NOT_FOUND; + } + + m_mainGraphInstance.CleanNodes(); + Reset(); + + Shader shader = null; + ShaderLoadResult loadResult = ShaderLoadResult.LOADED; + // Find checksum value on body + int checksumId = buffer.IndexOf( IOUtils.CHECKSUM ); + if( checksumId > -1 ) + { + string checkSumStoredValue = buffer.Substring( checksumId ); + string trimmedBuffer = buffer.Remove( checksumId ); + + string[] typeValuePair = checkSumStoredValue.Split( IOUtils.VALUE_SEPARATOR ); + if( typeValuePair != null && typeValuePair.Length == 2 ) + { + // Check read checksum and compare with the actual shader body to detect external changes + string currentChecksumValue = IOUtils.CreateChecksum( trimmedBuffer ); + if( DebugConsoleWindow.DeveloperMode && !currentChecksumValue.Equals( typeValuePair[ 1 ] ) ) + { + ShowMessage( "Wrong checksum" ); + } + + trimmedBuffer = trimmedBuffer.Replace( "\r", string.Empty ); + // find node info body + int shaderBodyId = trimmedBuffer.IndexOf( IOUtils.ShaderBodyBegin ); + if( shaderBodyId > -1 ) + { + trimmedBuffer = trimmedBuffer.Substring( shaderBodyId ); + //Find set of instructions + string[] instructions = trimmedBuffer.Split( IOUtils.LINE_TERMINATOR ); + // First line is to be ignored and second line contains version + string[] versionParams = instructions[ 1 ].Split( IOUtils.VALUE_SEPARATOR ); + if( versionParams.Length == 2 ) + { + int version = 0; + try + { + version = Convert.ToInt32( versionParams[ 1 ] ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + + if( version > VersionInfo.FullNumber ) + { + ShowMessage( "This shader was created on a new ASE version\nPlease install v." + version ); + } + + if( DebugConsoleWindow.DeveloperMode ) + { + if( version < VersionInfo.FullNumber ) + { + ShowMessage( "This shader was created on a older ASE version\nSaving will update it to the new one." ); + } + } + + m_mainGraphInstance.LoadedShaderVersion = version; + } + else + { + ShowMessage( "Corrupted version" ); + } + + // Dummy values,camera values can only be applied after node loading is complete + Rect dummyCameraInfo = new Rect(); + Vector2 dummyCameraOffset = new Vector2(); + float dummyCameraZoom = 0; + bool applyDummy = false; + bool dummyNodeParametersWindowMaximized = false; + bool dummyPaletteWindowMaximized = false; + + //Second line contains camera information ( position, size, offset and zoom ) + string[] cameraParams = instructions[ 2 ].Split( IOUtils.FIELD_SEPARATOR ); + if( cameraParams.Length == 9 ) + { + applyDummy = true; + try + { + dummyCameraInfo.x = Convert.ToSingle( cameraParams[ 0 ] ); + dummyCameraInfo.y = Convert.ToSingle( cameraParams[ 1 ] ); + dummyCameraInfo.width = Convert.ToSingle( cameraParams[ 2 ] ); + dummyCameraInfo.height = Convert.ToSingle( cameraParams[ 3 ] ); + dummyCameraOffset.x = Convert.ToSingle( cameraParams[ 4 ] ); + dummyCameraOffset.y = Convert.ToSingle( cameraParams[ 5 ] ); + dummyCameraZoom = Convert.ToSingle( cameraParams[ 6 ] ); + + float centerWidth = ( this.position.width - dummyCameraInfo.width ) * 0.5f * dummyCameraZoom; + float centerHeight = ( this.position.height - dummyCameraInfo.height ) * 0.5f * dummyCameraZoom; + + dummyCameraInfo.x += centerWidth; + dummyCameraOffset.x += centerWidth; + dummyCameraInfo.y += centerHeight; + dummyCameraOffset.y += centerHeight; + dummyNodeParametersWindowMaximized = Convert.ToBoolean( cameraParams[ 7 ] ); + dummyPaletteWindowMaximized = Convert.ToBoolean( cameraParams[ 8 ] ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + else + { + ShowMessage( "Camera parameters are corrupted" ); + } + + // valid instructions are only between the line after version and the line before the last one ( which contains ShaderBodyEnd ) + for( int instructionIdx = 3; instructionIdx < instructions.Length - 1; instructionIdx++ ) + { + //TODO: After all is working, convert string parameters to ints in order to speed up reading + string[] parameters = instructions[ instructionIdx ].Split( IOUtils.FIELD_SEPARATOR ); + + // All nodes must be created before wiring the connections ... + // Since all nodes on the save op are written before the wires, we can safely create them + // If that order is not maintained the it's because of external editing and its the users responsability + switch( parameters[ 0 ] ) + { + case IOUtils.NodeParam: + { + string typeStr = parameters[ IOUtils.NodeTypeId ]; + typeStr = IOUtils.NodeTypeReplacer.ContainsKey( typeStr ) ? IOUtils.NodeTypeReplacer[ typeStr ] : typeStr; + System.Type type = System.Type.GetType( typeStr ); + if( type == null ) + { +#if UNITY_2017_3_OR_NEWER + try + { + var editorAssembly = System.Reflection.Assembly.Load( "Assembly-CSharp-Editor" ); + if( editorAssembly != null ) + { + type = editorAssembly.GetType( typeStr ); + } + } + catch( Exception ) + { + + } +#endif + } + + if( type != null ) + { + System.Type oldType = type; + NodeAttributes attribs = m_contextMenu.GetNodeAttributesForType( type ); + if( attribs == null ) + { + attribs = m_contextMenu.GetDeprecatedNodeAttributesForType( type ); + if( attribs != null ) + { + if( attribs.Deprecated ) + { + if( attribs.DeprecatedAlternativeType != null ) + { + type = attribs.DeprecatedAlternativeType; + ShowMessage( string.Format( "Node {0} is deprecated and was replaced by {1} ", attribs.Name, attribs.DeprecatedAlternative ) ); + } + else + { + if( string.IsNullOrEmpty( attribs.DeprecatedAlternative ) ) + ShowMessage( string.Format( Constants.DeprecatedNoAlternativeMessageStr, attribs.Name, attribs.DeprecatedAlternative ), MessageSeverity.Normal, false ); + else + ShowMessage( string.Format( Constants.DeprecatedMessageStr, attribs.Name, attribs.DeprecatedAlternative ), MessageSeverity.Normal, false ); + } + } + } + } + + ParentNode newNode = (ParentNode)ScriptableObject.CreateInstance( type ); + if( newNode != null ) + { + try + { + newNode.ContainerGraph = m_mainGraphInstance; + if( oldType != type ) + { + newNode.ParentReadFromString( ref parameters ); + newNode.ReadFromDeprecated( ref parameters, oldType ); + newNode.WasDeprecated = true; + } + else + newNode.ReadFromString( ref parameters ); + + + if( oldType == type ) + { + newNode.ReadInputDataFromString( ref parameters ); + if( UIUtils.CurrentShaderVersion() > 5107 ) + { + newNode.ReadOutputDataFromString( ref parameters ); + } + } + } + catch( Exception e ) + { + Debug.LogException( e, newNode ); + } + m_mainGraphInstance.AddNode( newNode, false, true, false ); + } + } + else + { + ShowMessage( string.Format( "{0} is not a valid ASE node ", parameters[ IOUtils.NodeTypeId ] ), MessageSeverity.Error ); + } + } + break; + case IOUtils.WireConnectionParam: + { + int InNodeId = 0; + int InPortId = 0; + int OutNodeId = 0; + int OutPortId = 0; + + try + { + InNodeId = Convert.ToInt32( parameters[ IOUtils.InNodeId ] ); + InPortId = Convert.ToInt32( parameters[ IOUtils.InPortId ] ); + OutNodeId = Convert.ToInt32( parameters[ IOUtils.OutNodeId ] ); + OutPortId = Convert.ToInt32( parameters[ IOUtils.OutPortId ] ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + + ParentNode inNode = m_mainGraphInstance.GetNode( InNodeId ); + ParentNode outNode = m_mainGraphInstance.GetNode( OutNodeId ); + + //if ( UIUtils.CurrentShaderVersion() < 5002 ) + //{ + // InPortId = inNode.VersionConvertInputPortId( InPortId ); + // OutPortId = outNode.VersionConvertOutputPortId( OutPortId ); + //} + + InputPort inputPort = null; + OutputPort outputPort = null; + if( inNode != null && outNode != null ) + { + + if( UIUtils.CurrentShaderVersion() < 5002 ) + { + InPortId = inNode.VersionConvertInputPortId( InPortId ); + OutPortId = outNode.VersionConvertOutputPortId( OutPortId ); + + if( inNode.WasDeprecated ) + InPortId = inNode.InputIdFromDeprecated( InPortId ); + if( outNode.WasDeprecated ) + OutPortId = outNode.OutputIdFromDeprecated( OutPortId ); + + inputPort = inNode.GetInputPortByArrayId( InPortId ); + outputPort = outNode.GetOutputPortByArrayId( OutPortId ); + } + else + { + if( inNode.WasDeprecated ) + InPortId = inNode.InputIdFromDeprecated( InPortId ); + if( outNode.WasDeprecated ) + OutPortId = outNode.OutputIdFromDeprecated( OutPortId ); + + inputPort = inNode.GetInputPortByUniqueId( InPortId ); + outputPort = outNode.GetOutputPortByUniqueId( OutPortId ); + } + + if( inputPort != null && outputPort != null ) + { + bool inputCompatible = inputPort.CheckValidType( outputPort.DataType ); + bool outputCompatible = outputPort.CheckValidType( inputPort.DataType ); + if( inputCompatible && outputCompatible ) + { + inputPort.ConnectTo( OutNodeId, OutPortId, outputPort.DataType, false ); + outputPort.ConnectTo( InNodeId, InPortId, inputPort.DataType, inputPort.TypeLocked ); + + inNode.OnInputPortConnected( InPortId, OutNodeId, OutPortId, false ); + outNode.OnOutputPortConnected( OutPortId, InNodeId, InPortId ); + } + else if( DebugConsoleWindow.DeveloperMode ) + { + if( !inputCompatible ) + UIUtils.ShowIncompatiblePortMessage( true, inNode, inputPort, outNode, outputPort ); + + if( !outputCompatible ) + UIUtils.ShowIncompatiblePortMessage( true, outNode, outputPort, inNode, inputPort ); + } + } + else if( DebugConsoleWindow.DeveloperMode ) + { + if( inputPort == null ) + { + UIUtils.ShowMessage( "Input Port " + InPortId + " doesn't exist on node " + InNodeId, MessageSeverity.Error ); + } + else + { + UIUtils.ShowMessage( "Output Port " + OutPortId + " doesn't exist on node " + OutNodeId, MessageSeverity.Error ); + } + } + } + else if( DebugConsoleWindow.DeveloperMode ) + { + if( inNode == null ) + { + UIUtils.ShowMessage( "Input node " + InNodeId + " doesn't exist", MessageSeverity.Error ); + } + else + { + UIUtils.ShowMessage( "Output node " + OutNodeId + " doesn't exist", MessageSeverity.Error ); + } + } + } + break; + } + } + + if( shaderFunction != null ) + { + m_onLoadDone = 2; + if( applyDummy ) + { + m_cameraInfo = dummyCameraInfo; + m_cameraOffset = dummyCameraOffset; + CameraZoom = dummyCameraZoom; + if( DebugConsoleWindow.UseShaderPanelsInfo ) + { + m_nodeParametersWindowMaximized = m_nodeParametersWindow.IsMaximized = dummyNodeParametersWindowMaximized; + m_paletteWindowMaximized = m_paletteWindow.IsMaximized = dummyPaletteWindowMaximized; + } + } + + } + else + { + shader = AssetDatabase.LoadAssetAtPath( pathname ); + if( shader ) + { + + m_onLoadDone = 2; + if( applyDummy ) + { + m_cameraInfo = dummyCameraInfo; + m_cameraOffset = dummyCameraOffset; + CameraZoom = dummyCameraZoom; + if( DebugConsoleWindow.UseShaderPanelsInfo ) + { + m_nodeParametersWindowMaximized = m_nodeParametersWindow.IsMaximized = dummyNodeParametersWindowMaximized; + m_paletteWindowMaximized = m_paletteWindow.IsMaximized = dummyPaletteWindowMaximized; + } + } + } + else + { + ShowMessage( "Could not load shader asset" ); + } + } + } + else + { + ShowMessage( "Graph info not found" ); + } + } + else + { + ShowMessage( "Corrupted checksum" ); + } + } + else + { + ShowMessage( "Checksum not found" ); + } + + //m_mainGraphInstance.LoadedShaderVersion = m_versionInfo.FullNumber; + if( UIUtils.CurrentMasterNode() ) + UIUtils.CurrentMasterNode().ForcePortType(); + + UIUtils.DirtyMask = true; + m_checkInvalidConnections = true; + + m_mainGraphInstance.CheckForDuplicates(); + m_mainGraphInstance.UpdateRegisters(); + m_mainGraphInstance.RefreshExternalReferences(); + m_mainGraphInstance.ForceSignalPropagationOnMasterNode(); + + if( shaderFunction != null ) + { + //if( CurrentGraph.CurrentFunctionOutput == null ) + //{ + // //Fix in case a function output node is not marked as main node + // CurrentGraph.AssignMasterNode( UIUtils.FunctionOutputList()[ 0 ], false ); + //} + shaderFunction.ResetDirectivesOrigin(); + CurrentGraph.CurrentShaderFunction = shaderFunction; + } + else + { + if( shader != null ) + { + m_mainGraphInstance.UpdateShaderOnMasterNode( shader ); + if( m_mainGraphInstance.CurrentCanvasMode == NodeAvailability.TemplateShader ) + { + m_mainGraphInstance.RefreshLinkedMasterNodes( false ); + m_mainGraphInstance.OnRefreshLinkedPortsComplete(); + //m_mainGraphInstance.SetLateOptionsRefresh(); + } + } + } + + + m_mainGraphInstance.LoadedShaderVersion = VersionInfo.FullNumber; + + System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture; + + m_mainGraphInstance.IsLoading = false; + //Remove focus from UI elements so no UI is incorrectly selected from previous loads + //Shader Name textfield was sometimes incorrectly selected + GUI.FocusControl( null ); + return loadResult; + } + + public void FullCleanUndoStack() + { + Undo.ClearUndo( this ); + m_mainGraphInstance.FullCleanUndoStack(); + } + + public void FullRegisterOnUndoStack() + { + Undo.RegisterCompleteObjectUndo( this, Constants.UndoRegisterFullGrapId ); + m_mainGraphInstance.FullRegisterOnUndoStack(); + } + + public void ShowPortInfo() + { + GetWindow(); + } + + public void ShowShaderLibrary() + { + GetWindow(); + } + + public void ShowMessage( string message, MessageSeverity severity = MessageSeverity.Normal, bool registerTimestamp = true, bool consoleLog = false ) + { + ShowMessage( -1, message, severity, registerTimestamp, consoleLog ); + } + + public void ShowMessage( int messageOwner, string message, MessageSeverity severity = MessageSeverity.Normal, bool registerTimestamp = true, bool consoleLog = false ) + { + if( UIUtils.InhibitMessages || m_genericMessageUI == null ) + return; + + m_consoleLogWindow.AddMessage( severity, message , messageOwner); + + MarkToRepaint(); + + if( consoleLog ) + { + switch( severity ) + { + case MessageSeverity.Normal: + { + Debug.Log( message ); + } + break; + case MessageSeverity.Warning: + { + Debug.LogWarning( message ); + } + break; + case MessageSeverity.Error: + { + Debug.LogError( message ); + } + break; + } + } + } + + // NOTE: this can probably be removed safely + public void ShowMessageImmediately( string message, MessageSeverity severity = MessageSeverity.Normal, bool consoleLog = true ) + { + if( UIUtils.InhibitMessages ) + return; + + switch( severity ) + { + case MessageSeverity.Normal: + { + m_genericMessageContent.text = message; + if( consoleLog ) + { + Debug.Log( message ); + } + } + break; + case MessageSeverity.Warning: + { + m_genericMessageContent.text = "Warning!\n" + message; + if( consoleLog ) + { + Debug.LogWarning( message ); + } + } + break; + case MessageSeverity.Error: + { + m_genericMessageContent.text = "Error!!!\n" + message; + if( consoleLog ) + { + Debug.LogError( message ); + } + } + break; + } + + try + { + ShowNotification( m_genericMessageContent ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + + public bool MouseInteracted = false; + + void OnGUI() + { +#if UNITY_2018_3_OR_NEWER + if( ASEPackageManagerHelper.CheckImporter ) + return; +#endif + +#if UNITY_EDITOR_WIN + if( m_openSavedFolder && Event.current.type == EventType.Repaint ) + { + OpenSavedFolder(); + return; + } +#endif + AmplifyShaderEditorWindow cacheWindow = UIUtils.CurrentWindow; + UIUtils.CurrentWindow = this; + + if( !m_initialized || (object)UIUtils.MainSkin == null || !UIUtils.Initialized ) + { + UIUtils.InitMainSkin(); + Init(); + } + + m_currentEvent = Event.current; + if( m_currentEvent.type == EventType.ExecuteCommand || m_currentEvent.type == EventType.ValidateCommand ) + m_currentCommandName = m_currentEvent.commandName; + else + m_currentCommandName = string.Empty; + + System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture; + + MouseInteracted = false; + + if( m_refreshOnUndo ) + { + m_refreshOnUndo = false; + m_mainGraphInstance.RefreshOnUndo(); + } + + if( m_refreshAvailableNodes ) + { + RefreshAvaibleNodes(); + } + + if( m_previousShaderFunction != CurrentGraph.CurrentShaderFunction ) + { + m_nodeParametersWindow.ForceUpdate = true; + m_previousShaderFunction = CurrentGraph.CurrentShaderFunction; + } + + if( m_nodeToFocus != null && m_currentEvent.type == EventType.Layout ) + { + FocusOnNode( m_nodeToFocus, m_zoomToFocus, m_selectNodeToFocus ); + m_nodeToFocus = null; + } + + m_mainGraphInstance.OnDuplicateEventWrapper(); + + m_currentInactiveTime = CalculateInactivityTime(); + + if( m_nodeParametersWindow != null && m_innerEditorVariables.NodeParametersMaximized != m_nodeParametersWindow.IsMaximized ) + m_innerEditorVariables.NodeParametersMaximized = m_nodeParametersWindow.IsMaximized; + if( m_paletteWindow != null && m_innerEditorVariables.NodePaletteMaximized != m_paletteWindow.IsMaximized ) + m_innerEditorVariables.NodePaletteMaximized = m_paletteWindow.IsMaximized; + + if( m_checkInvalidConnections ) + { + m_checkInvalidConnections = false; + m_mainGraphInstance.DeleteInvalidConnections(); + } + + //if ( m_repaintIsDirty ) + //{ + // m_repaintIsDirty = false; + // ForceRepaint(); + //} + + if( m_forcingMaterialUpdateFlag ) + { + Focus(); + if( m_materialsToUpdate.Count > 0 ) + { + float percentage = 100.0f * (float)( UIUtils.TotalExampleMaterials - m_materialsToUpdate.Count ) / (float)UIUtils.TotalExampleMaterials; + if( m_forcingMaterialUpdateOp ) // Read + { + Debug.Log( percentage + "% Recompiling " + m_materialsToUpdate[ 0 ].name ); + LoadDroppedObject( true, m_materialsToUpdate[ 0 ].shader, m_materialsToUpdate[ 0 ] ); + } + else // Write + { + Debug.Log( percentage + "% Saving " + m_materialsToUpdate[ 0 ].name ); + SaveToDisk( false ); + m_materialsToUpdate.RemoveAt( 0 ); + } + m_forcingMaterialUpdateOp = !m_forcingMaterialUpdateOp; + } + else + { + Debug.Log( "100% - All Materials compiled " ); + m_forcingMaterialUpdateFlag = false; + } + } + + + if( m_removedKeyboardFocus ) + { + m_removedKeyboardFocus = false; + GUIUtility.keyboardControl = 0; + } + + + Vector2 pos = m_currentEvent.mousePosition; + pos.x += position.x; + pos.y += position.y; + m_insideEditorWindow = position.Contains( pos ); + + if( m_delayedLoadObject != null && m_mainGraphInstance.CurrentMasterNode != null ) + { + m_mainGraphInstance.SetLateOptionsRefresh(); + LoadObject( m_delayedLoadObject ); + m_delayedLoadObject = null; + } + else if( m_delayedLoadObject != null && m_mainGraphInstance.CurrentOutputNode != null ) + { + m_mainGraphInstance.SetLateOptionsRefresh(); + LoadObject( m_delayedLoadObject ); + m_delayedLoadObject = null; + } + + if( m_delayedMaterialSet != null && m_mainGraphInstance.CurrentMasterNode != null ) + { + m_mainGraphInstance.UpdateMaterialOnMasterNode( m_delayedMaterialSet ); + m_mainGraphInstance.SetMaterialModeOnGraph( m_delayedMaterialSet ); + CurrentSelection = ASESelectionMode.Material; + IsShaderFunctionWindow = false; + m_delayedMaterialSet = null; + } + + Material currentMaterial = m_mainGraphInstance.CurrentMaterial; + if( m_forceUpdateFromMaterialFlag ) + { + Focus(); + m_forceUpdateFromMaterialFlag = false; + if( currentMaterial != null ) + { + m_mainGraphInstance.CopyValuesFromMaterial( currentMaterial ); + m_repaintIsDirty = true; + } + } + + m_repaintCount = 0; + m_cameraInfo = position; + + //if( m_currentEvent.type == EventType.keyDown ) + if( m_currentEvent.type == EventType.Repaint ) + m_keyEvtMousePos2D = m_currentEvent.mousePosition; + + m_currentMousePos2D = m_currentEvent.mousePosition; + m_currentMousePos.x = m_currentMousePos2D.x; + m_currentMousePos.y = m_currentMousePos2D.y; + + m_graphArea.width = m_cameraInfo.width; + m_graphArea.height = m_cameraInfo.height; + + m_autoPanDirActive = m_lmbPressed || m_forceAutoPanDir || m_multipleSelectionActive || m_wireReferenceUtils.ValidReferences(); + + + // Need to use it in order to prevent Mismatched LayoutGroup on ValidateCommand when rendering nodes + //if( Event.current.type == EventType.ValidateCommand ) + //{ + // Event.current.Use(); + //} + + // Nodes Graph background area + //GUILayout.BeginArea( m_graphArea, "Nodes" ); + { + // Camera movement is simulated by grabing the current camera offset, transforming it into texture space and manipulating the tiled texture uv coords + GUI.DrawTextureWithTexCoords( m_graphArea, m_graphBgTexture, + new Rect( ( -m_cameraOffset.x / m_graphBgTexture.width ), + ( m_cameraOffset.y / m_graphBgTexture.height ) - m_cameraZoom * m_cameraInfo.height / m_graphBgTexture.height, + m_cameraZoom * m_cameraInfo.width / m_graphBgTexture.width, + m_cameraZoom * m_cameraInfo.height / m_graphBgTexture.height ) ); + + Color col = GUI.color; + GUI.color = new Color( 1, 1, 1, 0.7f ); + GUI.DrawTexture( m_graphArea, m_graphFgTexture, ScaleMode.StretchToFill, true ); + GUI.color = col; + } + //GUILayout.EndArea(); + + if( DebugConsoleWindow.DeveloperMode && m_currentEvent.type == EventType.Repaint ) + { + GUI.Label( new Rect(Screen.width - 60, 40, 60, 50), m_fpsDisplay ); + } + + bool restoreMouse = false; + if( InsideMenus( m_currentMousePos2D ) /*|| _confirmationWindow.IsActive*/ ) + { + if( Event.current.type == EventType.MouseDown ) + { + restoreMouse = true; + Event.current.type = EventType.Ignore; + } + + // Must guarantee that mouse up ops on menus will reset auto pan if it is set + if( m_currentEvent.type == EventType.MouseUp && m_currentEvent.button == ButtonClickId.LeftMouseButton ) + { + m_lmbPressed = false; + } + + } + // Nodes + //GUILayout.BeginArea( m_graphArea ); + { + m_drawInfo.CameraArea = m_cameraInfo; + m_drawInfo.TransformedCameraArea = m_graphArea; + + m_drawInfo.MousePosition = m_currentMousePos2D; + m_drawInfo.CameraOffset = m_cameraOffset; + m_drawInfo.InvertedZoom = 1 / m_cameraZoom; + m_drawInfo.LeftMouseButtonPressed = m_currentEvent.button == ButtonClickId.LeftMouseButton; + m_drawInfo.CurrentEventType = m_currentEvent.type; + m_drawInfo.ZoomChanged = m_zoomChanged; + + m_drawInfo.TransformedMousePos = m_currentMousePos2D * m_cameraZoom - m_cameraOffset; + + if( m_drawInfo.CurrentEventType == EventType.Repaint ) + UIUtils.UpdateMainSkin( m_drawInfo ); + + // Draw mode indicator + m_modeWindow.Draw( m_graphArea, m_currentMousePos2D, m_mainGraphInstance.CurrentShader, currentMaterial, + 0.5f * ( m_graphArea.width - m_paletteWindow.RealWidth - m_nodeParametersWindow.RealWidth ), + ( m_nodeParametersWindow.IsMaximized ? m_nodeParametersWindow.RealWidth : 0 ), + ( m_paletteWindow.IsMaximized ? m_paletteWindow.RealWidth : 0 )/*, m_openedAssetFromNode*/ ); + + PreTestLeftMouseDown(); + //m_consoleLogWindow.Draw( m_graphArea, m_currentMousePos2D, m_currentEvent.button, false, m_paletteWindow.IsMaximized ? m_paletteWindow.RealWidth : 0 ); + //m_mainGraphInstance.DrawBezierBoundingBox(); + //CheckNodeReplacement(); + + // Main Graph Draw + m_repaintIsDirty = m_mainGraphInstance.Draw( m_drawInfo ) || m_repaintIsDirty; + + m_mainGraphInstance.DrawGrid( m_drawInfo ); + bool hasUnusedConnNodes = m_mainGraphInstance.HasUnConnectedNodes; + m_toolsWindow.SetStateOnButton( ToolButtonType.CleanUnusedNodes, hasUnusedConnNodes ? 1 : 0 ); + + m_zoomChanged = false; + + MasterNode masterNode = m_mainGraphInstance.CurrentMasterNode; + if( masterNode != null ) + { + m_toolsWindow.DrawShaderTitle( m_nodeParametersWindow, m_paletteWindow, AvailableCanvasWidth, m_graphArea.height, masterNode.CroppedShaderName ); + } + else if( m_mainGraphInstance.CurrentOutputNode != null ) + { + string functionName = string.Empty; + + if( m_mainGraphInstance.CurrentShaderFunction != null ) + functionName = m_mainGraphInstance.CurrentShaderFunction.FunctionName; + m_toolsWindow.DrawShaderTitle( m_nodeParametersWindow, m_paletteWindow, AvailableCanvasWidth, m_graphArea.height, functionName ); + } + } + //m_consoleLogWindow.Draw( m_graphArea, m_currentMousePos2D, m_currentEvent.button, false, m_paletteWindow.IsMaximized ? m_paletteWindow.RealWidth : 0 ); + //GUILayout.EndArea(); + + if( restoreMouse ) + { + Event.current.type = EventType.MouseDown; + m_drawInfo.CurrentEventType = EventType.MouseDown; + } + + m_toolsWindow.InitialX = m_nodeParametersWindow.RealWidth; + m_toolsWindow.Width = m_cameraInfo.width - ( m_nodeParametersWindow.RealWidth + m_paletteWindow.RealWidth ); + m_toolsWindow.Draw( m_cameraInfo, m_currentMousePos2D, m_currentEvent.button, false ); + + m_tipsWindow.Draw( m_cameraInfo, m_currentMousePos2D, m_currentEvent.button, false ); + + bool autoMinimize = false; + if( position.width < m_lastWindowWidth && position.width < Constants.MINIMIZE_WINDOW_LOCK_SIZE ) + { + autoMinimize = true; + } + + if( autoMinimize ) + m_nodeParametersWindow.IsMaximized = false; + + ParentNode selectedNode = ( m_mainGraphInstance.SelectedNodes.Count == 1 ) ? m_mainGraphInstance.SelectedNodes[ 0 ] : m_mainGraphInstance.CurrentMasterNode; + m_repaintIsDirty = m_nodeParametersWindow.Draw( m_cameraInfo, selectedNode, m_currentMousePos2D, m_currentEvent.button, false ) || m_repaintIsDirty; //TODO: If multiple nodes from the same type are selected also show a parameters window which modifies all of them + if( m_nodeParametersWindow.IsResizing ) + m_repaintIsDirty = true; + + // Test to ignore mouse on main palette when inside context palette ... IsInside also takes active state into account + bool ignoreMouseForPalette = m_contextPalette.IsInside( m_currentMousePos2D ); + if( ignoreMouseForPalette && Event.current.type == EventType.MouseDown ) + { + Event.current.type = EventType.Ignore; + m_drawInfo.CurrentEventType = EventType.Ignore; + } + if( autoMinimize ) + m_paletteWindow.IsMaximized = false; + + m_paletteWindow.Draw( m_cameraInfo, m_currentMousePos2D, m_currentEvent.button, !m_contextPalette.IsActive ); + if( m_paletteWindow.IsResizing ) + { + m_repaintIsDirty = true; + } + + if( ignoreMouseForPalette ) + { + if( restoreMouse ) + { + Event.current.type = EventType.MouseDown; + m_drawInfo.CurrentEventType = EventType.MouseDown; + } + } + + m_consoleLogWindow.Draw( m_graphArea, m_currentMousePos2D, m_currentEvent.button, false, m_paletteWindow.IsMaximized ? m_paletteWindow.RealWidth : 0 ); + + if( m_contextPalette.IsActive ) + { + m_contextPalette.Draw( m_cameraInfo, m_currentMousePos2D, m_currentEvent.button, m_contextPalette.IsActive ); + } + + if( m_palettePopup.IsActive ) + { + m_palettePopup.Draw( m_currentMousePos2D ); + m_repaintIsDirty = true; + int controlID = GUIUtility.GetControlID( FocusType.Passive ); + if( m_currentEvent.GetTypeForControl( controlID ) == EventType.MouseUp ) + { + if( m_currentEvent.button == ButtonClickId.LeftMouseButton ) + { + m_palettePopup.Deactivate(); + if( !InsideMenus( m_currentMousePos2D ) ) + { + ParentNode newNode = CreateNode( m_paletteChosenType, TranformedMousePos, m_paletteChosenFunction ); + //Debug.Log("created menu"); + m_mainGraphInstance.SelectNode( newNode, false, false ); + + bool find = false; + if( newNode is FunctionNode && CurrentGraph.CurrentShaderFunction != null ) + find = SearchFunctionNodeRecursively( CurrentGraph.CurrentShaderFunction ); + + if( find ) + { + DestroyNode( newNode, false ); + ShowMessage( "Shader Function loop detected, new node was removed to prevent errors." ); + } + else + { + newNode.RefreshExternalReferences(); + } + } + } + } + } + + // Handle all events ( mouse interaction + others ) + if( !MouseInteracted ) + HandleGUIEvents(); + + if( m_currentEvent.type == EventType.Repaint ) + { + m_mainGraphInstance.UpdateMarkForDeletion(); + } + // UI Overlay + // Selection Box + if( m_multipleSelectionActive ) + { + UpdateSelectionArea(); + Rect transformedArea = m_multipleSelectionArea; + transformedArea.position = ( transformedArea.position + m_cameraOffset ) / m_cameraZoom; + transformedArea.size /= m_cameraZoom; + + if( transformedArea.width < 0 ) + { + transformedArea.width = -transformedArea.width; + transformedArea.x -= transformedArea.width; + } + + if( transformedArea.height < 0 ) + { + transformedArea.height = -transformedArea.height; + transformedArea.y -= transformedArea.height; + } + Color original = GUI.color; + GUI.color = Constants.BoxSelectionColor; + GUI.Label( transformedArea, "", UIUtils.Box ); + GUI.color = original; + //GUI.backgroundColor = original; + } + + bool isResizing = m_nodeParametersWindow.IsResizing || m_paletteWindow.IsResizing; + //Test boundaries for auto-pan + if( !isResizing && m_autoPanDirActive ) + { + m_autoPanArea[ (int)AutoPanLocation.LEFT ].AdjustInitialX = m_nodeParametersWindow.IsMaximized ? m_nodeParametersWindow.RealWidth : 0; + m_autoPanArea[ (int)AutoPanLocation.RIGHT ].AdjustInitialX = m_paletteWindow.IsMaximized ? -m_paletteWindow.RealWidth : 0; + Vector2 autoPanDir = Vector2.zero; + for( int i = 0; i < m_autoPanArea.Length; i++ ) + { + if( m_autoPanArea[ i ].CheckArea( m_currentMousePos2D, m_cameraInfo, false ) ) + { + autoPanDir += m_autoPanArea[ i ].Velocity; + } + } + m_cameraOffset += autoPanDir; + if( !m_wireReferenceUtils.ValidReferences() && m_insideEditorWindow && !m_altBoxSelection ) + { + m_mainGraphInstance.MoveSelectedNodes( -autoPanDir ); + } + + m_repaintIsDirty = true; + } + + m_isDirty = m_isDirty || m_mainGraphInstance.IsDirty; + if( m_isDirty ) + { + m_isDirty = false; + //ShaderIsModified = true; + EditorUtility.SetDirty( this ); + } + + m_saveIsDirty = m_saveIsDirty || m_mainGraphInstance.SaveIsDirty; + if( m_liveShaderEditing ) + { + if( m_saveIsDirty ) + { + if( focusedWindow == this && m_currentInactiveTime > InactivitySaveTime && !(EditorGUIUtility.editingTextField && EditorGUIUtility.keyboardControl!=0) ) + { + m_saveIsDirty = false; + if( m_mainGraphInstance.CurrentMasterNodeId != Constants.INVALID_NODE_ID ) + { + SaveToDisk( true ); + } + else + { + ShowMessage( LiveShaderError ); + } + } + } + } + else if( m_saveIsDirty ) + { + ShaderIsModified = true; + m_saveIsDirty = false; + } + + if( m_onLoadDone > 0 ) + { + m_onLoadDone--; + if( m_onLoadDone == 0 ) + { + ShaderIsModified = false; + } + } + + if( m_cacheSaveOp ) + { + if( ( EditorApplication.timeSinceStartup - m_lastTimeSaved ) > SaveTime ) + { + SaveToDisk( false ); + } + } + m_genericMessageUI.CheckForMessages(); + + if( m_ctrlSCallback ) + { + m_ctrlSCallback = false; + OnToolButtonPressed( ToolButtonType.Update ); + } + + m_lastWindowWidth = position.width; + m_nodeExporterUtils.Update(); + + if( m_markedToSave ) + { + m_markedToSave = false; + SaveToDisk( false ); + } + if( m_performFullUndoRegister ) + { + m_performFullUndoRegister = false; + FullRegisterOnUndoStack(); + } + + if( CheckFunctions ) + CheckFunctions = false; + + System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture; + + UIUtils.CurrentWindow = cacheWindow; + if( !m_nodesLoadedCorrectly ) + { + try + { + ShowNotification( NodesExceptionMessage ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + + CheckNodeReplacement(); +#if UNITY_EDITOR_WIN + if( m_takeScreenShot ) + FocusZoom( true, false, false ); + + if( m_takeScreenShot && Event.current.type == EventType.Repaint ) + TakeScreenShot(); +#endif + + if( Event.current.type == EventType.Layout ) + { + switch( State ) + { + default: + case OpenSaveState.NONE: + break; + case OpenSaveState.OPEN: + { + State = OpenSaveState.WAIT; + string list = EditorPrefs.GetString( "ASEfileList", "" ); + m_assetPaths = new List( list.Split( ',' ) ); + Repaint(); + } + break; + case OpenSaveState.WAIT: + { + // we wait one frame to give time for the editor to properly initialize everything + State = OpenSaveState.SAVE; + Repaint(); + } + break; + case OpenSaveState.SAVE: + { + State = OpenSaveState.CLOSE; + try + { + SaveToDisk( false ); + } + catch( Exception e ) + { + State = OpenSaveState.NONE; + throw e; + } + + Repaint(); + } + break; + case OpenSaveState.CLOSE: + { + State = OpenSaveState.NONE; + m_assetPaths.RemoveAt( 0 ); + if( m_assetPaths.Count > 0 ) + { + AmplifyShaderEditorWindow.LoadAndSaveList( m_assetPaths.ToArray() ); + } + else + { + EditorPrefs.DeleteKey( "ASEfileList" ); + } +#if UNITY_2018_3_OR_NEWER + this.Close(); +#else + m_markToClose = true; +#endif + } + break; + } + } + } + + bool m_markToClose = false; + private List m_assetPaths = new List(); + public OpenSaveState State = OpenSaveState.NONE; + public enum OpenSaveState + { + NONE, + OPEN, + WAIT, + SAVE, + CLOSE + } + + void OnInspectorUpdate() + { + Preferences.LoadDefaults(); +#if UNITY_2018_3_OR_NEWER + ASEPackageManagerHelper.Update(); +#endif + + if( m_afterDeserializeFlag ) + { + m_afterDeserializeFlag = false; + //m_mainGraphInstance.ParentWindow = this; + } + + if( (IsShaderFunctionWindow && CurrentGraph.CurrentShaderFunction == null) || m_markToClose ) + { + Close(); + } + } + + public void SetCtrlSCallback( bool imediate ) + { + //MasterNode node = _mainGraphInstance.CurrentMasterNode; + if( /*node != null && node.CurrentShader != null && */m_shaderIsModified ) + { + if( imediate ) + { + OnToolButtonPressed( ToolButtonType.Update ); + } + else + { + m_ctrlSCallback = true; + } + } + } + + public void SetSaveIsDirty() + { + m_saveIsDirty = true && UIUtils.DirtyMask; + } + + public void OnPaletteNodeCreate( System.Type type, string name, AmplifyShaderFunction function ) + { + m_mainGraphInstance.DeSelectAll(); + m_paletteChosenType = type; + m_paletteChosenFunction = function; + m_palettePopup.Activate( name ); + } + + public void OnContextPaletteNodeCreate( System.Type type, string name, AmplifyShaderFunction function ) + { + m_mainGraphInstance.DeSelectAll(); + ParentNode newNode = CreateNode( type, m_contextPalette.StartDropPosition * m_cameraZoom - m_cameraOffset, function ); + //Debug.Log( "created context" ); + m_mainGraphInstance.SelectNode( newNode, false, false ); + bool find = false; + if( newNode is FunctionNode && CurrentGraph.CurrentShaderFunction != null ) + find = SearchFunctionNodeRecursively( CurrentGraph.CurrentShaderFunction ); + + if( find ) + { + DestroyNode( newNode, false ); + ShowMessage( "Shader Function loop detected, new node was removed to prevent errors." ); + } + else + { + newNode.RefreshExternalReferences(); + } + } + + void OnNodeStoppedMovingEvent( ParentNode node ) + { + CheckZoomBoundaries( node.Vec2Position ); + //ShaderIsModified = true; + } + + void OnRefreshFunctionNodeEvent( FunctionNode node ) + { + Debug.Log( node ); + } + + private const string ShaderIsModifiedMessage = "Click to save changes."; + private const string ShaderIsNotModified = "No changes to save, up-to-date."; + void OnMaterialUpdated( MasterNode masterNode ) + { + if( masterNode != null ) + { + if( masterNode.CurrentMaterial ) + { + m_toolsWindow.SetStateOnButton( ToolButtonType.Update, ShaderIsModified ? 0 : 2, ShaderIsModified ? ShaderIsModifiedMessage : ShaderIsNotModified); + } + else + { + m_toolsWindow.SetStateOnButton( ToolButtonType.Update, 1, "Set an active Material in the Master Node." ); + } + UpdateLiveUI(); + } + else + { + m_toolsWindow.SetStateOnButton( ToolButtonType.Update, 1, "Set an active Material in the Master Node." ); + } + } + + void OnShaderUpdated( MasterNode masterNode ) + { + m_toolsWindow.SetStateOnButton( ToolButtonType.OpenSourceCode, masterNode.CurrentShader != null ? 1 : 0 ); + } + + public void CheckZoomBoundaries( Vector2 newPosition ) + { + if( newPosition.x < m_minNodePos.x ) + { + m_minNodePos.x = newPosition.x; + } + else if( newPosition.x > m_maxNodePos.x ) + { + m_maxNodePos.x = newPosition.x; + } + + if( newPosition.y < m_minNodePos.y ) + { + m_minNodePos.y = newPosition.y; + } + else if( newPosition.y > m_maxNodePos.y ) + { + m_maxNodePos.y = newPosition.y; + } + } + public void DestroyNode( ParentNode node, bool registerUndo = true ) { m_mainGraphInstance.DestroyNode( node, registerUndo ); } + public ParentNode CreateNode( System.Type type, Vector2 position, AmplifyShaderFunction function = null, bool selectNode = true ) + { + ParentNode node; + if( function == null ) + node = m_mainGraphInstance.CreateNode( type, true ); + else + node = m_mainGraphInstance.CreateNode( function, true ); + + Vector2 newPosition = position; + node.Vec2Position = newPosition; + CheckZoomBoundaries( newPosition ); + + // Connect node if a wire is active + if( m_wireReferenceUtils.ValidReferences() ) + { + if( m_wireReferenceUtils.InputPortReference.IsValid ) + { + ParentNode originNode = m_mainGraphInstance.GetNode( m_wireReferenceUtils.InputPortReference.NodeId ); + InputPort originPort = originNode.GetInputPortByUniqueId( m_wireReferenceUtils.InputPortReference.PortId ); + OutputPort outputPort = node.GetFirstOutputPortOfType( m_wireReferenceUtils.InputPortReference.DataType, true ); + if( outputPort != null && originPort.CheckValidType( outputPort.DataType ) && ( !m_wireReferenceUtils.InputPortReference.TypeLocked || + m_wireReferenceUtils.InputPortReference.DataType == WirePortDataType.OBJECT || + ( m_wireReferenceUtils.InputPortReference.TypeLocked && outputPort.DataType == m_wireReferenceUtils.InputPortReference.DataType ) ) ) + { + + //link output to input + if( outputPort.ConnectTo( m_wireReferenceUtils.InputPortReference.NodeId, m_wireReferenceUtils.InputPortReference.PortId, m_wireReferenceUtils.InputPortReference.DataType, m_wireReferenceUtils.InputPortReference.TypeLocked ) ) + node.OnOutputPortConnected( outputPort.PortId, m_wireReferenceUtils.InputPortReference.NodeId, m_wireReferenceUtils.InputPortReference.PortId ); + + //link input to output + if( originPort.ConnectTo( outputPort.NodeId, outputPort.PortId, outputPort.DataType, m_wireReferenceUtils.InputPortReference.TypeLocked ) ) + originNode.OnInputPortConnected( m_wireReferenceUtils.InputPortReference.PortId, node.UniqueId, outputPort.PortId ); + } + } + + if( m_wireReferenceUtils.OutputPortReference.IsValid ) + { + ParentNode originNode = m_mainGraphInstance.GetNode( m_wireReferenceUtils.OutputPortReference.NodeId ); + InputPort inputPort = node.GetFirstInputPortOfType( m_wireReferenceUtils.OutputPortReference.DataType, true ); + + if( inputPort != null && ( !inputPort.TypeLocked || + inputPort.DataType == WirePortDataType.OBJECT || + ( inputPort.TypeLocked && inputPort.DataType == m_wireReferenceUtils.OutputPortReference.DataType ) ) ) + { + + inputPort.InvalidateAllConnections(); + //link input to output + if( inputPort.ConnectTo( m_wireReferenceUtils.OutputPortReference.NodeId, m_wireReferenceUtils.OutputPortReference.PortId, m_wireReferenceUtils.OutputPortReference.DataType, inputPort.TypeLocked ) ) + node.OnInputPortConnected( inputPort.PortId, m_wireReferenceUtils.OutputPortReference.NodeId, m_wireReferenceUtils.OutputPortReference.PortId ); + //link output to input + + if( originNode.GetOutputPortByUniqueId( m_wireReferenceUtils.OutputPortReference.PortId ).ConnectTo( inputPort.NodeId, inputPort.PortId, m_wireReferenceUtils.OutputPortReference.DataType, inputPort.TypeLocked ) ) + originNode.OnOutputPortConnected( m_wireReferenceUtils.OutputPortReference.PortId, node.UniqueId, inputPort.PortId ); + } + } + m_wireReferenceUtils.InvalidateReferences(); + + //for ( int i = 0; i < m_mainGraphInstance.VisibleNodes.Count; i++ ) + //{ + // m_mainGraphInstance.VisibleNodes[ i ].OnNodeInteraction( node ); + //} + } + + if( selectNode ) + m_mainGraphInstance.SelectNode( node, false, false ); + //_repaintIsDirty = true + + SetSaveIsDirty(); + ForceRepaint(); + return node; + } + + public void UpdateNodePreviewListAndTime() + { + if( UIUtils.CurrentWindow != this ) + return; + + double deltaTime = Time.realtimeSinceStartup - m_time; + m_time = Time.realtimeSinceStartup; + + if( DebugConsoleWindow.DeveloperMode ) + { + m_frameCounter++; + if( m_frameCounter >= 60 ) + { + m_fpsDisplay = ( 60 / ( Time.realtimeSinceStartup - m_fpsTime ) ).ToString( "N2" ); + m_fpsTime = Time.realtimeSinceStartup; + m_frameCounter = 0; + } + } + + if( m_smoothZoom ) + { + m_repaintIsDirty = true; + if( Mathf.Abs( m_targetZoom - m_cameraZoom ) < 0.001f ) + { + m_smoothZoom = false; + m_cameraZoom = m_targetZoom; + m_zoomTime = 0; + } + else + { + m_zoomTime += deltaTime; + Vector2 canvasPos = m_zoomPivot * m_cameraZoom; + m_cameraZoom = Mathf.SmoothDamp( m_cameraZoom, m_targetZoom, ref m_zoomVelocity, 0.1f, 10000, (float)deltaTime * 1.5f ); + canvasPos = canvasPos - m_zoomPivot * m_cameraZoom; + m_cameraOffset = m_cameraOffset - canvasPos; + m_targetOffset = m_targetOffset - canvasPos; + } + + } + + if( m_smoothOffset ) + { + m_repaintIsDirty = true; + if( ( m_targetOffset - m_cameraOffset ).SqrMagnitude() < 1f ) + { + m_smoothOffset = false; + m_offsetTime = 0; + } + else + { + m_offsetTime += deltaTime; + m_cameraOffset = Vector2.SmoothDamp( m_cameraOffset, m_targetOffset, ref m_camVelocity, 0.1f, 100000, (float)deltaTime * 1.5f ); + } + } + + if( m_cachedEditorTimeId == -1 ) + m_cachedEditorTimeId = Shader.PropertyToID( "_EditorTime" ); + + if( m_cachedEditorDeltaTimeId == -1 ) + m_cachedEditorDeltaTimeId = Shader.PropertyToID( "_EditorDeltaTime" ); + + //Update Game View? + //Shader.SetGlobalVector( "_Time", new Vector4( Time.realtimeSinceStartup / 20, Time.realtimeSinceStartup, Time.realtimeSinceStartup * 2, Time.realtimeSinceStartup * 3 ) ); + + //System.Type T = System.Type.GetType( "UnityEditor.GameView,UnityEditor" ); + //UnityEngine.Object[] array = Resources.FindObjectsOfTypeAll( T ); + //EditorWindow gameView = ( array.Length <= 0 ) ? null : ( ( EditorWindow ) array[ 0 ] ); + //gameView.Repaint(); + + if( RenderSettings.sun != null ) + { + Vector3 lightdir = -RenderSettings.sun.transform.forward;//.rotation.eulerAngles; + + Shader.SetGlobalVector( "_EditorWorldLightPos", new Vector4( lightdir.x, lightdir.y, lightdir.z, 0 ) ); + Shader.SetGlobalColor( "_EditorLightColor", RenderSettings.sun.color.linear ); + } + Shader.SetGlobalFloat( "_EditorTime", (float)m_time ); + Shader.SetGlobalFloat( "_EditorDeltaTime", (float)deltaTime ); + + /////////// UPDATE PREVIEWS ////////////// + UIUtils.CheckNullMaterials(); + //CurrentGraph.AllNodes.Sort( ( x, y ) => { return x.Depth.CompareTo( y.Depth ); } ); + int nodeCount = CurrentGraph.AllNodes.Count; + for( int i = nodeCount - 1; i >= 0; i-- ) + { + ParentNode node = CurrentGraph.AllNodes[ i ]; + if( node != null && !VisitedChanged.ContainsKey( node.OutputId ) ) + { + bool result = node.RecursivePreviewUpdate(); + if( result ) + m_repaintIsDirty = true; + } + } + + VisitedChanged.Clear(); + if( m_repaintIsDirty ) + { + m_repaintIsDirty = false; + Repaint(); + } + } + + public void ForceRepaint() + { + m_repaintCount += 1; + m_repaintIsDirty = true; + //Repaint(); + } + + public void ForceUpdateFromMaterial() { m_forceUpdateFromMaterialFlag = true; } + void UseCurrentEvent() + { + m_currentEvent.Use(); + } + + + + public void OnBeforeSerialize() + { + //if ( !UIUtils.SerializeFromUndo() ) + //{ + // m_mainGraphInstance.DeSelectAll(); + //} + + if( DebugConsoleWindow.UseShaderPanelsInfo ) + { + if( m_nodeParametersWindow != null ) + m_nodeParametersWindowMaximized = m_nodeParametersWindow.IsMaximized; + + if( m_paletteWindow != null ) + m_paletteWindowMaximized = m_paletteWindow.IsMaximized; + } + } + + public void OnAfterDeserialize() + { + m_afterDeserializeFlag = true; + + //m_customGraph = null; + if( DebugConsoleWindow.UseShaderPanelsInfo ) + { + if( m_nodeParametersWindow != null ) + m_nodeParametersWindow.IsMaximized = m_nodeParametersWindowMaximized; + + if( m_paletteWindow != null ) + m_paletteWindow.IsMaximized = m_paletteWindowMaximized; + } + } + + void OnDestroy() + { + m_ctrlSCallback = false; + Destroy(); + } + + public override void OnDisable() + { + base.OnDisable(); + m_ctrlSCallback = false; + //EditorApplication.update -= UpdateTime; + EditorApplication.update -= UpdateNodePreviewListAndTime; + + EditorApplication.update -= IOUtils.UpdateIO; + + for( int i = 0; i < IOUtils.AllOpenedWindows.Count; i++ ) + { + if( IOUtils.AllOpenedWindows[ i ] != this ) + { + EditorApplication.update += IOUtils.UpdateIO; + break; + } + } + } + + void OnEmptyGraphDetected( ParentGraph graph ) + { + if( m_delayedLoadObject != null ) + { + LoadObject( m_delayedLoadObject ); + m_delayedLoadObject = null; + Repaint(); + } + else + { + if( !string.IsNullOrEmpty( Lastpath ) ) + { + Shader shader = AssetDatabase.LoadAssetAtPath( Lastpath ); + if( shader == null ) + { + Material material = AssetDatabase.LoadAssetAtPath( Lastpath ); + if( material != null ) + { + LoadDroppedObject( true, material.shader, material, null ); + } + else + { + AmplifyShaderFunction function = AssetDatabase.LoadAssetAtPath( Lastpath ); + if( function != null ) + { + LoadDroppedObject( true, null, null, function ); + } + } + } + else + { + LoadDroppedObject( true, shader, null, null ); + } + Repaint(); + } + } + } + + + public void ForceMaterialsToUpdate( ref Dictionary availableMaterials ) + { + m_forcingMaterialUpdateOp = true; + m_forcingMaterialUpdateFlag = true; + m_materialsToUpdate.Clear(); + foreach( KeyValuePair kvp in availableMaterials ) + { + Material material = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( kvp.Value ) ); + if( material != null ) + { + m_materialsToUpdate.Add( material ); + } + } + } + + public void SetOutdatedShaderFromTemplate() + { + m_outdatedShaderFromTemplateLoaded = true; + } + + public void ReplaceMasterNode( MasterNodeCategoriesData data, bool cacheMasterNodes ) + { + // save connection list before switching + m_savedList.Clear(); + int count = m_mainGraphInstance.CurrentMasterNode.InputPorts.Count; + for( int i = 0; i < count; i++ ) + { + if( m_mainGraphInstance.CurrentMasterNode.InputPorts[ i ].IsConnected ) + { + string name = m_mainGraphInstance.CurrentMasterNode.InputPorts[ i ].Name; + OutputPort op = m_mainGraphInstance.CurrentMasterNode.InputPorts[ i ].GetOutputConnection(); + if( !m_savedList.ContainsKey( name ) ) + { + m_savedList.Add( name, op ); + } + } + } + + m_replaceMasterNodeType = data.Category; + m_replaceMasterNode = true; + m_replaceMasterNodeData = data.Name; + m_replaceMasterNodeDataFromCache = cacheMasterNodes; + if( cacheMasterNodes ) + { + m_clipboard.AddMultiPassNodesToClipboard( m_mainGraphInstance.MultiPassMasterNodes.NodesList, true, -1 ); + for( int i = 0; i < m_mainGraphInstance.LodMultiPassMasternodes.Count; i++ ) + { + if( m_mainGraphInstance.LodMultiPassMasternodes[ i ].Count > 0 ) + m_clipboard.AddMultiPassNodesToClipboard( m_mainGraphInstance.LodMultiPassMasternodes[ i ].NodesList, false, i ); + } + } + } + + void CheckNodeReplacement() + { + if( m_replaceMasterNode ) + { + m_replaceMasterNode = false; + switch( m_replaceMasterNodeType ) + { + default: + case AvailableShaderTypes.SurfaceShader: + { + SetStandardShader(); + if( IOUtils.OnShaderTypeChangedEvent != null ) + { + IOUtils.OnShaderTypeChangedEvent( m_mainGraphInstance.CurrentShader, false, string.Empty ); + } + } + break; + case AvailableShaderTypes.Template: + { + + TemplateDataParent templateData = m_templatesManager.GetTemplate( m_replaceMasterNodeData ); + if( m_replaceMasterNodeDataFromCache ) + { + m_mainGraphInstance.CrossCheckTemplateNodes( templateData, m_mainGraphInstance.MultiPassMasterNodes.NodesList , -1 ); + for( int i = 0; i < m_mainGraphInstance.LodMultiPassMasternodes.Count; i++ ) + { + if( m_mainGraphInstance.LodMultiPassMasternodes[ i ].Count > 0 ) + m_mainGraphInstance.CrossCheckTemplateNodes( templateData, m_mainGraphInstance.LodMultiPassMasternodes[ i ].NodesList, i ); + } + + //Getting data from clipboard must be done after cross check all lists + m_clipboard.GetMultiPassNodesFromClipboard( m_mainGraphInstance.MultiPassMasterNodes.NodesList,-1 ); + for( int i = 0; i < m_mainGraphInstance.LodMultiPassMasternodes.Count; i++ ) + { + if( m_mainGraphInstance.LodMultiPassMasternodes[ i ].Count > 0 ) + m_clipboard.GetMultiPassNodesFromClipboard( m_mainGraphInstance.LodMultiPassMasternodes[i].NodesList, i ); + } + m_clipboard.ResetMultipassNodesData(); + } + else + { + SetTemplateShader( m_replaceMasterNodeData, false ); + } + + if( IOUtils.OnShaderTypeChangedEvent != null ) + { + IOUtils.OnShaderTypeChangedEvent( m_mainGraphInstance.CurrentShader, true, templateData.GUID ); + } + } + break; + } + } + else if( m_outdatedShaderFromTemplateLoaded ) + { + m_outdatedShaderFromTemplateLoaded = false; + TemplateMultiPassMasterNode masterNode = m_mainGraphInstance.CurrentMasterNode as TemplateMultiPassMasterNode; + if( masterNode != null ) + { + ReplaceMasterNode( masterNode.CurrentCategoriesData, true ); + } + } + + // restore possible connections by name + if( m_savedList.Count > 0 ) + { + foreach( var item in m_savedList ) + { + string name = item.Key; + OutputPort op = item.Value; + InputPort ip = m_mainGraphInstance.CurrentMasterNode.InputPorts.Find( x => x.Name == name ); + + if( op != null && ip != null && ip.Visible ) + { + var iNode = UIUtils.GetNode( ip.NodeId ); + var oNode = UIUtils.GetNode( op.NodeId ); + ip.ConnectTo( oNode.UniqueId, op.PortId, op.DataType, false ); + op.ConnectTo( iNode.UniqueId, ip.PortId, ip.DataType, ip.TypeLocked ); + + iNode.OnInputPortConnected( ip.PortId, oNode.UniqueId, op.PortId ); + oNode.OnOutputPortConnected( op.PortId, iNode.UniqueId, ip.PortId ); + } + } + } + m_savedList.Clear(); + } + + public Vector2 TranformPosition( Vector2 pos ) + { + return pos * m_cameraZoom - m_cameraOffset; + } + + public void UpdateTabTitle() + { + if( m_isShaderFunctionWindow ) + { + if( m_openedShaderFunction != null ) + { + this.titleContent.text = GenerateTabTitle( m_openedShaderFunction.FunctionName ); + } + } + else + { + if( m_selectionMode == ASESelectionMode.Material ) + { + this.titleContent.text = GenerateTabTitle( m_mainGraphInstance.CurrentMaterial.name ); + } + else + { + this.titleContent.text = GenerateTabTitle( m_mainGraphInstance.CurrentShader.name ); + } + } + } + + public ParentGraph CustomGraph + { + get { return m_customGraph; } + set { m_customGraph = value; } + } + + public ParentGraph CurrentGraph + { + get + { + if( m_customGraph != null ) + return m_customGraph; + + return m_mainGraphInstance; + } + } + + public void RefreshAvaibleNodes() + { + if( m_contextMenu != null && m_mainGraphInstance != null ) + { + m_contextMenu.RefreshNodes( m_mainGraphInstance ); + m_paletteWindow.ForceUpdate = true; + m_contextPalette.ForceUpdate = true; + m_refreshAvailableNodes = false; + } + } + + public void LateRefreshAvailableNodes() + { + m_refreshAvailableNodes = true; + } + + public ParentGraph OutsideGraph { get { return m_mainGraphInstance; } } + + public bool ShaderIsModified + { + get { return m_shaderIsModified; } + set + { + m_shaderIsModified = value && UIUtils.DirtyMask; + + m_toolsWindow.SetStateOnButton( ToolButtonType.Save, m_shaderIsModified ? 1 : 0 ); + if( !IsShaderFunctionWindow ) + { + MasterNode masterNode = m_mainGraphInstance.CurrentMasterNode; + if( masterNode != null && masterNode.CurrentShader != null ) + { + m_toolsWindow.SetStateOnButton( ToolButtonType.Update, ShaderIsModified ? 0 : 2, ShaderIsModified ? ShaderIsModifiedMessage : ShaderIsNotModified ); + UpdateTabTitle( masterNode.ShaderName, m_shaderIsModified ); + } + else + { + m_toolsWindow.SetStateOnButton( ToolButtonType.Update, 1 ); + } + + //if( m_mainGraphInstance.CurrentStandardSurface != null ) + // UpdateTabTitle( m_mainGraphInstance.CurrentStandardSurface.ShaderName, m_shaderIsModified ); + } + else + { + m_toolsWindow.SetStateOnButton( ToolButtonType.Update, m_shaderIsModified ? 0 : 2 ); + if( m_mainGraphInstance.CurrentShaderFunction != null ) + UpdateTabTitle( m_mainGraphInstance.CurrentShaderFunction.FunctionName, m_shaderIsModified ); + } + + } + } + public void MarkToRepaint() { m_repaintIsDirty = true; } + public void RequestSave() { m_markedToSave = true; } + public void RequestRepaint() { m_repaintIsDirty = true; } + public OptionsWindow Options { get { return m_optionsWindow; } } + public GraphContextMenu ContextMenuInstance { get { return m_contextMenu; } set { m_contextMenu = value; } } + public ShortcutsManager ShortcutManagerInstance { get { return m_shortcutManager; } } + + public bool GlobalPreview + { + get { return m_globalPreview; } + set { m_globalPreview = value; } + } + + public bool GlobalShowInternalData + { + get { return m_globalShowInternalData; } + set { m_globalShowInternalData = value; } + } + + public double EditorTime + { + get { return m_time; } + set { m_time = value; } + } + + public ASESelectionMode CurrentSelection + { + get { return m_selectionMode; } + set + { + m_selectionMode = value; + switch( m_selectionMode ) + { + default: + case ASESelectionMode.Shader: + { + m_toolsWindow.BorderStyle = UIUtils.GetCustomStyle( CustomStyle.ShaderBorder ); + } + break; + case ASESelectionMode.Material: + { + m_toolsWindow.BorderStyle = UIUtils.GetCustomStyle( CustomStyle.MaterialBorder ); + } + break; + case ASESelectionMode.ShaderFunction: + { + m_toolsWindow.BorderStyle = UIUtils.GetCustomStyle( CustomStyle.ShaderFunctionBorder ); + } + break; + } + } + } + + public bool LiveShaderEditing + { + get { return m_liveShaderEditing; } + set + { + m_liveShaderEditing = value; + m_innerEditorVariables.LiveMode = m_liveShaderEditing; + UpdateLiveUI(); + } + } + + public NodeAvailability CurrentNodeAvailability + { + get { return m_currentNodeAvailability; } + set + { + NodeAvailability cache = m_currentNodeAvailability; + m_currentNodeAvailability = value; + + if( cache != value ) + RefreshAvaibleNodes(); + } + } + public string GUID + { + get + { + if( m_isShaderFunctionWindow ) + { + return m_openedShaderFunction != null ? AssetDatabase.AssetPathToGUID( AssetDatabase.GetAssetPath( m_openedShaderFunction ) ) : string.Empty; + } + else + { + return m_mainGraphInstance.CurrentShader != null ? AssetDatabase.AssetPathToGUID( AssetDatabase.GetAssetPath( m_mainGraphInstance.CurrentShader ) ) : string.Empty; + } + } + } + public List Messages { get { return m_messages; } set { m_messages = value; } } + public float MaxMsgWidth { get { return m_maxMsgWidth; } set { m_maxMsgWidth = value; } } + public bool MaximizeMessages { get { return m_maximizeMessages; } set { m_maximizeMessages = value; } } + public void InvalidateAlt() { m_altAvailable = false; } + public PaletteWindow CurrentPaletteWindow { get { return m_paletteWindow; } } + public PreMadeShaders PreMadeShadersInstance { get { return m_preMadeShaders; } } + public Rect CameraInfo { get { return m_cameraInfo; } } + public Vector2 TranformedMousePos { get { return m_currentMousePos2D * m_cameraZoom - m_cameraOffset; } } + public Vector2 TranformedKeyEvtMousePos { get { return m_keyEvtMousePos2D * m_cameraZoom - m_cameraOffset; } } + public PalettePopUp PalettePopUpInstance { get { return m_palettePopup; } } + public DuplicatePreventionBuffer DuplicatePrevBufferInstance { get { return m_duplicatePreventionBuffer; } } + public NodeParametersWindow ParametersWindow { get { return m_nodeParametersWindow; } } + public NodeExporterUtils CurrentNodeExporterUtils { get { return m_nodeExporterUtils; } } + public AmplifyShaderFunction OpenedShaderFunction { get { return m_openedShaderFunction; } } + public DrawInfo CameraDrawInfo { get { return m_drawInfo; } } + public string Lastpath { get { return m_lastpath; } set { m_lastpath = value; } } + public string LastOpenedLocation { get { return m_lastOpenedLocation; } set { m_lastOpenedLocation = value; } } + public float AvailableCanvasWidth { get { return ( m_cameraInfo.width - m_paletteWindow.RealWidth - m_nodeParametersWindow.RealWidth ); } } + public float AvailableCanvasHeight { get { return ( m_cameraInfo.height ); } } + public float CameraZoom { get { return m_cameraZoom; } set { m_cameraZoom = value; m_zoomChanged = true; } } + public int GraphCount { get { return m_graphCount; } set { m_graphCount = value; } } + public bool ForceAutoPanDir { get { return m_forceAutoPanDir; } set { m_forceAutoPanDir = value; } } + public bool OpenedAssetFromNode { get { return m_openedAssetFromNode; } set { m_openedAssetFromNode = value; } } + public bool IsShaderFunctionWindow { get { return m_isShaderFunctionWindow; } set { m_isShaderFunctionWindow = value; } } + public bool NodesLoadedCorrectly { get { return m_nodesLoadedCorrectly; } set { m_nodesLoadedCorrectly = value; } } + public double CurrentInactiveTime { get { return m_currentInactiveTime; } } + public string ReplaceMasterNodeData { get { return m_replaceMasterNodeData; } } + public AvailableShaderTypes ReplaceMasterNodeType { get { return m_replaceMasterNodeType; } } + public NodeWireReferencesUtils WireReferenceUtils { get { return m_wireReferenceUtils; } } + public ContextPalette WindowContextPallete { get { return m_contextPalette; } } + // This needs to go to UIUtils + public Texture2D WireTexture { get { return m_wireTexture; } } + public Event CurrentEvent { get { return m_currentEvent; } } + public string CurrentCommandName { get { return m_currentCommandName; } } + public InnerWindowEditorVariables InnerWindowVariables { get { return m_innerEditorVariables; } } + public TemplatesManager TemplatesManagerInstance { get { return m_templatesManager; } } + public Material CurrentMaterial { get { return CurrentGraph.CurrentMaterial; } } + public Clipboard ClipboardInstance { get { return m_clipboard; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/AmplifyShaderEditorWindow.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/AmplifyShaderEditorWindow.cs.meta new file mode 100644 index 0000000..6ce8e71 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/AmplifyShaderEditorWindow.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c8bcac0d66f920e49803925a85beb0ed +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/AmplifyShaderFunction.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/AmplifyShaderFunction.cs new file mode 100644 index 0000000..df83bed --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/AmplifyShaderFunction.cs @@ -0,0 +1,189 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; +using System.Collections.Generic; +using AmplifyShaderEditor; + +[Serializable] +public class AmplifyShaderFunction : ScriptableObject +{ + [SerializeField] + private string m_functionInfo = string.Empty; + public string FunctionInfo + { + get { return m_functionInfo; } + set { m_functionInfo = value; } + } + + [SerializeField] + private string m_functionName = string.Empty; + public string FunctionName + { + get { if( m_functionName.Length == 0 ) return name; else return m_functionName; } + set { m_functionName = value; } + } + + [SerializeField] + [TextArea( 5, 15 )] + private string m_description = string.Empty; + public string Description + { + get { return m_description; } + set { m_description = value; } + } + + [SerializeField] + private AdditionalIncludesHelper m_additionalIncludes = new AdditionalIncludesHelper(); + //public AdditionalIncludesHelper AdditionalIncludes + //{ + // get { return m_additionalIncludes; } + // set { m_additionalIncludes = value; } + //} + + [SerializeField] + private AdditionalPragmasHelper m_additionalPragmas = new AdditionalPragmasHelper(); + //public AdditionalPragmasHelper AdditionalPragmas + //{ + // get { return m_additionalPragmas; } + // set { m_additionalPragmas = value; } + //} + + [SerializeField] + private TemplateAdditionalDirectivesHelper m_additionalDirectives = new TemplateAdditionalDirectivesHelper( " Additional Directives" ); + public TemplateAdditionalDirectivesHelper AdditionalDirectives + { + get { return m_additionalDirectives; } + set { m_additionalDirectives = value; } + } + + [SerializeField] + private FunctionNodeCategories m_nodeCategory = FunctionNodeCategories.Functions; + public FunctionNodeCategories NodeCategory + { + get { return m_nodeCategory; } + set { m_nodeCategory = value; } + } + + [SerializeField] + private string m_customNodeCategory = string.Empty; + public string CustomNodeCategory + { + get + { + if( m_nodeCategory == FunctionNodeCategories.Custom ) + { + if( string.IsNullOrEmpty( m_customNodeCategory ) ) + return "Functions"; + else + return m_customNodeCategory; + } + else + { + return UIUtils.CategoryPresets[ (int)m_nodeCategory ]; + //return new SerializedObject( this ).FindProperty( "m_nodeCategory" ).enumDisplayNames[ (int)m_nodeCategory ]; + } + } + } + + [SerializeField] + private PreviewLocation m_previewPosition = PreviewLocation.Auto; + public PreviewLocation PreviewPosition + { + get { return m_previewPosition; } + set { m_previewPosition = value; } + } + + [SerializeField] + private bool m_hidden = false; + public bool Hidden + { + get { return m_hidden; } + set { m_hidden = value; } + } + + public void UpdateDirectivesList() + { + m_additionalDirectives.CleanNullDirectives(); + m_additionalDirectives.UpdateDirectivesFromSaveItems(); + + if( m_additionalIncludes.IncludeList.Count > 0 ) + { + m_additionalDirectives.AddItems( AdditionalLineType.Include, m_additionalIncludes.IncludeList ); + m_additionalIncludes.IncludeList.Clear(); + } + + if( m_additionalPragmas.PragmaList.Count > 0 ) + { + m_additionalDirectives.AddItems( AdditionalLineType.Pragma, m_additionalPragmas.PragmaList ); + m_additionalPragmas.PragmaList.Clear(); + } + } + + public void ResetDirectivesOrigin() + { + //if( UIUtils.CurrentShaderVersion() < 16807 ) + // Although the correct version was 1.6.7 rev 07 this issue was only detected on v1.7.1. rev 00 + // So to avoid potential incorrect saves over shader functions, I decided to broaden up the version range + if( UIUtils.CurrentShaderVersion() < 17101 ) + { + m_additionalDirectives.ResetDirectivesOrigin(); + } + } +} + +public class ShaderFunctionDetector : AssetPostprocessor +{ + static void OnPostprocessAllAssets( string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths ) + { + if( UIUtils.CurrentWindow == null ) + return; + + bool markForRefresh = false; + AmplifyShaderFunction function = null; + for( int i = 0; i < importedAssets.Length; i++ ) + { + function = AssetDatabase.LoadAssetAtPath( importedAssets[ i ] ); + if( function != null ) + { + markForRefresh = true; + break; + } + } + + if( deletedAssets.Length > 0 ) + markForRefresh = true; + + for( int i = 0; i < movedAssets.Length; i++ ) + { + function = AssetDatabase.LoadAssetAtPath( movedAssets[ i ] ); + if( function != null ) + { + markForRefresh = true; + break; + } + } + + for( int i = 0; i < movedFromAssetPaths.Length; i++ ) + { + function = AssetDatabase.LoadAssetAtPath( movedFromAssetPaths[ i ] ); + if( function != null ) + { + markForRefresh = true; + break; + } + } + + if( markForRefresh ) + { + markForRefresh = false; + if( function != null ) + { + IOUtils.UpdateSFandRefreshWindows( function ); + } + UIUtils.CurrentWindow.LateRefreshAvailableNodes(); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/AmplifyShaderFunction.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/AmplifyShaderFunction.cs.meta new file mode 100644 index 0000000..35a9310 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/AmplifyShaderFunction.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 78b2425a2284af743826c689403a4924 +timeCreated: 1492703397 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: 50be8291f9514914aa55c66c49da67cf, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/AmplifyShaderFunctionEditor.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/AmplifyShaderFunctionEditor.cs new file mode 100644 index 0000000..010294d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/AmplifyShaderFunctionEditor.cs @@ -0,0 +1,168 @@ +using UnityEngine; +using UnityEditor; +using System; +using System.Text.RegularExpressions; +using System.IO; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + [CustomEditor( typeof( AmplifyShaderFunction ) )] + public class AmplifyShaderFunctionEditor : Editor + { + class FunctionDependency + { + public string AssetName; + public string AssetPath; + public FunctionDependency(string name, string path) + { + AssetName = name; + AssetPath = path; + } + } + + AmplifyShaderFunction m_target; + List m_dependencies = new List(); + + void OnEnable() + { + m_target = ( target as AmplifyShaderFunction ); + } + + public override void OnInspectorGUI() + { + //base.OnInspectorGUI(); + //base.serializedObject.Update(); + if( GUILayout.Button( "Open in Shader Editor" ) ) + { +#if UNITY_2018_3_OR_NEWER + ASEPackageManagerHelper.SetupLateShaderFunction( m_target ); +#else + AmplifyShaderEditorWindow.LoadShaderFunctionToASE( m_target, false ); +#endif + } + //EditorGUILayout.Separator(); + //m_target.FunctionInfo = EditorGUILayout.TextArea( m_target.FunctionInfo ); + + if( m_target.Description.Length > 0 ) + { + EditorGUILayout.HelpBox( m_target.Description, MessageType.Info ); + } + + EditorGUILayout.Space(); + if( GUILayout.Button( "Search Direct Dependencies" ) ) + { + m_dependencies.Clear(); + string guid = AssetDatabase.AssetPathToGUID( AssetDatabase.GetAssetPath( m_target ) ); + + string[] allSFs = AssetDatabase.FindAssets( "t:AmplifyShaderFunction", null ); + foreach( string guid1 in allSFs ) + { + string sfPath = AssetDatabase.GUIDToAssetPath( guid1 ); + bool found = SearchForGUID( guid, sfPath ); + if( found ) + { + //string n = Regex.Replace( sfPath, @"(\.\w+|[\w\d\/]+\/)", "" ); + string n = Regex.Replace( sfPath, @"[\w\d\/]+\/", "" ); + m_dependencies.Add(new FunctionDependency( n, sfPath ) ); + } + } + + string[] allSHs = AssetDatabase.FindAssets( "t:Shader", null ); + foreach( string guid1 in allSHs ) + { + string shPath = AssetDatabase.GUIDToAssetPath( guid1 ); + bool found = SearchForGUID( guid, shPath ); + if( found ) + { + string n = Regex.Replace( shPath, @"[\w\d\/]+\/", "" ); + m_dependencies.Add( new FunctionDependency( n, shPath ) ); + } + } + } + EditorGUILayout.Space(); + for( int i = 0; i < m_dependencies.Count; i++ ) + { + EditorGUILayout.BeginHorizontal(); + if( GUILayout.Button( m_dependencies[ i ].AssetName, "minibuttonleft" ) ) + { + SelectAtPath( m_dependencies[ i ].AssetPath ); + } + if( GUILayout.Button( "edit", "minibuttonright", GUILayout.Width(100) ) ) + { + if( m_dependencies[ i ].AssetName.EndsWith( ".asset" ) ) + { + var obj = AssetDatabase.LoadAssetAtPath( m_dependencies[ i ].AssetPath ); + AmplifyShaderEditorWindow.LoadShaderFunctionToASE( obj, false ); + } + else + { + var obj = AssetDatabase.LoadAssetAtPath( m_dependencies[ i ].AssetPath ); + AmplifyShaderEditorWindow.ConvertShaderToASE( obj ); + } + } + EditorGUILayout.EndHorizontal(); + } + + if( m_dependencies.Count > 0 ) + { + List assetPaths = new List(); + for( int i = 0; i < m_dependencies.Count; i++ ) + { + assetPaths.Add( m_dependencies[ i ].AssetPath ); + } + + if( GUILayout.Button( "Open and Save All" ) ) + { + bool doit = EditorUtility.DisplayDialog( "Open and Save All", "This will try to open all shader function and shaders that use this shader function and save them in quick succession, this may irreversibly break your files if something goes wrong. Are you sure you want to try?", "Yes, I'll take the risk", "No, I'll do it myself" ); + if( doit ) + AmplifyShaderEditorWindow.LoadAndSaveList( assetPaths.ToArray() ); + } + } + } + + public void SelectAtPath( string path ) + { + var obj = AssetDatabase.LoadAssetAtPath( path ); + EditorGUIUtility.PingObject( obj ); + } + + public static bool SearchForGUID( string guid, string pathName ) + { + bool result = false; + int count = 0; + if( !string.IsNullOrEmpty( pathName ) && File.Exists( pathName ) ) + { + StreamReader fileReader = null; + try + { + fileReader = new StreamReader( pathName ); + + string line; + int index = -1; + while( ( line = fileReader.ReadLine() ) != null ) + { + index = line.IndexOf( guid ); + count++; + + if( index > -1 ) + { + result = true; + break; + } + } + } + catch( Exception e ) + { + Debug.LogException( e ); + } + finally + { + if( fileReader != null ) + fileReader.Close(); + } + } + return result; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/AmplifyShaderFunctionEditor.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/AmplifyShaderFunctionEditor.cs.meta new file mode 100644 index 0000000..99b80bb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/AmplifyShaderFunctionEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8b2d6d1320661374db53aeb8057312b2 +timeCreated: 1491909065 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/AutoPanData.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/AutoPanData.cs new file mode 100644 index 0000000..9f028f3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/AutoPanData.cs @@ -0,0 +1,94 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; + +namespace AmplifyShaderEditor +{ + public enum AutoPanLocation + { + TOP = 0, + BOTTOM, + LEFT, + RIGHT + } + + public class AutoPanData + { + private Rect m_area; + private float m_size; + private Vector2 m_velocity; + + private GUIStyle m_style; + private Color m_color = new Color( 1f, 0f, 0f, 0.5f ); + + private AutoPanLocation m_location; + private float m_adjustWidth = 0; + private float m_adjustInitialX = 0; + + public AutoPanData( AutoPanLocation location, float size, Vector2 vel ) + { + m_area = new Rect(); + m_size = size; + m_velocity = vel; + m_location = location; + } + + public bool CheckArea( Vector2 mousePosition, Rect window, bool draw ) + { + float totalSize = m_size + m_adjustWidth; + switch ( m_location ) + { + case AutoPanLocation.TOP: + { + m_area.x = m_adjustInitialX; + m_area.y = 0; + m_area.width = window.width; + m_area.height = totalSize; + } + break; + case AutoPanLocation.BOTTOM: + { + m_area.x = m_adjustInitialX; + m_area.y = window.height - totalSize; + m_area.width = window.width; + m_area.height = totalSize; + } + break; + case AutoPanLocation.LEFT: + { + m_area.x = m_adjustInitialX; + m_area.y = 0; + m_area.width = totalSize; + m_area.height = window.height; + } + break; + case AutoPanLocation.RIGHT: + { + m_area.x = m_adjustInitialX + window.width - totalSize; + m_area.y = 0; + m_area.width = totalSize; + m_area.height = window.height; + } + break; + } + + if ( draw ) + { + if ( m_style == null ) + { + m_style = UIUtils.Box; + } + Color bufferedColor = GUI.color; + GUI.color = m_color; + GUI.Label( m_area, string.Empty, m_style ); + GUI.color = bufferedColor; + } + return m_area.Contains( mousePosition ); + } + + public float AdjustWidth { set { m_adjustWidth = value; } } + public float AdjustInitialX { set { m_adjustInitialX = value; } } + public Vector2 Velocity { get { return m_velocity; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/AutoPanData.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/AutoPanData.cs.meta new file mode 100644 index 0000000..17e6b86 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/AutoPanData.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 711db07e8265cb740940568c4bc7345f +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Clipboard.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Clipboard.cs new file mode 100644 index 0000000..1b4d4fa --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Clipboard.cs @@ -0,0 +1,262 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +using System; +using UnityEngine; +using System.Collections.Generic; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + + public class ClipboardData + { + public string Data = string.Empty; + public string Connections = string.Empty; + public int OldNodeId = -1; + public int NewNodeId = -1; + + public ClipboardData( string data, string connections, int oldNodeId ) + { + Data = data; + Connections = connections; + OldNodeId = oldNodeId; + } + + public override string ToString() + { + return Data + IOUtils.CLIPBOARD_DATA_SEPARATOR + Connections + IOUtils.CLIPBOARD_DATA_SEPARATOR + OldNodeId + IOUtils.CLIPBOARD_DATA_SEPARATOR + NewNodeId; + } + } + + public class Clipboard + { + public const string ClipboardId = "AMPLIFY_CLIPBOARD_ID"; + private readonly string[] ClipboardTagId = { "#CLIP_ITEM#" }; + private List m_clipboardStrData; + private Dictionary m_clipboardAuxData; + private Dictionary m_multiPassMasterNodeData; + + public Clipboard() + { + m_clipboardStrData = new List(); + m_clipboardAuxData = new Dictionary(); + m_multiPassMasterNodeData = new Dictionary(); + } + + public void ResetMultipassNodesData() + { + m_multiPassMasterNodeData.Clear(); + } + + public void AddMultiPassNodesToClipboard( List masterNodes, bool resetList, int lodId ) + { + if( resetList ) + m_multiPassMasterNodeData.Clear(); + + int templatesAmount = masterNodes.Count; + for( int i = 0; i < templatesAmount; i++ ) + { + if( !masterNodes[ i ].InvalidNode ) + { + string data = string.Empty; + string connection = string.Empty; + System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture; + masterNodes[ i ].FullWriteToString( ref data, ref connection ); + System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture; + ClipboardData clipboardData = new ClipboardData( data, connection, masterNodes[ i ].UniqueId ); + m_multiPassMasterNodeData.Add( masterNodes[ i ].PassUniqueName + lodId, clipboardData ); + } + } + } + + public void GetMultiPassNodesFromClipboard( List masterNodes, int lodId ) + { + int templatesAmount = masterNodes.Count; + for( int i = 0; i < templatesAmount; i++ ) + { + string clipboardDataId = masterNodes[ i ].PassUniqueName + lodId; + if( m_multiPassMasterNodeData.ContainsKey( clipboardDataId ) ) + { + ClipboardData nodeData = m_multiPassMasterNodeData[ clipboardDataId ]; + string[] nodeParams = nodeData.Data.Split( IOUtils.FIELD_SEPARATOR ); + System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture; + masterNodes[ i ].FullReadFromString( ref nodeParams ); + System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture; + } + } + + for( int i = 0; i < templatesAmount; i++ ) + { + string clipboardDataId = masterNodes[ i ].PassUniqueName + lodId; + if( m_multiPassMasterNodeData.ContainsKey( clipboardDataId ) ) + { + masterNodes[ i ].SetReadOptions(); + masterNodes[ i ].ForceOptionsRefresh(); + } + } + + } + + public void AddToClipboard( List selectedNodes , Vector3 initialPosition, ParentGraph graph ) + { + //m_clipboardStrData.Clear(); + //m_clipboardAuxData.Clear(); + + string clipboardData = IOUtils.Vector3ToString( initialPosition ) + ClipboardTagId[ 0 ]; + int masterNodeId = UIUtils.CurrentWindow.CurrentGraph.CurrentMasterNodeId; + int count = selectedNodes.Count; + for ( int i = 0; i < count; i++ ) + { + if ( UIUtils.CurrentWindow.IsShaderFunctionWindow || !graph.IsMasterNode( selectedNodes[ i ] )) + { + string nodeData = string.Empty; + string connections = string.Empty; + selectedNodes[ i ].ClipboardFullWriteToString( ref nodeData, ref connections ); + clipboardData += nodeData; + if ( !string.IsNullOrEmpty( connections ) ) + { + connections = connections.Substring( 0, connections.Length - 1 ); + clipboardData += "\n" + connections; + } + if ( i < count - 1 ) + clipboardData += ClipboardTagId[ 0 ]; + + //ClipboardData data = new ClipboardData( nodeData, connections, selectedNodes[ i ].UniqueId ); + //m_clipboardStrData.Add( data ); + //m_clipboardAuxData.Add( selectedNodes[ i ].UniqueId, data ); + } + } + + if ( !string.IsNullOrEmpty( clipboardData ) ) + { + EditorPrefs.SetString( ClipboardId, clipboardData ); + } + //for ( int i = 0; i < selectedNodes.Count; i++ ) + //{ + // if ( selectedNodes[ i ].UniqueId != masterNodeId ) + // { + // WireNode wireNode = selectedNodes[ i ] as WireNode; + // if ( wireNode != null ) + // { + // if ( !IsNodeChainValid( selectedNodes[ i ], true ) || !IsNodeChainValid( selectedNodes[ i ], false ) ) + // { + // UnityEngine.Debug.Log( "found invalid wire port" ); + // } + // } + // } + //} + } + + public Vector3 GetDataFromEditorPrefs() + { + Vector3 initialPos = Vector3.zero; + m_clipboardStrData.Clear(); + m_clipboardAuxData.Clear(); + string clipboardData = EditorPrefs.GetString( ClipboardId, string.Empty ); + if ( !string.IsNullOrEmpty( clipboardData ) ) + { + string[] clipboardDataArray = clipboardData.Split( ClipboardTagId, StringSplitOptions.None ); + initialPos = IOUtils.StringToVector3( clipboardDataArray[0] ); + for ( int i = 1; i < clipboardDataArray.Length; i++ ) + { + if ( !string.IsNullOrEmpty( clipboardDataArray[ i ] ) ) + { + int wiresIndex = clipboardDataArray[ i ].IndexOf( IOUtils.LINE_TERMINATOR ); + string nodeData = string.Empty; + string connections = string.Empty; + if ( wiresIndex < 0 ) + { + nodeData = clipboardDataArray[ i ]; + } + else + { + nodeData = clipboardDataArray[ i ].Substring( 0, wiresIndex ); + connections = clipboardDataArray[ i ].Substring( wiresIndex + 1 ); + } + string[] nodeDataArr = nodeData.Split( IOUtils.FIELD_SEPARATOR ); + if ( nodeDataArr.Length > 2 ) + { + int nodeId = Convert.ToInt32( nodeDataArr[ 2 ] ); + ClipboardData data = new ClipboardData( nodeData, connections, nodeId ); + m_clipboardStrData.Add( data ); + m_clipboardAuxData.Add( nodeId, data ); + } + + } + } + } + return initialPos; + } + + public bool IsNodeChainValid( ParentNode currentNode, bool forward ) + { + WireNode wireNode = currentNode as WireNode; + if ( wireNode == null ) + { + return m_clipboardAuxData.ContainsKey( currentNode.UniqueId ); + } + + if ( forward ) + { + if ( wireNode.InputPorts[ 0 ].ExternalReferences.Count > 0 ) + { + int nodeId = wireNode.InputPorts[ 0 ].ExternalReferences[ 0 ].NodeId; + if ( m_clipboardAuxData.ContainsKey( nodeId ) ) + { + return IsNodeChainValid( UIUtils.GetNode( nodeId ), forward ); + } + } + } + else + { + int nodeId = wireNode.OutputPorts[ 0 ].ExternalReferences[ 0 ].NodeId; + if ( m_clipboardAuxData.ContainsKey( nodeId ) ) + { + return IsNodeChainValid( UIUtils.GetNode( nodeId ), forward ); + } + } + return false; + } + + public void GenerateFullString() + { + string data = string.Empty; + for ( int i = 0; i < m_clipboardStrData.Count; i++ ) + { + data += m_clipboardStrData[ i ].ToString(); + if ( i < m_clipboardStrData.Count - 1 ) + { + data += IOUtils.LINE_TERMINATOR; + } + } + } + + public void ClearClipboard() + { + m_clipboardStrData.Clear(); + m_clipboardAuxData.Clear(); + m_multiPassMasterNodeData.Clear(); + } + + public ClipboardData GetClipboardData( int oldNodeId ) + { + if ( m_clipboardAuxData.ContainsKey( oldNodeId ) ) + return m_clipboardAuxData[ oldNodeId ]; + return null; + } + + public int GeNewNodeId( int oldNodeId ) + { + if ( m_clipboardAuxData.ContainsKey( oldNodeId ) ) + return m_clipboardAuxData[ oldNodeId ].NewNodeId; + return -1; + } + + public List CurrentClipboardStrData + { + get { return m_clipboardStrData; } + } + + public bool HasCachedMasterNodes { get { return m_multiPassMasterNodeData.Count > 0; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Clipboard.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Clipboard.cs.meta new file mode 100644 index 0000000..3e4b657 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Clipboard.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8850a8c4f3ca99f42bbf602c671ffb7f +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ConfirmationWindow.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ConfirmationWindow.cs new file mode 100644 index 0000000..896c432 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ConfirmationWindow.cs @@ -0,0 +1,120 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEditor; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + public class ConfirmationWindow + { + public delegate ShaderLoadResult OnConfirmationSelected( bool value, Shader shader, Material material ); + public event OnConfirmationSelected OnConfirmationSelectedEvt; + + private const string m_yesStr = "Yes"; + private const string m_noStr = "No"; + private bool m_isActive = false; + private string m_currentMessage; + + private GUIStyle m_areaStyle; + private GUIContent m_content; + private GUIStyle m_buttonStyle; + private GUIStyle m_labelStyle; + + + private Shader m_shader; + private Material m_material; + private Rect m_area; + private bool m_autoDeactivate = true; + + + public ConfirmationWindow( float x, float y, float width, float height ) + { + m_content = new GUIContent( GUIContent.none ); + m_area = new Rect( x, y, width, height ); + } + + public void Destroy() + { + m_shader = null; + OnConfirmationSelectedEvt = null; + } + + public void ActivateConfirmation( Shader shader, Material material, string message, OnConfirmationSelected evt, bool autoDeactivate = true ) + { + OnConfirmationSelectedEvt = evt; + m_currentMessage = message; + m_shader = shader; + m_material = material; + m_autoDeactivate = autoDeactivate; + m_isActive = true; + } + + public void OnGUI() + { + if ( m_areaStyle == null ) + { + m_areaStyle = new GUIStyle( UIUtils.TextArea ); + m_areaStyle.stretchHeight = true; + m_areaStyle.stretchWidth = true; + m_areaStyle.fontSize = ( int ) Constants.DefaultTitleFontSize; + } + + if ( m_buttonStyle == null ) + { + m_buttonStyle = UIUtils.Button; + } + + if ( m_labelStyle == null ) + { + m_labelStyle = new GUIStyle( UIUtils.Label ); + m_labelStyle.alignment = TextAnchor.MiddleCenter; + m_labelStyle.wordWrap = true; + } + + m_area.x = ( int ) ( 0.5f * UIUtils.CurrentWindow.CameraInfo.width ); + m_area.y = ( int ) ( 0.5f * UIUtils.CurrentWindow.CameraInfo.height ); + + GUILayout.BeginArea( m_area, m_content, m_areaStyle ); + { + EditorGUILayout.BeginVertical(); + { + EditorGUILayout.Separator(); + EditorGUILayout.LabelField( m_currentMessage, m_labelStyle ); + + EditorGUILayout.Separator(); + EditorGUILayout.Separator(); + EditorGUILayout.BeginHorizontal(); + { + if ( GUILayout.Button( m_yesStr, m_buttonStyle ) ) + { + if ( OnConfirmationSelectedEvt != null ) + OnConfirmationSelectedEvt( true, m_shader, m_material ); + + if ( m_autoDeactivate ) + Deactivate(); + } + + if ( GUILayout.Button( m_noStr, m_buttonStyle ) ) + { + if ( OnConfirmationSelectedEvt != null ) + OnConfirmationSelectedEvt( false, m_shader, m_material ); + if ( m_autoDeactivate ) + Deactivate(); + } + } + EditorGUILayout.EndHorizontal(); + } + EditorGUILayout.EndVertical(); + } + GUILayout.EndArea(); + } + + public void Deactivate() + { + m_isActive = false; + OnConfirmationSelectedEvt = null; + } + public bool IsActive { get { return m_isActive; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ConfirmationWindow.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ConfirmationWindow.cs.meta new file mode 100644 index 0000000..7770352 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ConfirmationWindow.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 291cb40a04f835a4d89037cf3053c6a3 +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ConsoleLogWindow.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ConsoleLogWindow.cs new file mode 100644 index 0000000..191d18d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ConsoleLogWindow.cs @@ -0,0 +1,309 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [System.Serializable] + public class Toast + { + public MessageSeverity ItemType; + public string ItemMessage; + public double ItemTime; + public int ItemOwnerId; + public Toast( MessageSeverity itemType, string itemMessage, double itemTime,int itemOwnerId ) + { + ItemType = itemType; + ItemMessage = itemMessage; + ItemTime = itemTime; + ItemOwnerId = itemOwnerId; + } + } + + public class ConsoleLogWindow + { + public const int MAXWIDTH = 400; + public const float FADETIME = 7; + + private readonly GUIContent m_boxToggleContent = new GUIContent( "\u2261", "Toggle Message Box" ); + private readonly GUIContent m_clearContent = new GUIContent( "\u00D7", "Clear Messages" ); + + protected AmplifyShaderEditorWindow m_parentWindow = null; + + // needs to be serialized + private Vector2 m_currentScrollPos; + + int lastCall = -1; + + public ConsoleLogWindow( AmplifyShaderEditorWindow parentWindow ) + { + m_parentWindow = parentWindow; + } + + public void AddMessage( MessageSeverity itemType, string itemMessage , int itemOwnerId ) + { + var toast = new Toast( itemType, itemMessage, Time.realtimeSinceStartup, itemOwnerId ); + m_parentWindow.Messages.Insert( 0, toast ); + m_currentScrollPos.y = Mathf.Infinity; + + if( !m_parentWindow.MaximizeMessages ) + lastCall = Mathf.Max( (int)itemType, lastCall ); + + GUIContent gc = new GUIContent( m_parentWindow.Messages.Count + ": " + itemMessage ); + float maxWidth = m_parentWindow.MaxMsgWidth; + maxWidth = Mathf.Max( GUIStyle.none.CalcSize( gc ).x + 16, maxWidth ); + maxWidth = Mathf.Min( maxWidth, MAXWIDTH ); + m_parentWindow.MaxMsgWidth = maxWidth; + } + + public void Draw( Rect parentPosition, Vector2 mousePosition, int mouseButtonId, bool hasKeyboadFocus, float rightSide ) + { + EventType currentEventType = Event.current.type; + var messages = m_parentWindow.Messages; + var maximize = m_parentWindow.MaximizeMessages; + + Rect button = parentPosition; + button.width = 22; + button.height = 22; + button.x = parentPosition.x + parentPosition.width - button.width - rightSide - 8; + button.y = parentPosition.y + parentPosition.height - button.height - ( m_parentWindow.CurrentSelection == ASESelectionMode.Material ? 52 : 8 ); + + Rect toolbarArea = button; + toolbarArea.y -= 5; + if( maximize ) + { + toolbarArea.xMin -= m_parentWindow.MaxMsgWidth; + toolbarArea.yMin -= 66; + } + toolbarArea.x -= 6; + + bool needsRepaint = false; + if( maximize ) + { + GUIStyle labelStyle = UIUtils.ConsoleLogLabel; + toolbarArea.y -= 16 + 8; + GUILayout.BeginArea( toolbarArea, UIUtils.ConsoleLogMessage ); + EditorGUILayout.BeginVertical(); + m_currentScrollPos = EditorGUILayout.BeginScrollView( m_currentScrollPos ); + { + int count = messages.Count; + for( int i = count - 1; i >= 0; i-- ) + { + switch( messages[ i ].ItemType ) + { + case MessageSeverity.Error: + labelStyle.normal.textColor = Color.red; + break; + case MessageSeverity.Warning: + labelStyle.normal.textColor = Color.yellow; + break; + default: + case MessageSeverity.Normal: + labelStyle.normal.textColor = Color.white; + break; + } + + if( messages[ i ].ItemOwnerId < 0 ) + { + if( Event.current.control && Event.current.shift ) + { + if( GUILayout.Button( ( count - i ) + ": " + messages[ i ].ItemMessage, labelStyle ) ) + { + if( Event.current.button == 1 ) + { + EditorGUIUtility.systemCopyBuffer = messages[ i ].ItemMessage; + } + } + } + else + { + GUILayout.Label( ( count - i ) + ": " + messages[ i ].ItemMessage, labelStyle ); + } + } + else + { + if( GUILayout.Button( ( count - i ) + ": " + messages[ i ].ItemMessage, labelStyle ) ) + { + UIUtils.CurrentWindow.FocusOnNode( messages[ i ].ItemOwnerId, 1, true ); + if( Event.current.button == 1 ) + { + EditorGUIUtility.systemCopyBuffer = messages[ i ].ItemMessage; + } + } + } + } + } + EditorGUILayout.EndScrollView(); + EditorGUILayout.EndVertical(); + + GUILayout.EndArea(); + } + else + { + // draw toaster + int count = messages.Count; + Rect rect = toolbarArea; + rect.xMin -= 200; + + float startFade = FADETIME - 1; + for( int i = 0; i < count; i++ ) + { + GUIStyle msgstyle = UIUtils.ConsoleLogMessage; + float delta = (float)(Time.realtimeSinceStartup - messages[ i ].ItemTime); + if( delta > FADETIME ) + continue; + + if( delta < 0.1f ) + { + msgstyle.normal.textColor = Color.cyan; + } + else if( delta < startFade ) + { + switch( messages[ i ].ItemType ) + { + case MessageSeverity.Error: + msgstyle.normal.textColor = Color.red; + break; + case MessageSeverity.Warning: + msgstyle.normal.textColor = Color.yellow; + break; + default: + case MessageSeverity.Normal: + msgstyle.normal.textColor = Color.white; + break; + } + } + else + { + switch( messages[ i ].ItemType ) + { + case MessageSeverity.Error: + msgstyle.normal.textColor = new Color( 1, 0, 0, FADETIME - delta ); + break; + case MessageSeverity.Warning: + msgstyle.normal.textColor = new Color( 1, 1, 0, FADETIME - delta ); + break; + default: + case MessageSeverity.Normal: + msgstyle.normal.textColor = new Color( 1, 1, 1, FADETIME - delta ); + break; + } + } + + needsRepaint = true; + + GUIContent gc = new GUIContent( messages[ i ].ItemMessage ); + var sizes = msgstyle.CalcSize( gc ); + rect.xMin -= sizes.x - rect.width; + rect.height = sizes.y; + rect.y -= rect.height + 2; + if( messages[ i ].ItemOwnerId < 0 ) + { + GUI.Label( rect, gc, msgstyle ); + } + else + { + if( GUI.Button( rect, gc, msgstyle )) + { + UIUtils.CurrentWindow.FocusOnNode( messages[ i ].ItemOwnerId, 1, true ); + if( Event.current.button == 1 ) + { + EditorGUIUtility.systemCopyBuffer = messages[ i ].ItemMessage; + } + } + } + } + } + //GUI.color = cached; + + if( needsRepaint ) + m_parentWindow.MarkToRepaint(); + + GUIStyle style = UIUtils.ConsoleLogCircle; + + button.size = Vector2.one * 16; + + switch( lastCall ) + { + case 0: + style.normal.textColor = Color.cyan; + break; + case 1: + style.normal.textColor = Color.yellow; + break; + case 2: + style.normal.textColor = Color.red; + break; + default: + style.normal.textColor = new Color( 1, 1, 1, 0.5f ); + break; + } + + if( GUI.Button( button, m_boxToggleContent, style ) ) + { + maximize = !maximize; + m_parentWindow.MaximizeMessages = maximize; + m_currentScrollPos.y = Mathf.Infinity; + lastCall = -1; + } + + style.normal.textColor = new Color( 1, 1, 1, 0.5f ); + //GUI.color = cached; + button.x -= button.width + 2; + + if( maximize && GUI.Button( button, m_clearContent, style ) ) + { + if( messages.Count == 0 ) + { + maximize = false; + m_parentWindow.MaximizeMessages = maximize; + } + ClearMessages(); + } + + button.width += button.width + 2; + bool mouseOnTop = button.Contains( mousePosition ); + + if( currentEventType == EventType.MouseMove && mouseOnTop ) + m_parentWindow.MarkToRepaint(); + + if( DebugConsoleWindow.DeveloperMode ) + { + if( Event.current.type == EventType.KeyDown && Event.current.keyCode == KeyCode.Alpha1 ) + { + UIUtils.ShowMessage( "This is an info message\nwith two lines" ); + } + + if( Event.current.type == EventType.KeyDown && Event.current.keyCode == KeyCode.Alpha2 ) + { + UIUtils.ShowMessage( "This is a warning message", MessageSeverity.Warning ); + } + + if( Event.current.type == EventType.KeyDown && Event.current.keyCode == KeyCode.Alpha3 ) + { + + UIUtils.ShowMessage( "THIS IS AN ERROR MESSAGE!!", MessageSeverity.Error ); + } + } + } + + public void ClearMessages() + { + m_parentWindow.Messages.Clear(); + m_parentWindow.MaxMsgWidth = 100; + } + + public void Toggle() + { + + } + + public void Destroy() + { + m_parentWindow = null; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ConsoleLogWindow.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ConsoleLogWindow.cs.meta new file mode 100644 index 0000000..617e129 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ConsoleLogWindow.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ed706353a579cbb46b300406107108b1 +timeCreated: 1506345180 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ContextMenuItem.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ContextMenuItem.cs new file mode 100644 index 0000000..4834ee1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ContextMenuItem.cs @@ -0,0 +1,81 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + public class ContextMenuItem + { + private const string PALETTE_NAME_MOD_STR = " "; + + private string m_paletteName; + private string m_name; + private string m_tags; + private string m_category; + private string m_description; + private System.Type m_type; + private GUIContent m_guiContent; + private string m_nameWithShortcut; + private AmplifyShaderFunction m_function; + private NodeAttributes m_nodeAttributes; + + public ContextMenuItem( NodeAttributes nodeAttributes, System.Type type, string name, string tags, string category, string description, AmplifyShaderFunction function, KeyCode shortcut ) + { + m_nodeAttributes = nodeAttributes; + m_name = name; + m_tags = name + ( string.IsNullOrEmpty( tags ) ? "" : " " + tags ); + m_tags = m_tags.ToLower(); + m_nameWithShortcut = shortcut != KeyCode.None ? ( name + " [ " + UIUtils.KeyCodeToString( shortcut ) + " ]" ) : name; + m_paletteName = PALETTE_NAME_MOD_STR + m_name; + m_type = type; + m_category = category; + m_description = description; + m_function = function; + m_guiContent = new GUIContent( m_nameWithShortcut, m_description ); + } + + public int CompareTo( ContextMenuItem item , bool useWeights ) + { + if ( useWeights && NodeAttributes.SortOrderPriority > -1 && item.NodeAttributes.SortOrderPriority > -1 ) + { + if ( NodeAttributes.SortOrderPriority > item.NodeAttributes.SortOrderPriority ) + { + return 1; + } + else if ( NodeAttributes.SortOrderPriority == item.NodeAttributes.SortOrderPriority ) + { + return m_name.CompareTo( item.Name ); + } + else + { + return -1; + } + } + return m_name.CompareTo( item.Name ); + } + + public string PaletteName { get { return m_paletteName; } } + public string Name { get { return m_name; } } + public string Tags { get { return m_tags; } } + public string NameWithShortcut { get { return m_nameWithShortcut; } } + public string Category { get { return m_category; } } + public string Description { get { return m_description; } } + public AmplifyShaderFunction Function { get { return m_function; } } + public System.Type NodeType { get { return m_type; } } + public GUIContent ItemUIContent { get { return m_guiContent; } } + public NodeAttributes NodeAttributes { get { return m_nodeAttributes; } } + + public override string ToString() + { + return m_name + ":" + m_category + ":" + m_description; + } + + public void Destroy() + { + m_guiContent = null; + m_nodeAttributes = null; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ContextMenuItem.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ContextMenuItem.cs.meta new file mode 100644 index 0000000..7b1fbe8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ContextMenuItem.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 417f409230c530b468b8ab67dd6e3b8b +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/CustomStylesContainer.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/CustomStylesContainer.cs new file mode 100644 index 0000000..0de8b80 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/CustomStylesContainer.cs @@ -0,0 +1,53 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +//using UnityEditor; +//using UnityEngine; +//namespace AmplifyShaderEditor +//{ +// //EditorGUIUtility.GetBuiltinSkin(EditorSkin.Inspector) +// // this might be a bit nonsense since I could use the GetBuiltinSkin directly but this way will bea easier to change to some custom visuals on some near future +// [System.Serializable] +// public class CustomStylesContainer +// { +// public GUIStyle FoldoutStyle +// { +// get { return EditorStyles.foldout; } +// } + +// public GUIStyle Label +// { +// get { return GUI.skin.label; } +// } + +// public GUIStyle Button +// { +// get { return GUI.skin.button; } +// } + +// public GUIStyle TextArea +// { +// get { return GUI.skin.textArea; } +// } + +// public GUIStyle Toggle +// { +// get { return GUI.skin.toggle; } +// } + +// public GUIStyle Window +// { +// get { return GUI.skin.window; } +// } + +// public GUIStyle Textfield +// { +// get { return GUI.skin.textField; } +// } + +// public GUIStyle Box +// { +// get { return GUI.skin.box; } +// } +// } +//} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/CustomStylesContainer.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/CustomStylesContainer.cs.meta new file mode 100644 index 0000000..b677796 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/CustomStylesContainer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 79d0d783b532b474192b191547bee1c1 +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/DebugConsoleWindow.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/DebugConsoleWindow.cs new file mode 100644 index 0000000..85f4604 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/DebugConsoleWindow.cs @@ -0,0 +1,203 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +//#define ASE_CONSOLE_WINDOW + +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + public sealed class DebugConsoleWindow : EditorWindow + { + private const float WindowSizeX = 250; + private const float WindowSizeY = 250; + private const float WindowPosX = 5; + private const float WindowPosY = 5; + private Rect m_availableArea; + + private bool m_wikiAreaFoldout = true; + private bool m_miscAreaFoldout = true; + private Vector2 m_currentScrollPos; + + private int m_minURLNode = 0; + private int m_maxURLNode = -1; + +#if ASE_CONSOLE_WINDOW + public readonly static bool DeveloperMode = true; + public static bool UseShaderPanelsInfo = true; + [MenuItem( "Window/Amplify Shader Editor/Open Debug Console" )] + static void OpenMainShaderGraph() + { + OpenWindow(); + } + [MenuItem( "Window/Amplify Shader Editor/Create Template Menu Items" )] + public static void CreateTemplateMenuItems() + { + UIUtils.CurrentWindow.TemplatesManagerInstance.CreateTemplateMenuItems(); + } + +#else + public readonly static bool DeveloperMode = false; + public static bool UseShaderPanelsInfo = false; +#endif + + public static DebugConsoleWindow OpenWindow() + { + if ( DeveloperMode ) + { + DebugConsoleWindow currentWindow = ( DebugConsoleWindow ) DebugConsoleWindow.GetWindow( typeof( DebugConsoleWindow ), false, "ASE Debug Console" ); + currentWindow.titleContent.tooltip = "Debug Options for ASE. Intented only for ASE development team"; + currentWindow.minSize = new Vector2( WindowSizeX, WindowSizeY ); + currentWindow.maxSize = new Vector2( WindowSizeX, 2 * WindowSizeY ); ; + currentWindow.wantsMouseMove = true; + return currentWindow; + } + return null; + } + + void OnGUI() + { + m_availableArea = new Rect( WindowPosX, WindowPosY, position.width - 2 * WindowPosX, position.height - 2 * WindowPosY ); + GUILayout.BeginArea( m_availableArea ); + { + m_currentScrollPos = EditorGUILayout.BeginScrollView( m_currentScrollPos, GUILayout.Width( 0 ), GUILayout.Height( 0 ) ); + { + EditorGUILayout.BeginVertical(); + { + AmplifyShaderEditorWindow window = UIUtils.CurrentWindow; + if ( window != null ) + { + EditorGUILayout.Separator(); + + NodeUtils.DrawPropertyGroup( ref m_wikiAreaFoldout, "Wiki Helper", ShowWikiHelperFunctions ); + + EditorGUILayout.Separator(); + + NodeUtils.DrawPropertyGroup( ref m_miscAreaFoldout, "Misc", ShowMiscFuntions ); + + EditorGUILayout.Separator(); + } + else + { + EditorGUILayout.LabelField( "Please open an ASE window to access debug options" ); + } + } + EditorGUILayout.EndVertical(); + } + EditorGUILayout.EndScrollView(); + } + GUILayout.EndArea(); + } + + void ShowWikiHelperFunctions() + { + AmplifyShaderEditorWindow window = UIUtils.CurrentWindow; + EditorGUILayout.Separator(); + + if ( GUILayout.Button( "Nodes Screen Shots" ) ) + { + window.CurrentNodeExporterUtils.ActivateAutoScreenShot( Application.dataPath + "/../NodesInfo/Shots/",0,-1 ); + } + + GUILayout.BeginHorizontal(); + if( GUILayout.Button( "Nodes URLs" ) ) + { + window.CurrentNodeExporterUtils.ActivateNodesURL( m_minURLNode, m_maxURLNode ); + } + m_minURLNode = EditorGUILayout.IntField( m_minURLNode ); + m_maxURLNode = EditorGUILayout.IntField( m_maxURLNode ); + GUILayout.EndHorizontal(); + + EditorGUILayout.Separator(); + + if( GUILayout.Button( "Nodes Undo Test" ) ) + { + window.CurrentNodeExporterUtils.ActivateAutoUndo(); + } + + EditorGUILayout.Separator(); + + if ( GUILayout.Button( "Nodes Info" ) ) + { + window.CurrentPaletteWindow.DumpAvailableNodes( false, Application.dataPath + "/../NodesInfo/" ); + window.CurrentPaletteWindow.DumpAvailableNodes( true, Application.dataPath + "/../NodesInfo/" ); + } + + EditorGUILayout.Separator(); + + if ( GUILayout.Button( "Shortcuts Info" ) ) + { + window.ShortcutManagerInstance.DumpShortcutsToDisk( Application.dataPath + "/../NodesInfo/" ); + } + } + + void ShowMiscFuntions() + { + AmplifyShaderEditorWindow window = UIUtils.CurrentWindow; + if ( GUILayout.Button( "Force Example Shader Compilation" ) ) + { + UIUtils.ForceExampleShaderCompilation(); + } + EditorGUILayout.Separator(); + + if ( GUILayout.Button( "Refresh Available Nodes" ) ) + { + window.RefreshAvaibleNodes(); + } + + EditorGUILayout.Separator(); + + if ( GUILayout.Button( "Dump Uniform Names" ) ) + { + //window.CurrentPaletteWindow.NewList() + window.DuplicatePrevBufferInstance.DumpUniformNames(); + } + + EditorGUILayout.Separator(); + + if ( GUILayout.Button( "Force Palette Update" ) ) + { + Debug.Log( UIUtils.CurrentWindow.IsShaderFunctionWindow ); + window.CurrentPaletteWindow.ForceUpdate = true; + } + + EditorGUILayout.Separator(); + + if( GUILayout.Button( "Detect Infinite Loops" ) ) + { + if( window.IsShaderFunctionWindow ) + { + Debug.Log( "Starting infinite loop detection over shader functions" ); + List nodes = window.OutsideGraph.FunctionOutputNodes.NodesList; + for( int i = 0; i < nodes.Count; i++ ) + { + UIUtils.DetectNodeLoopsFrom( nodes[ i ], new Dictionary() ); + } + } + else + { + if( window.OutsideGraph.MultiPassMasterNodes.Count > 0 ) + { + Debug.Log( "Starting infinite loop detection over shader from template" ); + List nodes = window.OutsideGraph.MultiPassMasterNodes.NodesList; + for( int i = 0; i < nodes.Count; i++ ) + { + UIUtils.DetectNodeLoopsFrom( nodes[ i ], new Dictionary() ); + } + } + else + { + Debug.Log( "Starting infinite loop detection over standard shader" ); + UIUtils.DetectNodeLoopsFrom( window.OutsideGraph.CurrentMasterNode, new Dictionary() ); + } + } + Debug.Log( "End infinite loop detection" ); + } + } + } +} + + + diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/DebugConsoleWindow.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/DebugConsoleWindow.cs.meta new file mode 100644 index 0000000..a9e5383 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/DebugConsoleWindow.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 52308890136cd7746a5a073c9be8f028 +timeCreated: 1487850100 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/DragAndDropTool.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/DragAndDropTool.cs new file mode 100644 index 0000000..2da0208 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/DragAndDropTool.cs @@ -0,0 +1,47 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEditor; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + public class DragAndDropTool + { + public delegate void OnValidDropObject(params UnityEngine.Object[] draggedObjs ); + public event OnValidDropObject OnValidDropObjectEvt; + + public void Destroy() + { + OnValidDropObjectEvt = null; + } + + public void TestDragAndDrop( Rect dropArea ) + { + Event currentEvent = Event.current; + EventType currentEventType = currentEvent.type; + + switch (currentEventType) + { + case EventType.DragUpdated: + case EventType.DragPerform: + { + + if (!dropArea.Contains(currentEvent.mousePosition)) + return; + + DragAndDrop.visualMode = DragAndDropVisualMode.Copy; + if (currentEvent.type == EventType.DragPerform) + { + DragAndDrop.AcceptDrag(); + if (OnValidDropObjectEvt != null) + { + OnValidDropObjectEvt(DragAndDrop.objectReferences); + } + } + }break; + case EventType.DragExited:DragAndDrop.PrepareStartDrag();break; + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/DragAndDropTool.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/DragAndDropTool.cs.meta new file mode 100644 index 0000000..3ca3a86 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/DragAndDropTool.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 41c9bd09aea1377459c7e62910711c22 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/DuplicatePreventionBuffer.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/DuplicatePreventionBuffer.cs new file mode 100644 index 0000000..6f76333 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/DuplicatePreventionBuffer.cs @@ -0,0 +1,375 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class DuplicatePreventionBuffer + { + private const string VectorNameStr = "Vector "; + private const string TextureSampleNameStr = "Texture Sample "; + private const string MatrixNameStr = "Matrix "; + private const string IntNameStr = "Int "; + private const string FloatNameStr = "Float "; + private const string ColorNameStr = "Color "; + + [SerializeField] + private int[] m_availableUVChannelsArray = { -1, -1, -1, -1 }; + private string[] m_availableUVChannelsNamesArray = { "null", + "null", + "null", + "null" }; + + private Dictionary m_availablePropertyNames = new Dictionary(); + private Dictionary m_availableUniformNames = new Dictionary(); + private Dictionary m_availableLocalVariableNames = new Dictionary(); + + public void ReleaseAllUVChannels() + { + for ( int i = 0; i < m_availableUVChannelsArray.Length; i++ ) + { + m_availableUVChannelsArray[ i ] = -1; + } + } + + public bool RegisterUVChannel( int nodeId, int channelId, string name ) + { + if ( channelId < 0 || + channelId > ( m_availableUVChannelsArray.Length - 1 ) || + m_availableUVChannelsArray[ channelId ] >= 0 ) + { + return false; + } + + m_availableUVChannelsArray[ channelId ] = nodeId; + m_availableUVChannelsNamesArray[ channelId ] = name; + return true; + } + + + public bool ReleaseUVChannel( int nodeId, int channelId ) + { + if ( channelId < 0 || + channelId > ( m_availableUVChannelsArray.Length - 1 ) ) + { + return false; + } + + if ( m_availableUVChannelsArray[ channelId ] == nodeId ) + { + m_availableUVChannelsArray[ channelId ] = -1; + return true; + } + return false; + } + + public int RegisterFirstAvailableChannel( int nodeId , string name) + { + for ( int i = 0; i < m_availableUVChannelsArray.Length; i++ ) + { + if ( m_availableUVChannelsArray[ i ] == -1 ) + { + m_availableUVChannelsArray[ i ] = nodeId; + m_availableUVChannelsNamesArray[ i ] = name; + return i; + } + } + return -1; + } + + public bool IsChannelAvailable( int channelId ) + { + if ( channelId < 0 || + channelId > ( m_availableUVChannelsArray.Length - 1 ) ) + { + return false; + } + + return ( m_availableUVChannelsArray[ channelId ] < 0 ); + } + + public int GetFirstOccupiedChannel() + { + for ( int i = 0; i < 4; i++ ) + { + if ( m_availableUVChannelsArray[ i ] > -1 ) + return i; + } + return -1; + } + + public string GetChannelName( int channelId ) + { + if ( channelId < 0 || + channelId > ( m_availableUVChannelsArray.Length - 1 ) ) + { + return string.Empty; + } + + return m_availableUVChannelsNamesArray[ channelId ] ; + } + + public void SetChannelName( int channelId , string name ) + { + if ( channelId < 0 || + channelId > ( m_availableUVChannelsArray.Length - 1 ) ) + { + return; + } + m_availableUVChannelsNamesArray[ channelId ] = name; + } + + public bool RegisterLocalVariableName( int nodeId, string name ) + { + if ( name.Length == 0 ) + return false; + + if ( m_availableLocalVariableNames.ContainsKey( name ) ) + { + if ( m_availableLocalVariableNames[ name ] > -1 ) + { + return false; + } + else + { + m_availableLocalVariableNames[ name ] = nodeId; + return true; + } + } + + m_availableLocalVariableNames.Add( name, nodeId ); + return true; + } + + public int CheckUniformNameOwner( string name ) + { + if ( name.Length == 0 ) + return -1; + + if ( m_availableUniformNames.ContainsKey( name ) ) + { + return m_availableUniformNames[ name ]; + } + + return -1; + } + + public bool RegisterUniformName( int nodeId, string name ) + { + if ( name.Length == 0 ) + return false; + + if ( m_availableUniformNames.ContainsKey( name ) ) + { + if ( m_availableUniformNames[ name ] > -1 ) + { + return false; + } + else + { + m_availableUniformNames[ name ] = nodeId; + return true; + } + } + + m_availableUniformNames.Add( name, nodeId ); + return true; + } + + public void DumpUniformNames() + { + string val = "CONTENTS\n"; + foreach ( KeyValuePair kvp in m_availableUniformNames ) + { + val += ( "key " + kvp.Key + " : value " + kvp.Value + "\n" ); + } + } + + public void DumpLocalVariableNames() + { + string val = "CONTENTS\n"; + foreach ( KeyValuePair kvp in m_availableLocalVariableNames ) + { + val += ( "key " + kvp.Key + " : value " + kvp.Value + "\n" ); + } + } + + + public bool ReleaseUniformName( int nodeId, string name ) + { + if ( !string.IsNullOrEmpty(name) && name.Length == 0 ) + return false; + + if ( m_availableUniformNames.ContainsKey( name ) ) + { + if ( m_availableUniformNames[ name ] == nodeId ) + { + m_availableUniformNames.Remove( name ); + return true; + } + } + return false; + } + + public bool ReleaseLocalVariableName( int nodeId, string name ) + { + if ( name.Length == 0 ) + return false; + + if ( m_availableLocalVariableNames.ContainsKey( name ) ) + { + if ( m_availableLocalVariableNames[ name ] == nodeId ) + { + m_availableLocalVariableNames.Remove( name ); + return true; + } + } + return false; + } + + public void ReleaseAllUniformNames() + { + m_availableUniformNames.Clear(); + } + + public void ReleaseAllLocalVariableNames() + { + m_availableLocalVariableNames.Clear(); + } + + public void GetFirstAvailableName( int nodeId, WirePortDataType type , out string outProperty , out string outInspector, bool useCustomPrefix = false, string customPrefix = null) + { + string name = string.Empty; + if ( useCustomPrefix && customPrefix != null ) + { + name = customPrefix; + } + else + { + switch ( type ) + { + case WirePortDataType.OBJECT: + case WirePortDataType.FLOAT: + { + name = FloatNameStr; + } + break; + case WirePortDataType.INT: + { + name = IntNameStr; + } + break; + case WirePortDataType.FLOAT2: + case WirePortDataType.FLOAT3: + case WirePortDataType.FLOAT4: + { + name = VectorNameStr; + } + break; + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + { + name = MatrixNameStr; + } + break; + case WirePortDataType.COLOR: + { + name = ColorNameStr; + } + break; + } + } + + int count = 0; + bool foundName = false; + while ( !foundName ) + { + string inspectorName = name + count; + string propertyName = UIUtils.GeneratePropertyName( inspectorName , PropertyType.Property ); + + if ( IsUniformNameAvailable( propertyName ) ) + { + outInspector = inspectorName; + outProperty = propertyName; + RegisterUniformName( nodeId, propertyName ); + return; + } + count += 1; + } + outProperty = string.Empty; + outInspector = string.Empty; + UIUtils.ShowMessage( "Could not find a valid name " + MessageSeverity.Warning ); + } + + public bool IsUniformNameAvailable( string name ) + { + if ( m_availableUniformNames.ContainsKey( name ) && m_availableUniformNames[ name ] > -1 ) + return false; + return true; + } + + public bool IsLocalvariableNameAvailable( string name ) + { + if ( m_availableLocalVariableNames.ContainsKey( name ) && m_availableLocalVariableNames[ name ] > -1 ) + return false; + return true; + } + + public bool GetPropertyName( int nodeId, string name ) + { + if ( m_availablePropertyNames.ContainsKey( name ) ) + { + if ( m_availablePropertyNames[ name ] > -1 ) + { + return false; + } + else + { + m_availablePropertyNames[ name ] = nodeId; + return true; + } + } + + m_availablePropertyNames.Add( name, nodeId ); + return true; + } + + + public bool ReleasePropertyName( int nodeId, string name ) + { + if ( m_availablePropertyNames.ContainsKey( name ) ) + { + if ( m_availablePropertyNames[ name ] == nodeId ) + { + m_availablePropertyNames[ name ] = -1; + return true; + } + } + return false; + } + + public void ReleaseAllPropertyNames() + { + m_availablePropertyNames.Clear(); + } + + public bool IsPropertyNameAvailable( string name ) + { + if ( m_availablePropertyNames.ContainsKey( name ) && m_availablePropertyNames[ name ] > -1 ) + return false; + return true; + } + + public void ReleaseAllData() + { + ReleaseAllUVChannels(); + ReleaseAllUniformNames(); + ReleaseAllPropertyNames(); + ReleaseAllLocalVariableNames(); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/DuplicatePreventionBuffer.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/DuplicatePreventionBuffer.cs.meta new file mode 100644 index 0000000..fd5e661 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/DuplicatePreventionBuffer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a4cfbb4204c63ca4e8f7cec73f6b3ef8 +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/GraphContextMenu.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/GraphContextMenu.cs new file mode 100644 index 0000000..b0d38f4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/GraphContextMenu.cs @@ -0,0 +1,393 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; +using System.Text; +using System.Linq; +using System.Collections.Generic; +using System.Reflection; + +namespace AmplifyShaderEditor +{ + public class ShortcutKeyData + { + public bool IsPressed; + public System.Type NodeType; + public string Name; + public ShortcutKeyData( System.Type type, string name ) + { + NodeType = type; + Name = name; + IsPressed = false; + } + } + + public class GraphContextMenu + { + private List m_items; + private List m_itemFunctions; + private Dictionary m_itemsDict; + private Dictionary m_deprecatedItemsDict; + private Dictionary m_castTypes; + private Dictionary m_shortcutTypes; + + private KeyCode m_lastKeyPressed; + private ParentGraph m_currentGraph; + private bool m_correctlyLoaded = false; + + public GraphContextMenu( ParentGraph currentGraph ) + { + m_currentGraph = currentGraph; + m_correctlyLoaded = RefreshNodes( currentGraph ); + } + + private Type[] GetTypesInNamespace( Assembly assembly, string nameSpace ) + { + return assembly.GetTypes().Where( t => String.Equals( t.Namespace, nameSpace, StringComparison.Ordinal ) ).ToArray(); + } + + public bool RefreshNodes( ParentGraph currentGraph ) + { + if( m_items != null ) + { + m_items.Clear(); + m_items = null; + } + + if( m_itemFunctions != null ) + { + m_itemFunctions.Clear(); + m_itemFunctions = null; + } + + m_items = new List(); + m_itemFunctions = new List(); + + if( m_itemsDict != null ) + m_itemsDict.Clear(); + + m_itemsDict = new Dictionary(); + + if( m_deprecatedItemsDict != null ) + m_deprecatedItemsDict.Clear(); + + m_deprecatedItemsDict = new Dictionary(); + + if( m_castTypes != null ) + m_castTypes.Clear(); + + m_castTypes = new Dictionary(); + + if( m_shortcutTypes != null ) + m_shortcutTypes.Clear(); + + m_shortcutTypes = new Dictionary(); + + m_lastKeyPressed = KeyCode.None; + + // Fetch all available nodes by their attributes + try + { + //IEnumerable availableTypes = AppDomain.CurrentDomain.GetAssemblies().ToList().SelectMany( type => type.GetTypes() ); + var mainAssembly = Assembly.GetExecutingAssembly(); + Type[] availableTypes = GetTypesInNamespace( mainAssembly, "AmplifyShaderEditor" ); + +#if UNITY_2017_3_OR_NEWER + try + { + var editorAssembly = Assembly.Load( "Assembly-CSharp-Editor" ); + if( mainAssembly != editorAssembly ) + { + Type[] extraTypes = GetTypesInNamespace( editorAssembly, "AmplifyShaderEditor" ); + availableTypes = availableTypes.Concat( extraTypes ).ToArray(); + } + } + catch( Exception ) + { + // quiet catch because we don't care if it fails to find the assembly, we'll just skip it + } +#endif + + foreach( System.Type type in availableTypes ) + { + foreach( NodeAttributes attribute in Attribute.GetCustomAttributes( type ).OfType() ) + { + if( attribute.Available && !attribute.Deprecated ) + { + //if ( !UIUtils.CurrentWindow.IsShaderFunctionWindow && attribute.AvailableInFunctionsOnly ) + // continue; + + if( !UIUtils.HasColorCategory( attribute.Category ) ) + { + if( !String.IsNullOrEmpty( attribute.CustomCategoryColor ) ) + { + try + { + Color color = new Color(); + ColorUtility.TryParseHtmlString( attribute.CustomCategoryColor, out color ); + UIUtils.AddColorCategory( attribute.Category, color ); + } + catch( Exception e ) + { + Debug.LogException( e ); + UIUtils.AddColorCategory( attribute.Category, Constants.DefaultCategoryColor ); + } + } + //else + //{ + // UIUtils.AddColorCategory( attribute.Category, Constants.DefaultCategoryColor ); + //} + } + + if( attribute.CastType != null && attribute.CastType.Length > 0 && type != null ) + { + for( int i = 0; i < attribute.CastType.Length; i++ ) + { + m_castTypes.Add( attribute.CastType[ i ], type ); + } + } + + if( attribute.ShortcutKey != KeyCode.None && type != null ) + m_shortcutTypes.Add( attribute.ShortcutKey, new ShortcutKeyData( type, attribute.Name ) ); + + ContextMenuItem newItem = new ContextMenuItem( attribute, type, attribute.Name, attribute.Tags, attribute.Category, attribute.Description, null, attribute.ShortcutKey ); + if( UIUtils.GetNodeAvailabilityInBitArray( attribute.NodeAvailabilityFlags, NodeAvailability.SurfaceShader ) ) + m_items.Add( newItem ); + else if( UIUtils.GetNodeAvailabilityInBitArray( attribute.NodeAvailabilityFlags, currentGraph.ParentWindow.CurrentNodeAvailability ) ) + m_items.Add( newItem ); + else if( UIUtils.GetNodeAvailabilityInBitArray( attribute.NodeAvailabilityFlags, currentGraph.CurrentCanvasMode ) ) + m_items.Add( newItem ); + + m_itemsDict.Add( type, attribute ); + m_itemFunctions.Add( newItem ); + } + else + { + m_deprecatedItemsDict.Add( type, attribute ); + } + } + } + } + catch( ReflectionTypeLoadException exception ) + { + Debug.LogException( exception ); + return false; + } + + string[] guids = AssetDatabase.FindAssets( "t:AmplifyShaderFunction" ); + List allFunctions = new List(); + + for( int i = 0; i < guids.Length; i++ ) + { + allFunctions.Add( AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( guids[ i ] ) ) ); + } + + int functionCount = allFunctions.Count; + if( functionCount > 0 ) + { + m_castTypes.Add( typeof( AmplifyShaderFunction ), typeof( FunctionNode ) ); + } + + for( int i = 0; i < functionCount; i++ ) + { + if( !allFunctions[ i ].Hidden ) + { + NodeAttributes attribute = new NodeAttributes( allFunctions[ i ].FunctionName, allFunctions[ i ].CustomNodeCategory, allFunctions[ i ].Description, KeyCode.None, true, 0, int.MaxValue, typeof( AmplifyShaderFunction ) ); + System.Type type = typeof( FunctionNode ); + + ContextMenuItem newItem = new ContextMenuItem( attribute, type, AddSpacesToSentence( attribute.Name ), attribute.Tags, attribute.Category, attribute.Description, allFunctions[ i ], attribute.ShortcutKey ); + m_items.Add( newItem ); + m_itemFunctions.Add( newItem ); + } + } + + //Sort out the final list by name + m_items.Sort( ( x, y ) => x.Category.CompareTo( y.Category ) ); + m_itemFunctions.Sort( ( x, y ) => x.Category.CompareTo( y.Category ) ); + return true; + } + + public void Destroy() + { + for( int i = 0; i < m_items.Count; i++ ) + { + m_items[ i ].Destroy(); + } + + for( int i = 0; i < m_itemFunctions.Count; i++ ) + { + if( m_itemFunctions[ i ] != null ) + m_itemFunctions[ i ].Destroy(); + } + + m_items.Clear(); + m_items = null; + + m_itemFunctions.Clear(); + m_itemFunctions = null; + + m_itemsDict.Clear(); + m_itemsDict = null; + + m_deprecatedItemsDict.Clear(); + m_deprecatedItemsDict = null; + + m_castTypes.Clear(); + m_castTypes = null; + + m_shortcutTypes.Clear(); + m_shortcutTypes = null; + + } + + public static string AddSpacesToSentence( string text ) + { + if( string.IsNullOrEmpty( text ) ) + return string.Empty; + + bool lastIsUpper = char.IsUpper( text, 0 ); + bool lastIsLetter = char.IsLetter( text, 0 ); + StringBuilder title = new StringBuilder(); + title.Append( text[ 0 ] ); + for( int i = 1; i < text.Length; i++ ) + { + bool currIsUpper = char.IsUpper( text, i ); + bool currIsLetter = char.IsLetter( text, i ); + if( currIsUpper && !lastIsUpper && lastIsLetter ) + { + title.Append( " " ); + } + + // if current is a number and previous is a letter we space it (ie: Rotation2D = Rotation 2D) + if( lastIsLetter && char.IsNumber( text, i ) ) + { + title.Append( " " ); + } + + // if previous is upper, current is upper and the next two following are lower then we space it (ie: UVDistortion = UV Distortion) + if( i < text.Length - 1 ) + { + bool nextIsLower = char.IsLower( text, i + 1 ) && char.IsLetter( text, i + 1 ); + bool lastIsLower = i < text.Length - 2 ? char.IsLower( text, i + 2 ) && char.IsLetter( text, i + 2 ) : false; + if( lastIsUpper && currIsUpper && currIsLetter && nextIsLower && lastIsLower ) + { + title.Append( " " ); + } + } + lastIsUpper = currIsUpper; + lastIsLetter = currIsLetter; + title.Append( text[ i ] ); + } + return title.ToString(); + } + + public NodeAttributes GetNodeAttributesForType( System.Type type ) + { + if( type == null ) + { + Debug.LogError( "Invalid type detected" ); + return null; + } + + if( m_itemsDict.ContainsKey( type ) ) + return m_itemsDict[ type ]; + return null; + } + + public NodeAttributes GetDeprecatedNodeAttributesForType( System.Type type ) + { + if( m_deprecatedItemsDict.ContainsKey( type ) ) + return m_deprecatedItemsDict[ type ]; + return null; + } + + public void UpdateKeyPress( KeyCode key ) + { + if( key == KeyCode.None ) + return; + + m_lastKeyPressed = key; + if( m_shortcutTypes.ContainsKey( key ) ) + { + m_shortcutTypes[ key ].IsPressed = true; + } + } + + public void UpdateKeyReleased( KeyCode key ) + { + if( key == KeyCode.None ) + return; + + if( m_shortcutTypes.ContainsKey( key ) ) + { + m_shortcutTypes[ key ].IsPressed = false; + } + } + + public void ResetShortcutKeyStates() + { + foreach( KeyValuePair kvp in m_shortcutTypes ) + { + kvp.Value.IsPressed = false; + } + } + + public ParentNode CreateNodeFromCastType( System.Type type ) + { + if( m_castTypes.ContainsKey( type ) ) + { + ParentNode newNode = (ParentNode)ScriptableObject.CreateInstance( m_castTypes[ type ] ); + return newNode; + } + return null; + } + + + public ParentNode CreateNodeFromShortcutKey() + { + if( m_lastKeyPressed == KeyCode.None ) + return null; + + if( m_shortcutTypes.ContainsKey( m_lastKeyPressed ) && m_shortcutTypes[ m_lastKeyPressed ].IsPressed ) + { + ParentNode newNode = (ParentNode)ScriptableObject.CreateInstance( m_shortcutTypes[ m_lastKeyPressed ].NodeType ); + return newNode; + } + return null; + } + + public bool CheckShortcutKey() + { + if( m_lastKeyPressed == KeyCode.None ) + return false; + + if( m_shortcutTypes.ContainsKey( m_lastKeyPressed ) && m_shortcutTypes[ m_lastKeyPressed ].IsPressed ) + { + return true; + } + return false; + } + + public List MenuItems + { + get + { + if( m_currentGraph.ParentWindow.IsShaderFunctionWindow ) + return m_itemFunctions; + else + return m_items; + } + } + + public List ItemFunctions { get { return m_itemFunctions; } } + public KeyCode LastKeyPressed + { + get { return m_lastKeyPressed; } + } + + public Dictionary NodeShortcuts { get { return m_shortcutTypes; } } + public bool CorrectlyLoaded { get { return m_correctlyLoaded; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/GraphContextMenu.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/GraphContextMenu.cs.meta new file mode 100644 index 0000000..be8ed3c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/GraphContextMenu.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5c34fc95a1ddd7d42bc74151061035f4 +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/MenuParent.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/MenuParent.cs new file mode 100644 index 0000000..3029864 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/MenuParent.cs @@ -0,0 +1,451 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + public enum MenuAnchor + { + TOP_LEFT = 0, + TOP_CENTER, + TOP_RIGHT, + MIDDLE_LEFT, + MIDDLE_CENTER, + MIDDLE_RIGHT, + BOTTOM_LEFT, + BOTTOM_CENTER, + BOTTOM_RIGHT, + NONE + } + + public enum MenuAutoSize + { + MATCH_VERTICAL = 0, + MATCH_HORIZONTAL, + NONE + } + + public class MenuParent + { + protected AmplifyShaderEditorWindow m_parentWindow = null; + + protected const float MinimizeButtonXSpacing = 5; + protected const float MinimizeButtonYSpacing = 5.5f; + protected const float ResizeAreaWidth = 5; + + protected const float MinimizeCollisionAdjust = 5; + + protected GUIStyle m_style; + protected GUIContent m_content; + protected Rect m_maximizedArea; + protected Rect m_transformedArea; + protected Rect m_resizeArea; + protected MenuAnchor m_anchor; + protected MenuAutoSize m_autoSize; + protected bool m_isActive = true; + protected bool m_isMaximized = true; + + protected bool m_lockOnMinimize = false; + protected bool m_preLockState = false; + + protected Rect m_minimizedArea; + protected Rect m_minimizeButtonPos; + protected float m_realWidth; + protected GUIStyle m_empty = new GUIStyle(); + + protected float m_resizeDelta; + + protected bool m_isResizing = false; + protected bool m_resizable = false; + protected GUIStyle m_resizeAreaStyle; + protected bool m_isMouseInside = false; + protected Vector2 m_currentScrollPos; + public MenuParent( AmplifyShaderEditorWindow parentWindow, float x, float y, float width, float height, string name, MenuAnchor anchor = MenuAnchor.NONE, MenuAutoSize autoSize = MenuAutoSize.NONE ) + { + m_parentWindow = parentWindow; + m_anchor = anchor; + m_autoSize = autoSize; + m_maximizedArea = new Rect( x, y, width, height ); + m_content = new GUIContent( GUIContent.none ); + m_content.text = name; + m_transformedArea = new Rect(); + m_resizeArea = new Rect(); + m_resizeArea.width = ResizeAreaWidth; + m_resizeAreaStyle = GUIStyle.none; + m_currentScrollPos = Vector2.zero; + } + + public void SetMinimizedArea( float x, float y, float width, float height ) + { + m_minimizedArea = new Rect( x, y, width, height ); + } + + protected void InitDraw( Rect parentPosition, Vector2 mousePosition, int mouseButtonId ) + { + if ( m_style == null ) + { + m_style = new GUIStyle( UIUtils.TextArea ); + +#if UNITY_2019_3_OR_NEWER + m_style.normal.background = m_style.normal.scaledBackgrounds[ 0 ]; + m_style.normal.scaledBackgrounds = null; + m_style.border = new RectOffset( 4, 4, 4, 4 ); +#endif + m_style.stretchHeight = true; + m_style.stretchWidth = true; + m_style.fontSize = ( int ) Constants.DefaultTitleFontSize; + m_style.fontStyle = FontStyle.Normal; + Texture minimizeTex = UIUtils.GetCustomStyle( CustomStyle.MaximizeButton ).normal.background; + m_minimizeButtonPos = new Rect( 0, 0, minimizeTex.width, minimizeTex.height ); + } + + Rect currentArea = m_isMaximized ? m_maximizedArea : m_minimizedArea; + + if ( m_isMaximized ) + { + if ( m_resizable ) + { + if ( m_isResizing ) + { + if ( m_anchor == MenuAnchor.TOP_LEFT ) + m_resizeDelta = ( ParentWindow.CurrentEvent.mousePosition.x - m_maximizedArea.width ); + else if ( m_anchor == MenuAnchor.TOP_RIGHT ) + m_resizeDelta = ParentWindow.CurrentEvent.mousePosition.x - ( parentPosition.width - m_maximizedArea.width); + } + } + + m_realWidth = m_maximizedArea.width; + if ( m_resizable ) + { + if ( m_anchor == MenuAnchor.TOP_LEFT ) + { + currentArea.width += m_resizeDelta; + m_realWidth += m_resizeDelta; + } + else if ( m_anchor == MenuAnchor.TOP_RIGHT ) + { + currentArea.width -= m_resizeDelta; + m_realWidth -= m_resizeDelta; + } + } + } + else + { + if ( currentArea.x < 0 ) + { + m_realWidth = currentArea.width + currentArea.x; + } + else if ( ( currentArea.x + currentArea.width ) > parentPosition.width ) + { + m_realWidth = parentPosition.width - currentArea.x; + } + if ( m_realWidth < 0 ) + m_realWidth = 0; + } + + switch ( m_anchor ) + { + case MenuAnchor.TOP_LEFT: + { + m_transformedArea.x = currentArea.x; + m_transformedArea.y = currentArea.y; + if ( m_isMaximized ) + { + m_minimizeButtonPos.x = m_transformedArea.x + m_transformedArea.width - m_minimizeButtonPos.width - MinimizeButtonXSpacing; + m_minimizeButtonPos.y = m_transformedArea.y + MinimizeButtonYSpacing; + + m_resizeArea.x = m_transformedArea.x + m_transformedArea.width; + m_resizeArea.y = m_minimizeButtonPos.y; + m_resizeArea.height = m_transformedArea.height; + } + else + { + float width = ( m_transformedArea.width - m_transformedArea.x ); + m_minimizeButtonPos.x = m_transformedArea.x + width * 0.5f - m_minimizeButtonPos.width * 0.5f; + m_minimizeButtonPos.y = m_transformedArea.height * 0.5f - m_minimizeButtonPos.height * 0.5f; + } + } + break; + case MenuAnchor.TOP_CENTER: + { + m_transformedArea.x = parentPosition.width * 0.5f + currentArea.x; + m_transformedArea.y = currentArea.y; + } + break; + case MenuAnchor.TOP_RIGHT: + { + m_transformedArea.x = parentPosition.width - currentArea.x - currentArea.width; + m_transformedArea.y = currentArea.y; + if ( m_isMaximized ) + { + m_minimizeButtonPos.x = m_transformedArea.x + MinimizeButtonXSpacing; + m_minimizeButtonPos.y = m_transformedArea.y + MinimizeButtonYSpacing; + + m_resizeArea.x = m_transformedArea.x - ResizeAreaWidth; + m_resizeArea.y = m_minimizeButtonPos.y; + m_resizeArea.height = m_transformedArea.height; + } + else + { + float width = ( parentPosition.width - m_transformedArea.x ); + m_minimizeButtonPos.x = m_transformedArea.x + width * 0.5f - m_minimizeButtonPos.width * 0.5f; + m_minimizeButtonPos.y = m_transformedArea.height * 0.5f - m_minimizeButtonPos.height * 0.5f; + } + } + break; + case MenuAnchor.MIDDLE_LEFT: + { + m_transformedArea.x = currentArea.x; + m_transformedArea.y = parentPosition.height * 0.5f + currentArea.y; + } + break; + case MenuAnchor.MIDDLE_CENTER: + { + m_transformedArea.x = parentPosition.width * 0.5f + currentArea.x; + m_transformedArea.y = parentPosition.height * 0.5f + currentArea.y; + } + break; + case MenuAnchor.MIDDLE_RIGHT: + { + m_transformedArea.x = parentPosition.width - currentArea.x - currentArea.width; + m_transformedArea.y = parentPosition.height * 0.5f + currentArea.y; + } + break; + case MenuAnchor.BOTTOM_LEFT: + { + m_transformedArea.x = currentArea.x; + m_transformedArea.y = parentPosition.height - currentArea.y - currentArea.height; + } + break; + case MenuAnchor.BOTTOM_CENTER: + { + m_transformedArea.x = parentPosition.width * 0.5f + currentArea.x; + m_transformedArea.y = parentPosition.height - currentArea.y - currentArea.height; + } + break; + case MenuAnchor.BOTTOM_RIGHT: + { + m_transformedArea.x = parentPosition.width - currentArea.x - currentArea.width; + m_transformedArea.y = parentPosition.height - currentArea.y - currentArea.height; + } + break; + + case MenuAnchor.NONE: + { + m_transformedArea.x = currentArea.x; + m_transformedArea.y = currentArea.y; + } + break; + } + + switch ( m_autoSize ) + { + case MenuAutoSize.MATCH_HORIZONTAL: + { + m_transformedArea.width = parentPosition.width - m_transformedArea.x; + m_transformedArea.height = currentArea.height; + } + break; + + case MenuAutoSize.MATCH_VERTICAL: + { + m_transformedArea.width = currentArea.width; + m_transformedArea.height = parentPosition.height - m_transformedArea.y; + } + break; + case MenuAutoSize.NONE: + { + m_transformedArea.width = currentArea.width; + m_transformedArea.height = currentArea.height; + } + break; + } + + } + public virtual void Draw( Rect parentPosition, Vector2 mousePosition, int mouseButtonId, bool hasKeyboadFocus ) + { + InitDraw( parentPosition, mousePosition, mouseButtonId ); + if ( ParentWindow.CurrentEvent.type == EventType.MouseDrag && ParentWindow.CurrentEvent.button > 0 /*catches both middle and right mouse button*/ ) + { + m_isMouseInside = IsInside( mousePosition ); + if ( m_isMouseInside ) + { + m_currentScrollPos.x += Constants.MenuDragSpeed * ParentWindow.CurrentEvent.delta.x; + if ( m_currentScrollPos.x < 0 ) + m_currentScrollPos.x = 0; + m_currentScrollPos.y += Constants.MenuDragSpeed * ParentWindow.CurrentEvent.delta.y; + if ( m_currentScrollPos.y < 0 ) + m_currentScrollPos.y = 0; + + } + } + } + + public void PostDraw() + { + if ( !m_isMaximized ) + { + m_transformedArea.height = 35; + GUI.Label( m_transformedArea, m_content, m_style ); + } + + Color colorBuffer = GUI.color; + GUI.color = EditorGUIUtility.isProSkin ? Color.white : Color.black; + bool guiEnabledBuffer = GUI.enabled; + GUI.enabled = !m_lockOnMinimize; + Rect buttonArea = m_minimizeButtonPos; + + buttonArea.x -= MinimizeCollisionAdjust; + buttonArea.width += 2 * MinimizeCollisionAdjust; + + buttonArea.y -= MinimizeCollisionAdjust; + buttonArea.height += 2 * MinimizeCollisionAdjust; + + if ( m_parentWindow.CameraDrawInfo.CurrentEventType == EventType.Repaint ) + GUI.Label( m_minimizeButtonPos, string.Empty, UIUtils.GetCustomStyle( m_isMaximized ? CustomStyle.MinimizeButton : CustomStyle.MaximizeButton ) ); + + if( m_parentWindow.CameraDrawInfo.CurrentEventType == EventType.MouseDown && buttonArea.Contains( m_parentWindow.CameraDrawInfo.MousePosition ) ) + //if ( GUI.Button( buttonArea, string.Empty, m_empty ) ) + { + m_isMaximized = !m_isMaximized; + m_resizeDelta = 0; + } + + if ( m_resizable && m_isMaximized ) + { + EditorGUIUtility.AddCursorRect( m_resizeArea, MouseCursor.ResizeHorizontal ); + if ( !m_isResizing && GUI.RepeatButton( m_resizeArea, string.Empty, m_resizeAreaStyle ) ) + { + m_isResizing = true; + } + else + { + if ( m_isResizing ) + { + if ( ParentWindow.CurrentEvent.isMouse && ParentWindow.CurrentEvent.type != EventType.MouseDrag ) + { + m_isResizing = false; + } + } + } + + if ( m_realWidth < buttonArea.width ) + { + // Auto-minimize + m_isMaximized = false; + m_resizeDelta = 0; + m_isResizing = false; + } + else + { + float halfSizeWindow = 0.5f * ParentWindow.position.width; + if ( m_realWidth > halfSizeWindow ) + { + m_realWidth = 0.5f * ParentWindow.position.width; + if ( m_resizeDelta > 0 ) + { + m_resizeDelta = m_realWidth - m_maximizedArea.width; + } + else + { + m_resizeDelta = m_maximizedArea.width - m_realWidth; + } + } + } + } + + GUI.enabled = guiEnabledBuffer; + GUI.color = colorBuffer; + + } + + public void OnLostFocus() + { + if ( m_isResizing ) + { + m_isResizing = false; + } + } + + virtual public void Destroy() + { + m_empty = null; + m_resizeAreaStyle = null; + } + + public float InitialX + { + get { return m_maximizedArea.x; } + set { m_maximizedArea.x = value; } + } + + public float Width + { + get { return m_maximizedArea.width; } + set { m_maximizedArea.width = value; } + } + + public float RealWidth + { + get { return m_realWidth; } + } + public float Height + { + get { return m_maximizedArea.height; } + set { m_maximizedArea.height = value; } + } + + public Rect Size + { + get { return m_maximizedArea; } + } + + public virtual bool IsInside( Vector2 position ) + { + if ( !m_isActive ) + return false; + + return m_transformedArea.Contains( position ); + } + + public bool IsMaximized + { + get { return m_isMaximized; } + set { m_isMaximized = value; } + } + + public Rect TransformedArea + { + get { return m_transformedArea; } + } + + public bool Resizable { set { m_resizable = value; } } + public bool IsResizing { get { return m_isResizing; } } + public bool LockOnMinimize + { + set + { + if ( m_lockOnMinimize == value ) + return; + + m_lockOnMinimize = value; + if ( value ) + { + m_preLockState = m_isMaximized; + m_isMaximized = false; + } + else + { + m_isMaximized = m_preLockState; + } + } + } + public bool IsActive + { + get { return m_isActive; } + } + public AmplifyShaderEditorWindow ParentWindow { get { return m_parentWindow; } set { m_parentWindow = value; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/MenuParent.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/MenuParent.cs.meta new file mode 100644 index 0000000..2c0ba16 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/MenuParent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5d535d3799a3ef547aea607fdc8b947b +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/NodeParametersWindow.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/NodeParametersWindow.cs new file mode 100644 index 0000000..8b8ed9c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/NodeParametersWindow.cs @@ -0,0 +1,557 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +using UnityEditorInternal; + +namespace AmplifyShaderEditor +{ + public sealed class NodeParametersWindow : MenuParent + { + private int m_lastSelectedNode = -1; + private const string TitleStr = "Node Properties"; + private GUIStyle m_nodePropertiesStyle; + private GUIContent m_dummyContent = new GUIContent(); + private GUIStyle m_propertyAdjustment; + + private ReorderableList m_functionInputsReordableList = null; + private int m_functionInputsLastCount = 0; + + private ReorderableList m_functionSwitchesReordableList = null; + private int m_functionSwitchesLastCount = 0; + + private ReorderableList m_functionOutputsReordableList = null; + private int m_functionOutputsLastCount = 0; + + private ReorderableList m_propertyReordableList = null; + private int m_lastCount = 0; + + private bool m_forceUpdate = false; + + [SerializeField] + private List m_propertyReordableNodes = new List(); + + // width and height are between [0,1] and represent a percentage of the total screen area + public NodeParametersWindow( AmplifyShaderEditorWindow parentWindow ) : base( parentWindow, 0, 0, 285, 0, string.Empty, MenuAnchor.TOP_LEFT, MenuAutoSize.MATCH_VERTICAL ) + { + SetMinimizedArea( -225, 0, 260, 0 ); + } + + public void OnShaderFunctionLoad() + { + m_functionInputsReordableList = null; + m_functionSwitchesReordableList = null; + m_functionOutputsReordableList = null; + } + + public bool Draw( Rect parentPosition, ParentNode selectedNode, Vector2 mousePosition, int mouseButtonId, bool hasKeyboardFocus ) + { + bool changeCheck = false; + base.Draw( parentPosition, mousePosition, mouseButtonId, hasKeyboardFocus ); + if ( m_nodePropertiesStyle == null ) + { + m_nodePropertiesStyle = UIUtils.GetCustomStyle( CustomStyle.NodePropertiesTitle ); + m_nodePropertiesStyle.normal.textColor = m_nodePropertiesStyle.active.textColor = EditorGUIUtility.isProSkin ? new Color( 1f, 1f, 1f ) : new Color( 0f, 0f, 0f ); + } + + if ( m_isMaximized ) + { + KeyCode key = Event.current.keyCode; + if ( m_isMouseInside || hasKeyboardFocus ) + { + if ( key == ShortcutsManager.ScrollUpKey ) + { + m_currentScrollPos.y -= 10; + if ( m_currentScrollPos.y < 0 ) + { + m_currentScrollPos.y = 0; + } + Event.current.Use(); + } + + if ( key == ShortcutsManager.ScrollDownKey ) + { + m_currentScrollPos.y += 10; + Event.current.Use(); + } + } + + if( m_forceUpdate ) + { + if( m_propertyReordableList != null ) + m_propertyReordableList.ReleaseKeyboardFocus(); + m_propertyReordableList = null; + + if ( m_functionInputsReordableList != null ) + m_functionInputsReordableList.ReleaseKeyboardFocus(); + m_functionInputsReordableList = null; + + if( m_functionSwitchesReordableList != null ) + m_functionSwitchesReordableList.ReleaseKeyboardFocus(); + m_functionSwitchesReordableList = null; + + if ( m_functionOutputsReordableList != null ) + m_functionOutputsReordableList.ReleaseKeyboardFocus(); + m_functionOutputsReordableList = null; + m_forceUpdate = false; + } + + GUILayout.BeginArea( m_transformedArea, m_content, m_style ); + { + //Draw selected node parameters + if ( selectedNode != null ) + { + // this hack is need because without it the several FloatFields/Textfields/... would show wrong values ( different from the ones they were assigned to show ) + if ( m_lastSelectedNode != selectedNode.UniqueId ) + { + m_lastSelectedNode = selectedNode.UniqueId; + GUI.FocusControl( "" ); + } + + EditorGUILayout.BeginVertical(); + { + EditorGUILayout.Separator(); + if ( selectedNode.UniqueId == ParentWindow.CurrentGraph.CurrentMasterNodeId ) + { + m_dummyContent.text = "Output Node"; + } + else + { + if ( selectedNode.Attributes != null ) + { + + m_dummyContent.text = selectedNode.Attributes.Name; + } + else if ( selectedNode is CommentaryNode ) + { + m_dummyContent.text = "Commentary"; + } + else + { + m_dummyContent.text = TitleStr; + } + } + + EditorGUILayout.LabelField( m_dummyContent, m_nodePropertiesStyle ); + + EditorGUILayout.Separator(); + //UIUtils.RecordObject( selectedNode , "Changing properties on node " + selectedNode.UniqueId); + m_currentScrollPos = EditorGUILayout.BeginScrollView( m_currentScrollPos, GUILayout.Width( 0 ), GUILayout.Height( 0 ) ); + float labelWidth = EditorGUIUtility.labelWidth; + //if( selectedNode.TextLabelWidth > 0 ) + // EditorGUIUtility.labelWidth = selectedNode.TextLabelWidth; + //else + EditorGUIUtility.labelWidth = TransformedArea.width * 0.42f; + + changeCheck = selectedNode.SafeDrawProperties(); + EditorGUIUtility.labelWidth = labelWidth; + EditorGUILayout.EndScrollView(); + } + EditorGUILayout.EndVertical(); + + if ( changeCheck ) + { + if ( selectedNode.ConnStatus == NodeConnectionStatus.Connected ) + ParentWindow.SetSaveIsDirty(); + } + } + else + { + //Draw Graph Params + EditorGUILayout.BeginVertical(); + { + EditorGUILayout.Separator(); + EditorGUILayout.LabelField( "Graph Properties", m_nodePropertiesStyle ); + EditorGUILayout.Separator(); + + m_currentScrollPos = EditorGUILayout.BeginScrollView( m_currentScrollPos, GUILayout.Width( 0 ), GUILayout.Height( 0 ) ); + float labelWidth = EditorGUIUtility.labelWidth; + EditorGUIUtility.labelWidth = 90; + + bool generalIsVisible = m_parentWindow.InnerWindowVariables.ExpandedGeneralShaderOptions; + NodeUtils.DrawPropertyGroup( ref generalIsVisible, " General", DrawGeneralFunction ); + m_parentWindow.InnerWindowVariables.ExpandedGeneralShaderOptions = generalIsVisible; + AmplifyShaderFunction function = ParentWindow.CurrentGraph.CurrentShaderFunction; + if( function != null ) + { + //function.AdditionalIncludes.Draw( ParentWindow.CurrentGraph.CurrentOutputNode ); + //function.AdditionalPragmas.Draw( ParentWindow.CurrentGraph.CurrentOutputNode ); + function.AdditionalDirectives.Draw( ParentWindow.CurrentGraph.CurrentOutputNode ); + } + + bool inputIsVisible = m_parentWindow.InnerWindowVariables.ExpandedFunctionInputs; + NodeUtils.DrawPropertyGroup( ref inputIsVisible, " Function Inputs", DrawFunctionInputs ); + m_parentWindow.InnerWindowVariables.ExpandedFunctionInputs = inputIsVisible; + + bool swicthIsVisible = m_parentWindow.InnerWindowVariables.ExpandedFunctionSwitches; + NodeUtils.DrawPropertyGroup( ref swicthIsVisible, " Function Switches", DrawFunctionSwitches ); + m_parentWindow.InnerWindowVariables.ExpandedFunctionSwitches = swicthIsVisible; + + bool outputIsVisible = m_parentWindow.InnerWindowVariables.ExpandedFunctionOutputs; + NodeUtils.DrawPropertyGroup( ref outputIsVisible, " Function Outputs", DrawFunctionOutputs ); + m_parentWindow.InnerWindowVariables.ExpandedFunctionOutputs = outputIsVisible; + + bool properties = ParentWindow.InnerWindowVariables.ExpandedProperties; + NodeUtils.DrawPropertyGroup( ref properties, " Material Properties", DrawFunctionProperties ); + ParentWindow.InnerWindowVariables.ExpandedProperties = properties; + + EditorGUIUtility.labelWidth = labelWidth; + EditorGUILayout.EndScrollView(); + } + EditorGUILayout.EndVertical(); + } + } + // Close window area + GUILayout.EndArea(); + } + + PostDraw(); + return changeCheck; + } + + public void DrawGeneralFunction() + { + AmplifyShaderFunction function = ParentWindow.CurrentGraph.CurrentShaderFunction; + if ( function == null ) + return; + + float cacheWidth = EditorGUIUtility.labelWidth; + EditorGUIUtility.labelWidth = 115; + + SerializedObject serializedObject = new UnityEditor.SerializedObject( function ); + + if ( serializedObject != null ) + { + SerializedProperty temo = serializedObject.FindProperty( "m_description" ); + EditorGUILayout.PropertyField( temo, new GUIContent( " Description" ) ); + + SerializedProperty cat = serializedObject.FindProperty( "m_nodeCategory" ); + SerializedProperty ppos = serializedObject.FindProperty( "m_previewPosition" ); + + EditorGUILayout.PropertyField( ppos, new GUIContent( "Preview Position" ) ); + cat.intValue = ParentWindow.CurrentGraph.CurrentOutputNode.EditorGUILayoutPopup( "Category", cat.intValue, UIUtils.CategoryPresets ); + + if( cat.enumValueIndex == 0 ) + { + SerializedProperty custCat = serializedObject.FindProperty( "m_customNodeCategory" ); + EditorGUILayout.PropertyField( custCat, new GUIContent( "Custom" ) ); + } + SerializedProperty hidden = serializedObject.FindProperty( "m_hidden" ); + EditorGUILayout.PropertyField( hidden, new GUIContent( "Hidden" ) ); + serializedObject.ApplyModifiedProperties(); + } + EditorGUIUtility.labelWidth = cacheWidth; + } + + + public void DrawFunctionInputs() + { + List functionInputNodes = UIUtils.FunctionInputList(); + + if ( m_functionInputsReordableList == null || functionInputNodes.Count != m_functionInputsLastCount ) + { + functionInputNodes.Sort( ( x, y ) => { return x.OrderIndex.CompareTo( y.OrderIndex ); } ); + + m_functionInputsReordableList = new ReorderableList( functionInputNodes, typeof( FunctionInput ), true, false, false, false ); + m_functionInputsReordableList.headerHeight = 0; + m_functionInputsReordableList.footerHeight = 0; + m_functionInputsReordableList.showDefaultBackground = false; + + m_functionInputsReordableList.drawElementCallback = ( Rect rect, int index, bool isActive, bool isFocused ) => + { + EditorGUI.LabelField( rect, functionInputNodes[ index ].InputName ); + }; + + m_functionInputsReordableList.onChangedCallback = ( list ) => + { + //for ( int i = 0; i < functionInputNodes.Count; i++ ) + //{ + // functionInputNodes[ i ].OrderIndex = i; + //} + ForceInputReorder( ref functionInputNodes ); + }; + + m_functionInputsLastCount = m_functionInputsReordableList.count; + } + + if ( m_functionInputsReordableList != null ) + { + if ( m_propertyAdjustment == null ) + { + m_propertyAdjustment = new GUIStyle(); + m_propertyAdjustment.padding.left = 17; + } + EditorGUILayout.BeginVertical( m_propertyAdjustment ); + m_functionInputsReordableList.DoLayoutList(); + EditorGUILayout.EndVertical(); + } + } + + public void ForceInputReorder( ref List functionInputNodes ) + { + for( int i = 0; i < functionInputNodes.Count; i++ ) + { + functionInputNodes[ i ].OrderIndex = i; + } + } + + public void DrawFunctionSwitches() + { + List functionSwitchNodes = UIUtils.FunctionSwitchList(); + + if( m_functionSwitchesReordableList == null || functionSwitchNodes.Count != m_functionSwitchesLastCount ) + { + functionSwitchNodes.Sort( ( x, y ) => { return x.OrderIndex.CompareTo( y.OrderIndex ); } ); + + UIUtils.UpdateFunctionSwitchArr(); + + m_functionSwitchesReordableList = new ReorderableList( functionSwitchNodes, typeof( FunctionSwitch ), true, false, false, false ); + m_functionSwitchesReordableList.headerHeight = 0; + m_functionSwitchesReordableList.footerHeight = 0; + m_functionSwitchesReordableList.showDefaultBackground = false; + + m_functionSwitchesReordableList.drawElementCallback = ( Rect rect, int index, bool isActive, bool isFocused ) => + { + EditorGUI.LabelField( rect, functionSwitchNodes[ index ].OptionLabel ); + }; + + m_functionSwitchesReordableList.onChangedCallback = ( list ) => + { + ForceSwitchesReorder(ref functionSwitchNodes ); + }; + + m_functionSwitchesLastCount = m_functionSwitchesReordableList.count; + } + + if( m_functionSwitchesReordableList != null ) + { + if( m_propertyAdjustment == null ) + { + m_propertyAdjustment = new GUIStyle(); + m_propertyAdjustment.padding.left = 17; + } + EditorGUILayout.BeginVertical( m_propertyAdjustment ); + m_functionSwitchesReordableList.DoLayoutList(); + EditorGUILayout.EndVertical(); + } + } + + public void ForceSwitchesReorder( ref List functionSwitchNodes ) + { + for( int i = 0; i < functionSwitchNodes.Count; i++ ) + { + functionSwitchNodes[ i ].OrderIndex = i; + } + + UIUtils.UpdateFunctionSwitchArr(); + } + + public void DrawFunctionOutputs() + { + List functionOutputNodes = UIUtils.FunctionOutputList(); + + if ( m_functionOutputsReordableList == null || functionOutputNodes.Count != m_functionOutputsLastCount ) + { + functionOutputNodes.Sort( ( x, y ) => { return x.OrderIndex.CompareTo( y.OrderIndex ); } ); + + m_functionOutputsReordableList = new ReorderableList( functionOutputNodes, typeof( FunctionOutput ), true, false, false, false ); + m_functionOutputsReordableList.headerHeight = 0; + m_functionOutputsReordableList.footerHeight = 0; + m_functionOutputsReordableList.showDefaultBackground = false; + + m_functionOutputsReordableList.drawElementCallback = ( Rect rect, int index, bool isActive, bool isFocused ) => + { + EditorGUI.LabelField( rect, functionOutputNodes[ index ].OutputName ); + }; + + m_functionOutputsReordableList.onChangedCallback = ( list ) => + { + for ( int i = 0; i < functionOutputNodes.Count; i++ ) + { + functionOutputNodes[ i ].OrderIndex = i; + } + }; + + m_functionOutputsLastCount = m_functionOutputsReordableList.count; + } + + if ( m_functionOutputsReordableList != null ) + { + if ( m_propertyAdjustment == null ) + { + m_propertyAdjustment = new GUIStyle(); + m_propertyAdjustment.padding.left = 17; + } + EditorGUILayout.BeginVertical( m_propertyAdjustment ); + m_functionOutputsReordableList.DoLayoutList(); + EditorGUILayout.EndVertical(); + } + } + + private void RefreshVisibleList( ref List allNodes ) + { + // temp reference for lambda expression + List nodes = allNodes; + m_propertyReordableNodes.Clear(); + + for( int i = 0; i < nodes.Count; i++ ) + { + ReordenatorNode rnode = nodes[ i ] as ReordenatorNode; + if( ( rnode == null || !rnode.IsInside ) && ( !m_propertyReordableNodes.Exists( x => x.PropertyName.Equals( nodes[ i ].PropertyName ) ) ) ) + m_propertyReordableNodes.Add( nodes[ i ] ); + } + + m_propertyReordableNodes.Sort( ( x, y ) => { return x.OrderIndex.CompareTo( y.OrderIndex ); } ); + } + + public void DrawFunctionProperties() + { + List nodes = UIUtils.PropertyNodesList(); + + if( nodes.Count != m_lastCount ) + { + RefreshVisibleList( ref nodes ); + m_lastCount = nodes.Count; + } + + if( m_propertyReordableList == null ) + { + m_propertyReordableList = new ReorderableList( m_propertyReordableNodes, typeof( PropertyNode ), true, false, false, false ) + { + headerHeight = 0, + footerHeight = 0, + showDefaultBackground = false, + + drawElementCallback = ( Rect rect, int index, bool isActive, bool isFocused ) => + { + var first = rect; + first.width *= 0.60f; + EditorGUI.LabelField( first, m_propertyReordableNodes[ index ].PropertyInspectorName ); + var second = rect; + second.width *= 0.4f; + second.x += first.width; + if( GUI.Button( second, m_propertyReordableNodes[ index ].PropertyName, new GUIStyle( "AssetLabel Partial" ) ) ) + { + UIUtils.FocusOnNode( m_propertyReordableNodes[ index ], 1, false ); + } + }, + + onReorderCallback = ( list ) => + { + ReorderList( ref nodes ); + } + }; + ReorderList( ref nodes ); + } + + if( m_propertyReordableList != null ) + { + if( m_propertyAdjustment == null ) + { + m_propertyAdjustment = new GUIStyle(); + m_propertyAdjustment.padding.left = 17; + } + EditorGUILayout.BeginVertical( m_propertyAdjustment ); + m_propertyReordableList.DoLayoutList(); + EditorGUILayout.EndVertical(); + } + } + + public void ForceReordering() + { + List nodes = UIUtils.PropertyNodesList(); + ReorderList( ref nodes ); + + List functionInputNodes = UIUtils.FunctionInputList(); + ForceInputReorder( ref functionInputNodes ); + + List functionSwitchNodes = UIUtils.FunctionSwitchList(); + ForceSwitchesReorder( ref functionSwitchNodes ); + //RecursiveLog(); + } + + private void RecursiveLog() + { + List nodes = UIUtils.PropertyNodesList(); + nodes.Sort( ( x, y ) => { return x.OrderIndex.CompareTo( y.OrderIndex ); } ); + for( int i = 0; i < nodes.Count; i++ ) + { + if( ( nodes[ i ] is ReordenatorNode ) ) + ( nodes[ i ] as ReordenatorNode ).RecursiveLog(); + else + Debug.Log( nodes[ i ].OrderIndex + " " + nodes[ i ].PropertyName ); + } + } + + + private void ReorderList( ref List nodes ) + { + // clear lock list before reordering because of multiple sf being used + for( int i = 0; i < nodes.Count; i++ ) + { + ReordenatorNode rnode = nodes[ i ] as ReordenatorNode; + if ( rnode != null ) + rnode.RecursiveClear(); + } + + int propoffset = 0; + int count = 0; + for ( int i = 0; i < m_propertyReordableNodes.Count; i++ ) + { + ReordenatorNode renode = m_propertyReordableNodes[ i ] as ReordenatorNode; + if ( renode != null ) + { + if ( !renode.IsInside ) + { + m_propertyReordableNodes[ i ].OrderIndex = count + propoffset; + + if ( renode.PropertyListCount > 0 ) + { + propoffset += renode.RecursiveCount(); + + // the same reordenator can exist multiple times, apply ordering to all of them + for( int j = 0; j < nodes.Count; j++ ) + { + ReordenatorNode pnode = ( nodes[ j ] as ReordenatorNode ); + if ( pnode != null && pnode.PropertyName.Equals( renode.PropertyName ) ) + { + pnode.OrderIndex = renode.RawOrderIndex; + pnode.RecursiveSetOrderOffset( renode.RawOrderIndex, true ); + } + } + } + else + { + count++; + } + } + else + { + m_propertyReordableNodes[ i ].OrderIndex = 0; + } + } + else + { + m_propertyReordableNodes[ i ].OrderIndex = count + propoffset; + count++; + } + } + } + + public override void Destroy() + { + base.Destroy(); + m_functionInputsReordableList = null; + m_functionOutputsReordableList = null; + m_propertyReordableList = null; + } + + public bool ForceUpdate + { + get { return m_forceUpdate; } + set { m_forceUpdate = value; } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/NodeParametersWindow.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/NodeParametersWindow.cs.meta new file mode 100644 index 0000000..c49545c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/NodeParametersWindow.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d09f21096aa7c9f438e91a6e7f2621fb +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/NodeWireReferencesUtils.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/NodeWireReferencesUtils.cs new file mode 100644 index 0000000..f1793a2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/NodeWireReferencesUtils.cs @@ -0,0 +1,56 @@ +using UnityEngine; + +namespace AmplifyShaderEditor +{ + public class NodeWireReferencesUtils + { + public WireReference InputPortReference = new WireReference(); + public WireReference SwitchPortReference = new WireReference(); + public WireReference OutputPortReference = new WireReference(); + + public Vector2 SnapPosition = Vector2.zero; + public bool SnapEnabled = false; + public WireReference SnapPort = new WireReference(); + + public bool ValidReferences() + { + return ( InputPortReference.IsValid || OutputPortReference.IsValid ); + } + + public void InvalidateReferences() + { + InputPortReference.Invalidate(); + OutputPortReference.Invalidate(); + SnapPort.Invalidate(); + SnapEnabled = false; + } + + + public void SetOutputReference( int nodeId, int portId, WirePortDataType dataType, bool typeLocked ) + { + if( InputPortReference.IsValid ) + InputPortReference.Invalidate(); + OutputPortReference.SetReference( nodeId, portId, dataType, typeLocked ); + } + + public void SetInputReference( int nodeId, int portId, WirePortDataType dataType, bool typeLocked ) + { + if( OutputPortReference.IsValid ) + OutputPortReference.Invalidate(); + InputPortReference.SetReference( nodeId, portId, dataType, typeLocked ); + } + + public void ActivateSnap( Vector2 position, WirePort port ) + { + SnapPort.SetReference( port ); + SnapEnabled = true; + SnapPosition = position; + } + + public void DeactivateSnap() + { + SnapEnabled = false; + SnapPort.Invalidate(); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/NodeWireReferencesUtils.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/NodeWireReferencesUtils.cs.meta new file mode 100644 index 0000000..6cc9bbe --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/NodeWireReferencesUtils.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: bfbc736093c900c418a7668e3003663a +timeCreated: 1500289690 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Palette.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Palette.meta new file mode 100644 index 0000000..71c4251 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Palette.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a89b03eb735b82a4da19a8381846935f +folderAsset: yes +timeCreated: 1481126946 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Palette/ContextPalette.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Palette/ContextPalette.cs new file mode 100644 index 0000000..ae87061 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Palette/ContextPalette.cs @@ -0,0 +1,101 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using System.Collections.Generic; +using System; + +namespace AmplifyShaderEditor +{ + public sealed class ContextPalette : PaletteParent + { + private Vector3 m_position; + private Vector2 m_startDropPosition; + public ContextPalette( AmplifyShaderEditorWindow parentWindow ) : base( parentWindow, 0, 0, 250, 250, string.Empty, MenuAnchor.NONE, MenuAutoSize.NONE ) + { + m_isActive = false; + OnPaletteNodeCreateEvt += OnOptionSelected; + m_searchFilterControl += "CONTEXTPALETTE"; + } + + public override void OnEnterPressed(int index = 0) + { + if ( m_searchFilter.Length > 0 && m_currentItems.Count > 0 ) + { + FireNodeCreateEvent( m_currentItems[ index ].NodeType, m_currentItems[ index ].Name, m_currentItems[ index ].Function ); + } + else + { + Disable(); + } + } + + public override void OnEscapePressed() + { + Disable(); + if ( m_parentWindow.WireReferenceUtils.ValidReferences() ) + { + m_parentWindow.WireReferenceUtils.InvalidateReferences(); + } + } + + public override void Draw( Rect parentPosition, Vector2 mousePosition, int mouseButtonId, bool hasKeyboadFocus ) + { + //if ( !_isActive ) + // return; + + if ( Event.current.type == EventType.MouseDown && !IsInside( Event.current.mousePosition ) ) + { + Disable(); + return; + } + base.Draw( parentPosition, mousePosition, mouseButtonId, hasKeyboadFocus ); + } + + + public void Show( Vector2 position, Rect cameraInfo ) + { + m_startDropPosition = position; + m_maximizedArea.x = ( position.x + m_maximizedArea.width ) > cameraInfo.width ? ( cameraInfo.width - 1.1f * m_maximizedArea.width ) : position.x; + m_maximizedArea.y = ( position.y + m_maximizedArea.height ) > cameraInfo.height ? ( cameraInfo.height - 1.1f * m_maximizedArea.height ) : position.y; + m_position = new Vector3( m_maximizedArea.x, m_maximizedArea.y, 0f ); + m_isActive = true; + m_focusOnSearch = true; + } + + + // This override is removing focus from our window ... need to figure out a workaround before re-using it + //public override bool CheckButton( GUIContent content, GUIStyle style, int buttonId ) + //{ + // if ( buttonId != m_validButtonId ) + // return false; + + // return GUILayout.Button( content, style ); + //} + + void OnOptionSelected( System.Type type, string name, AmplifyShaderFunction function ) + { + Disable(); + } + + public void Disable() + { + m_isActive = false; + } + + public Vector2 StartDropPosition + { + get { return m_startDropPosition; } + } + + public Vector3 CurrentPosition + { + get { return m_position; } + } + + public Vector2 CurrentPosition2D + { + get { return new Vector2( m_position.x, m_position.y ); } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Palette/ContextPalette.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Palette/ContextPalette.cs.meta new file mode 100644 index 0000000..59f3f89 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Palette/ContextPalette.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 15597b146a1fc154abd63ac75cffb73f +timeCreated: 1481126953 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Palette/PaletteParent.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Palette/PaletteParent.cs new file mode 100644 index 0000000..67ce6e1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Palette/PaletteParent.cs @@ -0,0 +1,573 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using System.Collections.Generic; +using UnityEditor; +using System; +using System.Text.RegularExpressions; + +namespace AmplifyShaderEditor +{ + public class PaletteFilterData + { + public bool Visible; + public bool HasCommunityData; + public List Contents; + public PaletteFilterData( bool visible ) + { + Visible = visible; + Contents = new List(); + } + } + + public class PaletteParent : MenuParent + { + private const float ItemSize = 18; + public delegate void OnPaletteNodeCreate( System.Type type, string name, AmplifyShaderFunction function ); + public event OnPaletteNodeCreate OnPaletteNodeCreateEvt; + + private string m_searchFilterStr = "Search"; + protected string m_searchFilterControl = "SHADERNAMETEXTFIELDCONTROLNAME"; + protected bool m_focusOnSearch = false; + protected bool m_defaultCategoryVisible = false; + + //protected List m_allItems; + protected List m_currentItems; + protected Dictionary m_currentCategories; + private bool m_forceUpdate = true; + + + protected string m_searchFilter = string.Empty; + + private float m_searchLabelSize = -1; + private GUIStyle m_buttonStyle; + private GUIStyle m_foldoutStyle; + + protected bool m_previousWindowIsFunction = false; + + protected int m_validButtonId = 0; + protected int m_initialSeparatorAmount = 1; + + private Vector2 m_currScrollBarDims = new Vector2( 1, 1 ); + + public PaletteParent( AmplifyShaderEditorWindow parentWindow, float x, float y, float width, float height, string name, MenuAnchor anchor = MenuAnchor.NONE, MenuAutoSize autoSize = MenuAutoSize.NONE ) : base( parentWindow, x, y, width, height, name, anchor, autoSize ) + { + m_searchFilter = string.Empty; + m_currentCategories = new Dictionary(); + //m_allItems = items; + m_currentItems = new List(); + } + + public virtual void OnEnterPressed( int index = 0 ) { } + public virtual void OnEscapePressed() { } + + public void FireNodeCreateEvent( System.Type type, string name, AmplifyShaderFunction function ) + { + OnPaletteNodeCreateEvt( type, name, function ); + } + + public override void Draw( Rect parentPosition, Vector2 mousePosition, int mouseButtonId, bool hasKeyboadFocus ) + { + base.Draw( parentPosition, mousePosition, mouseButtonId, hasKeyboadFocus ); + if( m_previousWindowIsFunction != ParentWindow.IsShaderFunctionWindow ) + { + m_forceUpdate = true; + } + + m_previousWindowIsFunction = ParentWindow.IsShaderFunctionWindow; + + List allItems = ParentWindow.ContextMenuInstance.MenuItems; + + if( m_searchLabelSize < 0 ) + { + m_searchLabelSize = GUI.skin.label.CalcSize( new GUIContent( m_searchFilterStr ) ).x; + } + + if( m_foldoutStyle == null ) + { + m_foldoutStyle = new GUIStyle( GUI.skin.GetStyle( "foldout" ) ); + m_foldoutStyle.fontStyle = FontStyle.Bold; + } + + if( m_buttonStyle == null ) + { + m_buttonStyle = UIUtils.Label; + } + + Event currenEvent = Event.current; + + GUILayout.BeginArea( m_transformedArea, m_content, m_style ); + { + for( int i = 0; i < m_initialSeparatorAmount; i++ ) + { + EditorGUILayout.Separator(); + } + + if( currenEvent.type == EventType.KeyDown ) + { + KeyCode key = currenEvent.keyCode; + //if ( key == KeyCode.Return || key == KeyCode.KeypadEnter ) + // OnEnterPressed(); + + if( ( currenEvent.keyCode == KeyCode.KeypadEnter || currenEvent.keyCode == KeyCode.Return ) && currenEvent.type == EventType.KeyDown ) + { + int index = m_currentItems.FindIndex( x => GUI.GetNameOfFocusedControl().Equals( x.ItemUIContent.text + m_resizable ) ); + if( index > -1 ) + OnEnterPressed( index ); + else + OnEnterPressed(); + } + + if( key == KeyCode.Escape ) + OnEscapePressed(); + + if( m_isMouseInside || hasKeyboadFocus ) + { + if( key == ShortcutsManager.ScrollUpKey ) + { + m_currentScrollPos.y -= 10; + if( m_currentScrollPos.y < 0 ) + { + m_currentScrollPos.y = 0; + } + currenEvent.Use(); + } + + if( key == ShortcutsManager.ScrollDownKey ) + { + m_currentScrollPos.y += 10; + currenEvent.Use(); + } + } + + } + + float width = EditorGUIUtility.labelWidth; + EditorGUIUtility.labelWidth = m_searchLabelSize; + EditorGUI.BeginChangeCheck(); + { + GUI.SetNextControlName( m_searchFilterControl + m_resizable ); + m_searchFilter = EditorGUILayout.TextField( m_searchFilterStr, m_searchFilter ); + if( m_focusOnSearch ) + { + m_focusOnSearch = false; + EditorGUI.FocusTextInControl( m_searchFilterControl + m_resizable ); + } + } + if( EditorGUI.EndChangeCheck() ) + m_forceUpdate = true; + + EditorGUIUtility.labelWidth = width; + bool usingSearchFilter = ( m_searchFilter.Length == 0 ); + m_currScrollBarDims.x = m_transformedArea.width; + m_currScrollBarDims.y = m_transformedArea.height - 2 - 16 - 2 - 7 * m_initialSeparatorAmount - 2; + m_currentScrollPos = EditorGUILayout.BeginScrollView( m_currentScrollPos/*, GUILayout.Width( 242 ), GUILayout.Height( 250 - 2 - 16 - 2 - 7 - 2) */); + { + if( m_forceUpdate ) + { + m_forceUpdate = false; + + //m_currentItems.Clear(); + m_currentCategories.Clear(); + + if( usingSearchFilter ) + { + for( int i = 0; i < allItems.Count; i++ ) + { + //m_currentItems.Add( allItems[ i ] ); + if( !m_currentCategories.ContainsKey( allItems[ i ].Category ) ) + { + m_currentCategories.Add( allItems[ i ].Category, new PaletteFilterData( m_defaultCategoryVisible ) ); + //m_currentCategories[ allItems[ i ].Category ].HasCommunityData = allItems[ i ].NodeAttributes.FromCommunity || m_currentCategories[ allItems[ i ].Category ].HasCommunityData; + } + m_currentCategories[ allItems[ i ].Category ].Contents.Add( allItems[ i ] ); + } + } + else + { + for( int i = 0; i < allItems.Count; i++ ) + { + var searchList = m_searchFilter.Trim( ' ' ).ToLower().Split(' '); + + int matchesFound = 0; + for( int k = 0; k < searchList.Length; k++ ) + { + MatchCollection wordmatch = Regex.Matches( allItems[ i ].Tags, "\\b"+searchList[ k ] ); + if( wordmatch.Count > 0 ) + matchesFound++; + else + break; + } + + if( searchList.Length == matchesFound ) + { + //m_currentItems.Add( allItems[ i ] ); + if( !m_currentCategories.ContainsKey( allItems[ i ].Category ) ) + { + m_currentCategories.Add( allItems[ i ].Category, new PaletteFilterData( m_defaultCategoryVisible ) ); + //m_currentCategories[ allItems[ i ].Category ].HasCommunityData = allItems[ i ].NodeAttributes.FromCommunity || m_currentCategories[ allItems[ i ].Category ].HasCommunityData; + } + m_currentCategories[ allItems[ i ].Category ].Contents.Add( allItems[ i ] ); + } + } + } + var categoryEnumerator = m_currentCategories.GetEnumerator(); + while( categoryEnumerator.MoveNext() ) + { + categoryEnumerator.Current.Value.Contents.Sort( ( x, y ) => x.CompareTo( y, usingSearchFilter ) ); + } + + //sort current list respecting categories + m_currentItems.Clear(); + foreach( var item in m_currentCategories ) + { + for( int i = 0; i < item.Value.Contents.Count; i++ ) + { + m_currentItems.Add( item.Value.Contents[ i ] ); + } + } + } + + string watching = string.Empty; + + // unselect the main search field so it can focus list elements next + if( ( currenEvent.keyCode == KeyCode.DownArrow || currenEvent.keyCode == KeyCode.UpArrow ) && m_searchFilter.Length > 0 ) + { + if( GUI.GetNameOfFocusedControl().Equals( m_searchFilterControl + m_resizable ) ) + { + EditorGUI.FocusTextInControl( null ); + } + } + + if( currenEvent.keyCode == KeyCode.DownArrow && currenEvent.type == EventType.KeyDown ) + { + currenEvent.Use(); + + int nextIndex = m_currentItems.FindIndex( x => GUI.GetNameOfFocusedControl().Equals( x.ItemUIContent.text + m_resizable ) ) + 1; + if( nextIndex == m_currentItems.Count ) + nextIndex = 0; + + watching = m_currentItems[ nextIndex ].ItemUIContent.text + m_resizable; + GUI.FocusControl( watching ); + + } + + if( currenEvent.keyCode == KeyCode.UpArrow && currenEvent.type == EventType.KeyDown ) + { + currenEvent.Use(); + + int nextIndex = m_currentItems.FindIndex( x => GUI.GetNameOfFocusedControl().Equals( x.ItemUIContent.text + m_resizable ) ) - 1; + if( nextIndex < 0 ) + nextIndex = m_currentItems.Count - 1; + + watching = m_currentItems[ nextIndex ].ItemUIContent.text + m_resizable; + GUI.FocusControl( watching ); + } + + if( currenEvent.keyCode == KeyCode.Tab ) + { + ContextMenuItem item = m_currentItems.Find( x => GUI.GetNameOfFocusedControl().Equals( x.ItemUIContent.text + m_resizable ) ); + if( item != null ) + { + watching = item.ItemUIContent.text + m_resizable; + } + } + + float currPos = 0; + var enumerator = m_currentCategories.GetEnumerator(); + + float cache = EditorGUIUtility.labelWidth; + while( enumerator.MoveNext() ) + { + var current = enumerator.Current; + bool visible = GUILayout.Toggle( current.Value.Visible, current.Key, m_foldoutStyle ); + if( m_validButtonId == mouseButtonId ) + { + current.Value.Visible = visible; + } + + currPos += ItemSize; + if( m_searchFilter.Length > 0 || current.Value.Visible ) + { + for( int i = 0; i < current.Value.Contents.Count; i++ ) + { + //if ( !IsItemVisible( currPos ) ) + //{ + // // Invisible + // GUILayout.Space( ItemSize ); + //} + //else + { + currPos += ItemSize; + // Visible + EditorGUILayout.BeginHorizontal(); + GUILayout.Space( 16 ); + //if ( m_isMouseInside ) + //{ + // //GUI.SetNextControlName( current.Value.Contents[ i ].ItemUIContent.text ); + // if ( CheckButton( current.Value.Contents[ i ].ItemUIContent, m_buttonStyle, mouseButtonId ) ) + // { + // int controlID = GUIUtility.GetControlID( FocusType.Passive ); + // GUIUtility.hotControl = controlID; + // OnPaletteNodeCreateEvt( current.Value.Contents[ i ].NodeType, current.Value.Contents[ i ].Name, current.Value.Contents[ i ].Function ); + // } + //} + //else + { + Rect thisRect = EditorGUILayout.GetControlRect( false, 16f, EditorStyles.label ); + //if ( m_resizable ) + { + if( GUI.RepeatButton( thisRect, string.Empty, EditorStyles.label ) ) + { + int controlID = GUIUtility.GetControlID( FocusType.Passive ); + GUIUtility.hotControl = controlID; + OnPaletteNodeCreateEvt( current.Value.Contents[ i ].NodeType, current.Value.Contents[ i ].Name, current.Value.Contents[ i ].Function ); + //unfocus to make it focus the next text field correctly + GUI.FocusControl( null ); + } + } + GUI.SetNextControlName( current.Value.Contents[ i ].ItemUIContent.text + m_resizable ); + //EditorGUI.SelectableLabel( thisRect, current.Value.Contents[ i ].ItemUIContent.text, EditorStyles.label ); + //float cache = EditorGUIUtility.labelWidth; + EditorGUIUtility.labelWidth = thisRect.width; + EditorGUI.Toggle( thisRect, current.Value.Contents[ i ].ItemUIContent.text, false, EditorStyles.label ); + EditorGUIUtility.labelWidth = cache; + if( watching == current.Value.Contents[ i ].ItemUIContent.text + m_resizable ) + { + bool boundBottom = currPos - m_currentScrollPos.y > m_currScrollBarDims.y; + bool boundTop = currPos - m_currentScrollPos.y - 4 <= 0; + + if( boundBottom ) + m_currentScrollPos.y = currPos - m_currScrollBarDims.y + 2; + else if( boundTop ) + m_currentScrollPos.y = currPos - 18; + //else if ( boundBottom && !downDirection ) + // m_currentScrollPos.y = currPos - m_currScrollBarDims.y + 2; + //else if ( boundTop && downDirection ) + // m_currentScrollPos.y = currPos - 18; + } + } + EditorGUILayout.EndHorizontal(); + } + //currPos += ItemSize; + } + } + } + EditorGUIUtility.labelWidth = cache; + } + EditorGUILayout.EndScrollView(); + } + GUILayout.EndArea(); + + } + public void CheckCommunityNodes() + { + var enumerator = m_currentCategories.GetEnumerator(); + while( enumerator.MoveNext() ) + { + var current = enumerator.Current; + current.Value.HasCommunityData = false; + int count = current.Value.Contents.Count; + for( int i = 0; i < count; i++ ) + { + if( current.Value.Contents[ i ].NodeAttributes.FromCommunity ) + { + current.Value.HasCommunityData = true; + break; + } + } + } + } + + public void DumpAvailableNodes( bool fromCommunity, string pathname ) + { + string noTOCHeader = "__NOTOC__\n"; + string nodesHeader = "== Available Node Categories ==\n"; + string InitialCategoriesFormat = "[[#{0}|{0}]]
\n"; + string InitialCategories = string.Empty; + string CurrentCategoryFormat = "\n== {0} ==\n\n"; + //string NodesFootFormat = "[[Unity Products:Amplify Shader Editor/{0} | Learn More]] -\n[[#Top|Back to Categories]]\n"; + string NodesFootFormatSep = "[[#Top|Back to Top]]\n----\n"; + string OverallFoot = "[[Category:Nodes]]"; + + string NodeInfoBeginFormat = "
\n"; + string nodeInfoBodyFormat = "{{| id=\"{2}\" class=\"wikitable\" |\n" + + "|- \n" + + "|
[[Unity Products:Amplify Shader Editor/{1}|]]
\n" + + "
\n" + + "{{| style=\"width: 100%; height: 150px;\"\n" + + "|-\n" + + "| [[Unity Products:Amplify Shader Editor/{1}|'''{2}''']]\n" + + "|- style=\"vertical-align:top; height: 100%;\" |\n" + + "|

{3}

\n" + + "|- style=\"text-align:right;\" |\n" + + "|{4}[[Unity Products:Amplify Shader Editor/{1} | Learn More]]\n" + + "|}}
\n" + + "|}}\n"; + string NodeInfoEndFormat = "
\n"; + + //string NodeInfoBeginFormat = "This page is under construction!\n\n"; + //string nodeInfoBodyFormat = "\n[[Unity Products:Amplify Shader Editor/{1}|'''{2}''']]\n\n{3}"; + //string NodeInfoEndFormat = "\n\n[[Unity_Products:Amplify_Shader_Editor/Nodes | Back to Node List ]]\n[[Category:Nodes]][[Category:{0}]]\n\n\n"; + + //string NodeInfoBeginFormat = "{| cellpadding=\"10\"\n"; + //string nodeInfoBodyFormat = "|- style=\"vertical-align:top;\"\n| http://amplify.pt/Nodes/{0}.jpg\n| [[Unity Products:Amplify Shader Editor/{1} | '''{2}''' ]]
{3}\n"; + //string NodeInfoEndFormat = "|}\n"; + + string nodesInfo = string.Empty; + BuildFullList( true ); + CheckCommunityNodes(); + var enumerator = m_currentCategories.GetEnumerator(); + while( enumerator.MoveNext() ) + { + var current = enumerator.Current; + if( fromCommunity && current.Value.HasCommunityData || !fromCommunity ) + { + InitialCategories += string.Format( InitialCategoriesFormat, current.Key ); + nodesInfo += string.Format( CurrentCategoryFormat, current.Key ); + int count = current.Value.Contents.Count; + for( int i = 0; i < count; i++ ) + { + if( ( fromCommunity && current.Value.Contents[ i ].NodeAttributes.FromCommunity ) + || !fromCommunity + //|| ( !fromCommunity && !current.Value.Contents[ i ].NodeAttributes.FromCommunity ) + ) + { + string nodeFullName = current.Value.Contents[ i ].Name; + string pictureFilename = UIUtils.ReplaceInvalidStrings( nodeFullName ); + + string pageFilename = UIUtils.RemoveWikiInvalidCharacters( pictureFilename ); + + pictureFilename = UIUtils.RemoveInvalidCharacters( pictureFilename ); + + string nodeDescription = current.Value.Contents[ i ].ItemUIContent.tooltip; + string communityText = string.Empty; + if( current.Value.Contents[ i ].NodeAttributes.FromCommunity ) + communityText = "( originally by "+ current.Value.Contents[ i ].NodeAttributes.Community + " ) "; + + string nodeInfoBody = string.Format( nodeInfoBodyFormat, pictureFilename, pageFilename, nodeFullName, nodeDescription, communityText ); + //string nodeInfoFoot = string.Format( NodesFootFormat, pageFilename ); + + nodesInfo += ( NodeInfoBeginFormat + nodeInfoBody + NodeInfoEndFormat ); + //nodesInfo += ( NodeInfoBeginFormat + nodeInfoBody + string.Format( NodeInfoEndFormat, current.Key ) ); + //if ( i != ( count - 1 ) ) + //{ + // nodesInfo += NodesFootFormatSep; + //} + } + } + nodesInfo += NodesFootFormatSep; + } + } + + string finalText = noTOCHeader + nodesHeader + InitialCategories + nodesInfo + OverallFoot; + + if( !System.IO.Directory.Exists( pathname ) ) + { + System.IO.Directory.CreateDirectory( pathname ); + } + // Save file + string nodesPathname = pathname + ( fromCommunity ? "AvailableNodesFromCommunity.txt" : "AvailableNodes.txt" ); + Debug.Log( " Creating nodes file at " + nodesPathname ); + IOUtils.SaveTextfileToDisk( finalText, nodesPathname, false ); + BuildFullList( false ); + } + + public virtual bool CheckButton( GUIContent content, GUIStyle style, int buttonId ) + { + if( buttonId != m_validButtonId ) + { + GUILayout.Label( content, style ); + return false; + } + + return GUILayout.RepeatButton( content, style ); + } + + public void FillList( ref List list, bool forceAllItems ) + { + List allList = forceAllItems ? ParentWindow.ContextMenuInstance.ItemFunctions : ParentWindow.ContextMenuInstance.MenuItems; + + list.Clear(); + int count = allList.Count; + for( int i = 0; i < count; i++ ) + { + list.Add( allList[ i ] ); + } + } + + public Dictionary BuildFullList( bool forceAllNodes = false ) + { + //Only need to build if search filter is active and list is set according to it + if( m_searchFilter.Length > 0 || !m_isActive || m_currentCategories.Count == 0 ) + { + m_currentItems.Clear(); + m_currentCategories.Clear(); + + List allItems = forceAllNodes ? ParentWindow.ContextMenuInstance.ItemFunctions : ParentWindow.ContextMenuInstance.MenuItems; + + for( int i = 0; i < allItems.Count; i++ ) + { + if( allItems[ i ].Name.IndexOf( m_searchFilter, StringComparison.InvariantCultureIgnoreCase ) >= 0 || + allItems[ i ].Category.IndexOf( m_searchFilter, StringComparison.InvariantCultureIgnoreCase ) >= 0 + ) + { + m_currentItems.Add( allItems[ i ] ); + if( !m_currentCategories.ContainsKey( allItems[ i ].Category ) ) + { + m_currentCategories.Add( allItems[ i ].Category, new PaletteFilterData( m_defaultCategoryVisible ) ); + //m_currentCategories[ allItems[ i ].Category ].HasCommunityData = allItems[ i ].NodeAttributes.FromCommunity || m_currentCategories[ allItems[ i ].Category ].HasCommunityData; + } + m_currentCategories[ allItems[ i ].Category ].Contents.Add( allItems[ i ] ); + } + } + + var categoryEnumerator = m_currentCategories.GetEnumerator(); + while( categoryEnumerator.MoveNext() ) + { + categoryEnumerator.Current.Value.Contents.Sort( ( x, y ) => x.CompareTo( y, false ) ); + } + + //mark to force update and take search filter into account + m_forceUpdate = true; + } + return m_currentCategories; + } + + private bool IsItemVisible( float currPos ) + { + if( ( currPos < m_currentScrollPos.y && ( currPos + ItemSize ) < m_currentScrollPos.y ) || + ( currPos > ( m_currentScrollPos.y + m_currScrollBarDims.y ) && + ( currPos + ItemSize ) > ( m_currentScrollPos.y + m_currScrollBarDims.y ) ) ) + { + return false; + } + return true; + } + + public override void Destroy() + { + base.Destroy(); + + //m_allItems = null; + + m_currentItems.Clear(); + m_currentItems = null; + + m_currentCategories.Clear(); + m_currentCategories = null; + + OnPaletteNodeCreateEvt = null; + m_buttonStyle = null; + m_foldoutStyle = null; + } + + //public void Clear() { + // m_allItems.Clear(); + // m_allItems = new List(); + //} + + public bool ForceUpdate { get { return m_forceUpdate; } set { m_forceUpdate = value; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Palette/PaletteParent.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Palette/PaletteParent.cs.meta new file mode 100644 index 0000000..b9d921f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Palette/PaletteParent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: df4c2f840dca60a4cb118325ce2febfa +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Palette/PalettePopUp.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Palette/PalettePopUp.cs new file mode 100644 index 0000000..84cfbc4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Palette/PalettePopUp.cs @@ -0,0 +1,73 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; + +namespace AmplifyShaderEditor +{ + public class PalettePopUp + { + private const int DeltaX = 5; + private Rect m_areaSettings; + private Vector2 m_mouseDeltaPos = new Vector2( 10, -10 ); + private bool m_isActive = false; + private GUIContent m_content; + private GUIStyle m_style; + private GUIStyle m_fontStyle; + private GUIContent m_labelContent; + + public PalettePopUp() + { + m_content = new GUIContent( GUIContent.none ); + m_areaSettings = new Rect( 0, 0, 100, 30 ); + m_labelContent = new GUIContent( "Test Label" ); + } + + public void Activate( string label ) + { + m_labelContent.text = label; + m_areaSettings.width = -1; + m_isActive = true; + } + + public void Deactivate() + { + m_isActive = false; + } + + public void Draw( Vector2 mousePos ) + { + if ( m_style == null ) + { + m_style = UIUtils.TextArea; + } + + if ( m_fontStyle == null ) + { + m_fontStyle = new GUIStyle( UIUtils.Label ); + m_fontStyle.fontSize = 15; + } + + if ( m_areaSettings.width < 0 ) + { + m_areaSettings.width = m_fontStyle.CalcSize( m_labelContent ).x + 2 * DeltaX; + } + + m_areaSettings.position = mousePos + m_mouseDeltaPos; + GUI.Label( m_areaSettings, m_content, m_style ); + m_areaSettings.position += new Vector2( DeltaX,DeltaX); + GUI.Label( m_areaSettings, m_labelContent, m_fontStyle ); + } + + public void Destroy() + { + m_content = null; + m_style = null; + } + + public bool IsActive + { + get { return m_isActive; } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Palette/PalettePopUp.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Palette/PalettePopUp.cs.meta new file mode 100644 index 0000000..f0f84d4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Palette/PalettePopUp.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: bc4f137f15efe1d42b7bcbf984ec1545 +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Palette/PaletteWindow.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Palette/PaletteWindow.cs new file mode 100644 index 0000000..f0b6960 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Palette/PaletteWindow.cs @@ -0,0 +1,33 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System.Collections.Generic; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + public sealed class PaletteWindow : PaletteParent + { + public PaletteWindow( AmplifyShaderEditorWindow parentWindow ) : base( parentWindow, 0, 0, 250, 0, string.Empty, MenuAnchor.TOP_RIGHT, MenuAutoSize.MATCH_VERTICAL ) + { + m_searchFilterControl += "PALETTEWINDOW"; + m_initialSeparatorAmount = 4; + SetMinimizedArea( -225, 0, 260, 0 ); + } + + public override void Draw( Rect parentPosition, Vector2 mousePosition, int mouseButtonId, bool hasKeyboadFocus ) + { + if ( m_isMaximized ) + { + base.Draw( parentPosition, mousePosition, mouseButtonId, hasKeyboadFocus ); + } + else + { + InitDraw( parentPosition, mousePosition, mouseButtonId ); + } + PostDraw(); + } + } +} + + diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Palette/PaletteWindow.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Palette/PaletteWindow.cs.meta new file mode 100644 index 0000000..521f776 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Palette/PaletteWindow.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 63408b264ef8cb346a5ce9e559a5ed22 +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/PortLegendInfo.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/PortLegendInfo.cs new file mode 100644 index 0000000..9f76a51 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/PortLegendInfo.cs @@ -0,0 +1,469 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEditor; +using UnityEngine; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + class NodeDescriptionInfo + { + public bool FoldoutValue; + public string Category; + public string[,] Contents; + } + + public sealed class PortLegendInfo : EditorWindow + { + private const string NoASEWindowWarning = "Please Open the ASE to get access to shortcut info"; + private const float PixelSeparator = 5; + private const string EditorShortcutsTitle = "Editor Shortcuts"; + private const string MenuShortcutsTitle = "Menu Shortcuts"; + private const string NodesShortcutsTitle = "Nodes Shortcuts"; + private const string PortShortcutsTitle = "Port Shortcuts"; + private const string PortLegendTitle = "Port Legend"; + private const string NodesDescTitle = "Node Info"; + private const string CompatibleAssetsTitle = "Compatible Assets"; + + private const string KeyboardUsageTemplate = "[{0}] - {1}"; + private const string m_lockedStr = "Locked Port"; + + private const float WindowSizeX = 350; + private const float WindowSizeY = 300; + private const float WindowPosX = 5; + private const float WindowPosY = 5; + + private int TitleLabelWidth = 150; + private Rect m_availableArea; + + private bool m_portAreaFoldout = true; + private bool m_editorShortcutAreaFoldout = true; + private bool m_menuShortcutAreaFoldout = true; + private bool m_nodesShortcutAreaFoldout = true; + private bool m_nodesDescriptionAreaFoldout = true; + private bool m_compatibleAssetsFoldout = true; + + private Vector2 m_currentScrollPos; + + private GUIStyle m_portStyle; + private GUIStyle m_labelStyleBold; + private GUIStyle m_labelStyle; + + private GUIStyle m_nodeInfoLabelStyleBold; + private GUIStyle m_nodeInfoLabelStyle; + + private GUIStyle m_nodeInfoFoldoutStyle; + + private GUIContent m_content = new GUIContent( "Helper", "Shows helper info for ASE users" ); + private bool m_init = true; + + private List m_editorShortcuts = null; + private List m_nodesShortcuts = null; + private List m_nodeDescriptionsInfo = null; + private List m_compatibleAssetsInfo = null; + + public static PortLegendInfo OpenWindow() + { + PortLegendInfo currentWindow = ( PortLegendInfo ) PortLegendInfo.GetWindow( typeof( PortLegendInfo ), false ); + currentWindow.minSize = new Vector2( WindowSizeX, WindowSizeY ); + currentWindow.maxSize = new Vector2( WindowSizeX * 2, 2 * WindowSizeY ); ; + currentWindow.wantsMouseMove = true; + return currentWindow; + } + + public void Init() + { + m_init = false; + wantsMouseMove = false; + titleContent = m_content; + m_portStyle = new GUIStyle( UIUtils.GetCustomStyle( CustomStyle.PortEmptyIcon ) ); + m_portStyle.alignment = TextAnchor.MiddleLeft; + m_portStyle.imagePosition = ImagePosition.ImageOnly; + m_portStyle.margin = new RectOffset( 5, 0, 5, 0 ); + + m_labelStyleBold = new GUIStyle( UIUtils.InputPortLabel ); + m_labelStyleBold.fontStyle = FontStyle.Bold; + m_labelStyleBold.fontSize = ( int ) ( Constants.TextFieldFontSize ); + + + m_labelStyle = new GUIStyle( UIUtils.InputPortLabel ); + m_labelStyle.clipping = TextClipping.Overflow; + m_labelStyle.imagePosition = ImagePosition.TextOnly; + m_labelStyle.contentOffset = new Vector2( -10, 0 ); + m_labelStyle.fontSize = ( int ) ( Constants.TextFieldFontSize ); + + m_nodeInfoLabelStyleBold = new GUIStyle( UIUtils.InputPortLabel ); + m_nodeInfoLabelStyleBold.fontStyle = FontStyle.Bold; + m_nodeInfoLabelStyleBold.fontSize = ( int ) ( Constants.TextFieldFontSize ); + + m_nodeInfoLabelStyle = new GUIStyle( UIUtils.InputPortLabel ); + m_nodeInfoLabelStyle.clipping = TextClipping.Clip; + m_nodeInfoLabelStyle.imagePosition = ImagePosition.TextOnly; + m_nodeInfoLabelStyle.fontSize = ( int ) ( Constants.TextFieldFontSize ); + + + m_nodeInfoFoldoutStyle = new GUIStyle( ( GUIStyle ) "foldout" ); + m_nodeInfoFoldoutStyle.fontStyle = FontStyle.Bold; + + if ( !EditorGUIUtility.isProSkin ) + { + m_labelStyleBold.normal.textColor = m_labelStyle.normal.textColor = Color.black; + m_nodeInfoLabelStyleBold.normal.textColor = m_labelStyle.normal.textColor = Color.black; + m_nodeInfoLabelStyle.normal.textColor = m_labelStyle.normal.textColor = Color.black; + } + + m_availableArea = new Rect( WindowPosX, WindowPosY, WindowSizeX - 2 * WindowPosX, WindowSizeY - 2 * WindowPosY ); + } + + void DrawPort( WirePortDataType type ) + { + EditorGUILayout.BeginHorizontal(); + { + GUI.color = UIUtils.GetColorForDataType( type, false ); + GUILayout.Box( string.Empty, m_portStyle, GUILayout.Width( UIUtils.PortsSize.x ), GUILayout.Height( UIUtils.PortsSize.y ) ); + GUI.color = Color.white; + EditorGUILayout.LabelField( UIUtils.GetNameForDataType( type ), m_labelStyle ); + } + EditorGUILayout.EndHorizontal(); + EditorGUILayout.Separator(); + } + + void OnGUI() + { + if ( !UIUtils.Initialized || UIUtils.CurrentWindow == null ) + { + EditorGUILayout.LabelField( NoASEWindowWarning ); + return; + } + + if ( m_init ) + { + Init(); + } + + TitleLabelWidth = (int)(this.position.width * 0.42f); + + KeyCode key = Event.current.keyCode; + if ( key == ShortcutsManager.ScrollUpKey ) + { + m_currentScrollPos.y -= 10; + if ( m_currentScrollPos.y < 0 ) + { + m_currentScrollPos.y = 0; + } + Event.current.Use(); + } + + if ( key == ShortcutsManager.ScrollDownKey ) + { + m_currentScrollPos.y += 10; + Event.current.Use(); + } + + if ( Event.current.type == EventType.MouseDrag && Event.current.button > 0 ) + { + m_currentScrollPos.x += Constants.MenuDragSpeed * Event.current.delta.x; + if ( m_currentScrollPos.x < 0 ) + { + m_currentScrollPos.x = 0; + } + + m_currentScrollPos.y += Constants.MenuDragSpeed * Event.current.delta.y; + if ( m_currentScrollPos.y < 0 ) + { + m_currentScrollPos.y = 0; + } + } + + m_availableArea = new Rect( WindowPosX, WindowPosY, position.width - 2 * WindowPosX, position.height - 2 * WindowPosY ); + GUILayout.BeginArea( m_availableArea ); + { + if ( GUILayout.Button( "Wiki Page" ) ) + { + Application.OpenURL( Constants.HelpURL ); + } + + m_currentScrollPos = GUILayout.BeginScrollView( m_currentScrollPos ); + { + EditorGUILayout.BeginVertical(); + { + NodeUtils.DrawPropertyGroup( ref m_portAreaFoldout, PortLegendTitle, DrawPortInfo ); + float currLabelWidth = EditorGUIUtility.labelWidth; + EditorGUIUtility.labelWidth = 1; + NodeUtils.DrawPropertyGroup( ref m_editorShortcutAreaFoldout, EditorShortcutsTitle, DrawEditorShortcuts ); + NodeUtils.DrawPropertyGroup( ref m_menuShortcutAreaFoldout, MenuShortcutsTitle, DrawMenuShortcuts ); + NodeUtils.DrawPropertyGroup( ref m_nodesShortcutAreaFoldout, NodesShortcutsTitle, DrawNodesShortcuts ); + NodeUtils.DrawPropertyGroup( ref m_compatibleAssetsFoldout, CompatibleAssetsTitle, DrawCompatibleAssets ); + NodeUtils.DrawPropertyGroup( ref m_nodesDescriptionAreaFoldout, NodesDescTitle, DrawNodeDescriptions ); + EditorGUIUtility.labelWidth = currLabelWidth; + } + EditorGUILayout.EndVertical(); + } + GUILayout.EndScrollView(); + } + GUILayout.EndArea(); + + } + + void DrawPortInfo() + { + Color originalColor = GUI.color; + + DrawPort( WirePortDataType.OBJECT ); + DrawPort( WirePortDataType.INT ); + DrawPort( WirePortDataType.FLOAT ); + DrawPort( WirePortDataType.FLOAT2 ); + DrawPort( WirePortDataType.FLOAT3 ); + DrawPort( WirePortDataType.FLOAT4 ); + DrawPort( WirePortDataType.COLOR ); + DrawPort( WirePortDataType.SAMPLER2D ); + DrawPort( WirePortDataType.FLOAT3x3 ); + DrawPort( WirePortDataType.FLOAT4x4 ); + + EditorGUILayout.BeginHorizontal(); + { + GUI.color = Constants.LockedPortColor; + GUILayout.Box( string.Empty, m_portStyle, GUILayout.Width( UIUtils.PortsSize.x ), GUILayout.Height( UIUtils.PortsSize.y ) ); + GUI.color = Color.white; + EditorGUILayout.LabelField( m_lockedStr, m_labelStyle ); + } + EditorGUILayout.EndHorizontal(); + + GUI.color = originalColor; + } + + public void DrawEditorShortcuts() + { + AmplifyShaderEditorWindow window = UIUtils.CurrentWindow; + if ( window != null ) + { + if ( m_editorShortcuts == null ) + { + m_editorShortcuts = window.ShortcutManagerInstance.AvailableEditorShortcutsList; + } + + EditorGUI.indentLevel--; + int count = m_editorShortcuts.Count; + for ( int i = 0; i < count; i++ ) + { + DrawItem( m_editorShortcuts[ i ].Name, m_editorShortcuts[ i ].Description ); + } + DrawItem( "Q", "Alternative Pan modifier" ); + DrawItem( "Ctrl + F", "Find nodes" ); + DrawItem( "LMB Drag", "Box selection" ); + DrawItem( "MMB/RMB Drag", "Camera pan" ); + DrawItem( "Alt + MMB/RMB Drag", "Zoom graph" ); + DrawItem( "Shift/Ctrl + Node Select", "Add/Remove from selection" ); + DrawItem( "Shift + Node Drag", "Node move with offset" ); + DrawItem( "Ctrl + Node Drag", "Node move with snap" ); + DrawItem( "MMB/RMB + Drag Panel", "Scroll panel" ); + DrawItem( "Alt + LMB Drag", "Additive box selection" ); + DrawItem( "Alt + Shift + Drag", "Subtractive box selection" ); + DrawItem( "Alt + Node Drag", "Auto-(Dis)Connect node on existing wire connection" ); + EditorGUI.indentLevel++; + + } + else + { + EditorGUILayout.LabelField( NoASEWindowWarning ); + } + } + + public void DrawMenuShortcuts() + { + AmplifyShaderEditorWindow window = UIUtils.CurrentWindow; + if ( window != null ) + { + EditorGUI.indentLevel--; + DrawItem( ShortcutsManager.ScrollUpKey.ToString(), "Scroll Up Menu" ); + DrawItem( ShortcutsManager.ScrollDownKey.ToString(), "Scroll Down Menu" ); + DrawItem( "RMB Drag", "Scroll Menu" ); + EditorGUI.indentLevel++; + } + else + { + EditorGUILayout.LabelField( NoASEWindowWarning ); + } + } + + void DrawItem( string name, string description ) + { + GUILayout.BeginHorizontal(); + GUILayout.Label( name, m_labelStyleBold , GUILayout.Width( TitleLabelWidth ) ); + GUILayout.Label( description, m_labelStyle ); + GUILayout.EndHorizontal(); + GUILayout.Space( PixelSeparator ); + } + + public void DrawNodesShortcuts() + { + AmplifyShaderEditorWindow window = UIUtils.CurrentWindow; + if ( window != null ) + { + if ( m_nodesShortcuts == null || m_nodesShortcuts.Count == 0 ) + { + m_nodesShortcuts = window.ShortcutManagerInstance.AvailableNodesShortcutsList; + } + + EditorGUI.indentLevel--; + int count = m_nodesShortcuts.Count; + for ( int i = 0; i < count; i++ ) + { + DrawItem( m_nodesShortcuts[ i ].Name, m_nodesShortcuts[ i ].Description ); + } + EditorGUI.indentLevel++; + } + else + { + EditorGUILayout.LabelField( NoASEWindowWarning ); + } + } + string CreateCompatibilityString( string source ) + { + string[] split = source.Split( '.' ); + if ( split != null && split.Length > 1 ) + { + return split[ 1 ]; + } + else + { + return source; + } + } + public void DrawCompatibleAssets() + { + AmplifyShaderEditorWindow window = UIUtils.CurrentWindow; + if ( window != null ) + { + if ( m_compatibleAssetsInfo == null ) + { + m_compatibleAssetsInfo = new List(); + List items = window.ContextMenuInstance.MenuItems; + int count = items.Count; + for ( int i = 0; i < count; i++ ) + { + if ( items[ i ].NodeAttributes != null && items[ i ].NodeAttributes.CastType != null ) + { + string types = string.Empty; + if ( items[ i ].NodeAttributes.CastType.Length > 1 ) + { + for ( int j = 0; j < items[ i ].NodeAttributes.CastType.Length; j++ ) + { + types += CreateCompatibilityString( items[ i ].NodeAttributes.CastType[ j ].ToString() ); + + + if ( j < items[ i ].NodeAttributes.CastType.Length - 1 ) + { + types += ", "; + } + } + } + else + { + types = CreateCompatibilityString( items[ i ].NodeAttributes.CastType[ 0 ].ToString() ); + } + m_compatibleAssetsInfo.Add( new string[] { items[ i ].NodeAttributes.Name + ": ", types } ); + } + } + } + EditorGUI.indentLevel--; + int nodeCount = m_compatibleAssetsInfo.Count; + for ( int j = 0; j < nodeCount; j++ ) + { + DrawItem( m_compatibleAssetsInfo[ j ][ 0 ], m_compatibleAssetsInfo[ j ][ 1 ] ); + } + EditorGUI.indentLevel++; + } + else + { + EditorGUILayout.LabelField( NoASEWindowWarning ); + } + } + + public void DrawNodeDescriptions() + { + AmplifyShaderEditorWindow window = UIUtils.CurrentWindow; + if ( window != null ) + { + if ( m_nodeDescriptionsInfo == null ) + { + //fetch node info + m_nodeDescriptionsInfo = new List(); + Dictionary nodeData = window.CurrentPaletteWindow.BuildFullList(); + var enumerator = nodeData.GetEnumerator(); + while ( enumerator.MoveNext() ) + { + List nodes = enumerator.Current.Value.Contents; + int count = nodes.Count; + + NodeDescriptionInfo currInfo = new NodeDescriptionInfo(); + currInfo.Contents = new string[ count, 2 ]; + currInfo.Category = enumerator.Current.Key; + + for ( int i = 0; i < count; i++ ) + { + currInfo.Contents[ i, 0 ] = nodes[ i ].Name + ':'; + currInfo.Contents[ i, 1 ] = nodes[ i ].Description; + } + m_nodeDescriptionsInfo.Add( currInfo ); + } + } + + //draw + { + GUILayout.Space( 5 ); + int count = m_nodeDescriptionsInfo.Count; + EditorGUI.indentLevel--; + for ( int i = 0; i < count; i++ ) + { + m_nodeDescriptionsInfo[ i ].FoldoutValue = EditorGUILayout.Foldout( m_nodeDescriptionsInfo[ i ].FoldoutValue, m_nodeDescriptionsInfo[ i ].Category, m_nodeInfoFoldoutStyle ); + if ( m_nodeDescriptionsInfo[ i ].FoldoutValue ) + { + EditorGUI.indentLevel++; + int nodeCount = m_nodeDescriptionsInfo[ i ].Contents.GetLength( 0 ); + for ( int j = 0; j < nodeCount; j++ ) + { + GUILayout.Label( m_nodeDescriptionsInfo[ i ].Contents[ j, 0 ], m_nodeInfoLabelStyleBold ); + GUILayout.Label( m_nodeDescriptionsInfo[ i ].Contents[ j, 1 ], m_nodeInfoLabelStyle ); + GUILayout.Space( PixelSeparator ); + } + EditorGUI.indentLevel--; + } + GUILayout.Space( PixelSeparator ); + } + EditorGUI.indentLevel++; + } + } + else + { + EditorGUILayout.LabelField( NoASEWindowWarning ); + } + } + + private void OnDestroy() + { + m_nodesShortcuts = null; + m_editorShortcuts = null; + m_portStyle = null; + m_labelStyle = null; + m_labelStyleBold = null; + m_nodeInfoLabelStyle = null; + m_nodeInfoLabelStyleBold = null; + m_nodeInfoFoldoutStyle = null; + m_init = false; + + if ( m_nodeDescriptionsInfo != null ) + { + m_nodeDescriptionsInfo.Clear(); + m_nodeDescriptionsInfo = null; + } + + if( m_compatibleAssetsInfo != null ) + { + m_compatibleAssetsInfo.Clear(); + m_compatibleAssetsInfo = null; + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/PortLegendInfo.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/PortLegendInfo.cs.meta new file mode 100644 index 0000000..42646fc --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/PortLegendInfo.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 20dad8f4196f0e643a9c56d1202e74dc +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/SceneSaveCallback.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/SceneSaveCallback.cs new file mode 100644 index 0000000..7b4e51d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/SceneSaveCallback.cs @@ -0,0 +1,40 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + // Catch when scene is saved (Ctr+S) and also save ase shader + public class SceneSaveCallback : UnityEditor.AssetModificationProcessor + { + private const string UnityStr = ".unity"; + + static string[] OnWillSaveAssets( string[] paths ) + { + if( !Preferences.GlobalUpdateOnSceneSave ) + return paths; + + bool canSave = false; + + if ( paths.Length == 0 ) + { + canSave = true; + } + else + { + for ( int i = 0; i < paths.Length; i++ ) + { + // Only save shader when saving scenes + if ( !string.IsNullOrEmpty( paths[ i ] ) && paths[ i ].Contains( UnityStr ) ) + { + canSave = true; + break; + } + } + } + if ( canSave && UIUtils.CurrentWindow ) + UIUtils.CurrentWindow.SetCtrlSCallback( false ); + + return paths; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/SceneSaveCallback.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/SceneSaveCallback.cs.meta new file mode 100644 index 0000000..a91c39b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/SceneSaveCallback.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 708e90c98affcb04aa2fcfedf4329a7c +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ShaderEditorModeWindow.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ShaderEditorModeWindow.cs new file mode 100644 index 0000000..6a987d4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ShaderEditorModeWindow.cs @@ -0,0 +1,192 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + public sealed class ShaderEditorModeWindow : MenuParent + { + private static readonly Color OverallColorOn = new Color( 1f, 1f, 1f, 0.9f ); + private static readonly Color OverallColorOff = new Color( 1f, 1f, 1f, 0.3f ); + private static readonly Color FontColorOff = new Color( 1f, 1f, 1f, 0.4f ); + private const float DeltaY = 15; + private const float DeltaX = 10; + + private const float CollSizeX = 180; + private const float CollSizeY = 70; + + //private static string MatFormat = "MATERIAL\n{0}"; + //private static string ShaderFormat = "SHADER\n{0}"; + //private const string CurrMatStr = "MATERIAL"; + //private const string CurrShaderStr = "SHADER"; + + private const string NoMaterialStr = "No Material"; + private const string NoShaderStr = "No Shader"; + + private bool m_init = true; + private string m_previousShaderName = string.Empty; + private string m_previousMaterialName = string.Empty; + private string m_previousShaderFunctionName = string.Empty; + + private Vector2 m_auxVector2; + private GUIContent m_leftAuxContent = new GUIContent(); + private GUIContent m_rightAuxContent = new GUIContent(); + private GUIStyle m_leftButtonStyle = null; + private GUIStyle m_rightButtonStyle = null; + private Rect m_leftButtonRect; + private Rect m_rightButtonRect; + + public ShaderEditorModeWindow( AmplifyShaderEditorWindow parentWindow ) : base( parentWindow, 0, 0, 0, 0, "ShaderEditorModeWindow", MenuAnchor.BOTTOM_CENTER, MenuAutoSize.NONE ) { } + + public void ConfigStyle( GUIStyle style ) + { + style.normal.textColor = FontColorOff; + style.hover.textColor = FontColorOff; + style.active.textColor = FontColorOff; + style.focused.textColor = FontColorOff; + + style.onNormal.textColor = FontColorOff; + style.onHover.textColor = FontColorOff; + style.onActive.textColor = FontColorOff; + style.onFocused.textColor = FontColorOff; + } + + + public void Draw( Rect graphArea, Vector2 mousePos, Shader currentShader, Material currentMaterial, float usableArea, float leftPos, float rightPos /*, bool showLastSelection*/ ) + { + EventType currentEventType = Event.current.type; + + if( !( currentEventType == EventType.Repaint || currentEventType == EventType.MouseDown || currentEventType == EventType.MouseMove ) ) + return; + + if ( m_init ) + { + m_init = false; + GUIStyle shaderModeTitle = UIUtils.GetCustomStyle( CustomStyle.ShaderModeTitle ); + GUIStyle shaderModeNoShader = UIUtils.GetCustomStyle( CustomStyle.ShaderModeNoShader ); + GUIStyle materialModeTitle = UIUtils.GetCustomStyle( CustomStyle.MaterialModeTitle ); + GUIStyle shaderNoMaterialModeTitle = UIUtils.GetCustomStyle( CustomStyle.ShaderNoMaterialModeTitle ); + + ConfigStyle( shaderModeTitle ); + ConfigStyle( shaderModeNoShader ); + ConfigStyle( materialModeTitle ); + ConfigStyle( shaderNoMaterialModeTitle ); + } + Color buffereredColor = GUI.color; + + MasterNode currentMasterNode = ParentWindow.CurrentGraph.CurrentMasterNode; + // Shader Mode + if ( currentMasterNode != null ) + { + m_leftButtonStyle = UIUtils.GetCustomStyle( currentShader == null ? CustomStyle.ShaderModeNoShader : CustomStyle.ShaderModeTitle ); + m_leftButtonRect = graphArea; + m_leftButtonRect.x = 10 + leftPos; + m_leftButtonRect.y += m_leftButtonRect.height - 38 - 15; + string shaderName = ( currentShader != null ) ? ( currentShader.name ) : NoShaderStr; + + if ( m_previousShaderName != shaderName ) + { + m_previousShaderName = shaderName; + m_leftAuxContent.text = "SHADER\n" + shaderName; + } + + m_auxVector2 = m_leftButtonStyle.CalcSize( m_leftAuxContent ); + m_leftButtonRect.width = m_auxVector2.x + 30 + 4; + m_leftButtonRect.height = 38; + + bool mouseOnTop = m_leftButtonRect.Contains( mousePos ); + GUI.color = mouseOnTop ? OverallColorOn : OverallColorOff; + GUI.Label( m_leftButtonRect, m_leftAuxContent, m_leftButtonStyle ); + + if( currentEventType == EventType.MouseMove && mouseOnTop ) + m_parentWindow.MarkToRepaint(); + + if ( currentEventType == EventType.MouseDown && mouseOnTop && currentShader != null ) + { + Event.current.Use(); + Selection.activeObject = currentShader; + EditorGUIUtility.PingObject( Selection.activeObject ); + } + + // Material Mode + if ( currentMaterial != null ) + { + m_rightButtonStyle = UIUtils.GetCustomStyle( CustomStyle.MaterialModeTitle ); + m_rightButtonRect = graphArea; + string matName = ( currentMaterial != null ) ? ( currentMaterial.name ) : NoMaterialStr; + + if ( m_previousMaterialName != matName ) + { + m_previousMaterialName = matName; + m_rightAuxContent.text = "MATERIAL\n" + matName; + } + + m_auxVector2 = m_rightButtonStyle.CalcSize( m_rightAuxContent ); + m_rightButtonRect.width = m_auxVector2.x + 30 + 4; + m_rightButtonRect.height = 38; + + m_rightButtonRect.x = graphArea.xMax - m_rightButtonRect.width - rightPos - 10; + m_rightButtonRect.y = graphArea.yMax - 38 - 15; + + bool mouseOnTopRight = m_rightButtonRect.Contains( mousePos ); + GUI.color = mouseOnTopRight ? OverallColorOn : OverallColorOff; + GUI.Label( m_rightButtonRect, m_rightAuxContent, m_rightButtonStyle ); + + if( currentEventType == EventType.MouseMove && mouseOnTopRight ) + m_parentWindow.MarkToRepaint(); + + if ( currentEventType == EventType.MouseDown && mouseOnTopRight ) + { + Event.current.Use(); + Selection.activeObject = currentMaterial; + EditorGUIUtility.PingObject( Selection.activeObject ); + } + } + } + + // Shader Function + else if ( currentMasterNode == null && ParentWindow.CurrentGraph.CurrentOutputNode != null ) + { + m_leftButtonStyle = UIUtils.GetCustomStyle( CustomStyle.ShaderFunctionMode ); + m_leftButtonRect = graphArea; + m_leftButtonRect.x = 10 + leftPos; + m_leftButtonRect.y += m_leftButtonRect.height - 38 - 15; + string functionName = ( ParentWindow.CurrentGraph.CurrentShaderFunction != null ) ? ( ParentWindow.CurrentGraph.CurrentShaderFunction.name ) : "No Shader Function"; + + if ( m_previousShaderFunctionName != functionName ) + { + m_previousShaderFunctionName = functionName; + m_leftAuxContent.text = "SHADER FUNCTION\n" + functionName; + } + + m_auxVector2 = m_leftButtonStyle.CalcSize( m_leftAuxContent ); + m_leftButtonRect.width = m_auxVector2.x + 30 + 4; + m_leftButtonRect.height = 38; + + bool mouseOnTop = m_leftButtonRect.Contains( mousePos ); + GUI.color = mouseOnTop ? OverallColorOn : OverallColorOff; + GUI.Label( m_leftButtonRect, m_leftAuxContent, m_leftButtonStyle ); + + if ( currentEventType == EventType.MouseDown && mouseOnTop && ParentWindow.CurrentGraph.CurrentShaderFunction != null ) + { + Event.current.Use(); + Selection.activeObject = ParentWindow.CurrentGraph.CurrentShaderFunction; + EditorGUIUtility.PingObject( Selection.activeObject ); + } + } + + GUI.color = buffereredColor; + } + + public override void Destroy() + { + base.Destroy(); + m_leftAuxContent = null; + m_rightAuxContent = null; + m_leftButtonStyle = null; + m_rightButtonStyle = null; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ShaderEditorModeWindow.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ShaderEditorModeWindow.cs.meta new file mode 100644 index 0000000..5f0a8f6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ShaderEditorModeWindow.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 672d96e3a4f68d44f9456d2fc53d4d73 +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ShaderLibrary.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ShaderLibrary.cs new file mode 100644 index 0000000..e405e2e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ShaderLibrary.cs @@ -0,0 +1,91 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEditor; +using System.Collections.Generic; +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class ShaderLibrary : EditorWindow + { + private const string SHADER_LIB_FILE = "/AmplifyShaderEditor/Resources/ShaderLibrary/ShaderLibrary.txt"; + private bool m_init = false; + private Vector2 m_scrollPos = new Vector2(); + [SerializeField] + private List m_shaders = new List(); + void Init() + { + m_init = true; + string list = IOUtils.LoadTextFileFromDisk( Application.dataPath + SHADER_LIB_FILE ); + if ( String.IsNullOrEmpty( list ) ) + return; + + string[] listArr = list.Split( IOUtils.FIELD_SEPARATOR ); + for ( int i = 0; i < listArr.Length; i++ ) + { + m_shaders.Add( listArr[ i ] ); + } + + UIUtils.MainSkin.customStyles[ 10 ].active.background = Texture2D.whiteTexture; + + UIUtils.MainSkin.customStyles[ 6 ].fixedHeight = UIUtils.MainSkin.customStyles[ 6 ].normal.background.height; + UIUtils.MainSkin.customStyles[ 6 ].fixedWidth = UIUtils.MainSkin.customStyles[ 6 ].normal.background.width; + + UIUtils.MainSkin.customStyles[ 7 ].fixedHeight = UIUtils.MainSkin.customStyles[ 7 ].normal.background.height; + UIUtils.MainSkin.customStyles[ 7 ].fixedWidth = UIUtils.MainSkin.customStyles[ 7 ].normal.background.width; + + UIUtils.MainSkin.customStyles[ 8 ].fixedHeight = UIUtils.MainSkin.customStyles[ 8 ].normal.background.height; + UIUtils.MainSkin.customStyles[ 8 ].fixedWidth = UIUtils.MainSkin.customStyles[ 8 ].normal.background.width; + + UIUtils.MainSkin.customStyles[ 9 ].fixedHeight = UIUtils.MainSkin.customStyles[ 9 ].normal.background.height; + UIUtils.MainSkin.customStyles[ 9 ].fixedWidth = UIUtils.MainSkin.customStyles[ 9 ].normal.background.width; + + } + + void OnGUI() + { + if ( !m_init ) + { + Init(); + } + + Rect availableArea = position; + + availableArea.y = 100f; + availableArea.x = 0.05f * availableArea.width; + availableArea.height *= 0.5f; + availableArea.width *= 0.9f; + EditorGUILayout.BeginVertical(); + { + EditorGUILayout.LabelField( "Shader Library", UIUtils.MainSkin.customStyles[ 5 ] ); + GUILayout.Space( 10 ); + EditorGUILayout.BeginHorizontal(); + { + GUILayout.Space( 0.05f * position.width ); + GUILayout.Button( string.Empty, UIUtils.MainSkin.customStyles[ 8 ] ); + GUILayout.Button( string.Empty, UIUtils.MainSkin.customStyles[ 9 ] ); + GUILayout.Space( 0.8f*position.width ); + GUILayout.Button( string.Empty, UIUtils.MainSkin.customStyles[ 7 ] ); + GUILayout.Button( string.Empty, UIUtils.MainSkin.customStyles[ 6 ] ); + } + EditorGUILayout.EndHorizontal(); + + GUILayout.BeginArea( availableArea ); + m_scrollPos = EditorGUILayout.BeginScrollView( m_scrollPos, UIUtils.MainSkin.box ); + { + for ( int i = 0; i < m_shaders.Count; i++ ) + { + GUILayout.Button( m_shaders[ i ], UIUtils.MainSkin.customStyles[ 10 ] ); + } + } + EditorGUILayout.EndScrollView(); + GUILayout.EndArea(); + } + EditorGUILayout.EndVertical(); + + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ShaderLibrary.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ShaderLibrary.cs.meta new file mode 100644 index 0000000..9a6c519 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/ShaderLibrary.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: cbdd03f297692584391b9dc0625a80ed +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools.meta new file mode 100644 index 0000000..4f19188 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 3857a2f02c659104fa6f0fe94cfe00dd +folderAsset: yes +timeCreated: 1481126945 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsMenuButton.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsMenuButton.cs new file mode 100644 index 0000000..a199463 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsMenuButton.cs @@ -0,0 +1,249 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + public sealed class ToolsMenuButton : ToolsMenuButtonParent + { + public delegate void ToolButtonPressed( ToolButtonType type ); + public event ToolButtonPressed ToolButtonPressedEvt; + + private Rect m_buttonArea; + private List m_buttonTexture; + private string m_buttonTexturePath; + private ToolButtonType m_buttonType; + private GUIStyle m_style; + private bool m_enabled = true; + private bool m_drawOnFunction = true; + + private List m_cachedStates; + private int m_bufferedState = -1; + private string m_bufferedTooltip = string.Empty; + + public ToolsMenuButton( AmplifyShaderEditorWindow parentWindow, ToolButtonType type, float x, float y, float width, float height, string texturePath, string text, string tooltip, float buttonSpacing = -1, bool drawOnFunction = true ) : base( parentWindow, text, tooltip, buttonSpacing ) + { + m_buttonArea = new Rect( x, y, width, height ); + m_buttonType = type; + + m_buttonTexturePath = texturePath; + m_cachedStates = new List(); + m_drawOnFunction = drawOnFunction; + } + + public void AddState( string state ) + { + m_cachedStates.Add( state ); + } + + public override void Destroy() + { + ToolButtonPressedEvt = null; + if ( m_buttonTexture != null ) + { + for ( int i = 0; i < m_buttonTexture.Count; i++ ) + { + Resources.UnloadAsset( m_buttonTexture[ i ] ); + } + m_buttonTexture.Clear(); + } + m_buttonTexture = null; + } + protected override void Init() + { + base.Init(); + if ( m_buttonTexture == null ) + { + m_buttonTexturePath = AssetDatabase.GUIDToAssetPath( m_buttonTexturePath ); + m_buttonTexture = new List(); + m_buttonTexture.Add( AssetDatabase.LoadAssetAtPath( m_buttonTexturePath, typeof( Texture2D ) ) as Texture2D ); + } + + if ( m_cachedStates.Count > 0 ) + { + for ( int i = 0; i < m_cachedStates.Count; i++ ) + { + m_cachedStates[ i ] = AssetDatabase.GUIDToAssetPath( m_cachedStates[ i ] ); + m_buttonTexture.Add( AssetDatabase.LoadAssetAtPath( m_cachedStates[ i ], typeof( Texture2D ) ) as Texture2D ); + } + m_cachedStates.Clear(); + } + + if ( m_style == null ) + { + m_style = new GUIStyle( /*UIUtils.Button*/ GUIStyle.none ); + m_style.normal.background = m_buttonTexture[ 0 ]; + + m_style.hover.background = m_buttonTexture[ 0 ]; + m_style.hover.textColor = m_style.normal.textColor; + + m_style.active.background = m_buttonTexture[ 0 ]; + m_style.active.textColor = m_style.normal.textColor; + + m_style.onNormal.background = m_buttonTexture[ 0 ]; + m_style.onNormal.textColor = m_style.normal.textColor; + + m_style.onHover.background = m_buttonTexture[ 0 ]; + m_style.onHover.textColor = m_style.normal.textColor; + + m_style.onActive.background = m_buttonTexture[ 0 ]; + m_style.onActive.textColor = m_style.normal.textColor; + + m_style.clipping = TextClipping.Overflow; + m_style.fontStyle = FontStyle.Bold; + m_style.alignment = TextAnchor.LowerCenter; + m_style.contentOffset = new Vector2( 0, 15 ); + m_style.fontSize = 10; + bool resizeFromTexture = false; + if ( m_buttonArea.width > 0 ) + { + m_style.fixedWidth = m_buttonArea.width; + } + else + { + resizeFromTexture = true; + } + + if ( m_buttonArea.height > 0 ) + { + m_style.fixedHeight = m_buttonArea.height; + } + else + { + resizeFromTexture = true; + } + + if ( resizeFromTexture ) + { + m_buttonArea.width = m_style.fixedWidth = m_buttonTexture[ 0 ].width; + m_buttonArea.height = m_style.fixedHeight = m_buttonTexture[ 0 ].height; + } + } + + } + public override void Draw() + { + base.Draw(); + bool guiEnabledBuffer = GUI.enabled; + GUI.enabled = m_enabled; + + if ( GUILayout.Button( m_content, m_style ) && ToolButtonPressedEvt != null ) + { + ToolButtonPressedEvt( m_buttonType ); + } + GUI.enabled = guiEnabledBuffer; + } + + public override void Draw( float x, float y ) + { + if ( !(m_parentWindow.CameraDrawInfo.CurrentEventType == EventType.MouseDown || m_parentWindow.CameraDrawInfo.CurrentEventType == EventType.Repaint ) ) + return; + + if ( m_parentWindow.CurrentGraph.CurrentMasterNode == null && !m_drawOnFunction) + return; + + + base.Draw( x, y ); + + if ( m_bufferedState > -1 ) + { + if ( string.IsNullOrEmpty( m_bufferedTooltip ) ) + { + SetStateOnButton( m_bufferedState ); + } + else + { + SetStateOnButton( m_bufferedState, m_bufferedTooltip ); + } + + m_bufferedState = -1; + m_bufferedTooltip = string.Empty; + } + + + m_buttonArea.x = x; + m_buttonArea.y = y; + + if ( m_parentWindow.CameraDrawInfo.CurrentEventType == EventType.MouseDown && m_buttonArea.Contains( m_parentWindow.CameraDrawInfo.MousePosition ) && ToolButtonPressedEvt != null ) + { + ToolButtonPressedEvt( m_buttonType ); + Event.current.Use(); + m_parentWindow.CameraDrawInfo.CurrentEventType = EventType.Used; + } + else if ( m_parentWindow.CameraDrawInfo.CurrentEventType == EventType.Repaint ) + { + GUI.Label( m_buttonArea, m_content, m_style ); + } + + //if ( GUI.Button( m_buttonArea, m_content, m_style ) && ToolButtonPressedEvt != null ) + //{ + // ToolButtonPressedEvt( m_buttonType ); + //} + } + + public override void Draw( Vector2 pos ) + { + Draw( pos.x, pos.y ); + } + + public override void SetStateOnButton( int state, string tooltip ) + { + + if ( m_buttonTexture == null || m_style == null ) + { + m_bufferedState = state; + m_bufferedTooltip = tooltip; + return; + } + + + if ( state < 0 || state >= m_buttonTexture.Count ) + { + return; + } + + base.SetStateOnButton( state, tooltip ); + m_style.normal.background = m_buttonTexture[ state ]; + m_style.hover.background = m_buttonTexture[ state ]; + m_style.active.background = m_buttonTexture[ state ]; + m_style.onNormal.background = m_buttonTexture[ state ]; + m_style.onHover.background = m_buttonTexture[ state ]; + m_style.onActive.background = m_buttonTexture[ state ]; + } + + public override void SetStateOnButton( int state ) + { + if ( m_buttonTexture == null || m_style == null ) + { + m_bufferedState = state; + return; + } + + if ( state < 0 || state >= m_buttonTexture.Count ) + { + return; + } + base.SetStateOnButton( state ); + m_style.normal.background = m_buttonTexture[ state ]; + m_style.hover.background = m_buttonTexture[ state ]; + m_style.active.background = m_buttonTexture[ state ]; + m_style.onNormal.background = m_buttonTexture[ state ]; + m_style.onHover.background = m_buttonTexture[ state ]; + m_style.onActive.background = m_buttonTexture[ state ]; + } + + public bool IsInside( Vector2 pos ) + { + return m_buttonArea.Contains( pos ); + } + + public bool Enabled + { + get { return m_enabled; } + set { m_enabled = value; } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsMenuButton.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsMenuButton.cs.meta new file mode 100644 index 0000000..11180c8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsMenuButton.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 890f4ed5c9f62af43bda6584705fa0be +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsMenuButtonParent.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsMenuButtonParent.cs new file mode 100644 index 0000000..b3136b4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsMenuButtonParent.cs @@ -0,0 +1,75 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; + +namespace AmplifyShaderEditor +{ + public class ToolsMenuButtonParent + { + protected AmplifyShaderEditorWindow m_parentWindow = null; + private float m_buttonSpacing = 10; + private int m_currentState = 0; + private bool m_isInitialized = false; + protected GUIContent m_content; + public ToolsMenuButtonParent( AmplifyShaderEditorWindow parentWindow, string text, string tooltip, float buttonSpacing ) + { + m_parentWindow = parentWindow; + m_content = new GUIContent( text, tooltip ); + + if ( buttonSpacing > 0 ) + m_buttonSpacing = buttonSpacing; + } + + public virtual void Draw() + { + if ( !m_isInitialized ) + { + Init(); + } + + //GUILayout.Space( m_buttonSpacing ); + } + + public virtual void Draw( Vector2 pos ) + { + Draw( pos.x, pos.y ); + } + + public virtual void Draw( float x ,float y ) + { + if ( !m_isInitialized ) + { + Init(); + } + } + + protected virtual void Init() + { + m_isInitialized = false; + } + + public virtual void SetStateOnButton( int state, string tooltip ) + { + m_currentState = state; + m_content.tooltip = tooltip; + } + + public virtual void SetStateOnButton( int state ) + { + m_currentState = state; + } + + public virtual void Destroy() { } + + public float ButtonSpacing + { + get { return m_buttonSpacing; } + } + + public int CurrentState + { + get { return m_currentState; } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsMenuButtonParent.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsMenuButtonParent.cs.meta new file mode 100644 index 0000000..b14de18 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsMenuButtonParent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a3bf3644c2c2fbb4fa0dd8b86effc6e1 +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsMenuButtonSep.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsMenuButtonSep.cs new file mode 100644 index 0000000..69d11eb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsMenuButtonSep.cs @@ -0,0 +1,41 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + public sealed class ToolsMenuButtonSep : ToolsMenuButtonParent + { + private Color m_splitterColor = EditorGUIUtility.isProSkin ? new Color( 0.157f, 0.157f, 0.157f ) : new Color( 0.5f, 0.5f, 0.5f ); + [SerializeField] + private GUIStyle m_sepStyle; + public ToolsMenuButtonSep( AmplifyShaderEditorWindow parentWindow = null, string text = null, string tooltip = null, float buttonSpacing = -1 ) : base( parentWindow, text, tooltip, buttonSpacing ) { } + + public override void Draw() + { + base.Draw(); + if ( m_sepStyle == null ) + { + m_sepStyle = new GUIStyle(); + m_sepStyle.normal.background = Texture2D.whiteTexture; + m_sepStyle.hover.background = Texture2D.whiteTexture; + m_sepStyle.active.background = Texture2D.whiteTexture; + m_sepStyle.onNormal.background = Texture2D.whiteTexture; + m_sepStyle.onHover.background = Texture2D.whiteTexture; + m_sepStyle.onActive.background = Texture2D.whiteTexture; + m_sepStyle.stretchHeight = true; + } + Color originalColor = GUI.color; + GUI.color = m_splitterColor; + GUILayout.Box( string.Empty, m_sepStyle, GUILayout.MaxWidth( 2 ), GUILayout.ExpandHeight( true ) ); + GUI.color = originalColor; + } + + public override void Destroy() + { + m_sepStyle = null; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsMenuButtonSep.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsMenuButtonSep.cs.meta new file mode 100644 index 0000000..5567293 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsMenuButtonSep.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b4c65a9d96791c34eb587cea9662161f +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsWindow.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsWindow.cs new file mode 100644 index 0000000..ccb0f4b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsWindow.cs @@ -0,0 +1,632 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + public enum ToolButtonType + { + Update = 0, + Live, + OpenSourceCode, + CleanUnusedNodes, + //SelectShader, + New, + Open, + Save, + Library, + Options, + Help, + MasterNode, + FocusOnMasterNode, + FocusOnSelection, + ShowInfoWindow, + ShowTipsWindow, + ShowConsole, + TakeScreenshot, + Share + } + + public enum ToolbarType + { + File, + Help + } + + public class ToolbarMenuTab + { + private Rect m_tabArea; + private GenericMenu m_tabMenu; + public ToolbarMenuTab( float x, float y, float width, float height ) + { + m_tabMenu = new GenericMenu(); + m_tabArea = new Rect( x, y, width, height ); + } + + public void ShowMenu() + { + m_tabMenu.DropDown( m_tabArea ); + } + + public void AddItem( string itemName, GenericMenu.MenuFunction callback ) + { + m_tabMenu.AddItem( new GUIContent( itemName ), false, callback ); + } + } + + [Serializable] + public sealed class ToolsWindow : MenuParent + { + private static readonly Color RightIconsColorOff = new Color( 1f, 1f, 1f, 0.8f ); + private static readonly Color LeftIconsColorOff = new Color( 1f, 1f, 1f, 0.5f ); + + private static readonly Color RightIconsColorOn = new Color( 1f, 1f, 1f, 1.0f ); + private static readonly Color LeftIconsColorOn = new Color( 1f, 1f, 1f, 0.8f ); + + private const float TabY = 9; + private const float TabX = 5; + private const string ShaderFileTitleStr = "Current Shader"; + private const string FileToolbarStr = "File"; + private const string HelpToolbarStr = "Help"; + private const string LiveShaderStr = "Live Shader"; + private const string LoadOnSelectionStr = "Load on selection"; + private const string CurrentObjectStr = "Current Object: "; + + + public ToolsMenuButton.ToolButtonPressed ToolButtonPressedEvt; + //private GUIStyle m_toolbarButtonStyle; + private GUIStyle m_toggleStyle; + private GUIStyle m_borderStyle; + + // left + private ToolsMenuButton m_updateButton; + private ToolsMenuButton m_liveButton; + private ToolsMenuButton m_openSourceCodeButton; + + //middle right + private ToolsMenuButton m_cleanUnusedNodesButton; + private ToolsMenuButton m_focusOnMasterNodeButton; + private ToolsMenuButton m_focusOnSelectionButton; + + // right + private ToolsMenuButton m_shareButton; + private ToolsMenuButton m_takeScreenshotButton; + private ToolsMenuButton m_showInfoWindowButton; + + // hidden + private ToolsMenuButton m_showTipsWindowButton; + private ToolsMenuButton m_showConsoleWindowButton; + + //Used for collision detection to invalidate inputs on graph area + private Rect m_areaLeft = new Rect( 0, 0, 140, 40 ); + private Rect m_areaRight = new Rect( 0, 0, 75, 40 ); + private Rect m_boxRect; + private Rect m_borderRect; + + public const double InactivityRefreshTime = 0.25; + private int m_currentSelected = 0; + + //Search Bar + private const string SearchBarId = "ASE_SEARCH_BAR"; + private bool m_searchBarVisible = false; + private bool m_selectSearchBarTextfield = false; + private bool m_refreshSearchResultList = false; + + private Rect m_searchBarSize; + private string m_searchBarValue = string.Empty; + private List m_searchResultNodes = new List(); + + // width and height are between [0,1] and represent a percentage of the total screen area + public ToolsWindow( AmplifyShaderEditorWindow parentWindow ) : base( parentWindow, 0, 0, 0, 64, "Tools", MenuAnchor.TOP_LEFT, MenuAutoSize.NONE ) + { + m_updateButton = new ToolsMenuButton( m_parentWindow, ToolButtonType.Update, 0, 0, -1, -1, IOUtils.UpdateOutdatedGUID, string.Empty, "Create and apply shader to material.", 5 ); + m_updateButton.ToolButtonPressedEvt += OnButtonPressedEvent; + m_updateButton.AddState( IOUtils.UpdateOFFGUID ); + m_updateButton.AddState( IOUtils.UpdateUpToDatedGUID ); + + m_liveButton = new ToolsMenuButton( m_parentWindow, ToolButtonType.Live, 0, 0, -1, -1, IOUtils.LiveOffGUID, string.Empty, "Automatically saves shader when canvas is changed.", 50 ); + m_liveButton.ToolButtonPressedEvt += OnButtonPressedEvent; + m_liveButton.AddState( IOUtils.LiveOnGUID ); + m_liveButton.AddState( IOUtils.LivePendingGUID ); + + //ToolsMenuButton cleanUnusedNodesButton = new ToolsMenuButton( m_parentWindow, ToolButtonType.CleanUnusedNodes, 0, 0, -1, -1, IOUtils.CleanupOFFGUID, string.Empty, "Remove all nodes not connected to the master node.", 77 ); + //cleanUnusedNodesButton.ToolButtonPressedEvt += OnButtonPressedEvent; + //cleanUnusedNodesButton.AddState( IOUtils.CleanUpOnGUID ); + //m_list[ ( int ) ToolButtonType.CleanUnusedNodes ] = cleanUnusedNodesButton; + + m_openSourceCodeButton = new ToolsMenuButton( m_parentWindow, ToolButtonType.OpenSourceCode, 0, 0, -1, -1, IOUtils.OpenSourceCodeOFFGUID, string.Empty, "Open shader file in your default shader editor.", 80, false ); + m_openSourceCodeButton.ToolButtonPressedEvt += OnButtonPressedEvent; + m_openSourceCodeButton.AddState( IOUtils.OpenSourceCodeONGUID ); + + + // middle right + m_cleanUnusedNodesButton = new ToolsMenuButton( m_parentWindow, ToolButtonType.CleanUnusedNodes, 0, 0, -1, -1, IOUtils.CleanupOFFGUID, string.Empty, "Remove all nodes not connected to the master node.", 77 ); + m_cleanUnusedNodesButton.ToolButtonPressedEvt += OnButtonPressedEvent; + m_cleanUnusedNodesButton.AddState( IOUtils.CleanUpOnGUID ); + + m_focusOnMasterNodeButton = new ToolsMenuButton( m_parentWindow, ToolButtonType.FocusOnMasterNode, 0, 0, -1, -1, IOUtils.FocusNodeGUID, string.Empty, "Focus on active master node.", -1, false ); + m_focusOnMasterNodeButton.ToolButtonPressedEvt += OnButtonPressedEvent; + + m_focusOnSelectionButton = new ToolsMenuButton( m_parentWindow, ToolButtonType.FocusOnSelection, 0, 0, -1, -1, IOUtils.FitViewGUID, string.Empty, "Focus on selection or fit to screen if none selected." ); + m_focusOnSelectionButton.ToolButtonPressedEvt += OnButtonPressedEvent; + + + // right + m_shareButton = new ToolsMenuButton( m_parentWindow, ToolButtonType.Share, 0, 0, -1, -1, IOUtils.ShareOFFGUID, string.Empty, "Share selection", 100 ); + m_shareButton.ToolButtonPressedEvt += OnButtonPressedEvent; + m_shareButton.AddState( IOUtils.ShareONGUID ); + + m_takeScreenshotButton = new ToolsMenuButton( m_parentWindow, ToolButtonType.TakeScreenshot, 0, 0, -1, -1, IOUtils.TakeScreenshotOFFGUID, string.Empty, "Take ScreenShot (WINDOWS ONLY).", 100 ); + m_takeScreenshotButton.ToolButtonPressedEvt += OnButtonPressedEvent; + m_takeScreenshotButton.AddState( IOUtils.TakeScreenshotONGUID ); + + m_showInfoWindowButton = new ToolsMenuButton( m_parentWindow, ToolButtonType.ShowInfoWindow, 0, 0, -1, -1, IOUtils.ShowInfoWindowGUID, string.Empty, "Open Helper Window." ); + m_showInfoWindowButton.ToolButtonPressedEvt += OnButtonPressedEvent; + + + // hidden + m_showTipsWindowButton = new ToolsMenuButton( m_parentWindow, ToolButtonType.ShowTipsWindow, 0, 0, -1, -1, IOUtils.ShowTipsWindowGUID, string.Empty, "Open Quick Tips!" ); + m_showTipsWindowButton.ToolButtonPressedEvt += OnButtonPressedEvent; + + m_showConsoleWindowButton = new ToolsMenuButton( m_parentWindow, ToolButtonType.ShowConsole, 0, 0, -1, -1, IOUtils.ShowConsoleWindowGUID, string.Empty, "Show internal console", 74 ); + m_showConsoleWindowButton.ToolButtonPressedEvt += OnButtonPressedEvent; + m_showConsoleWindowButton.AddState( IOUtils.ShowConsoleWindowGUID ); + + m_searchBarSize = new Rect( 0, TabY + 4, 110, 60 ); + } + + void OnShowPortLegend() + { + ParentWindow.ShowPortInfo(); + } + + override public void Destroy() + { + base.Destroy(); + //for ( int i = 0; i < m_list.Length; i++ ) + //{ + // m_list[ i ].Destroy(); + //} + //m_list = null; + + m_searchResultNodes.Clear(); + m_searchResultNodes = null; + + m_updateButton.Destroy(); + m_updateButton = null; + + m_liveButton.Destroy(); + m_liveButton = null; + + m_openSourceCodeButton.Destroy(); + m_openSourceCodeButton = null; + + m_focusOnMasterNodeButton.Destroy(); + m_focusOnMasterNodeButton = null; + + m_focusOnSelectionButton.Destroy(); + m_focusOnSelectionButton = null; + + m_showInfoWindowButton.Destroy(); + m_showInfoWindowButton = null; + + m_takeScreenshotButton.Destroy(); + m_takeScreenshotButton = null; + + m_shareButton.Destroy(); + m_shareButton = null; + + m_showTipsWindowButton.Destroy(); + m_showTipsWindowButton = null; + + m_cleanUnusedNodesButton.Destroy(); + m_cleanUnusedNodesButton = null; + + m_showConsoleWindowButton.Destroy(); + m_showConsoleWindowButton = null; + } + + void OnButtonPressedEvent( ToolButtonType type ) + { + if ( ToolButtonPressedEvt != null ) + ToolButtonPressedEvt( type ); + } + + public override void Draw( Rect parentPosition, Vector2 mousePosition, int mouseButtonId, bool hasKeyboadFocus ) + { + base.Draw( parentPosition, mousePosition, mouseButtonId, hasKeyboadFocus ); + + Color bufferedColor = GUI.color; + m_areaLeft.x = m_transformedArea.x + TabX; + m_areaRight.x = m_transformedArea.x + m_transformedArea.width - 75 - TabX; + + //if ( m_toolbarButtonStyle == null ) + //{ + // m_toolbarButtonStyle = new GUIStyle( UIUtils.Button ); + // m_toolbarButtonStyle.fixedWidth = 100; + //} + + if ( m_toggleStyle == null ) + { + m_toggleStyle = UIUtils.Toggle; + } + + //for ( int i = 0; i < m_list.Length; i++ ) + //{ + // GUI.color = m_list[ i ].IsInside( mousePosition ) ? LeftIconsColorOn : LeftIconsColorOff; + // m_list[ i ].Draw( TabX + m_transformedArea.x + m_list[ i ].ButtonSpacing, TabY ); + //} + GUI.color = m_updateButton.IsInside( mousePosition ) ? LeftIconsColorOn : LeftIconsColorOff; + m_updateButton.Draw( TabX + m_transformedArea.x + m_updateButton.ButtonSpacing, TabY ); + + GUI.color = m_liveButton.IsInside( mousePosition ) ? LeftIconsColorOn : LeftIconsColorOff; + m_liveButton.Draw( TabX + m_transformedArea.x + m_liveButton.ButtonSpacing, TabY ); + + GUI.color = m_openSourceCodeButton.IsInside( mousePosition ) ? LeftIconsColorOn : LeftIconsColorOff; + m_openSourceCodeButton.Draw( TabX + m_transformedArea.x + m_openSourceCodeButton.ButtonSpacing, TabY ); + + if ( m_searchBarVisible ) + { + m_searchBarSize.x = m_transformedArea.x + m_transformedArea.width - 320 - TabX; + string currentFocus = GUI.GetNameOfFocusedControl(); + + if ( Event.current.type == EventType.KeyDown ) + { + KeyCode keyCode = Event.current.keyCode; + if ( Event.current.shift ) + { + if ( keyCode == KeyCode.F3 || + ( ( keyCode == KeyCode.KeypadEnter || keyCode == KeyCode.Return ) && + ( currentFocus.Equals( SearchBarId ) || string.IsNullOrEmpty( currentFocus ) ) ) ) + SelectPrevious(); + } + else + { + if ( keyCode == KeyCode.F3 || + ( ( keyCode == KeyCode.KeypadEnter || keyCode == KeyCode.Return ) && + ( currentFocus.Equals( SearchBarId ) || string.IsNullOrEmpty( currentFocus ) ) ) ) + SelectNext(); + } + } + + if( currentFocus.Equals( SearchBarId ) || ( m_parentWindow.CameraDrawInfo.CurrentEventType == EventType.MouseDown && m_searchBarSize.Contains( m_parentWindow.CameraDrawInfo.MousePosition ) ) || m_selectSearchBarTextfield ) + { + EditorGUI.BeginChangeCheck(); + { + GUI.SetNextControlName( SearchBarId ); + m_searchBarValue = EditorGUI.TextField( m_searchBarSize, m_searchBarValue, UIUtils.ToolbarSearchTextfield ); + } + if ( EditorGUI.EndChangeCheck() ) + { + m_refreshSearchResultList = true; + } + } else + { + GUI.Label( m_searchBarSize, m_searchBarValue, UIUtils.ToolbarSearchTextfield ); + } + + m_searchBarSize.x += m_searchBarSize.width; + if ( m_parentWindow.CameraDrawInfo.CurrentEventType == EventType.MouseDown && m_searchBarSize.Contains( m_parentWindow.CameraDrawInfo.MousePosition ) ) + { + if ( string.IsNullOrEmpty( m_searchBarValue ) ) + { + m_searchBarVisible = false; + m_refreshSearchResultList = false; + } + else + { + m_searchBarValue = string.Empty; + m_searchResultNodes.Clear(); + m_currentSelected = -1; + } + } + + GUI.Label( m_searchBarSize, string.Empty, UIUtils.ToolbarSearchCancelButton ); + + + + if ( Event.current.isKey && Event.current.keyCode == KeyCode.Escape ) + { + m_searchBarVisible = false; + m_refreshSearchResultList = false; + GUI.FocusControl( null ); + m_selectSearchBarTextfield = false; + } + + if ( m_refreshSearchResultList && ( m_parentWindow.CurrentInactiveTime > InactivityRefreshTime ) ) + { + RefreshList(); + } + } + + if ( m_selectSearchBarTextfield ) + { + m_selectSearchBarTextfield = false; + EditorGUI.FocusTextInControl( SearchBarId ); + //GUI.FocusControl( SearchBarId ); + } + + //if ( Event.current.control && Event.current.isKey && Event.current.keyCode == KeyCode.F && Event.current.type == EventType.KeyDown ) + if( m_parentWindow.CurrentCommandName.Equals("Find") ) + { + if ( !m_searchBarVisible ) + { + m_searchBarVisible = true; + m_refreshSearchResultList = false; + } + m_selectSearchBarTextfield = true; + } + + GUI.color = m_shareButton.IsInside( mousePosition ) ? RightIconsColorOn : RightIconsColorOff; + m_shareButton.Draw( m_transformedArea.x + m_transformedArea.width - 195 - TabX, TabY ); + + GUI.color = m_takeScreenshotButton.IsInside( mousePosition ) ? RightIconsColorOn : RightIconsColorOff; + m_takeScreenshotButton.Draw( m_transformedArea.x + m_transformedArea.width - 165 - TabX, TabY ); + + + + GUI.color = m_focusOnSelectionButton.IsInside( mousePosition ) ? RightIconsColorOn : RightIconsColorOff; + m_focusOnSelectionButton.Draw( m_transformedArea.x + m_transformedArea.width - 120 - TabX, TabY ); + + GUI.color = m_focusOnMasterNodeButton.IsInside( mousePosition ) ? RightIconsColorOn : RightIconsColorOff; + m_focusOnMasterNodeButton.Draw( m_transformedArea.x + m_transformedArea.width - 85 - TabX, TabY ); + + GUI.color = m_cleanUnusedNodesButton.IsInside( mousePosition ) ? RightIconsColorOn : RightIconsColorOff; + m_cleanUnusedNodesButton.Draw( m_transformedArea.x + m_transformedArea.width - 50 - TabX, TabY ); + + GUI.color = m_showInfoWindowButton.IsInside( mousePosition ) ? RightIconsColorOn : RightIconsColorOff; + m_showInfoWindowButton.Draw( m_transformedArea.x + m_transformedArea.width - 25 - TabX, TabY ); + + + //GUI.color = m_showTipsWindowButton.IsInside( mousePosition ) ? RightIconsColorOn : RightIconsColorOff; + //m_showTipsWindowButton.Draw( m_transformedArea.x + m_transformedArea.width - 190 - TabX, TabY ); + + //GUI.color = m_showConsoleWindowButton.IsInside( mousePosition ) ? RightIconsColorOn : RightIconsColorOff; + //m_showConsoleWindowButton.Draw( m_transformedArea.x + m_transformedArea.width - 195 - TabX, TabY ); + + GUI.color = bufferedColor; + + } + + public void OnNodeRemovedFromGraph( ParentNode node ) + { + m_searchResultNodes.Remove( node ); + } + + int m_previousNodeCount = 0; + + void RefreshList() + { + m_refreshSearchResultList = false; + m_currentSelected = -1; + m_searchResultNodes.Clear(); + if ( !string.IsNullOrEmpty( m_searchBarValue ) ) + { + List nodes = m_parentWindow.CurrentGraph.AllNodes; + int count = nodes.Count; + m_previousNodeCount = count; + for ( int i = 0; i < count; i++ ) + { + if ( nodes[ i ].CheckFindText( m_searchBarValue ) ) + { + m_searchResultNodes.Add( nodes[ i ] ); + } + } + } + } + + void SelectNext() + { + if ( m_refreshSearchResultList || m_parentWindow.CurrentGraph.AllNodes.Count != m_previousNodeCount ) + { + RefreshList(); + } + + if ( m_searchResultNodes.Count > 0 ) + { + m_currentSelected = ( m_currentSelected + 1 ) % m_searchResultNodes.Count; + m_parentWindow.FocusOnNode( m_searchResultNodes[ m_currentSelected ], 1, true ,true); + } + } + + void SelectPrevious() + { + if ( m_refreshSearchResultList || m_parentWindow.CurrentGraph.AllNodes.Count != m_previousNodeCount ) + { + RefreshList(); + } + + if ( m_searchResultNodes.Count > 0 ) + { + m_currentSelected = ( m_currentSelected > 1 ) ? ( m_currentSelected - 1 ) : ( m_searchResultNodes.Count - 1 ); + m_parentWindow.FocusOnNode( m_searchResultNodes[ m_currentSelected ], 1, true ); + } + } + + + public void SetStateOnButton( ToolButtonType button, int state, string tooltip ) + { + switch ( button ) + { + case ToolButtonType.New: + case ToolButtonType.Open: + case ToolButtonType.Save: + case ToolButtonType.Library: + case ToolButtonType.Options: + case ToolButtonType.Help: + case ToolButtonType.MasterNode: break; + case ToolButtonType.OpenSourceCode: + { + m_openSourceCodeButton.SetStateOnButton( state, tooltip ); + } + break; + case ToolButtonType.Update: + { + m_updateButton.SetStateOnButton( state, tooltip ); + } + break; + case ToolButtonType.Live: + { + m_liveButton.SetStateOnButton( state, tooltip ); + } + break; + case ToolButtonType.TakeScreenshot: + { + m_takeScreenshotButton.SetStateOnButton( state, tooltip ); + } + break; + case ToolButtonType.CleanUnusedNodes: + //case eToolButtonType.SelectShader: + { + m_cleanUnusedNodesButton.SetStateOnButton( state, tooltip ); + } + break; + case ToolButtonType.FocusOnMasterNode: + { + m_focusOnMasterNodeButton.SetStateOnButton( state, tooltip ); + } + break; + case ToolButtonType.FocusOnSelection: + { + m_focusOnSelectionButton.SetStateOnButton( state, tooltip ); + } + break; + case ToolButtonType.Share: + { + m_shareButton.SetStateOnButton( state, tooltip ); + } + break; + case ToolButtonType.ShowInfoWindow: + { + m_showInfoWindowButton.SetStateOnButton( state, tooltip ); + } + break; + case ToolButtonType.ShowTipsWindow: + { + m_showTipsWindowButton.SetStateOnButton( state, tooltip ); + } + break; + case ToolButtonType.ShowConsole: + { + m_showConsoleWindowButton.SetStateOnButton( state, tooltip ); + } + break; + } + } + + public void SetStateOnButton( ToolButtonType button, int state ) + { + switch ( button ) + { + case ToolButtonType.New: + case ToolButtonType.Open: + case ToolButtonType.Save: + case ToolButtonType.Library: + case ToolButtonType.Options: + case ToolButtonType.Help: + case ToolButtonType.MasterNode: break; + case ToolButtonType.OpenSourceCode: + { + m_openSourceCodeButton.SetStateOnButton( state ); + } + break; + case ToolButtonType.Update: + { + m_updateButton.SetStateOnButton( state ); + } + break; + case ToolButtonType.Live: + { + m_liveButton.SetStateOnButton( state ); + } + break; + case ToolButtonType.TakeScreenshot: + { + m_takeScreenshotButton.SetStateOnButton( state ); + } + break; + case ToolButtonType.CleanUnusedNodes: + //case eToolButtonType.SelectShader: + { + m_cleanUnusedNodesButton.SetStateOnButton( state ); + } + break; + case ToolButtonType.FocusOnMasterNode: + { + m_focusOnMasterNodeButton.SetStateOnButton( state ); + } + break; + case ToolButtonType.FocusOnSelection: + { + m_focusOnSelectionButton.SetStateOnButton( state ); + } + break; + case ToolButtonType.Share: + { + m_shareButton.SetStateOnButton( state ); + } + break; + case ToolButtonType.ShowInfoWindow: + { + m_showInfoWindowButton.SetStateOnButton( state ); + } + break; + case ToolButtonType.ShowTipsWindow: + { + m_showTipsWindowButton.SetStateOnButton( state ); + }break; + case ToolButtonType.ShowConsole: + { + m_showConsoleWindowButton.SetStateOnButton( state ); + } + break; + } + } + + public void DrawShaderTitle( MenuParent nodeParametersWindow, MenuParent paletteWindow, float availableCanvasWidth, float graphAreaHeight, string shaderName ) + { + float leftAdjust = nodeParametersWindow.IsMaximized ? nodeParametersWindow.RealWidth : 0; + float rightAdjust = paletteWindow.IsMaximized ? 0 : paletteWindow.RealWidth; + + m_boxRect = new Rect( leftAdjust + rightAdjust, 0, availableCanvasWidth, 35 ); + m_boxRect.x += paletteWindow.IsMaximized ? 0 : -paletteWindow.RealWidth; + m_boxRect.width += nodeParametersWindow.IsMaximized ? 0 : nodeParametersWindow.RealWidth; + m_boxRect.width += paletteWindow.IsMaximized ? 0 : paletteWindow.RealWidth; + m_borderRect = new Rect( m_boxRect ); + m_borderRect.height = graphAreaHeight; + + int extra = m_searchBarVisible ? (int)m_searchBarSize.width + 20: 0; + //m_boxRect.xMax -= ( paletteWindow.IsMaximized ? 195 : 230 ) + extra; + //m_boxRect.xMin += nodeParametersWindow.IsMaximized ? 95 : 145; + + UIUtils.ToolbarMainTitle.padding.right = ( paletteWindow.IsMaximized ? 195 : 230 ) + extra; + UIUtils.ToolbarMainTitle.padding.left = nodeParametersWindow.IsMaximized ? 110 : 145; + + if ( m_borderStyle == null ) + { + m_borderStyle = ( ParentWindow.CurrentGraph.CurrentMasterNode == null ) ? UIUtils.GetCustomStyle( CustomStyle.ShaderFunctionBorder ) : UIUtils.GetCustomStyle( CustomStyle.ShaderBorder ); + } + + GUI.Label( m_borderRect, shaderName, m_borderStyle ); + GUI.Label( m_boxRect, shaderName, UIUtils.ToolbarMainTitle ); + } + + public override bool IsInside( Vector2 position ) + { + if ( !m_isActive ) + return false; + + return m_boxRect.Contains( position ) || m_areaLeft.Contains( position ) || m_areaRight.Contains( position ); + } + + public GUIStyle BorderStyle + { + get { return m_borderStyle; } + set { m_borderStyle = value; } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsWindow.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsWindow.cs.meta new file mode 100644 index 0000000..3bd8f54 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Menu/Tools/ToolsWindow.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b1c1f3bedf849cb41a1648bf895bc0f7 +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Native.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Native.meta new file mode 100644 index 0000000..c3ec23a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Native.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 08d94054f82fc06498060596f83da0ba +folderAsset: yes +timeCreated: 1481126943 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackColor.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackColor.cs new file mode 100644 index 0000000..aeafb2a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackColor.cs @@ -0,0 +1,55 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class FallbackColor : IFallbackVars + { + [SerializeField] + private Color m_current; + [SerializeField] + private Color m_previous; + + public FallbackColor() + { + m_current = new Color(0, 0, 0, 0); + m_previous = new Color(0, 0, 0, 0); + } + + public FallbackColor(Color data) + { + m_current = data; + m_previous = data; + } + + public void Revert() + { + Color aux = m_current; + m_current = m_previous; + m_previous = aux; + } + + public Color Current + { + get + { + return m_current; + } + + set + { + m_previous = m_current; + m_current = value; + } + } + + public override string ToString() + { + return m_current.ToString(); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackColor.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackColor.cs.meta new file mode 100644 index 0000000..004e9ae --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackColor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8c6dccc523e2ad440a82edd582b84a45 +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackFloat.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackFloat.cs new file mode 100644 index 0000000..69d6f39 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackFloat.cs @@ -0,0 +1,56 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class FallbackFloat : IFallbackVars + { + [SerializeField] + private float m_current; + [SerializeField] + private float m_previous; + + public FallbackFloat() + { + m_current = 0; + m_previous = 0; + } + + public FallbackFloat( float data ) + { + m_current = data; + m_previous = data; + } + + public void Revert() + { + float aux = m_current; + m_current = m_previous; + m_previous = aux; + } + + + public float Current + { + get + { + return m_current; + } + + set + { + m_previous = m_current; + m_current = value; + } + } + + public override string ToString() + { + return m_current.ToString(); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackFloat.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackFloat.cs.meta new file mode 100644 index 0000000..c7f6c88 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackFloat.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a957e66c7a41d6848966d526c9687347 +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackInt.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackInt.cs new file mode 100644 index 0000000..bd9b8a7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackInt.cs @@ -0,0 +1,56 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class FallbackInt : IFallbackVars + { + [SerializeField] + private int m_current; + [SerializeField] + private int m_previous; + + public FallbackInt() + { + m_current = 0; + m_previous = 0; + } + + public FallbackInt( int data ) + { + m_current = data; + m_previous = data; + } + + public void Revert() + { + int aux = m_current; + m_current = m_previous; + m_previous = aux; + } + + + public int Current + { + get + { + return m_current; + } + + set + { + m_previous = m_current; + m_current = value; + } + } + + public override string ToString() + { + return m_current.ToString(); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackInt.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackInt.cs.meta new file mode 100644 index 0000000..d75cf8d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackInt.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 09c28ab321caf3b47839606e37d3cdd2 +timeCreated: 1481126953 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackMatrix4x4.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackMatrix4x4.cs new file mode 100644 index 0000000..8405790 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackMatrix4x4.cs @@ -0,0 +1,55 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class FallbackMatrix4x4 : IFallbackVars + { + [SerializeField] + private Matrix4x4 m_current; + [SerializeField] + private Matrix4x4 m_previous; + + public FallbackMatrix4x4() + { + m_current = new Matrix4x4(); + m_previous = new Matrix4x4(); + } + + public FallbackMatrix4x4( Matrix4x4 data ) + { + m_current = data; + m_previous = data; + } + + public void Revert() + { + Matrix4x4 aux = m_current; + m_current = m_previous; + m_previous = aux; + } + + public Matrix4x4 Current + { + get + { + return m_current; + } + + set + { + m_previous = m_current; + m_current = value; + } + } + + public override string ToString() + { + return m_current.ToString(); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackMatrix4x4.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackMatrix4x4.cs.meta new file mode 100644 index 0000000..e6208e2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackMatrix4x4.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 48af68670bdba9147b4ed55138e4edf6 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackString.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackString.cs new file mode 100644 index 0000000..e33e096 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackString.cs @@ -0,0 +1,56 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class FallbackString : IFallbackVars + { + [SerializeField] + private string m_current; + [SerializeField] + private string m_previous; + + public FallbackString() + { + m_current = string.Empty; + m_previous = string.Empty; + } + + public FallbackString( string data ) + { + m_current = data; + m_previous = data; + } + + public void Revert() + { + string aux = m_current; + m_current = m_previous; + m_previous = aux; + } + + + public string Current + { + get + { + return m_current; + } + + set + { + m_previous = m_current; + m_current = value; + } + } + + public override string ToString() + { + return m_current; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackString.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackString.cs.meta new file mode 100644 index 0000000..82d80d5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackString.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: cc2e25b7c55e9284699ccad75e79a075 +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackTexture.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackTexture.cs new file mode 100644 index 0000000..afee1e7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackTexture.cs @@ -0,0 +1,55 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class FallbackTexture : IFallbackVars + { + [SerializeField] + private Texture m_current; + [SerializeField] + private Texture m_previous; + + public FallbackTexture() + { + m_current = null; + m_previous = null; + } + + public FallbackTexture( Texture data ) + { + m_current = data; + m_previous = data; + } + + public void Revert() + { + Texture aux = m_current; + m_current = m_previous; + m_previous = aux; + } + + public Texture Current + { + get + { + return m_current; + } + + set + { + m_previous = m_current; + m_current = value; + } + } + + public override string ToString() + { + return m_current.ToString(); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackTexture.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackTexture.cs.meta new file mode 100644 index 0000000..21258f2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackTexture.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 309e413cfa89510429c67fa82c557da7 +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackVariable.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackVariable.cs new file mode 100644 index 0000000..c6d3eaf --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackVariable.cs @@ -0,0 +1,36 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using System; + +namespace AmplifyShaderEditor +{ + //GENERICS DON'T WORK WITH HOT CODE RELOAD + [Serializable] + public class FallbackVariable + { + [SerializeField] + private T m_current; + [SerializeField] + private T m_last; + + public void Revert() + { + m_current = m_last; + } + + public T Current + { + get + { + return m_current; + } + set + { + m_last = m_current; + m_current = value; + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackVariable.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackVariable.cs.meta new file mode 100644 index 0000000..2af70ab --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackVariable.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ec850a4093c249d449f22e0483040b9c +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackVector2.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackVector2.cs new file mode 100644 index 0000000..adad9d0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackVector2.cs @@ -0,0 +1,56 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class FallbackVector2 : IFallbackVars + { + [SerializeField] + private Vector2 m_current; + [SerializeField] + private Vector2 m_previous; + + public FallbackVector2() + { + m_current = new Vector2( 0, 0 ); + m_previous = new Vector2( 0, 0 ); + } + + public FallbackVector2( Vector2 data ) + { + m_current = data; + m_previous = data; + } + + public void Revert() + { + Vector2 aux = m_current; + m_current = m_previous; + m_previous = aux; + } + + + public Vector2 Current + { + get + { + return m_current; + } + + set + { + m_previous = m_current; + m_current = value; + } + } + + public override string ToString() + { + return m_current.ToString(); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackVector2.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackVector2.cs.meta new file mode 100644 index 0000000..c04cca1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackVector2.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ab3a976b3cb79ad41986d2f7d4439642 +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackVector3.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackVector3.cs new file mode 100644 index 0000000..f2fe132 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackVector3.cs @@ -0,0 +1,56 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class FallbackVector3 : IFallbackVars + { + [SerializeField] + private Vector3 m_current; + [SerializeField] + private Vector3 m_previous; + + public FallbackVector3() + { + m_current = new Vector3( 0, 0, 0 ); + m_previous = new Vector3( 0, 0, 0 ); + } + + public FallbackVector3( Vector3 data ) + { + m_current = data; + m_previous = data; + } + + public void Revert() + { + Vector3 aux = m_current; + m_current = m_previous; + m_previous = aux; + } + + + public Vector3 Current + { + get + { + return m_current; + } + + set + { + m_previous = m_current; + m_current = value; + } + } + + public override string ToString() + { + return m_current.ToString(); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackVector3.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackVector3.cs.meta new file mode 100644 index 0000000..d22ae5b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackVector3.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0e681455d27d2264fbc2683a1510df2c +timeCreated: 1481126953 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackVector4.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackVector4.cs new file mode 100644 index 0000000..63be658 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackVector4.cs @@ -0,0 +1,48 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class FallbackVector4 : IFallbackVars + { + [SerializeField] + private Vector4 m_current; + [SerializeField] + private Vector4 m_previous; + + public FallbackVector4() + { + m_current = new Vector4( 0, 0, 0, 0 ); + m_previous = new Vector4( 0, 0, 0, 0 ); + } + + public FallbackVector4( Vector4 data ) + { + m_current = data; + m_previous = data; + } + + public void Revert() + { + Vector4 aux = m_current; + m_current = m_previous; + m_previous = aux; + } + + public Vector4 Current + { + get { return m_current; } + set + { + m_previous = m_current; + m_current = value; + } + } + + public override string ToString() { return m_current.ToString(); } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackVector4.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackVector4.cs.meta new file mode 100644 index 0000000..704deb7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/FallbackVector4.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4e23c25f035ba604ea999f214c0a7833 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Native/IFallbackVars.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/IFallbackVars.cs new file mode 100644 index 0000000..17f7fcf --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/IFallbackVars.cs @@ -0,0 +1,10 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + interface IFallbackVars + { + void Revert(); + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Native/IFallbackVars.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/IFallbackVars.cs.meta new file mode 100644 index 0000000..f558f54 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Native/IFallbackVars.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8b0dda023474c6e41a39c36e48af72b2 +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes.meta new file mode 100644 index 0000000..1847e2b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: dd2ad7a1ab86e9344b83b2a88cc030cf +folderAsset: yes +timeCreated: 1481126944 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/CommentaryNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/CommentaryNode.cs new file mode 100644 index 0000000..141fea0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/CommentaryNode.cs @@ -0,0 +1,692 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; +using System.Collections.Generic; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + public enum eResizeAxis + { + X_AXIS, + Y_AXIS, + ALL + } + + [Serializable] + public sealed class CommentaryNode : ParentNode, ISerializationCallbackReceiver + { + private const string InfoText = "Press Alt + Left Mouse Click/Drag to make all Comment node area interactable.\nDouble click on the Comment at the node body to modify it directly from there."; + + private const string CommentaryTitle = "Comment"; + private const float BORDER_SIZE_X = 50; + private const float BORDER_SIZE_Y = 50; + private const float MIN_SIZE_X = 100; + private const float MIN_SIZE_Y = 100; + private const float COMMENTARY_BOX_HEIGHT = 30; + + private readonly Vector2 ResizeButtonPos = new Vector2( 1, 1 ); + + [SerializeField] + private string m_commentText = "Comment"; + + [SerializeField] + private string m_titleText = string.Empty; + + [SerializeField] + private eResizeAxis m_resizeAxis = eResizeAxis.ALL; + + [SerializeField] + private List m_nodesOnCommentary = new List(); + private Dictionary m_nodesOnCommentaryDict = new Dictionary(); + private bool m_reRegisterNodes = false; + + [SerializeField] + private Rect m_resizeLeftIconCoords; + + [SerializeField] + private Rect m_resizeRightIconCoords; + + [SerializeField] + private Rect m_auxHeaderPos; + + [SerializeField] + private Rect m_commentArea; + + private Texture2D m_resizeIconTex; + + private bool m_isResizingRight = false; + private bool m_isResizingLeft = false; + + private Vector2 m_resizeStartPoint = Vector2.zero; + + private string m_focusName = "CommentaryNode"; + private bool m_focusOnTitle = false; + private bool m_graphDepthAnalized = false; + + private bool m_checkCommentText = true; + private bool m_checkTitleText = true; + + public Color m_frameColor = Color.white; + + private List m_nodesIds = new List(); + private bool m_checkContents = false; + + private bool m_isEditing; + private bool m_stopEditing; + private bool m_startEditing; + private double m_clickTime; + private double m_doubleClickTime = 0.3; + + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_reorderLocked = true; + m_rmbIgnore = true; + m_defaultInteractionMode = InteractionMode.Both; + m_headerColor = UIUtils.GetColorFromCategory( "Commentary" ); + m_connStatus = NodeConnectionStatus.Island; + m_textLabelWidth = 90; + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + m_focusName = CommentaryTitle + OutputId; + } + + public void CreateFromSelectedNodes( Vector2 mousePosOnCanvasCoords, ParentNode[] selectedNodes ) + { + if ( selectedNodes.Length == 0 ) + { + m_position = new Rect( mousePosOnCanvasCoords, new Vector2( 100, 100 ) ); + return; + } + + Vector2 minPos = new Vector2( float.MaxValue, float.MaxValue ); + Vector2 maxPos = new Vector2( float.MinValue, float.MinValue ); + + for ( int i = 0; i < selectedNodes.Length; i++ ) + { + //Check min + if ( selectedNodes[ i ].Position.x < minPos.x ) + minPos.x = selectedNodes[ i ].Position.x; + + if ( selectedNodes[ i ].Position.y < minPos.y ) + minPos.y = selectedNodes[ i ].Position.y; + + //check max + float nodeXMax = selectedNodes[ i ].Position.x + selectedNodes[ i ].Position.width; + if ( nodeXMax > maxPos.x ) + { + maxPos.x = nodeXMax; + } + + float nodeYMax = selectedNodes[ i ].Position.y + selectedNodes[ i ].Position.height; + if ( nodeYMax > maxPos.y ) + { + maxPos.y = nodeYMax; + } + + //_nodesOnCommentary.Add( selectedNodes[ i ] ); + //selectedNodes[ i ].OnNodeStoppedMovingEvent += NodeStoppedMoving; + AddNodeToCommentary( selectedNodes[ i ] ); + } + + Vector2 dims = maxPos - minPos + new Vector2( 2 * BORDER_SIZE_X, 2 * BORDER_SIZE_Y ); + m_position = new Rect( minPos.x - BORDER_SIZE_X, minPos.y - BORDER_SIZE_Y, dims.x, dims.y ); + } + + public override void Move( Vector2 delta, bool snap ) + { + if ( m_isResizingRight || m_isResizingLeft ) + return; + + base.Move( delta, snap ); + for ( int i = 0; i < m_nodesOnCommentary.Count; i++ ) + { + if ( !m_nodesOnCommentary[ i ].Selected ) + { + m_nodesOnCommentary[ i ].RecordObject( Constants.UndoMoveNodesId ); + m_nodesOnCommentary[ i ].Move( delta, snap ); + } + } + } + + public void NodeStoppedMoving( ParentNode node, bool testOnlySelected, InteractionMode useTargetInteraction ) + { + if ( !m_position.Contains( node.Vec2Position ) && !m_position.Contains( node.Corner ) ) + { + RemoveNode( node ); + } + } + + public void NodeDestroyed( ParentNode node ) + { + RemoveNode( node ); + } + + public void RemoveNode( ParentNode node ) + { + if ( m_nodesOnCommentaryDict.ContainsKey( node.UniqueId ) ) + { + UIUtils.MarkUndoAction(); + RecordObject( Constants.UndoRemoveNodeFromCommentaryId ); + node.RecordObject( Constants.UndoRemoveNodeFromCommentaryId ); + m_nodesOnCommentary.Remove( node ); + m_nodesOnCommentaryDict.Remove( node.UniqueId ); + node.OnNodeStoppedMovingEvent -= NodeStoppedMoving; + node.OnNodeDestroyedEvent -= NodeDestroyed; + node.CommentaryParent = -1; + } + } + + public void RemoveAllNodes() + { + UIUtils.MarkUndoAction(); + for ( int i = 0; i < m_nodesOnCommentary.Count; i++ ) + { + RecordObject( Constants.UndoRemoveNodeFromCommentaryId ); + m_nodesOnCommentary[ i ].RecordObject( Constants.UndoRemoveNodeFromCommentaryId ); + m_nodesOnCommentary[ i ].OnNodeStoppedMovingEvent -= NodeStoppedMoving; + m_nodesOnCommentary[ i ].OnNodeDestroyedEvent -= NodeDestroyed; + m_nodesOnCommentary[ i ].CommentaryParent = -1; + } + m_nodesOnCommentary.Clear(); + m_nodesOnCommentaryDict.Clear(); + } + + public override void Destroy() + { + base.Destroy(); + RemoveAllNodes(); + } + + public void AddNodeToCommentary( ParentNode node ) + { + if( node.UniqueId == UniqueId ) + return; + + if ( !m_nodesOnCommentaryDict.ContainsKey( node.UniqueId ) ) + { + bool addToNode = false; + + if ( node.CommentaryParent < 0 ) + { + addToNode = true; + if ( node.Depth <= m_depth ) + { + ActivateNodeReordering( node.Depth ); + } + } + else + { + CommentaryNode other = UIUtils.GetNode( node.CommentaryParent ) as CommentaryNode; + if ( other != null ) + { + if ( other.Depth < Depth ) + { + other.RemoveNode( node ); + addToNode = true; + } + + } + } + + if ( addToNode ) + { + UIUtils.MarkUndoAction(); + RecordObject( Constants.UndoAddNodeToCommentaryId ); + node.RecordObject( Constants.UndoAddNodeToCommentaryId ); + + m_nodesOnCommentary.Add( node ); + m_nodesOnCommentaryDict.Add( node.UniqueId, node ); + node.OnNodeStoppedMovingEvent += NodeStoppedMoving; + node.OnNodeDestroyedEvent += NodeDestroyed; + node.CommentaryParent = UniqueId; + } + } + } + + public override void DrawProperties() + { + base.DrawProperties(); + NodeUtils.DrawPropertyGroup( ref m_propertiesFoldout, Constants.ParameterLabelStr,()=> + { + EditorGUI.BeginChangeCheck(); + m_titleText = EditorGUILayoutTextField( "Frame Title", m_titleText ); + if ( EditorGUI.EndChangeCheck() ) + { + m_checkTitleText = true; + } + EditorGUI.BeginChangeCheck(); + m_commentText = EditorGUILayoutTextField( CommentaryTitle, m_commentText ); + if ( EditorGUI.EndChangeCheck() ) + { + m_checkCommentText = true; + } + + m_frameColor = EditorGUILayoutColorField( "Frame Color", m_frameColor ); + } ); + EditorGUILayout.HelpBox( InfoText, MessageType.Info ); + } + + public override void OnNodeLayout( DrawInfo drawInfo ) + { + if ( m_nodesIds.Count > 0 ) + { + for ( int i = 0; i < m_nodesIds.Count; i++ ) + { + ParentNode node = ContainerGraph.GetNode( m_nodesIds[ i ] ); + if ( node ) + { + AddNodeToCommentary( node ); + } + } + m_nodesIds.Clear(); + } + + if ( m_reRegisterNodes ) + { + m_reRegisterNodes = false; + m_nodesOnCommentaryDict.Clear(); + for ( int i = 0; i < m_nodesOnCommentary.Count; i++ ) + { + if ( m_nodesOnCommentary[ i ] != null ) + { + m_nodesOnCommentary[ i ].OnNodeStoppedMovingEvent += NodeStoppedMoving; + m_nodesOnCommentary[ i ].OnNodeDestroyedEvent += NodeDestroyed; + m_nodesOnCommentaryDict.Add( m_nodesOnCommentary[ i ].UniqueId, m_nodesOnCommentary[ i ] ); + } + } + } + + //base.OnLayout( drawInfo ); + CalculatePositionAndVisibility( drawInfo ); + + m_headerPosition = m_globalPosition; + m_headerPosition.height = UIUtils.CurrentHeaderHeight; + + m_auxHeaderPos = m_position; + m_auxHeaderPos.height = UIUtils.HeaderMaxHeight; + + m_commentArea = m_globalPosition; + m_commentArea.height = COMMENTARY_BOX_HEIGHT * drawInfo.InvertedZoom; + m_commentArea.xMin += 10 * drawInfo.InvertedZoom; + m_commentArea.xMax -= 10 * drawInfo.InvertedZoom; + + if ( m_resizeIconTex == null ) + { + m_resizeIconTex = UIUtils.GetCustomStyle( CustomStyle.CommentaryResizeButton ).normal.background; + } + + // LEFT RESIZE BUTTON + m_resizeLeftIconCoords = m_globalPosition; + m_resizeLeftIconCoords.x = m_globalPosition.x + 2; + m_resizeLeftIconCoords.y = m_globalPosition.y + m_globalPosition.height - 2 - ( m_resizeIconTex.height + ResizeButtonPos.y ) * drawInfo.InvertedZoom; + m_resizeLeftIconCoords.width = m_resizeIconTex.width * drawInfo.InvertedZoom; + m_resizeLeftIconCoords.height = m_resizeIconTex.height * drawInfo.InvertedZoom; + + // RIGHT RESIZE BUTTON + m_resizeRightIconCoords = m_globalPosition; + m_resizeRightIconCoords.x = m_globalPosition.x + m_globalPosition.width - 1 - ( m_resizeIconTex.width + ResizeButtonPos.x ) * drawInfo.InvertedZoom; + m_resizeRightIconCoords.y = m_globalPosition.y + m_globalPosition.height - 2 - ( m_resizeIconTex.height + ResizeButtonPos.y ) * drawInfo.InvertedZoom; + m_resizeRightIconCoords.width = m_resizeIconTex.width * drawInfo.InvertedZoom; + m_resizeRightIconCoords.height = m_resizeIconTex.height * drawInfo.InvertedZoom; + } + + public override void OnNodeRepaint( DrawInfo drawInfo ) + { + if ( !m_isVisible ) + return; + + m_colorBuffer = GUI.color; + // Background + GUI.color = Constants.NodeBodyColor * m_frameColor; + GUI.Label( m_globalPosition, string.Empty, UIUtils.GetCustomStyle( CustomStyle.CommentaryBackground ) ); + + // Header + GUI.color = m_headerColor * m_headerColorModifier * m_frameColor; + GUI.Label( m_headerPosition, string.Empty, UIUtils.GetCustomStyle( CustomStyle.NodeHeader ) ); + GUI.color = m_colorBuffer; + + // Fixed Title ( only renders when not editing ) + if ( !m_isEditing && !m_startEditing && ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD3 ) + { + GUI.Label( m_commentArea, m_commentText, UIUtils.CommentaryTitle ); + } + + // Buttons + GUI.Label( m_resizeLeftIconCoords, string.Empty, UIUtils.GetCustomStyle( CustomStyle.CommentaryResizeButtonInv ) ); + GUI.Label( m_resizeRightIconCoords, string.Empty, UIUtils.GetCustomStyle( CustomStyle.CommentaryResizeButton ) ); + + // Selection Box + if ( m_selected ) + { + GUI.color = Constants.NodeSelectedColor; + RectOffset cache = UIUtils.GetCustomStyle( CustomStyle.NodeWindowOn ).border; + UIUtils.GetCustomStyle( CustomStyle.NodeWindowOn ).border = UIUtils.RectOffsetSix; + GUI.Label( m_globalPosition, string.Empty, UIUtils.GetCustomStyle( CustomStyle.NodeWindowOn ) ); + UIUtils.GetCustomStyle( CustomStyle.NodeWindowOn ).border = cache; + GUI.color = m_colorBuffer; + } + + if ( !string.IsNullOrEmpty( m_titleText ) ) + { + Rect titleRect = m_globalPosition; + titleRect.y -= 24; + titleRect.height = 24; + GUI.Label( titleRect, m_titleText, UIUtils.GetCustomStyle( CustomStyle.CommentarySuperTitle ) ); + } + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + // Custom Editable Title + if ( ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD3 ) + { + if ( !m_isEditing && ( ( !ContainerGraph.ParentWindow.MouseInteracted && drawInfo.CurrentEventType == EventType.MouseDown && m_commentArea.Contains( drawInfo.MousePosition ) ) ) ) + { + if ( ( EditorApplication.timeSinceStartup - m_clickTime ) < m_doubleClickTime ) + m_startEditing = true; + else + GUI.FocusControl( null ); + m_clickTime = EditorApplication.timeSinceStartup; + } + else if ( m_isEditing && ( ( drawInfo.CurrentEventType == EventType.MouseDown && !m_commentArea.Contains( drawInfo.MousePosition ) ) || !EditorGUIUtility.editingTextField ) ) + { + m_stopEditing = true; + } + + if ( m_isEditing || m_startEditing ) + { + EditorGUI.BeginChangeCheck(); + GUI.SetNextControlName( m_focusName ); + m_commentText = EditorGUITextField( m_commentArea, string.Empty, m_commentText, UIUtils.CommentaryTitle ); + if ( EditorGUI.EndChangeCheck() ) + { + m_checkCommentText = true; + } + + if ( m_startEditing ) + EditorGUI.FocusTextInControl( m_focusName ); + } + + if ( drawInfo.CurrentEventType == EventType.Repaint ) + { + if ( m_startEditing ) + { + m_startEditing = false; + m_isEditing = true; + } + + if ( m_stopEditing ) + { + m_stopEditing = false; + m_isEditing = false; + GUI.FocusControl( null ); + } + } + } + + if ( drawInfo.CurrentEventType == EventType.MouseDown && drawInfo.LeftMouseButtonPressed ) + { + // Left Button + if( m_resizeLeftIconCoords.Contains( drawInfo.MousePosition ) && ContainerGraph.ParentWindow.CurrentEvent.modifiers != EventModifiers.Shift ) + { + if ( !m_isResizingLeft ) + { + m_isResizingLeft = true; + ContainerGraph.ParentWindow.ForceAutoPanDir = true; + m_resizeStartPoint = drawInfo.TransformedMousePos; + } + } + + // Right Button + if ( m_resizeRightIconCoords.Contains( drawInfo.MousePosition ) && ContainerGraph.ParentWindow.CurrentEvent.modifiers != EventModifiers.Shift ) + { + if ( !m_isResizingRight ) + { + m_isResizingRight = true; + ContainerGraph.ParentWindow.ForceAutoPanDir = true; + m_resizeStartPoint = drawInfo.TransformedMousePos; + } + } + } + + if ( drawInfo.CurrentEventType == EventType.Repaint || drawInfo.CurrentEventType == EventType.MouseUp ) + { + // Left Button + EditorGUIUtility.AddCursorRect( m_resizeLeftIconCoords, MouseCursor.ResizeUpRight ); + if ( m_isResizingLeft ) + { + if ( drawInfo.CurrentEventType == EventType.MouseUp ) + { + m_isResizingLeft = false; + ContainerGraph.ParentWindow.ForceAutoPanDir = false; + RemoveAllNodes(); + FireStoppedMovingEvent( false, InteractionMode.Target ); + } + else + { + Vector2 currSize = ( drawInfo.TransformedMousePos - m_resizeStartPoint ) /*/ drawInfo.InvertedZoom*/; + m_resizeStartPoint = drawInfo.TransformedMousePos; + if ( m_resizeAxis != eResizeAxis.Y_AXIS ) + { + m_position.x += currSize.x; + m_position.width -= currSize.x; + if ( m_position.width < MIN_SIZE_X ) + { + m_position.x -= ( MIN_SIZE_X - m_position.width ); + m_position.width = MIN_SIZE_X; + } + } + + if ( m_resizeAxis != eResizeAxis.X_AXIS ) + { + m_position.height += currSize.y; + if ( m_position.height < MIN_SIZE_Y ) + { + m_position.height = MIN_SIZE_Y; + } + } + } + } + + // Right Button + EditorGUIUtility.AddCursorRect( m_resizeRightIconCoords, MouseCursor.ResizeUpLeft ); + if ( m_isResizingRight ) + { + if ( drawInfo.CurrentEventType == EventType.MouseUp ) + { + m_isResizingRight = false; + ContainerGraph.ParentWindow.ForceAutoPanDir = false; + RemoveAllNodes(); + FireStoppedMovingEvent( false, InteractionMode.Target ); + } + else + { + Vector2 currSize = ( drawInfo.TransformedMousePos - m_resizeStartPoint ) /*/ drawInfo.InvertedZoom*/; + m_resizeStartPoint = drawInfo.TransformedMousePos; + if ( m_resizeAxis != eResizeAxis.Y_AXIS ) + { + m_position.width += currSize.x; + if ( m_position.width < MIN_SIZE_X ) + { + m_position.width = MIN_SIZE_X; + } + } + + if ( m_resizeAxis != eResizeAxis.X_AXIS ) + { + m_position.height += currSize.y; + if ( m_position.height < MIN_SIZE_Y ) + { + m_position.height = MIN_SIZE_Y; + } + } + } + } + } + + if ( m_checkCommentText ) + { + m_checkCommentText = false; + m_commentText = m_commentText.Replace( IOUtils.FIELD_SEPARATOR, ' ' ); + } + + if ( m_checkTitleText ) + { + m_checkTitleText = false; + m_titleText = m_titleText.Replace( IOUtils.FIELD_SEPARATOR, ' ' ); + } + + if ( m_focusOnTitle && drawInfo.CurrentEventType == EventType.KeyUp ) + { + m_focusOnTitle = false; + m_startEditing = true; + } + } + + public void Focus() + { + m_focusOnTitle = true; + } + + public override void OnAfterDeserialize() + { + base.OnAfterDeserialize(); + m_reRegisterNodes = true; + } + + public override bool OnNodeInteraction( ParentNode node ) + { + if ( node == null || UniqueId == node.UniqueId ) + return false; + + for( int i = 0; i < m_nodesOnCommentary.Count; i++ ) + { + if( m_nodesOnCommentary[ i ] && m_nodesOnCommentary[ i ] != this && m_nodesOnCommentary[ i ].OnNodeInteraction( node ) ) + { + return false; + } + } + + if( m_position.Contains( node.Vec2Position ) && m_position.Contains( node.Corner ) ) + { + AddNodeToCommentary( node ); + return true; + } + return false; + } + + public override void OnSelfStoppedMovingEvent() + { + FireStoppedMovingEvent( false, InteractionMode.Both ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_position.width = Convert.ToSingle( GetCurrentParam( ref nodeParams ) ); + m_position.height = Convert.ToSingle( GetCurrentParam( ref nodeParams ) ); + m_commentText = GetCurrentParam( ref nodeParams ); + int count = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + for ( int i = 0; i < count; i++ ) + { + m_nodesIds.Add( Convert.ToInt32( GetCurrentParam( ref nodeParams ) ) ); + } + + if ( UIUtils.CurrentShaderVersion() > 5004 ) + m_titleText = GetCurrentParam( ref nodeParams ); + + if ( UIUtils.CurrentShaderVersion() > 12002 ) + { + string[] colorChannels = GetCurrentParam( ref nodeParams ).Split( IOUtils.VECTOR_SEPARATOR ); + if ( colorChannels.Length == 4 ) + { + m_frameColor.r = Convert.ToSingle( colorChannels[ 0 ] ); + m_frameColor.g = Convert.ToSingle( colorChannels[ 1 ] ); + m_frameColor.b = Convert.ToSingle( colorChannels[ 2 ] ); + m_frameColor.a = Convert.ToSingle( colorChannels[ 3 ] ); + } + else + { + UIUtils.ShowMessage( UniqueId, "Incorrect number of color values", MessageSeverity.Error ); + } + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_position.width ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_position.height ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_commentText ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_nodesOnCommentary.Count ); + for ( int i = 0; i < m_nodesOnCommentary.Count; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_nodesOnCommentary[ i ].UniqueId ); + } + + IOUtils.AddFieldValueToString( ref nodeInfo, m_titleText ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_frameColor.r.ToString() + IOUtils.VECTOR_SEPARATOR + m_frameColor.g.ToString() + IOUtils.VECTOR_SEPARATOR + m_frameColor.b.ToString() + IOUtils.VECTOR_SEPARATOR + m_frameColor.a.ToString() ); + } + + public override void ResetNodeData() + { + base.ResetNodeData(); + m_graphDepthAnalized = false; + } + + public override void ReadAdditionalClipboardData( ref string[] nodeParams ) + { + base.ReadAdditionalClipboardData( ref nodeParams ); + m_nodesIds.Clear(); + m_checkContents = true; + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + if( m_checkContents ) + { + m_checkContents = false; + OnSelfStoppedMovingEvent(); + } + } + + public override void CalculateCustomGraphDepth() + { + if ( m_graphDepthAnalized ) + return; + + m_graphDepth = int.MinValue; + int count = m_nodesOnCommentary.Count; + for ( int i = 0; i < count; i++ ) + { + if ( m_nodesOnCommentary[ i ].ConnStatus == NodeConnectionStatus.Island ) + { + m_nodesOnCommentary[ i ].CalculateCustomGraphDepth(); + } + + if ( m_nodesOnCommentary[ i ].GraphDepth >= m_graphDepth ) + { + m_graphDepth = m_nodesOnCommentary[ i ].GraphDepth + 1; + } + } + m_graphDepthAnalized = true; + } + + public override Rect Position { get { return Event.current.alt ? m_position : m_auxHeaderPos; } } + public override bool Contains( Vector3 pos ) + { + return Event.current.alt ? m_globalPosition.Contains( pos ) : ( m_headerPosition.Contains( pos ) || m_resizeRightIconCoords.Contains( pos ) || m_resizeLeftIconCoords.Contains( pos ) ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/CommentaryNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/CommentaryNode.cs.meta new file mode 100644 index 0000000..34eb425 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/CommentaryNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 08f1d9c1d8cbe5841a6429d565096eab +timeCreated: 1481126953 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants.meta new file mode 100644 index 0000000..8706d1a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e7354e1a2beece044944bc1cba85aebc +folderAsset: yes +timeCreated: 1481126946 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ColorNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ColorNode.cs new file mode 100644 index 0000000..e1f21b8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ColorNode.cs @@ -0,0 +1,507 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Color", "Constants And Properties", "Color property", null, KeyCode.Alpha5 )] + public sealed class ColorNode : PropertyNode + { + private const string ColorSpaceStr = "Color Space"; + + [SerializeField] +#if UNITY_2018_1_OR_NEWER + [ColorUsage( true, true )] +#else + [ColorUsage( true, true, float.MinValue, float.MinValue, float.MinValue, float.MaxValue )] +#endif + private Color m_defaultValue = new Color( 0, 0, 0, 0 ); + + [SerializeField] +#if UNITY_2018_1_OR_NEWER + [ColorUsage( true, true )] +#else + [ColorUsage( true, true, float.MinValue, float.MinValue, float.MinValue, float.MaxValue )] +#endif + private Color m_materialValue = new Color( 0, 0, 0, 0 ); + + [SerializeField] + private bool m_isHDR = false; + + //[SerializeField] + //private ASEColorSpace m_colorSpace = ASEColorSpace.Auto; +#if !UNITY_2018_1_OR_NEWER + private ColorPickerHDRConfig m_hdrConfig = new ColorPickerHDRConfig( 0, float.MaxValue, 0, float.MaxValue ); +#endif + private GUIContent m_dummyContent; + + private int m_cachedPropertyId = -1; + + private bool m_isEditingFields; + + [SerializeField] + private bool m_autoGammaToLinearConversion = true; + + private const string AutoGammaToLinearConversion = "IsGammaSpace() ? {0} : {1}"; + private const string AutoGammaToLinearStr = "Auto Gamma To Linear"; + + public ColorNode() : base() { } + public ColorNode( int uniqueId, float x, float y, float width, float height ) : base( uniqueId, x, y, width, height ) { } + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + GlobalTypeWarningText = string.Format( GlobalTypeWarningText, "Color" ); + m_insideSize.Set( 100, 50 ); + m_dummyContent = new GUIContent(); + AddOutputColorPorts( "RGBA" ); + m_drawPreview = false; + m_drawPreviewExpander = false; + m_canExpand = false; + m_showHybridInstancedUI = true; + m_selectedLocation = PreviewLocation.BottomCenter; + m_previewShaderGUID = "6cf365ccc7ae776488ae8960d6d134c3"; + m_srpBatcherCompatible = true; + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + if( m_cachedPropertyId == -1 ) + m_cachedPropertyId = Shader.PropertyToID( "_InputColor" ); + + if( m_materialMode && m_currentParameterType != PropertyType.Constant ) + PreviewMaterial.SetColor( m_cachedPropertyId, m_materialValue ); + else + PreviewMaterial.SetColor( m_cachedPropertyId, m_defaultValue ); + } + + public override void CopyDefaultsToMaterial() + { + m_materialValue = m_defaultValue; + } + + public override void DrawSubProperties() + { + m_textLabelWidth = ( m_currentParameterType == PropertyType.Constant ) ? 152 : 105; + +#if UNITY_2018_1_OR_NEWER + m_defaultValue = EditorGUILayoutColorField( Constants.DefaultValueLabelContent, m_defaultValue, false, true, m_isHDR ); +#else + m_defaultValue = EditorGUILayoutColorField( Constants.DefaultValueLabelContent, m_defaultValue, false, true, m_isHDR, m_hdrConfig ); +#endif + if( m_currentParameterType == PropertyType.Constant ) + { + + m_autoGammaToLinearConversion = EditorGUILayoutToggle( AutoGammaToLinearStr, m_autoGammaToLinearConversion ); + } + } + + //public override void DrawMainPropertyBlock() + //{ + // EditorGUILayout.BeginVertical(); + // { + + // PropertyType parameterType = (PropertyType)EditorGUILayoutEnumPopup( ParameterTypeStr, m_currentParameterType ); + // if( parameterType != m_currentParameterType ) + // { + // ChangeParameterType( parameterType ); + // BeginPropertyFromInspectorCheck(); + // } + + // switch( m_currentParameterType ) + // { + // case PropertyType.Property: + // case PropertyType.InstancedProperty: + // { + // ShowPropertyInspectorNameGUI(); + // ShowPropertyNameGUI( true ); + // ShowVariableMode(); + // ShowPrecision(); + // ShowToolbar(); + // } + // break; + // case PropertyType.Global: + // { + // ShowPropertyInspectorNameGUI(); + // ShowPropertyNameGUI( false ); + // ShowVariableMode(); + // ShowPrecision(); + // ShowDefaults(); + // } + // break; + // case PropertyType.Constant: + // { + // ShowPropertyInspectorNameGUI(); + // ShowPrecision(); + // m_colorSpace = (ASEColorSpace)EditorGUILayoutEnumPopup( ColorSpaceStr, m_colorSpace ); + // ShowDefaults(); + // } + // break; + // } + // } + // EditorGUILayout.EndVertical(); + //} + + public override void DrawMaterialProperties() + { + if( m_materialMode ) + EditorGUI.BeginChangeCheck(); +#if UNITY_2018_1_OR_NEWER + m_materialValue = EditorGUILayoutColorField( Constants.MaterialValueLabelContent, m_materialValue, false, true, m_isHDR ); +#else + m_materialValue = EditorGUILayoutColorField( Constants.MaterialValueLabelContent, m_materialValue, false, true, m_isHDR, m_hdrConfig ); +#endif + if( m_materialMode && EditorGUI.EndChangeCheck() ) + m_requireMaterialUpdate = true; + } + + public override void OnNodeLayout( DrawInfo drawInfo ) + { + base.OnNodeLayout( drawInfo ); + + m_propertyDrawPos = m_globalPosition; + m_propertyDrawPos.x = m_remainingBox.x; + m_propertyDrawPos.y = m_remainingBox.y; + m_propertyDrawPos.width = 80 * drawInfo.InvertedZoom; + m_propertyDrawPos.height = m_remainingBox.height; + } + + public override void DrawGUIControls( DrawInfo drawInfo ) + { + base.DrawGUIControls( drawInfo ); + + if( drawInfo.CurrentEventType != EventType.MouseDown ) + return; + + Rect hitBox = m_remainingBox; + //hitBox.xMin -= LabelWidth * drawInfo.InvertedZoom; + bool insideBox = hitBox.Contains( drawInfo.MousePosition ); + + if( insideBox ) + { + m_isEditingFields = true; + } + else if( m_isEditingFields && !insideBox ) + { + GUI.FocusControl( null ); + m_isEditingFields = false; + } + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + if( !m_isVisible ) + return; + + if( m_isEditingFields && m_currentParameterType != PropertyType.Global ) + { + if( m_materialMode && m_currentParameterType != PropertyType.Constant ) + { + EditorGUI.BeginChangeCheck(); +#if UNITY_2018_1_OR_NEWER + m_materialValue = EditorGUIColorField( m_propertyDrawPos, m_dummyContent, m_materialValue, false, true, m_isHDR ); +#else + m_materialValue = EditorGUIColorField( m_propertyDrawPos, m_dummyContent, m_materialValue, false, true, m_isHDR, m_hdrConfig ); +#endif + if( EditorGUI.EndChangeCheck() ) + { + PreviewIsDirty = true; + m_requireMaterialUpdate = true; + if( m_currentParameterType != PropertyType.Constant ) + { + BeginDelayedDirtyProperty(); + } + } + } + else + { + EditorGUI.BeginChangeCheck(); +#if UNITY_2018_1_OR_NEWER + m_defaultValue = EditorGUIColorField( m_propertyDrawPos, m_dummyContent, m_defaultValue, false, true, m_isHDR ); +#else + m_defaultValue = EditorGUIColorField( m_propertyDrawPos, m_dummyContent, m_defaultValue, false, true, m_isHDR, m_hdrConfig ); +#endif + if( EditorGUI.EndChangeCheck() ) + { + PreviewIsDirty = true; + BeginDelayedDirtyProperty(); + } + } + } + else if( drawInfo.CurrentEventType == EventType.Repaint ) + { + if( m_materialMode && m_currentParameterType != PropertyType.Constant ) + EditorGUIUtility.DrawColorSwatch( m_propertyDrawPos, m_materialValue ); + else + EditorGUIUtility.DrawColorSwatch( m_propertyDrawPos, m_defaultValue ); + + GUI.Label( m_propertyDrawPos, string.Empty, UIUtils.GetCustomStyle( CustomStyle.SamplerFrame ) ); + } + } + + public override void ConfigureLocalVariable( ref MasterNodeDataCollector dataCollector ) + { + Color color = m_defaultValue; + //switch( m_colorSpace ) + //{ + // default: + // case ASEColorSpace.Auto: color = m_defaultValue; break; + // case ASEColorSpace.Gamma: color = m_defaultValue.gamma; break; + // case ASEColorSpace.Linear: color = m_defaultValue.linear; break; + //} + + dataCollector.AddLocalVariable( UniqueId, CreateLocalVarDec( color.r + "," + color.g + "," + color.b + "," + color.a ) ); + + m_outputPorts[ 0 ].SetLocalValue( m_propertyName , dataCollector.PortCategory); + m_outputPorts[ 1 ].SetLocalValue( m_propertyName + ".r", dataCollector.PortCategory ); + m_outputPorts[ 2 ].SetLocalValue( m_propertyName + ".g", dataCollector.PortCategory ); + m_outputPorts[ 3 ].SetLocalValue( m_propertyName + ".b", dataCollector.PortCategory ); + m_outputPorts[ 4 ].SetLocalValue( m_propertyName + ".a", dataCollector.PortCategory ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + m_precisionString = UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, m_outputPorts[ 0 ].DataType ); + + if( m_currentParameterType != PropertyType.Constant ) + return GetOutputVectorItem( 0, outputId, PropertyData( dataCollector.PortCategory ) ); + + // Constant Only Code + + if( m_outputPorts[ outputId ].IsLocalValue(dataCollector.PortCategory) ) + { + return m_outputPorts[ outputId ].LocalValue( dataCollector.PortCategory ); + } + if( m_autoGammaToLinearConversion ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return GetOutputColorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue(dataCollector.PortCategory) ); + + Color linear = m_defaultValue.linear; + + string colorGamma = m_precisionString + "(" + m_defaultValue.r + "," + m_defaultValue.g + "," + m_defaultValue.b + "," + m_defaultValue.a + ")"; + string colorLinear = m_precisionString + "(" + linear.r + "," + linear.g + "," + linear.b + "," + m_defaultValue.a + ")"; + + string result = string.Format( AutoGammaToLinearConversion, colorGamma, colorLinear ); + RegisterLocalVariable( 0, result, ref dataCollector, "color" + OutputId ); + return GetOutputColorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + } + else + { + if( CheckLocalVariable( ref dataCollector ) ) + { + return m_outputPorts[ outputId ].LocalValue( dataCollector.PortCategory ); + } + + Color color = m_defaultValue; + //switch( m_colorSpace ) + //{ + // default: + // case ASEColorSpace.Auto: color = m_defaultValue; break; + // case ASEColorSpace.Gamma: color = m_defaultValue.gamma; break; + // case ASEColorSpace.Linear: color = m_defaultValue.linear; break; + //} + string result = string.Empty; + + switch( outputId ) + { + case 0: + { + result = m_precisionString + "(" + color.r + "," + color.g + "," + color.b + "," + color.a + ")"; + } + break; + + case 1: + { + result = color.r.ToString(); + } + break; + case 2: + { + result = color.g.ToString(); + } + break; + case 3: + { + result = color.b.ToString(); + } + break; + case 4: + { + result = color.a.ToString(); + } + break; + } + return result; + } + } + + protected override void OnAtrributesChanged() + { + CheckIfHDR(); + CheckHeaderAttribute(); + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + CheckIfHDR(); + } + + void CheckIfHDR() + { + int count = m_selectedAttribs.Count; + bool hdrBuffer = m_isHDR; + m_isHDR = false; + for( int i = 0; i < count; i++ ) + { + if( m_selectedAttribs[ i ] == 1 /*HDR Property ID*/) + { + m_isHDR = true; + break; + } + } + + if( hdrBuffer && !m_isHDR ) + { + bool fireDirtyProperty = false; + + if( m_defaultValue.r > 1 || m_defaultValue.g > 1 || m_defaultValue.b > 1 ) + { + float defaultColorLength = Mathf.Sqrt( m_defaultValue.r * m_defaultValue.r + m_defaultValue.g * m_defaultValue.g + m_defaultValue.b * m_defaultValue.b ); + m_defaultValue.r /= defaultColorLength; + m_defaultValue.g /= defaultColorLength; + m_defaultValue.b /= defaultColorLength; + fireDirtyProperty = true; + } + + if( m_materialValue.r > 1 || m_materialValue.g > 1 || m_materialValue.b > 1 ) + { + float materialColorLength = Mathf.Sqrt( m_materialValue.r * m_materialValue.r + m_materialValue.g * m_materialValue.g + m_materialValue.b * m_materialValue.b ); + m_materialValue.r /= materialColorLength; + m_materialValue.g /= materialColorLength; + m_materialValue.b /= materialColorLength; + fireDirtyProperty = true; + } + + if( fireDirtyProperty ) + BeginDelayedDirtyProperty(); + } + } + + public override string GetPropertyValue() + { + return PropertyAttributes + m_propertyName + "(\"" + m_propertyInspectorName + "\", Color) = (" + m_defaultValue.r + "," + m_defaultValue.g + "," + m_defaultValue.b + "," + m_defaultValue.a + ")"; + } + + public override void UpdateMaterial( Material mat ) + { + base.UpdateMaterial( mat ); + + if( UIUtils.IsProperty( m_currentParameterType ) && !InsideShaderFunction ) + { + mat.SetColor( m_propertyName, m_materialValue ); + } + } + + public override void SetMaterialMode( Material mat, bool fetchMaterialValues ) + { + base.SetMaterialMode( mat, fetchMaterialValues ); + if( m_materialMode && fetchMaterialValues ) + { + if( UIUtils.IsProperty( m_currentParameterType ) && mat.HasProperty( m_propertyName ) ) + MaterialValue = mat.GetColor( m_propertyName ); + } + } + + public override void ForceUpdateFromMaterial( Material material ) + { + if( UIUtils.IsProperty( m_currentParameterType ) && material.HasProperty( m_propertyName ) ) + { + MaterialValue = material.GetColor( m_propertyName ); + PreviewIsDirty = true; + } + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_defaultValue = IOUtils.StringToColor( GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > 14101 ) + { + m_materialValue = IOUtils.StringToColor( GetCurrentParam( ref nodeParams ) ); + } + + if( UIUtils.CurrentShaderVersion() > 15900 ) + { + m_autoGammaToLinearConversion = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + else + { + m_autoGammaToLinearConversion = false; + } + //if( UIUtils.CurrentShaderVersion() > 14202 ) + //{ + // m_colorSpace = (ASEColorSpace)Enum.Parse( typeof( ASEColorSpace ), GetCurrentParam( ref nodeParams ) ); + //} + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, IOUtils.ColorToString( m_defaultValue ) ); + IOUtils.AddFieldValueToString( ref nodeInfo, IOUtils.ColorToString( m_materialValue ) ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_autoGammaToLinearConversion ); + //IOUtils.AddFieldValueToString( ref nodeInfo, m_colorSpace ); + } + + public override void SetGlobalValue() { Shader.SetGlobalColor( m_propertyName, m_defaultValue ); } + public override void FetchGlobalValue() { m_materialValue = Shader.GetGlobalColor( m_propertyName ); } + + public override string GetPropertyValStr() + { + return ( m_materialMode && m_currentParameterType != PropertyType.Constant ) ? m_materialValue.r.ToString( Constants.PropertyVectorFormatLabel ) + IOUtils.VECTOR_SEPARATOR + + m_materialValue.g.ToString( Constants.PropertyVectorFormatLabel ) + IOUtils.VECTOR_SEPARATOR + + m_materialValue.b.ToString( Constants.PropertyVectorFormatLabel ) + IOUtils.VECTOR_SEPARATOR + + m_materialValue.a.ToString( Constants.PropertyVectorFormatLabel ) : + m_defaultValue.r.ToString( Constants.PropertyVectorFormatLabel ) + IOUtils.VECTOR_SEPARATOR + + m_defaultValue.g.ToString( Constants.PropertyVectorFormatLabel ) + IOUtils.VECTOR_SEPARATOR + + m_defaultValue.b.ToString( Constants.PropertyVectorFormatLabel ) + IOUtils.VECTOR_SEPARATOR + + m_defaultValue.a.ToString( Constants.PropertyVectorFormatLabel ); + } + + private Color MaterialValue + { + set + { + if( !m_isHDR && ( value.r > 1 || value.g > 1 || value.r > 1 ) ) + { + float materialColorLength = Mathf.Sqrt( value.r * value.r + value.g * value.g + value.b * value.b ); + m_materialValue.r = value.r / materialColorLength; + m_materialValue.g = value.g / materialColorLength; + m_materialValue.b = value.b / materialColorLength; + m_materialValue.a = value.a; + } + else + { + m_materialValue = value; + } + } + } + + public Color Value + { + get { return m_defaultValue; } + set { m_defaultValue = value; } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ColorNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ColorNode.cs.meta new file mode 100644 index 0000000..1a21bb5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ColorNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4b99bcf4cd965c648bbbc1de0d1b152a +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/GlobalArrayNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/GlobalArrayNode.cs new file mode 100644 index 0000000..d224465 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/GlobalArrayNode.cs @@ -0,0 +1,486 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +// +// Custom Node Global Array +// Donated by Johann van Berkel + +using System; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Global Array", "Constants And Properties", "The node returns a value from a global array, which you can configure by entering the name of the array in the node's settings.", null, KeyCode.None, true, false, null, null, "Johann van Berkel" )] + public sealed class GlobalArrayNode : ParentNode + { + private const string DefaultArrayName = "MyGlobalArray"; + private const string TypeStr = "Type"; + private const string AutoRangeCheckStr = "Range Check"; + private const string ArrayFormatStr = "{0}[{1}]"; + private const string JaggedArrayFormatStr = "{0}[{1}][{2}]"; + private const string IsJaggedStr = "Is Jagged"; + private const string AutoRegisterStr = "Auto-Register"; + + private readonly string[] AvailableTypesLabel = { "Float", "Color", "Vector4", "Matrix4" }; + private readonly WirePortDataType[] AvailableTypesValues = { WirePortDataType.FLOAT, WirePortDataType.COLOR, WirePortDataType.FLOAT4, WirePortDataType.FLOAT4x4 }; + + [SerializeField] + private string m_name = DefaultArrayName; + + [SerializeField] + private int m_indexX = 0; + + [SerializeField] + private int m_indexY = 0; + + [SerializeField] + private int m_arrayLengthX = 1; + + [SerializeField] + private int m_arrayLengthY = 1; + + [SerializeField] + private int m_type = 0; + + [SerializeField] + private bool m_autoRangeCheck = false; + + [SerializeField] + private bool m_isJagged = false; + + [SerializeField] + private bool m_autoRegister = false; + + ////////////////////////////////////////////////////////////////// + private readonly Color ReferenceHeaderColor = new Color( 0.6f, 3.0f, 1.25f, 1.0f ); + + [SerializeField] + private TexReferenceType m_referenceType = TexReferenceType.Object; + + [SerializeField] + private int m_referenceArrayId = -1; + + [SerializeField] + private int m_referenceNodeId = -1; + + private GlobalArrayNode m_referenceNode = null; + + private bool m_updated = false; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + + AddInputPort( WirePortDataType.INT, false, "Index", -1, MasterNodePortCategory.Fragment, 0 ); + AddInputPort( WirePortDataType.INT, false, "Index Y", -1, MasterNodePortCategory.Fragment, 2 ); + AddInputPort( WirePortDataType.INT, false, "Array Length", -1, MasterNodePortCategory.Fragment, 1 ); + AddInputPort( WirePortDataType.INT, false, "Array Length Y", -1, MasterNodePortCategory.Fragment, 3 ); + + AddOutputPort( WirePortDataType.FLOAT, "Out" ); + + m_textLabelWidth = 95; + SetAdditonalTitleText( string.Format( Constants.SubTitleValueFormatStr, m_name ) ); + UpdatePorts(); + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + UIUtils.CurrentWindow.OutsideGraph.GlobalArrayNodes.AddNode( this ); + } + + public override void Destroy() + { + base.Destroy(); + UIUtils.CurrentWindow.OutsideGraph.GlobalArrayNodes.RemoveNode( this ); + } + + void UpdatePorts() + { + InputPort indexXPort = GetInputPortByUniqueId( 0 ); + InputPort arrayLengthPortX = GetInputPortByUniqueId( 1 ); + InputPort indexYPort = GetInputPortByUniqueId( 2 ); + InputPort arrayLengthPortY = GetInputPortByUniqueId( 3 ); + if( m_referenceType == TexReferenceType.Object ) + { + m_headerColorModifier = Color.white; + SetAdditonalTitleText( string.Format( Constants.SubTitleValueFormatStr, m_name ) ); + arrayLengthPortX.Visible = true; + if( m_isJagged ) + { + indexXPort.Name = "Index X"; + arrayLengthPortX.Name = "Array Length X"; + indexYPort.Visible = true; + arrayLengthPortY.Visible = true; + } + else + { + indexXPort.Name = "Index"; + arrayLengthPortX.Name = "Array Length"; + indexYPort.Visible = false; + arrayLengthPortY.Visible = false; + } + } + else if( m_referenceNodeId > -1 ) + { + m_headerColorModifier = ReferenceHeaderColor; + if( m_referenceNode == null ) + m_referenceNode = UIUtils.GetNode( m_referenceNodeId ) as GlobalArrayNode; + + if( m_referenceNode != null ) + { + SetAdditonalTitleText( string.Format( Constants.SubTitleValueFormatStr, m_referenceNode.DataToArray ) ); + arrayLengthPortX.Visible = false; + arrayLengthPortY.Visible = false; + if( m_referenceNode.IsJagged ) + { + indexXPort.Name = "Index X"; + indexYPort.Visible = true; + } + else + { + indexXPort.Name = "Index"; + indexYPort.Visible = false; + } + } + } + m_sizeIsDirty = true; + } + + void DrawObjectProperties() + { + EditorGUI.BeginChangeCheck(); + m_name = EditorGUILayoutStringField( "Name", m_name ); + if( EditorGUI.EndChangeCheck() ) + { + m_updated = true; + m_name = UIUtils.RemoveInvalidCharacters( m_name ); + if( string.IsNullOrEmpty( m_name ) ) + m_name = DefaultArrayName; + UIUtils.UpdateGlobalArrayDataNode( UniqueId, m_name ); + SetAdditonalTitleText( string.Format( Constants.SubTitleValueFormatStr, m_name ) ); + } + + + m_autoRegister = EditorGUILayoutToggle( AutoRegisterStr, m_autoRegister ); + + EditorGUI.BeginChangeCheck(); + m_isJagged = EditorGUILayoutToggle( IsJaggedStr, m_isJagged ); + if( EditorGUI.EndChangeCheck() ) + { + m_updated = true; + UpdatePorts(); + } + + InputPort indexXPort = GetInputPortByUniqueId( 0 ); + if( !indexXPort.IsConnected ) + { + EditorGUI.BeginChangeCheck(); + m_indexX = EditorGUILayoutIntField( indexXPort.Name, m_indexX ); + if( EditorGUI.EndChangeCheck() ) + { + m_indexX = Mathf.Clamp( m_indexX, 0, ( m_arrayLengthX - 1 ) ); + } + } + + if( m_isJagged ) + { + InputPort indexYPort = GetInputPortByUniqueId( 2 ); + if( !indexYPort.IsConnected ) + { + EditorGUI.BeginChangeCheck(); + m_indexY = EditorGUILayoutIntField( indexYPort.Name, m_indexY ); + if( EditorGUI.EndChangeCheck() ) + { + m_indexY = Mathf.Clamp( m_indexY, 0, ( m_arrayLengthY - 1 ) ); + } + } + } + + InputPort arrayLengthXPort = GetInputPortByUniqueId( 1 ); + if( !arrayLengthXPort.IsConnected ) + { + EditorGUI.BeginChangeCheck(); + m_arrayLengthX = EditorGUILayoutIntField( arrayLengthXPort.Name, m_arrayLengthX ); + if( EditorGUI.EndChangeCheck() ) + { + m_arrayLengthX = Mathf.Max( 1, m_arrayLengthX ); + } + } + + if( m_isJagged ) + { + InputPort arrayLengthYPort = GetInputPortByUniqueId( 3 ); + if( !arrayLengthYPort.IsConnected ) + { + EditorGUI.BeginChangeCheck(); + m_arrayLengthY = EditorGUILayoutIntField( arrayLengthYPort.Name, m_arrayLengthY ); + if( EditorGUI.EndChangeCheck() ) + { + m_arrayLengthY = Mathf.Max( 1, m_arrayLengthY ); + } + } + } + + EditorGUI.BeginChangeCheck(); + m_type = EditorGUILayoutPopup( TypeStr, m_type, AvailableTypesLabel ); + if( EditorGUI.EndChangeCheck() ) + { + m_outputPorts[ 0 ].ChangeType( (WirePortDataType)AvailableTypesValues[ m_type ], false ); + } + + m_autoRangeCheck = EditorGUILayoutToggle( AutoRangeCheckStr, m_autoRangeCheck ); + } + + public override void OnNodeLayout( DrawInfo drawInfo ) + { + base.OnNodeLayout( drawInfo ); + m_updated = false; + if( m_referenceType == TexReferenceType.Instance ) + { + if( m_referenceNodeId > -1 && m_referenceNode == null ) + { + m_referenceNode = UIUtils.GetNode( m_referenceNodeId ) as GlobalArrayNode; + if( m_referenceNode == null ) + { + m_referenceNodeId = -1; + } + } + if( m_referenceNode != null && m_referenceNode.Updated) + { + UpdatePorts(); + } + } + } + + void DrawInstancedProperties() + { + string[] arr = UIUtils.GlobalArrayNodeArr(); + bool guiEnabledBuffer = GUI.enabled; + if( arr != null && arr.Length > 0 ) + { + GUI.enabled = true; + } + else + { + m_referenceArrayId = -1; + m_referenceNodeId = -1; + m_referenceNode = null; + GUI.enabled = false; + } + EditorGUI.BeginChangeCheck(); + m_referenceArrayId = EditorGUILayoutPopup( Constants.AvailableReferenceStr, m_referenceArrayId, arr ); + if( EditorGUI.EndChangeCheck() ) + { + m_referenceNode = UIUtils.GetGlobalArrayNode( m_referenceArrayId ); + if( m_referenceNode != null ) + { + m_referenceNodeId = m_referenceNode.UniqueId; + } + UpdatePorts(); + } + + GUI.enabled = guiEnabledBuffer; + + InputPort indexXPort = GetInputPortByUniqueId( 0 ); + if( !indexXPort.IsConnected ) + { + EditorGUI.BeginChangeCheck(); + m_indexX = EditorGUILayoutIntField( indexXPort.Name, m_indexX ); + if( EditorGUI.EndChangeCheck() ) + { + m_indexX = Mathf.Clamp( m_indexX, 0, ( m_arrayLengthX - 1 ) ); + } + } + + if( m_isJagged ) + { + InputPort indexYPort = GetInputPortByUniqueId( 2 ); + if( !indexYPort.IsConnected ) + { + EditorGUI.BeginChangeCheck(); + m_indexY = EditorGUILayoutIntField( indexYPort.Name, m_indexY ); + if( EditorGUI.EndChangeCheck() ) + { + m_indexY = Mathf.Clamp( m_indexY, 0, ( m_arrayLengthY - 1 ) ); + } + } + } + } + + public override void DrawProperties() + { + EditorGUI.BeginChangeCheck(); + m_referenceType = (TexReferenceType)EditorGUILayoutPopup( Constants.ReferenceTypeStr, (int)m_referenceType, Constants.ReferenceArrayLabels ); + if( EditorGUI.EndChangeCheck() ) + { + UpdatePorts(); + } + + if( m_referenceType == TexReferenceType.Object ) + DrawObjectProperties(); + else + DrawInstancedProperties(); + } + + public string GetArrayValue( string indexX, string indexY = null ) + { + if( m_isJagged ) + return string.Format( JaggedArrayFormatStr, m_name, indexX, indexY ); + + return string.Format( ArrayFormatStr, m_name, indexX ); + } + + public string GenerateInstancedShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + string result = string.Empty; + if( m_referenceNode != null ) + { + InputPort indexXPort = GetInputPortByUniqueId( 0 ); + if( m_referenceNode.IsJagged ) + { + InputPort indexYPort = GetInputPortByUniqueId( 2 ); + string arrayIndexX = indexXPort.IsConnected ? indexXPort.GeneratePortInstructions( ref dataCollector ) : m_indexX.ToString(); + string arrayIndexY = indexYPort.IsConnected ? indexYPort.GeneratePortInstructions( ref dataCollector ) : m_indexY.ToString(); + result = m_referenceNode.GetArrayValue( arrayIndexX, arrayIndexY ); + } + else + { + string arrayIndexX = indexXPort.IsConnected ? indexXPort.GeneratePortInstructions( ref dataCollector ) : m_indexX.ToString(); + result = m_referenceNode.GetArrayValue( arrayIndexX ); + } + } + m_outputPorts[ 0 ].SetLocalValue( result, dataCollector.PortCategory ); + return result; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + if( m_referenceType == TexReferenceType.Instance ) + return GenerateInstancedShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + + string dataType = UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, AvailableTypesValues[ m_type ] ); + + InputPort indexXPort = GetInputPortByUniqueId( 0 ); + InputPort arrayLengthXPort = GetInputPortByUniqueId( 1 ); + string result = string.Empty; + + if( m_isJagged ) + { + InputPort indexYPort = GetInputPortByUniqueId( 2 ); + InputPort arrayLengthYPort = GetInputPortByUniqueId( 3 ); + + string arrayIndexX = indexXPort.IsConnected ? indexXPort.GeneratePortInstructions( ref dataCollector ) : m_indexX.ToString(); + string arrayLengthX = arrayLengthXPort.IsConnected ? arrayLengthXPort.GeneratePortInstructions( ref dataCollector ) : m_arrayLengthX.ToString(); + + string arrayIndexY = indexYPort.IsConnected ? indexYPort.GeneratePortInstructions( ref dataCollector ) : m_indexY.ToString(); + string arrayLengthY = arrayLengthYPort.IsConnected ? arrayLengthYPort.GeneratePortInstructions( ref dataCollector ) : m_arrayLengthY.ToString(); + + dataCollector.AddToUniforms( UniqueId, dataType, string.Format( JaggedArrayFormatStr, m_name, arrayLengthX, arrayLengthY ) ); + if( m_autoRangeCheck ) + { + arrayIndexX = string.Format( "clamp({0},0,({1} - 1))", arrayIndexX, arrayLengthX ); + arrayIndexY = string.Format( "clamp({0},0,({1} - 1))", arrayIndexY, arrayLengthY ); + } + result = string.Format( JaggedArrayFormatStr, m_name, arrayIndexX, arrayIndexY ); + } + else + { + + string arrayIndex = indexXPort.IsConnected ? indexXPort.GeneratePortInstructions( ref dataCollector ) : m_indexX.ToString(); + string arrayLength = arrayLengthXPort.IsConnected ? arrayLengthXPort.GeneratePortInstructions( ref dataCollector ) : m_arrayLengthX.ToString(); + + + dataCollector.AddToUniforms( UniqueId, dataType, string.Format( ArrayFormatStr, m_name, arrayLength ) ); + + if( m_autoRangeCheck ) + arrayIndex = string.Format( "clamp({0},0,({1} - 1))", arrayIndex, arrayLength ); + + result = string.Format( ArrayFormatStr, m_name, arrayIndex ); + } + + m_outputPorts[ 0 ].SetLocalValue( result, dataCollector.PortCategory ); + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + + public void CheckIfAutoRegister( ref MasterNodeDataCollector dataCollector ) + { + if( m_referenceType == TexReferenceType.Object && m_autoRegister && m_connStatus != NodeConnectionStatus.Connected ) + { + string dataType = UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, AvailableTypesValues[ m_type ] ); + if( m_isJagged ) + { + dataCollector.AddToUniforms( UniqueId, dataType, string.Format( JaggedArrayFormatStr, m_name, m_arrayLengthX, m_arrayLengthY ) ); + } + else + { + dataCollector.AddToUniforms( UniqueId, dataType, string.Format( ArrayFormatStr, m_name, m_arrayLengthX ) ); + } + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_name ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_indexX ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_arrayLengthX ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_type ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_autoRangeCheck ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_isJagged ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_indexY ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_arrayLengthY ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_autoRegister ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_referenceType ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_referenceNodeId ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_name = GetCurrentParam( ref nodeParams ); + m_indexX = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_arrayLengthX = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_type = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_autoRangeCheck = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > 15801 ) + { + m_isJagged = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + m_indexY = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_arrayLengthY = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_autoRegister = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + m_referenceType = (TexReferenceType)Enum.Parse( typeof( TexReferenceType ), GetCurrentParam( ref nodeParams ) ); + m_referenceNodeId = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + SetAdditonalTitleText( string.Format( Constants.SubTitleValueFormatStr, m_name ) ); + UpdatePorts(); + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + if( m_referenceType == TexReferenceType.Instance && m_referenceNodeId > -1 ) + { + m_referenceNode = UIUtils.GetNode( m_referenceNodeId ) as GlobalArrayNode; + if( m_referenceNode != null ) + { + m_referenceArrayId = UIUtils.GetGlobalArrayNodeRegisterId( m_referenceNodeId ); + UpdatePorts(); + } + else + { + m_referenceNodeId = -1; + } + } + } + + public bool AutoRegister { get { return m_autoRegister; } } + public bool IsJagged { get { return m_isJagged; } } + public bool Updated { get { return m_updated; } } + public override string DataToArray { get { return m_name; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/GlobalArrayNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/GlobalArrayNode.cs.meta new file mode 100644 index 0000000..c017121 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/GlobalArrayNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 833b18e1479dbd24c80c5b990e16e2bb +timeCreated: 1499769855 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/GradientNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/GradientNode.cs new file mode 100644 index 0000000..ca7aff0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/GradientNode.cs @@ -0,0 +1,230 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; +using System.Reflection; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Gradient", "Constants And Properties", "Gradient property" )] + public sealed class GradientNode : ParentNode + { + [SerializeField] + private Gradient m_gradient = new Gradient(); + + private string m_functionHeader = "NewGradient( {0}, {1}, {2}," + + " {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}," + + " {11}, {12}, {13}, {14}, {15}, {16}, {17}, {18} )"; + private string m_functionBody = string.Empty; + + private string m_functionHeaderStruct = "Gradient( {0} )"; + private string m_functionBodyStruct = string.Empty; + + public Gradient Gradient { get { return m_gradient; } } + + public GradientNode() : base() { } + public GradientNode( int uniqueId, float x, float y, float width, float height ) : base( uniqueId, x, y, width, height ) { } + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_insideSize.Set( 128, m_insideSize.y ); + AddOutputPort( WirePortDataType.OBJECT, Constants.EmptyPortValue ); + m_autoWrapProperties = true; + m_textLabelWidth = 100; + } + + public override void DrawProperties() + { + base.DrawProperties(); + m_gradient = EditorGUILayoutEx.GradientField( "Gradient", m_gradient ); + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + if( !m_isVisible ) + return; + + m_gradient = EditorGUIEx.GradientField( m_remainingBox, m_gradient ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + m_functionBodyStruct = string.Empty; + m_functionBody = string.Empty; + if( !dataCollector.IsSRP ) + { + GenerateGradientStruct( ref m_functionBodyStruct ); + dataCollector.AddFunctions( m_functionHeaderStruct, m_functionBodyStruct, "0" ); + GenerateGradient( ref m_functionBody ); + } + else + { + dataCollector.AddToIncludes( UniqueId, "Packages/com.unity.shadergraph/ShaderGraphLibrary/Functions.hlsl" ); + } + + string[] colors = new string[ 8 ]; + for( int i = 0; i < 8; i++ ) + { + if( i < m_gradient.colorKeys.Length ) + { + colors[ i ] = "float4( " + m_gradient.colorKeys[ i ].color.r + ", " + m_gradient.colorKeys[ i ].color.g + ", " + m_gradient.colorKeys[ i ].color.b + ", " + m_gradient.colorKeys[ i ].time + " )"; + } + else + { + colors[ i ] = "0"; + } + } + + string[] alphas = new string[ 8 ]; + for( int i = 0; i < 8; i++ ) + { + if( i < m_gradient.alphaKeys.Length ) + { + alphas[ i ] = "float2( " + m_gradient.alphaKeys[ i ].alpha + ", " + m_gradient.alphaKeys[ i ].time + " )"; + } + else + { + alphas[ i ] = "0"; + } + } + + string functionResult = dataCollector.AddFunctions( m_functionHeader, m_functionBody, (int)m_gradient.mode, m_gradient.colorKeys.Length, m_gradient.alphaKeys.Length + , colors[ 0 ], colors[ 1 ], colors[ 2 ], colors[ 3 ], colors[ 4 ], colors[ 5 ], colors[ 6 ], colors[ 7 ] + , alphas[ 0 ], alphas[ 1 ], alphas[ 2 ], alphas[ 3 ], alphas[ 4 ], alphas[ 5 ], alphas[ 6 ], alphas[ 7 ] ); + + dataCollector.AddLocalVariable( UniqueId, "Gradient gradient" + OutputId + " = " + functionResult + ";" ); + + return "gradient" + OutputId; + } + + public static void GenerateGradientStruct( ref string body ) + { + body = string.Empty; + IOUtils.AddFunctionHeader( ref body, "struct Gradient" ); + IOUtils.AddFunctionLine( ref body, "int type;" ); + IOUtils.AddFunctionLine( ref body, "int colorsLength;" ); + IOUtils.AddFunctionLine( ref body, "int alphasLength;" ); + IOUtils.AddFunctionLine( ref body, "float4 colors[8];" ); + IOUtils.AddFunctionLine( ref body, "float2 alphas[8];" ); + IOUtils.AddSingleLineFunction( ref body, "};\n" ); + } + + public static void GenerateGradient( ref string body ) + { + body = string.Empty; + IOUtils.AddFunctionHeader( ref body, "Gradient NewGradient(int type, int colorsLength, int alphasLength, \n\t\tfloat4 colors0, float4 colors1, float4 colors2, float4 colors3, float4 colors4, float4 colors5, float4 colors6, float4 colors7,\n\t\tfloat2 alphas0, float2 alphas1, float2 alphas2, float2 alphas3, float2 alphas4, float2 alphas5, float2 alphas6, float2 alphas7)" ); + IOUtils.AddFunctionLine( ref body, "Gradient g;" ); + IOUtils.AddFunctionLine( ref body, "g.type = type;" ); + IOUtils.AddFunctionLine( ref body, "g.colorsLength = colorsLength;" ); + IOUtils.AddFunctionLine( ref body, "g.alphasLength = alphasLength;" ); + IOUtils.AddFunctionLine( ref body, "g.colors[ 0 ] = colors0;" ); + IOUtils.AddFunctionLine( ref body, "g.colors[ 1 ] = colors1;" ); + IOUtils.AddFunctionLine( ref body, "g.colors[ 2 ] = colors2;" ); + IOUtils.AddFunctionLine( ref body, "g.colors[ 3 ] = colors3;" ); + IOUtils.AddFunctionLine( ref body, "g.colors[ 4 ] = colors4;" ); + IOUtils.AddFunctionLine( ref body, "g.colors[ 5 ] = colors5;" ); + IOUtils.AddFunctionLine( ref body, "g.colors[ 6 ] = colors6;" ); + IOUtils.AddFunctionLine( ref body, "g.colors[ 7 ] = colors7;" ); + IOUtils.AddFunctionLine( ref body, "g.alphas[ 0 ] = alphas0;" ); + IOUtils.AddFunctionLine( ref body, "g.alphas[ 1 ] = alphas1;" ); + IOUtils.AddFunctionLine( ref body, "g.alphas[ 2 ] = alphas2;" ); + IOUtils.AddFunctionLine( ref body, "g.alphas[ 3 ] = alphas3;" ); + IOUtils.AddFunctionLine( ref body, "g.alphas[ 4 ] = alphas4;" ); + IOUtils.AddFunctionLine( ref body, "g.alphas[ 5 ] = alphas5;" ); + IOUtils.AddFunctionLine( ref body, "g.alphas[ 6 ] = alphas6;" ); + IOUtils.AddFunctionLine( ref body, "g.alphas[ 7 ] = alphas7;" ); + IOUtils.AddFunctionLine( ref body, "return g;" ); + IOUtils.CloseFunctionBody( ref body ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_gradient.mode = (GradientMode)Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + int colorCount = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + int alphaCount = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + + var colorKeys = new GradientColorKey[ colorCount ]; + for( int i = 0; i < colorCount; i++ ) + { + Vector4 colorKey = IOUtils.StringToVector4( GetCurrentParam( ref nodeParams ) ); + colorKeys[ i ].color = colorKey; + colorKeys[ i ].time = colorKey.w; + } + m_gradient.colorKeys = colorKeys; + + var alphaKeys = new GradientAlphaKey[ alphaCount ]; + for( int i = 0; i < alphaCount; i++ ) + { + Vector2 alphaKey = IOUtils.StringToVector2( GetCurrentParam( ref nodeParams ) ); + alphaKeys[ i ].alpha = alphaKey.x; + alphaKeys[ i ].time = alphaKey.y; + } + m_gradient.alphaKeys = alphaKeys; + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, (int)m_gradient.mode ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_gradient.colorKeys.Length ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_gradient.alphaKeys.Length ); + + for( int i = 0; i < m_gradient.colorKeys.Length; i++ ) + { + Vector4 colorKey = new Vector4( m_gradient.colorKeys[ i ].color.r, m_gradient.colorKeys[ i ].color.g, m_gradient.colorKeys[ i ].color.b, m_gradient.colorKeys[ i ].time ); + IOUtils.AddFieldValueToString( ref nodeInfo, IOUtils.Vector4ToString( colorKey ) ); + } + + for( int i = 0; i < m_gradient.alphaKeys.Length; i++ ) + { + Vector2 alphaKey = new Vector4( m_gradient.alphaKeys[ i ].alpha, m_gradient.alphaKeys[ i ].time ); + IOUtils.AddFieldValueToString( ref nodeInfo, IOUtils.Vector2ToString( alphaKey ) ); + } + } + } + + internal static class EditorGUILayoutEx + { + public static System.Type Type = typeof( EditorGUILayout ); + public static Gradient GradientField( Gradient value, params GUILayoutOption[] options ) + { +#if UNITY_2018_3_OR_NEWER + return EditorGUILayout.GradientField( value, options ); +#else + MethodInfo method = EditorGUILayoutEx.Type.GetMethod( "GradientField", BindingFlags.NonPublic | BindingFlags.Static, null, new Type[] { typeof( Gradient ), typeof( GUILayoutOption[] ) }, null ); + return (Gradient)method.Invoke( Type, new object[] { value, options } ); +#endif + } + + public static Gradient GradientField( string label, Gradient value, params GUILayoutOption[] options ) + { +#if UNITY_2018_3_OR_NEWER + return EditorGUILayout.GradientField( label, value, options ); +#else + MethodInfo method = EditorGUILayoutEx.Type.GetMethod( "GradientField", BindingFlags.NonPublic | BindingFlags.Static, null, new Type[] { typeof( string ), typeof( Gradient ), typeof( GUILayoutOption[] ) }, null ); + return (Gradient)method.Invoke( Type, new object[] { label, value, options } ); +#endif + } + } + + internal static class EditorGUIEx + { + public static System.Type Type = typeof( EditorGUI ); + + public static Gradient GradientField( Rect position, Gradient gradient ) + { +#if UNITY_2018_3_OR_NEWER + return EditorGUI.GradientField( position, gradient ); +#else + return (Gradient)EditorGUIEx.Type.InvokeMember( "GradientField", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { position, gradient } ); +#endif + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/GradientNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/GradientNode.cs.meta new file mode 100644 index 0000000..cb9b560 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/GradientNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 98100a8a545b8ce42bc5657fd40a24a5 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/IntNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/IntNode.cs new file mode 100644 index 0000000..f90df63 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/IntNode.cs @@ -0,0 +1,300 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Int", "Constants And Properties", "Int property", null, KeyCode.Alpha0 )] + public sealed class IntNode : PropertyNode + { + [SerializeField] + private int m_defaultValue; + + [SerializeField] + private int m_materialValue; + + [SerializeField] + private bool m_setAsUINT = false; + + private const float LabelWidth = 8; + + private int m_cachedPropertyId = -1; + + private bool m_isEditingFields; + private int m_previousValue; + private string m_fieldText = "0"; + + public IntNode() : base() { } + public IntNode( int uniqueId, float x, float y, float width, float height ) : base( uniqueId, x, y, width, height ) { } + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + GlobalTypeWarningText = string.Format( GlobalTypeWarningText, "Int" ); + AddOutputPort( WirePortDataType.INT, Constants.EmptyPortValue ); + m_insideSize.Set( 50, 10 ); + m_selectedLocation = PreviewLocation.BottomCenter; + m_drawPrecisionUI = false; + m_showHybridInstancedUI = true; + m_availableAttribs.Add( new PropertyAttributes( "Enum", "[Enum]" ) ); + m_previewShaderGUID = "0f64d695b6ffacc469f2dd31432a232a"; + m_srpBatcherCompatible = true; + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + UIUtils.RegisterFloatIntNode( this ); + } + + public override void Destroy() + { + base.Destroy(); + UIUtils.UnregisterFloatIntNode( this ); + } + + public override void OnDirtyProperty() + { + UIUtils.UpdateFloatIntDataNode( UniqueId, PropertyInspectorName ); + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + OnPropertyNameChanged(); + OnDirtyProperty(); + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + if( m_cachedPropertyId == -1 ) + m_cachedPropertyId = Shader.PropertyToID( "_InputInt" ); + + if( m_materialMode && m_currentParameterType != PropertyType.Constant ) + PreviewMaterial.SetInt( m_cachedPropertyId, m_materialValue ); + else + PreviewMaterial.SetInt( m_cachedPropertyId, m_defaultValue ); + } + + + public override void CopyDefaultsToMaterial() + { + m_materialValue = m_defaultValue; + DrawSetAsUINT(); + } + + public override void DrawSubProperties() + { + m_defaultValue = EditorGUILayoutIntField( Constants.DefaultValueLabel, m_defaultValue ); + DrawSetAsUINT(); + } + + private void DrawSetAsUINT() + { + EditorGUI.BeginChangeCheck(); + m_setAsUINT = EditorGUILayoutToggle( "Set as UINT", m_setAsUINT ); + if( EditorGUI.EndChangeCheck() ) + { + WirePortDataType portType = m_setAsUINT ? WirePortDataType.UINT : WirePortDataType.INT; + m_outputPorts[ 0 ].ChangeType( portType, false ); + } + } + + public override void DrawMaterialProperties() + { + if( m_materialMode ) + EditorGUI.BeginChangeCheck(); + + m_materialValue = EditorGUILayoutIntField( Constants.MaterialValueLabel, m_materialValue ); + + if( m_materialMode && EditorGUI.EndChangeCheck() ) + { + m_requireMaterialUpdate = true; + } + } + + public override void OnNodeLayout( DrawInfo drawInfo ) + { + base.OnNodeLayout( drawInfo ); + + m_propertyDrawPos = m_remainingBox; + m_propertyDrawPos.x = m_remainingBox.x - LabelWidth * drawInfo.InvertedZoom; + m_propertyDrawPos.width = drawInfo.InvertedZoom * Constants.FLOAT_DRAW_WIDTH_FIELD_SIZE; + m_propertyDrawPos.height = drawInfo.InvertedZoom * Constants.FLOAT_DRAW_HEIGHT_FIELD_SIZE; + } + + public override void DrawGUIControls( DrawInfo drawInfo ) + { + base.DrawGUIControls( drawInfo ); + + if( drawInfo.CurrentEventType != EventType.MouseDown ) + return; + + Rect hitBox = m_remainingBox; + hitBox.xMin -= LabelWidth * drawInfo.InvertedZoom; + bool insideBox = hitBox.Contains( drawInfo.MousePosition ); + + if( insideBox ) + { + GUI.FocusControl( null ); + m_isEditingFields = true; + } + else if( m_isEditingFields && !insideBox ) + { + GUI.FocusControl( null ); + m_isEditingFields = false; + } + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + if( !m_isVisible ) + return; + + if( m_isEditingFields && m_currentParameterType != PropertyType.Global ) + { + float labelWidth = EditorGUIUtility.labelWidth; + EditorGUIUtility.labelWidth = LabelWidth * drawInfo.InvertedZoom; + + if( m_materialMode && m_currentParameterType != PropertyType.Constant ) + { + EditorGUI.BeginChangeCheck(); + m_materialValue = EditorGUIIntField( m_propertyDrawPos, " ", m_materialValue, UIUtils.MainSkin.textField ); + if( EditorGUI.EndChangeCheck() ) + { + PreviewIsDirty = true; + m_requireMaterialUpdate = true; + if( m_currentParameterType != PropertyType.Constant ) + BeginDelayedDirtyProperty(); + } + } + else + { + EditorGUI.BeginChangeCheck(); + + m_defaultValue = EditorGUIIntField( m_propertyDrawPos, " ", m_defaultValue, UIUtils.MainSkin.textField ); + + if( EditorGUI.EndChangeCheck() ) + { + PreviewIsDirty = true; + BeginDelayedDirtyProperty(); + } + } + EditorGUIUtility.labelWidth = labelWidth; + } + else if( drawInfo.CurrentEventType == EventType.Repaint ) + { + bool guiEnabled = GUI.enabled; + GUI.enabled = m_currentParameterType != PropertyType.Global; + Rect fakeField = m_propertyDrawPos; + fakeField.xMin += LabelWidth * drawInfo.InvertedZoom; + if( GUI.enabled ) + { + Rect fakeLabel = m_propertyDrawPos; + fakeLabel.xMax = fakeField.xMin; + EditorGUIUtility.AddCursorRect( fakeLabel, MouseCursor.SlideArrow ); + EditorGUIUtility.AddCursorRect( fakeField, MouseCursor.Text ); + } + bool currMode = m_materialMode && m_currentParameterType != PropertyType.Constant; + int value = currMode ? m_materialValue : m_defaultValue; + + if( m_previousValue != value ) + { + m_previousValue = value; + m_fieldText = value.ToString(); + } + + GUI.Label( fakeField, m_fieldText, UIUtils.MainSkin.textField ); + GUI.enabled = guiEnabled; + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + + if( m_currentParameterType != PropertyType.Constant ) + return PropertyData( dataCollector.PortCategory ); + + return m_defaultValue.ToString(); + } + + public override string GetPropertyValue() + { + return PropertyAttributes + m_propertyName + "(\"" + m_propertyInspectorName + "\", Int) = " + m_defaultValue; + } + + public override void UpdateMaterial( Material mat ) + { + base.UpdateMaterial( mat ); + if( UIUtils.IsProperty( m_currentParameterType ) && !InsideShaderFunction ) + { + mat.SetInt( m_propertyName, m_materialValue ); + } + } + + public override void SetMaterialMode( Material mat, bool fetchMaterialValues ) + { + base.SetMaterialMode( mat, fetchMaterialValues ); + if( fetchMaterialValues && m_materialMode && UIUtils.IsProperty( m_currentParameterType ) && mat.HasProperty( m_propertyName ) ) + { + m_materialValue = mat.GetInt( m_propertyName ); + } + } + + public override void ForceUpdateFromMaterial( Material material ) + { + if( UIUtils.IsProperty( m_currentParameterType ) && material.HasProperty( m_propertyName ) ) + { + m_materialValue = material.GetInt( m_propertyName ); + PreviewIsDirty = true; + } + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_defaultValue = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > 14101 ) + m_materialValue = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > 18500 ) + m_setAsUINT = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_defaultValue ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_materialValue ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_setAsUINT ); + } + + public override string GetPropertyValStr() + { + return ( m_materialMode && m_currentParameterType != PropertyType.Constant ) ? + m_materialValue.ToString( Mathf.Abs( m_materialValue ) > 1000 ? Constants.PropertyBigIntFormatLabel : Constants.PropertyIntFormatLabel ) : + m_defaultValue.ToString( Mathf.Abs( m_defaultValue ) > 1000 ? Constants.PropertyBigIntFormatLabel : Constants.PropertyIntFormatLabel ); + } + + public override void SetGlobalValue() { Shader.SetGlobalInt( m_propertyName, m_defaultValue ); } + public override void FetchGlobalValue() { m_materialValue = Shader.GetGlobalInt( m_propertyName ); } + public int Value + { + get { return m_defaultValue; } + set { m_defaultValue = value; } + } + + public void SetMaterialValueFromInline( int val ) + { + m_materialValue = val; + m_requireMaterialUpdate = true; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/IntNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/IntNode.cs.meta new file mode 100644 index 0000000..0bbac6f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/IntNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 86df2da3da3b1eb4493b968b47030b17 +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Matrix3X3Node.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Matrix3X3Node.cs new file mode 100644 index 0000000..02266c8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Matrix3X3Node.cs @@ -0,0 +1,261 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Matrix3X3", "Constants And Properties", "Matrix3X3 property" )] + public sealed class Matrix3X3Node : MatrixParentNode + { + private string[,] m_fieldText = new string[ 3, 3 ] { { "0", "0", "0" }, { "0", "0", "0" }, { "0", "0", "0" } }; + public Matrix3X3Node() : base() { } + public Matrix3X3Node( int uniqueId, float x, float y, float width, float height ) : base( uniqueId, x, y, width, height ) { } + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + GlobalTypeWarningText = string.Format( GlobalTypeWarningText, "Matrix" ); + AddOutputPort( WirePortDataType.FLOAT3x3, Constants.EmptyPortValue ); + m_insideSize.Set( Constants.FLOAT_DRAW_WIDTH_FIELD_SIZE * 3 + Constants.FLOAT_WIDTH_SPACING * 2, Constants.FLOAT_DRAW_HEIGHT_FIELD_SIZE * 3 + Constants.FLOAT_WIDTH_SPACING * 2 + Constants.OUTSIDE_WIRE_MARGIN ); + //m_defaultValue = new Matrix4x4(); + //m_materialValue = new Matrix4x4(); + m_drawPreview = false; + } + + public override void CopyDefaultsToMaterial() + { + m_materialValue = m_defaultValue; + } + + public override void DrawSubProperties() + { + EditorGUILayout.LabelField( Constants.DefaultValueLabel ); + for( int row = 0; row < 3; row++ ) + { + EditorGUILayout.BeginHorizontal(); + for( int column = 0; column < 3; column++ ) + { + m_defaultValue[ row, column ] = EditorGUILayoutFloatField( string.Empty, m_defaultValue[ row, column ], GUILayout.MaxWidth( 76 ) ); + } + EditorGUILayout.EndHorizontal(); + } + } + + public override void DrawMaterialProperties() + { + if( m_materialMode ) + EditorGUI.BeginChangeCheck(); + + EditorGUILayout.LabelField( Constants.MaterialValueLabel ); + for( int row = 0; row < 3; row++ ) + { + EditorGUILayout.BeginHorizontal(); + for( int column = 0; column < 3; column++ ) + { + m_materialValue[ row, column ] = EditorGUILayoutFloatField( string.Empty, m_materialValue[ row, column ], GUILayout.MaxWidth( 76 ) ); + } + EditorGUILayout.EndHorizontal(); + } + + if( m_materialMode && EditorGUI.EndChangeCheck() ) + m_requireMaterialUpdate = true; + } + + public override void OnNodeLayout( DrawInfo drawInfo ) + { + base.OnNodeLayout( drawInfo ); + + m_propertyDrawPos.position = m_remainingBox.position; + m_propertyDrawPos.width = drawInfo.InvertedZoom * Constants.FLOAT_DRAW_WIDTH_FIELD_SIZE; + m_propertyDrawPos.height = drawInfo.InvertedZoom * Constants.FLOAT_DRAW_HEIGHT_FIELD_SIZE; + } + + public override void DrawGUIControls( DrawInfo drawInfo ) + { + base.DrawGUIControls( drawInfo ); + + if( drawInfo.CurrentEventType != EventType.MouseDown ) + return; + + Rect hitBox = m_remainingBox; + hitBox.height = m_insideSize.y * drawInfo.InvertedZoom; + bool insideBox = hitBox.Contains( drawInfo.MousePosition ); + + if( insideBox ) + { + GUI.FocusControl( null ); + m_isEditingFields = true; + } + else if( m_isEditingFields && !insideBox ) + { + GUI.FocusControl( null ); + m_isEditingFields = false; + } + } + + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + if( !m_isVisible ) + return; + + if( m_isEditingFields && m_currentParameterType != PropertyType.Global ) + { + bool currMode = m_materialMode && m_currentParameterType != PropertyType.Constant; + Matrix4x4 value = currMode ? m_materialValue : m_defaultValue; + + EditorGUI.BeginChangeCheck(); + for( int row = 0; row < 3; row++ ) + { + for( int column = 0; column < 3; column++ ) + { + m_propertyDrawPos.position = m_remainingBox.position + Vector2.Scale( m_propertyDrawPos.size, new Vector2( column, row ) ) + new Vector2( Constants.FLOAT_WIDTH_SPACING * drawInfo.InvertedZoom * column, Constants.FLOAT_WIDTH_SPACING * drawInfo.InvertedZoom * row ); + value[ row, column ] = EditorGUIFloatField( m_propertyDrawPos, string.Empty, value[ row, column ], UIUtils.MainSkin.textField ); + } + } + + if( currMode ) + { + m_materialValue = value; + } + else + { + m_defaultValue = value; + } + + if( EditorGUI.EndChangeCheck() ) + { + m_requireMaterialUpdate = m_materialMode; + BeginDelayedDirtyProperty(); + } + } + else if( drawInfo.CurrentEventType == EventType.Repaint ) + { + bool guiEnabled = GUI.enabled; + GUI.enabled = m_currentParameterType != PropertyType.Global; + + bool currMode = m_materialMode && m_currentParameterType != PropertyType.Constant; + Matrix4x4 value = currMode ? m_materialValue : m_defaultValue; + for( int row = 0; row < 3; row++ ) + { + for( int column = 0; column < 3; column++ ) + { + Rect fakeField = m_propertyDrawPos; + fakeField.position = m_remainingBox.position + Vector2.Scale( m_propertyDrawPos.size, new Vector2( column, row ) ) + new Vector2( Constants.FLOAT_WIDTH_SPACING * drawInfo.InvertedZoom * column, Constants.FLOAT_WIDTH_SPACING * drawInfo.InvertedZoom * row ); + if( GUI.enabled ) + EditorGUIUtility.AddCursorRect( fakeField, MouseCursor.Text ); + + if( m_previousValue[ row, column ] != value[ row, column ] ) + { + m_previousValue[ row, column ] = value[ row, column ]; + m_fieldText[ row, column ] = value[ row, column ].ToString(); + } + + GUI.Label( fakeField, m_fieldText[ row, column ], UIUtils.MainSkin.textField ); + } + } + GUI.enabled = guiEnabled; + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + m_precisionString = UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, m_outputPorts[ 0 ].DataType ); + if( m_currentParameterType != PropertyType.Constant ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + string localVarName = PropertyData( dataCollector.PortCategory ) + "Local3x3"; + string localVarValue = string.Format( "float3x3({0}._m00,{0}._m01,{0}._m02,{0}._m10,{0}._m11,{0}._m12,{0}._m20,{0}._m21,{0}._m22 )", PropertyData( dataCollector.PortCategory ) ); + RegisterLocalVariable( 0, localVarValue, ref dataCollector, localVarName ); + return localVarName; + } + + Matrix4x4 value = m_defaultValue; + + return m_precisionString + "(" + value[ 0, 0 ] + "," + value[ 0, 1 ] + "," + value[ 0, 2 ] + "," + + +value[ 1, 0 ] + "," + value[ 1, 1 ] + "," + value[ 1, 2 ] + "," + + +value[ 2, 0 ] + "," + value[ 2, 1 ] + "," + value[ 2, 2 ] + ")"; + + } + + + public override void UpdateMaterial( Material mat ) + { + base.UpdateMaterial( mat ); + if( UIUtils.IsProperty( m_currentParameterType ) && !InsideShaderFunction ) + { + Shader.SetGlobalMatrix( m_propertyName, m_materialValue ); + //mat.SetMatrix( m_propertyName, m_materialValue ); + } + } + + public override bool GetUniformData( out string dataType, out string dataName, ref bool fullValue ) + { + dataType = UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, WirePortDataType.FLOAT4x4 ); + dataName = m_propertyName; + return true; + } + + public override void SetMaterialMode( Material mat, bool fetchMaterialValues ) + { + base.SetMaterialMode( mat, fetchMaterialValues ); + if( fetchMaterialValues && m_materialMode && UIUtils.IsProperty( m_currentParameterType ) && mat.HasProperty( m_propertyName ) ) + { + m_materialValue = mat.GetMatrix( m_propertyName ); + } + } + + public override void ForceUpdateFromMaterial( Material material ) + { + if( UIUtils.IsProperty( m_currentParameterType ) && material.HasProperty( m_propertyName ) ) + { + m_materialValue = material.GetMatrix( m_propertyName ); + PreviewIsDirty = true; + } + } + + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_defaultValue = IOUtils.StringToMatrix3x3( GetCurrentParam( ref nodeParams ) ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, IOUtils.Matrix3x3ToString( m_defaultValue ) ); + } + + public override void ReadAdditionalClipboardData( ref string[] nodeParams ) + { + base.ReadAdditionalClipboardData( ref nodeParams ); + m_materialValue = IOUtils.StringToMatrix3x3( GetCurrentParam( ref nodeParams ) ); + } + + public override void WriteAdditionalClipboardData( ref string nodeInfo ) + { + base.WriteAdditionalClipboardData( ref nodeInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, IOUtils.Matrix3x3ToString( m_materialValue ) ); + } + + public override string GetPropertyValStr() + { + return ( m_materialMode && m_currentParameterType != PropertyType.Constant ) ? m_materialValue[ 0, 0 ].ToString( Mathf.Abs( m_materialValue[ 0, 0 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_materialValue[ 0, 1 ].ToString( Mathf.Abs( m_materialValue[ 0, 1 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_materialValue[ 0, 2 ].ToString( Mathf.Abs( m_materialValue[ 0, 2 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.MATRIX_DATA_SEPARATOR + + m_materialValue[ 1, 0 ].ToString( Mathf.Abs( m_materialValue[ 1, 0 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_materialValue[ 1, 1 ].ToString( Mathf.Abs( m_materialValue[ 1, 1 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_materialValue[ 1, 2 ].ToString( Mathf.Abs( m_materialValue[ 1, 2 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.MATRIX_DATA_SEPARATOR + + m_materialValue[ 2, 0 ].ToString( Mathf.Abs( m_materialValue[ 2, 0 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_materialValue[ 2, 1 ].ToString( Mathf.Abs( m_materialValue[ 2, 1 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_materialValue[ 2, 2 ].ToString( Mathf.Abs( m_materialValue[ 2, 2 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) : + + m_defaultValue[ 0, 0 ].ToString( Mathf.Abs( m_defaultValue[ 0, 0 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_defaultValue[ 0, 1 ].ToString( Mathf.Abs( m_defaultValue[ 0, 1 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_defaultValue[ 0, 2 ].ToString( Mathf.Abs( m_defaultValue[ 0, 2 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.MATRIX_DATA_SEPARATOR + + m_defaultValue[ 1, 0 ].ToString( Mathf.Abs( m_defaultValue[ 1, 0 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_defaultValue[ 1, 1 ].ToString( Mathf.Abs( m_defaultValue[ 1, 1 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_defaultValue[ 1, 2 ].ToString( Mathf.Abs( m_defaultValue[ 1, 2 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.MATRIX_DATA_SEPARATOR + + m_defaultValue[ 2, 0 ].ToString( Mathf.Abs( m_defaultValue[ 2, 0 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_defaultValue[ 2, 1 ].ToString( Mathf.Abs( m_defaultValue[ 2, 1 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_defaultValue[ 2, 2 ].ToString( Mathf.Abs( m_defaultValue[ 2, 2 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ); + } + + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Matrix3X3Node.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Matrix3X3Node.cs.meta new file mode 100644 index 0000000..4c852d9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Matrix3X3Node.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 01e5a5829caac674fa819ed229de31b6 +timeCreated: 1481126953 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Matrix4X4Node.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Matrix4X4Node.cs new file mode 100644 index 0000000..44b9970 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Matrix4X4Node.cs @@ -0,0 +1,248 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Matrix4X4", "Constants And Properties", "Matrix4X4 property" )] + public sealed class Matrix4X4Node : MatrixParentNode + { + private string[,] m_fieldText = new string[ 4, 4 ] { { "0", "0", "0", "0" }, { "0", "0", "0", "0" }, { "0", "0", "0", "0" }, { "0", "0", "0", "0" } }; + public Matrix4X4Node() : base() { } + public Matrix4X4Node( int uniqueId, float x, float y, float width, float height ) : base( uniqueId, x, y, width, height ) { } + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + GlobalTypeWarningText = string.Format( GlobalTypeWarningText, "Matrix" ); + AddOutputPort( WirePortDataType.FLOAT4x4, Constants.EmptyPortValue ); + m_insideSize.Set( Constants.FLOAT_DRAW_WIDTH_FIELD_SIZE * 4 + Constants.FLOAT_WIDTH_SPACING * 3, Constants.FLOAT_DRAW_HEIGHT_FIELD_SIZE * 4 + Constants.FLOAT_WIDTH_SPACING * 3 + Constants.OUTSIDE_WIRE_MARGIN ); + //m_defaultValue = new Matrix4x4(); + //m_materialValue = new Matrix4x4(); + m_drawPreview = false; + } + + public override void CopyDefaultsToMaterial() + { + m_materialValue = m_defaultValue; + } + + public override void DrawSubProperties() + { + EditorGUILayout.LabelField( Constants.DefaultValueLabel ); + for ( int row = 0; row < 4; row++ ) + { + EditorGUILayout.BeginHorizontal(); + for ( int column = 0; column < 4; column++ ) + { + m_defaultValue[ row, column ] = EditorGUILayoutFloatField( string.Empty, m_defaultValue[ row, column ], GUILayout.MaxWidth( 55 ) ); + } + EditorGUILayout.EndHorizontal(); + } + } + + public override void DrawMaterialProperties() + { + if ( m_materialMode ) + EditorGUI.BeginChangeCheck(); + + EditorGUILayout.LabelField( Constants.MaterialValueLabel ); + for ( int row = 0; row < 4; row++ ) + { + EditorGUILayout.BeginHorizontal(); + for ( int column = 0; column < 4; column++ ) + { + m_materialValue[ row, column ] = EditorGUILayoutFloatField( string.Empty, m_materialValue[ row, column ], GUILayout.MaxWidth( 55 ) ); + } + EditorGUILayout.EndHorizontal(); + } + + if ( m_materialMode && EditorGUI.EndChangeCheck() ) + m_requireMaterialUpdate = true; + } + + public override void OnNodeLayout( DrawInfo drawInfo ) + { + base.OnNodeLayout( drawInfo ); + + m_propertyDrawPos.position = m_remainingBox.position; + m_propertyDrawPos.width = drawInfo.InvertedZoom * Constants.FLOAT_DRAW_WIDTH_FIELD_SIZE; + m_propertyDrawPos.height = drawInfo.InvertedZoom * Constants.FLOAT_DRAW_HEIGHT_FIELD_SIZE; + } + + public override void DrawGUIControls( DrawInfo drawInfo ) + { + base.DrawGUIControls( drawInfo ); + + if ( drawInfo.CurrentEventType != EventType.MouseDown ) + return; + + Rect hitBox = m_remainingBox; + hitBox.height = m_insideSize.y * drawInfo.InvertedZoom; + bool insideBox = hitBox.Contains( drawInfo.MousePosition ); + + if ( insideBox ) + { + GUI.FocusControl( null ); + m_isEditingFields = true; + } + else if ( m_isEditingFields && !insideBox ) + { + GUI.FocusControl( null ); + m_isEditingFields = false; + } + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + if ( !m_isVisible ) + return; + + if ( m_isEditingFields && m_currentParameterType != PropertyType.Global ) + { + bool currMode = m_materialMode && m_currentParameterType != PropertyType.Constant; + Matrix4x4 value = currMode ? m_materialValue : m_defaultValue; + + EditorGUI.BeginChangeCheck(); + for ( int row = 0; row < 4; row++ ) + { + for ( int column = 0; column < 4; column++ ) + { + m_propertyDrawPos.position = m_remainingBox.position + Vector2.Scale( m_propertyDrawPos.size, new Vector2( column, row ) ) + new Vector2( Constants.FLOAT_WIDTH_SPACING * drawInfo.InvertedZoom * column, Constants.FLOAT_WIDTH_SPACING * drawInfo.InvertedZoom * row ); + value[ row, column ] = EditorGUIFloatField( m_propertyDrawPos, string.Empty, value[ row, column ], UIUtils.MainSkin.textField ); + } + } + + if ( currMode ) + { + m_materialValue = value; + } + else + { + m_defaultValue = value; + } + + if ( EditorGUI.EndChangeCheck() ) + { + m_requireMaterialUpdate = m_materialMode; + BeginDelayedDirtyProperty(); + } + } + else if ( drawInfo.CurrentEventType == EventType.Repaint ) + { + bool guiEnabled = GUI.enabled; + GUI.enabled = m_currentParameterType != PropertyType.Global; + + bool currMode = m_materialMode && m_currentParameterType != PropertyType.Constant; + Matrix4x4 value = currMode ? m_materialValue : m_defaultValue; + for ( int row = 0; row < 4; row++ ) + { + for ( int column = 0; column < 4; column++ ) + { + Rect fakeField = m_propertyDrawPos; + fakeField.position = m_remainingBox.position + Vector2.Scale( m_propertyDrawPos.size, new Vector2( column, row ) ) + new Vector2( Constants.FLOAT_WIDTH_SPACING * drawInfo.InvertedZoom * column, Constants.FLOAT_WIDTH_SPACING * drawInfo.InvertedZoom * row ); + if( GUI.enabled ) + EditorGUIUtility.AddCursorRect( fakeField, MouseCursor.Text ); + + if ( m_previousValue[ row, column ] != value[ row, column ] ) + { + m_previousValue[ row, column ] = value[ row, column ]; + m_fieldText[ row, column ] = value[ row, column ].ToString(); + } + + GUI.Label( fakeField, m_fieldText[ row, column ], UIUtils.MainSkin.textField ); + } + } + GUI.enabled = guiEnabled; + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + m_precisionString = UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, m_outputPorts[ 0 ].DataType ); + if ( m_currentParameterType != PropertyType.Constant ) + return PropertyData( dataCollector.PortCategory ); + + Matrix4x4 value = m_defaultValue; + + return m_precisionString+"(" + value[ 0, 0 ] + "," + value[ 0, 1 ] + "," + value[ 0, 2 ] + "," + value[ 0, 3 ] + "," + + +value[ 1, 0 ] + "," + value[ 1, 1 ] + "," + value[ 1, 2 ] + "," + value[ 1, 3 ] + "," + + +value[ 2, 0 ] + "," + value[ 2, 1 ] + "," + value[ 2, 2 ] + "," + value[ 2, 3 ] + "," + + +value[ 3, 0 ] + "," + value[ 3, 1 ] + "," + value[ 3, 2 ] + "," + value[ 3, 3 ] + ")"; + + } + + + public override void UpdateMaterial( Material mat ) + { + base.UpdateMaterial( mat ); + if ( UIUtils.IsProperty( m_currentParameterType ) && !InsideShaderFunction ) + { + mat.SetMatrix( m_propertyName, m_materialValue ); + } + } + + public override void SetMaterialMode( Material mat , bool fetchMaterialValues ) + { + base.SetMaterialMode( mat , fetchMaterialValues ); + if ( fetchMaterialValues && m_materialMode && UIUtils.IsProperty( m_currentParameterType ) && mat.HasProperty( m_propertyName ) ) + { + m_materialValue = mat.GetMatrix( m_propertyName ); + } + } + + public override void ForceUpdateFromMaterial( Material material ) + { + if( UIUtils.IsProperty( m_currentParameterType ) && material.HasProperty( m_propertyName ) ) + { + m_materialValue = material.GetMatrix( m_propertyName ); + PreviewIsDirty = true; + } + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_defaultValue = IOUtils.StringToMatrix4x4( GetCurrentParam( ref nodeParams ) ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, IOUtils.Matrix4x4ToString( m_defaultValue ) ); + } + + public override void ReadAdditionalClipboardData( ref string[] nodeParams ) + { + base.ReadAdditionalClipboardData( ref nodeParams ); + m_materialValue = IOUtils.StringToMatrix4x4( GetCurrentParam( ref nodeParams ) ); + } + + public override void WriteAdditionalClipboardData( ref string nodeInfo ) + { + base.WriteAdditionalClipboardData( ref nodeInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, IOUtils.Matrix4x4ToString( m_materialValue ) ); + } + + + public override string GetPropertyValStr() + { + return ( m_materialMode && m_currentParameterType != PropertyType.Constant ) ? m_materialValue[ 0, 0 ].ToString( Mathf.Abs( m_materialValue[ 0, 0 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_materialValue[ 0, 1 ].ToString( Mathf.Abs( m_materialValue[ 0, 1 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_materialValue[ 0, 2 ].ToString( Mathf.Abs( m_materialValue[ 0, 2 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_materialValue[ 0, 3 ].ToString( Mathf.Abs( m_materialValue[ 0, 3 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.MATRIX_DATA_SEPARATOR + + m_materialValue[ 1, 0 ].ToString( Mathf.Abs( m_materialValue[ 1, 0 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_materialValue[ 1, 1 ].ToString( Mathf.Abs( m_materialValue[ 1, 1 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_materialValue[ 1, 2 ].ToString( Mathf.Abs( m_materialValue[ 1, 2 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_materialValue[ 1, 3 ].ToString( Mathf.Abs( m_materialValue[ 1, 3 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.MATRIX_DATA_SEPARATOR + + m_materialValue[ 2, 0 ].ToString( Mathf.Abs( m_materialValue[ 2, 0 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_materialValue[ 2, 1 ].ToString( Mathf.Abs( m_materialValue[ 2, 1 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_materialValue[ 2, 2 ].ToString( Mathf.Abs( m_materialValue[ 2, 2 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_materialValue[ 2, 3 ].ToString( Mathf.Abs( m_materialValue[ 2, 3 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.MATRIX_DATA_SEPARATOR + + m_materialValue[ 3, 0 ].ToString( Mathf.Abs( m_materialValue[ 3, 0 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_materialValue[ 3, 1 ].ToString( Mathf.Abs( m_materialValue[ 3, 1 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_materialValue[ 3, 2 ].ToString( Mathf.Abs( m_materialValue[ 3, 2 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_materialValue[ 3, 3 ].ToString( Mathf.Abs( m_materialValue[ 3, 3 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) : + + m_defaultValue[ 0, 0 ].ToString( Mathf.Abs( m_defaultValue[ 0, 0 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_defaultValue[ 0, 1 ].ToString( Mathf.Abs( m_defaultValue[ 0, 1 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_defaultValue[ 0, 2 ].ToString( Mathf.Abs( m_defaultValue[ 0, 2 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_defaultValue[ 0, 3 ].ToString( Mathf.Abs( m_defaultValue[ 0, 3 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.MATRIX_DATA_SEPARATOR + + m_defaultValue[ 1, 0 ].ToString( Mathf.Abs( m_defaultValue[ 1, 0 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_defaultValue[ 1, 1 ].ToString( Mathf.Abs( m_defaultValue[ 1, 1 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_defaultValue[ 1, 2 ].ToString( Mathf.Abs( m_defaultValue[ 1, 2 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_defaultValue[ 1, 3 ].ToString( Mathf.Abs( m_defaultValue[ 1, 3 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.MATRIX_DATA_SEPARATOR + + m_defaultValue[ 2, 0 ].ToString( Mathf.Abs( m_defaultValue[ 2, 0 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_defaultValue[ 2, 1 ].ToString( Mathf.Abs( m_defaultValue[ 2, 1 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_defaultValue[ 2, 2 ].ToString( Mathf.Abs( m_defaultValue[ 2, 2 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_defaultValue[ 2, 3 ].ToString( Mathf.Abs( m_defaultValue[ 2, 3 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.MATRIX_DATA_SEPARATOR + + m_defaultValue[ 3, 0 ].ToString( Mathf.Abs( m_defaultValue[ 3, 0 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_defaultValue[ 3, 1 ].ToString( Mathf.Abs( m_defaultValue[ 3, 1 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_defaultValue[ 3, 2 ].ToString( Mathf.Abs( m_defaultValue[ 3, 2 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ) + IOUtils.VECTOR_SEPARATOR + m_defaultValue[ 3, 3 ].ToString( Mathf.Abs( m_defaultValue[ 3, 3 ] ) > 1000 ? Constants.PropertyBigMatrixFormatLabel : Constants.PropertyMatrixFormatLabel ); + } + + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Matrix4X4Node.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Matrix4X4Node.cs.meta new file mode 100644 index 0000000..10ec1a2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Matrix4X4Node.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4fa5db614b9379b4da27edafa0a8f4e9 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/MatrixParentNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/MatrixParentNode.cs new file mode 100644 index 0000000..85e0504 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/MatrixParentNode.cs @@ -0,0 +1,86 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class MatrixParentNode : PropertyNode + { + private readonly string[] AvailablePropertyTypeLabels = { PropertyType.Constant.ToString(), PropertyType.Global.ToString(), "Instanced" }; + private readonly int[] AvailablePropertyTypeValues = { (int)PropertyType.Constant, (int)PropertyType.Global , (int)PropertyType.InstancedProperty }; + + protected bool m_isEditingFields; + + [SerializeField] + protected Matrix4x4 m_defaultValue = Matrix4x4.identity; + + [SerializeField] + protected Matrix4x4 m_materialValue = Matrix4x4.identity; + + [NonSerialized] + protected Matrix4x4 m_previousValue; + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + + public MatrixParentNode() : base() { } + public MatrixParentNode( int uniqueId, float x, float y, float width, float height ) : base( uniqueId, x, y, width, height ) { } + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_freeType = false; + m_showVariableMode = true; + } + + public override void AfterCommonInit() + { + base.AfterCommonInit(); + m_hasLeftDropdown = true; + m_drawAttributes = false; + m_availableAttribs.Clear(); + + if( PaddingTitleLeft == 0 ) + { + PaddingTitleLeft = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + if( PaddingTitleRight == 0 ) + PaddingTitleRight = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + } + } + + protected void DrawParameterType() + { + PropertyType parameterType = (PropertyType)EditorGUILayoutIntPopup( ParameterTypeStr, (int)m_currentParameterType, AvailablePropertyTypeLabels, AvailablePropertyTypeValues ); + if( parameterType != m_currentParameterType ) + { + ChangeParameterType( parameterType ); + } + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + PropertyType parameterType = (PropertyType)m_upperLeftWidget.DrawWidget( this, (int)m_currentParameterType, AvailablePropertyTypeLabels, AvailablePropertyTypeValues ); + if( parameterType != m_currentParameterType ) + { + ChangeParameterType( parameterType ); + } + } + + public override void DrawMainPropertyBlock() + { + DrawParameterType(); + base.DrawMainPropertyBlock(); + } + + public override void Destroy() + { + base.Destroy(); + m_upperLeftWidget = null; + } + + public override void SetGlobalValue() { Shader.SetGlobalMatrix( m_propertyName, m_defaultValue ); } + public override void FetchGlobalValue() { m_materialValue = Shader.GetGlobalMatrix( m_propertyName ); } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/MatrixParentNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/MatrixParentNode.cs.meta new file mode 100644 index 0000000..ed87f49 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/MatrixParentNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d31dc25864c509a4f967e32079a27d6f +timeCreated: 1507902748 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/PiNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/PiNode.cs new file mode 100644 index 0000000..659a128 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/PiNode.cs @@ -0,0 +1,63 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "PI", "Constants And Properties", "PI constant : 3.14159265359" )] + public sealed class PiNode : ParentNode + { + public PiNode() : base() { } + public PiNode( int uniqueId, float x, float y, float width, float height ) : base( uniqueId, x, y, width, height ) { } + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, true, "Multiplier" ); + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + m_textLabelWidth = 70; + InputPorts[ 0 ].FloatInternalData = 1; + m_useInternalPortData = true; + m_previewShaderGUID = "bf4a65726dab3d445a69fb1d0945c33e"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + string finalValue = string.Empty; + string piString = dataCollector.IsSRP ? "PI" : "UNITY_PI"; + if( !InputPorts[ 0 ].IsConnected && InputPorts[ 0 ].FloatInternalData == 1 ) + { + finalValue = piString; + } else + { + string multiplier = InputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + finalValue = "( " + multiplier + " * " + piString + " )"; + } + + + if ( finalValue.Equals( string.Empty ) ) + { + UIUtils.ShowMessage( UniqueId, "PINode generating empty code", MessageSeverity.Warning ); + } + return finalValue; + } + + //public override void ReadFromString( ref string[] nodeParams ) + //{ + // base.ReadFromString( ref nodeParams ); + + // Removed on version 5004 + //m_value = Convert.ToSingle( GetCurrentParam( ref nodeParams ) ); + //} + + //public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + //{ + // base.WriteToString( ref nodeInfo, ref connectionsInfo ); + //} + + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/PiNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/PiNode.cs.meta new file mode 100644 index 0000000..64327b8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/PiNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7a8a03953b97a594b81b2fb71d4a57ec +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/PropertyNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/PropertyNode.cs new file mode 100644 index 0000000..38cdda6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/PropertyNode.cs @@ -0,0 +1,1913 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + public enum PropertyType + { + Constant = 0, + Property, + InstancedProperty, + Global + } + + public enum VariableMode + { + Create = 0, + Fetch + } + + [Serializable] + public class PropertyAttributes + { + public string Name; + public string Attribute; + public bool HasDeprecatedValue; + public string DeprecatedValue; + public PropertyAttributes( string name, string attribute , string deprecated = null ) + { + Name = name; + Attribute = attribute; + DeprecatedValue = deprecated; + HasDeprecatedValue = deprecated != null; + } + } + + [Serializable] + public class PropertyNode : ParentNode + { + private const string LongNameEnder = "... )"; + protected int m_longNameSize = 200; + //private const string InstancedPropertyWarning = "Instanced Property option shouldn't be used on official SRP templates as all property variables are already declared as instanced inside a CBuffer.\nPlease consider changing to Property option."; + private const string TooltipFormatter = "{0}\n\nName: {1}\nValue: {2}"; + private const string InvalidAttributeFormatter = "Attribute {0} not found on node {1}. Please click on this message to select node and review its attributes section"; + protected string GlobalTypeWarningText = "Global variables must be set via a C# script using the Shader.SetGlobal{0}(...) method.\nPlease note that setting a global variable will affect all shaders which are using it."; + private const string HybridInstancedStr = "Hybrid Instanced"; + private const string AutoRegisterStr = "Auto-Register"; + private const string IgnoreVarDeclarationStr = "Variable Mode"; + private const string IsPropertyStr = "Is Property"; + private const string PropertyNameStr = "Property Name"; + private const string PropertyInspectorStr = "Name"; + protected const string EnumsStr = "Enums"; + protected const string CustomAttrStr = "Custom Attributes"; + protected const string HeaderAttrStr = "Headers"; + protected const string ParameterTypeStr = "Type"; + private const string PropertyTextfieldControlName = "PropertyName"; + private const string PropertyInspTextfieldControlName = "PropertyInspectorName"; + private const string OrderIndexStr = "Order Index"; + protected const double MaxTimestamp = 2; + private const double MaxPropertyTimestamp = 2; + private const double MaxGlobalFetchTimestamp = 2; + protected readonly string[] LabelToolbarTitle = { "Material", "Default" }; + protected readonly string[] EnumModesStr = { "Create Enums", "Use Engine Enum Class" }; + protected readonly int[] EnumModeIntValues = { 0, 1 }; + private const string FetchToCreateDuplicatesMsg = "Reverting property name from '{0}' to '{1}' as it is registered to another property node."; + private const string FetchToCreateOnDuplicateNodeMsg = "Setting new property name '{0}' as '{1}' is registered to another property node."; + private const string HeaderId = "Header"; + private const string EnumId = "Enum"; + + [SerializeField] + protected PropertyType m_currentParameterType; + + [SerializeField] + private PropertyType m_lastParameterType; + + [SerializeField] + protected string m_propertyName = string.Empty; + + [SerializeField] + protected string m_propertyInspectorName = string.Empty; + + [SerializeField] + protected string m_precisionString; + protected bool m_drawPrecisionUI = true; + + [SerializeField] + private int m_orderIndex = -1; + + [SerializeField] + protected VariableMode m_variableMode = VariableMode.Create; + + [SerializeField] + protected bool m_autoGlobalName = true; + + [SerializeField] + protected bool m_hybridInstanced = false; + + [SerializeField] + protected bool m_autoRegister = false; + + [SerializeField] + protected bool m_registerPropertyOnInstancing = true; + + [SerializeField] + private List m_enumNames = new List(); + + [SerializeField] + private List m_enumValues = new List(); + + [SerializeField] + private int m_enumCount = 0; + + [SerializeField] + private int m_enumModeInt = 0; + + [SerializeField] + private int m_customAttrCount = 0; + + [SerializeField] + private List m_customAttr = new List(); + + [SerializeField] + private bool m_hasHeaders = false; + + [SerializeField] + private List m_headerAttributeValues = new List(); + + + [SerializeField] + private string m_enumClassName = string.Empty; + + private bool m_hasEnum = false; + + protected bool m_showTitleWhenNotEditing = true; + + private int m_orderIndexOffset = 0; + + protected bool m_drawAttributes = true; + + protected bool m_underscoredGlobal = false; + protected bool m_globalDefaultBehavior = true; + + protected bool m_freeName; + protected bool m_freeType; + protected bool m_showVariableMode = false; + protected bool m_propertyNameIsDirty; + + protected bool m_showAutoRegisterUI = true; + + protected bool m_showHybridInstancedUI = false; + + protected bool m_useVarSubtitle = false; + + protected bool m_propertyFromInspector; + protected double m_propertyFromInspectorTimestamp; + + protected bool m_checkDuplicateProperty; + protected double m_checkDuplicatePropertyTimestamp; + + protected double m_globalFetchTimestamp; + + protected bool m_delayedDirtyProperty; + protected double m_delayedDirtyPropertyTimestamp; + + protected string m_defaultPropertyName; + protected string m_oldName = string.Empty; + + private bool m_reRegisterName = false; + protected bool m_allowPropertyDuplicates = false; + //protected bool m_useCustomPrefix = false; + protected string m_customPrefix = null; + + protected int m_propertyTab = 0; + + [SerializeField] + private string m_uniqueName; + + // Property Attributes + private const float ButtonLayoutWidth = 15; + + protected bool m_visibleAttribsFoldout; + protected bool m_visibleEnumsFoldout; + protected bool m_visibleCustomAttrFoldout; + protected bool m_visibleHeaderAttrFoldout; + protected List m_availableAttribs = new List(); + private string[] m_availableAttribsArr; + + [SerializeField] + private bool[] m_selectedAttribsArr; + + [SerializeField] + protected List m_selectedAttribs = new List(); + + //Title editing + protected bool m_isEditing; + protected bool m_stopEditing; + protected bool m_startEditing; + protected double m_clickTime; + protected double m_doubleClickTime = 0.3; + private Rect m_titleClickArea; + + protected bool m_srpBatcherCompatible = false; + protected bool m_excludeUniform = false; + + [SerializeField] + private bool m_addGlobalToSRPBatcher = false; + + public PropertyNode() : base() { } + public PropertyNode( int uniqueId, float x, float y, float width, float height ) : base( uniqueId, x, y, width, height ) { } + + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_textLabelWidth = 105; + if( UIUtils.CurrentWindow != null && UIUtils.CurrentWindow.CurrentGraph != null ) + m_orderIndex = UIUtils.GetPropertyNodeAmount(); + m_currentParameterType = PropertyType.Constant; + m_freeType = true; + m_freeName = true; + m_propertyNameIsDirty = true; + m_customPrecision = true; + m_availableAttribs.Add( new PropertyAttributes( "Hide in Inspector", "[HideInInspector]" ) ); + m_availableAttribs.Add( new PropertyAttributes( "HDR", "[HDR]" ) ); + m_availableAttribs.Add( new PropertyAttributes( "Gamma", "[Gamma]" ) ); + m_availableAttribs.Add( new PropertyAttributes( "Per Renderer Data", "[PerRendererData]" ) ); + m_availableAttribs.Add( new PropertyAttributes( "Header", "[Header]" ) ); + } + + public override void AfterCommonInit() + { + base.AfterCommonInit(); + + if( PaddingTitleLeft == 0 && m_freeType ) + { + PaddingTitleLeft = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + if( PaddingTitleRight == 0 ) + PaddingTitleRight = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + } + + m_hasLeftDropdown = m_freeType; + } + + protected void BeginDelayedDirtyProperty() + { + m_delayedDirtyProperty = true; + m_delayedDirtyPropertyTimestamp = EditorApplication.timeSinceStartup; + } + + public void CheckDelayedDirtyProperty() + { + if( m_delayedDirtyProperty ) + { + if( ( EditorApplication.timeSinceStartup - m_delayedDirtyPropertyTimestamp ) > MaxPropertyTimestamp ) + { + m_delayedDirtyProperty = false; + m_propertyNameIsDirty = true; + m_sizeIsDirty = true; + } + } + } + + public void BeginPropertyFromInspectorCheck() + { + m_propertyFromInspector = true; + m_propertyFromInspectorTimestamp = EditorApplication.timeSinceStartup; + } + + public virtual void CheckPropertyFromInspector( bool forceUpdate = false ) + { + if( m_propertyFromInspector ) + { + if( forceUpdate || ( EditorApplication.timeSinceStartup - m_propertyFromInspectorTimestamp ) > MaxTimestamp ) + { + m_propertyFromInspector = false; + bool autoGlobal = m_autoGlobalName || m_currentParameterType == PropertyType.Global; + RegisterPropertyName( true, m_propertyInspectorName, autoGlobal, m_underscoredGlobal ); + m_propertyNameIsDirty = true; + } + } + } + + public void CheckDuplicateProperty() + { + if( m_checkDuplicateProperty && + ( EditorApplication.timeSinceStartup - m_checkDuplicatePropertyTimestamp ) > MaxTimestamp ) + { + m_checkDuplicateProperty = false; + m_propertyName = UIUtils.GeneratePropertyName( m_propertyName, PropertyType.Global, false ); + + if( UIUtils.IsNumericName( m_propertyName ) ) + { + UIUtils.ShowMessage( UniqueId, string.Format( "Invalid property name '{0}' as it cannot start with numbers. Reverting to previous name.", m_propertyName ), MessageSeverity.Warning ); + m_propertyName = m_oldName; + GUI.FocusControl( string.Empty ); + return; + } + + if( !m_propertyName.Equals( m_oldName ) ) + { + if( UIUtils.IsUniformNameAvailable( m_propertyName ) || m_allowPropertyDuplicates ) + { + UIUtils.ReleaseUniformName( UniqueId, m_oldName ); + + m_oldName = m_propertyName; + m_propertyNameIsDirty = true; + m_reRegisterName = false; + UIUtils.RegisterUniformName( UniqueId, m_propertyName ); + OnPropertyNameChanged(); + } + else + { + GUI.FocusControl( string.Empty ); + RegisterFirstAvailablePropertyName( true, true ); + UIUtils.ShowMessage( UniqueId, string.Format( "Duplicate property name found on edited node.\nAssigning first valid one {0}", m_propertyName ) ); + } + } + } + } + + protected override void OnUniqueIDAssigned() + { + if( m_variableMode == VariableMode.Create ) + RegisterFirstAvailablePropertyName( false ); + + if( m_nodeAttribs != null ) + m_uniqueName = m_nodeAttribs.Name + UniqueId; + + UIUtils.RegisterRawPropertyNode( this ); + } + + public bool CheckLocalVariable( ref MasterNodeDataCollector dataCollector ) + { + bool addToLocalValue = false; + int count = 0; + for( int i = 0; i < m_outputPorts.Count; i++ ) + { + if( m_outputPorts[ i ].IsConnected ) + { + if( m_outputPorts[ i ].ConnectionCount > 1 ) + { + addToLocalValue = true; + break; + } + count += 1; + if( count > 1 ) + { + addToLocalValue = true; + break; + } + } + } + + if( addToLocalValue ) + { + ConfigureLocalVariable( ref dataCollector ); + } + + return addToLocalValue; + } + + public virtual void ConfigureLocalVariable( ref MasterNodeDataCollector dataCollector ) { } + public virtual void CopyDefaultsToMaterial() { } + + public override void SetupFromCastObject( UnityEngine.Object obj ) + { + RegisterPropertyName( true, obj.name, true, m_underscoredGlobal ); + } + + public void ChangeParameterType( PropertyType parameterType ) + { + Undo.RegisterCompleteObjectUndo( m_containerGraph.ParentWindow, Constants.UndoChangePropertyTypeNodesId ); + Undo.RegisterCompleteObjectUndo( m_containerGraph, Constants.UndoChangePropertyTypeNodesId ); + Undo.RecordObject( this, Constants.UndoChangePropertyTypeNodesId ); + + if( m_currentParameterType == PropertyType.Constant || m_currentParameterType == PropertyType.Global ) + { + CopyDefaultsToMaterial(); + } + + if( parameterType == PropertyType.InstancedProperty ) + { + //if( m_containerGraph.IsSRP ) + //{ + // UIUtils.ShowMessage( InstancedPropertyWarning,MessageSeverity.Warning ); + //} + + UIUtils.CurrentWindow.OutsideGraph.AddInstancePropertyCount(); + } + else if( m_currentParameterType == PropertyType.InstancedProperty ) + { + UIUtils.CurrentWindow.OutsideGraph.RemoveInstancePropertyCount(); + } + + if( ( parameterType == PropertyType.Property || parameterType == PropertyType.InstancedProperty ) + && m_currentParameterType != PropertyType.Property && m_currentParameterType != PropertyType.InstancedProperty ) + { + UIUtils.RegisterPropertyNode( this ); + } + + if( ( parameterType != PropertyType.Property && parameterType != PropertyType.InstancedProperty ) + && ( m_currentParameterType == PropertyType.Property || m_currentParameterType == PropertyType.InstancedProperty ) ) + { + UIUtils.UnregisterPropertyNode( this ); + } + + m_currentParameterType = parameterType; + if( parameterType == PropertyType.Constant ) + { + CurrentVariableMode = VariableMode.Create; + } + + } + + void InitializeAttribsArray() + { + m_availableAttribsArr = new string[ m_availableAttribs.Count ]; + m_selectedAttribsArr = new bool[ m_availableAttribs.Count ]; + for( int i = 0; i < m_availableAttribsArr.Length; i++ ) + { + m_availableAttribsArr[ i ] = m_availableAttribs[ i ].Name; + m_selectedAttribsArr[ i ] = false; + + if( m_selectedAttribs.FindIndex( x => x == i ) > -1 ) + { + m_selectedAttribsArr[ i ] = true; + m_visibleAttribsFoldout = true; + } + } + } + + protected virtual void OnAtrributesChanged() { CheckEnumAttribute(); CheckHeaderAttribute(); } + void DrawAttributesAddRemoveButtons() + { + if( m_availableAttribsArr == null ) + { + InitializeAttribsArray(); + } + + int attribCount = m_selectedAttribs.Count; + // Add new port + if( GUILayout.Button( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ButtonLayoutWidth ) ) ) + { + m_visibleAttribsFoldout = true; + m_selectedAttribs.Add( 0 ); + OnAtrributesChanged(); + } + + //Remove port + if( GUILayout.Button( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ButtonLayoutWidth ) ) ) + { + if( attribCount > 0 ) + { + m_selectedAttribs.RemoveAt( attribCount - 1 ); + OnAtrributesChanged(); + } + } + } + + void CheckEnumAttribute() + { + m_hasEnum = false; + foreach( var item in m_selectedAttribs ) + { + if( m_availableAttribsArr[ item ].Equals( "Enum" ) ) + m_hasEnum = true; + } + } + + + + protected void CheckHeaderAttribute() + { + m_hasHeaders = false; + foreach( var item in m_selectedAttribs ) + { + if( m_availableAttribsArr[ item ].Equals( HeaderId ) ) + { + m_hasHeaders = true; + } + } + } + + void DrawEnumAddRemoveButtons() + { + // Add new port + if( GUILayout.Button( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ButtonLayoutWidth ) ) && m_enumModeInt == 0 ) + { + m_enumNames.Add( "Option" + ( m_enumValues.Count + 1 ) ); + m_enumValues.Add( m_enumValues.Count ); + m_enumCount++; + m_visibleEnumsFoldout = true; + } + + //Remove port + if( GUILayout.Button( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ButtonLayoutWidth ) ) && m_enumModeInt == 0 ) + { + if( m_enumNames.Count - 1 > -1 ) + { + m_enumNames.RemoveAt( m_enumNames.Count - 1 ); + m_enumValues.RemoveAt( m_enumValues.Count - 1 ); + m_enumCount--; + } + } + } + + protected void DrawEnums() + { + m_enumModeInt = EditorGUILayout.IntPopup( "Mode", m_enumModeInt, EnumModesStr, EnumModeIntValues ); + + if( m_enumModeInt == 0 ) + { + if( m_enumNames.Count == 0 ) + EditorGUILayout.HelpBox( "Your list is Empty!\nUse the plus button to add more.", MessageType.Info ); + + float cacheLabelSize = EditorGUIUtility.labelWidth; + EditorGUIUtility.labelWidth = 50; + + for( int i = 0; i < m_enumNames.Count; i++ ) + { + EditorGUI.BeginChangeCheck(); + EditorGUILayout.BeginHorizontal(); + m_enumNames[ i ] = EditorGUILayoutTextField( "Name", m_enumNames[ i ] ); + m_enumValues[ i ] = EditorGUILayoutIntField( "Value", m_enumValues[ i ], GUILayout.Width( 100 ) ); + EditorGUILayout.EndHorizontal(); + if( EditorGUI.EndChangeCheck() ) + { + m_enumNames[ i ] = UIUtils.RemoveInvalidEnumCharacters( m_enumNames[ i ] ); + if( string.IsNullOrEmpty( m_enumNames[ i ] ) ) + { + m_enumNames[ i ] = "Option" + ( i + 1 ); + } + } + } + + EditorGUIUtility.labelWidth = cacheLabelSize; + if( m_enumNames.Count > 0 ) + { + EditorGUILayout.BeginHorizontal(); + GUILayout.Label( " " ); + DrawEnumAddRemoveButtons(); + EditorGUILayout.EndHorizontal(); + } + } + else + { + EditorGUILayout.BeginHorizontal(); + m_enumClassName = EditorGUILayoutTextField( "Class Name", m_enumClassName ); + + if( GUILayout.Button( string.Empty, UIUtils.InspectorPopdropdownFallback, GUILayout.Width( 17 ), GUILayout.Height( 19 ) ) ) + { + GenericMenu menu = new GenericMenu(); + AddMenuItem( menu, "UnityEngine.Rendering.CullMode" ); + AddMenuItem( menu, "UnityEngine.Rendering.ColorWriteMask" ); + AddMenuItem( menu, "UnityEngine.Rendering.CompareFunction" ); + AddMenuItem( menu, "UnityEngine.Rendering.StencilOp" ); + AddMenuItem( menu, "UnityEngine.Rendering.BlendMode" ); + AddMenuItem( menu, "UnityEngine.Rendering.BlendOp" ); + menu.ShowAsContext(); + } + EditorGUILayout.EndHorizontal(); + } + } + + private void AddMenuItem( GenericMenu menu, string newClass ) + { + menu.AddItem( new GUIContent( newClass ), m_enumClassName.Equals( newClass ), OnSelection, newClass ); + } + + private void OnSelection( object newClass ) + { + m_enumClassName = (string)newClass; + } + + protected void DrawCustomAttrAddRemoveButtons() + { + // Add new port + if( GUILayout.Button( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ButtonLayoutWidth ) ) ) + { + m_customAttr.Add( "" ); + m_customAttrCount++; + //m_enumCount++; + m_visibleCustomAttrFoldout = true; + } + + //Remove port + if( GUILayout.Button( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ButtonLayoutWidth ) ) ) + { + if( m_customAttr.Count - 1 > -1 ) + { + m_customAttr.RemoveAt( m_customAttr.Count - 1 ); + m_customAttrCount--; + } + } + } + + protected void DrawCustomAttributes() + { + for( int i = 0; i < m_customAttrCount; i++ ) + { + EditorGUI.BeginChangeCheck(); + m_customAttr[ i ] = EditorGUILayoutTextField( "Attribute " + i, m_customAttr[ i ] ); + if( EditorGUI.EndChangeCheck() ) + { + m_customAttr[ i ] = UIUtils.RemoveInvalidAttrCharacters( m_customAttr[ i ] ); + } + } + + if( m_customAttrCount <= 0 ) + { + EditorGUILayout.HelpBox( "Your list is Empty!\nUse the plus button to add more.", MessageType.Info ); + return; + } + + EditorGUILayout.BeginHorizontal(); + GUILayout.Label( " " ); + DrawCustomAttrAddRemoveButtons(); + EditorGUILayout.EndHorizontal(); + } + + protected void DrawHeaderAttrAddRemoveButtons() + { + // Add new port + if( GUILayout.Button( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ButtonLayoutWidth ) ) ) + { + m_headerAttributeValues.Add( "" ); + m_visibleHeaderAttrFoldout = true; + } + + //Remove port + if( GUILayout.Button( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ButtonLayoutWidth ) ) ) + { + if( m_headerAttributeValues.Count > 0 ) + { + m_headerAttributeValues.RemoveAt( m_headerAttributeValues.Count - 1 ); + } + } + } + + protected void DrawHeaderAttributes() + { + int count = m_headerAttributeValues.Count; + for( int i = 0; i < count; i++ ) + { + EditorGUI.BeginChangeCheck(); + m_headerAttributeValues[ i ] = EditorGUILayoutTextField( "Header " + i, m_headerAttributeValues[ i ] ); + if( EditorGUI.EndChangeCheck() ) + { + m_headerAttributeValues[ i ] = UIUtils.RemoveHeaderAttrCharacters( m_headerAttributeValues[ i ] ); + } + } + + + + + if( count <= 0 ) + { + EditorGUILayout.HelpBox( "Your list is Empty!\nUse the plus button to add more.", MessageType.Info ); + return; + } + + EditorGUILayout.BeginHorizontal(); + GUILayout.Label( " " ); + DrawHeaderAttrAddRemoveButtons(); + EditorGUILayout.EndHorizontal(); + } + + + public virtual void DrawAttributes() + { + int attribCount = m_selectedAttribs.Count; + EditorGUI.BeginChangeCheck(); + if( m_availableAttribsArr == null ) + { + InitializeAttribsArray(); + } + for( int i = 0; i < m_availableAttribsArr.Length; i++ ) + { + m_selectedAttribsArr[ i ] = EditorGUILayoutToggleLeft( m_availableAttribsArr[ i ], m_selectedAttribsArr[ i ] ); + } + if( EditorGUI.EndChangeCheck() ) + { + m_selectedAttribs.Clear(); + for( int i = 0; i < m_selectedAttribsArr.Length; i++ ) + { + if( m_selectedAttribsArr[ i ] ) + m_selectedAttribs.Add( i ); + } + + OnAtrributesChanged(); + } + + bool customAttr = EditorGUILayoutToggleLeft( "Custom", m_customAttrCount == 0 ? false : true ); + if( !customAttr ) + { + m_customAttrCount = 0; + } + else if( customAttr && m_customAttrCount < 1 ) + { + if( m_customAttr.Count == 0 ) + m_customAttr.Add( "" ); + + m_customAttrCount = m_customAttr.Count; + } + //m_customAttrCount = EditorGUILayoutToggleLeft( "Custom Attribute", m_customAttrCount == 0 ? false : true ) == 0 ? false : true; + + //if( attribCount == 0 ) + //{ + // EditorGUILayout.HelpBox( "Your list is Empty!\nUse the plus button to add more.", MessageType.Info ); + //} + + //bool actionAllowed = true; + //int deleteItem = -1; + + //for ( int i = 0; i < attribCount; i++ ) + //{ + // EditorGUI.BeginChangeCheck(); + // { + // m_selectedAttribs[ i ] = EditorGUILayoutPopup( m_selectedAttribs[ i ], m_availableAttribsArr ); + // } + // if ( EditorGUI.EndChangeCheck() ) + // { + // OnAtrributesChanged(); + // } + + // EditorGUILayout.BeginHorizontal(); + // GUILayout.Label( " " ); + // // Add After + // if ( GUILayout.Button( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ButtonLayoutWidth ) ) ) + // { + // if ( actionAllowed ) + // { + // m_selectedAttribs.Insert( i, m_selectedAttribs[ i ] ); + // actionAllowed = false; + // OnAtrributesChanged(); + // } + // } + + // // Remove Current + // if ( GUILayout.Button( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ButtonLayoutWidth ) ) ) + // { + // if ( actionAllowed ) + // { + // actionAllowed = false; + // deleteItem = i; + // } + // } + // EditorGUILayout.EndHorizontal(); + //} + //if ( deleteItem > -1 ) + //{ + // m_selectedAttribs.RemoveAt( deleteItem ); + // OnAtrributesChanged(); + //} + } + public virtual void DrawMainPropertyBlock() + { + EditorGUILayout.BeginVertical(); + { + if( m_freeType ) + { + PropertyType parameterType = (PropertyType)EditorGUILayoutEnumPopup( ParameterTypeStr, m_currentParameterType ); + if( parameterType != m_currentParameterType ) + { + ChangeParameterType( parameterType ); + BeginPropertyFromInspectorCheck(); + } + } + + if( m_freeName ) + { + switch( m_currentParameterType ) + { + case PropertyType.Property: + case PropertyType.InstancedProperty: + { + ShowPropertyInspectorNameGUI(); + ShowPropertyNameGUI( true ); + ShowVariableMode(); + ShowHybridInstanced(); + ShowAutoRegister(); + ShowPrecision(); + ShowToolbar(); + } + break; + case PropertyType.Global: + { + ShowPropertyInspectorNameGUI(); + ShowPropertyNameGUI( false ); + ShowVariableMode(); + ShowAutoRegister(); + ShowPrecision(); + ShowDefaults(); + } + break; + case PropertyType.Constant: + { + ShowPropertyInspectorNameGUI(); + ShowPrecision(); + ShowDefaults(); + } + break; + } + } + } + EditorGUILayout.EndVertical(); + } + + public void DrawMainPropertyBlockNoPrecision() + { + EditorGUILayout.BeginVertical(); + { + if( m_freeType ) + { + PropertyType parameterType = (PropertyType)EditorGUILayoutEnumPopup( ParameterTypeStr, m_currentParameterType ); + if( parameterType != m_currentParameterType ) + { + ChangeParameterType( parameterType ); + BeginPropertyFromInspectorCheck(); + } + } + + if( m_freeName ) + { + switch( m_currentParameterType ) + { + case PropertyType.Property: + case PropertyType.InstancedProperty: + { + ShowPropertyInspectorNameGUI(); + ShowPropertyNameGUI( true ); + ShowToolbar(); + } + break; + case PropertyType.Global: + { + ShowPropertyInspectorNameGUI(); + ShowPropertyNameGUI( false ); + ShowDefaults(); + } + break; + case PropertyType.Constant: + { + ShowPropertyInspectorNameGUI(); + ShowDefaults(); + } + break; + } + } + } + EditorGUILayout.EndVertical(); + } + + public override void DrawProperties() + { + base.DrawProperties(); + if( m_freeType || m_freeName ) + { + NodeUtils.DrawPropertyGroup( ref m_propertiesFoldout, Constants.ParameterLabelStr, DrawMainPropertyBlock ); + if( m_drawAttributes ) + NodeUtils.DrawPropertyGroup( ref m_visibleAttribsFoldout, Constants.AttributesLaberStr, DrawAttributes ); + + if( m_hasEnum ) + { + if( m_enumModeInt == 0 ) + NodeUtils.DrawPropertyGroup( ref m_visibleEnumsFoldout, EnumsStr, DrawEnums, DrawEnumAddRemoveButtons ); + else + NodeUtils.DrawPropertyGroup( ref m_visibleEnumsFoldout, EnumsStr, DrawEnums ); + } + + if( m_drawAttributes ) + { + if( m_hasHeaders ) + NodeUtils.DrawPropertyGroup( ref m_visibleHeaderAttrFoldout, HeaderAttrStr, DrawHeaderAttributes, DrawHeaderAttrAddRemoveButtons ); + + if( m_customAttrCount > 0 ) + NodeUtils.DrawPropertyGroup( ref m_visibleCustomAttrFoldout, CustomAttrStr, DrawCustomAttributes, DrawCustomAttrAddRemoveButtons ); + } + + CheckPropertyFromInspector(); + } + } + + public void ShowPrecision() + { + if( m_drawPrecisionUI ) + { + bool guiEnabled = GUI.enabled; + GUI.enabled = m_currentParameterType == PropertyType.Constant || m_variableMode == VariableMode.Create; + EditorGUI.BeginChangeCheck(); + DrawPrecisionProperty(); + if( EditorGUI.EndChangeCheck() ) + m_precisionString = UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, m_outputPorts[ 0 ].DataType ); + + GUI.enabled = guiEnabled; + + } + } + + public void ShowToolbar() + { + //if ( !CanDrawMaterial ) + //{ + // ShowDefaults(); + // return; + //} + + EditorGUILayout.BeginHorizontal(); + GUILayout.Space( 20 ); + m_propertyTab = GUILayout.Toolbar( m_propertyTab, LabelToolbarTitle ); + EditorGUILayout.EndHorizontal(); + switch( m_propertyTab ) + { + default: + case 0: + { + EditorGUI.BeginChangeCheck(); + DrawMaterialProperties(); + if( EditorGUI.EndChangeCheck() ) + { + BeginDelayedDirtyProperty(); + } + } + break; + case 1: + { + ShowDefaults(); + } + break; + } + } + + public void ShowDefaults() + { + EditorGUI.BeginChangeCheck(); + DrawSubProperties(); + if( EditorGUI.EndChangeCheck() ) + { + BeginDelayedDirtyProperty(); + } + if( m_currentParameterType == PropertyType.Global && m_globalDefaultBehavior ) + { + if( DebugConsoleWindow.DeveloperMode ) + { + ShowGlobalValueButton(); + } + EditorGUILayout.HelpBox( GlobalTypeWarningText, MessageType.Warning ); + } + } + + public void ShowPropertyInspectorNameGUI() + { + EditorGUI.BeginChangeCheck(); + m_propertyInspectorName = EditorGUILayoutTextField( PropertyInspectorStr, m_propertyInspectorName ); + if( EditorGUI.EndChangeCheck() ) + { + if( m_propertyInspectorName.Length > 0 ) + { + BeginPropertyFromInspectorCheck(); + } + } + } + + public void ShowPropertyNameGUI( bool isProperty ) + { + bool guiEnabledBuffer = GUI.enabled; + if( isProperty ) + { + EditorGUILayout.BeginHorizontal(); + GUI.enabled = !m_autoGlobalName; + EditorGUI.BeginChangeCheck(); + m_propertyName = EditorGUILayoutTextField( PropertyNameStr, m_propertyName ); + if( EditorGUI.EndChangeCheck() ) + { + //BeginPropertyFromInspectorCheck(); + m_checkDuplicateProperty = true; + m_checkDuplicatePropertyTimestamp = EditorApplication.timeSinceStartup; + } + GUI.enabled = guiEnabledBuffer; + EditorGUI.BeginChangeCheck(); + m_autoGlobalName = GUILayout.Toggle( m_autoGlobalName, ( m_autoGlobalName ? UIUtils.LockIconOpen : UIUtils.LockIconClosed ), "minibutton", GUILayout.Width( 22 ) ); + if( EditorGUI.EndChangeCheck() ) + { + if( m_autoGlobalName ) + BeginPropertyFromInspectorCheck(); + } + EditorGUILayout.EndHorizontal(); + } + else + { + GUI.enabled = false; + m_propertyName = EditorGUILayoutTextField( PropertyNameStr, m_propertyName ); + GUI.enabled = guiEnabledBuffer; + } + } + + public void ShowVariableMode() + { + if( m_showVariableMode || m_freeType ) + CurrentVariableMode = (VariableMode)EditorGUILayoutEnumPopup( IgnoreVarDeclarationStr, m_variableMode ); + } + + public void ShowHybridInstanced() + { + if( m_showHybridInstancedUI && CurrentParameterType == PropertyType.Property && ( m_containerGraph.IsSRP || m_containerGraph.CurrentShaderFunction != null ) ) + { + m_hybridInstanced = EditorGUILayoutToggle( HybridInstancedStr, m_hybridInstanced ); + } + } + + public void ShowAutoRegister() + { + if( m_showAutoRegisterUI && CurrentParameterType != PropertyType.Constant ) + { + m_autoRegister = EditorGUILayoutToggle( AutoRegisterStr, m_autoRegister ); + } + } + + public virtual string GetPropertyValStr() { return string.Empty; } + + public override bool OnClick( Vector2 currentMousePos2D ) + { + bool singleClick = base.OnClick( currentMousePos2D ); + m_propertyTab = m_materialMode ? 0 : 1; + return singleClick; + } + + public override void OnNodeDoubleClicked( Vector2 currentMousePos2D ) + { + if( currentMousePos2D.y - m_globalPosition.y > ( Constants.NODE_HEADER_HEIGHT + Constants.NODE_HEADER_EXTRA_HEIGHT ) * ContainerGraph.ParentWindow.CameraDrawInfo.InvertedZoom ) + { + ContainerGraph.ParentWindow.ParametersWindow.IsMaximized = !ContainerGraph.ParentWindow.ParametersWindow.IsMaximized; + } + } + + public override void DrawTitle( Rect titlePos ) + { + //base.DrawTitle( titlePos ); + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + // Custom Editable Title + if( ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD3 ) + { + if( !m_isEditing && ( ( !ContainerGraph.ParentWindow.MouseInteracted && drawInfo.CurrentEventType == EventType.MouseDown && m_titleClickArea.Contains( drawInfo.MousePosition ) ) ) ) + { + if( ( EditorApplication.timeSinceStartup - m_clickTime ) < m_doubleClickTime ) + m_startEditing = true; + else + GUI.FocusControl( null ); + m_clickTime = EditorApplication.timeSinceStartup; + } + else if( m_isEditing && ( ( drawInfo.CurrentEventType == EventType.MouseDown && !m_titleClickArea.Contains( drawInfo.MousePosition ) ) || !EditorGUIUtility.editingTextField ) ) + { + m_stopEditing = true; + } + + if( m_isEditing || m_startEditing ) + { + EditorGUI.BeginChangeCheck(); + GUI.SetNextControlName( m_uniqueName ); + m_propertyInspectorName = EditorGUITextField( m_titleClickArea, string.Empty, m_propertyInspectorName, UIUtils.GetCustomStyle( CustomStyle.NodeTitle ) ); + if( EditorGUI.EndChangeCheck() ) + { + SetClippedTitle( m_propertyInspectorName, m_longNameSize ); + m_sizeIsDirty = true; + m_isDirty = true; + if( m_propertyInspectorName.Length > 0 ) + { + BeginPropertyFromInspectorCheck(); + } + } + + if( m_startEditing ) + EditorGUI.FocusTextInControl( m_uniqueName ); + //if( m_stopEditing ) + // GUI.FocusControl( null ); + } + + if( drawInfo.CurrentEventType == EventType.Repaint ) + { + if( m_startEditing ) + { + m_startEditing = false; + m_isEditing = true; + } + + if( m_stopEditing ) + { + m_stopEditing = false; + m_isEditing = false; + GUI.FocusControl( null ); + } + } + + + if( m_freeType ) + { + if( m_dropdownEditing ) + { + PropertyType parameterType = (PropertyType)EditorGUIEnumPopup( m_dropdownRect, m_currentParameterType, UIUtils.PropertyPopUp ); + if( parameterType != m_currentParameterType ) + { + ChangeParameterType( parameterType ); + BeginPropertyFromInspectorCheck(); + DropdownEditing = false; + } + } + } + } + + } + + public override void OnNodeLayout( DrawInfo drawInfo ) + { + //base.OnNodeLayout( drawInfo ); + if( m_reRegisterName ) + { + m_reRegisterName = false; + UIUtils.RegisterUniformName( UniqueId, m_propertyName ); + } + + CheckDelayedDirtyProperty(); + + if( m_currentParameterType != m_lastParameterType || m_propertyNameIsDirty ) + { + m_lastParameterType = m_currentParameterType; + m_propertyNameIsDirty = false; + OnDirtyProperty(); + if( m_currentParameterType != PropertyType.Constant ) + { + SetClippedTitle( m_propertyInspectorName, m_longNameSize ); + //bool globalHandler = false; + //if( globalHandler ) + //{ + string currValue = ( m_currentParameterType == PropertyType.Global && m_globalDefaultBehavior ) ? "" : GetPropertyValStr(); + SetClippedAdditionalTitle( string.Format( m_useVarSubtitle ? Constants.SubTitleVarNameFormatStr : Constants.SubTitleValueFormatStr, currValue ), m_longNameSize, LongNameEnder ); + //} + //else + //{ + // if( m_currentParameterType == PropertyType.Global ) + // { + // SetAdditonalTitleText( "Global" ); + // } + // else + // { + // SetAdditonalTitleText( string.Format( m_useVarSubtitle ? Constants.SubTitleVarNameFormatStr : Constants.SubTitleValueFormatStr, GetPropertyValStr() ) ); + // } + //} + } + else + { + SetClippedTitle( m_propertyInspectorName, m_longNameSize ); + SetClippedAdditionalTitle( string.Format( Constants.SubTitleConstFormatStr, GetPropertyValStr() ), m_longNameSize, LongNameEnder ); + } + } + + CheckPropertyFromInspector(); + CheckDuplicateProperty(); + // RUN LAYOUT CHANGES AFTER TITLES CHANGE + base.OnNodeLayout( drawInfo ); + + m_titleClickArea = m_titlePos; + m_titleClickArea.height = Constants.NODE_HEADER_HEIGHT; + } + + public override void OnNodeRepaint( DrawInfo drawInfo ) + { + base.OnNodeRepaint( drawInfo ); + + if( !m_isVisible ) + return; + + // Fixed Title ( only renders when not editing ) + if( m_showTitleWhenNotEditing && !m_isEditing && !m_startEditing && ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD3 ) + { + GUI.Label( m_titleClickArea, m_content, UIUtils.GetCustomStyle( CustomStyle.NodeTitle ) ); + } + } + + public void RegisterFirstAvailablePropertyName( bool releaseOldOne, bool appendIndexToCurrOne = false ) + { + if( releaseOldOne ) + UIUtils.ReleaseUniformName( UniqueId, m_oldName ); + + if( m_isNodeBeingCopied || appendIndexToCurrOne ) + { + if( string.IsNullOrEmpty( m_propertyName ) ) + return; + + string newPropertyName = UIUtils.GetUniqueUniformName( m_propertyName ); + if( newPropertyName != m_propertyName ) + { + UIUtils.RegisterUniformName( UniqueId, newPropertyName ); + m_propertyName = newPropertyName; + } + else + { + if( UIUtils.IsUniformNameAvailable( m_propertyName ) ) + UIUtils.RegisterUniformName( UniqueId, m_propertyName ); + else + UIUtils.GetFirstAvailableName( UniqueId, m_outputPorts[ 0 ].DataType, out m_propertyName, out m_propertyInspectorName, !string.IsNullOrEmpty( m_customPrefix ), m_customPrefix ); + } + + } + else + { + UIUtils.GetFirstAvailableName( UniqueId, m_outputPorts[ 0 ].DataType, out m_propertyName, out m_propertyInspectorName, !string.IsNullOrEmpty( m_customPrefix ), m_customPrefix ); + } + m_oldName = m_propertyName; + m_propertyNameIsDirty = true; + m_reRegisterName = false; + OnPropertyNameChanged(); + } + + public void SetRawPropertyName( string name ) + { + m_propertyName = name; + } + + public void RegisterPropertyName( bool releaseOldOne, string newName, bool autoGlobal = true, bool forceUnderscore = false ) + { + if( m_currentParameterType != PropertyType.Constant && m_variableMode == VariableMode.Fetch ) + { + string localPropertyName = string.Empty; + if( autoGlobal ) + localPropertyName = UIUtils.GeneratePropertyName( newName, m_currentParameterType, forceUnderscore ); + else + { + localPropertyName = UIUtils.GeneratePropertyName( m_propertyName, PropertyType.Global, forceUnderscore ); + if( UIUtils.IsNumericName( localPropertyName ) ) + { + m_propertyName = m_oldName; + } + + } + + m_propertyName = localPropertyName; + m_propertyInspectorName = newName; + m_propertyNameIsDirty = true; + m_reRegisterName = false; + OnPropertyNameChanged(); + return; + } + + string propertyName = string.Empty; + if( autoGlobal ) + propertyName = UIUtils.GeneratePropertyName( newName, m_currentParameterType, forceUnderscore ); + else + { + propertyName = UIUtils.GeneratePropertyName( m_propertyName, PropertyType.Global, forceUnderscore ); + if( UIUtils.IsNumericName( propertyName ) ) + { + m_propertyName = m_oldName; + } + } + + if( m_propertyName.Equals( propertyName ) ) + return; + + if( UIUtils.IsUniformNameAvailable( propertyName ) || m_allowPropertyDuplicates ) + { + if( releaseOldOne ) + UIUtils.ReleaseUniformName( UniqueId, m_oldName ); + + m_oldName = propertyName; + m_propertyName = propertyName; + if( autoGlobal ) + m_propertyInspectorName = newName; + m_propertyNameIsDirty = true; + m_reRegisterName = false; + UIUtils.RegisterUniformName( UniqueId, propertyName ); + OnPropertyNameChanged(); + } + else + { + GUI.FocusControl( string.Empty ); + RegisterFirstAvailablePropertyName( releaseOldOne ); + UIUtils.ShowMessage( UniqueId, string.Format( "Duplicate name found on edited node.\nAssigning first valid one {0}", m_propertyInspectorName ) ); + } + } + + protected string CreateLocalVarDec( string value ) + { + return string.Format( Constants.PropertyLocalVarDec, UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, m_outputPorts[ 0 ].DataType ), m_propertyName, value ); + } + + public virtual void CheckIfAutoRegister( ref MasterNodeDataCollector dataCollector ) + { + // Also testing inside shader function because node can be used indirectly over a custom expression and directly over a Function Output node + // That isn't being used externaly making it to not be registered ( since m_connStatus it set to Connected by being connected to an output node + if( CurrentParameterType != PropertyType.Constant && m_autoRegister && ( m_connStatus != NodeConnectionStatus.Connected || InsideShaderFunction ) ) + { + RegisterProperty( ref dataCollector ); + } + } + + virtual protected void RegisterProperty( ref MasterNodeDataCollector dataCollector ) + { + CheckPropertyFromInspector( true ); + if( m_propertyName.Length == 0 ) + { + RegisterFirstAvailablePropertyName( false ); + } + + switch( CurrentParameterType ) + { + case PropertyType.Property: + { + //Debug.Log( this.GetInstanceID()+" "+ OrderIndex+" "+GetPropertyValue() ); + dataCollector.AddToProperties( UniqueId, GetPropertyValue(), OrderIndex ); + string dataType = string.Empty; + string dataName = string.Empty; + bool fullValue = false; + if( m_variableMode == VariableMode.Create && GetUniformData( out dataType, out dataName, ref fullValue ) ) + { + if( fullValue ) + { + dataCollector.AddToUniforms( UniqueId, dataName, m_srpBatcherCompatible ); + } + else + { + dataCollector.AddToUniforms( UniqueId, dataType, dataName, m_srpBatcherCompatible, m_excludeUniform ); + } + } + + if( m_hybridInstanced && dataCollector.IsTemplate && dataCollector.IsSRP ) + { + dataCollector.AddToDotsProperties( m_outputPorts[ 0 ].DataType, UniqueId, m_propertyName, OrderIndex, CurrentPrecisionType ); + } + //dataCollector.AddToUniforms( m_uniqueId, GetUniformValue() ); + } + break; + case PropertyType.InstancedProperty: + { + dataCollector.AddToPragmas( UniqueId, IOUtils.InstancedPropertiesHeader ); + + if( m_registerPropertyOnInstancing ) + dataCollector.AddToProperties( UniqueId, GetPropertyValue(), OrderIndex ); + + dataCollector.AddToInstancedProperties( m_outputPorts[ 0 ].DataType, UniqueId, GetInstancedUniformValue( dataCollector.IsTemplate, dataCollector.IsSRP ), OrderIndex ); + } + break; + case PropertyType.Global: + { + string dataType = string.Empty; + string dataName = string.Empty; + bool fullValue = false; + if( m_variableMode == VariableMode.Create && GetUniformData( out dataType, out dataName, ref fullValue ) ) + { + if( fullValue ) + { + dataCollector.AddToUniforms( UniqueId, dataName, m_addGlobalToSRPBatcher ); + } + else + { + dataCollector.AddToUniforms( UniqueId, dataType, dataName, m_addGlobalToSRPBatcher, m_excludeUniform ); + } + } + //dataCollector.AddToUniforms( m_uniqueId, GetUniformValue() ); + } + break; + case PropertyType.Constant: break; + } + dataCollector.AddPropertyNode( this ); + if( m_currentParameterType == PropertyType.InstancedProperty && !m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + { + string instancedVar = dataCollector.IsSRP ? + //m_propertyName : + string.Format( IOUtils.LWSRPInstancedPropertiesData, dataCollector.InstanceBlockName, m_propertyName ) : + string.Format( IOUtils.InstancedPropertiesData, m_propertyName ); + + bool insideSF = InsideShaderFunction; + ParentGraph cachedGraph = ContainerGraph.ParentWindow.CustomGraph; + if( insideSF ) + ContainerGraph.ParentWindow.CustomGraph = this.ContainerGraph; + + RegisterLocalVariable( 0, instancedVar, ref dataCollector, m_propertyName + "_Instance" ); + + if( insideSF ) + ContainerGraph.ParentWindow.CustomGraph = cachedGraph; + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + RegisterProperty( ref dataCollector ); + return string.Empty; + } + + public override void Destroy() + { + base.Destroy(); + UIUtils.UnregisterRawPropertyNode( this ); + if( !string.IsNullOrEmpty( m_propertyName ) && UniqueId >= 0 ) + UIUtils.ReleaseUniformName( UniqueId, m_propertyName ); + + if( m_currentParameterType == PropertyType.InstancedProperty ) + { + UIUtils.CurrentWindow.OutsideGraph.RemoveInstancePropertyCount(); + UIUtils.UnregisterPropertyNode( this ); + } + + if( m_currentParameterType == PropertyType.Property ) + { + UIUtils.UnregisterPropertyNode( this ); + } + + if( m_availableAttribs != null ) + m_availableAttribs.Clear(); + + m_availableAttribs = null; + } + private const string HeaderFormatStr = "[Header({0})]"; + string BuildHeader() + { + string result = string.Empty; + for( int i = 0; i < m_headerAttributeValues.Count; i++ ) + { + result += string.Format( HeaderFormatStr, m_headerAttributeValues[ i ] ); + } + return result; + } + + string BuildEnum() + { + string result = "[Enum("; + if( m_enumModeInt == 0 ) + { + for( int i = 0; i < m_enumNames.Count; i++ ) + { + result += m_enumNames[ i ] + "," + m_enumValues[ i ]; + if( i + 1 < m_enumNames.Count ) + result += ","; + } + } + else + { + result += m_enumClassName; + } + result += ")]"; + return result; + } + + public string PropertyAttributes + { + get + { + int attribCount = m_selectedAttribs.Count; + + if( m_selectedAttribs.Count == 0 && m_customAttrCount == 0 ) + return string.Empty; + + string attribs = string.Empty; + for( int i = 0; i < attribCount; i++ ) + { + if( m_availableAttribs[ m_selectedAttribs[ i ] ].Name.Equals( "Enum" ) ) + attribs += BuildEnum(); + else if( m_availableAttribs[ m_selectedAttribs[ i ] ].Name.Equals( HeaderId ) ) + attribs += BuildHeader(); + else + attribs += m_availableAttribs[ m_selectedAttribs[ i ] ].Attribute; + } + + for( int i = 0; i < m_customAttrCount; i++ ) + { + if( !string.IsNullOrEmpty( m_customAttr[ i ] ) ) + attribs += "[" + m_customAttr[ i ] + "]"; + } + return attribs; + } + } + public virtual void OnDirtyProperty() { } + public virtual void OnPropertyNameChanged() { UIUtils.UpdatePropertyDataNode( UniqueId, PropertyInspectorName ); } + public virtual void DrawSubProperties() { } + public virtual void DrawMaterialProperties() { } + + public virtual string GetPropertyValue() { return string.Empty; } + + public string GetInstancedUniformValue( bool isTemplate, bool isSRP ) + { + if( isTemplate ) + { + if( isSRP ) + { + return string.Format( IOUtils.LWSRPInstancedPropertiesElement, UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, m_outputPorts[ 0 ].DataType ), m_propertyName ); + //return GetUniformValue(); + } + else + { + return string.Format( IOUtils.InstancedPropertiesElement, UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, m_outputPorts[ 0 ].DataType ), m_propertyName ); + } + } + else + return string.Format( IOUtils.InstancedPropertiesElementTabs, UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, m_outputPorts[ 0 ].DataType ), m_propertyName ); + } + + public string GetInstancedUniformValue( bool isTemplate, bool isSRP, WirePortDataType dataType, string value ) + { + if( isTemplate ) + { + if( isSRP ) + { + //return GetUniformValue( dataType, value ); + return string.Format( IOUtils.LWSRPInstancedPropertiesElement, UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, dataType ), value ); + } + else + { + return string.Format( IOUtils.InstancedPropertiesElement, UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, dataType ), value ); + } + } + else + return string.Format( IOUtils.InstancedPropertiesElementTabs, UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, dataType ), value ); + } + + public virtual string GetUniformValue() + { + bool excludeUniformKeyword = ( m_currentParameterType == PropertyType.InstancedProperty ) || + m_containerGraph.IsSRP; + int index = excludeUniformKeyword ? 1 : 0; + return string.Format( Constants.UniformDec[ index ], UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, m_outputPorts[ 0 ].DataType ), m_propertyName ); + } + + public string GetUniformValue( WirePortDataType dataType, string value ) + { + bool excludeUniformKeyword = ( m_currentParameterType == PropertyType.InstancedProperty ) || + m_containerGraph.IsSRP; + int index = excludeUniformKeyword ? 1 : 0; + return string.Format( Constants.UniformDec[ index ], UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, dataType ), value ); + } + + public virtual bool GetUniformData( out string dataType, out string dataName, ref bool fullValue ) + { + dataType = UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, m_outputPorts[ 0 ].DataType ); + dataName = m_propertyName; + fullValue = false; + return true; + } + + public PropertyType CurrentParameterType + { + get { return m_currentParameterType; } + set { m_currentParameterType = value; } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_currentParameterType ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_propertyName ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_propertyInspectorName ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_orderIndex ); + int attribCount = m_selectedAttribs.Count; + IOUtils.AddFieldValueToString( ref nodeInfo, attribCount ); + if( attribCount > 0 ) + { + for( int i = 0; i < attribCount; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_availableAttribs[ m_selectedAttribs[ i ] ].Attribute ); + } + } + IOUtils.AddFieldValueToString( ref nodeInfo, m_variableMode ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_autoGlobalName ); + + int headerCount = m_headerAttributeValues.Count; + IOUtils.AddFieldValueToString( ref nodeInfo, headerCount ); + for( int i = 0; i < headerCount; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_headerAttributeValues[ i ] ); + } + + IOUtils.AddFieldValueToString( ref nodeInfo, m_enumCount ); + for( int i = 0; i < m_enumCount; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_enumNames[ i ] ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_enumValues[ i ] ); + } + IOUtils.AddFieldValueToString( ref nodeInfo, m_enumModeInt ); + if( m_enumModeInt == 1 ) + IOUtils.AddFieldValueToString( ref nodeInfo, m_enumClassName ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_autoRegister ); + + IOUtils.AddFieldValueToString( ref nodeInfo, m_customAttrCount ); + if( m_customAttrCount > 0 ) + { + for( int i = 0; i < m_customAttrCount; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_customAttr[ i ] ); + } + } + + IOUtils.AddFieldValueToString( ref nodeInfo, m_hybridInstanced ); + } + + int IdForAttrib( string name ) + { + int attribCount = m_availableAttribs.Count; + for( int i = 0; i < attribCount; i++ ) + { + if( m_availableAttribs[ i ].Attribute.Equals( name ) || + (m_availableAttribs[ i ].HasDeprecatedValue && m_availableAttribs[ i ].DeprecatedValue.Equals( name ) ) ) + return i; + } + return -1; + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() < 2505 ) + { + string property = GetCurrentParam( ref nodeParams ); + m_currentParameterType = property.Equals( "Uniform" ) ? PropertyType.Global : (PropertyType)Enum.Parse( typeof( PropertyType ), property ); + } + else + { + m_currentParameterType = (PropertyType)Enum.Parse( typeof( PropertyType ), GetCurrentParam( ref nodeParams ) ); + } + + if( m_currentParameterType == PropertyType.InstancedProperty ) + { + UIUtils.CurrentWindow.OutsideGraph.AddInstancePropertyCount(); + UIUtils.RegisterPropertyNode( this ); + } + + if( m_currentParameterType == PropertyType.Property ) + { + UIUtils.RegisterPropertyNode( this ); + } + + m_propertyName = GetCurrentParam( ref nodeParams ); + m_propertyInspectorName = GetCurrentParam( ref nodeParams ); + + if( UIUtils.CurrentShaderVersion() > 13 ) + { + m_orderIndex = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + + if( UIUtils.CurrentShaderVersion() > 4102 ) + { + int attribAmount = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + if( attribAmount > 0 ) + { + for( int i = 0; i < attribAmount; i++ ) + { + string attribute = GetCurrentParam( ref nodeParams ); + int idForAttribute = IdForAttrib( attribute ); + if( idForAttribute >= 0 ) + { + m_selectedAttribs.Add( idForAttribute ); + } + else + { + UIUtils.ShowMessage( UniqueId, string.Format( InvalidAttributeFormatter, attribute,m_propertyInspectorName ) , MessageSeverity.Warning ); + } + } + + m_visibleAttribsFoldout = true; + } + InitializeAttribsArray(); + } + + + if( UIUtils.CurrentShaderVersion() > 14003 ) + { + m_variableMode = (VariableMode)Enum.Parse( typeof( VariableMode ), GetCurrentParam( ref nodeParams ) ); + } + + if( UIUtils.CurrentShaderVersion() > 14201 ) + { + m_autoGlobalName = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + + if( UIUtils.CurrentShaderVersion() > 18707 ) + { + if( UIUtils.CurrentShaderVersion() == 18708 ) + { + m_headerAttributeValues.Add( GetCurrentParam( ref nodeParams ) ); + } + else + { + int headerCount = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + for( int i = 0; i < headerCount; i++ ) + { + m_headerAttributeValues.Add( GetCurrentParam( ref nodeParams ) ); + } + } + } + + if( UIUtils.CurrentShaderVersion() > 14403 ) + { + m_enumCount = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + for( int i = 0; i < m_enumCount; i++ ) + { + m_enumNames.Add( GetCurrentParam( ref nodeParams ) ); + m_enumValues.Add( Convert.ToInt32( GetCurrentParam( ref nodeParams ) ) ); + } + } + + if( UIUtils.CurrentShaderVersion() > 14501 ) + { + m_enumModeInt = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + if( m_enumModeInt == 1 ) + m_enumClassName = GetCurrentParam( ref nodeParams ); + m_autoRegister = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + + m_customAttrCount = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + for( int i = 0; i < m_customAttrCount; i++ ) + { + m_customAttr.Add( GetCurrentParam( ref nodeParams ) ); + } + if( m_customAttrCount > 0 ) + { + m_visibleCustomAttrFoldout = true; + m_visibleAttribsFoldout = true; + } + } + + if( UIUtils.CurrentShaderVersion() > 18003 ) + { + m_hybridInstanced = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + + CheckEnumAttribute(); + CheckHeaderAttribute(); + if( m_enumCount > 0 ) + m_visibleEnumsFoldout = true; + + m_propertyNameIsDirty = true; + m_reRegisterName = false; + + if( !m_isNodeBeingCopied ) + { + if( m_variableMode != VariableMode.Fetch || m_currentParameterType == PropertyType.Constant ) + { + UIUtils.ReleaseUniformName( UniqueId, m_oldName ); + UIUtils.RegisterUniformName( UniqueId, m_propertyName ); + m_oldName = m_propertyName; + } + } + else + { + m_oldName = m_propertyName; + } + + ReleaseRansomedProperty(); + + } + + public virtual void ReleaseRansomedProperty() + { + if( m_variableMode == VariableMode.Fetch && m_autoGlobalName ) + { + CurrentVariableMode = VariableMode.Create; + CurrentVariableMode = VariableMode.Fetch; + } + } + + void UpdateTooltip() + { + string currValue = string.Empty; + if( m_currentParameterType != PropertyType.Constant ) + { + currValue = ( m_currentParameterType == PropertyType.Global && m_globalDefaultBehavior ) ? "" : GetPropertyValStr(); + } + else + { + currValue = GetPropertyValStr(); + } + + m_tooltipText = string.Format( TooltipFormatter, m_nodeAttribs.Description, m_propertyInspectorName, currValue ); + } + + public override void SetClippedTitle( string newText, int maxSize = 170, string endString = "..." ) + { + base.SetClippedTitle( newText, maxSize, endString ); + UpdateTooltip(); + } + + public override void SetClippedAdditionalTitle( string newText, int maxSize = 170, string endString = "..." ) + { + base.SetClippedAdditionalTitle( newText, maxSize, endString ); + UpdateTooltip(); + } + + public override void OnEnable() + { + base.OnEnable(); + m_reRegisterName = true; + } + + public bool CanDrawMaterial { get { return m_materialMode && m_currentParameterType != PropertyType.Constant; } } + public int RawOrderIndex + { + get { return m_orderIndex; } + } + + public int OrderIndex + { + get { return m_orderIndex + m_orderIndexOffset; } + set { m_orderIndex = value; } + } + + public int OrderIndexOffset + { + get { return m_orderIndexOffset; } + set { m_orderIndexOffset = value; } + } + + public VariableMode CurrentVariableMode + { + get { return m_variableMode; } + set + { + if( value != m_variableMode ) + { + m_variableMode = value; + if( value == VariableMode.Fetch ) + { + m_oldName = m_propertyName; + } + else + { + if( !m_propertyName.Equals( m_oldName ) ) + { + if( UIUtils.IsUniformNameAvailable( m_propertyName ) ) + { + UIUtils.ReleaseUniformName( UniqueId, m_oldName ); + UIUtils.RegisterUniformName( UniqueId, m_propertyName ); + } + else + { + UIUtils.ShowMessage( UniqueId, string.Format( FetchToCreateDuplicatesMsg, m_propertyName, m_oldName ), MessageSeverity.Warning ); + m_propertyName = m_oldName; + } + m_propertyNameIsDirty = true; + OnPropertyNameChanged(); + } + else if( UIUtils.CheckUniformNameOwner( m_propertyName ) != UniqueId ) + { + string oldProperty = m_propertyName; + RegisterFirstAvailablePropertyName( false ); + UIUtils.ShowMessage( UniqueId, string.Format( FetchToCreateOnDuplicateNodeMsg, m_propertyName, oldProperty ), MessageSeverity.Warning ); + } + } + } + } + } + + public string PropertyData( MasterNodePortCategory portCategory ) + { + return ( m_currentParameterType == PropertyType.InstancedProperty ) ? m_outputPorts[ 0 ].LocalValue( portCategory ) : m_propertyName; + } + + public override void OnNodeLogicUpdate( DrawInfo drawInfo ) + { + base.OnNodeLogicUpdate( drawInfo ); + if( m_currentParameterType == PropertyType.Global && m_globalDefaultBehavior && ( EditorApplication.timeSinceStartup - m_globalFetchTimestamp ) > MaxGlobalFetchTimestamp ) + { + FetchGlobalValue(); + m_globalFetchTimestamp = EditorApplication.timeSinceStartup; + } + } + + public void ShowGlobalValueButton() + { + if( GUILayout.Button( "Set Global Value" ) ) + { + SetGlobalValue(); + } + } + + public override bool CheckFindText( string text ) + { + return base.CheckFindText( text ) || + m_propertyName.IndexOf( text, StringComparison.CurrentCultureIgnoreCase ) >= 0 || + m_propertyInspectorName.IndexOf( text, StringComparison.CurrentCultureIgnoreCase ) >= 0; + } + + //This should only be used on template internal properties + public void PropertyNameFromTemplate( TemplateShaderPropertyData data ) + { + m_propertyName = data.PropertyName; + m_propertyInspectorName = data.PropertyInspectorName; + } + public virtual void GeneratePPSInfo( ref string propertyDeclaration, ref string propertySet ) { } + public virtual void SetGlobalValue() { } + public virtual void FetchGlobalValue() { } + + public virtual string PropertyName { get { return m_propertyName; } } + public virtual string PropertyInspectorName { get { return m_propertyInspectorName; } } + public bool FreeType { get { return m_freeType; } set { m_freeType = value; } } + public bool ReRegisterName { get { return m_reRegisterName; } set { m_reRegisterName = value; } } + public string CustomPrefix { get { return m_customPrefix; } set { m_customPrefix = value; } } + public override void RefreshOnUndo() + { + base.RefreshOnUndo(); + BeginPropertyFromInspectorCheck(); + } + public override string DataToArray { get { return PropertyInspectorName; } } + public bool RegisterPropertyOnInstancing { get { return m_registerPropertyOnInstancing; } set { m_registerPropertyOnInstancing = value; } } + public bool SrpBatcherCompatible { get { return m_srpBatcherCompatible; } } + public bool AddGlobalToSRPBatcher { get { return m_addGlobalToSRPBatcher; } set { m_addGlobalToSRPBatcher = value; } } + public bool AutoRegister { get { return m_autoRegister; } set { m_autoRegister = value; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/PropertyNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/PropertyNode.cs.meta new file mode 100644 index 0000000..704a244 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/PropertyNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5bbfd66571b12f84983b398231271694 +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/RangedFloatNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/RangedFloatNode.cs new file mode 100644 index 0000000..1b52b60 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/RangedFloatNode.cs @@ -0,0 +1,535 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Float", "Constants And Properties", "Float property", null, KeyCode.Alpha1 )] + public sealed class RangedFloatNode : PropertyNode + { + private const int OriginalFontSize = 11; + + private const string MinValueStr = "Min"; + private const string MaxValueStr = "Max"; + + private const float LabelWidth = 8; + + [SerializeField] + private float m_defaultValue = 0; + + [SerializeField] + private float m_materialValue = 0; + + [SerializeField] + private float m_min = 0; + + [SerializeField] + private float m_max = 0; + + [SerializeField] + private bool m_floatMode = true; + + private int m_cachedPropertyId = -1; + + private bool m_isEditingFields; + private Vector3 m_previousValue = Vector3.zero; + private string[] m_fieldText = new string[] { "0", "0", "0" }; + + public RangedFloatNode() : base() { } + public RangedFloatNode( int uniqueId, float x, float y, float width, float height ) : base( uniqueId, x, y, width, height ) { } + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + GlobalTypeWarningText = string.Format( GlobalTypeWarningText, "Float" ); + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + m_insideSize.Set( 50, 0 ); + m_showPreview = false; + m_showHybridInstancedUI = true; + m_selectedLocation = PreviewLocation.BottomCenter; + m_availableAttribs.Add( new PropertyAttributes( "Toggle", "[Toggle]" ) ); +#if UNITY_2018_1_OR_NEWER + m_availableAttribs.Add( new PropertyAttributes( "No Keyword Toggle", "[ToggleUI]","[NoKeywordToggle]" ) ); +#else + m_availableAttribs.Add( new PropertyAttributes( "No Keyword Toggle", "[NoKeywordToggle]" ) ); +#endif + m_availableAttribs.Add( new PropertyAttributes( "Int Range", "[IntRange]" ) ); + m_availableAttribs.Add( new PropertyAttributes( "Enum", "[Enum]" ) ); + m_previewShaderGUID = "d9ca47581ac157145bff6f72ac5dd73e"; + m_srpBatcherCompatible = true; + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + UIUtils.RegisterFloatIntNode( this ); + } + + public override void Destroy() + { + base.Destroy(); + UIUtils.UnregisterFloatIntNode( this ); + } + + public override void OnDirtyProperty() + { + UIUtils.UpdateFloatIntDataNode( UniqueId, PropertyInspectorName ); + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + OnPropertyNameChanged(); + OnDirtyProperty(); + } + + public void SetFloatMode( bool value ) + { + if ( m_floatMode == value ) + return; + + m_floatMode = value; + if ( value ) + { + m_insideSize.x = 50;// + ( m_showPreview ? 50 : 0 ); + //m_firstPreviewDraw = true; + } + else + { + m_insideSize.x = 200;// + ( m_showPreview ? 0 : 0 ); + //m_firstPreviewDraw = true; + } + m_sizeIsDirty = true; + } + + public override void CopyDefaultsToMaterial() + { + m_materialValue = m_defaultValue; + } + + void DrawMinMaxUI() + { + EditorGUI.BeginChangeCheck(); + m_min = EditorGUILayoutFloatField( MinValueStr, m_min ); + m_max = EditorGUILayoutFloatField( MaxValueStr, m_max ); + if ( m_min > m_max ) + m_min = m_max; + + if ( m_max < m_min ) + m_max = m_min; + + if ( EditorGUI.EndChangeCheck() ) + { + SetFloatMode( m_min == m_max ); + } + } + public override void DrawSubProperties() + { + DrawMinMaxUI(); + + if ( m_floatMode ) + { + m_defaultValue = EditorGUILayoutFloatField( Constants.DefaultValueLabel, m_defaultValue ); + } + else + { + m_defaultValue = EditorGUILayoutSlider( Constants.DefaultValueLabel, m_defaultValue, m_min, m_max ); + } + } + + public override void DrawMaterialProperties() + { + DrawMinMaxUI(); + + EditorGUI.BeginChangeCheck(); + + if ( m_floatMode ) + { + m_materialValue = EditorGUILayoutFloatField( Constants.MaterialValueLabel, m_materialValue ); + } + else + { + m_materialValue = EditorGUILayoutSlider( Constants.MaterialValueLabel, m_materialValue, m_min, m_max ); + } + if ( EditorGUI.EndChangeCheck() ) + { + //MarkForPreviewUpdate(); + if ( m_materialMode ) + m_requireMaterialUpdate = true; + } + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + if ( m_cachedPropertyId == -1 ) + m_cachedPropertyId = Shader.PropertyToID( "_InputFloat" ); + + if ( m_materialMode && m_currentParameterType != PropertyType.Constant ) + PreviewMaterial.SetFloat( m_cachedPropertyId, m_materialValue ); + else + PreviewMaterial.SetFloat( m_cachedPropertyId, m_defaultValue ); + } + + public override void OnNodeLayout( DrawInfo drawInfo ) + { + base.OnNodeLayout( drawInfo ); + + if ( m_floatMode ) + { + m_propertyDrawPos = m_remainingBox; + m_propertyDrawPos.x = m_remainingBox.x - LabelWidth * drawInfo.InvertedZoom; + m_propertyDrawPos.width = drawInfo.InvertedZoom * Constants.FLOAT_DRAW_WIDTH_FIELD_SIZE; + m_propertyDrawPos.height = drawInfo.InvertedZoom * Constants.FLOAT_DRAW_HEIGHT_FIELD_SIZE; + } + else + { + m_propertyDrawPos = m_remainingBox; + m_propertyDrawPos.width = m_outputPorts[ 0 ].Position.x - m_propertyDrawPos.x - (m_outputPorts[ 0 ].LabelSize.x + (Constants.PORT_TO_LABEL_SPACE_X + 3) * drawInfo.InvertedZoom + 2); + m_propertyDrawPos.height = drawInfo.InvertedZoom * Constants.FLOAT_DRAW_HEIGHT_FIELD_SIZE; + } + } + + public override void DrawGUIControls( DrawInfo drawInfo ) + { + base.DrawGUIControls( drawInfo ); + + if ( drawInfo.CurrentEventType != EventType.MouseDown ) + return; + + Rect hitBox = m_remainingBox; + hitBox.xMin -= LabelWidth * drawInfo.InvertedZoom; + bool insideBox = hitBox.Contains( drawInfo.MousePosition ); + + if ( insideBox ) + { + GUI.FocusControl( null ); + m_isEditingFields = true; + } + else if ( m_isEditingFields && !insideBox ) + { + GUI.FocusControl( null ); + m_isEditingFields = false; + } + } + void DrawFakeFloatMaterial( DrawInfo drawInfo ) + { + if( m_floatMode ) + { + //UIUtils.DrawFloat( this, ref m_propertyDrawPos, ref m_materialValue, LabelWidth * drawInfo.InvertedZoom ); + Rect fakeField = m_propertyDrawPos; + fakeField.xMin += LabelWidth * drawInfo.InvertedZoom; + if( GUI.enabled ) + { + Rect fakeLabel = m_propertyDrawPos; + fakeLabel.xMax = fakeField.xMin; + EditorGUIUtility.AddCursorRect( fakeLabel, MouseCursor.SlideArrow ); + EditorGUIUtility.AddCursorRect( fakeField, MouseCursor.Text ); + } + if( m_previousValue[ 0 ] != m_materialValue ) + { + m_previousValue[ 0 ] = m_materialValue; + m_fieldText[ 0 ] = m_materialValue.ToString(); + } + + GUI.Label( fakeField, m_fieldText[ 0 ], UIUtils.MainSkin.textField ); + } + else + { + DrawFakeSlider( ref m_materialValue, drawInfo ); + } + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + if ( !m_isVisible ) + return; + + if ( m_isEditingFields && m_currentParameterType != PropertyType.Global ) + { + if ( m_materialMode && m_currentParameterType != PropertyType.Constant ) + { + EditorGUI.BeginChangeCheck(); + if ( m_floatMode ) + { + UIUtils.DrawFloat( this, ref m_propertyDrawPos, ref m_materialValue, LabelWidth * drawInfo.InvertedZoom ); + } + else + { + DrawSlider( ref m_materialValue, drawInfo ); + } + if ( EditorGUI.EndChangeCheck() ) + { + PreviewIsDirty = true; + m_requireMaterialUpdate = true; + if ( m_currentParameterType != PropertyType.Constant ) + { + BeginDelayedDirtyProperty(); + } + } + } + else + { + EditorGUI.BeginChangeCheck(); + + if ( m_floatMode ) + { + UIUtils.DrawFloat( this, ref m_propertyDrawPos, ref m_defaultValue, LabelWidth * drawInfo.InvertedZoom ); + } + else + { + DrawSlider( ref m_defaultValue, drawInfo ); + } + if ( EditorGUI.EndChangeCheck() ) + { + PreviewIsDirty = true; + BeginDelayedDirtyProperty(); + } + + } + } + else if ( drawInfo.CurrentEventType == EventType.Repaint && ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD4 ) + { + if( m_currentParameterType == PropertyType.Global ) + { + bool guiEnabled = GUI.enabled; + GUI.enabled = false; + DrawFakeFloatMaterial( drawInfo ); + GUI.enabled = guiEnabled; + } + else if ( m_materialMode && m_currentParameterType != PropertyType.Constant ) + { + DrawFakeFloatMaterial( drawInfo ); + } + else + { + if ( m_floatMode ) + { + //UIUtils.DrawFloat( this, ref m_propertyDrawPos, ref m_defaultValue, LabelWidth * drawInfo.InvertedZoom ); + Rect fakeField = m_propertyDrawPos; + fakeField.xMin += LabelWidth * drawInfo.InvertedZoom; + Rect fakeLabel = m_propertyDrawPos; + fakeLabel.xMax = fakeField.xMin; + EditorGUIUtility.AddCursorRect( fakeLabel, MouseCursor.SlideArrow ); + EditorGUIUtility.AddCursorRect( fakeField, MouseCursor.Text ); + + if ( m_previousValue[ 0 ] != m_defaultValue ) + { + m_previousValue[ 0 ] = m_defaultValue; + m_fieldText[ 0 ] = m_defaultValue.ToString(); + } + + GUI.Label( fakeField, m_fieldText[ 0 ], UIUtils.MainSkin.textField ); + } + else + { + DrawFakeSlider( ref m_defaultValue, drawInfo ); + } + } + } + } + + void DrawFakeSlider( ref float value, DrawInfo drawInfo ) + { + float rangeWidth = 30 * drawInfo.InvertedZoom; + float rangeSpacing = 5 * drawInfo.InvertedZoom; + + //Min + Rect minRect = m_propertyDrawPos; + minRect.width = rangeWidth; + EditorGUIUtility.AddCursorRect( minRect, MouseCursor.Text ); + if ( m_previousValue[ 1 ] != m_min ) + { + m_previousValue[ 1 ] = m_min; + m_fieldText[ 1 ] = m_min.ToString(); + } + GUI.Label( minRect, m_fieldText[ 1 ], UIUtils.MainSkin.textField ); + + //Value Area + Rect valRect = m_propertyDrawPos; + valRect.width = rangeWidth; + valRect.x = m_propertyDrawPos.xMax - rangeWidth - rangeWidth - rangeSpacing; + EditorGUIUtility.AddCursorRect( valRect, MouseCursor.Text ); + if ( m_previousValue[ 0 ] != value ) + { + m_previousValue[ 0 ] = value; + m_fieldText[ 0 ] = value.ToString(); + } + GUI.Label( valRect, m_fieldText[ 0 ], UIUtils.MainSkin.textField ); + + //Max + Rect maxRect = m_propertyDrawPos; + maxRect.width = rangeWidth; + maxRect.x = m_propertyDrawPos.xMax - rangeWidth; + EditorGUIUtility.AddCursorRect( maxRect, MouseCursor.Text ); + if ( m_previousValue[ 2 ] != m_max ) + { + m_previousValue[ 2 ] = m_max; + m_fieldText[ 2 ] = m_max.ToString(); + } + GUI.Label( maxRect, m_fieldText[ 2 ], UIUtils.MainSkin.textField ); + + Rect sliderValRect = m_propertyDrawPos; + sliderValRect.x = minRect.xMax + rangeSpacing; + sliderValRect.xMax = valRect.xMin - rangeSpacing; + Rect sliderBackRect = sliderValRect; + sliderBackRect.height = 5 * drawInfo.InvertedZoom; + sliderBackRect.center = new Vector2( sliderValRect.center.x, Mathf.Round( sliderValRect.center.y ) ); + + + GUI.Label( sliderBackRect, string.Empty, UIUtils.GetCustomStyle( CustomStyle.SliderStyle ) ); + + sliderValRect.width = 10; + float percent = ( value - m_min) / ( m_max-m_min ); + percent = Mathf.Clamp01( percent ); + sliderValRect.x += percent * (sliderBackRect.width - 10 * drawInfo.InvertedZoom ); + GUI.Label( sliderValRect, string.Empty, UIUtils.RangedFloatSliderThumbStyle ); + } + + void DrawSlider( ref float value, DrawInfo drawInfo ) + { + float rangeWidth = 30 * drawInfo.InvertedZoom; + float rangeSpacing = 5 * drawInfo.InvertedZoom; + + //Min + Rect minRect = m_propertyDrawPos; + minRect.width = rangeWidth; + m_min = EditorGUIFloatField( minRect, m_min, UIUtils.MainSkin.textField ); + + //Value Area + Rect valRect = m_propertyDrawPos; + valRect.width = rangeWidth; + valRect.x = m_propertyDrawPos.xMax - rangeWidth - rangeWidth - rangeSpacing; + value = EditorGUIFloatField( valRect, value, UIUtils.MainSkin.textField ); + + //Max + Rect maxRect = m_propertyDrawPos; + maxRect.width = rangeWidth; + maxRect.x = m_propertyDrawPos.xMax - rangeWidth; + m_max = EditorGUIFloatField( maxRect, m_max, UIUtils.MainSkin.textField ); + + //Value Slider + Rect sliderValRect = m_propertyDrawPos; + sliderValRect.x = minRect.xMax + rangeSpacing; + sliderValRect.xMax = valRect.xMin - rangeSpacing; + Rect sliderBackRect = sliderValRect; + sliderBackRect.height = 5 * drawInfo.InvertedZoom; + sliderBackRect.center = new Vector2( sliderValRect.center.x, Mathf.Round( sliderValRect.center.y )); + GUI.Label( sliderBackRect, string.Empty, UIUtils.GetCustomStyle( CustomStyle.SliderStyle ) ); + value = GUIHorizontalSlider( sliderValRect, value, m_min, m_max, GUIStyle.none, UIUtils.RangedFloatSliderThumbStyle ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + m_precisionString = UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, m_outputPorts[ 0 ].DataType ); + + if ( m_currentParameterType != PropertyType.Constant ) + return PropertyData( dataCollector.PortCategory ); + + return IOUtils.Floatify( m_defaultValue ); + } + + public override string GetPropertyValue() + { + if ( m_floatMode ) + { + return PropertyAttributes + m_propertyName + "(\"" + m_propertyInspectorName + "\", Float) = " + m_defaultValue; + } + else + { + return PropertyAttributes + m_propertyName + "(\"" + m_propertyInspectorName + "\", Range( " + m_min + " , " + m_max + ")) = " + m_defaultValue; + } + } + + public override void UpdateMaterial( Material mat ) + { + base.UpdateMaterial( mat ); + if ( UIUtils.IsProperty( m_currentParameterType ) && !InsideShaderFunction ) + { + mat.SetFloat( m_propertyName, m_materialValue ); + } + } + + public override void SetMaterialMode( Material mat , bool fetchMaterialValues ) + { + base.SetMaterialMode( mat , fetchMaterialValues ); + if ( fetchMaterialValues && m_materialMode && UIUtils.IsProperty( m_currentParameterType ) && mat.HasProperty( m_propertyName ) ) + { + m_materialValue = mat.GetFloat( m_propertyName ); + } + } + + public override void ForceUpdateFromMaterial( Material material ) + { + if( UIUtils.IsProperty( m_currentParameterType ) && material.HasProperty( m_propertyName ) ) + { + m_materialValue = material.GetFloat( m_propertyName ); + PreviewIsDirty = true; + } + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_defaultValue = Convert.ToSingle( GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > 14101 ) + { + m_materialValue = Convert.ToSingle( GetCurrentParam( ref nodeParams ) ); + } + + m_min = Convert.ToSingle( GetCurrentParam( ref nodeParams ) ); + m_max = Convert.ToSingle( GetCurrentParam( ref nodeParams ) ); + SetFloatMode( m_min == m_max ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_defaultValue ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_materialValue ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_min ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_max ); + } + + public override string GetPropertyValStr() + { + return ( m_materialMode && m_currentParameterType != PropertyType.Constant ) ? + m_materialValue.ToString( Mathf.Abs( m_materialValue ) > 1000 ? Constants.PropertyBigFloatFormatLabel : Constants.PropertyFloatFormatLabel ) : + m_defaultValue.ToString( Mathf.Abs( m_defaultValue ) > 1000 ? Constants.PropertyBigFloatFormatLabel : Constants.PropertyFloatFormatLabel ); + } + + public override void SetGlobalValue() { Shader.SetGlobalFloat( m_propertyName, m_defaultValue ); } + public override void FetchGlobalValue() { m_materialValue = Shader.GetGlobalFloat( m_propertyName ); } + public float Value + { + get { return m_defaultValue; } + set { m_defaultValue = value; } + } + + public void SetMaterialValueFromInline( float val ) + { + m_materialValue = val; + m_requireMaterialUpdate = true; + } + public override void GeneratePPSInfo( ref string propertyDeclaration, ref string propertySet ) + { + string additionalHeaders = string.Empty; + if( !m_floatMode ) + { + additionalHeaders = string.Format( "Range( {0}, {1} ),", m_min, m_max ); + } + propertyDeclaration += string.Format( ASEPPSHelperTool.PPSPropertyDecFormat, additionalHeaders, PropertyInspectorName, + ASEPPSHelperTool.WireToPPSType[ WirePortDataType.FLOAT ], PropertyName, m_defaultValue ); + + propertySet += string.Format( ASEPPSHelperTool.PPSPropertySetFormat, "Float", PropertyName ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/RangedFloatNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/RangedFloatNode.cs.meta new file mode 100644 index 0000000..dbf3243 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/RangedFloatNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e81453c5ad3b8224db874b56bf00cad2 +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables.meta new file mode 100644 index 0000000..22447d4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 92f993d3ba8b1394eaf8c4fe308cab11 +folderAsset: yes +timeCreated: 1481126946 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen.meta new file mode 100644 index 0000000..e1fbf68 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8c4b0845954941d4d9809abaa67bdc2b +folderAsset: yes +timeCreated: 1481126947 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/CameraProjectionNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/CameraProjectionNode.cs new file mode 100644 index 0000000..0591ba1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/CameraProjectionNode.cs @@ -0,0 +1,100 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + public enum BuiltInShaderCameraTypes + { + unity_CameraProjection = 0, + unity_CameraInvProjection + } + + [Serializable] + [NodeAttributes( "Projection Matrices", "Camera And Screen", "Camera's Projection/Inverse Projection matrix" )] + public sealed class CameraProjectionNode : ShaderVariablesNode + { + private const string _projMatrixLabelStr = "Projection Matrix"; + private readonly string[] _projMatrixValuesStr = { "Camera Projection", + "Inverse Camera Projection"}; + + + [SerializeField] + private BuiltInShaderCameraTypes m_selectedType = BuiltInShaderCameraTypes.unity_CameraProjection; + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, _projMatrixValuesStr[ (int)m_selectedType ], WirePortDataType.FLOAT4x4 ); + m_textLabelWidth = 115; + m_autoWrapProperties = true; + m_hasLeftDropdown = true; + } + + public override void AfterCommonInit() + { + base.AfterCommonInit(); + if( PaddingTitleLeft == 0 ) + { + PaddingTitleLeft = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + if( PaddingTitleRight == 0 ) + PaddingTitleRight = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + } + } + + public override void Destroy() + { + base.Destroy(); + m_upperLeftWidget = null; + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + EditorGUI.BeginChangeCheck(); + m_selectedType = (BuiltInShaderCameraTypes)m_upperLeftWidget.DrawWidget( this, (int)m_selectedType, _projMatrixValuesStr ); + if( EditorGUI.EndChangeCheck() ) + { + ChangeOutputName( 0, _projMatrixValuesStr[ (int)m_selectedType ] ); + SetSaveIsDirty(); + } + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUI.BeginChangeCheck(); + m_selectedType = (BuiltInShaderCameraTypes)EditorGUILayoutPopup( _projMatrixLabelStr, (int)m_selectedType, _projMatrixValuesStr ); + if( EditorGUI.EndChangeCheck() ) + { + ChangeOutputName( 0, _projMatrixValuesStr[ (int)m_selectedType ] ); + SetSaveIsDirty(); + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + GeneratorUtils.RegisterUnity2019MatrixDefines( ref dataCollector ); + return m_selectedType.ToString(); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_selectedType = (BuiltInShaderCameraTypes)Enum.Parse( typeof( BuiltInShaderCameraTypes ), GetCurrentParam( ref nodeParams ) ); + ChangeOutputName( 0, _projMatrixValuesStr[ (int)m_selectedType ] ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_selectedType ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/CameraProjectionNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/CameraProjectionNode.cs.meta new file mode 100644 index 0000000..11a1c16 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/CameraProjectionNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f776bdd36b750304c8e0de8ee1f31fc0 +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/CameraWorldClipPlanes.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/CameraWorldClipPlanes.cs new file mode 100644 index 0000000..fd23099 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/CameraWorldClipPlanes.cs @@ -0,0 +1,115 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + public enum BuiltInShaderClipPlanesTypes + { + Left = 0, + Right, + Bottom, + Top, + Near, + Far + } + + [Serializable] + [NodeAttributes( "Clip Planes", "Camera And Screen", "Camera World Clip Planes" )] + public sealed class CameraWorldClipPlanes : ShaderVariablesNode + { + [SerializeField] + private BuiltInShaderClipPlanesTypes m_selectedType = BuiltInShaderClipPlanesTypes.Left; + + private const string LabelStr = "Plane"; + private const string ValueStr = "unity_CameraWorldClipPlanes"; + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + private int m_planeId; + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, "ABCD", WirePortDataType.FLOAT4 ); + m_textLabelWidth = 55; + m_autoWrapProperties = true; + m_hasLeftDropdown = true; + SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, m_selectedType ) ); + m_previewShaderGUID = "6afe5a4ad7bbd0e4ab352c758f543a09"; + } + + public override void OnEnable() + { + base.OnEnable(); + m_planeId = Shader.PropertyToID( "_PlaneId" ); + } + + public override void AfterCommonInit() + { + base.AfterCommonInit(); + if( PaddingTitleLeft == 0 ) + { + PaddingTitleLeft = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + if( PaddingTitleRight == 0 ) + PaddingTitleRight = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + } + } + + public override void Destroy() + { + base.Destroy(); + m_upperLeftWidget = null; + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + m_upperLeftWidget.DrawWidget(ref m_selectedType, this, OnWidgetUpdate ); + } + + private readonly Action OnWidgetUpdate = ( x ) => { + x.SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, ( x as CameraWorldClipPlanes ).Type ) ); + }; + + public BuiltInShaderClipPlanesTypes Type { get { return m_selectedType; } } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUI.BeginChangeCheck(); + m_selectedType = ( BuiltInShaderClipPlanesTypes ) EditorGUILayoutEnumPopup( LabelStr, m_selectedType ); + if ( EditorGUI.EndChangeCheck() ) + { + SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, m_selectedType ) ); + SetSaveIsDirty(); + } + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + PreviewMaterial.SetInt( m_planeId, (int)m_selectedType ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + return ValueStr + "[" + ( int ) m_selectedType + "]"; + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_selectedType = ( BuiltInShaderClipPlanesTypes ) Enum.Parse( typeof( BuiltInShaderClipPlanesTypes ), GetCurrentParam( ref nodeParams ) ); + SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, m_selectedType ) ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_selectedType ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/CameraWorldClipPlanes.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/CameraWorldClipPlanes.cs.meta new file mode 100644 index 0000000..3b17b84 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/CameraWorldClipPlanes.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e5a9a010f1c8dda449c8ca7ee9e25869 +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/OrthoParams.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/OrthoParams.cs new file mode 100644 index 0000000..c2e93c2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/OrthoParams.cs @@ -0,0 +1,38 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Ortho Params", "Camera And Screen", "Orthographic Parameters" )] + public sealed class OrthoParams : ConstVecShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputName( 1, "Ortho Cam Width" ); + ChangeOutputName( 2, "Ortho Cam Height" ); + ChangeOutputName( 3, "Unused" ); + ChangeOutputName( 4, "Projection Mode" ); + m_value = "unity_OrthoParams"; + m_previewShaderGUID = "88a910ece3dce224793e669bb1bc158d"; + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + if( !m_outputPorts[ 0 ].IsConnected ) + { + m_outputPorts[ 0 ].Visible = false; + m_sizeIsDirty = true; + } + + if( !m_outputPorts[ 3 ].IsConnected ) + { + m_outputPorts[ 3 ].Visible = false; + m_sizeIsDirty = true; + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/OrthoParams.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/OrthoParams.cs.meta new file mode 100644 index 0000000..d406a63 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/OrthoParams.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f9431cdf8e81c1d4f902b3fa7d04f7ac +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/ProjectionParams.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/ProjectionParams.cs new file mode 100644 index 0000000..9e4357b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/ProjectionParams.cs @@ -0,0 +1,32 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Projection Params", "Camera And Screen", "Projection Near/Far parameters" )] + public sealed class ProjectionParams : ConstVecShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputName( 1, "Flipped" ); + ChangeOutputName( 2, "Near Plane" ); + ChangeOutputName( 3, "Far Plane" ); + ChangeOutputName( 4, "1/Far Plane" ); + m_value = "_ProjectionParams"; + m_previewShaderGUID = "97ae846cb0a6b044388fad3bc03bb4c2"; + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + if( !m_outputPorts[ 0 ].IsConnected ) + { + m_outputPorts[ 0 ].Visible = false; + m_sizeIsDirty = true; + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/ProjectionParams.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/ProjectionParams.cs.meta new file mode 100644 index 0000000..8e87d5a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/ProjectionParams.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ba1ca8bace2c2dd4dafac6f73f4dfb1b +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/ScreenParams.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/ScreenParams.cs new file mode 100644 index 0000000..5446ac2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/ScreenParams.cs @@ -0,0 +1,32 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Screen Params", "Camera And Screen", "Camera's Render Target size parameters" )] + public sealed class ScreenParams : ConstVecShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputName( 1, "RT Width" ); + ChangeOutputName( 2, "RT Height" ); + ChangeOutputName( 3, "1+1/Width" ); + ChangeOutputName( 4, "1+1/Height" ); + m_value = "_ScreenParams"; + m_previewShaderGUID = "78173633b803de4419206191fed3d61e"; + } + + //public override void RefreshExternalReferences() + //{ + // base.RefreshExternalReferences(); + // if( !m_outputPorts[ 0 ].IsConnected ) + // { + // m_outputPorts[ 0 ].Visible = false; + // m_sizeIsDirty = true; + // } + //} + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/ScreenParams.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/ScreenParams.cs.meta new file mode 100644 index 0000000..f43db82 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/ScreenParams.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2e593f23857d59643b5b5f6dd6264e1b +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/WorldSpaceCameraPos.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/WorldSpaceCameraPos.cs new file mode 100644 index 0000000..2342f15 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/WorldSpaceCameraPos.cs @@ -0,0 +1,28 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "World Space Camera Pos", "Camera And Screen", "World Space Camera position" )] + public sealed class WorldSpaceCameraPos : ConstantShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, "XYZ", WirePortDataType.FLOAT3 ); + AddOutputPort( WirePortDataType.FLOAT, "X" ); + AddOutputPort( WirePortDataType.FLOAT, "Y" ); + AddOutputPort( WirePortDataType.FLOAT, "Z" ); + + m_value = "_WorldSpaceCameraPos"; + m_previewShaderGUID = "6b0c78411043dd24dac1152c84bb63ba"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + return GetOutputVectorItem( 0, outputId, base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ) ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/WorldSpaceCameraPos.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/WorldSpaceCameraPos.cs.meta new file mode 100644 index 0000000..8a47447 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/WorldSpaceCameraPos.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 972d92a6008896f4292a61726e18f667 +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/ZBufferParams.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/ZBufferParams.cs new file mode 100644 index 0000000..4fcb5e1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/ZBufferParams.cs @@ -0,0 +1,31 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Z-Buffer Params", "Camera And Screen", "Linearized Z buffer values" )] + public sealed class ZBufferParams : ConstVecShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputName( 1, "1-far/near" ); + ChangeOutputName( 2, "far/near" ); + ChangeOutputName( 3, "[0]/far" ); + ChangeOutputName( 4, "[1]/far" ); + m_value = "_ZBufferParams"; + m_previewShaderGUID = "56c42c106bcb497439187f5bb6b6f94d"; + } + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + if( !m_outputPorts[ 0 ].IsConnected ) + { + m_outputPorts[ 0 ].Visible = false; + m_sizeIsDirty = true; + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/ZBufferParams.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/ZBufferParams.cs.meta new file mode 100644 index 0000000..e8b668c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/CameraAndScreen/ZBufferParams.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2765a41106f478f4982e859b978bdec4 +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/ConstVecShaderVariable.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/ConstVecShaderVariable.cs new file mode 100644 index 0000000..d74d8a5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/ConstVecShaderVariable.cs @@ -0,0 +1,39 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + public class ConstVecShaderVariable : ShaderVariablesNode + { + [SerializeField] + protected string m_value; + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, " ", WirePortDataType.FLOAT4 ); + AddOutputPort( WirePortDataType.FLOAT, "0" ); + AddOutputPort( WirePortDataType.FLOAT, "1" ); + AddOutputPort( WirePortDataType.FLOAT, "2" ); + AddOutputPort( WirePortDataType.FLOAT, "3" ); + } + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + switch ( outputId ) + { + case 0: return m_value; + case 1: return ( m_value + ".x" ); + case 2: return ( m_value + ".y" ); + case 3: return ( m_value + ".z" ); + case 4: return ( m_value + ".w" ); + } + + UIUtils.ShowMessage( UniqueId, "ConstVecShaderVariable generating empty code", MessageSeverity.Warning ); + return string.Empty; + } + + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/ConstVecShaderVariable.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/ConstVecShaderVariable.cs.meta new file mode 100644 index 0000000..97976c8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/ConstVecShaderVariable.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9102c0b554fd5ad4785acf870dcc17eb +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/ConstantShaderVariable.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/ConstantShaderVariable.cs new file mode 100644 index 0000000..ff6279e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/ConstantShaderVariable.cs @@ -0,0 +1,35 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class ConstantShaderVariable : ShaderVariablesNode + { + [SerializeField] + protected string m_value; + + [SerializeField] + protected string m_HDValue = string.Empty; + + [SerializeField] + protected string m_LWValue = string.Empty; + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + if( dataCollector.IsTemplate ) + { + if( dataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.HD && !string.IsNullOrEmpty( m_HDValue ) ) + return m_HDValue; + + if( dataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.Lightweight && !string.IsNullOrEmpty( m_LWValue )) + return m_LWValue; + } + return m_value; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/ConstantShaderVariable.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/ConstantShaderVariable.cs.meta new file mode 100644 index 0000000..5511016 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/ConstantShaderVariable.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 266391c3c4308014e9ce246e5484b917 +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/FogAndAmbient.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/FogAndAmbient.meta new file mode 100644 index 0000000..e0c69e8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/FogAndAmbient.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 78eb7b1e34d423c40a949c9e75b5f24a +folderAsset: yes +timeCreated: 1481126946 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/FogAndAmbient/FogAndAmbientColorsNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/FogAndAmbient/FogAndAmbientColorsNode.cs new file mode 100644 index 0000000..2af78f7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/FogAndAmbient/FogAndAmbientColorsNode.cs @@ -0,0 +1,126 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + public enum BuiltInFogAndAmbientColors + { + UNITY_LIGHTMODEL_AMBIENT = 0, + unity_AmbientSky, + unity_AmbientEquator, + unity_AmbientGround, + unity_FogColor + } + + [Serializable] + [NodeAttributes( "Fog And Ambient Colors", "Light", "Fog and Ambient colors" )] + public sealed class FogAndAmbientColorsNode : ShaderVariablesNode + { + private const string ColorLabelStr = "Color"; + private readonly string[] ColorValuesStr = { + "Ambient light ( Legacy )", + "Sky ambient light", + "Equator ambient light", + "Ground ambient light", + "Fog" + }; + + [SerializeField] + private BuiltInFogAndAmbientColors m_selectedType = BuiltInFogAndAmbientColors.UNITY_LIGHTMODEL_AMBIENT; + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, ColorValuesStr[ ( int ) m_selectedType ], WirePortDataType.COLOR ); + m_textLabelWidth = 50; + m_autoWrapProperties = true; + m_hasLeftDropdown = true; + m_previewShaderGUID = "937c7bde062f0f942b600d9950d2ebb2"; + } + + public override void AfterCommonInit() + { + base.AfterCommonInit(); + if( PaddingTitleLeft == 0 ) + { + PaddingTitleLeft = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + if( PaddingTitleRight == 0 ) + PaddingTitleRight = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + } + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + m_previewMaterialPassId = (int)m_selectedType; + } + + public override void Destroy() + { + base.Destroy(); + m_upperLeftWidget = null; + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + EditorGUI.BeginChangeCheck(); + m_selectedType = (BuiltInFogAndAmbientColors)m_upperLeftWidget.DrawWidget( this, (int)m_selectedType, ColorValuesStr ); + if( EditorGUI.EndChangeCheck() ) + { + ChangeOutputName( 0, ColorValuesStr[ (int)m_selectedType ] ); + } + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUI.BeginChangeCheck(); + m_selectedType = ( BuiltInFogAndAmbientColors ) EditorGUILayoutPopup( ColorLabelStr, ( int ) m_selectedType, ColorValuesStr ); + + if ( EditorGUI.EndChangeCheck() ) + { + ChangeOutputName( 0, ColorValuesStr[ ( int ) m_selectedType ] ); + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + if( dataCollector.IsTemplate && dataCollector.CurrentSRPType == TemplateSRPType.HD ) + { + switch( m_selectedType ) + { + case BuiltInFogAndAmbientColors.unity_AmbientSky: + return "_Ambient_ColorSky"; + case BuiltInFogAndAmbientColors.unity_AmbientEquator: + return "_Ambient_Equator"; + case BuiltInFogAndAmbientColors.unity_AmbientGround: + return "_Ambient_Ground"; + case BuiltInFogAndAmbientColors.unity_FogColor: + return "_FogColor"; + } + } + return m_selectedType.ToString(); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_selectedType = ( BuiltInFogAndAmbientColors ) Enum.Parse( typeof( BuiltInFogAndAmbientColors ), GetCurrentParam( ref nodeParams ) ); + ChangeOutputName( 0, ColorValuesStr[ ( int ) m_selectedType ] ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_selectedType ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/FogAndAmbient/FogAndAmbientColorsNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/FogAndAmbient/FogAndAmbientColorsNode.cs.meta new file mode 100644 index 0000000..f2ab7d0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/FogAndAmbient/FogAndAmbientColorsNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e2bdfc2fa6fcd0640b01a8b7448a1a11 +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/FogAndAmbient/FogParamsNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/FogAndAmbient/FogParamsNode.cs new file mode 100644 index 0000000..63a635d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/FogAndAmbient/FogParamsNode.cs @@ -0,0 +1,32 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Fog Params", "Light", "Parameters for fog calculation" )] + public sealed class FogParamsNode : ConstVecShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputName( 1, "Density/Sqrt(Ln(2))" ); + ChangeOutputName( 2, "Density/Ln(2)" ); + ChangeOutputName( 3, "-1/(End-Start)" ); + ChangeOutputName( 4, "End/(End-Start))" ); + m_value = "unity_FogParams"; + m_previewShaderGUID = "42abde3281b1848438c3b53443c91a1e"; + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + if( !m_outputPorts[ 0 ].IsConnected ) + { + m_outputPorts[ 0 ].Visible = false; + m_sizeIsDirty = true; + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/FogAndAmbient/FogParamsNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/FogAndAmbient/FogParamsNode.cs.meta new file mode 100644 index 0000000..ccc0df5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/FogAndAmbient/FogParamsNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a3d8c31159e07bc419a7484ab5e894ed +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting.meta new file mode 100644 index 0000000..86287e6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 47f503bcb5935b649beee3296dd40260 +folderAsset: yes +timeCreated: 1481126946 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/CustomStandardSurface.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/CustomStandardSurface.cs new file mode 100644 index 0000000..d985714 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/CustomStandardSurface.cs @@ -0,0 +1,197 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + + public enum ASEStandardSurfaceWorkflow + { + Metallic = 0, + Specular + } + + [Serializable] + [NodeAttributes( "Standard Surface Light", "Light", "Provides a way to create a standard surface light model in custom lighting mode", NodeAvailabilityFlags = (int)NodeAvailability.CustomLighting )] + public sealed class CustomStandardSurface : ParentNode + { + private const string WorkflowStr = "Workflow"; + + [SerializeField] + private ASEStandardSurfaceWorkflow m_workflow = ASEStandardSurfaceWorkflow.Metallic; + + [SerializeField] + private ViewSpace m_normalSpace = ViewSpace.Tangent; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT3, false, "Albedo" ); + AddInputPort( WirePortDataType.FLOAT3, false, "Normal" ); + m_inputPorts[ 1 ].Vector3InternalData = Vector3.forward; + AddInputPort( WirePortDataType.FLOAT3, false, "Emission" ); + AddInputPort( WirePortDataType.FLOAT, false, "Metallic" ); + AddInputPort( WirePortDataType.FLOAT, false, "Smoothness" ); + AddInputPort( WirePortDataType.FLOAT, false, "Occlusion" ); + m_inputPorts[ 5 ].FloatInternalData = 1; + AddOutputPort( WirePortDataType.FLOAT3, "RGB" ); + m_autoWrapProperties = true; + m_textLabelWidth = 100; + m_errorMessageTypeIsError = NodeMessageType.Warning; + m_errorMessageTooltip = "This node only returns correct information using a custom light model, otherwise returns 0"; + } + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + base.PropagateNodeData( nodeData, ref dataCollector ); + if( m_inputPorts[ 1 ].IsConnected && m_normalSpace == ViewSpace.Tangent ) + dataCollector.DirtyNormal = true; + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUI.BeginChangeCheck(); + m_workflow = (ASEStandardSurfaceWorkflow)EditorGUILayoutEnumPopup( WorkflowStr, m_workflow ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateSpecularMetallicPorts(); + } + + EditorGUI.BeginChangeCheck(); + m_normalSpace = (ViewSpace)EditorGUILayoutEnumPopup( "Normal Space", m_normalSpace ); + if( EditorGUI.EndChangeCheck() ) + { + UpdatePort(); + } + } + + private void UpdatePort() + { + if( m_normalSpace == ViewSpace.World ) + m_inputPorts[ 1 ].Name = "World Normal"; + else + m_inputPorts[ 1 ].Name = "Normal"; + + m_sizeIsDirty = true; + } + + void UpdateSpecularMetallicPorts() + { + if( m_workflow == ASEStandardSurfaceWorkflow.Specular ) + m_inputPorts[ 3 ].ChangeProperties( "Specular", WirePortDataType.FLOAT3, false ); + else + m_inputPorts[ 3 ].ChangeProperties( "Metallic", WirePortDataType.FLOAT, false ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.GenType == PortGenType.NonCustomLighting || dataCollector.CurrentCanvasMode != NodeAvailability.CustomLighting ) + return "float3(0,0,0)"; + + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string specularMode = string.Empty; + if( m_workflow == ASEStandardSurfaceWorkflow.Specular ) + specularMode = "Specular"; + + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_NORMAL, CurrentPrecisionType ); + + if( dataCollector.DirtyNormal ) + { + dataCollector.AddToInput( UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + dataCollector.ForceNormal = true; + } + + dataCollector.AddLocalVariable( UniqueId, "SurfaceOutputStandard" + specularMode + " s" + OutputId + " = (SurfaceOutputStandard" + specularMode + " ) 0;" ); + dataCollector.AddLocalVariable( UniqueId, "s" + OutputId + ".Albedo = " + m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ) + ";" ); + + string normal = string.Empty; + + if( m_inputPorts[ 1 ].IsConnected ) + { + normal = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + if( m_normalSpace == ViewSpace.Tangent ) + { + normal = "WorldNormalVector( " + Constants.InputVarStr + " , " + normal + " )"; + } + } + else + { + normal = GeneratorUtils.GenerateWorldNormal( ref dataCollector, UniqueId ); + } + + + + dataCollector.AddLocalVariable( UniqueId, "s" + OutputId + ".Normal = "+ normal + ";" ); + dataCollector.AddLocalVariable( UniqueId, "s" + OutputId + ".Emission = " + m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector ) + ";" ); + if( m_workflow == ASEStandardSurfaceWorkflow.Specular ) + dataCollector.AddLocalVariable( UniqueId, "s" + OutputId + ".Specular = " + m_inputPorts[ 3 ].GeneratePortInstructions( ref dataCollector ) + ";" ); + else + dataCollector.AddLocalVariable( UniqueId, "s" + OutputId + ".Metallic = " + m_inputPorts[ 3 ].GeneratePortInstructions( ref dataCollector ) + ";" ); + dataCollector.AddLocalVariable( UniqueId, "s" + OutputId + ".Smoothness = " + m_inputPorts[ 4 ].GeneratePortInstructions( ref dataCollector ) + ";" ); + dataCollector.AddLocalVariable( UniqueId, "s" + OutputId + ".Occlusion = " + m_inputPorts[ 5 ].GeneratePortInstructions( ref dataCollector ) + ";\n" ); + + dataCollector.AddLocalVariable( UniqueId, "data.light = gi.light;\n", true ); + + dataCollector.AddLocalVariable( UniqueId, "UnityGI gi" + OutputId + " = gi;" ); + dataCollector.AddLocalVariable( UniqueId, "#ifdef UNITY_PASS_FORWARDBASE", true ); + + dataCollector.AddLocalVariable( UniqueId, "Unity_GlossyEnvironmentData g" + OutputId + " = UnityGlossyEnvironmentSetup( s" + OutputId + ".Smoothness, data.worldViewDir, s" + OutputId + ".Normal, float3(0,0,0));" ); + dataCollector.AddLocalVariable( UniqueId, "gi" + OutputId + " = UnityGlobalIllumination( data, s" + OutputId + ".Occlusion, s" + OutputId + ".Normal, g" + OutputId + " );" ); + dataCollector.AddLocalVariable( UniqueId, "#endif\n", true ); + dataCollector.AddLocalVariable( UniqueId, "float3 surfResult" + OutputId + " = LightingStandard" + specularMode + " ( s" + OutputId + ", viewDir, gi" + OutputId + " ).rgb;" ); + //Emission must be always added to trick Unity, so it knows what needs to be created p.e. world pos + dataCollector.AddLocalVariable( UniqueId, "surfResult" + OutputId + " += s" + OutputId + ".Emission;\n" ); + + m_outputPorts[ 0 ].SetLocalValue( "surfResult" + OutputId, dataCollector.PortCategory ); + + //Remove emission contribution from Forward Add + dataCollector.AddLocalVariable( UniqueId, "#ifdef UNITY_PASS_FORWARDADD//" + OutputId ); + dataCollector.AddLocalVariable( UniqueId, string.Format( "surfResult{0} -= s{0}.Emission;", OutputId )); + dataCollector.AddLocalVariable( UniqueId, "#endif//" + OutputId ); + + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + if( ContainerGraph.CurrentCanvasMode == NodeAvailability.TemplateShader || ( ContainerGraph.CurrentStandardSurface != null && ContainerGraph.CurrentStandardSurface.CurrentLightingModel != StandardShaderLightModel.CustomLighting ) ) + m_showErrorMessage = true; + else + m_showErrorMessage = false; + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() < 13204 ) + { + m_workflow = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ) ? ASEStandardSurfaceWorkflow.Specular : ASEStandardSurfaceWorkflow.Metallic; + } + else + { + m_workflow = (ASEStandardSurfaceWorkflow)Enum.Parse( typeof( ASEStandardSurfaceWorkflow ), GetCurrentParam( ref nodeParams ) ); + } + UpdateSpecularMetallicPorts(); + + if( UIUtils.CurrentShaderVersion() >= 14402 ) + { + m_normalSpace = (ViewSpace)Enum.Parse( typeof( ViewSpace ), GetCurrentParam( ref nodeParams ) ); + } + UpdatePort(); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_workflow ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_normalSpace ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/CustomStandardSurface.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/CustomStandardSurface.cs.meta new file mode 100644 index 0000000..172f37c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/CustomStandardSurface.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 78916999fd7bc3c4e9767bc9cf0698c0 +timeCreated: 1500054866 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/IndirectDiffuseLighting.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/IndirectDiffuseLighting.cs new file mode 100644 index 0000000..de40dc3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/IndirectDiffuseLighting.cs @@ -0,0 +1,367 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Indirect Diffuse Light", "Light", "Indirect Lighting", NodeAvailabilityFlags = (int)( NodeAvailability.CustomLighting | NodeAvailability.TemplateShader ) )] + public sealed class IndirectDiffuseLighting : ParentNode + { + [SerializeField] + private ViewSpace m_normalSpace = ViewSpace.Tangent; + + private int m_cachedIntensityId = -1; + + private const string FwdBasePragma = "#pragma multi_compile_fwdbase"; + + private readonly string LWIndirectDiffuseHeader = "ASEIndirectDiffuse( {0}, {1})"; + private readonly string[] LWIndirectDiffuseBody = + { + "float3 ASEIndirectDiffuse( float2 uvStaticLightmap, float3 normalWS )\n", + "{\n", + "#ifdef LIGHTMAP_ON\n", + "\treturn SampleLightmap( uvStaticLightmap, normalWS );\n", + "#else\n", + "\treturn SampleSH(normalWS);\n", + "#endif\n", + "}\n" + }; + + + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT3, false, "Normal" ); + AddOutputPort( WirePortDataType.FLOAT3, "RGB" ); + m_inputPorts[ 0 ].Vector3InternalData = Vector3.forward; + m_autoWrapProperties = true; + m_errorMessageTypeIsError = NodeMessageType.Warning; + m_errorMessageTooltip = "This node only returns correct information using a custom light model, otherwise returns 0"; + m_previewShaderGUID = "b45d57fa606c1ea438fe9a2c08426bc7"; + m_drawPreviewAsSphere = true; + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + if( m_inputPorts[ 0 ].IsConnected ) + { + if( m_normalSpace == ViewSpace.Tangent ) + m_previewMaterialPassId = 1; + else + m_previewMaterialPassId = 2; + } + else + { + m_previewMaterialPassId = 0; + } + + if( m_cachedIntensityId == -1 ) + m_cachedIntensityId = Shader.PropertyToID( "_Intensity" ); + + PreviewMaterial.SetFloat( m_cachedIntensityId, RenderSettings.ambientIntensity ); + } + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + base.PropagateNodeData( nodeData, ref dataCollector ); + // This needs to be rechecked + //if( m_inputPorts[ 0 ].IsConnected ) + dataCollector.DirtyNormal = true; + } + + public override void DrawProperties() + { + base.DrawProperties(); + + EditorGUI.BeginChangeCheck(); + m_normalSpace = (ViewSpace)EditorGUILayoutEnumPopup( "Normal Space", m_normalSpace ); + if( EditorGUI.EndChangeCheck() ) + { + UpdatePort(); + } + } + + private void UpdatePort() + { + if( m_normalSpace == ViewSpace.World ) + m_inputPorts[ 0 ].ChangeProperties( "World Normal", m_inputPorts[ 0 ].DataType, false ); + else + m_inputPorts[ 0 ].ChangeProperties( "Normal", m_inputPorts[ 0 ].DataType, false ); + + m_sizeIsDirty = true; + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + if( ( ContainerGraph.CurrentStandardSurface != null && ContainerGraph.CurrentStandardSurface.CurrentLightingModel != StandardShaderLightModel.CustomLighting ) ) + m_showErrorMessage = true; + else + m_showErrorMessage = false; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + string finalValue = string.Empty; + + if( dataCollector.IsTemplate && dataCollector.IsFragmentCategory ) + { + if( !dataCollector.IsSRP ) + { + dataCollector.AddToIncludes( UniqueId, Constants.UnityLightingLib ); + dataCollector.AddToDirectives( FwdBasePragma ); + string texcoord1 = string.Empty; + string texcoord2 = string.Empty; + + if( dataCollector.TemplateDataCollectorInstance.HasInfo( TemplateInfoOnSematics.TEXTURE_COORDINATES1, false, MasterNodePortCategory.Vertex ) ) + texcoord1 = dataCollector.TemplateDataCollectorInstance.GetInfo( TemplateInfoOnSematics.TEXTURE_COORDINATES1, false, MasterNodePortCategory.Vertex ).VarName; + else + texcoord1 = dataCollector.TemplateDataCollectorInstance.RegisterInfoOnSemantic( MasterNodePortCategory.Vertex, TemplateInfoOnSematics.TEXTURE_COORDINATES1, TemplateSemantics.TEXCOORD1, "texcoord1", WirePortDataType.FLOAT4, PrecisionType.Float, false ); + + if( dataCollector.TemplateDataCollectorInstance.HasInfo( TemplateInfoOnSematics.TEXTURE_COORDINATES2, false, MasterNodePortCategory.Vertex ) ) + texcoord2 = dataCollector.TemplateDataCollectorInstance.GetInfo( TemplateInfoOnSematics.TEXTURE_COORDINATES2, false, MasterNodePortCategory.Vertex ).VarName; + else + texcoord2 = dataCollector.TemplateDataCollectorInstance.RegisterInfoOnSemantic( MasterNodePortCategory.Vertex, TemplateInfoOnSematics.TEXTURE_COORDINATES2, TemplateSemantics.TEXCOORD2, "texcoord2", WirePortDataType.FLOAT4, PrecisionType.Float, false ); + + string vOutName = dataCollector.TemplateDataCollectorInstance.CurrentTemplateData.VertexFunctionData.OutVarName; + string fInName = dataCollector.TemplateDataCollectorInstance.CurrentTemplateData.FragmentFunctionData.InVarName; + TemplateVertexData data = dataCollector.TemplateDataCollectorInstance.RequestNewInterpolator( WirePortDataType.FLOAT4, false, "ase_lmap" ); + + string varName = "ase_lmap"; + if( data != null ) + varName = data.VarName; + + dataCollector.AddToVertexLocalVariables( UniqueId, "#ifdef DYNAMICLIGHTMAP_ON //dynlm" ); + dataCollector.AddToVertexLocalVariables( UniqueId, vOutName + "." + varName + ".zw = " + texcoord2 + ".xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;" ); + dataCollector.AddToVertexLocalVariables( UniqueId, "#endif //dynlm" ); + dataCollector.AddToVertexLocalVariables( UniqueId, "#ifdef LIGHTMAP_ON //stalm" ); + dataCollector.AddToVertexLocalVariables( UniqueId, vOutName + "." + varName + ".xy = " + texcoord1 + ".xy * unity_LightmapST.xy + unity_LightmapST.zw;" ); + dataCollector.AddToVertexLocalVariables( UniqueId, "#endif //stalm" ); + + TemplateVertexData shdata = dataCollector.TemplateDataCollectorInstance.RequestNewInterpolator( WirePortDataType.FLOAT3, false, "ase_sh" ); + string worldPos = dataCollector.TemplateDataCollectorInstance.GetWorldPos( false, MasterNodePortCategory.Vertex ); + string worldNormal = dataCollector.TemplateDataCollectorInstance.GetWorldNormal( PrecisionType.Float, false, MasterNodePortCategory.Vertex ); + //Debug.Log( shdata ); + string shVarName = "ase_sh"; + if( shdata != null ) + shVarName = shdata.VarName; + string outSH = vOutName + "." + shVarName + ".xyz"; + dataCollector.AddToVertexLocalVariables( UniqueId, "#ifndef LIGHTMAP_ON //nstalm" ); + dataCollector.AddToVertexLocalVariables( UniqueId, "#if UNITY_SHOULD_SAMPLE_SH //sh" ); + dataCollector.AddToVertexLocalVariables( UniqueId, outSH + " = 0;" ); + dataCollector.AddToVertexLocalVariables( UniqueId, "#ifdef VERTEXLIGHT_ON //vl" ); + dataCollector.AddToVertexLocalVariables( UniqueId, outSH + " += Shade4PointLights (" ); + dataCollector.AddToVertexLocalVariables( UniqueId, "unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0," ); + dataCollector.AddToVertexLocalVariables( UniqueId, "unity_LightColor[0].rgb, unity_LightColor[1].rgb, unity_LightColor[2].rgb, unity_LightColor[3].rgb," ); + dataCollector.AddToVertexLocalVariables( UniqueId, "unity_4LightAtten0, " + worldPos + ", " + worldNormal + ");" ); + dataCollector.AddToVertexLocalVariables( UniqueId, "#endif //vl" ); + dataCollector.AddToVertexLocalVariables( UniqueId, outSH + " = ShadeSHPerVertex (" + worldNormal + ", " + outSH + ");" ); + dataCollector.AddToVertexLocalVariables( UniqueId, "#endif //sh" ); + dataCollector.AddToVertexLocalVariables( UniqueId, "#endif //nstalm" ); + + //dataCollector.AddToPragmas( UniqueId, "multi_compile_fwdbase" ); + + string fragWorldNormal = string.Empty; + if( m_inputPorts[ 0 ].IsConnected ) + { + if( m_normalSpace == ViewSpace.Tangent ) + fragWorldNormal = dataCollector.TemplateDataCollectorInstance.GetWorldNormal( UniqueId, CurrentPrecisionType, m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ), OutputId ); + else + fragWorldNormal = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + } + else + { + fragWorldNormal = dataCollector.TemplateDataCollectorInstance.GetWorldNormal( PrecisionType.Float, false, MasterNodePortCategory.Fragment ); + } + + dataCollector.AddLocalVariable( UniqueId, "UnityGIInput data" + OutputId + ";" ); + dataCollector.AddLocalVariable( UniqueId, "UNITY_INITIALIZE_OUTPUT( UnityGIInput, data" + OutputId + " );" ); + + dataCollector.AddLocalVariable( UniqueId, "#if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) //dylm" + OutputId ); + dataCollector.AddLocalVariable( UniqueId, "data" + OutputId + ".lightmapUV = " + fInName + "." + varName + ";" ); + dataCollector.AddLocalVariable( UniqueId, "#endif //dylm" + OutputId ); + + dataCollector.AddLocalVariable( UniqueId, "#if UNITY_SHOULD_SAMPLE_SH //fsh" + OutputId ); + dataCollector.AddLocalVariable( UniqueId, "data" + OutputId + ".ambient = " + fInName + "." + shVarName + ";" ); + dataCollector.AddLocalVariable( UniqueId, "#endif //fsh" + OutputId ); + + dataCollector.AddToLocalVariables( UniqueId, "UnityGI gi" + OutputId + " = UnityGI_Base(data" + OutputId + ", 1, " + fragWorldNormal + ");" ); + + finalValue = "gi" + OutputId + ".indirect.diffuse"; + m_outputPorts[ 0 ].SetLocalValue( finalValue, dataCollector.PortCategory ); + return finalValue; + } + else + { + if( dataCollector.CurrentSRPType == TemplateSRPType.Lightweight ) + { + string texcoord1 = string.Empty; + + if( dataCollector.TemplateDataCollectorInstance.HasInfo( TemplateInfoOnSematics.TEXTURE_COORDINATES1, false, MasterNodePortCategory.Vertex ) ) + texcoord1 = dataCollector.TemplateDataCollectorInstance.GetInfo( TemplateInfoOnSematics.TEXTURE_COORDINATES1, false, MasterNodePortCategory.Vertex ).VarName; + else + texcoord1 = dataCollector.TemplateDataCollectorInstance.RegisterInfoOnSemantic( MasterNodePortCategory.Vertex, TemplateInfoOnSematics.TEXTURE_COORDINATES1, TemplateSemantics.TEXCOORD1, "texcoord1", WirePortDataType.FLOAT4, PrecisionType.Float, false ); + + string vOutName = dataCollector.TemplateDataCollectorInstance.CurrentTemplateData.VertexFunctionData.OutVarName; + string fInName = dataCollector.TemplateDataCollectorInstance.CurrentTemplateData.FragmentFunctionData.InVarName; + + + if( !dataCollector.TemplateDataCollectorInstance.HasRawInterpolatorOfName( "lightmapUVOrVertexSH" ) ) + { + string worldNormal = dataCollector.TemplateDataCollectorInstance.GetWorldNormal( PrecisionType.Float, false, MasterNodePortCategory.Vertex ); + dataCollector.TemplateDataCollectorInstance.RequestNewInterpolator( WirePortDataType.FLOAT4, false, "lightmapUVOrVertexSH" ); + + dataCollector.AddToVertexLocalVariables( UniqueId, "OUTPUT_LIGHTMAP_UV( " + texcoord1 + ", unity_LightmapST, " + vOutName + ".lightmapUVOrVertexSH.xy );" ); + dataCollector.AddToVertexLocalVariables( UniqueId, "OUTPUT_SH( " + worldNormal + ", " + vOutName + ".lightmapUVOrVertexSH.xyz );" ); + + dataCollector.AddToPragmas( UniqueId, "multi_compile _ DIRLIGHTMAP_COMBINED" ); + dataCollector.AddToPragmas( UniqueId, "multi_compile _ LIGHTMAP_ON" ); + } + + string fragWorldNormal = string.Empty; + if( m_inputPorts[ 0 ].IsConnected ) + { + if( m_normalSpace == ViewSpace.Tangent ) + fragWorldNormal = dataCollector.TemplateDataCollectorInstance.GetWorldNormal( UniqueId, CurrentPrecisionType, m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ), OutputId ); + else + fragWorldNormal = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + } + else + { + fragWorldNormal = dataCollector.TemplateDataCollectorInstance.GetWorldNormal( PrecisionType.Float, false, MasterNodePortCategory.Fragment ); + } + + //SAMPLE_GI + + //This function may not do full pixel and does not behave correctly with given normal thus is commented out + //dataCollector.AddLocalVariable( UniqueId, "float3 bakedGI" + OutputId + " = SAMPLE_GI( " + fInName + ".lightmapUVOrVertexSH.xy, " + fInName + ".lightmapUVOrVertexSH.xyz, " + fragWorldNormal + " );" ); + dataCollector.AddFunction( LWIndirectDiffuseBody[ 0 ], LWIndirectDiffuseBody, false ); + finalValue = "bakedGI" + OutputId; + string result = string.Format( LWIndirectDiffuseHeader, fInName + ".lightmapUVOrVertexSH.xy", fragWorldNormal ); + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT3, finalValue, result ); + + m_outputPorts[ 0 ].SetLocalValue( finalValue, dataCollector.PortCategory ); + return finalValue; + } + else if( dataCollector.CurrentSRPType == TemplateSRPType.HD ) + { + string texcoord1 = string.Empty; + string texcoord2 = string.Empty; + + if( dataCollector.TemplateDataCollectorInstance.HasInfo( TemplateInfoOnSematics.TEXTURE_COORDINATES1, false, MasterNodePortCategory.Vertex ) ) + texcoord1 = dataCollector.TemplateDataCollectorInstance.GetInfo( TemplateInfoOnSematics.TEXTURE_COORDINATES1, false, MasterNodePortCategory.Vertex ).VarName; + else + texcoord1 = dataCollector.TemplateDataCollectorInstance.RegisterInfoOnSemantic( MasterNodePortCategory.Vertex, TemplateInfoOnSematics.TEXTURE_COORDINATES1, TemplateSemantics.TEXCOORD1, "texcoord1", WirePortDataType.FLOAT4, PrecisionType.Float, false ); + + if( dataCollector.TemplateDataCollectorInstance.HasInfo( TemplateInfoOnSematics.TEXTURE_COORDINATES2, false, MasterNodePortCategory.Vertex ) ) + texcoord2 = dataCollector.TemplateDataCollectorInstance.GetInfo( TemplateInfoOnSematics.TEXTURE_COORDINATES2, false, MasterNodePortCategory.Vertex ).VarName; + else + texcoord2 = dataCollector.TemplateDataCollectorInstance.RegisterInfoOnSemantic( MasterNodePortCategory.Vertex, TemplateInfoOnSematics.TEXTURE_COORDINATES2, TemplateSemantics.TEXCOORD2, "texcoord2", WirePortDataType.FLOAT4, PrecisionType.Float, false ); + + dataCollector.TemplateDataCollectorInstance.RequestNewInterpolator( WirePortDataType.FLOAT4, false, "ase_lightmapUVs" ); + + string vOutName = dataCollector.TemplateDataCollectorInstance.CurrentTemplateData.VertexFunctionData.OutVarName; + string fInName = dataCollector.TemplateDataCollectorInstance.CurrentTemplateData.FragmentFunctionData.InVarName; + + dataCollector.AddToVertexLocalVariables( UniqueId, vOutName + ".ase_lightmapUVs.xy = " + texcoord1 + ".xy * unity_LightmapST.xy + unity_LightmapST.zw;" ); + dataCollector.AddToVertexLocalVariables( UniqueId, vOutName + ".ase_lightmapUVs.zw = " + texcoord2 + ".xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;" ); + + string worldPos = dataCollector.TemplateDataCollectorInstance.GetWorldPos( false, MasterNodePortCategory.Fragment ); + + dataCollector.AddToPragmas( UniqueId, "multi_compile _ LIGHTMAP_ON" ); + dataCollector.AddToPragmas( UniqueId, "multi_compile _ DIRLIGHTMAP_COMBINED" ); + dataCollector.AddToPragmas( UniqueId, "multi_compile _ DYNAMICLIGHTMAP_ON" ); + + string fragWorldNormal = string.Empty; + if( m_inputPorts[ 0 ].IsConnected ) + { + if( m_normalSpace == ViewSpace.Tangent ) + fragWorldNormal = dataCollector.TemplateDataCollectorInstance.GetWorldNormal( UniqueId, CurrentPrecisionType, m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ), OutputId ); + else + fragWorldNormal = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + } + else + { + fragWorldNormal = dataCollector.TemplateDataCollectorInstance.GetWorldNormal( PrecisionType.Float, false, MasterNodePortCategory.Fragment ); + } + + //SAMPLE_GI + dataCollector.AddLocalVariable( UniqueId, "float3 bakedGI" + OutputId + " = SampleBakedGI( " + worldPos + ", " + fragWorldNormal + ", " + fInName + ".ase_lightmapUVs.xy, " + fInName + ".ase_lightmapUVs.zw );" ); + finalValue = "bakedGI" + OutputId; + m_outputPorts[ 0 ].SetLocalValue( finalValue, dataCollector.PortCategory ); + return finalValue; + } + } + } + if( dataCollector.GenType == PortGenType.NonCustomLighting || dataCollector.CurrentCanvasMode != NodeAvailability.CustomLighting ) + return "float3(0,0,0)"; + + string normal = string.Empty; + if( m_inputPorts[ 0 ].IsConnected ) + { + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_NORMAL, CurrentPrecisionType ); + dataCollector.AddToInput( UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + dataCollector.ForceNormal = true; + + normal = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + if( m_normalSpace == ViewSpace.Tangent ) + normal = "WorldNormalVector( " + Constants.InputVarStr + " , " + normal + " )"; + } + else + { + if( dataCollector.IsFragmentCategory ) + { + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_NORMAL, CurrentPrecisionType ); + if( dataCollector.DirtyNormal ) + { + dataCollector.AddToInput( UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + dataCollector.ForceNormal = true; + } + } + + normal = GeneratorUtils.GenerateWorldNormal( ref dataCollector, UniqueId ); + } + + + if( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + { + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT3, "indirectDiffuse" + OutputId, "ShadeSH9( float4( " + normal + ", 1 ) )" ); + } + else + { + dataCollector.AddLocalVariable( UniqueId, "UnityGI gi" + OutputId + " = gi;" ); + dataCollector.AddLocalVariable( UniqueId, PrecisionType.Float, WirePortDataType.FLOAT3, "diffNorm" + OutputId, normal ); + dataCollector.AddLocalVariable( UniqueId, "gi" + OutputId + " = UnityGI_Base( data, 1, diffNorm" + OutputId + " );" ); + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT3, "indirectDiffuse" + OutputId, "gi" + OutputId + ".indirect.diffuse + diffNorm" + OutputId + " * 0.0001" ); + } + + finalValue = "indirectDiffuse" + OutputId; + m_outputPorts[ 0 ].SetLocalValue( finalValue, dataCollector.PortCategory ); + return finalValue; + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > 13002 ) + m_normalSpace = (ViewSpace)Enum.Parse( typeof( ViewSpace ), GetCurrentParam( ref nodeParams ) ); + + UpdatePort(); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_normalSpace ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/IndirectDiffuseLighting.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/IndirectDiffuseLighting.cs.meta new file mode 100644 index 0000000..2e9b5ba --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/IndirectDiffuseLighting.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 11bf17b0757d57c47add2eb50c62c75e +timeCreated: 1495726164 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/IndirectSpecularLight.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/IndirectSpecularLight.cs new file mode 100644 index 0000000..197e193 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/IndirectSpecularLight.cs @@ -0,0 +1,268 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Indirect Specular Light", "Light", "Indirect Specular Light", NodeAvailabilityFlags = (int)( NodeAvailability.CustomLighting | NodeAvailability.TemplateShader ) )] + public sealed class IndirectSpecularLight : ParentNode + { + [SerializeField] + private ViewSpace m_normalSpace = ViewSpace.Tangent; + + private const string DefaultErrorMessage = "This node only returns correct information using a custom light model, otherwise returns 0"; + private bool m_upgradeMessage = false; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT3, false, "Normal" ); + AddInputPort( WirePortDataType.FLOAT, false, "Smoothness" ); + AddInputPort( WirePortDataType.FLOAT, false, "Occlusion" ); + m_inputPorts[ 0 ].Vector3InternalData = Vector3.forward; + m_inputPorts[ 1 ].FloatInternalData = 0.5f; + m_inputPorts[ 2 ].FloatInternalData = 1; + m_inputPorts[ 1 ].AutoDrawInternalData = true; + m_inputPorts[ 2 ].AutoDrawInternalData = true; + m_autoWrapProperties = true; + AddOutputPort( WirePortDataType.FLOAT3, "RGB" ); + m_errorMessageTypeIsError = NodeMessageType.Warning; + m_errorMessageTooltip = DefaultErrorMessage; + m_previewShaderGUID = "d6e441d0a8608954c97fa347d3735e92"; + m_drawPreviewAsSphere = true; + } + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + base.PropagateNodeData( nodeData, ref dataCollector ); + if( m_inputPorts[ 0 ].IsConnected ) + dataCollector.DirtyNormal = true; + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + if( m_inputPorts[ 0 ].IsConnected ) + { + if( m_normalSpace == ViewSpace.Tangent ) + m_previewMaterialPassId = 1; + else + m_previewMaterialPassId = 2; + } + else + { + m_previewMaterialPassId = 0; + } + } + + public override void DrawProperties() + { + base.DrawProperties(); + + EditorGUI.BeginChangeCheck(); + m_normalSpace = (ViewSpace)EditorGUILayoutEnumPopup( "Normal Space", m_normalSpace ); + if( EditorGUI.EndChangeCheck() ) + { + UpdatePort(); + } + if( !m_inputPorts[ 1 ].IsConnected ) + m_inputPorts[ 1 ].FloatInternalData = EditorGUILayout.FloatField( m_inputPorts[ 1 ].Name, m_inputPorts[ 1 ].FloatInternalData ); + if( !m_inputPorts[ 2 ].IsConnected ) + m_inputPorts[ 2 ].FloatInternalData = EditorGUILayout.FloatField( m_inputPorts[ 2 ].Name, m_inputPorts[ 2 ].FloatInternalData ); + } + + private void UpdatePort() + { + if( m_normalSpace == ViewSpace.World ) + m_inputPorts[ 0 ].ChangeProperties( "World Normal", m_inputPorts[ 0 ].DataType, false ); + else + m_inputPorts[ 0 ].ChangeProperties( "Normal", m_inputPorts[ 0 ].DataType, false ); + + m_sizeIsDirty = true; + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + if( m_upgradeMessage || ( ContainerGraph.CurrentStandardSurface != null && ContainerGraph.CurrentStandardSurface.CurrentLightingModel != StandardShaderLightModel.CustomLighting ) ) + m_showErrorMessage = true; + else + m_showErrorMessage = false; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.IsTemplate ) + { + if( !dataCollector.IsSRP ) + { + dataCollector.AddToIncludes( UniqueId, Constants.UnityLightingLib ); + string worldPos = dataCollector.TemplateDataCollectorInstance.GetWorldPos(); + string worldViewDir = dataCollector.TemplateDataCollectorInstance.GetViewDir( false, MasterNodePortCategory.Fragment ); + + string worldNormal = string.Empty; + if( m_inputPorts[ 0 ].IsConnected ) + { + if( m_normalSpace == ViewSpace.Tangent ) + worldNormal = dataCollector.TemplateDataCollectorInstance.GetWorldNormal( UniqueId, CurrentPrecisionType, m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ), OutputId ); + else + worldNormal = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + } + else + { + worldNormal = dataCollector.TemplateDataCollectorInstance.GetWorldNormal( PrecisionType.Float, false, MasterNodePortCategory.Fragment ); + } + + string tempsmoothness = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + string tempocclusion = m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector ); + + dataCollector.AddLocalVariable( UniqueId, "UnityGIInput data;" ); + dataCollector.AddLocalVariable( UniqueId, "UNITY_INITIALIZE_OUTPUT( UnityGIInput, data );" ); + dataCollector.AddLocalVariable( UniqueId, "data.worldPos = " + worldPos + ";" ); + dataCollector.AddLocalVariable( UniqueId, "data.worldViewDir = " + worldViewDir + ";" ); + dataCollector.AddLocalVariable( UniqueId, "data.probeHDR[0] = unity_SpecCube0_HDR;" ); + dataCollector.AddLocalVariable( UniqueId, "data.probeHDR[1] = unity_SpecCube1_HDR;" ); + dataCollector.AddLocalVariable( UniqueId, "#if UNITY_SPECCUBE_BLENDING || UNITY_SPECCUBE_BOX_PROJECTION //specdataif0" ); + dataCollector.AddLocalVariable( UniqueId, "\tdata.boxMin[0] = unity_SpecCube0_BoxMin;" ); + dataCollector.AddLocalVariable( UniqueId, "#endif //specdataif0" ); + dataCollector.AddLocalVariable( UniqueId, "#if UNITY_SPECCUBE_BOX_PROJECTION //specdataif1" ); + dataCollector.AddLocalVariable( UniqueId, "\tdata.boxMax[0] = unity_SpecCube0_BoxMax;" ); + dataCollector.AddLocalVariable( UniqueId, "\tdata.probePosition[0] = unity_SpecCube0_ProbePosition;" ); + dataCollector.AddLocalVariable( UniqueId, "\tdata.boxMax[1] = unity_SpecCube1_BoxMax;" ); + dataCollector.AddLocalVariable( UniqueId, "\tdata.boxMin[1] = unity_SpecCube1_BoxMin;" ); + dataCollector.AddLocalVariable( UniqueId, "\tdata.probePosition[1] = unity_SpecCube1_ProbePosition;" ); + dataCollector.AddLocalVariable( UniqueId, "#endif //specdataif1" ); + + dataCollector.AddLocalVariable( UniqueId, "Unity_GlossyEnvironmentData g" + OutputId + " = UnityGlossyEnvironmentSetup( " + tempsmoothness + ", " + worldViewDir + ", " + worldNormal + ", float3(0,0,0));" ); + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT3, "indirectSpecular" + OutputId, "UnityGI_IndirectSpecular( data, " + tempocclusion + ", " + worldNormal + ", g" + OutputId + " )" ); + return "indirectSpecular" + OutputId; + } + else + { + if( dataCollector.CurrentSRPType == TemplateSRPType.Lightweight ) + { + string worldViewDir = dataCollector.TemplateDataCollectorInstance.GetViewDir( false, MasterNodePortCategory.Fragment ); + string worldNormal = string.Empty; + if( m_inputPorts[ 0 ].IsConnected ) + { + if( m_normalSpace == ViewSpace.Tangent ) + worldNormal = dataCollector.TemplateDataCollectorInstance.GetWorldNormal( UniqueId, CurrentPrecisionType, m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ), OutputId ); + else + worldNormal = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + } + else + { + worldNormal = dataCollector.TemplateDataCollectorInstance.GetWorldNormal( PrecisionType.Float, false, MasterNodePortCategory.Fragment ); + } + + string tempsmoothness = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + string tempocclusion = m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector ); + + dataCollector.AddLocalVariable( UniqueId, "half3 reflectVector" + OutputId + " = reflect( -" + worldViewDir + ", " + worldNormal + " );" ); + dataCollector.AddLocalVariable( UniqueId, "float3 indirectSpecular" + OutputId + " = GlossyEnvironmentReflection( reflectVector" + OutputId + ", 1.0 - " + tempsmoothness + ", " + tempocclusion + " );" ); + return "indirectSpecular" + OutputId; + } + else if( dataCollector.CurrentSRPType == TemplateSRPType.HD ) + { + UIUtils.ShowMessage( UniqueId, "Indirect Specular Light node currently not supported on HDRP" ); + return m_outputPorts[0].ErrorValue; + } + } + } + + if( dataCollector.GenType == PortGenType.NonCustomLighting || dataCollector.CurrentCanvasMode != NodeAvailability.CustomLighting ) + return m_outputPorts[0].ErrorValue; + + string normal = string.Empty; + if( m_inputPorts[ 0 ].IsConnected ) + { + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_NORMAL, CurrentPrecisionType ); + dataCollector.AddToInput( UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + dataCollector.ForceNormal = true; + + normal = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + if( m_normalSpace == ViewSpace.Tangent ) + normal = "WorldNormalVector( " + Constants.InputVarStr + " , " + normal + " )"; + + dataCollector.AddLocalVariable( UniqueId, "float3 indirectNormal" + OutputId + " = " + normal + ";" ); + normal = "indirectNormal" + OutputId; + } + else + { + if( dataCollector.IsFragmentCategory ) + { + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_NORMAL, CurrentPrecisionType ); + if( dataCollector.DirtyNormal ) + { + dataCollector.AddToInput( UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + dataCollector.ForceNormal = true; + } + } + + normal = GeneratorUtils.GenerateWorldNormal( ref dataCollector, UniqueId ); + } + + string smoothness = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + string occlusion = m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector ); + string viewDir = "data.worldViewDir"; + + if( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + { + string worldPos = GeneratorUtils.GenerateWorldPosition( ref dataCollector, UniqueId ); + viewDir = GeneratorUtils.GenerateViewDirection( ref dataCollector, UniqueId ); + + dataCollector.AddLocalVariable( UniqueId, "UnityGIInput data;" ); + dataCollector.AddLocalVariable( UniqueId, "UNITY_INITIALIZE_OUTPUT( UnityGIInput, data );" ); + dataCollector.AddLocalVariable( UniqueId, "data.worldPos = " + worldPos + ";" ); + dataCollector.AddLocalVariable( UniqueId, "data.worldViewDir = " + viewDir + ";" ); + dataCollector.AddLocalVariable( UniqueId, "data.probeHDR[0] = unity_SpecCube0_HDR;" ); + dataCollector.AddLocalVariable( UniqueId, "data.probeHDR[1] = unity_SpecCube1_HDR;" ); + dataCollector.AddLocalVariable( UniqueId, "#if UNITY_SPECCUBE_BLENDING || UNITY_SPECCUBE_BOX_PROJECTION //specdataif0" ); + dataCollector.AddLocalVariable( UniqueId, "data.boxMin[0] = unity_SpecCube0_BoxMin;" ); + dataCollector.AddLocalVariable( UniqueId, "#endif //specdataif0" ); + dataCollector.AddLocalVariable( UniqueId, "#if UNITY_SPECCUBE_BOX_PROJECTION //specdataif1" ); + dataCollector.AddLocalVariable( UniqueId, "data.boxMax[0] = unity_SpecCube0_BoxMax;" ); + dataCollector.AddLocalVariable( UniqueId, "data.probePosition[0] = unity_SpecCube0_ProbePosition;" ); + dataCollector.AddLocalVariable( UniqueId, "data.boxMax[1] = unity_SpecCube1_BoxMax;" ); + dataCollector.AddLocalVariable( UniqueId, "data.boxMin[1] = unity_SpecCube1_BoxMin;" ); + dataCollector.AddLocalVariable( UniqueId, "data.probePosition[1] = unity_SpecCube1_ProbePosition;" ); + dataCollector.AddLocalVariable( UniqueId, "#endif //specdataif1" ); + } + + dataCollector.AddLocalVariable( UniqueId, "Unity_GlossyEnvironmentData g" + OutputId + " = UnityGlossyEnvironmentSetup( " + smoothness + ", " + viewDir + ", " + normal + ", float3(0,0,0));" ); + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT3, "indirectSpecular" + OutputId, "UnityGI_IndirectSpecular( data, " + occlusion + ", " + normal + ", g" + OutputId + " )" ); + + return "indirectSpecular" + OutputId; + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > 13002 ) + m_normalSpace = (ViewSpace)Enum.Parse( typeof( ViewSpace ), GetCurrentParam( ref nodeParams ) ); + + if( UIUtils.CurrentShaderVersion() < 13804 ) + { + m_errorMessageTooltip = "Smoothness port was previously being used as Roughness, please check if you are correctly using it and save to confirm."; + m_upgradeMessage = true; + UIUtils.ShowMessage( UniqueId, "Indirect Specular Light node: Smoothness port was previously being used as Roughness, please check if you are correctly using it and save to confirm." ); + } + + UpdatePort(); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_normalSpace ); + + m_errorMessageTooltip = DefaultErrorMessage; + m_upgradeMessage = false; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/IndirectSpecularLight.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/IndirectSpecularLight.cs.meta new file mode 100644 index 0000000..0c0bb14 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/IndirectSpecularLight.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0820850e74009954188ff84e2f5cc4f2 +timeCreated: 1495817589 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/LightAttenuation.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/LightAttenuation.cs new file mode 100644 index 0000000..f42f73b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/LightAttenuation.cs @@ -0,0 +1,134 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +using UnityEditor; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Light Attenuation", "Light", "Contains light attenuation for all types of light", NodeAvailabilityFlags = (int)( NodeAvailability.CustomLighting | NodeAvailability.TemplateShader ) )] + public sealed class LightAttenuation : ParentNode + { + static readonly string SurfaceError = "This node only returns correct information using a custom light model, otherwise returns 1"; + static readonly string TemplateError = "This node will only produce proper attenuation if the template contains a shadow caster pass"; + + private const string ASEAttenVarName = "ase_lightAtten"; + + private readonly string[] LightweightPragmaMultiCompiles = + { + "multi_compile _ _MAIN_LIGHT_SHADOWS", + "multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE", + "multi_compile _ _SHADOWS_SOFT" + }; + + //private readonly string[] LightweightVertexInstructions = + //{ + // /*local vertex position*/"VertexPositionInputs ase_vertexInput = GetVertexPositionInputs ({0});", + // "#ifdef _MAIN_LIGHT_SHADOWS//ase_lightAtten_vert", + // /*available interpolator*/"{0} = GetShadowCoord( ase_vertexInput );", + // "#endif//ase_lightAtten_vert" + //}; + private const string LightweightLightAttenDecl = "float ase_lightAtten = 0;"; + private readonly string[] LightweightFragmentInstructions = + { + /*shadow coords*/"Light ase_lightAtten_mainLight = GetMainLight( {0} );", + "ase_lightAtten = ase_lightAtten_mainLight.distanceAttenuation * ase_lightAtten_mainLight.shadowAttenuation;" + }; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddOutputPort( WirePortDataType.FLOAT, "Out" ); + m_errorMessageTypeIsError = NodeMessageType.Warning; + m_errorMessageTooltip = SurfaceError; + m_previewShaderGUID = "4b12227498a5c8d46b6c44ea018e5b56"; + m_drawPreviewAsSphere = true; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.IsTemplate ) + { + if( !dataCollector.IsSRP ) + { + string result = string.Empty; + if( dataCollector.TemplateDataCollectorInstance.ContainsSpecialLocalFragVar( TemplateInfoOnSematics.SHADOWCOORDS, WirePortDataType.FLOAT4, ref result ) ) + { + return result; + } + + return dataCollector.TemplateDataCollectorInstance.GetLightAtten( UniqueId ); + } + else + { + if( dataCollector.CurrentSRPType == TemplateSRPType.Lightweight ) + { + if( dataCollector.HasLocalVariable( LightweightLightAttenDecl )) + return ASEAttenVarName; + + // Pragmas + for( int i = 0; i < LightweightPragmaMultiCompiles.Length; i++ ) + dataCollector.AddToPragmas( UniqueId, LightweightPragmaMultiCompiles[ i ] ); + + string shadowCoords = dataCollector.TemplateDataCollectorInstance.GetShadowCoords( UniqueId/*, false, dataCollector.PortCategory*/ ); + //return shadowCoords; + // Vertex Instructions + //TemplateVertexData shadowCoordsData = dataCollector.TemplateDataCollectorInstance.RequestNewInterpolator( WirePortDataType.FLOAT4, false ); + //string vertexInterpName = dataCollector.TemplateDataCollectorInstance.CurrentTemplateData.VertexFunctionData.OutVarName; + //string vertexShadowCoords = vertexInterpName + "." + shadowCoordsData.VarNameWithSwizzle; + //string vertexPos = dataCollector.TemplateDataCollectorInstance.GetVertexPosition( WirePortDataType.FLOAT3, PrecisionType.Float ,false,MasterNodePortCategory.Vertex ); + + //dataCollector.AddToVertexLocalVariables( UniqueId, string.Format( LightweightVertexInstructions[ 0 ], vertexPos )); + //dataCollector.AddToVertexLocalVariables( UniqueId, LightweightVertexInstructions[ 1 ]); + //dataCollector.AddToVertexLocalVariables( UniqueId, string.Format( LightweightVertexInstructions[ 2 ], vertexShadowCoords ) ); + //dataCollector.AddToVertexLocalVariables( UniqueId, LightweightVertexInstructions[ 3 ]); + + // Fragment Instructions + //string fragmentInterpName = dataCollector.TemplateDataCollectorInstance.CurrentTemplateData.FragmentFunctionData.InVarName; + //string fragmentShadowCoords = fragmentInterpName + "." + shadowCoordsData.VarNameWithSwizzle; + + dataCollector.AddLocalVariable( UniqueId, LightweightLightAttenDecl ); + dataCollector.AddLocalVariable( UniqueId, string.Format( LightweightFragmentInstructions[ 0 ], shadowCoords ) ); + dataCollector.AddLocalVariable( UniqueId, LightweightFragmentInstructions[ 1 ] ); + return ASEAttenVarName; + } + else + { + UIUtils.ShowMessage( UniqueId, "Light Attenuation node currently not supported on HDRP" ); + return "1"; + } + } + } + + if ( dataCollector.GenType == PortGenType.NonCustomLighting || dataCollector.CurrentCanvasMode != NodeAvailability.CustomLighting ) + { + UIUtils.ShowMessage( UniqueId, "Light Attenuation node currently not supported on non-custom lighting surface shaders" ); + return "1"; + } + + dataCollector.UsingLightAttenuation = true; + return ASEAttenVarName; + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + if( ContainerGraph.CurrentCanvasMode == NodeAvailability.TemplateShader && ContainerGraph.CurrentSRPType != TemplateSRPType.Lightweight ) + { + m_showErrorMessage = true; + m_errorMessageTypeIsError = NodeMessageType.Warning; + m_errorMessageTooltip = TemplateError; + } else + { + m_errorMessageTypeIsError = NodeMessageType.Error; + m_errorMessageTooltip = SurfaceError; + if ( ( ContainerGraph.CurrentStandardSurface != null && ContainerGraph.CurrentStandardSurface.CurrentLightingModel != StandardShaderLightModel.CustomLighting ) ) + m_showErrorMessage = true; + else + m_showErrorMessage = false; + } + + + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/LightAttenuation.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/LightAttenuation.cs.meta new file mode 100644 index 0000000..05a8aa7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/LightAttenuation.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4e205b44d56609f459ffc558febe2792 +timeCreated: 1495449979 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/LightColorNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/LightColorNode.cs new file mode 100644 index 0000000..9202108 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/LightColorNode.cs @@ -0,0 +1,88 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Light Color", "Light", "Light Color, RGB value already contains light intensity while A only contains light intensity" )] + public sealed class LightColorNode : ShaderVariablesNode + { + private const string m_lightColorValue = "_LightColor0"; + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, "RGBA", WirePortDataType.COLOR ); + AddOutputPort( WirePortDataType.FLOAT3, "Color" ); + AddOutputPort( WirePortDataType.FLOAT, "Intensity" ); + m_previewShaderGUID = "43f5d3c033eb5044e9aeb40241358349"; + } + + public override void RenderNodePreview() + { + //Runs at least one time + if( !m_initialized ) + { + // nodes with no preview don't update at all + PreviewIsDirty = false; + return; + } + + if( !PreviewIsDirty ) + return; + + int count = m_outputPorts.Count; + for( int i = 0; i < count; i++ ) + { + RenderTexture temp = RenderTexture.active; + RenderTexture.active = m_outputPorts[ i ].OutputPreviewTexture; + Graphics.Blit( null, m_outputPorts[ i ].OutputPreviewTexture, PreviewMaterial, i ); + RenderTexture.active = temp; + } + + PreviewIsDirty = m_continuousPreviewRefresh; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.IsTemplate && !dataCollector.IsSRP ) + dataCollector.AddToIncludes( -1, Constants.UnityLightingLib ); + + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + + string finalVar = m_lightColorValue; + if( dataCollector.IsTemplate && dataCollector.IsSRP ) + { + if( dataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.HD ) + { + dataCollector.TemplateDataCollectorInstance.AddHDLightInfo(); + finalVar = string.Format( TemplateHelperFunctions.HDLightInfoFormat, "0", "color" ); ; + } + else + { + finalVar = "_MainLightColor"; + } + } + else + { + dataCollector.AddLocalVariable( UniqueId, "#if defined(LIGHTMAP_ON) && ( UNITY_VERSION < 560 || ( defined(LIGHTMAP_SHADOW_MIXING) && !defined(SHADOWS_SHADOWMASK) && defined(SHADOWS_SCREEN) ) )//aselc" ); + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT4, "ase_lightColor", "0" ); + dataCollector.AddLocalVariable( UniqueId, "#else //aselc" ); + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT4, "ase_lightColor", finalVar ); + dataCollector.AddLocalVariable( UniqueId, "#endif //aselc" ); + finalVar = "ase_lightColor"; + } + //else if( ContainerGraph.CurrentStandardSurface.CurrentLightingModel == StandardShaderLightModel.CustomLighting ) + // finalVar = "gi.light.color"; + + switch( outputId ) + { + default: + case 0: return finalVar; + case 1: return finalVar + ".rgb"; + case 2: return finalVar + ".a"; + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/LightColorNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/LightColorNode.cs.meta new file mode 100644 index 0000000..9acf2a1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/LightColorNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 275270020c577924caf04492f73b2ea6 +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/WorldSpaceLightPos.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/WorldSpaceLightPos.cs new file mode 100644 index 0000000..80aae5d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/WorldSpaceLightPos.cs @@ -0,0 +1,92 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEditor; +using UnityEngine; +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "World Space Light Pos", "Light", "Light Position" )] + public sealed class WorldSpaceLightPos : ShaderVariablesNode + { + private const string HelperText = + "This node will behave differently according to light type." + + "\n\n- For directional lights the Dir/Pos output will specify a world space direction and Type will be set to 0." + + "\n\n- For other light types the Dir/Pos output will specify a world space position and Type will be set to 1."; + private const string m_lightPosValue = "_WorldSpaceLightPos0"; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, Constants.EmptyPortValue, WirePortDataType.FLOAT4 ); + AddOutputPort( WirePortDataType.FLOAT3, "Dir/Pos" ); + AddOutputPort( WirePortDataType.FLOAT, "Type" ); + m_previewShaderGUID = "2292a614672283c41a367b22cdde4620"; + m_drawPreviewAsSphere = true; + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUILayout.HelpBox( HelperText, MessageType.Info ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalVar ); + string finalVar = m_lightPosValue; + if( dataCollector.IsTemplate && dataCollector.TemplateDataCollectorInstance.IsSRP ) + finalVar = "_MainLightPosition"; + if( outputId == 1 ) + { + return finalVar + ".xyz"; + } + else if( outputId == 2 ) + { + return finalVar + ".w"; + } + else + { + return finalVar; + } + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + if( !m_outputPorts[ 0 ].IsConnected ) + { + m_outputPorts[ 0 ].Visible = false; + m_sizeIsDirty = true; + } + } + + public override void RenderNodePreview() + { + //Runs at least one time + if( !m_initialized ) + { + // nodes with no preview don't update at all + PreviewIsDirty = false; + return; + } + + if( !PreviewIsDirty ) + return; + + SetPreviewInputs(); + + RenderTexture temp = RenderTexture.active; + + RenderTexture.active = m_outputPorts[ 0 ].OutputPreviewTexture; + Graphics.Blit( null, m_outputPorts[ 0 ].OutputPreviewTexture, PreviewMaterial, 0 ); + Graphics.Blit( m_outputPorts[ 0 ].OutputPreviewTexture, m_outputPorts[ 1 ].OutputPreviewTexture ); + + RenderTexture.active = m_outputPorts[ 2 ].OutputPreviewTexture; + Graphics.Blit( null, m_outputPorts[ 2 ].OutputPreviewTexture, PreviewMaterial, 1 ); + RenderTexture.active = temp; + + PreviewIsDirty = m_continuousPreviewRefresh; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/WorldSpaceLightPos.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/WorldSpaceLightPos.cs.meta new file mode 100644 index 0000000..79f4fc5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Lighting/WorldSpaceLightPos.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: db94d973647dae9488d3ef5ee2fd95a4 +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/ShaderVariablesNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/ShaderVariablesNode.cs new file mode 100644 index 0000000..499999f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/ShaderVariablesNode.cs @@ -0,0 +1,27 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class ShaderVariablesNode : ParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddOutputPort( WirePortDataType.OBJECT, "Out" ); + } + public override string GetIncludes() + { + return Constants.UnityShaderVariables; + } + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( !( dataCollector.IsTemplate && dataCollector.TemplateDataCollectorInstance.IsSRP ) ) + dataCollector.AddToIncludes( UniqueId, Constants.UnityShaderVariables ); + return string.Empty; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/ShaderVariablesNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/ShaderVariablesNode.cs.meta new file mode 100644 index 0000000..dce292d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/ShaderVariablesNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1eb723e6ceff9a345a9dbfe04aa3dc11 +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time.meta new file mode 100644 index 0000000..bfd7fd9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 7c77e88b33fec7c429412624a7b2c620 +folderAsset: yes +timeCreated: 1481126947 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/CosTime.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/CosTime.cs new file mode 100644 index 0000000..096676f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/CosTime.cs @@ -0,0 +1,55 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Cos Time", "Time", "Cosine of time" )] + public sealed class CosTime : ConstVecShaderVariable + { +#if UNITY_2018_3_OR_NEWER + private readonly string[] SRPTime = + { + "cos( _TimeParameters.x * 0.125 )", + "cos( _TimeParameters.x * 0.25 )", + "cos( _TimeParameters.x * 0.5 )", + "_TimeParameters.z", + }; +#endif + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputName( 1, "t/8" ); + ChangeOutputName( 2, "t/4" ); + ChangeOutputName( 3, "t/2" ); + ChangeOutputName( 4, "t" ); + m_value = "_CosTime"; + m_previewShaderGUID = "3093999b42c3c0940a71799511d7781c"; + m_continuousPreviewRefresh = true; + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + if( !m_outputPorts[ 0 ].IsConnected ) + { + m_outputPorts[ 0 ].Visible = false; + m_sizeIsDirty = true; + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { +#if UNITY_2018_3_OR_NEWER + if( outputId > 0 && dataCollector.IsTemplate ) + { + if( ( dataCollector.TemplateDataCollectorInstance.IsHDRP && ASEPackageManagerHelper.CurrentHDVersion > ASESRPVersions.ASE_SRP_5_16_1 ) || + ( dataCollector.TemplateDataCollectorInstance.IsLWRP && ASEPackageManagerHelper.CurrentLWVersion > ASESRPVersions.ASE_SRP_5_16_1 ) ) + return SRPTime[ outputId - 1 ]; + } +#endif + return base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/CosTime.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/CosTime.cs.meta new file mode 100644 index 0000000..80373c1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/CosTime.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 447e504f2ca5aaf4bbf0fdbce33596bc +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/DeltaTime.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/DeltaTime.cs new file mode 100644 index 0000000..a1f3380 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/DeltaTime.cs @@ -0,0 +1,33 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Delta Time", "Time", "Delta time" )] + public sealed class DeltaTime : ConstVecShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputName( 1, "dt" ); + ChangeOutputName( 2, "1/dt" ); + ChangeOutputName( 3, "smoothDt" ); + ChangeOutputName( 4, "1/smoothDt" ); + m_value = "unity_DeltaTime"; + m_previewShaderGUID = "9d69a693042c443498f96d6da60535eb"; + m_continuousPreviewRefresh = true; + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + if( !m_outputPorts[ 0 ].IsConnected ) + { + m_outputPorts[ 0 ].Visible = false; + m_sizeIsDirty = true; + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/DeltaTime.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/DeltaTime.cs.meta new file mode 100644 index 0000000..400f94f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/DeltaTime.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3ddde7ed1ab4f8044a9a6aa3891f5ca4 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/SimpleTimeNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/SimpleTimeNode.cs new file mode 100644 index 0000000..8445f90 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/SimpleTimeNode.cs @@ -0,0 +1,48 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Time", "Time", "Time in seconds with a scale multiplier" )] + public sealed class SimpleTimeNode : ShaderVariablesNode + { + private const string TimeStandard = "_Time.y"; +#if UNITY_2018_3_OR_NEWER + private const string TimeSRP = "_TimeParameters.x"; +#endif + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, "Out", WirePortDataType.FLOAT ); + AddInputPort( WirePortDataType.FLOAT, false, "Scale" ); + m_inputPorts[ 0 ].FloatInternalData = 1; + m_useInternalPortData = true; + m_previewShaderGUID = "45b7107d5d11f124fad92bcb1fa53661"; + m_continuousPreviewRefresh = true; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + string multiplier = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string timeGlobalVar = TimeStandard; +#if UNITY_2018_3_OR_NEWER + if( dataCollector.IsTemplate ) + { + if( ( dataCollector.TemplateDataCollectorInstance.IsHDRP && ASEPackageManagerHelper.CurrentHDVersion > ASESRPVersions.ASE_SRP_5_16_1 ) || + ( dataCollector.TemplateDataCollectorInstance.IsLWRP && ASEPackageManagerHelper.CurrentLWVersion > ASESRPVersions.ASE_SRP_5_16_1 ) ) + timeGlobalVar = TimeSRP; + } +#endif + if( multiplier == "1.0" ) + return timeGlobalVar; + + string scaledVarName = "mulTime" + OutputId; + string scaledVarValue = timeGlobalVar + " * " + multiplier; + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT, scaledVarName, scaledVarValue ); + return scaledVarName; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/SimpleTimeNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/SimpleTimeNode.cs.meta new file mode 100644 index 0000000..313b931 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/SimpleTimeNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f36e4491ee33fe74fa51cfb5ad450c6e +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/SinTimeNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/SinTimeNode.cs new file mode 100644 index 0000000..aac2b1e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/SinTimeNode.cs @@ -0,0 +1,58 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEditor; +using UnityEngine; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Sin Time", "Time", "Unity sin time" )] + public sealed class SinTimeNode : ConstVecShaderVariable + { + //double m_time; +#if UNITY_2018_3_OR_NEWER + private readonly string[] SRPTime = + { + "sin( _TimeParameters.x * 0.125 )", + "sin( _TimeParameters.x * 0.25 )", + "sin( _TimeParameters.x * 0.5 )", + "_TimeParameters.y", + }; +#endif + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputName( 1, "t/8" ); + ChangeOutputName( 2, "t/4" ); + ChangeOutputName( 3, "t/2" ); + ChangeOutputName( 4, "t" ); + m_value = "_SinTime"; + m_previewShaderGUID = "e4ba809e0badeb94994170b2cbbbba10"; + m_continuousPreviewRefresh = true; + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + if( !m_outputPorts[ 0 ].IsConnected ) + { + m_outputPorts[ 0 ].Visible = false; + m_sizeIsDirty = true; + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { +#if UNITY_2018_3_OR_NEWER + if( outputId > 0 && dataCollector.IsTemplate ) + { + if( ( dataCollector.TemplateDataCollectorInstance.IsHDRP && ASEPackageManagerHelper.CurrentHDVersion > ASESRPVersions.ASE_SRP_5_16_1 ) || + ( dataCollector.TemplateDataCollectorInstance.IsLWRP && ASEPackageManagerHelper.CurrentLWVersion > ASESRPVersions.ASE_SRP_5_16_1 ) ) + return SRPTime[ outputId - 1 ]; + } +#endif + return base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/SinTimeNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/SinTimeNode.cs.meta new file mode 100644 index 0000000..876a774 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/SinTimeNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 796acd44fcf330e4e921855630007b9b +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/TimeNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/TimeNode.cs new file mode 100644 index 0000000..258d517 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/TimeNode.cs @@ -0,0 +1,55 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Time Parameters", "Time", "Time since level load" )] + public sealed class TimeNode : ConstVecShaderVariable + { +#if UNITY_2018_3_OR_NEWER + private readonly string[] SRPTime = + { + "( _TimeParameters.x * 0.05 )", + "( _TimeParameters.x )", + "( _TimeParameters.x * 2 )", + "( _TimeParameters.x * 3 )", + }; +#endif + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputName( 1, "t/20" ); + ChangeOutputName( 2, "t" ); + ChangeOutputName( 3, "t*2" ); + ChangeOutputName( 4, "t*3" ); + m_value = "_Time"; + m_previewShaderGUID = "73abc10c8d1399444827a7eeb9c24c2a"; + m_continuousPreviewRefresh = true; + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + if( !m_outputPorts[ 0 ].IsConnected ) + { + m_outputPorts[ 0 ].Visible = false; + m_sizeIsDirty = true; + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { +#if UNITY_2018_3_OR_NEWER + if( outputId > 0 && dataCollector.IsTemplate ) + { + if( ( dataCollector.TemplateDataCollectorInstance.IsHDRP && ASEPackageManagerHelper.CurrentHDVersion > ASESRPVersions.ASE_SRP_5_16_1 ) || + ( dataCollector.TemplateDataCollectorInstance.IsLWRP && ASEPackageManagerHelper.CurrentLWVersion > ASESRPVersions.ASE_SRP_5_16_1 )) + return SRPTime[ outputId - 1 ]; + } +#endif + return base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/TimeNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/TimeNode.cs.meta new file mode 100644 index 0000000..521dcf4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Time/TimeNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d8c6b7bfb7784e14d8708ab6fb981268 +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform.meta new file mode 100644 index 0000000..008be40 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2ce97203c4871664493f8760d88d0d4d +folderAsset: yes +timeCreated: 1481126946 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/CameraToWorldMatrix.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/CameraToWorldMatrix.cs new file mode 100644 index 0000000..1238566 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/CameraToWorldMatrix.cs @@ -0,0 +1,24 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Camera To World Matrix", "Matrix Transform", "Current camera to world matrix" )] + public sealed class CameraToWorldMatrix : ConstantShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, "Out", WirePortDataType.FLOAT4x4 ); + m_value = "unity_CameraToWorld"; + m_drawPreview = false; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + GeneratorUtils.RegisterUnity2019MatrixDefines( ref dataCollector ); + return base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/CameraToWorldMatrix.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/CameraToWorldMatrix.cs.meta new file mode 100644 index 0000000..2e13b7e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/CameraToWorldMatrix.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6accfe0f350cf064dae07041fe90446b +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/InverseProjectionMatrixNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/InverseProjectionMatrixNode.cs new file mode 100644 index 0000000..0b53040 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/InverseProjectionMatrixNode.cs @@ -0,0 +1,46 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Inverse Projection Matrix", "Matrix Transform", "Current inverse projection matrix", NodeAvailabilityFlags = (int)( NodeAvailability.TemplateShader ) )] + public sealed class InverseProjectionMatrixNode : ConstantShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, "Out", WirePortDataType.FLOAT4x4 ); + m_value = "UNITY_MATRIX_I_P"; + m_drawPreview = false; + m_matrixId = 1; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.IsTemplate && dataCollector.IsSRP ) + { + return base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + } + else + { + return GeneratorUtils.GenerateIdentity4x4( ref dataCollector, UniqueId ); + } + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + if( ContainerGraph.IsSRP ) + { + m_showErrorMessage = false; + } + else + { + m_showErrorMessage = true; + m_errorMessageTypeIsError = NodeMessageType.Warning; + m_errorMessageTooltip = "This node only works for Scriptable Render Pipeline (LWRP, HDRP, URP)"; + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/InverseProjectionMatrixNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/InverseProjectionMatrixNode.cs.meta new file mode 100644 index 0000000..302ccf2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/InverseProjectionMatrixNode.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0fdbc380972c44b489c5f948a40b8e69 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/InverseTranspMVMatrixNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/InverseTranspMVMatrixNode.cs new file mode 100644 index 0000000..e4071ba --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/InverseTranspMVMatrixNode.cs @@ -0,0 +1,18 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Inverse Transpose Model View Matrix", "Matrix Transform", "All Transformation types" )] + public sealed class InverseTranspMVMatrixNode : ConstantShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, "Out", WirePortDataType.FLOAT4x4 ); + m_value = "UNITY_MATRIX_IT_MV"; + m_drawPreview = false; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/InverseTranspMVMatrixNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/InverseTranspMVMatrixNode.cs.meta new file mode 100644 index 0000000..1b3b8fd --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/InverseTranspMVMatrixNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3a71f1e560487aa4c8484c4153941884 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/InverseViewMatrixNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/InverseViewMatrixNode.cs new file mode 100644 index 0000000..c21aa19 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/InverseViewMatrixNode.cs @@ -0,0 +1,19 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Inverse View Matrix", "Matrix Transform", "Current inverse view matrix" )] + public sealed class InverseViewMatrixNode : ConstantShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, "Out", WirePortDataType.FLOAT4x4 ); + m_value = "UNITY_MATRIX_I_V"; + m_drawPreview = false; + m_matrixId = 0; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/InverseViewMatrixNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/InverseViewMatrixNode.cs.meta new file mode 100644 index 0000000..61b2324 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/InverseViewMatrixNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: dd0c1c252c062184e9ad592b91e7fcd2 +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/InverseViewProjectionMatrixNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/InverseViewProjectionMatrixNode.cs new file mode 100644 index 0000000..d812cc2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/InverseViewProjectionMatrixNode.cs @@ -0,0 +1,46 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Inverse View Projection Matrix", "Matrix Transform", "Current view inverse projection matrix", NodeAvailabilityFlags = (int)( NodeAvailability.TemplateShader ) )] + public sealed class InverseViewProjectionMatrixNode : ConstantShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, "Out", WirePortDataType.FLOAT4x4 ); + m_value = "UNITY_MATRIX_I_VP"; + m_drawPreview = false; + m_matrixId = 1; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.IsTemplate && dataCollector.IsSRP ) + { + return base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + } + else + { + return GeneratorUtils.GenerateIdentity4x4( ref dataCollector, UniqueId ); + } + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + if( ContainerGraph.IsSRP ) + { + m_showErrorMessage = false; + } + else + { + m_showErrorMessage = true; + m_errorMessageTypeIsError = NodeMessageType.Warning; + m_errorMessageTooltip = "This node only works for Scriptable Render Pipeline (LWRP, HDRP, URP)"; + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/InverseViewProjectionMatrixNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/InverseViewProjectionMatrixNode.cs.meta new file mode 100644 index 0000000..6b22161 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/InverseViewProjectionMatrixNode.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f6f151774e252dd4fb2b9ee440ec8eed +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/MMatrixNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/MMatrixNode.cs new file mode 100644 index 0000000..ed90339 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/MMatrixNode.cs @@ -0,0 +1,18 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Model Matrix", "Matrix Transform", "Current model matrix" )] + public sealed class MMatrixNode : ConstantShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, "Out", WirePortDataType.FLOAT4x4 ); + m_value = "UNITY_MATRIX_M"; + m_drawPreview = false; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/MMatrixNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/MMatrixNode.cs.meta new file mode 100644 index 0000000..51c6d1f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/MMatrixNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 503a386043991354eaca2410683d836a +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/MVMatrixNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/MVMatrixNode.cs new file mode 100644 index 0000000..a99d851 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/MVMatrixNode.cs @@ -0,0 +1,18 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Model View Matrix", "Matrix Transform", "Current model * view matrix" )] + public sealed class MVMatrixNode : ConstantShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, "Out", WirePortDataType.FLOAT4x4 ); + m_value = "UNITY_MATRIX_MV"; + m_drawPreview = false; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/MVMatrixNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/MVMatrixNode.cs.meta new file mode 100644 index 0000000..6c0355e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/MVMatrixNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 30c7936db4e6fe5488076d799841f857 +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/MVPMatrixNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/MVPMatrixNode.cs new file mode 100644 index 0000000..324a153 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/MVPMatrixNode.cs @@ -0,0 +1,18 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Model View Projection Matrix", "Matrix Transform", "Current model * view * projection matrix" )] + public sealed class MVPMatrixNode : ConstantShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, "Out", WirePortDataType.FLOAT4x4 ); + m_value = "UNITY_MATRIX_MVP"; + m_drawPreview = false; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/MVPMatrixNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/MVPMatrixNode.cs.meta new file mode 100644 index 0000000..8275def --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/MVPMatrixNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 74e00fb3d8e161f498c078795184bae4 +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/ObjectToWorldMatrixNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/ObjectToWorldMatrixNode.cs new file mode 100644 index 0000000..2f5873b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/ObjectToWorldMatrixNode.cs @@ -0,0 +1,19 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Object To World Matrix", "Matrix Transform", "Current model matrix" )] + public sealed class ObjectToWorldMatrixNode : ConstantShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, "Out", WirePortDataType.FLOAT4x4 ); + m_value = "unity_ObjectToWorld"; + m_HDValue = "GetObjectToWorldMatrix()"; + m_LWValue = "GetObjectToWorldMatrix()"; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/ObjectToWorldMatrixNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/ObjectToWorldMatrixNode.cs.meta new file mode 100644 index 0000000..7d008d9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/ObjectToWorldMatrixNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a0c0180a327eba54c832fbb695dd282f +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/ProjectionMatrixNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/ProjectionMatrixNode.cs new file mode 100644 index 0000000..a80058d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/ProjectionMatrixNode.cs @@ -0,0 +1,19 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Projection Matrix", "Matrix Transform", "Current projection matrix" )] + public sealed class ProjectionMatrixNode : ConstantShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, "Out", WirePortDataType.FLOAT4x4 ); + m_value = "UNITY_MATRIX_P"; + m_drawPreview = false; + m_matrixId = 1; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/ProjectionMatrixNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/ProjectionMatrixNode.cs.meta new file mode 100644 index 0000000..5f2d19b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/ProjectionMatrixNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 008fd07cf3f9a7140a9e23be43733f7c +timeCreated: 1481126953 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/Texture0MatrixNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/Texture0MatrixNode.cs new file mode 100644 index 0000000..4f56872 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/Texture0MatrixNode.cs @@ -0,0 +1,18 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Texture 0 Matrix", "Matrix Transform", "Texture 0 Matrix", null, UnityEngine.KeyCode.None, true, true )] + public sealed class Texture0MatrixNode : ConstantShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, "Out", WirePortDataType.FLOAT4x4 ); + m_value = "UNITY_MATRIX_TEXTURE0"; + m_drawPreview = false; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/Texture0MatrixNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/Texture0MatrixNode.cs.meta new file mode 100644 index 0000000..fbdf611 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/Texture0MatrixNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f57a1d05f7a9c5847912566ff1605c6d +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/Texture1MatrixNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/Texture1MatrixNode.cs new file mode 100644 index 0000000..a9debbe --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/Texture1MatrixNode.cs @@ -0,0 +1,18 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Texture 1 Matrix", "Matrix Transform", "Texture 1 Matrix", null, UnityEngine.KeyCode.None, true, true )] + public sealed class Texture1MatrixNode : ConstantShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, "Out", WirePortDataType.FLOAT4x4 ); + m_value = "UNITY_MATRIX_TEXTURE1"; + m_drawPreview = false; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/Texture1MatrixNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/Texture1MatrixNode.cs.meta new file mode 100644 index 0000000..429b108 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/Texture1MatrixNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9ef360a7c6005ad479d7a3e6db1d32f4 +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/Texture2MatrixNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/Texture2MatrixNode.cs new file mode 100644 index 0000000..c0938e7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/Texture2MatrixNode.cs @@ -0,0 +1,18 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Texture 2 Matrix", "Matrix Transform", "Texture 2 Matrix", null, UnityEngine.KeyCode.None, true, true )] + public sealed class Texture2MatrixNode : ConstantShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, "Out", WirePortDataType.FLOAT4x4 ); + m_value = "UNITY_MATRIX_TEXTURE2"; + m_drawPreview = false; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/Texture2MatrixNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/Texture2MatrixNode.cs.meta new file mode 100644 index 0000000..dc1e008 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/Texture2MatrixNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6cf4950dda0f6e6438ace404fbef19a7 +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/Texture3MatrixNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/Texture3MatrixNode.cs new file mode 100644 index 0000000..8b5f86a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/Texture3MatrixNode.cs @@ -0,0 +1,18 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Texture 3 Matrix", "Matrix Transform", "Texture 3 Matrix", null, UnityEngine.KeyCode.None, true, true )] + public sealed class Texture3MatrixNode : ConstantShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, "Out", WirePortDataType.FLOAT4x4 ); + m_value = "UNITY_MATRIX_TEXTURE3"; + m_drawPreview = false; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/Texture3MatrixNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/Texture3MatrixNode.cs.meta new file mode 100644 index 0000000..00df6e3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/Texture3MatrixNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 02a9fb7a3a104974e941f4109567b97f +timeCreated: 1481126953 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/TransformDirectionNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/TransformDirectionNode.cs new file mode 100644 index 0000000..743760d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/TransformDirectionNode.cs @@ -0,0 +1,579 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + public enum InverseTangentType + { + Fast, + Precise + } + + [Serializable] + [NodeAttributes( "Transform Direction", "Vector Operators", "Transforms a direction vector from one space to another" )] + public sealed class TransformDirectionNode : ParentNode + { + + [SerializeField] + private TransformSpaceFrom m_from = TransformSpaceFrom.Object; + + [SerializeField] + private TransformSpaceTo m_to = TransformSpaceTo.World; + + [SerializeField] + private bool m_normalize = false; + + [SerializeField] + private bool m_safeNormalize = false; + + [SerializeField] + private InverseTangentType m_inverseTangentType = InverseTangentType.Fast; + + private string InverseTBNStr = "Inverse TBN"; + + private const string NormalizeOptionStr = "Normalize"; + private const string SafeNormalizeOptionStr = "Safe"; + + private const string AseObjectToWorldDirVarName = "objToWorldDir"; + private const string AseObjectToWorldDirFormat = "mul( unity_ObjectToWorld, float4( {0}, 0 ) ).xyz"; + private const string AseSRPObjectToWorldDirFormat = "mul( GetObjectToWorldMatrix(), float4( {0}, 0 ) ).xyz"; + + private const string AseObjectToViewDirVarName = "objToViewDir"; + private const string AseObjectToViewDirFormat = "mul( UNITY_MATRIX_IT_MV, float4( {0}, 0 ) ).xyz"; + private const string AseHDObjectToViewDirFormat = "TransformWorldToViewDir( TransformObjectToWorldDir( {0} ))"; + + private const string AseWorldToObjectDirVarName = "worldToObjDir"; + private const string AseWorldToObjectDirFormat = "mul( unity_WorldToObject, float4( {0}, 0 ) ).xyz"; + private const string AseSRPWorldToObjectDirFormat = "mul( GetWorldToObjectMatrix(), float4( {0}, 0 ) ).xyz"; + + + private const string AseWorldToViewDirVarName = "worldToViewDir"; + private const string AseWorldToViewDirFormat = "mul( UNITY_MATRIX_V, float4( {0}, 0 ) ).xyz"; + + private const string AseViewToObjectDirVarName = "viewToObjDir"; + private const string AseViewToObjectDirFormat = "mul( UNITY_MATRIX_T_MV, float4( {0}, 0 ) ).xyz"; + + private const string AseViewToWorldDirVarName = "viewToWorldDir"; + private const string AseViewToWorldDirFormat = "mul( UNITY_MATRIX_I_V, float4( {0}, 0 ) ).xyz"; + + /////////////////////////////////////////////////////////// + private const string AseObjectToClipDirVarName = "objectToClipDir"; + private const string AseObjectToClipDirFormat = "mul(UNITY_MATRIX_VP, mul(unity_ObjectToWorld, float4({0}, 0.0)))"; + private const string AseSRPObjectToClipDirFormat = "TransformWorldToHClipDir(TransformObjectToWorldDir({0}))"; + + private const string AseWorldToClipDirVarName = "worldToClipDir"; + private const string AseWorldToClipDirFormat = "mul(UNITY_MATRIX_VP, float4({0}, 0.0))"; + private const string AseSRPWorldToClipDirFormat = "TransformWorldToHClipDir({0})"; + + private const string AseViewToClipDirVarName = "viewToClipDir"; + private const string AseViewToClipDirFormat = "mul(UNITY_MATRIX_P, float4({0}, 0.0))"; + private const string AseSRPViewToClipDirFormat = "mul(GetViewToHClipMatrix(), float4({0}, 1.0))"; + // + private const string AseClipToObjectDirVarName = "clipToObjectDir"; + + private const string AseClipToObjectDirFormat = "mul( UNITY_MATRIX_IT_MV, mul( unity_CameraInvProjection,float4({0},0)) ).xyz"; + private const string AseClipToWorldDirFormat = "mul( UNITY_MATRIX_I_V, mul( unity_CameraInvProjection,float4({0},0)) ).xyz"; + private const string AseClipToViewDirFormat = " mul( unity_CameraInvProjection,float4({0},0)).xyz"; + private const string AseHDClipToObjectDirFormat = "mul( UNITY_MATRIX_I_M, mul( UNITY_MATRIX_I_VP,float4({0},0)) ).xyz"; + + private const string AseClipToWorldDirVarName = "clipToWorldDir"; + private const string AseHDClipToWorldDirFormat = "mul( UNITY_MATRIX_I_VP, float4({0},0) ).xyz"; + + private const string AseClipToViewDirVarName = "clipToViewDir"; + private const string AseHDClipToViewDirFormat = " mul( UNITY_MATRIX_I_P,float4({0},0)).xyz"; + private const string AseClipToNDC = "{0}.xyz/{0}.w"; + + ///////////////////////////////////////////////////// + private const string AseObjectToTangentDirVarName = "objectToTangentDir"; + private const string AseWorldToTangentDirVarName = "worldToTangentDir"; + private const string AseViewToTangentDirVarName = "viewToTangentDir"; + private const string AseClipToTangentDirVarName = "clipToTangentDir"; + private const string ASEWorldToTangentFormat = "mul( ase_worldToTangent, {0})"; + + + private const string AseTangentToObjectDirVarName = "tangentTobjectDir"; + private const string AseTangentToWorldDirVarName = "tangentToWorldDir"; + private const string AseTangentToViewDirVarName = "tangentToViewDir"; + private const string AseTangentToClipDirVarName = "tangentToClipDir"; + private const string ASEMulOpFormat = "mul( {0}, {1} )"; + + + + /////////////////////////////////////////////////////////// + private const string FromStr = "From"; + private const string ToStr = "To"; + private const string SubtitleFormat = "{0} to {1}"; + + private readonly string[] m_spaceOptionsFrom = + { + "Object", + "World", + "View", + "Tangent" + }; + + private readonly string[] m_spaceOptionsTo = + { + "Object", + "World", + "View", + "Tangent", + "Clip" + }; + + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT3, false, Constants.EmptyPortValue ); + AddOutputVectorPorts( WirePortDataType.FLOAT3, "XYZ" ); + m_useInternalPortData = true; + m_autoWrapProperties = true; + m_previewShaderGUID = "74e4d859fbdb2c0468de3612145f4929"; + m_textLabelWidth = 100; + UpdateSubtitle(); + } + + private void UpdateSubtitle() + { + SetAdditonalTitleText( string.Format( SubtitleFormat, m_from, m_to ) ); + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUI.BeginChangeCheck(); + m_from = (TransformSpaceFrom)EditorGUILayoutPopup( FromStr, (int)m_from, m_spaceOptionsFrom ); + m_to = (TransformSpaceTo)EditorGUILayoutPopup( ToStr, (int)m_to, m_spaceOptionsTo ); + if( m_from == TransformSpaceFrom.Tangent ) + { + m_inverseTangentType = (InverseTangentType)EditorGUILayoutEnumPopup( InverseTBNStr, m_inverseTangentType ); + } + + m_normalize = EditorGUILayoutToggle( NormalizeOptionStr, m_normalize ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateSubtitle(); + } + + if( m_normalize ) + { + EditorGUI.indentLevel++; + m_safeNormalize = EditorGUILayoutToggle( SafeNormalizeOptionStr , m_safeNormalize ); + EditorGUILayout.HelpBox( Constants.SafeNormalizeInfoStr , MessageType.Info ); + EditorGUI.indentLevel--; + } + } + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + base.PropagateNodeData( nodeData, ref dataCollector ); + if( (int)m_from != (int)m_to && ( m_from == TransformSpaceFrom.Tangent || m_to == TransformSpaceTo.Tangent ) ) + dataCollector.DirtyNormal = true; + } + + void CalculateTransform( TransformSpaceFrom from, TransformSpaceTo to, ref MasterNodeDataCollector dataCollector, ref string varName, ref string result ) + { + switch( from ) + { + case TransformSpaceFrom.Object: + { + switch( to ) + { + default: case TransformSpaceTo.Object: break; + case TransformSpaceTo.World: + { + if( dataCollector.IsTemplate && dataCollector.TemplateDataCollectorInstance.CurrentSRPType != TemplateSRPType.BuiltIn ) + result = string.Format( AseSRPObjectToWorldDirFormat, result ); + else + result = string.Format( AseObjectToWorldDirFormat, result ); + varName = AseObjectToWorldDirVarName + OutputId; + } + break; + case TransformSpaceTo.View: + { + if( dataCollector.IsTemplate && dataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.HD ) + result = string.Format( AseHDObjectToViewDirFormat, result ); + else + result = string.Format( AseObjectToViewDirFormat, result ); + varName = AseObjectToViewDirVarName + OutputId; + } + break; + case TransformSpaceTo.Clip: + { + if( dataCollector.IsTemplate && dataCollector.TemplateDataCollectorInstance.CurrentSRPType != TemplateSRPType.BuiltIn ) + { + result = string.Format( AseSRPObjectToClipDirFormat, result ); + } + else + { + result = string.Format( AseObjectToClipDirFormat, result ); + } + varName = AseObjectToClipDirVarName + OutputId; + } + break; + } + } + break; + case TransformSpaceFrom.World: + { + switch( to ) + { + case TransformSpaceTo.Object: + { + if( dataCollector.IsTemplate && dataCollector.TemplateDataCollectorInstance.CurrentSRPType != TemplateSRPType.BuiltIn ) + result = string.Format( AseSRPWorldToObjectDirFormat, result ); + else + result = string.Format( AseWorldToObjectDirFormat, result ); + varName = AseWorldToObjectDirVarName + OutputId; + } + break; + default: + case TransformSpaceTo.World: break; + case TransformSpaceTo.View: + { + result = string.Format( AseWorldToViewDirFormat, result ); + varName = AseWorldToViewDirVarName + OutputId; + } + break; + case TransformSpaceTo.Clip: + { + if( dataCollector.IsTemplate && dataCollector.TemplateDataCollectorInstance.CurrentSRPType != TemplateSRPType.BuiltIn ) + { + result = string.Format( AseSRPWorldToClipDirFormat, result ); + } + else + { + result = string.Format( AseWorldToClipDirFormat, result ); + } + varName = AseWorldToClipDirVarName + OutputId; + } + break; + } + } + break; + case TransformSpaceFrom.View: + { + switch( to ) + { + case TransformSpaceTo.Object: + { + result = string.Format( AseViewToObjectDirFormat, result ); + varName = AseViewToObjectDirVarName + OutputId; + } + break; + case TransformSpaceTo.World: + { + result = string.Format( AseViewToWorldDirFormat, result ); + varName = AseViewToWorldDirVarName + OutputId; + } + break; + default: case TransformSpaceTo.View: break; + case TransformSpaceTo.Clip: + { + if( dataCollector.IsTemplate && dataCollector.TemplateDataCollectorInstance.CurrentSRPType != TemplateSRPType.BuiltIn ) + { + result = string.Format( AseSRPViewToClipDirFormat, result ); + } + else + { + result = string.Format( AseViewToClipDirFormat, result ); + } + varName = AseViewToClipDirVarName + OutputId; + } + break; + } + } + break; + //case TransformSpace.Clip: + //{ + // switch( to ) + // { + // case TransformSpace.Object: + // { + // if( dataCollector.IsTemplate && dataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.HD ) + // { + // result = string.Format( AseHDClipToObjectDirFormat, result ); + // } + // else + // { + // result = string.Format( AseClipToObjectDirFormat, result ); + // } + // varName = AseClipToObjectDirVarName + OutputId; + // } + // break; + // case TransformSpace.World: + // { + // if( dataCollector.IsTemplate && dataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.HD ) + // { + // result = string.Format( AseHDClipToWorldDirFormat, result ); + // } + // else + // { + // result = string.Format( AseClipToWorldDirFormat, result ); + // } + // varName = AseClipToWorldDirVarName + OutputId; + // } + // break; + // case TransformSpace.View: + // { + // if( dataCollector.IsTemplate && dataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.HD ) + // { + // result = string.Format( AseHDClipToViewDirFormat, result ); + // } + // else + // { + // result = string.Format( AseClipToViewDirFormat, result ); + // } + // varName = AseClipToViewDirVarName + OutputId; + // } + // break; + // case TransformSpace.Clip: break; + // default: + // break; + // } + //} + //break; + default: break; + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + + GeneratorUtils.RegisterUnity2019MatrixDefines( ref dataCollector ); + + string result = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string varName = string.Empty; + + if( (int)m_from == (int)m_to ) + { + RegisterLocalVariable( 0, result, ref dataCollector ); + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + } + + switch( m_from ) + { + case TransformSpaceFrom.Object: + { + switch( m_to ) + { + default: case TransformSpaceTo.Object: break; + case TransformSpaceTo.World: + { + CalculateTransform( m_from, m_to, ref dataCollector, ref varName, ref result ); + } + break; + case TransformSpaceTo.View: + { + CalculateTransform( m_from, m_to, ref dataCollector, ref varName, ref result ); + } + break; + case TransformSpaceTo.Clip: + { + CalculateTransform( m_from, m_to, ref dataCollector, ref varName, ref result ); + } + break; + case TransformSpaceTo.Tangent: + { + GeneratorUtils.GenerateWorldToTangentMatrix( ref dataCollector, UniqueId, CurrentPrecisionType ); + CalculateTransform( m_from, TransformSpaceTo.World, ref dataCollector, ref varName, ref result ); + result = string.Format( ASEWorldToTangentFormat, result ); + varName = AseObjectToTangentDirVarName + OutputId; + } + break; + } + } + break; + case TransformSpaceFrom.World: + { + switch( m_to ) + { + case TransformSpaceTo.Object: + { + CalculateTransform( m_from, m_to, ref dataCollector, ref varName, ref result ); + } + break; + default: + case TransformSpaceTo.World: break; + case TransformSpaceTo.View: + { + CalculateTransform( m_from, m_to, ref dataCollector, ref varName, ref result ); + } + break; + case TransformSpaceTo.Clip: + { + CalculateTransform( m_from, m_to, ref dataCollector, ref varName, ref result ); + } + break; + case TransformSpaceTo.Tangent: + { + GeneratorUtils.GenerateWorldToTangentMatrix( ref dataCollector, UniqueId, CurrentPrecisionType ); + result = string.Format( ASEWorldToTangentFormat, result ); + varName = AseWorldToTangentDirVarName + OutputId; + } + break; + } + } + break; + case TransformSpaceFrom.View: + { + switch( m_to ) + { + case TransformSpaceTo.Object: + { + CalculateTransform( m_from, m_to, ref dataCollector, ref varName, ref result ); + } + break; + case TransformSpaceTo.World: + { + CalculateTransform( m_from, m_to, ref dataCollector, ref varName, ref result ); + } + break; + default: case TransformSpaceTo.View: break; + case TransformSpaceTo.Clip: + { + CalculateTransform( m_from, m_to, ref dataCollector, ref varName, ref result ); + } + break; + case TransformSpaceTo.Tangent: + { + GeneratorUtils.GenerateWorldToTangentMatrix( ref dataCollector, UniqueId, CurrentPrecisionType ); + CalculateTransform( m_from, TransformSpaceTo.World, ref dataCollector, ref varName, ref result ); + result = string.Format( ASEWorldToTangentFormat, result ); + varName = AseViewToTangentDirVarName + OutputId; + } + break; + } + } + break; + //case TransformSpace.Clip: + //{ + // switch( m_to ) + // { + // case TransformSpace.Object: + // { + // CalculateTransform( m_from, m_to, ref dataCollector, ref varName, ref result ); + // } + // break; + // case TransformSpace.World: + // { + // CalculateTransform( m_from, m_to, ref dataCollector, ref varName, ref result ); + // } + // break; + // case TransformSpace.View: + // { + // CalculateTransform( m_from, m_to, ref dataCollector, ref varName, ref result ); + // } + // break; + // case TransformSpace.Clip: break; + // case TransformSpace.Tangent: + // { + // GeneratorUtils.GenerateWorldToTangentMatrix( ref dataCollector, UniqueId, CurrentPrecisionType ); + // CalculateTransform( m_from, TransformSpace.World, ref dataCollector, ref varName, ref result ); + // result = string.Format( ASEWorldToTangentFormat, result ); + // varName = AseClipToTangentDirVarName + OutputId; + // } + // break; + // default: + // break; + // } + //}break; + case TransformSpaceFrom.Tangent: + { + string matrixVal = string.Empty; + if( m_inverseTangentType == InverseTangentType.Fast ) + matrixVal = GeneratorUtils.GenerateTangentToWorldMatrixFast( ref dataCollector, UniqueId, CurrentPrecisionType ); + else + matrixVal = GeneratorUtils.GenerateTangentToWorldMatrixPrecise( ref dataCollector, UniqueId, CurrentPrecisionType ); + + switch( m_to ) + { + case TransformSpaceTo.Object: + { + result = string.Format( ASEMulOpFormat, matrixVal, result ); + CalculateTransform( TransformSpaceFrom.World, m_to, ref dataCollector, ref varName, ref result ); + varName = AseTangentToObjectDirVarName + OutputId; + } + break; + case TransformSpaceTo.World: + { + result = string.Format( ASEMulOpFormat, matrixVal, result ); + varName = AseTangentToWorldDirVarName + OutputId; + } + break; + case TransformSpaceTo.View: + { + result = string.Format( ASEMulOpFormat, matrixVal, result ); + CalculateTransform( TransformSpaceFrom.World, m_to, ref dataCollector, ref varName, ref result ); + varName = AseTangentToViewDirVarName + OutputId; + } + break; + case TransformSpaceTo.Clip: + { + result = string.Format( ASEMulOpFormat, matrixVal, result ); + CalculateTransform( TransformSpaceFrom.World, m_to, ref dataCollector, ref varName, ref result ); + varName = AseTangentToClipDirVarName + OutputId; + } + break; + case TransformSpaceTo.Tangent: + default: + break; + } + } + break; + default: break; + } + + if( m_normalize ) + { + result = GeneratorUtils.NormalizeValue( ref dataCollector , m_safeNormalize , m_inputPorts[ 0 ].DataType , result ); + } + + RegisterLocalVariable( 0, result, ref dataCollector, varName ); + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + string from = GetCurrentParam( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() < 17500 && from.Equals( "Clip" ) ) + { + UIUtils.ShowMessage( UniqueId, "Clip Space no longer supported on From field over Transform Direction node" ); + } + else + { + m_from = (TransformSpaceFrom)Enum.Parse( typeof( TransformSpaceFrom ), from ); + } + m_to = (TransformSpaceTo)Enum.Parse( typeof( TransformSpaceTo ), GetCurrentParam( ref nodeParams ) ); + m_normalize = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > 15800 ) + { + m_inverseTangentType = (InverseTangentType)Enum.Parse( typeof( InverseTangentType ), GetCurrentParam( ref nodeParams ) ); + } + if( UIUtils.CurrentShaderVersion() > 18814 ) + { + m_safeNormalize = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + + UpdateSubtitle(); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_from ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_to ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_normalize ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_inverseTangentType ); + IOUtils.AddFieldValueToString( ref nodeInfo , m_safeNormalize ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/TransformDirectionNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/TransformDirectionNode.cs.meta new file mode 100644 index 0000000..123dc9f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/TransformDirectionNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5088261e4c0031f4aba961a253707b80 +timeCreated: 1525857790 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/TransformPositionNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/TransformPositionNode.cs new file mode 100644 index 0000000..968f8df --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/TransformPositionNode.cs @@ -0,0 +1,626 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Transform Position", "Object Transform", "Transforms a position value from one space to another" )] + public sealed class TransformPositionNode : ParentNode + { + [SerializeField] + private TransformSpaceFrom m_from = TransformSpaceFrom.Object; + + [SerializeField] + private TransformSpaceTo m_to = TransformSpaceTo.World; + + [SerializeField] + private bool m_perspectiveDivide = false; + + [SerializeField] + private InverseTangentType m_inverseTangentType = InverseTangentType.Fast; + + [SerializeField] + private bool m_absoluteWorldPos = true; + + private const string AbsoluteWorldPosStr = "Absolute"; + + private string InverseTBNStr = "Inverse TBN"; + + private const string AseObjectToWorldPosVarName = "objToWorld"; + private const string AseObjectToWorldPosFormat = "mul( unity_ObjectToWorld, float4( {0}, 1 ) ).xyz"; + private const string AseHDObjectToWorldPosFormat = "mul( GetObjectToWorldMatrix(), float4( {0}, 1 ) ).xyz"; + private const string ASEHDAbsoluteWordPos = "GetAbsolutePositionWS({0})"; + private const string ASEHDRelaviveCameraPos = "GetCameraRelativePositionWS({0})"; + private const string AseObjectToViewPosVarName = "objToView"; + private const string AseObjectToViewPosFormat = "mul( UNITY_MATRIX_MV, float4( {0}, 1 ) ).xyz"; + private const string AseHDObjectToViewPosFormat = "TransformWorldToView( TransformObjectToWorld({0}) )"; + + private const string AseWorldToObjectPosVarName = "worldToObj"; + private const string AseWorldToObjectPosFormat = "mul( unity_WorldToObject, float4( {0}, 1 ) ).xyz"; + private const string AseSRPWorldToObjectPosFormat = "mul( GetWorldToObjectMatrix(), float4( {0}, 1 ) ).xyz"; + + + private const string AseWorldToViewPosVarName = "worldToView"; + private const string AseWorldToViewPosFormat = "mul( UNITY_MATRIX_V, float4( {0}, 1 ) ).xyz"; + + private const string AseViewToObjectPosVarName = "viewToObj"; + private const string AseViewToObjectPosFormat = "mul( unity_WorldToObject, mul( UNITY_MATRIX_I_V , float4( {0}, 1 ) ) ).xyz"; + private const string AseHDViewToObjectPosFormat = "mul( GetWorldToObjectMatrix(), mul( UNITY_MATRIX_I_V , float4( {0}, 1 ) ) ).xyz"; + + private const string AseViewToWorldPosVarName = "viewToWorld"; + private const string AseViewToWorldPosFormat = "mul( UNITY_MATRIX_I_V, float4( {0}, 1 ) ).xyz"; + + /////////////////////////////////////////////////////////// + private const string AseObjectToClipPosVarName = "objectToClip"; + private const string AseObjectToClipPosFormat = "UnityObjectToClipPos({0})"; + private const string AseSRPObjectToClipPosFormat = "TransformWorldToHClip(TransformObjectToWorld({0}))"; + + private const string AseWorldToClipPosVarName = "worldToClip"; + private const string AseWorldToClipPosFormat = "mul(UNITY_MATRIX_VP, float4({0}, 1.0))"; + private const string AseSRPWorldToClipPosFormat = "TransformWorldToHClip({0})"; + + private const string AseViewToClipPosVarName = "viewToClip"; + private const string AseViewToClipPosFormat = "mul(UNITY_MATRIX_P, float4({0}, 1.0))"; + private const string AseSRPViewToClipPosFormat = "TransformWViewToHClip({0})"; + // + + private const string AseClipToObjectPosVarName = "clipToObject"; + private const string AseClipToObjectPosFormat = "mul( UNITY_MATRIX_IT_MV, mul( unity_CameraInvProjection,float4({0},1)) ).xyz"; + private const string AseHDClipToObjectPosFormat = "mul( UNITY_MATRIX_I_M, mul( UNITY_MATRIX_I_VP,float4({0},1)) ).xyz"; + + private const string AseClipToWorldPosVarName = "clipToWorld"; + private const string AseClipToWorldPosFormat = "mul( UNITY_MATRIX_I_V, mul( unity_CameraInvProjection,float4({0},1)) ).xyz"; + private const string AseHDClipToWorldPosFormat = "mul( UNITY_MATRIX_I_VP, float4({0},1) ).xyz"; + + private const string AseClipToViewPosVarName = "clipToView"; + private const string AseClipToViewPosFormat = " mul( unity_CameraInvProjection,float4({0},1)).xyz"; + private const string AseHDClipToViewPosFormat = " mul( UNITY_MATRIX_I_P,float4({0},1)).xyz"; + private const string AseClipToNDC = "{0}.xyz/{0}.w"; + ///////////////////////////////////////////////////// + private const string AseObjectToTangentPosVarName = "objectToTangentPos"; + private const string AseWorldToTangentPosVarName = "worldToTangentPos"; + private const string AseViewToTangentPosVarName = "viewToTangentPos"; + private const string AseClipToTangentPosVarName = "clipToTangentPos"; + private const string ASEWorldToTangentFormat = "mul( ase_worldToTangent, {0})"; + + + private const string AseTangentToObjectPosVarName = "tangentTobjectPos"; + private const string AseTangentToWorldPosVarName = "tangentToWorldPos"; + private const string AseTangentToViewPosVarName = "tangentToViewPos"; + private const string AseTangentToClipPosVarName = "tangentToClipPos"; + private const string ASEMulOpFormat = "mul( {0}, {1} )"; + + + /////////////////////////////////////////////////////////// + private const string FromStr = "From"; + private const string ToStr = "To"; + private const string PerpectiveDivideStr = "Perpective Divide"; + private const string SubtitleFormat = "{0} to {1}"; + + private readonly string[] m_spaceOptionsFrom = + { + "Object", + "World", + "View", + "Tangent" + }; + + private readonly string[] m_spaceOptionsTo = + { + "Object", + "World", + "View", + "Tangent", + "Clip" + }; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT3, false, Constants.EmptyPortValue ); + AddOutputVectorPorts( WirePortDataType.FLOAT3, "XYZ" ); + m_useInternalPortData = true; + m_autoWrapProperties = true; + m_previewShaderGUID = "74e4d859fbdb2c0468de3612145f4929"; + m_textLabelWidth = 120; + UpdateSubtitle(); + } + + private void UpdateSubtitle() + { + SetAdditonalTitleText( string.Format( SubtitleFormat, m_from, m_to ) ); + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUI.BeginChangeCheck(); + m_from = (TransformSpaceFrom)EditorGUILayoutPopup( FromStr, (int)m_from, m_spaceOptionsFrom ); + m_to = (TransformSpaceTo)EditorGUILayoutPopup( ToStr, (int)m_to, m_spaceOptionsTo ); + if( m_from == TransformSpaceFrom.Tangent ) + { + m_inverseTangentType = (InverseTangentType)EditorGUILayoutEnumPopup( InverseTBNStr, m_inverseTangentType ); + } + if( EditorGUI.EndChangeCheck() ) + { + UpdateSubtitle(); + } + + if( m_to == TransformSpaceTo.Clip ) + { + m_perspectiveDivide = EditorGUILayoutToggle( PerpectiveDivideStr, m_perspectiveDivide ); + } + + //if( m_containerGraph.IsHDRP && ( m_from == TransformSpace.Object && m_to == TransformSpace.World ) || + // ( m_from == TransformSpace.World && m_to == TransformSpace.Object ) ) + //{ + // m_absoluteWorldPos = EditorGUILayoutToggle( AbsoluteWorldPosStr, m_absoluteWorldPos ); + //} + } + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + base.PropagateNodeData( nodeData, ref dataCollector ); + if( (int)m_from != (int)m_to && ( m_from == TransformSpaceFrom.Tangent || m_to == TransformSpaceTo.Tangent ) ) + dataCollector.DirtyNormal = true; + } + + void CalculateTransform( TransformSpaceFrom from, TransformSpaceTo to, ref MasterNodeDataCollector dataCollector, ref string varName, ref string result ) + { + switch( from ) + { + case TransformSpaceFrom.Object: + { + switch( to ) + { + default: + case TransformSpaceTo.Object: break; + case TransformSpaceTo.World: + { + if( dataCollector.IsTemplate && dataCollector.IsSRP ) + { + if( dataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.HD ) + { + result = string.Format( AseHDObjectToWorldPosFormat, result ); + if( m_absoluteWorldPos ) + { + result = string.Format( ASEHDAbsoluteWordPos, result ); + } + } + else if( dataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.Lightweight ) + { + result = string.Format( AseHDObjectToWorldPosFormat, result ); + } + } + else + result = string.Format( AseObjectToWorldPosFormat, result ); + + + varName = AseObjectToWorldPosVarName + OutputId; + } + break; + case TransformSpaceTo.View: + { + if( dataCollector.IsTemplate && dataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.HD ) + result = string.Format( AseHDObjectToViewPosFormat, result ); + else + result = string.Format( AseObjectToViewPosFormat, result ); + varName = AseObjectToViewPosVarName + OutputId; + } + break; + case TransformSpaceTo.Clip: + { + if( dataCollector.IsTemplate && dataCollector.TemplateDataCollectorInstance.CurrentSRPType != TemplateSRPType.BuiltIn ) + { + result = string.Format( AseSRPObjectToClipPosFormat, result ); + } + else + { + result = string.Format( AseObjectToClipPosFormat, result ); + } + varName = AseObjectToClipPosVarName + OutputId; + } + break; + } + } + break; + case TransformSpaceFrom.World: + { + switch( to ) + { + case TransformSpaceTo.Object: + { + if( dataCollector.IsTemplate && dataCollector.IsSRP ) + { + if( dataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.HD ) + { + if( m_absoluteWorldPos ) + { + result = string.Format( ASEHDRelaviveCameraPos, result ); + } + result = string.Format( AseSRPWorldToObjectPosFormat, result ); + } + else if( dataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.Lightweight ) + { + result = string.Format( AseSRPWorldToObjectPosFormat, result ); + } + + } + else + result = string.Format( AseWorldToObjectPosFormat, result ); + varName = AseWorldToObjectPosVarName + OutputId; + } + break; + default: + case TransformSpaceTo.World: break; + case TransformSpaceTo.View: + { + result = string.Format( AseWorldToViewPosFormat, result ); + varName = AseWorldToViewPosVarName + OutputId; + } + break; + case TransformSpaceTo.Clip: + { + if( dataCollector.IsTemplate && dataCollector.TemplateDataCollectorInstance.CurrentSRPType != TemplateSRPType.BuiltIn ) + { + result = string.Format( AseSRPWorldToClipPosFormat, result ); + } + else + { + result = string.Format( AseWorldToClipPosFormat, result ); + } + varName = AseWorldToClipPosVarName + OutputId; + } + break; + } + } + break; + case TransformSpaceFrom.View: + { + switch( to ) + { + case TransformSpaceTo.Object: + { + if( dataCollector.IsTemplate && dataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.HD ) + result = string.Format( AseHDViewToObjectPosFormat, result ); + else + result = string.Format( AseViewToObjectPosFormat, result ); + varName = AseViewToObjectPosVarName + OutputId; + } + break; + case TransformSpaceTo.World: + { + result = string.Format( AseViewToWorldPosFormat, result ); + if( dataCollector.IsTemplate && + dataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.HD && + m_absoluteWorldPos ) + { + result = string.Format( ASEHDAbsoluteWordPos , result ); + } + varName = AseViewToWorldPosVarName + OutputId; + } + break; + default: + case TransformSpaceTo.View: break; + case TransformSpaceTo.Clip: + { + if( dataCollector.IsTemplate && dataCollector.TemplateDataCollectorInstance.CurrentSRPType != TemplateSRPType.BuiltIn ) + { + result = string.Format( AseSRPViewToClipPosFormat, result ); + } + else + { + result = string.Format( AseViewToClipPosFormat, result ); + } + varName = AseViewToClipPosVarName + OutputId; + } + break; + } + } + break; + //case TransformSpace.Clip: + //{ + // switch( to ) + // { + // case TransformSpace.Object: + // { + // if( dataCollector.IsTemplate && dataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.HD ) + // { + // result = string.Format( AseHDClipToObjectPosFormat, result ); + // } + // else + // { + // result = string.Format( AseClipToObjectPosFormat, result ); + // } + // varName = AseClipToObjectPosVarName + OutputId; + // } + // break; + // case TransformSpace.World: + // { + // if( dataCollector.IsTemplate && dataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.HD ) + // { + // result = string.Format( AseHDClipToWorldPosFormat, result ); + // } + // else + // { + // result = string.Format( AseClipToWorldPosFormat, result ); + // } + // varName = AseClipToWorldPosVarName + OutputId; + // } + // break; + // case TransformSpace.View: + // { + // if( dataCollector.IsTemplate && dataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.HD ) + // { + // result = string.Format( AseHDClipToViewPosFormat, result ); + // } + // else + // { + // result = string.Format( AseClipToViewPosFormat, result ); + // } + // varName = AseClipToViewPosVarName + OutputId; + // } + // break; + // case TransformSpace.Clip: break; + // default: + // break; + // } + //} + //break; + default: break; + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + + GeneratorUtils.RegisterUnity2019MatrixDefines( ref dataCollector ); + + string result = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string varName = string.Empty; + + if( (int)m_from == (int)m_to ) + { + RegisterLocalVariable( 0, result, ref dataCollector ); + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + } + + switch( m_from ) + { + case TransformSpaceFrom.Object: + { + switch( m_to ) + { + default: + case TransformSpaceTo.Object: break; + case TransformSpaceTo.World: + { + CalculateTransform( m_from, m_to, ref dataCollector, ref varName, ref result ); + } + break; + case TransformSpaceTo.View: + { + CalculateTransform( m_from, m_to, ref dataCollector, ref varName, ref result ); + } + break; + case TransformSpaceTo.Clip: + { + CalculateTransform( m_from, m_to, ref dataCollector, ref varName, ref result ); + } + break; + case TransformSpaceTo.Tangent: + { + GeneratorUtils.GenerateWorldToTangentMatrix( ref dataCollector, UniqueId, CurrentPrecisionType ); + CalculateTransform( m_from, TransformSpaceTo.World, ref dataCollector, ref varName, ref result ); + result = string.Format( ASEWorldToTangentFormat, result ); + varName = AseObjectToTangentPosVarName + OutputId; + } + break; + } + } + break; + case TransformSpaceFrom.World: + { + switch( m_to ) + { + case TransformSpaceTo.Object: + { + CalculateTransform( m_from, m_to, ref dataCollector, ref varName, ref result ); + } + break; + default: + case TransformSpaceTo.World: break; + case TransformSpaceTo.View: + { + CalculateTransform( m_from, m_to, ref dataCollector, ref varName, ref result ); + } + break; + case TransformSpaceTo.Clip: + { + CalculateTransform( m_from, m_to, ref dataCollector, ref varName, ref result ); + } + break; + case TransformSpaceTo.Tangent: + { + GeneratorUtils.GenerateWorldToTangentMatrix( ref dataCollector, UniqueId, CurrentPrecisionType ); + result = string.Format( ASEWorldToTangentFormat, result ); + varName = AseWorldToTangentPosVarName + OutputId; + } + break; + } + } + break; + case TransformSpaceFrom.View: + { + switch( m_to ) + { + case TransformSpaceTo.Object: + { + CalculateTransform( m_from, m_to, ref dataCollector, ref varName, ref result ); + } + break; + case TransformSpaceTo.World: + { + CalculateTransform( m_from, m_to, ref dataCollector, ref varName, ref result ); ; + } + break; + default: + case TransformSpaceTo.View: break; + case TransformSpaceTo.Clip: + { + CalculateTransform( m_from, m_to, ref dataCollector, ref varName, ref result ); + } + break; + case TransformSpaceTo.Tangent: + { + GeneratorUtils.GenerateWorldToTangentMatrix( ref dataCollector, UniqueId, CurrentPrecisionType ); + CalculateTransform( m_from, TransformSpaceTo.World, ref dataCollector, ref varName, ref result ); + result = string.Format( ASEWorldToTangentFormat, result ); + varName = AseViewToTangentPosVarName + OutputId; + } + break; + } + } + break; + //case TransformSpace.Clip: + //{ + // switch( m_to ) + // { + // case TransformSpace.Object: + // { + // CalculateTransform( m_from, m_to, ref dataCollector, ref varName, ref result ); + // } + // break; + // case TransformSpace.World: + // { + // CalculateTransform( m_from, m_to, ref dataCollector, ref varName, ref result ); + // } + // break; + // case TransformSpace.View: + // { + // CalculateTransform( m_from, m_to, ref dataCollector, ref varName, ref result ); + // } + // break; + // case TransformSpace.Clip: break; + // case TransformSpace.Tangent: + // { + // GeneratorUtils.GenerateWorldToTangentMatrix( ref dataCollector, UniqueId, CurrentPrecisionType ); + // CalculateTransform( m_from, TransformSpace.World, ref dataCollector, ref varName, ref result ); + // result = string.Format( ASEWorldToTangentFormat, result ); + // varName = AseClipToTangentPosVarName + OutputId; + // } + // break; + // default: + // break; + // } + //} + //break; + case TransformSpaceFrom.Tangent: + { + string matrixVal = string.Empty; + if( m_inverseTangentType == InverseTangentType.Fast ) + matrixVal = GeneratorUtils.GenerateTangentToWorldMatrixFast( ref dataCollector, UniqueId, CurrentPrecisionType ); + else + matrixVal = GeneratorUtils.GenerateTangentToWorldMatrixPrecise( ref dataCollector, UniqueId, CurrentPrecisionType ); + + switch( m_to ) + { + case TransformSpaceTo.Object: + { + result = string.Format( ASEMulOpFormat, matrixVal, result ); + CalculateTransform( TransformSpaceFrom.World, m_to, ref dataCollector, ref varName, ref result ); + varName = AseTangentToObjectPosVarName + OutputId; + } + break; + case TransformSpaceTo.World: + { + result = string.Format( ASEMulOpFormat, matrixVal, result ); + varName = AseTangentToWorldPosVarName + OutputId; + } + break; + case TransformSpaceTo.View: + { + result = string.Format( ASEMulOpFormat, matrixVal, result ); + CalculateTransform( TransformSpaceFrom.World, m_to, ref dataCollector, ref varName, ref result ); + varName = AseTangentToViewPosVarName + OutputId; + } + break; + case TransformSpaceTo.Clip: + { + result = string.Format( ASEMulOpFormat, matrixVal, result ); + CalculateTransform( TransformSpaceFrom.World, m_to, ref dataCollector, ref varName, ref result ); + varName = AseTangentToClipPosVarName + OutputId; + } + break; + case TransformSpaceTo.Tangent: + default: + break; + } + } + break; + default: break; + } + + if( m_to == TransformSpaceTo.Clip ) + { + if( m_perspectiveDivide ) + { + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT4, varName, result ); + result = string.Format( AseClipToNDC, varName ); + varName += "NDC"; + } + else + { + result += ".xyz"; + } + } + + RegisterLocalVariable( 0, result, ref dataCollector, varName ); + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + string from = GetCurrentParam( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() < 17500 && from.Equals( "Clip" ) ) + { + UIUtils.ShowMessage( UniqueId, "Clip Space no longer supported on From field over Transform Position node" ); + } + else + { + m_from = (TransformSpaceFrom)Enum.Parse( typeof( TransformSpaceFrom ), from ); + } + m_to = (TransformSpaceTo)Enum.Parse( typeof( TransformSpaceTo ), GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > 15701 ) + { + m_perspectiveDivide = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + if( UIUtils.CurrentShaderVersion() > 15800 ) + { + m_inverseTangentType = (InverseTangentType)Enum.Parse( typeof( InverseTangentType ), GetCurrentParam( ref nodeParams ) ); + } + if( UIUtils.CurrentShaderVersion() > 16103 ) + { + m_absoluteWorldPos = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + UpdateSubtitle(); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_from ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_to ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_perspectiveDivide ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_inverseTangentType ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_absoluteWorldPos ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/TransformPositionNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/TransformPositionNode.cs.meta new file mode 100644 index 0000000..84e1fcd --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/TransformPositionNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 274dde08d42e4b041b9be7a22a8c09d6 +timeCreated: 1525857790 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/TransformVariables.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/TransformVariables.cs new file mode 100644 index 0000000..1802fe5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/TransformVariables.cs @@ -0,0 +1,166 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + public enum BuiltInShaderTransformTypes + { + UNITY_MATRIX_MVP = 0, + UNITY_MATRIX_MV, + UNITY_MATRIX_V, + UNITY_MATRIX_P, + UNITY_MATRIX_VP, + UNITY_MATRIX_T_MV, + UNITY_MATRIX_IT_MV, + //UNITY_MATRIX_TEXTURE0, + //UNITY_MATRIX_TEXTURE1, + //UNITY_MATRIX_TEXTURE2, + //UNITY_MATRIX_TEXTURE3, + _Object2World, + _World2Object//, + //unity_Scale + } + + [Serializable] + [NodeAttributes( "Common Transform Matrices", "Matrix Transform", "All Transformation types" )] + public sealed class TransformVariables : ShaderVariablesNode + { + [SerializeField] + private BuiltInShaderTransformTypes m_selectedType = BuiltInShaderTransformTypes.UNITY_MATRIX_MVP; + + private const string MatrixLabelStr = "Matrix"; + private readonly string[] ValuesStr = + { + "Model View Projection", + "Model View", + "View", + "Projection", + "View Projection", + "Transpose Model View", + "Inverse Transpose Model View", + "Object to World", + "Word to Object" + }; + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, ValuesStr[ ( int ) m_selectedType ], WirePortDataType.FLOAT4x4 ); + m_textLabelWidth = 60; + m_hasLeftDropdown = true; + m_autoWrapProperties = true; + m_drawPreview = false; + } + + public override void AfterCommonInit() + { + base.AfterCommonInit(); + if( PaddingTitleLeft == 0 ) + { + PaddingTitleLeft = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + if( PaddingTitleRight == 0 ) + PaddingTitleRight = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + } + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + EditorGUI.BeginChangeCheck(); + m_selectedType = (BuiltInShaderTransformTypes)m_upperLeftWidget.DrawWidget( this, (int)m_selectedType, ValuesStr ); + if( EditorGUI.EndChangeCheck() ) + { + ChangeOutputName( 0, ValuesStr[ (int)m_selectedType ] ); + m_sizeIsDirty = true; + } + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUI.BeginChangeCheck(); + m_selectedType = ( BuiltInShaderTransformTypes ) EditorGUILayoutPopup( MatrixLabelStr, ( int ) m_selectedType, ValuesStr ); + if ( EditorGUI.EndChangeCheck() ) + { + ChangeOutputName( 0, ValuesStr[ ( int ) m_selectedType ] ); + m_sizeIsDirty = true; + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + if( dataCollector.IsTemplate && dataCollector.IsSRP ) + { + switch( m_selectedType ) + { + case BuiltInShaderTransformTypes.UNITY_MATRIX_MVP: + return "mul(GetWorldToHClipMatrix(),GetObjectToWorldMatrix())"; + case BuiltInShaderTransformTypes.UNITY_MATRIX_MV: + return "mul( GetWorldToViewMatrix(),GetObjectToWorldMatrix())"; + case BuiltInShaderTransformTypes.UNITY_MATRIX_V: + return "GetWorldToViewMatrix()"; + case BuiltInShaderTransformTypes.UNITY_MATRIX_P: + return "GetViewToHClipMatrix()"; + case BuiltInShaderTransformTypes.UNITY_MATRIX_VP: + return "GetWorldToHClipMatrix()"; + case BuiltInShaderTransformTypes._Object2World: + return "GetObjectToWorldMatrix()"; + case BuiltInShaderTransformTypes._World2Object: + return "GetWorldToObjectMatrix()"; + case BuiltInShaderTransformTypes.UNITY_MATRIX_T_MV: + case BuiltInShaderTransformTypes.UNITY_MATRIX_IT_MV: + default: + { + UIUtils.ShowMessage( UniqueId, "Matrix not declared natively on SRP. Must create it manually inside ASE" ); + return "float4x4(" + + "1,0,0,0," + + "0,1,0,0," + + "0,0,1,0," + + "0,0,0,1)"; + } + } + } + else + { + return m_selectedType.ToString(); + } + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + string selectedTypeStr = GetCurrentParam( ref nodeParams ); + try + { + BuiltInShaderTransformTypes selectedType = (BuiltInShaderTransformTypes)Enum.Parse( typeof( BuiltInShaderTransformTypes ), selectedTypeStr ); + m_selectedType = selectedType; + } + catch( Exception e ) + { + switch( selectedTypeStr ) + { + default: Debug.LogException( e );break; + case "UNITY_MATRIX_TEXTURE0":UIUtils.ShowMessage( UniqueId, "Texture 0 matrix is no longer supported",MessageSeverity.Warning);break; + case "UNITY_MATRIX_TEXTURE1":UIUtils.ShowMessage( UniqueId, "Texture 1 matrix is no longer supported",MessageSeverity.Warning);break; + case "UNITY_MATRIX_TEXTURE2":UIUtils.ShowMessage( UniqueId, "Texture 2 matrix is no longer supported",MessageSeverity.Warning);break; + case "UNITY_MATRIX_TEXTURE3":UIUtils.ShowMessage( UniqueId, "Texture 3 matrix is no longer supported",MessageSeverity.Warning); break; + case "unity_Scale": UIUtils.ShowMessage( UniqueId, "Scale matrix is no longer supported", MessageSeverity.Warning ); break; + } + } + + ChangeOutputName( 0, ValuesStr[ ( int ) m_selectedType ] ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_selectedType ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/TransformVariables.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/TransformVariables.cs.meta new file mode 100644 index 0000000..d0e613a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/TransformVariables.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 04aad5172ee1d4d4795e20bfae0ff64d +timeCreated: 1481126953 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/TransposeMVMatrix.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/TransposeMVMatrix.cs new file mode 100644 index 0000000..c7c46fe --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/TransposeMVMatrix.cs @@ -0,0 +1,18 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Transpose Model View Matrix", "Matrix Transform", "Transpose of model * view matrix" )] + public sealed class TransposeMVMatrix : ConstantShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, "Out", WirePortDataType.FLOAT4x4 ); + m_value = "UNITY_MATRIX_T_MV"; + m_drawPreview = false; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/TransposeMVMatrix.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/TransposeMVMatrix.cs.meta new file mode 100644 index 0000000..871d601 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/TransposeMVMatrix.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5762b195353d629448631bfb15fb8372 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/UnityProjectorClipMatrixNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/UnityProjectorClipMatrixNode.cs new file mode 100644 index 0000000..09325ec --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/UnityProjectorClipMatrixNode.cs @@ -0,0 +1,23 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Projector Clip Matrix", "Matrix Transform", "Current Projector Clip matrix. To be used when working with Unity projector." )] + public sealed class UnityProjectorClipMatrixNode : ConstantShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, "Out", WirePortDataType.FLOAT4x4 ); + m_value = "unity_ProjectorClip"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + dataCollector.AddToUniforms( UniqueId, "float4x4 unity_ProjectorClip;" ); + return base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/UnityProjectorClipMatrixNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/UnityProjectorClipMatrixNode.cs.meta new file mode 100644 index 0000000..6bc17bd --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/UnityProjectorClipMatrixNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6095e3e4dc186f146bc109813901ccc8 +timeCreated: 1512062884 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/UnityProjectorMatrixNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/UnityProjectorMatrixNode.cs new file mode 100644 index 0000000..4cfb63c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/UnityProjectorMatrixNode.cs @@ -0,0 +1,23 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Projector Matrix", "Matrix Transform", "Current Projector Clip matrix. To be used when working with Unity projector." )] + public sealed class UnityProjectorMatrixNode : ConstantShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, "Out", WirePortDataType.FLOAT4x4 ); + m_value = "unity_Projector"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + dataCollector.AddToUniforms( UniqueId, "float4x4 unity_Projector;" ); + return base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/UnityProjectorMatrixNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/UnityProjectorMatrixNode.cs.meta new file mode 100644 index 0000000..0a62ab9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/UnityProjectorMatrixNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c3efd02b48473d94b92302654b671ddc +timeCreated: 1512062884 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/UnityScaleMatrix.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/UnityScaleMatrix.cs new file mode 100644 index 0000000..2d2f00c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/UnityScaleMatrix.cs @@ -0,0 +1,18 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Scale Matrix", "Matrix Transform", "Scale Matrix",null, UnityEngine.KeyCode.None, true, true, "Object Scale" )] + public sealed class UnityScaleMatrix : ConstantShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, "Out", WirePortDataType.FLOAT4x4 ); + m_value = "unity_Scale"; + m_drawPreview = false; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/UnityScaleMatrix.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/UnityScaleMatrix.cs.meta new file mode 100644 index 0000000..26f2df7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/UnityScaleMatrix.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 28a04286716e19f4aa58954888374428 +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/ViewMatrixNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/ViewMatrixNode.cs new file mode 100644 index 0000000..2291bc3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/ViewMatrixNode.cs @@ -0,0 +1,19 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "View Matrix", "Matrix Transform", "Current view matrix" )] + public sealed class ViewMatrixNode : ConstantShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, "Out", WirePortDataType.FLOAT4x4 ); + m_value = "UNITY_MATRIX_V"; + m_drawPreview = false; + m_matrixId = 0; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/ViewMatrixNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/ViewMatrixNode.cs.meta new file mode 100644 index 0000000..bcfb2ed --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/ViewMatrixNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5aa75cc5e6044a44a9a4439eac1d948b +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/ViewProjectionMatrixNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/ViewProjectionMatrixNode.cs new file mode 100644 index 0000000..23e53e4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/ViewProjectionMatrixNode.cs @@ -0,0 +1,18 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "View Projection Matrix", "Matrix Transform", "Current view * projection matrix." )] + public sealed class ViewProjectionMatrixNode : ConstantShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, "Out", WirePortDataType.FLOAT4x4 ); + m_value = "UNITY_MATRIX_VP"; + m_drawPreview = false; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/ViewProjectionMatrixNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/ViewProjectionMatrixNode.cs.meta new file mode 100644 index 0000000..1a1cd1c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/ViewProjectionMatrixNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: fe26c99932382e047aebc05b7e67a3d0 +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/WorldToCameraMatrix.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/WorldToCameraMatrix.cs new file mode 100644 index 0000000..65d9e08 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/WorldToCameraMatrix.cs @@ -0,0 +1,23 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "World To Camera Matrix", "Matrix Transform", "Inverse of current camera to world matrix" )] + public sealed class WorldToCameraMatrix : ConstantShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, "Out", WirePortDataType.FLOAT4x4 ); + m_value = "unity_WorldToCamera"; + m_drawPreview = false; + } + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + GeneratorUtils.RegisterUnity2019MatrixDefines( ref dataCollector ); + return base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/WorldToCameraMatrix.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/WorldToCameraMatrix.cs.meta new file mode 100644 index 0000000..a8d0b7a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/WorldToCameraMatrix.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 584bea5554dc1b64c8965d8fcfc54e23 +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/WorldToObjectMatrix.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/WorldToObjectMatrix.cs new file mode 100644 index 0000000..dd82ebb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/WorldToObjectMatrix.cs @@ -0,0 +1,20 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "World To Object Matrix", "Matrix Transform", "Inverse of current world matrix" )] + public sealed class WorldToObjectMatrix : ConstantShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputProperties( 0, "Out", WirePortDataType.FLOAT4x4 ); + m_value = "unity_WorldToObject"; + m_HDValue = "GetWorldToObjectMatrix()"; + m_LWValue = "GetWorldToObjectMatrix()"; + m_drawPreview = false; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/WorldToObjectMatrix.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/WorldToObjectMatrix.cs.meta new file mode 100644 index 0000000..dd284eb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/WorldToObjectMatrix.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d9e2a5077cc29de439d5c845eac35a04 +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/WorldToTangentMatrix.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/WorldToTangentMatrix.cs new file mode 100644 index 0000000..194802e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/WorldToTangentMatrix.cs @@ -0,0 +1,47 @@ +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "World To Tangent Matrix", "Matrix Transform", "World to tangent transform matrix" )] + public sealed class WorldToTangentMatrix : ParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddOutputPort( WirePortDataType.FLOAT3x3, "Out" ); + //UIUtils.AddNormalDependentCount(); + m_drawPreview = false; + } + + //public override void Destroy() + //{ + // ContainerGraph.RemoveNormalDependentCount(); + // base.Destroy(); + //} + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + base.PropagateNodeData( nodeData, ref dataCollector ); + dataCollector.DirtyNormal = true; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + if( dataCollector.IsTemplate ) + return dataCollector.TemplateDataCollectorInstance.GetWorldToTangentMatrix( CurrentPrecisionType ); + + if( dataCollector.IsFragmentCategory ) + { + dataCollector.ForceNormal = true; + + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_NORMAL, CurrentPrecisionType ); + dataCollector.AddToInput( UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + } + + GeneratorUtils.GenerateWorldToTangentMatrix( ref dataCollector, UniqueId, CurrentPrecisionType ); + + return GeneratorUtils.WorldToTangentStr; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/WorldToTangentMatrix.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/WorldToTangentMatrix.cs.meta new file mode 100644 index 0000000..ed19db7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Transform/WorldToTangentMatrix.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b598d9ebc2d7be44a97270732f55f9bc +timeCreated: 1484747592 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various.meta new file mode 100644 index 0000000..89ede46 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 5bbb49ec7f4a3524d9950847c88d4afc +folderAsset: yes +timeCreated: 1481126946 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/ColorSpaceDouble.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/ColorSpaceDouble.cs new file mode 100644 index 0000000..231a011 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/ColorSpaceDouble.cs @@ -0,0 +1,37 @@ +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Color Space Double", "Miscellaneous", "Color Space Double" )] + public class ColorSpaceDouble : ParentNode + { + private const string ColorSpaceDoubleStr = "unity_ColorSpaceDouble"; + + private readonly string[] ColorSpaceDoubleDef = + { + "#ifdef UNITY_COLORSPACE_GAMMA//ASE Color Space Def", + "#define unity_ColorSpaceDouble half4(2.0, 2.0, 2.0, 2.0)//ASE Color Space Def", + "#else // Linear values//ASE Color Space Def", + "#define unity_ColorSpaceDouble half4(4.59479380, 4.59479380, 4.59479380, 2.0)//ASE Color Space Def", + "#endif//ASE Color Space Def" + }; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddOutputColorPorts( "RGBA" ); + m_previewShaderGUID = "ac680a8772bb97c46851a7f075fd04e3"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.IsTemplate && dataCollector.IsSRP ) + { + for( int i = 0; i < ColorSpaceDoubleDef.Length; i++ ) + { + dataCollector.AddToDirectives( ColorSpaceDoubleDef[ i ], -1 ); + } + } + return GetOutputVectorItem( 0, outputId, ColorSpaceDoubleStr ); ; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/ColorSpaceDouble.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/ColorSpaceDouble.cs.meta new file mode 100644 index 0000000..32721b8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/ColorSpaceDouble.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7d1204234983b3c4499da752961185be +timeCreated: 1481888315 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/FaceVariableNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/FaceVariableNode.cs new file mode 100644 index 0000000..0570939 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/FaceVariableNode.cs @@ -0,0 +1,53 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Face", "Vertex Data", "Indicates whether the rendered surface is facing the camera (1), or facing away from the camera(-1)" )] + public class FaceVariableNode : ParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddOutputPort( WirePortDataType.FLOAT, "Out" ); + m_previewShaderGUID = "4b0b5b9f16353b840a5f5ad2baab3c3c"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + { + UIUtils.ShowMessage( UniqueId, m_nodeAttribs.Name + " node does not work on Tessellation port" ); + return m_outputPorts[0].ErrorValue; + } + + if ( dataCollector.PortCategory == MasterNodePortCategory.Vertex ) + { + if ( dataCollector.TesselationActive ) + { + UIUtils.ShowMessage( UniqueId, m_nodeAttribs.Name + " node does not work properly on Vertex/Tessellation ports" ); + return m_outputPorts[ 0 ].ErrorValue; + } + else + { + UIUtils.ShowMessage( UniqueId, m_nodeAttribs.Name + " node does not work propery on Vertex ports" ); + return m_outputPorts[ 0 ].ErrorValue; + } + } + + if ( dataCollector.IsTemplate ) + { + return dataCollector.TemplateDataCollectorInstance.GetVFace( UniqueId ); + } + else + { + dataCollector.AddToInput( UniqueId, SurfaceInputs.VFACE ); + string variable = ( dataCollector.PortCategory == MasterNodePortCategory.Vertex ) ? Constants.VertexShaderOutputStr : Constants.InputVarStr; + return variable + "." + Constants.VFaceVariable; + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/FaceVariableNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/FaceVariableNode.cs.meta new file mode 100644 index 0000000..b583327 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/FaceVariableNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4b4a6f07436b05a4cbc2559e4e704000 +timeCreated: 1492513159 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/InstanceIdNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/InstanceIdNode.cs new file mode 100644 index 0000000..c845e06 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/InstanceIdNode.cs @@ -0,0 +1,43 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Instance ID", "Vertex Data", "Indicates the per-instance identifier" )] + public class InstanceIdNode : ParentNode + { + private readonly string[] InstancingVariableAttrib = + { "uint currInstanceId = 0;", + "#ifdef UNITY_INSTANCING_ENABLED", + "currInstanceId = unity_InstanceID;", + "#endif"}; + private const string InstancingInnerVariable = "currInstanceId"; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddOutputPort( WirePortDataType.INT, "Out" ); + m_previewShaderGUID = "03febce56a8cf354b90e7d5180c1dbd7"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.IsTemplate ) + { + dataCollector.TemplateDataCollectorInstance.SetupInstancing(); + } + + if( !dataCollector.HasLocalVariable( InstancingVariableAttrib[ 0 ] ) ) + { + dataCollector.AddLocalVariable( UniqueId, InstancingVariableAttrib[ 0 ] ,true ); + dataCollector.AddLocalVariable( UniqueId, InstancingVariableAttrib[ 1 ] ,true ); + dataCollector.AddLocalVariable( UniqueId, InstancingVariableAttrib[ 2 ] ,true ); + dataCollector.AddLocalVariable( UniqueId, InstancingVariableAttrib[ 3 ] ,true ); + } + return InstancingInnerVariable; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/InstanceIdNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/InstanceIdNode.cs.meta new file mode 100644 index 0000000..efae4fb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/InstanceIdNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c449923583a9fbe4283acebc97756ea1 +timeCreated: 1547811127 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/LODFadeNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/LODFadeNode.cs new file mode 100644 index 0000000..f2a1959 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/LODFadeNode.cs @@ -0,0 +1,44 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "LOD Fade", "Miscellaneous", "LODFadeNode" )] + public sealed class LODFadeNode : ConstVecShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputName( 1, "Fade[0...1]" ); + ChangeOutputName( 2, "Fade[16Lvl]" ); + ChangeOutputName( 3, "Unused" ); + ChangeOutputName( 4, "Unused" ); + m_value = "unity_LODFade"; + m_previewShaderGUID = "fcd4d93f57ffc51458d4ade10df2fdb4"; + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + if( !m_outputPorts[ 0 ].IsConnected ) + { + m_outputPorts[ 0 ].Visible = false; + m_sizeIsDirty = true; + } + + if( !m_outputPorts[ 3 ].IsConnected ) + { + m_outputPorts[ 3 ].Visible = false; + m_sizeIsDirty = true; + } + + if( !m_outputPorts[ 4 ].IsConnected ) + { + m_outputPorts[ 4 ].Visible = false; + m_sizeIsDirty = true; + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/LODFadeNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/LODFadeNode.cs.meta new file mode 100644 index 0000000..a83635a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/LODFadeNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f96cf34c2936c96458403e9cf75e8e10 +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/PrimitiveIdVariableNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/PrimitiveIdVariableNode.cs new file mode 100644 index 0000000..b60f847 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/PrimitiveIdVariableNode.cs @@ -0,0 +1,38 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +#if UNITY_EDITOR_WIN +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Primitive ID", "Vertex Data", "Per-primitive identifier automatically generated by the runtime" )] + public class PrimitiveIDVariableNode : ParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddOutputPort( WirePortDataType.INT, "Out" ); + m_previewShaderGUID = "92c1b588d7658594cb219696f593f64b"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( !dataCollector.IsTemplate ) + { + UIUtils.ShowMessage( UniqueId, m_nodeAttribs.Name + " is not supported on surface shaders." ); + return m_outputPorts[0].ErrorValue; + } + + if ( dataCollector.PortCategory == MasterNodePortCategory.Vertex ) + { + UIUtils.ShowMessage( UniqueId, m_nodeAttribs.Name + " is not supported on Vertex ports" ); + return m_outputPorts[0].ErrorValue; + } + + return dataCollector.TemplateDataCollectorInstance.GetPrimitiveId(); + } + } +} +#endif + diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/PrimitiveIdVariableNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/PrimitiveIdVariableNode.cs.meta new file mode 100644 index 0000000..6d7d119 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/PrimitiveIdVariableNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: dd0af9fbbba750341a7b09316178f285 +timeCreated: 1492513159 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/SwitchByFaceNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/SwitchByFaceNode.cs new file mode 100644 index 0000000..6bfd7f3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/SwitchByFaceNode.cs @@ -0,0 +1,70 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Switch by Face", "Miscellaneous", "Switch which automaticaly uses a Face variable to select which input to use" )] + public class SwitchByFaceNode : DynamicTypeNode + { + private const string SwitchOp = "((({0}>0)?({1}):({2})))"; + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_inputPorts[ 0 ].Name = "Front"; + m_inputPorts[ 1 ].Name = "Back"; + m_textLabelWidth = 50; + m_previewShaderGUID = "f4edf6febb54dc743b25bd5b56facea8"; + } + + + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + { + UIUtils.ShowMessage( UniqueId, m_nodeAttribs.Name + " does not work on Tessellation port" ); + return GenerateErrorValue(); + } + + if ( dataCollector.PortCategory == MasterNodePortCategory.Vertex ) + { + if ( dataCollector.TesselationActive ) + { + UIUtils.ShowMessage( UniqueId, m_nodeAttribs.Name + " does not work properly on Vertex/Tessellation ports" ); + return GenerateErrorValue(); + } + else + { + UIUtils.ShowMessage( UniqueId, m_nodeAttribs.Name + " does not work properly on Vertex ports" ); + return GenerateErrorValue(); + } + } + + if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string front = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string back = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + + dataCollector.AddToInput( UniqueId, SurfaceInputs.VFACE ); + string variable = string.Empty; + if ( dataCollector.IsTemplate ) + { + variable = dataCollector.TemplateDataCollectorInstance.GetVFace( UniqueId ); + } + else + { + variable = ( ( dataCollector.PortCategory == MasterNodePortCategory.Vertex ) ? Constants.VertexShaderOutputStr : Constants.InputVarStr ) + "." + Constants.VFaceVariable; + } + + string value = string.Format( SwitchOp, variable, front, back ); + RegisterLocalVariable( 0, value, ref dataCollector, "switchResult" + OutputId ); + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/SwitchByFaceNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/SwitchByFaceNode.cs.meta new file mode 100644 index 0000000..b12692c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/SwitchByFaceNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b0464d8b27caa7d4d8fa5d1828934da8 +timeCreated: 1492515561 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/VertexIdVariableNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/VertexIdVariableNode.cs new file mode 100644 index 0000000..d2b7519 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/VertexIdVariableNode.cs @@ -0,0 +1,54 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Vertex ID", "Vertex Data", "Indicates current vertex number" )] + public class VertexIdVariableNode : ParentNode + { + private const string VertexIdVarName = "ase_vertexId"; + private const string VertexIdRegistry = "uint "+ VertexIdVarName + " : SV_VertexID;"; + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddOutputPort( WirePortDataType.INT, "Out" ); + m_previewShaderGUID = "5934bf2c10b127a459177a3b622cea65"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + { + UIUtils.ShowMessage( UniqueId, m_nodeAttribs.Name + " does not work on Tessellation port" ); + return m_outputPorts[0].ErrorValue; + } + + if ( dataCollector.IsTemplate ) + { + return dataCollector.TemplateDataCollectorInstance.GetVertexId(); + } + else + { + if( dataCollector.IsFragmentCategory ) + { + GenerateValueInVertex( ref dataCollector, WirePortDataType.UINT, Constants.VertexShaderInputStr + "."+ VertexIdVarName, VertexIdVarName, true ); + return Constants.InputVarStr + "."+ VertexIdVarName; + } + else + { + return Constants.VertexShaderInputStr + "."+ VertexIdVarName; + } + } + } + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + if( !dataCollector.IsTemplate ) + dataCollector.AddCustomAppData( VertexIdRegistry ); + + base.PropagateNodeData( nodeData, ref dataCollector ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/VertexIdVariableNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/VertexIdVariableNode.cs.meta new file mode 100644 index 0000000..cad8fe0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/VertexIdVariableNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ce37a30cae7677942ad44f0945ab7b77 +timeCreated: 1492513159 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/WorldTransformParams.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/WorldTransformParams.cs new file mode 100644 index 0000000..49966a0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/WorldTransformParams.cs @@ -0,0 +1,32 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "World Transform Params", "Object Transform", "World Transform Params contains information about the transform, W is usually 1.0, or -1.0 for odd-negative scale transforms" )] + public sealed class WorldTransformParams : ConstVecShaderVariable + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeOutputName( 1, "X" ); + ChangeOutputName( 2, "Y" ); + ChangeOutputName( 3, "Z" ); + ChangeOutputName( 4, "W" ); + m_value = "unity_WorldTransformParams"; + m_previewShaderGUID = "5a2642605f085da458d6e03ade47b87a"; + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + if( !m_outputPorts[ 0 ].IsConnected ) + { + m_outputPorts[ 0 ].Visible = false; + m_sizeIsDirty = true; + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/WorldTransformParams.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/WorldTransformParams.cs.meta new file mode 100644 index 0000000..b28aa84 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/ShaderVariables/Various/WorldTransformParams.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: aec376443deca354789bc36ba18af898 +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/StaticSwitch.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/StaticSwitch.cs new file mode 100644 index 0000000..ed072c1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/StaticSwitch.cs @@ -0,0 +1,1240 @@ +// Amplify Shader Editor - Visual Shader vEditing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Static Switch", "Logical Operators", "Creates a shader keyword toggle", Available = true )] + public sealed class StaticSwitch : PropertyNode + { + private float InstanceIconWidth = 19; + private float InstanceIconHeight = 19; + private readonly Color ReferenceHeaderColor = new Color( 0f, 0.5f, 0.585f, 1.0f ); + + [SerializeField] + private int m_defaultValue = 0; + + [SerializeField] + private int m_materialValue = 0; + + [SerializeField] + private int m_multiCompile = 0; + + [SerializeField] + private int m_currentKeywordId = 0; + + [SerializeField] + private string m_currentKeyword = string.Empty; + + [SerializeField] + private bool m_createToggle = true; + + [SerializeField] + private bool m_lockKeyword = true; + + private const string IsLocalStr = "Is Local"; +#if UNITY_2019_1_OR_NEWER + [SerializeField] + private bool m_isLocal = true; +#else + [SerializeField] + private bool m_isLocal = false; +#endif + private GUIContent m_checkContent; + private GUIContent m_popContent; + + private int m_conditionId = -1; + + private const int MinComboSize = 50; + private const int MaxComboSize = 105; + + private Rect m_varRect; + private Rect m_imgRect; + private bool m_editing; + + public enum KeywordModeType + { + Toggle = 0, + ToggleOff, + KeywordEnum, + } + + public enum StaticSwitchVariableMode + { + Create = 0, + Fetch, + Reference + } + + [SerializeField] + private KeywordModeType m_keywordModeType = KeywordModeType.Toggle; + + [SerializeField] + private StaticSwitch m_reference = null; + + private const string StaticSwitchStr = "Static Switch"; + private const string MaterialToggleStr = "Material Toggle"; + + private const string ToggleMaterialValueStr = "Material Value"; + private const string ToggleDefaultValueStr = "Default Value"; + + private const string AmountStr = "Amount"; + private const string KeywordStr = "Keyword"; + private const string CustomStr = "Custom"; + private const string ToggleTypeStr = "Toggle Type"; + private const string TypeStr = "Type"; + private const string ModeStr = "Mode"; + private const string KeywordTypeStr = "Keyword Type"; + + private const string KeywordNameStr = "Keyword Name"; + public readonly static string[] KeywordTypeList = { "Shader Feature", "Multi Compile"/*, "Define Symbol"*/ }; + public readonly static int[] KeywordTypeInt = { 0, 1/*, 2*/ }; + + [SerializeField] + private string[] m_defaultKeywordNames = { "Key0", "Key1", "Key2", "Key3", "Key4", "Key5", "Key6", "Key7", "Key8" }; + + [SerializeField] + private string[] m_keywordEnumList = { "Key0", "Key1" }; + + [SerializeField] + private StaticSwitchVariableMode m_staticSwitchVarMode = StaticSwitchVariableMode.Create; + + [SerializeField] + private int m_referenceArrayId = -1; + + [SerializeField] + private int m_referenceNodeId = -1; + + private int m_keywordEnumAmount = 2; + + private bool m_isStaticSwitchDirty = false; + + private Rect m_iconPos; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + AddInputPort( WirePortDataType.FLOAT, false, "False", -1, MasterNodePortCategory.Fragment, 1 ); + AddInputPort( WirePortDataType.FLOAT, false, "True", -1, MasterNodePortCategory.Fragment, 0 ); + for( int i = 2; i < 9; i++ ) + { + AddInputPort( WirePortDataType.FLOAT, false, m_defaultKeywordNames[ i ] ); + m_inputPorts[ i ].Visible = false; + } + m_headerColor = new Color( 0.0f, 0.55f, 0.45f, 1f ); + m_customPrefix = KeywordStr + " "; + m_autoWrapProperties = false; + m_freeType = false; + m_useVarSubtitle = true; + m_allowPropertyDuplicates = true; + m_showTitleWhenNotEditing = false; + m_currentParameterType = PropertyType.Property; + + m_checkContent = new GUIContent(); + m_checkContent.image = UIUtils.CheckmarkIcon; + + m_popContent = new GUIContent(); + m_popContent.image = UIUtils.PopupIcon; + + m_previewShaderGUID = "0b708c11c68e6a9478ac97fe3643eab1"; + m_showAutoRegisterUI = true; + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + if( m_conditionId == -1 ) + m_conditionId = Shader.PropertyToID( "_Condition" ); + + StaticSwitch node = ( m_staticSwitchVarMode == StaticSwitchVariableMode.Reference && m_reference != null ) ? m_reference : this; + + if( m_createToggle ) + PreviewMaterial.SetInt( m_conditionId, node.MaterialValue ); + else + PreviewMaterial.SetInt( m_conditionId, node.DefaultValue ); + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + + if( m_createToggle ) + UIUtils.RegisterPropertyNode( this ); + else + UIUtils.UnregisterPropertyNode( this ); + + if( CurrentVarMode != StaticSwitchVariableMode.Reference ) + { + ContainerGraph.StaticSwitchNodes.AddNode( this ); + } + + if( UniqueId > -1 ) + ContainerGraph.StaticSwitchNodes.OnReorderEventComplete += OnReorderEventComplete; + } + + public override void Destroy() + { + base.Destroy(); + UIUtils.UnregisterPropertyNode( this ); + if( CurrentVarMode != StaticSwitchVariableMode.Reference ) + { + ContainerGraph.StaticSwitchNodes.RemoveNode( this ); + } + + if( UniqueId > -1 ) + ContainerGraph.StaticSwitchNodes.OnReorderEventComplete -= OnReorderEventComplete; + } + + void OnReorderEventComplete() + { + if( CurrentVarMode == StaticSwitchVariableMode.Reference ) + { + if( m_reference != null ) + { + m_referenceArrayId = ContainerGraph.StaticSwitchNodes.GetNodeRegisterIdx( m_reference.UniqueId ); + } + } + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + UpdateConnections(); + } + + public override void OnConnectedOutputNodeChanges( int inputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( inputPortId, otherNodeId, otherPortId, name, type ); + UpdateConnections(); + } + + public override void OnInputPortDisconnected( int portId ) + { + base.OnInputPortDisconnected( portId ); + UpdateConnections(); + } + + private void UpdateConnections() + { + WirePortDataType mainType = WirePortDataType.FLOAT; + + int highest = UIUtils.GetPriority( mainType ); + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + if( m_inputPorts[ i ].IsConnected ) + { + WirePortDataType portType = m_inputPorts[ i ].GetOutputConnection().DataType; + if( UIUtils.GetPriority( portType ) > highest ) + { + mainType = portType; + highest = UIUtils.GetPriority( portType ); + } + } + } + + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + m_inputPorts[ i ].ChangeType( mainType, false ); + } + + m_outputPorts[ 0 ].ChangeType( mainType, false ); + } + + public override string GetPropertyValue() + { + if( m_createToggle ) + if( m_keywordModeType == KeywordModeType.KeywordEnum && m_keywordEnumAmount > 0 ) + return PropertyAttributes + "[" + m_keywordModeType.ToString() + "(" + GetKeywordEnumPropertyList() + ")] " + m_propertyName + "(\"" + m_propertyInspectorName + "\", Float) = " + m_defaultValue; + else + return PropertyAttributes + "[" + m_keywordModeType.ToString() + "(" + GetPropertyValStr() + ")] " + m_propertyName + "(\"" + m_propertyInspectorName + "\", Float) = " + m_defaultValue; + else + return string.Empty; + } + + public string KeywordEnum( int index ) + { + if( m_createToggle ) + { + return string.IsNullOrEmpty( PropertyName ) ? KeywordEnumList( index ) : ( PropertyName + "_" + KeywordEnumList( index ) ); + } + else + { + return string.IsNullOrEmpty( PropertyName ) ? KeywordEnumList( index ) : ( PropertyName + KeywordEnumList( index ) ); + } + } + + public string KeywordEnumList( int index ) + { + if( CurrentVarMode == StaticSwitchVariableMode.Fetch ) + return m_keywordEnumList[ index ]; + else + { + return m_createToggle ? m_keywordEnumList[ index ].ToUpper() : m_keywordEnumList[ index ]; + } + + } + public override string PropertyName + { + get + { + if( CurrentVarMode == StaticSwitchVariableMode.Fetch ) + return m_currentKeyword; + else + { + return m_createToggle ? base.PropertyName.ToUpper() : base.PropertyName; + } + } + } + + public override string GetPropertyValStr() + { + if( m_keywordModeType == KeywordModeType.KeywordEnum ) + return PropertyName; + else if( !m_lockKeyword ) + return CurrentKeyword; + else if( CurrentVarMode == StaticSwitchVariableMode.Fetch ) + return m_currentKeyword; + else + return PropertyName + OnOffStr; + } + + private string GetKeywordEnumPropertyList() + { + string result = string.Empty; + for( int i = 0; i < m_keywordEnumList.Length; i++ ) + { + if( i == 0 ) + result = m_keywordEnumList[ i ]; + else + result += "," + m_keywordEnumList[ i ]; + } + return result; + } + + private string GetKeywordEnumPragmaList() + { + string result = string.Empty; + for( int i = 0; i < m_keywordEnumList.Length; i++ ) + { + if( i == 0 ) + result = KeywordEnum( i ); + else + result += " " + KeywordEnum( i ); + } + return result; + } + + public override string GetUniformValue() + { + return string.Empty; + } + + public override bool GetUniformData( out string dataType, out string dataName, ref bool fullValue ) + { + dataType = string.Empty; + dataName = string.Empty; + return false; + } + + public override void DrawProperties() + { + //base.DrawProperties(); + NodeUtils.DrawPropertyGroup( ref m_propertiesFoldout, Constants.ParameterLabelStr, PropertyGroup ); + NodeUtils.DrawPropertyGroup( ref m_visibleCustomAttrFoldout, CustomAttrStr, DrawCustomAttributes, DrawCustomAttrAddRemoveButtons ); + CheckPropertyFromInspector(); + } + + void DrawEnumList() + { + EditorGUI.BeginChangeCheck(); + KeywordEnumAmount = EditorGUILayoutIntSlider( AmountStr, KeywordEnumAmount, 2, 9 ); + if( EditorGUI.EndChangeCheck() ) + { + CurrentSelectedInput = Mathf.Clamp( CurrentSelectedInput, 0, KeywordEnumAmount - 1 ); + UpdateLabels(); + } + EditorGUI.indentLevel++; + for( int i = 0; i < m_keywordEnumList.Length; i++ ) + { + EditorGUI.BeginChangeCheck(); + m_keywordEnumList[ i ] = EditorGUILayoutTextField( "Item " + i, m_keywordEnumList[ i ] ); + if( EditorGUI.EndChangeCheck() ) + { + m_keywordEnumList[ i ] = UIUtils.RemoveInvalidEnumCharacters( m_keywordEnumList[ i ] ); + m_keywordEnumList[ i ] = m_keywordEnumList[ i ].Replace( " ", "" ); // sad face :( does not support spaces + m_inputPorts[ i ].Name = m_keywordEnumList[ i ]; + m_defaultKeywordNames[ i ] = m_inputPorts[ i ].Name; + } + } + EditorGUI.indentLevel--; + } + + public void UpdateLabels() + { + int maxinputs = m_keywordModeType == KeywordModeType.KeywordEnum ? KeywordEnumAmount : 2; + KeywordEnumAmount = Mathf.Clamp( KeywordEnumAmount, 0, maxinputs ); + m_keywordEnumList = new string[ maxinputs ]; + + for( int i = 0; i < maxinputs; i++ ) + { + m_keywordEnumList[ i ] = m_defaultKeywordNames[ i ]; + m_inputPorts[ i ].Name = m_keywordEnumList[ i ]; + } + + if( m_keywordModeType != KeywordModeType.KeywordEnum ) + { + m_inputPorts[ 0 ].Name = "False"; + m_inputPorts[ 1 ].Name = "True"; + } + + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + m_inputPorts[ i ].Visible = ( i < maxinputs ); + } + m_sizeIsDirty = true; + m_isStaticSwitchDirty = true; + } + + void PropertyGroup() + { + EditorGUI.BeginChangeCheck(); + CurrentVarMode = (StaticSwitchVariableMode)EditorGUILayoutEnumPopup( ModeStr, CurrentVarMode ); + if( EditorGUI.EndChangeCheck() ) + { + if( CurrentVarMode == StaticSwitchVariableMode.Fetch ) + { + m_keywordModeType = KeywordModeType.Toggle; + UpdateLabels(); + } + + if( CurrentVarMode == StaticSwitchVariableMode.Reference ) + { + UIUtils.UnregisterPropertyNode( this ); + } + else + { + if( m_createToggle ) + UIUtils.RegisterPropertyNode( this ); + else + UIUtils.UnregisterPropertyNode( this ); + } + } + + if( CurrentVarMode == StaticSwitchVariableMode.Create ) + { + EditorGUI.BeginChangeCheck(); + m_multiCompile = EditorGUILayoutIntPopup( KeywordTypeStr, m_multiCompile, KeywordTypeList, KeywordTypeInt ); + if( EditorGUI.EndChangeCheck() ) + { + BeginPropertyFromInspectorCheck(); + } + } + else if( CurrentVarMode == StaticSwitchVariableMode.Reference ) + { + string[] arr = ContainerGraph.StaticSwitchNodes.NodesArr; + bool guiEnabledBuffer = GUI.enabled; + if( arr != null && arr.Length > 0 ) + { + GUI.enabled = true; + } + else + { + m_referenceArrayId = -1; + GUI.enabled = false; + } + + EditorGUI.BeginChangeCheck(); + m_referenceArrayId = EditorGUILayoutPopup( Constants.AvailableReferenceStr, m_referenceArrayId, arr ); + if( EditorGUI.EndChangeCheck() ) + { + m_reference = ContainerGraph.StaticSwitchNodes.GetNode( m_referenceArrayId ); + if( m_reference != null ) + { + m_referenceNodeId = m_reference.UniqueId; + CheckReferenceValues( true ); + } + else + { + m_referenceArrayId = -1; + m_referenceNodeId = -1; + } + } + GUI.enabled = guiEnabledBuffer; + + return; + } + + if( CurrentVarMode == StaticSwitchVariableMode.Create || m_createToggle ) + { + EditorGUI.BeginChangeCheck(); + m_keywordModeType = (KeywordModeType)EditorGUILayoutEnumPopup( TypeStr, m_keywordModeType ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateLabels(); + } + } + + if( m_keywordModeType != KeywordModeType.KeywordEnum ) + { + if( CurrentVarMode == StaticSwitchVariableMode.Create || m_createToggle ) + { + ShowPropertyInspectorNameGUI(); + ShowPropertyNameGUI( true ); + if( CurrentVarMode == StaticSwitchVariableMode.Create ) + { + EditorGUILayout.BeginHorizontal(); + bool guiEnabledBuffer = GUI.enabled; + GUI.enabled = !m_lockKeyword; + if( m_lockKeyword ) + EditorGUILayout.TextField( KeywordNameStr, GetPropertyValStr() ); + else + m_currentKeyword = EditorGUILayoutTextField( KeywordNameStr, m_currentKeyword ); + GUI.enabled = guiEnabledBuffer; + m_lockKeyword = GUILayout.Toggle( m_lockKeyword, ( m_lockKeyword ? UIUtils.LockIconOpen : UIUtils.LockIconClosed ), "minibutton", GUILayout.Width( 22 ) ); + EditorGUILayout.EndHorizontal(); + } + } + + } + else + { + if( CurrentVarMode == StaticSwitchVariableMode.Create || m_createToggle ) + { + ShowPropertyInspectorNameGUI(); + ShowPropertyNameGUI( true ); + DrawEnumList(); + } + + } + + if( CurrentVarMode == StaticSwitchVariableMode.Fetch ) + { + //ShowPropertyInspectorNameGUI(); + EditorGUI.BeginChangeCheck(); + m_currentKeywordId = EditorGUILayoutPopup( KeywordStr, m_currentKeywordId, UIUtils.AvailableKeywords ); + if( EditorGUI.EndChangeCheck() ) + { + if( m_currentKeywordId != 0 ) + { + m_currentKeyword = UIUtils.AvailableKeywords[ m_currentKeywordId ]; + } + } + + if( m_currentKeywordId == 0 ) + { + EditorGUI.BeginChangeCheck(); + m_currentKeyword = EditorGUILayoutTextField( CustomStr, m_currentKeyword ); + if( EditorGUI.EndChangeCheck() ) + { + m_currentKeyword = UIUtils.RemoveInvalidCharacters( m_currentKeyword ); + } + } + } + +#if UNITY_2019_1_OR_NEWER + m_isLocal = EditorGUILayoutToggle( IsLocalStr, m_isLocal ); +#endif + + //if( CurrentVarMode == StaticSwitchVariableMode.Create ) + { + ShowAutoRegister(); + } + + EditorGUI.BeginChangeCheck(); + m_createToggle = EditorGUILayoutToggle( MaterialToggleStr, m_createToggle ); + if( EditorGUI.EndChangeCheck() ) + { + if( m_createToggle ) + UIUtils.RegisterPropertyNode( this ); + else + UIUtils.UnregisterPropertyNode( this ); + } + + + if( m_createToggle ) + { + EditorGUILayout.BeginHorizontal(); + GUILayout.Space( 20 ); + m_propertyTab = GUILayout.Toolbar( m_propertyTab, LabelToolbarTitle ); + EditorGUILayout.EndHorizontal(); + switch( m_propertyTab ) + { + default: + case 0: + { + EditorGUI.BeginChangeCheck(); + if( m_keywordModeType != KeywordModeType.KeywordEnum ) + m_materialValue = EditorGUILayoutToggle( ToggleMaterialValueStr, m_materialValue == 1 ) ? 1 : 0; + else + m_materialValue = EditorGUILayoutPopup( ToggleMaterialValueStr, m_materialValue, m_keywordEnumList ); + if( EditorGUI.EndChangeCheck() ) + m_requireMaterialUpdate = true; + } + break; + case 1: + { + if( m_keywordModeType != KeywordModeType.KeywordEnum ) + m_defaultValue = EditorGUILayoutToggle( ToggleDefaultValueStr, m_defaultValue == 1 ) ? 1 : 0; + else + m_defaultValue = EditorGUILayoutPopup( ToggleDefaultValueStr, m_defaultValue, m_keywordEnumList ); + } + break; + } + } + + //EditorGUILayout.HelpBox( "Keyword Type:\n" + + // "The difference is that unused variants of \"Shader Feature\" shaders will not be included into game build while \"Multi Compile\" variants are included regardless of their usage.\n\n" + + // "So \"Shader Feature\" makes most sense for keywords that will be set on the materials, while \"Multi Compile\" for keywords that will be set from code globally.\n\n" + + // "You can set keywords using the material property using the \"Property Name\" or you can set the keyword directly using the \"Keyword Name\".", MessageType.None ); + } + + public override void CheckPropertyFromInspector( bool forceUpdate = false ) + { + if( m_propertyFromInspector ) + { + if( forceUpdate || ( EditorApplication.timeSinceStartup - m_propertyFromInspectorTimestamp ) > MaxTimestamp ) + { + m_propertyFromInspector = false; + RegisterPropertyName( true, m_propertyInspectorName, m_autoGlobalName, m_underscoredGlobal ); + m_propertyNameIsDirty = true; + + if( CurrentVarMode != StaticSwitchVariableMode.Reference ) + { + ContainerGraph.StaticSwitchNodes.UpdateDataOnNode( UniqueId, DataToArray ); + } + } + } + } + + public override void OnNodeLayout( DrawInfo drawInfo ) + { + float finalSize = 0; + if( m_keywordModeType == KeywordModeType.KeywordEnum ) + { + GUIContent dropdown = new GUIContent( m_inputPorts[ CurrentSelectedInput ].Name ); + int cacheSize = UIUtils.GraphDropDown.fontSize; + UIUtils.GraphDropDown.fontSize = 10; + Vector2 calcSize = UIUtils.GraphDropDown.CalcSize( dropdown ); + UIUtils.GraphDropDown.fontSize = cacheSize; + finalSize = Mathf.Clamp( calcSize.x, MinComboSize, MaxComboSize ); + if( m_insideSize.x != finalSize ) + { + m_insideSize.Set( finalSize, 25 ); + m_sizeIsDirty = true; + } + } + + base.OnNodeLayout( drawInfo ); + + if( m_keywordModeType != KeywordModeType.KeywordEnum ) + { + m_varRect = m_remainingBox; + m_varRect.size = Vector2.one * 22 * drawInfo.InvertedZoom; + m_varRect.center = m_remainingBox.center; + if( m_showPreview ) + m_varRect.y = m_remainingBox.y; + } + else + { + m_varRect = m_remainingBox; + m_varRect.width = finalSize * drawInfo.InvertedZoom; + m_varRect.height = 16 * drawInfo.InvertedZoom; + m_varRect.x = m_remainingBox.xMax - m_varRect.width; + m_varRect.y += 1 * drawInfo.InvertedZoom; + + m_imgRect = m_varRect; + m_imgRect.x = m_varRect.xMax - 16 * drawInfo.InvertedZoom; + m_imgRect.width = 16 * drawInfo.InvertedZoom; + m_imgRect.height = m_imgRect.width; + } + + CheckReferenceValues( false ); + + if( m_staticSwitchVarMode == StaticSwitchVariableMode.Reference ) + { + m_iconPos = m_globalPosition; + m_iconPos.width = InstanceIconWidth * drawInfo.InvertedZoom; + m_iconPos.height = InstanceIconHeight * drawInfo.InvertedZoom; + + m_iconPos.y += 10 * drawInfo.InvertedZoom; + m_iconPos.x += /*m_globalPosition.width - m_iconPos.width - */5 * drawInfo.InvertedZoom; + } + + } + + void CheckReferenceValues( bool forceUpdate ) + { + if( m_staticSwitchVarMode == StaticSwitchVariableMode.Reference ) + { + if( m_reference == null && m_referenceNodeId > 0 ) + { + m_reference = ContainerGraph.GetNode( m_referenceNodeId ) as StaticSwitch; + m_referenceArrayId = ContainerGraph.StaticSwitchNodes.GetNodeRegisterIdx( m_referenceNodeId ); + } + + if( m_reference != null ) + { + if( forceUpdate || m_reference.IsStaticSwitchDirty ) + { + int count = m_inputPorts.Count; + for( int i = 0; i < count; i++ ) + { + m_inputPorts[ i ].Name = m_reference.InputPorts[ i ].Name; + m_inputPorts[ i ].Visible = m_reference.InputPorts[ i ].Visible; + } + m_sizeIsDirty = true; + } + } + } + else + { + m_isStaticSwitchDirty = false; + } + } + + public override void DrawGUIControls( DrawInfo drawInfo ) + { + base.DrawGUIControls( drawInfo ); + + if( drawInfo.CurrentEventType != EventType.MouseDown || !m_createToggle ) + return; + + if( m_varRect.Contains( drawInfo.MousePosition ) ) + { + m_editing = true; + } + else if( m_editing ) + { + m_editing = false; + } + } + + private int CurrentSelectedInput + { + get + { + return m_materialMode ? m_materialValue : m_defaultValue; + } + set + { + if( m_materialMode ) + m_materialValue = value; + else + m_defaultValue = value; + } + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + if( m_staticSwitchVarMode == StaticSwitchVariableMode.Reference ) + return; + + if( m_editing ) + { + if( m_keywordModeType != KeywordModeType.KeywordEnum ) + { + if( GUI.Button( m_varRect, GUIContent.none, UIUtils.GraphButton ) ) + { + CurrentSelectedInput = CurrentSelectedInput == 1 ? 0 : 1; + PreviewIsDirty = true; + m_editing = false; + if( m_materialMode ) + m_requireMaterialUpdate = true; + } + + if( CurrentSelectedInput == 1 ) + { + GUI.Label( m_varRect, m_checkContent, UIUtils.GraphButtonIcon ); + } + } + else + { + EditorGUI.BeginChangeCheck(); + CurrentSelectedInput = EditorGUIPopup( m_varRect, CurrentSelectedInput, m_keywordEnumList, UIUtils.GraphDropDown ); + if( EditorGUI.EndChangeCheck() ) + { + PreviewIsDirty = true; + m_editing = false; + if( m_materialMode ) + m_requireMaterialUpdate = true; + } + } + } + } + + public override void OnNodeRepaint( DrawInfo drawInfo ) + { + base.OnNodeRepaint( drawInfo ); + + if( !m_isVisible ) + return; + + if( m_staticSwitchVarMode == StaticSwitchVariableMode.Reference ) + { + GUI.Label( m_iconPos, string.Empty, UIUtils.GetCustomStyle( CustomStyle.SamplerTextureIcon ) ); + return; + } + + if( m_createToggle && ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD2 ) + { + if( !m_editing ) + { + if( m_keywordModeType != KeywordModeType.KeywordEnum ) + { + GUI.Label( m_varRect, GUIContent.none, UIUtils.GraphButton ); + + if( CurrentSelectedInput == 1 ) + GUI.Label( m_varRect, m_checkContent, UIUtils.GraphButtonIcon ); + } + else + { + GUI.Label( m_varRect, m_keywordEnumList[ CurrentSelectedInput ], UIUtils.GraphDropDown ); + GUI.Label( m_imgRect, m_popContent, UIUtils.GraphButtonIcon ); + } + } + } + } + + private string OnOffStr + { + get + { + if( !m_lockKeyword ) + return string.Empty; + + StaticSwitch node = null; + switch( CurrentVarMode ) + { + default: + case StaticSwitchVariableMode.Create: + case StaticSwitchVariableMode.Fetch: + node = this; + break; + case StaticSwitchVariableMode.Reference: + { + node = ( m_reference != null ) ? m_reference : this; + } + break; + } + + if( !node.CreateToggle ) + return string.Empty; + + switch( node.KeywordModeTypeValue ) + { + default: + case KeywordModeType.Toggle: + return "_ON"; + case KeywordModeType.ToggleOff: + return "_OFF"; + } + } + } + string GetStaticSwitchType() + { + string staticSwitchType = ( m_multiCompile == 1 ) ? "multi_compile" : "shader_feature"; +#if UNITY_2019_1_OR_NEWER + if( m_isLocal ) + staticSwitchType += "_local"; +#endif + return staticSwitchType; + } + + void RegisterPragmas( ref MasterNodeDataCollector dataCollector ) + { + if( CurrentVarMode == StaticSwitchVariableMode.Create ) + { + string staticSwitchType = GetStaticSwitchType(); + if( m_keywordModeType == KeywordModeType.KeywordEnum ) + { + if( m_multiCompile == 1 ) + dataCollector.AddToPragmas( UniqueId, staticSwitchType + " " + GetKeywordEnumPragmaList() ); + else if( m_multiCompile == 0 ) + dataCollector.AddToPragmas( UniqueId, staticSwitchType + " " + GetKeywordEnumPragmaList() ); + } + else + { + if( m_multiCompile == 1 ) + dataCollector.AddToPragmas( UniqueId, staticSwitchType + " __ " + CurrentKeyword ); + else if( m_multiCompile == 0 ) + dataCollector.AddToPragmas( UniqueId, staticSwitchType + " " + CurrentKeyword ); + } + } + } + + protected override void RegisterProperty( ref MasterNodeDataCollector dataCollector ) + { + if( m_staticSwitchVarMode == StaticSwitchVariableMode.Reference && m_reference != null ) + { + m_reference.RegisterProperty( ref dataCollector ); + m_reference.RegisterPragmas( ref dataCollector ); + } + else + { + if( m_createToggle ) + base.RegisterProperty( ref dataCollector ); + + RegisterPragmas( ref dataCollector ); + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + + StaticSwitch node = ( m_staticSwitchVarMode == StaticSwitchVariableMode.Reference && m_reference != null ) ? m_reference : this; + + this.OrderIndex = node.RawOrderIndex; + this.OrderIndexOffset = node.OrderIndexOffset; + //if( m_keywordModeType == KeywordModeType.KeywordEnum ) + + //node.RegisterPragmas( ref dataCollector ); + + string outType = UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, m_outputPorts[ 0 ].DataType ); + + if( node.KeywordModeTypeValue == KeywordModeType.KeywordEnum ) + { + string defaultKey = "\t" + outType + " staticSwitch" + OutputId + " = " + m_inputPorts[ node.DefaultValue ].GeneratePortInstructions( ref dataCollector ) + ";"; + + string[] allOutputs = new string[ node.KeywordEnumAmount ]; + for( int i = 0; i < node.KeywordEnumAmount; i++ ) + allOutputs[ i ] = m_inputPorts[ i ].GeneratePortInstructions( ref dataCollector ); + + for( int i = 0; i < node.KeywordEnumAmount; i++ ) + { + string keyword = node.KeywordEnum( i ); + if( i == 0 ) + dataCollector.AddLocalVariable( UniqueId, "#if defined(" + keyword + ")", true ); + else + dataCollector.AddLocalVariable( UniqueId, "#elif defined(" + keyword + ")", true ); + + if( node.DefaultValue == i ) + dataCollector.AddLocalVariable( UniqueId, defaultKey, true ); + else + dataCollector.AddLocalVariable( UniqueId, "\t" + outType + " staticSwitch" + OutputId + " = " + allOutputs[ i ] + ";", true ); + } + dataCollector.AddLocalVariable( UniqueId, "#else", true ); + dataCollector.AddLocalVariable( UniqueId, defaultKey, true ); + dataCollector.AddLocalVariable( UniqueId, "#endif", true ); + } + else + { + string falseCode = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string trueCode = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + + //if( node.CurrentVarMode == StaticSwitchVariableMode.Fetch ) + dataCollector.AddLocalVariable( UniqueId, "#ifdef " + node.CurrentKeyword, true ); + //else + // dataCollector.AddLocalVariable( UniqueId, "#ifdef " + node.PropertyName + OnOffStr, true ); + dataCollector.AddLocalVariable( UniqueId, "\t" + outType + " staticSwitch" + OutputId + " = " + trueCode + ";", true ); + dataCollector.AddLocalVariable( UniqueId, "#else", true ); + dataCollector.AddLocalVariable( UniqueId, "\t" + outType + " staticSwitch" + OutputId + " = " + falseCode + ";", true ); + dataCollector.AddLocalVariable( UniqueId, "#endif", true ); + } + + m_outputPorts[ 0 ].SetLocalValue( "staticSwitch" + OutputId, dataCollector.PortCategory ); + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + + public override void DrawTitle( Rect titlePos ) + { + bool referenceMode = m_staticSwitchVarMode == StaticSwitchVariableMode.Reference && m_reference != null; + string subTitle = string.Empty; + string subTitleFormat = string.Empty; + if( referenceMode ) + { + subTitle = m_reference.GetPropertyValStr(); + subTitleFormat = Constants.SubTitleRefNameFormatStr; + } + else + { + subTitle = GetPropertyValStr(); + subTitleFormat = Constants.SubTitleVarNameFormatStr; + } + + SetAdditonalTitleTextOnCallback( subTitle, ( instance, newSubTitle ) => instance.AdditonalTitleContent.text = string.Format( subTitleFormat, newSubTitle ) ); + + if( !m_isEditing && ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD3 ) + { + GUI.Label( titlePos, StaticSwitchStr, UIUtils.GetCustomStyle( CustomStyle.NodeTitle ) ); + } + } + + public override void UpdateMaterial( Material mat ) + { + base.UpdateMaterial( mat ); + if( UIUtils.IsProperty( m_currentParameterType ) && !InsideShaderFunction ) + { + if( m_keywordModeType == KeywordModeType.KeywordEnum ) + { + for( int i = 0; i < m_keywordEnumAmount; i++ ) + { + string key = KeywordEnum( i ); + mat.DisableKeyword( key ); + } + mat.EnableKeyword( KeywordEnum( m_materialValue )); + mat.SetFloat( m_propertyName, m_materialValue ); + } + else + { + int final = m_materialValue; + if( m_keywordModeType == KeywordModeType.ToggleOff ) + final = final == 1 ? 0 : 1; + mat.SetFloat( m_propertyName, m_materialValue ); + if( final == 1 ) + mat.EnableKeyword( GetPropertyValStr() ); + else + mat.DisableKeyword( GetPropertyValStr() ); + } + } + } + + public override void SetMaterialMode( Material mat, bool fetchMaterialValues ) + { + base.SetMaterialMode( mat, fetchMaterialValues ); + if( fetchMaterialValues && m_materialMode && UIUtils.IsProperty( m_currentParameterType ) && mat.HasProperty( m_propertyName ) ) + { + m_materialValue = mat.GetInt( m_propertyName ); + } + } + + public override void ForceUpdateFromMaterial( Material material ) + { + if( UIUtils.IsProperty( m_currentParameterType ) && material.HasProperty( m_propertyName ) ) + { + m_materialValue = material.GetInt( m_propertyName ); + PreviewIsDirty = true; + } + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_multiCompile = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > 14403 ) + { + m_defaultValue = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > 14101 ) + { + m_materialValue = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + } + else + { + m_defaultValue = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ) ? 1 : 0; + if( UIUtils.CurrentShaderVersion() > 14101 ) + { + m_materialValue = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ) ? 1 : 0; + } + } + + if( UIUtils.CurrentShaderVersion() > 13104 ) + { + m_createToggle = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + m_currentKeyword = GetCurrentParam( ref nodeParams ); + m_currentKeywordId = UIUtils.GetKeywordId( m_currentKeyword ); + } + if( UIUtils.CurrentShaderVersion() > 14001 ) + { + m_keywordModeType = (KeywordModeType)Enum.Parse( typeof( KeywordModeType ), GetCurrentParam( ref nodeParams ) ); + } + + if( UIUtils.CurrentShaderVersion() > 14403 ) + { + KeywordEnumAmount = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + for( int i = 0; i < KeywordEnumAmount; i++ ) + { + m_defaultKeywordNames[ i ] = GetCurrentParam( ref nodeParams ); + } + + UpdateLabels(); + } + + if( UIUtils.CurrentShaderVersion() > 16304 ) + { + string currentVarMode = GetCurrentParam( ref nodeParams ); + CurrentVarMode = (StaticSwitchVariableMode)Enum.Parse( typeof( StaticSwitchVariableMode ), currentVarMode ); + if( CurrentVarMode == StaticSwitchVariableMode.Reference ) + { + m_referenceNodeId = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + } + else + { + CurrentVarMode = (StaticSwitchVariableMode)m_variableMode; + //Resetting m_variableMode to its default value since it will no longer be used and interfere released ransom properties behavior + m_variableMode = VariableMode.Create; + } + + if( CurrentVarMode == StaticSwitchVariableMode.Reference ) + { + UIUtils.UnregisterPropertyNode( this ); + } + else + { + if( m_createToggle ) + UIUtils.RegisterPropertyNode( this ); + else + UIUtils.UnregisterPropertyNode( this ); + } + + if( UIUtils.CurrentShaderVersion() > 16700 ) + { + m_isLocal = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + + if( UIUtils.CurrentShaderVersion() > 18401 ) + m_lockKeyword = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + + SetMaterialToggleRetrocompatibility(); + + if( !m_isNodeBeingCopied && CurrentVarMode != StaticSwitchVariableMode.Reference ) + { + ContainerGraph.StaticSwitchNodes.UpdateDataOnNode( UniqueId, DataToArray ); + } + } + + public override void ReleaseRansomedProperty() + { + //on old ASE, the property node m_variableMode was used on defining the static switch type, now we have a specific m_staticSwitchVarMode over here + //the problem with this is the fix made to release ransomend property names( hash deb232819fff0f1aeaf029a21c55ef597b3424de ) uses m_variableMode and + //makes old static switches to attempt and register an already registered name when doing this: + //CurrentVariableMode = VariableMode.Create; + //So we need to disable this release ransom property behavior as m_variableMode should never be on VariableMode.Create + //The m_variableMode is set to its default value over the ReadFromString method after its value as been set over the new m_staticSwitchVarMode variable + } + + void SetMaterialToggleRetrocompatibility() + { + if( UIUtils.CurrentShaderVersion() < 17108 ) + { + if( !m_createToggle && m_staticSwitchVarMode == StaticSwitchVariableMode.Create ) + { + if( m_keywordModeType != KeywordModeType.KeywordEnum ) + { + m_propertyName = m_propertyName.ToUpper() + "_ON"; + } + else + { + m_propertyName = m_propertyName.ToUpper(); + for( int i = 0; i < m_keywordEnumList.Length; i++ ) + { + m_keywordEnumList[ i ] = "_" + m_keywordEnumList[ i ].ToUpper(); + } + } + m_autoGlobalName = false; + } + } + } + + public override void ReadFromDeprecated( ref string[] nodeParams, Type oldType = null ) + { + base.ReadFromDeprecated( ref nodeParams, oldType ); + { + m_currentKeyword = GetCurrentParam( ref nodeParams ); + m_currentKeywordId = UIUtils.GetKeywordId( m_currentKeyword ); + m_createToggle = false; + m_keywordModeType = KeywordModeType.Toggle; + m_variableMode = VariableMode.Fetch; + CurrentVarMode = StaticSwitchVariableMode.Fetch; + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_multiCompile ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_defaultValue ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_materialValue ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_createToggle ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_currentKeyword ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_keywordModeType ); + IOUtils.AddFieldValueToString( ref nodeInfo, KeywordEnumAmount ); + for( int i = 0; i < KeywordEnumAmount; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_keywordEnumList[ i ] ); + } + + IOUtils.AddFieldValueToString( ref nodeInfo, CurrentVarMode ); + if( CurrentVarMode == StaticSwitchVariableMode.Reference ) + { + int referenceId = ( m_reference != null ) ? m_reference.UniqueId : -1; + IOUtils.AddFieldValueToString( ref nodeInfo, referenceId ); + } + IOUtils.AddFieldValueToString( ref nodeInfo, m_isLocal ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_lockKeyword ); + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + CheckReferenceValues( true ); + } + + StaticSwitchVariableMode CurrentVarMode + { + get { return m_staticSwitchVarMode; } + set + { + if( m_staticSwitchVarMode != value ) + { + if( value == StaticSwitchVariableMode.Reference ) + { + ContainerGraph.StaticSwitchNodes.RemoveNode( this ); + m_referenceArrayId = -1; + m_referenceNodeId = -1; + m_reference = null; + m_headerColorModifier = ReferenceHeaderColor; + } + else + { + m_headerColorModifier = Color.white; + ContainerGraph.StaticSwitchNodes.AddNode( this ); + UpdateLabels(); + } + } + m_staticSwitchVarMode = value; + } + } + public bool IsStaticSwitchDirty { get { return m_isStaticSwitchDirty; } } + public KeywordModeType KeywordModeTypeValue { get { return m_keywordModeType; } } + public int DefaultValue { get { return m_defaultValue; } } + public int MaterialValue { get { return m_materialValue; } } + //public string CurrentKeyword { get { return m_currentKeyword; } } + public string CurrentKeyword + { + get + { + if( CurrentVarMode == StaticSwitchVariableMode.Fetch ) + return m_currentKeyword; + + return ( m_lockKeyword || string.IsNullOrEmpty( m_currentKeyword ) ? PropertyName + OnOffStr : m_currentKeyword ); + } + } + public bool CreateToggle { get { return m_createToggle; } } + + public int KeywordEnumAmount + { + get + { + return m_keywordEnumAmount; + } + set + { + m_keywordEnumAmount = value; + m_defaultValue = Mathf.Clamp( m_defaultValue, 0, m_keywordEnumAmount - 1 ); + m_materialValue = Mathf.Clamp( m_defaultValue, 0, m_keywordEnumAmount - 1 ); + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/StaticSwitch.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/StaticSwitch.cs.meta new file mode 100644 index 0000000..e1b216a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/StaticSwitch.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b1d1a233ea65ccd478fb6caf4327da48 +timeCreated: 1497289190 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/TauNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/TauNode.cs new file mode 100644 index 0000000..4901dbb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/TauNode.cs @@ -0,0 +1,32 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +// +// Custom Node TAU +// Donated by The Four Headed Cat - @fourheadedcat + +using UnityEngine; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Tau", "Constants And Properties", "Tau constant (2*PI): 6.28318530718", null, KeyCode.None, true, false, null,null, "The Four Headed Cat - @fourheadedcat" )] + public sealed class TauNode : ParentNode + { + private readonly string Tau = ( 2.0 * Mathf.PI ).ToString(); + public TauNode() : base() { } + public TauNode( int uniqueId, float x, float y, float width, float height ) : base( uniqueId, x, y, width, height ) { } + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + m_previewShaderGUID = "701bc295c0d75d8429eabcf45e8e008d"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + return dataCollector.IsSRP? "TWO_PI": Tau; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/TauNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/TauNode.cs.meta new file mode 100644 index 0000000..96b9694 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/TauNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1a6ded4f5e42f6d4684a6131a3cf4d33 +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/TextureArrayNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/TextureArrayNode.cs new file mode 100644 index 0000000..36ae3e1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/TextureArrayNode.cs @@ -0,0 +1,990 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + //[NodeAttributes( "Texture Array", "Textures", "Texture Array fetches a texture from a texture2DArray asset file given a index value", KeyCode.None, true, 0, int.MaxValue, typeof( Texture2DArray ) )] + [NodeAttributes( "[Old]Texture Array", "Textures", "Texture Array fetches a texture from a texture2DArray asset file given a index value", null, KeyCode.None, true, true, "SamplerNode", typeof( SamplerNode ) )] + public class TextureArrayNode : PropertyNode + { + [SerializeField] + private Texture2DArray m_defaultTextureArray; + + [SerializeField] + private Texture2DArray m_materialTextureArray; + + [SerializeField] + private TexReferenceType m_referenceType = TexReferenceType.Object; + + [SerializeField] + private int m_uvSet = 0; + + [SerializeField] + private MipType m_mipMode = MipType.Auto; + + private readonly string[] m_mipOptions = { "Auto", "Mip Level", "Derivative" }; + + private TextureArrayNode m_referenceSampler = null; + + [SerializeField] + private int m_referenceArrayId = -1; + + [SerializeField] + private int m_referenceNodeId = -1; + + [SerializeField] + private bool m_autoUnpackNormals = false; + + private InputPort m_texPort; + private InputPort m_uvPort; + private InputPort m_indexPort; + private InputPort m_lodPort; + private InputPort m_normalPort; + private InputPort m_ddxPort; + private InputPort m_ddyPort; + + private OutputPort m_colorPort; + + private const string AutoUnpackNormalsStr = "Normal"; + private const string NormalScaleStr = "Scale"; + + private string m_labelText = "None (Texture2DArray)"; + + private readonly Color ReferenceHeaderColor = new Color( 2.66f, 1.02f, 0.6f, 1.0f ); + + private int m_cachedUvsId = -1; + private int m_cachedSamplerId = -1; + private int m_texConnectedId = -1; + private int m_cachedUnpackId = -1; + private int m_cachedLodId = -1; + + private Rect m_iconPos; + private bool m_isEditingPicker; + + private bool m_linearTexture; + protected bool m_drawPicker; + + private ReferenceState m_state = ReferenceState.Self; + private ParentNode m_previewTextProp = null; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddOutputColorPorts( "RGBA" ); + m_colorPort = m_outputPorts[ 0 ]; + AddInputPort( WirePortDataType.SAMPLER2D, false, "Tex", -1, MasterNodePortCategory.Fragment, 6 ); + AddInputPort( WirePortDataType.FLOAT2, false, "UV", -1, MasterNodePortCategory.Fragment, 0 ); + AddInputPort( WirePortDataType.FLOAT, false, "Index", -1, MasterNodePortCategory.Fragment, 1 ); + AddInputPort( WirePortDataType.FLOAT, false, "Level", -1, MasterNodePortCategory.Fragment, 2 ); + AddInputPort( WirePortDataType.FLOAT, false, NormalScaleStr, -1, MasterNodePortCategory.Fragment, 3 ); + AddInputPort( WirePortDataType.FLOAT2, false, "DDX", -1, MasterNodePortCategory.Fragment, 4 ); + AddInputPort( WirePortDataType.FLOAT2, false, "DDY", -1, MasterNodePortCategory.Fragment, 5 ); + m_inputPorts[ 2 ].AutoDrawInternalData = true; + + m_texPort = m_inputPorts[ 0 ]; + m_uvPort = m_inputPorts[ 1 ]; + m_indexPort = m_inputPorts[ 2 ]; + m_lodPort = m_inputPorts[ 3 ]; + + m_lodPort.Visible = false; + m_normalPort = m_inputPorts[ 4 ]; + m_normalPort.Visible = m_autoUnpackNormals; + m_normalPort.FloatInternalData = 1.0f; + m_ddxPort = m_inputPorts[ 5 ]; + m_ddxPort.Visible = false; + m_ddyPort = m_inputPorts[ 6 ]; + m_ddyPort.Visible = false; + m_insideSize.Set( 128, 128 + 5 ); + m_drawPrecisionUI = false; + m_currentParameterType = PropertyType.Property; + + m_availableAttribs.Add( new PropertyAttributes( "No Scale Offset", "[NoScaleOffset]" ) ); + + m_freeType = false; + m_showPreview = true; + m_drawPreviewExpander = false; + m_drawPreview = false; + m_drawPicker = true; + m_customPrefix = "Texture Array "; + m_selectedLocation = PreviewLocation.TopCenter; + m_previewShaderGUID = "2e6d093df2d289f47b827b36efb31a81"; + m_showAutoRegisterUI = false; + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + if( m_cachedUvsId == -1 ) + m_cachedUvsId = Shader.PropertyToID( "_CustomUVs" ); + + if( m_cachedSamplerId == -1 ) + m_cachedSamplerId = Shader.PropertyToID( "_Sampler" ); + + if( m_texConnectedId == -1 ) + m_texConnectedId = Shader.PropertyToID( "_TexConnected" ); + + if( m_cachedUnpackId == -1 ) + m_cachedUnpackId = Shader.PropertyToID( "_Unpack" ); + + if( m_cachedLodId == -1 ) + m_cachedLodId = Shader.PropertyToID( "_LodType" ); + + PreviewMaterial.SetFloat( m_cachedLodId, ( m_mipMode == MipType.MipLevel ? 1 : 0 ) ); + PreviewMaterial.SetFloat( m_cachedUnpackId, m_autoUnpackNormals ? 1 : 0 ); + if( m_referenceType == TexReferenceType.Instance && m_referenceSampler != null ) + { + if( (ParentNode)m_referenceSampler != m_referenceSampler.PreviewTextProp ) + { + PreviewMaterial.SetInt( m_texConnectedId, 1 ); + PreviewMaterial.SetTexture( "_G", m_referenceSampler.PreviewTextProp.PreviewTexture ); + } + else + { + PreviewMaterial.SetInt( m_texConnectedId, 0 ); + PreviewMaterial.SetTexture( m_cachedSamplerId, m_referenceSampler.TextureArray ); + } + } + else if( m_texPort.IsConnected ) + { + PreviewMaterial.SetInt( m_texConnectedId, 1 ); + } + else + { + PreviewMaterial.SetInt( m_texConnectedId, 0 ); + PreviewMaterial.SetTexture( m_cachedSamplerId, TextureArray ); + } + PreviewMaterial.SetFloat( m_cachedUvsId, ( m_uvPort.IsConnected ? 1 : 0 ) ); + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + if( m_referenceType == TexReferenceType.Object ) + { + UIUtils.RegisterTextureArrayNode( this ); + UIUtils.RegisterPropertyNode( this ); + } + + if( UniqueId > -1 ) + ContainerGraph.TextureArrayNodes.OnReorderEventComplete += OnReorderEventComplete; + + } + + private void OnReorderEventComplete() + { + if( m_referenceType == TexReferenceType.Instance && m_referenceSampler != null ) + { + m_referenceArrayId = ContainerGraph.TextureArrayNodes.GetNodeRegisterIdx( m_referenceSampler.UniqueId ); + } + } + + new void ShowDefaults() + { + m_uvSet = EditorGUILayoutIntPopup( Constants.AvailableUVSetsLabel, m_uvSet, Constants.AvailableUVSetsStr, Constants.AvailableUVSets ); + + MipType newMipMode = (MipType)EditorGUILayoutPopup( "Mip Mode", (int)m_mipMode, m_mipOptions ); + if( newMipMode != m_mipMode ) + { + m_mipMode = newMipMode; + } + + switch( m_mipMode ) + { + case MipType.Auto: + m_lodPort.Visible = false; + m_ddxPort.Visible = false; + m_ddyPort.Visible = false; + break; + case MipType.MipLevel: + m_lodPort.Visible = true; + m_ddxPort.Visible = false; + m_ddyPort.Visible = false; + break; + case MipType.MipBias: + case MipType.Derivative: + m_ddxPort.Visible = true; + m_ddyPort.Visible = true; + m_lodPort.Visible = false; + break; + } + + if( m_ddxPort.Visible ) + { + EditorGUILayout.HelpBox( "Warning: Derivative Mip Mode only works on some platforms (D3D11 XBOXONE GLES3 GLCORE)", MessageType.Warning ); + } + + if( !m_lodPort.IsConnected && m_lodPort.Visible ) + { + m_lodPort.FloatInternalData = EditorGUILayoutFloatField( "Mip Level", m_lodPort.FloatInternalData ); + } + + if( !m_indexPort.IsConnected ) + { + m_indexPort.FloatInternalData = EditorGUILayoutFloatField( "Index", m_indexPort.FloatInternalData ); + } + + + } + + public override void DrawMainPropertyBlock() + { + EditorGUI.BeginChangeCheck(); + m_referenceType = (TexReferenceType)EditorGUILayoutPopup( Constants.ReferenceTypeStr, (int)m_referenceType, Constants.ReferenceArrayLabels ); + if( EditorGUI.EndChangeCheck() ) + { + if( m_referenceType == TexReferenceType.Object ) + { + UIUtils.RegisterTextureArrayNode( this ); + UIUtils.RegisterPropertyNode( this ); + + SetTitleText( m_propertyInspectorName ); + SetAdditonalTitleText( string.Format( Constants.PropertyValueLabel, GetPropertyValStr() ) ); + m_referenceArrayId = -1; + m_referenceNodeId = -1; + m_referenceSampler = null; + } + else + { + UIUtils.UnregisterTextureArrayNode( this ); + UIUtils.UnregisterPropertyNode( this ); + } + UpdateHeaderColor(); + } + + if( m_referenceType == TexReferenceType.Object ) + { + EditorGUI.BeginChangeCheck(); + base.DrawMainPropertyBlock(); + if( EditorGUI.EndChangeCheck() ) + { + OnPropertyNameChanged(); + } + } + else + { + string[] arr = UIUtils.TextureArrayNodeArr(); + bool guiEnabledBuffer = GUI.enabled; + if( arr != null && arr.Length > 0 ) + { + GUI.enabled = true; + } + else + { + m_referenceArrayId = -1; + GUI.enabled = false; + } + + m_referenceArrayId = EditorGUILayoutPopup( Constants.AvailableReferenceStr, m_referenceArrayId, arr ); + GUI.enabled = guiEnabledBuffer; + + ShowDefaults(); + + DrawSamplerOptions(); + } + } + + public override void OnPropertyNameChanged() + { + base.OnPropertyNameChanged(); + UIUtils.UpdateTextureArrayDataNode( UniqueId, PropertyInspectorName ); + } + + public override void DrawSubProperties() + { + ShowDefaults(); + + DrawSamplerOptions(); + + EditorGUI.BeginChangeCheck(); + m_defaultTextureArray = EditorGUILayoutObjectField( Constants.DefaultValueLabel, m_defaultTextureArray, typeof( Texture2DArray ), false ) as Texture2DArray; + if( EditorGUI.EndChangeCheck() ) + { + CheckTextureImporter( true ); + SetAdditonalTitleText( string.Format( Constants.PropertyValueLabel, GetPropertyValStr() ) ); + } + } + + public override void DrawMaterialProperties() + { + ShowDefaults(); + + DrawSamplerOptions(); + + EditorGUI.BeginChangeCheck(); + m_materialTextureArray = EditorGUILayoutObjectField( Constants.MaterialValueLabel, m_materialTextureArray, typeof( Texture2DArray ), false ) as Texture2DArray; + if( EditorGUI.EndChangeCheck() ) + { + CheckTextureImporter( true ); + SetAdditonalTitleText( string.Format( Constants.PropertyValueLabel, GetPropertyValStr() ) ); + m_requireMaterialUpdate = true; + } + } + + public void DrawSamplerOptions() + { + EditorGUI.BeginChangeCheck(); + bool autoUnpackNormals = EditorGUILayoutToggle( "Normal Map", m_autoUnpackNormals ); + if( EditorGUI.EndChangeCheck() ) + { + if( m_autoUnpackNormals != autoUnpackNormals ) + { + AutoUnpackNormals = autoUnpackNormals; + + ConfigureInputPorts(); + ConfigureOutputPorts(); + } + } + + if( m_autoUnpackNormals && !m_normalPort.IsConnected ) + { + m_normalPort.FloatInternalData = EditorGUILayoutFloatField( NormalScaleStr, m_normalPort.FloatInternalData ); + } + } + + public void ConfigureInputPorts() + { + m_normalPort.Visible = AutoUnpackNormals; + + m_sizeIsDirty = true; + } + + public void ConfigureOutputPorts() + { + m_outputPorts[ m_colorPort.PortId + 4 ].Visible = !AutoUnpackNormals; + + if( !AutoUnpackNormals ) + { + m_colorPort.ChangeProperties( "RGBA", WirePortDataType.FLOAT4, false ); + m_outputPorts[ m_colorPort.PortId + 1 ].ChangeProperties( "R", WirePortDataType.FLOAT, false ); + m_outputPorts[ m_colorPort.PortId + 2 ].ChangeProperties( "G", WirePortDataType.FLOAT, false ); + m_outputPorts[ m_colorPort.PortId + 3 ].ChangeProperties( "B", WirePortDataType.FLOAT, false ); + m_outputPorts[ m_colorPort.PortId + 4 ].ChangeProperties( "A", WirePortDataType.FLOAT, false ); + + } + else + { + m_colorPort.ChangeProperties( "XYZ", WirePortDataType.FLOAT3, false ); + m_outputPorts[ m_colorPort.PortId + 1 ].ChangeProperties( "X", WirePortDataType.FLOAT, false ); + m_outputPorts[ m_colorPort.PortId + 2 ].ChangeProperties( "Y", WirePortDataType.FLOAT, false ); + m_outputPorts[ m_colorPort.PortId + 3 ].ChangeProperties( "Z", WirePortDataType.FLOAT, false ); + } + + m_sizeIsDirty = true; + } + + public virtual void CheckTextureImporter( bool additionalCheck ) + { + m_requireMaterialUpdate = true; + Texture2DArray texture = m_materialMode ? m_materialTextureArray : m_defaultTextureArray; + + UnityEngine.Object obj = AssetDatabase.LoadAssetAtPath( AssetDatabase.GetAssetPath( texture ), typeof( UnityEngine.Object ) ); + + if( obj != null ) + { + SerializedObject serializedObject = new UnityEditor.SerializedObject( obj ); + + if( serializedObject != null ) + { + SerializedProperty colorSpace = serializedObject.FindProperty( "m_ColorSpace" ); + m_linearTexture = ( colorSpace.intValue == 0 ); + } + } + } + + void UpdateHeaderColor() + { + m_headerColorModifier = ( m_referenceType == TexReferenceType.Object ) ? Color.white : ReferenceHeaderColor; + } + + public override void DrawGUIControls( DrawInfo drawInfo ) + { + base.DrawGUIControls( drawInfo ); + + if( !( drawInfo.CurrentEventType == EventType.MouseDown || drawInfo.CurrentEventType == EventType.MouseUp || drawInfo.CurrentEventType == EventType.ExecuteCommand || drawInfo.CurrentEventType == EventType.DragPerform ) ) + return; + + bool insideBox = m_previewRect.Contains( drawInfo.MousePosition ); + + if( insideBox ) + { + m_isEditingPicker = true; + } + else if( m_isEditingPicker && !insideBox && drawInfo.CurrentEventType != EventType.ExecuteCommand ) + { + GUI.FocusControl( null ); + m_isEditingPicker = false; + } + + if( m_state != ReferenceState.Self && drawInfo.CurrentEventType == EventType.MouseDown && m_previewRect.Contains( drawInfo.MousePosition ) ) + { + UIUtils.FocusOnNode( m_previewTextProp, 1, true ); + Event.current.Use(); + } + } + + public override void OnNodeLayout( DrawInfo drawInfo ) + { + base.OnNodeLayout( drawInfo ); + + if( m_drawPreview ) + { + m_iconPos = m_globalPosition; + m_iconPos.width = 19 * drawInfo.InvertedZoom; + m_iconPos.height = 19 * drawInfo.InvertedZoom; + + m_iconPos.y += 10 * drawInfo.InvertedZoom; + m_iconPos.x += m_globalPosition.width - m_iconPos.width - 5 * drawInfo.InvertedZoom; + } + + bool instanced = CheckReference(); + if( instanced ) + { + m_state = ReferenceState.Instance; + m_previewTextProp = m_referenceSampler; + } + else if( m_texPort.IsConnected ) + { + m_state = ReferenceState.Connected; + m_previewTextProp = m_texPort.GetOutputNode( 0 ) as ParentNode; + } + else + { + m_state = ReferenceState.Self; + m_previewTextProp = this; + } + + if( m_previewTextProp == null ) + m_previewTextProp = this; + + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + if( m_isEditingPicker && m_drawPicker ) + { + Rect hitRect = m_previewRect; + hitRect.height = 14 * drawInfo.InvertedZoom; + hitRect.y = m_previewRect.yMax - hitRect.height; + hitRect.width = 4 * 14 * drawInfo.InvertedZoom; + + bool restoreMouse = false; + if( Event.current.type == EventType.MouseDown && hitRect.Contains( drawInfo.MousePosition ) ) + { + restoreMouse = true; + Event.current.type = EventType.Ignore; + } + + EditorGUI.BeginChangeCheck(); + m_colorBuffer = GUI.color; + GUI.color = Color.clear; + if( m_materialMode ) + m_materialTextureArray = EditorGUIObjectField( m_previewRect, m_materialTextureArray, typeof( Texture2DArray ), false ) as Texture2DArray; + else + m_defaultTextureArray = EditorGUIObjectField( m_previewRect, m_defaultTextureArray, typeof( Texture2DArray ), false ) as Texture2DArray; + GUI.color = m_colorBuffer; + + if( EditorGUI.EndChangeCheck() ) + { + PreviewIsDirty = true; + CheckTextureImporter( true ); + SetTitleText( PropertyInspectorName ); + SetAdditonalTitleText( string.Format( Constants.PropertyValueLabel, GetPropertyValStr() ) ); + ConfigureInputPorts(); + ConfigureOutputPorts(); + BeginDelayedDirtyProperty(); + m_requireMaterialUpdate = true; + } + + if( restoreMouse ) + { + Event.current.type = EventType.MouseDown; + } + + if( ( drawInfo.CurrentEventType == EventType.MouseDown || drawInfo.CurrentEventType == EventType.MouseUp ) ) + DrawPreviewMaskButtonsLayout( drawInfo, m_previewRect ); + } + + if( drawInfo.CurrentEventType != EventType.Repaint ) + return; + + switch( m_state ) + { + default: + case ReferenceState.Self: + if( drawInfo.CurrentEventType == EventType.Repaint ) + { + m_drawPreview = false; + m_drawPicker = true; + + DrawTexturePicker( drawInfo ); + } + break; + case ReferenceState.Connected: + if( drawInfo.CurrentEventType == EventType.Repaint ) + { + m_drawPreview = true; + m_drawPicker = false; + + if( m_previewTextProp != null ) + { + SetTitleTextOnCallback( m_previewTextProp.TitleContent.text, ( instance, newTitle ) => instance.TitleContent.text = newTitle + " (Input)" ); + SetAdditonalTitleText( m_previewTextProp.AdditonalTitleContent.text ); + } + + // Draw chain lock + GUI.Label( m_iconPos, string.Empty, UIUtils.GetCustomStyle( CustomStyle.SamplerTextureIcon ) ); + + // Draw frame around preview + GUI.Label( m_previewRect, string.Empty, UIUtils.GetCustomStyle( CustomStyle.SamplerFrame ) ); + } + break; + case ReferenceState.Instance: + { + m_drawPreview = true; + m_drawPicker = false; + + if( m_referenceSampler != null ) + { + SetTitleTextOnCallback( m_referenceSampler.PreviewTextProp.TitleContent.text, ( instance, newTitle ) => instance.TitleContent.text = newTitle + Constants.InstancePostfixStr ); + SetAdditonalTitleText( m_referenceSampler.PreviewTextProp.AdditonalTitleContent.text ); + } + + // Draw chain lock + GUI.Label( m_iconPos, string.Empty, UIUtils.GetCustomStyle( CustomStyle.SamplerTextureIcon ) ); + + // Draw frame around preview + GUI.Label( m_previewRect, string.Empty, UIUtils.GetCustomStyle( CustomStyle.SamplerFrame ) ); + } + break; + } + } + + protected void DrawTexturePicker( DrawInfo drawInfo ) + { + Rect newRect = m_previewRect; + Texture2DArray currentValue = m_materialMode ? m_materialTextureArray : m_defaultTextureArray; + + if( currentValue == null ) + GUI.Label( newRect, string.Empty, UIUtils.ObjectFieldThumb ); + else + DrawPreview( drawInfo, m_previewRect ); + + if( ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD2 ) + { + Rect butRect = m_previewRect; + butRect.y -= 1; + butRect.x += 1; + + Rect smallButton = newRect; + smallButton.height = 14 * drawInfo.InvertedZoom; + smallButton.y = newRect.yMax - smallButton.height - 2; + smallButton.width = 40 * drawInfo.InvertedZoom; + smallButton.x = newRect.xMax - smallButton.width - 2; + if( currentValue == null ) + { + GUI.Label( newRect, m_labelText, UIUtils.ObjectFieldThumbOverlay ); + } + else + { + DrawPreviewMaskButtonsRepaint( drawInfo, butRect ); + } + GUI.Label( smallButton, "Select", UIUtils.GetCustomStyle( CustomStyle.SamplerButton ) ); + } + + GUI.Label( newRect, string.Empty, UIUtils.GetCustomStyle( CustomStyle.SamplerFrame ) ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + + + OnPropertyNameChanged(); + + if( CheckReference() ) + { + OrderIndex = m_referenceSampler.RawOrderIndex; + OrderIndexOffset = m_referenceSampler.OrderIndexOffset; + } + + bool isVertex = ( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ); + + bool instanced = false; + + if( m_referenceType == TexReferenceType.Instance && m_referenceSampler != null ) + instanced = true; + + if( instanced ) + { + if( !m_referenceSampler.TexPort.IsConnected ) + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + } + else if( !m_texPort.IsConnected ) + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + + string level = string.Empty; + if( m_lodPort.Visible ) + { + level = m_lodPort.GeneratePortInstructions( ref dataCollector ); + } + + if( isVertex && !m_lodPort.Visible ) + level = "0"; + + string propertyName = string.Empty; + if( instanced ) + { + if( m_referenceSampler.TexPort.IsConnected ) + propertyName = m_referenceSampler.TexPort.GeneratePortInstructions( ref dataCollector ); + else + propertyName = m_referenceSampler.PropertyName; + } + else if( m_texPort.IsConnected ) + propertyName = m_texPort.GeneratePortInstructions( ref dataCollector ); + else + propertyName = PropertyName; + + string uvs = string.Empty; + if( m_uvPort.IsConnected ) + { + uvs = m_uvPort.GeneratePortInstructions( ref dataCollector ); + } + else + { + if( dataCollector.IsTemplate ) + { + uvs = dataCollector.TemplateDataCollectorInstance.GetTextureCoord( m_uvSet, propertyName/*( instanced ? m_referenceSampler.PropertyName : PropertyName )*/, UniqueId, CurrentPrecisionType ); + } + else + { + if( isVertex ) + uvs = TexCoordVertexDataNode.GenerateVertexUVs( ref dataCollector, UniqueId, m_uvSet, propertyName ); + else + uvs = TexCoordVertexDataNode.GenerateFragUVs( ref dataCollector, UniqueId, m_uvSet, propertyName ); + } + } + string index = m_indexPort.GeneratePortInstructions( ref dataCollector ); + + string result = string.Empty; + + if( dataCollector.IsTemplate && dataCollector.IsSRP ) + { + //CAREFUL mipbias here means derivative (this needs index changes) + //TODO: unity now supports bias as well + if( m_mipMode == MipType.MipBias ) + { + GeneratorUtils.AddCustomArraySamplingMacros( ref dataCollector ); + result = propertyName + ".SampleGrad(sampler" + propertyName + ", float3(" + uvs + ", " + index + "), " + m_ddxPort.GeneratePortInstructions( ref dataCollector ) + ", " + m_ddyPort.GeneratePortInstructions( ref dataCollector ) + ");"; + } + else if( m_lodPort.Visible || isVertex ) + { + result = "SAMPLE_TEXTURE2D_ARRAY_LOD(" + propertyName + ", sampler" + propertyName + ", " + uvs + ", " + index + ", " + level + " )"; + } + else + { + result = "SAMPLE_TEXTURE2D_ARRAY(" + propertyName + ", sampler" + propertyName + ", " + uvs + ", " + index + " )"; + } + } + else + { + //CAREFUL mipbias here means derivative (this needs index changes) + if( m_mipMode == MipType.MipBias ) + { + GeneratorUtils.AddCustomArraySamplingMacros( ref dataCollector ); + result = "ASE_SAMPLE_TEX2DARRAY_GRAD(" + propertyName + ", float3(" + uvs + ", " + index + "), " + m_ddxPort.GeneratePortInstructions( ref dataCollector ) + ", " + m_ddyPort.GeneratePortInstructions( ref dataCollector ) + " )"; + } + else if( m_lodPort.Visible || isVertex ) + { + result = "UNITY_SAMPLE_TEX2DARRAY_LOD(" + propertyName + ", float3(" + uvs + ", " + index + "), " + level + " )"; + } + else + { + result = "UNITY_SAMPLE_TEX2DARRAY" + ( m_lodPort.Visible || isVertex ? "_LOD" : "" ) + "(" + propertyName + ", float3(" + uvs + ", " + index + ") " + ( m_lodPort.Visible || isVertex ? ", " + level : "" ) + " )"; + } + } + + if( m_autoUnpackNormals ) + { + bool isScaledNormal = false; + if( m_normalPort.IsConnected ) + { + isScaledNormal = true; + } + else + { + if( m_normalPort.FloatInternalData != 1 ) + { + isScaledNormal = true; + } + } + + string scaleValue = isScaledNormal ? m_normalPort.GeneratePortInstructions( ref dataCollector ) : "1.0"; + result = GeneratorUtils.GenerateUnpackNormalStr( ref dataCollector, CurrentPrecisionType, UniqueId, OutputId, result, isScaledNormal, scaleValue ); + if( isScaledNormal && ( !dataCollector.IsTemplate || !dataCollector.IsSRP ) ) + { + dataCollector.AddToIncludes( UniqueId, Constants.UnityStandardUtilsLibFuncs ); + } + } + + RegisterLocalVariable( 0, result, ref dataCollector, "texArray" + OutputId ); + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + } + + public override string PropertyName + { + get + { + if( m_referenceType == TexReferenceType.Instance && m_referenceSampler != null ) + return m_referenceSampler.PropertyName; + else + return base.PropertyName; + } + } + + public override string PropertyInspectorName + { + get + { + if( m_referenceType == TexReferenceType.Instance && m_referenceSampler != null ) + return m_referenceSampler.PropertyInspectorName; + else + return base.PropertyInspectorName; + } + } + + public override string GetPropertyValue() + { + return PropertyAttributes + PropertyName + "(\"" + PropertyInspectorName + "\", 2DArray ) = \"\" {}"; + } + + public override bool GetUniformData( out string dataType, out string dataName, ref bool fullValue ) + { + MasterNode currMasterNode = ( m_containerGraph.CurrentMasterNode != null ) ? m_containerGraph.CurrentMasterNode : m_containerGraph.ParentWindow.OutsideGraph.CurrentMasterNode; + if( currMasterNode != null && currMasterNode.CurrentDataCollector.IsTemplate && currMasterNode.CurrentDataCollector.IsSRP ) + { + dataType = "TEXTURE2D_ARRAY( " + PropertyName + ""; + dataName = ");\nuniform SAMPLER( sampler" + PropertyName + " )"; + return true; + } + dataType = "UNITY_DECLARE_TEX2DARRAY("; + dataName = PropertyName + " )"; + return true; + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + string textureName = GetCurrentParam( ref nodeParams ); + m_defaultTextureArray = AssetDatabase.LoadAssetAtPath( textureName ); + m_uvSet = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_referenceType = (TexReferenceType)Enum.Parse( typeof( TexReferenceType ), GetCurrentParam( ref nodeParams ) ); + m_referenceNodeId = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > 3202 ) + m_mipMode = (MipType)Enum.Parse( typeof( MipType ), GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > 5105 ) + m_autoUnpackNormals = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + + if( m_referenceType == TexReferenceType.Instance ) + { + UIUtils.UnregisterTextureArrayNode( this ); + UIUtils.UnregisterPropertyNode( this ); + } + + ConfigureInputPorts(); + ConfigureOutputPorts(); + + m_lodPort.Visible = ( m_mipMode == MipType.MipLevel ); + m_ddxPort.Visible = ( m_mipMode == MipType.MipBias ); //not really bias, it's derivative + m_ddyPort.Visible = ( m_mipMode == MipType.MipBias ); //not really bias, it's derivative + + UpdateHeaderColor(); + + if( m_defaultTextureArray ) + { + m_materialTextureArray = m_defaultTextureArray; + } + + if( !m_isNodeBeingCopied && m_referenceType == TexReferenceType.Object ) + { + ContainerGraph.TextureArrayNodes.UpdateDataOnNode( UniqueId, DataToArray ); + } + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + + m_referenceSampler = UIUtils.GetNode( m_referenceNodeId ) as TextureArrayNode; + m_referenceArrayId = UIUtils.GetTextureArrayNodeRegisterId( m_referenceNodeId ); + OnPropertyNameChanged(); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, ( m_defaultTextureArray != null ) ? AssetDatabase.GetAssetPath( m_defaultTextureArray ) : Constants.NoStringValue ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_uvSet.ToString() ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_referenceType ); + IOUtils.AddFieldValueToString( ref nodeInfo, ( ( m_referenceSampler != null ) ? m_referenceSampler.UniqueId : -1 ) ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_mipMode ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_autoUnpackNormals ); + } + + public override void ReadAdditionalClipboardData( ref string[] nodeParams ) + { + base.ReadAdditionalClipboardData( ref nodeParams ); + string textureName = GetCurrentParam( ref nodeParams ); + m_materialTextureArray = AssetDatabase.LoadAssetAtPath( textureName ); + } + + public override void WriteAdditionalClipboardData( ref string nodeInfo ) + { + base.WriteAdditionalClipboardData( ref nodeInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, ( m_materialTextureArray != null ) ? AssetDatabase.GetAssetPath( m_materialTextureArray ) : Constants.NoStringValue ); + } + + + public override void UpdateMaterial( Material mat ) + { + base.UpdateMaterial( mat ); + if( UIUtils.IsProperty( m_currentParameterType ) && !InsideShaderFunction && m_referenceType == TexReferenceType.Object ) + { + OnPropertyNameChanged(); + if( mat.HasProperty( PropertyName ) ) + { + mat.SetTexture( PropertyName, m_materialTextureArray ); + } + } + } + + public override void SetMaterialMode( Material mat, bool fetchMaterialValues ) + { + base.SetMaterialMode( mat, fetchMaterialValues ); + if( fetchMaterialValues && m_materialMode && UIUtils.IsProperty( m_currentParameterType ) ) + { + if( mat.HasProperty( PropertyName ) ) + { + m_materialTextureArray = (Texture2DArray)mat.GetTexture( PropertyName ); + if( m_materialTextureArray == null ) + m_materialTextureArray = m_defaultTextureArray; + } + } + } + + public override void ForceUpdateFromMaterial( Material material ) + { + if( UIUtils.IsProperty( m_currentParameterType ) && material.HasProperty( PropertyName ) ) + { + m_materialTextureArray = (Texture2DArray)material.GetTexture( PropertyName ); + if( m_materialTextureArray == null ) + m_materialTextureArray = m_defaultTextureArray; + + PreviewIsDirty = true; + } + } + + public override bool UpdateShaderDefaults( ref Shader shader, ref TextureDefaultsDataColector defaultCol ) + { + if( m_defaultTextureArray != null ) + { + defaultCol.AddValue( PropertyName, m_defaultTextureArray ); + } + + return true; + } + + public override string GetPropertyValStr() + { + return m_materialMode ? ( m_materialTextureArray != null ? m_materialTextureArray.name : IOUtils.NO_TEXTURES ) : ( m_defaultTextureArray != null ? m_defaultTextureArray.name : IOUtils.NO_TEXTURES ); + } + + public bool CheckReference() + { + if( m_referenceType == TexReferenceType.Instance && m_referenceArrayId > -1 ) + { + m_referenceSampler = UIUtils.GetTextureArrayNode( m_referenceArrayId ); + + if( m_referenceSampler == null ) + { + m_texPort.Locked = false; + m_referenceArrayId = -1; + } + else + m_texPort.Locked = true; + } + else + { + m_texPort.Locked = false; + } + + return m_referenceSampler != null; + } + + public override void SetupFromCastObject( UnityEngine.Object obj ) + { + base.SetupFromCastObject( obj ); + SetupFromObject( obj ); + } + + public override void OnObjectDropped( UnityEngine.Object obj ) + { + SetupFromObject( obj ); + } + + private void SetupFromObject( UnityEngine.Object obj ) + { + if( m_materialMode ) + m_materialTextureArray = obj as Texture2DArray; + else + m_defaultTextureArray = obj as Texture2DArray; + } + + public Texture2DArray TextureArray { get { return ( m_materialMode ? m_materialTextureArray : m_defaultTextureArray ); } } + + public bool IsLinearTexture { get { return m_linearTexture; } } + + public bool AutoUnpackNormals + { + get { return m_autoUnpackNormals; } + set { m_autoUnpackNormals = value; } + } + + public override string DataToArray { get { return PropertyInspectorName; } } + + public override void Destroy() + { + base.Destroy(); + m_defaultTextureArray = null; + m_materialTextureArray = null; + + m_texPort = null; + m_uvPort = null; + m_indexPort = null; + m_lodPort = null; + m_normalPort = null; + m_ddxPort = null; + m_ddyPort = null; + + if( m_referenceType == TexReferenceType.Object ) + { + UIUtils.UnregisterTextureArrayNode( this ); + UIUtils.UnregisterPropertyNode( this ); + } + + if( UniqueId > -1 ) + ContainerGraph.TextureArrayNodes.OnReorderEventComplete -= OnReorderEventComplete; + } + + public ParentNode PreviewTextProp { get { return m_previewTextProp; } } + public InputPort TexPort { get { return m_texPort; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/TextureArrayNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/TextureArrayNode.cs.meta new file mode 100644 index 0000000..54332f0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/TextureArrayNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3c5be6f9c03445d4fb70955f594877dc +timeCreated: 1485801067 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Vector2Node.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Vector2Node.cs new file mode 100644 index 0000000..306816b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Vector2Node.cs @@ -0,0 +1,301 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Vector2", "Constants And Properties", "Vector2 property", null, KeyCode.Alpha2 )] + public sealed class Vector2Node : PropertyNode + { + [SerializeField] + private Vector2 m_defaultValue = Vector2.zero; + + [SerializeField] + private Vector2 m_materialValue = Vector2.zero; + + private const float LabelWidth = 8; + + private int m_cachedPropertyId = -1; + + private bool m_isEditingFields; + private Vector2 m_previousValue = Vector2.zero; + private string[] m_fieldText = new string[] { "0", "0" }; + + public Vector2Node() : base() { } + public Vector2Node( int uniqueId, float x, float y, float width, float height ) : base( uniqueId, x, y, width, height ) { } + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + GlobalTypeWarningText = string.Format( GlobalTypeWarningText, "Vector" ); + m_insideSize.Set(50,20); + m_selectedLocation = PreviewLocation.BottomCenter; + AddOutputVectorPorts( WirePortDataType.FLOAT2, "XY" ); + m_availableAttribs.Add( new PropertyAttributes( "Remap Sliders", "[RemapSliders]" ) ); + m_previewShaderGUID = "88b4191eb06084d4da85d1dd2f984085"; + m_srpBatcherCompatible = true; + m_showHybridInstancedUI = true; + } + + public override void CopyDefaultsToMaterial() + { + m_materialValue = m_defaultValue; + } + + public override void DrawSubProperties() + { + m_defaultValue = EditorGUILayoutVector2Field( Constants.DefaultValueLabel, m_defaultValue ); + } + + public override void DrawMaterialProperties() + { + if ( m_materialMode ) + EditorGUI.BeginChangeCheck(); + + m_materialValue = EditorGUILayoutVector2Field( Constants.MaterialValueLabel, m_materialValue ); + if ( m_materialMode && EditorGUI.EndChangeCheck() ) + m_requireMaterialUpdate = true; + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + if ( m_cachedPropertyId == -1 ) + m_cachedPropertyId = Shader.PropertyToID( "_InputVector" ); + + if ( m_materialMode && m_currentParameterType != PropertyType.Constant ) + PreviewMaterial.SetVector( m_cachedPropertyId, new Vector4( m_materialValue[ 0 ], m_materialValue[ 1 ], 0, 0 ) ); + else + PreviewMaterial.SetVector( m_cachedPropertyId, new Vector4( m_defaultValue[ 0 ], m_defaultValue[ 1 ], 0, 0 ) ); + } + + public override void OnNodeLayout( DrawInfo drawInfo ) + { + base.OnNodeLayout( drawInfo ); + + m_propertyDrawPos = m_remainingBox; + m_propertyDrawPos.x = m_remainingBox.x - LabelWidth * drawInfo.InvertedZoom; + m_propertyDrawPos.width = drawInfo.InvertedZoom * Constants.FLOAT_DRAW_WIDTH_FIELD_SIZE; + m_propertyDrawPos.height = drawInfo.InvertedZoom * Constants.FLOAT_DRAW_HEIGHT_FIELD_SIZE; + } + + public override void DrawGUIControls( DrawInfo drawInfo ) + { + base.DrawGUIControls( drawInfo ); + + if ( drawInfo.CurrentEventType != EventType.MouseDown ) + return; + + Rect hitBox = m_remainingBox; + hitBox.xMin -= LabelWidth * drawInfo.InvertedZoom; + bool insideBox = hitBox.Contains( drawInfo.MousePosition ); + + if ( insideBox ) + { + GUI.FocusControl( null ); + m_isEditingFields = true; + } + else if ( m_isEditingFields && !insideBox ) + { + GUI.FocusControl( null ); + m_isEditingFields = false; + } + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + if ( !m_isVisible ) + return; + + if ( m_isEditingFields && m_currentParameterType != PropertyType.Global) + { + EditorGUI.BeginChangeCheck(); + for ( int i = 0; i < 2; i++ ) + { + m_propertyDrawPos.y = m_outputPorts[ i + 1 ].Position.y - 2 * drawInfo.InvertedZoom; + if ( m_materialMode && m_currentParameterType != PropertyType.Constant ) + { + float val = m_materialValue[ i ]; + UIUtils.DrawFloat( this, ref m_propertyDrawPos, ref val, LabelWidth * drawInfo.InvertedZoom ); + m_materialValue[ i ] = val; + } + else + { + float val = m_defaultValue[ i ]; + UIUtils.DrawFloat( this, ref m_propertyDrawPos, ref val, LabelWidth * drawInfo.InvertedZoom ); + m_defaultValue[ i ] = val; + } + } + if ( EditorGUI.EndChangeCheck() ) + { + PreviewIsDirty = true; + m_requireMaterialUpdate = m_materialMode; + BeginDelayedDirtyProperty(); + } + } + else if ( drawInfo.CurrentEventType == EventType.Repaint && ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD4 ) + { + bool guiEnabled = GUI.enabled; + GUI.enabled = m_currentParameterType != PropertyType.Global; + for ( int i = 0; i < 2; i++ ) + { + m_propertyDrawPos.y = m_outputPorts[ i + 1 ].Position.y - 2 * drawInfo.InvertedZoom; + + Rect fakeField = m_propertyDrawPos; + fakeField.xMin += LabelWidth * drawInfo.InvertedZoom; + if( GUI.enabled ) + { + Rect fakeLabel = m_propertyDrawPos; + fakeLabel.xMax = fakeField.xMin; + EditorGUIUtility.AddCursorRect( fakeLabel, MouseCursor.SlideArrow ); + EditorGUIUtility.AddCursorRect( fakeField, MouseCursor.Text ); + } + if ( m_materialMode && m_currentParameterType != PropertyType.Constant ) + { + if ( m_previousValue[ i ] != m_materialValue[ i ] ) + { + m_previousValue[ i ] = m_materialValue[ i ]; + m_fieldText[ i ] = m_materialValue[ i ].ToString(); + } + } + else + { + if ( m_previousValue[ i ] != m_defaultValue[ i ] ) + { + m_previousValue[ i ] = m_defaultValue[ i ]; + m_fieldText[ i ] = m_defaultValue[ i ].ToString(); + } + } + + GUI.Label( fakeField, m_fieldText[ i ], UIUtils.MainSkin.textField ); + } + GUI.enabled = guiEnabled; + } + } + + public override void ConfigureLocalVariable( ref MasterNodeDataCollector dataCollector ) + { + Vector2 value = m_defaultValue; + dataCollector.AddLocalVariable( UniqueId, CreateLocalVarDec( value.x + "," + value.y ) ); + m_outputPorts[ 0 ].SetLocalValue( m_propertyName, dataCollector.PortCategory ); + m_outputPorts[ 1 ].SetLocalValue( m_propertyName + ".x" , dataCollector.PortCategory); + m_outputPorts[ 2 ].SetLocalValue( m_propertyName + ".y", dataCollector.PortCategory ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.GenerateShaderForOutput( outputId,ref dataCollector, ignoreLocalvar ); + m_precisionString = UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, m_outputPorts[ 0 ].DataType ); + + if ( m_currentParameterType != PropertyType.Constant ) + return GetOutputVectorItem( 0, outputId, PropertyData( dataCollector.PortCategory ) ); + + if ( m_outputPorts[ outputId ].IsLocalValue( dataCollector.PortCategory ) ) + { + return m_outputPorts[ outputId ].LocalValue( dataCollector.PortCategory ); + } + + if ( CheckLocalVariable( ref dataCollector ) ) + { + return m_outputPorts[ outputId ].LocalValue( dataCollector.PortCategory ); + } + + Vector2 value = m_defaultValue; + string result = string.Empty; + switch ( outputId ) + { + case 0: + { + result = m_precisionString+"( " + value.x + "," + value.y + " )"; + } + break; + + case 1: + { + result = value.x.ToString(); + } + break; + case 2: + { + result = value.y.ToString(); + } + break; + } + + if ( result.Equals( string.Empty ) ) + { + UIUtils.ShowMessage( UniqueId, "Vector2Node generating empty code", MessageSeverity.Warning ); + } + return result; + } + + public override string GetPropertyValue() + { + return PropertyAttributes + m_propertyName + "(\"" + m_propertyInspectorName + "\", Vector) = (" + m_defaultValue.x + "," + m_defaultValue.y + ",0,0)"; + } + + public override void UpdateMaterial( Material mat ) + { + base.UpdateMaterial( mat ); + if ( UIUtils.IsProperty( m_currentParameterType ) && !InsideShaderFunction ) + { + mat.SetVector( m_propertyName, m_materialValue ); + } + } + + public override void SetMaterialMode( Material mat , bool fetchMaterialValues ) + { + base.SetMaterialMode( mat , fetchMaterialValues ); + if ( fetchMaterialValues && m_materialMode && UIUtils.IsProperty( m_currentParameterType ) && mat.HasProperty( m_propertyName ) ) + { + m_materialValue = mat.GetVector( m_propertyName ); + } + } + + public override void ForceUpdateFromMaterial( Material material ) + { + if( UIUtils.IsProperty( m_currentParameterType ) && material.HasProperty( m_propertyName ) ) + { + m_materialValue = material.GetVector( m_propertyName ); + PreviewIsDirty = true; + } + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_defaultValue = IOUtils.StringToVector2( GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > 14101 ) + m_materialValue = IOUtils.StringToVector2( GetCurrentParam( ref nodeParams ) ); + } + + public override void SetGlobalValue() { Shader.SetGlobalVector( m_propertyName, m_defaultValue ); } + public override void FetchGlobalValue() { m_materialValue = Shader.GetGlobalVector( m_propertyName ); } + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, IOUtils.Vector2ToString( m_defaultValue ) ); + IOUtils.AddFieldValueToString( ref nodeInfo, IOUtils.Vector2ToString( m_materialValue ) ); + } + + public override string GetPropertyValStr() + { + return ( m_materialMode && m_currentParameterType != PropertyType.Constant ) ? m_materialValue.x.ToString( Mathf.Abs( m_materialValue.x ) > 1000 ? Constants.PropertyBigVectorFormatLabel : Constants.PropertyVectorFormatLabel ) + IOUtils.VECTOR_SEPARATOR + + m_materialValue.y.ToString( Mathf.Abs( m_materialValue.y ) > 1000 ? Constants.PropertyBigVectorFormatLabel : Constants.PropertyVectorFormatLabel ) : + m_defaultValue.x.ToString( Mathf.Abs( m_defaultValue.x ) > 1000 ? Constants.PropertyBigVectorFormatLabel : Constants.PropertyVectorFormatLabel ) + IOUtils.VECTOR_SEPARATOR + + m_defaultValue.y.ToString( Mathf.Abs( m_defaultValue.y ) > 1000 ? Constants.PropertyBigVectorFormatLabel : Constants.PropertyVectorFormatLabel ); + } + + public Vector2 Value + { + get { return m_defaultValue; } + set { m_defaultValue = value; } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Vector2Node.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Vector2Node.cs.meta new file mode 100644 index 0000000..a241974 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Vector2Node.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6ca8f5d67cf4c5f428a6dd646099897c +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Vector3Node.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Vector3Node.cs new file mode 100644 index 0000000..62be069 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Vector3Node.cs @@ -0,0 +1,315 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Vector3", "Constants And Properties", "Vector3 property", null, KeyCode.Alpha3 )] + public sealed class Vector3Node : PropertyNode + { + [SerializeField] + private Vector3 m_defaultValue = Vector3.zero; + + [SerializeField] + private Vector3 m_materialValue = Vector3.zero; + + private const float LabelWidth = 8; + + private int m_cachedPropertyId = -1; + + public Vector3Node() : base() { } + public Vector3Node( int uniqueId, float x, float y, float width, float height ) : base( uniqueId, x, y, width, height ) { } + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + GlobalTypeWarningText = string.Format( GlobalTypeWarningText, "Vector" ); + m_insideSize.Set( 50, 30 ); + m_selectedLocation = PreviewLocation.BottomCenter; + AddOutputVectorPorts( WirePortDataType.FLOAT3, "XYZ" ); + m_previewShaderGUID = "8a44d38f06246bf48944b3f314bc7920"; + m_srpBatcherCompatible = true; + m_showHybridInstancedUI = true; + } + + public override void CopyDefaultsToMaterial() + { + m_materialValue = m_defaultValue; + } + + public override void DrawSubProperties() + { + m_defaultValue = EditorGUILayoutVector3Field( Constants.DefaultValueLabel, m_defaultValue ); + } + + public override void DrawMaterialProperties() + { + EditorGUI.BeginChangeCheck(); + + m_materialValue = EditorGUILayoutVector3Field( Constants.MaterialValueLabel, m_materialValue ); + + if( EditorGUI.EndChangeCheck() ) + { + //MarkForPreviewUpdate(); + if( m_materialMode ) + m_requireMaterialUpdate = true; + } + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + if( m_cachedPropertyId == -1 ) + m_cachedPropertyId = Shader.PropertyToID( "_InputVector" ); + + if( m_materialMode && m_currentParameterType != PropertyType.Constant ) + PreviewMaterial.SetVector( m_cachedPropertyId, new Vector4( m_materialValue[ 0 ], m_materialValue[ 1 ], m_materialValue[ 2 ], 0 ) ); + else + PreviewMaterial.SetVector( m_cachedPropertyId, new Vector4( m_defaultValue[ 0 ], m_defaultValue[ 1 ], m_defaultValue[ 2 ], 0 ) ); + } + + private bool m_isEditingFields; + private Vector3 m_previousValue = Vector3.zero; + private string[] m_fieldText = new string[] { "0", "0", "0" }; + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + if( !m_isVisible ) + return; + + if( m_isEditingFields && m_currentParameterType != PropertyType.Global) + { + EditorGUI.BeginChangeCheck(); + for( int i = 0; i < 3; i++ ) + { + m_propertyDrawPos.y = m_outputPorts[ i + 1 ].Position.y - 2 * drawInfo.InvertedZoom; + if( m_materialMode && m_currentParameterType != PropertyType.Constant ) + { + float val = m_materialValue[ i ]; + UIUtils.DrawFloat( this, ref m_propertyDrawPos, ref val, LabelWidth * drawInfo.InvertedZoom ); + m_materialValue[ i ] = val; + } + else + { + float val = m_defaultValue[ i ]; + UIUtils.DrawFloat( this, ref m_propertyDrawPos, ref val, LabelWidth * drawInfo.InvertedZoom ); + m_defaultValue[ i ] = val; + } + } + if( EditorGUI.EndChangeCheck() ) + { + PreviewIsDirty = true; + m_requireMaterialUpdate = m_materialMode; + BeginDelayedDirtyProperty(); + } + } + else if( drawInfo.CurrentEventType == EventType.Repaint && ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD4 ) + { + bool guiEnabled = GUI.enabled; + GUI.enabled = m_currentParameterType != PropertyType.Global; + + for( int i = 0; i < 3; i++ ) + { + m_propertyDrawPos.y = m_outputPorts[ i + 1 ].Position.y - 2 * drawInfo.InvertedZoom; + + Rect fakeField = m_propertyDrawPos; + fakeField.xMin += LabelWidth * drawInfo.InvertedZoom; + if( GUI.enabled ) + { + Rect fakeLabel = m_propertyDrawPos; + fakeLabel.xMax = fakeField.xMin; + EditorGUIUtility.AddCursorRect( fakeLabel, MouseCursor.SlideArrow ); + EditorGUIUtility.AddCursorRect( fakeField, MouseCursor.Text ); + } + + if( m_materialMode && m_currentParameterType != PropertyType.Constant ) + { + if( m_previousValue[ i ] != m_materialValue[ i ] ) + { + m_previousValue[ i ] = m_materialValue[ i ]; + m_fieldText[ i ] = m_materialValue[ i ].ToString(); + } + } + else + { + if( m_previousValue[ i ] != m_defaultValue[ i ] ) + { + m_previousValue[ i ] = m_defaultValue[ i ]; + m_fieldText[ i ] = m_defaultValue[ i ].ToString(); + } + } + + GUI.Label( fakeField, m_fieldText[ i ], UIUtils.MainSkin.textField ); + } + GUI.enabled = guiEnabled; + } + } + + public override void OnNodeLayout( DrawInfo drawInfo ) + { + base.OnNodeLayout( drawInfo ); + + m_propertyDrawPos = m_remainingBox; + m_propertyDrawPos.x = m_remainingBox.x - LabelWidth * drawInfo.InvertedZoom; + m_propertyDrawPos.width = drawInfo.InvertedZoom * Constants.FLOAT_DRAW_WIDTH_FIELD_SIZE; + m_propertyDrawPos.height = drawInfo.InvertedZoom * Constants.FLOAT_DRAW_HEIGHT_FIELD_SIZE; + } + + public override void DrawGUIControls( DrawInfo drawInfo ) + { + base.DrawGUIControls( drawInfo ); + + if( drawInfo.CurrentEventType != EventType.MouseDown ) + return; + + Rect hitBox = m_remainingBox; + hitBox.xMin -= LabelWidth * drawInfo.InvertedZoom; + bool insideBox = hitBox.Contains( drawInfo.MousePosition ); + + if( insideBox ) + { + GUI.FocusControl( null ); + m_isEditingFields = true; + } + else if( m_isEditingFields && !insideBox ) + { + GUI.FocusControl( null ); + m_isEditingFields = false; + } + } + + public override void ConfigureLocalVariable( ref MasterNodeDataCollector dataCollector ) + { + Vector3 value = m_defaultValue; + dataCollector.AddLocalVariable( UniqueId, CreateLocalVarDec( value.x + "," + value.y + "," + value.z ) ); + m_outputPorts[ 0 ].SetLocalValue( m_propertyName , dataCollector.PortCategory ); + m_outputPorts[ 1 ].SetLocalValue( m_propertyName + ".x" , dataCollector.PortCategory ); + m_outputPorts[ 2 ].SetLocalValue( m_propertyName + ".y" , dataCollector.PortCategory ); + m_outputPorts[ 3 ].SetLocalValue( m_propertyName + ".z", dataCollector.PortCategory ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + m_precisionString = UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, m_outputPorts[ 0 ].DataType ); + + if( m_currentParameterType != PropertyType.Constant ) + return GetOutputVectorItem( 0, outputId, PropertyData( dataCollector.PortCategory ) ); + + if( m_outputPorts[ outputId ].IsLocalValue( dataCollector.PortCategory ) ) + { + return m_outputPorts[ outputId ].LocalValue( dataCollector.PortCategory ); + } + + if( CheckLocalVariable( ref dataCollector ) ) + { + return m_outputPorts[ outputId ].LocalValue( dataCollector.PortCategory ); + } + + Vector3 value = m_defaultValue; + string result = string.Empty; + switch( outputId ) + { + case 0: + { + result = m_precisionString + "(" + value.x + "," + value.y + "," + value.z + ")"; + } + break; + + case 1: + { + result = value.x.ToString(); + } + break; + case 2: + { + result = value.y.ToString(); + } + break; + case 3: + { + result = value.z.ToString(); + } + break; + } + + if( result.Equals( string.Empty ) ) + { + UIUtils.ShowMessage( UniqueId, "Vector3Node generating empty code", MessageSeverity.Warning ); + } + return result; + } + + public override string GetPropertyValue() + { + return PropertyAttributes + m_propertyName + "(\"" + m_propertyInspectorName + "\", Vector) = (" + m_defaultValue.x + "," + m_defaultValue.y + "," + m_defaultValue.z + ",0)"; + } + + public override void UpdateMaterial( Material mat ) + { + base.UpdateMaterial( mat ); + if( UIUtils.IsProperty( m_currentParameterType ) && !InsideShaderFunction ) + { + mat.SetVector( m_propertyName, m_materialValue ); + } + } + + public override void SetMaterialMode( Material mat, bool fetchMaterialValues ) + { + base.SetMaterialMode( mat, fetchMaterialValues ); + if( fetchMaterialValues && m_materialMode && UIUtils.IsProperty( m_currentParameterType ) && mat.HasProperty( m_propertyName ) ) + { + m_materialValue = mat.GetVector( m_propertyName ); + } + } + + public override void ForceUpdateFromMaterial( Material material ) + { + if( UIUtils.IsProperty( m_currentParameterType ) && material.HasProperty( m_propertyName ) ) + { + m_materialValue = material.GetVector( m_propertyName ); + PreviewIsDirty = true; + } + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_defaultValue = IOUtils.StringToVector3( GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > 14101 ) + m_materialValue = IOUtils.StringToVector3( GetCurrentParam( ref nodeParams ) ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, IOUtils.Vector3ToString( m_defaultValue ) ); + IOUtils.AddFieldValueToString( ref nodeInfo, IOUtils.Vector3ToString( m_materialValue ) ); + } + + public override void SetGlobalValue() { Shader.SetGlobalVector( m_propertyName, m_defaultValue ); } + public override void FetchGlobalValue() { m_materialValue = Shader.GetGlobalVector( m_propertyName ); } + + public override string GetPropertyValStr() + { + return ( m_materialMode && m_currentParameterType != PropertyType.Constant ) ? m_materialValue.x.ToString( Mathf.Abs( m_materialValue.x ) > 1000 ? Constants.PropertyBigVectorFormatLabel : Constants.PropertyVectorFormatLabel ) + IOUtils.VECTOR_SEPARATOR + + m_materialValue.y.ToString( Mathf.Abs( m_materialValue.y ) > 1000 ? Constants.PropertyBigVectorFormatLabel : Constants.PropertyVectorFormatLabel ) + IOUtils.VECTOR_SEPARATOR + + m_materialValue.z.ToString( Mathf.Abs( m_materialValue.z ) > 1000 ? Constants.PropertyBigVectorFormatLabel : Constants.PropertyVectorFormatLabel ) : + m_defaultValue.x.ToString( Mathf.Abs( m_defaultValue.x ) > 1000 ? Constants.PropertyBigVectorFormatLabel : Constants.PropertyVectorFormatLabel ) + IOUtils.VECTOR_SEPARATOR + + m_defaultValue.y.ToString( Mathf.Abs( m_defaultValue.y ) > 1000 ? Constants.PropertyBigVectorFormatLabel : Constants.PropertyVectorFormatLabel ) + IOUtils.VECTOR_SEPARATOR + + m_defaultValue.z.ToString( Mathf.Abs( m_defaultValue.z ) > 1000 ? Constants.PropertyBigVectorFormatLabel : Constants.PropertyVectorFormatLabel ); + } + + public Vector3 Value + { + get { return m_defaultValue; } + set { m_defaultValue = value; } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Vector3Node.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Vector3Node.cs.meta new file mode 100644 index 0000000..467beba --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Vector3Node.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 943f4b4fc1fa5214b8934bf4fb76474b +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Vector4Node.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Vector4Node.cs new file mode 100644 index 0000000..447222f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Vector4Node.cs @@ -0,0 +1,321 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Vector4", "Constants And Properties", "Vector4 property", null, KeyCode.Alpha4 )] + public sealed class Vector4Node : PropertyNode + { + [SerializeField] + private Vector4 m_defaultValue = Vector4.zero; + + [SerializeField] + private Vector4 m_materialValue = Vector4.zero; + + private const float LabelWidth = 8; + + private int m_cachedPropertyId = -1; + + private bool m_isEditingFields; + private Vector4 m_previousValue = Vector4.zero; + private string[] m_fieldText = new string[] { "0", "0", "0", "0" }; + + public Vector4Node() : base() { } + public Vector4Node( int uniqueId, float x, float y, float width, float height ) : base( uniqueId, x, y, width, height ) { } + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + GlobalTypeWarningText = string.Format( GlobalTypeWarningText, "Vector" ); + m_insideSize.Set( 50, 40 ); + m_selectedLocation = PreviewLocation.BottomCenter; + AddOutputVectorPorts( WirePortDataType.FLOAT4, "XYZW" ); + m_previewShaderGUID = "aac241d0e47a5a84fbd2edcd640788dc"; + m_availableAttribs.Add( new PropertyAttributes( "Remap Sliders", "[RemapSlidersFull]" ) ); + m_srpBatcherCompatible = true; + m_showHybridInstancedUI = true; + } + + public override void CopyDefaultsToMaterial() + { + m_materialValue = m_defaultValue; + } + + public override void DrawSubProperties() + { + m_defaultValue = EditorGUILayoutVector4Field( Constants.DefaultValueLabel, m_defaultValue ); + } + + public override void DrawMaterialProperties() + { + if ( m_materialMode ) + EditorGUI.BeginChangeCheck(); + + m_materialValue = EditorGUILayoutVector4Field( Constants.MaterialValueLabel, m_materialValue ); + if ( m_materialMode && EditorGUI.EndChangeCheck() ) + m_requireMaterialUpdate = true; + + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + if ( m_cachedPropertyId == -1 ) + m_cachedPropertyId = Shader.PropertyToID( "_InputVector" ); + + if ( m_materialMode && m_currentParameterType != PropertyType.Constant ) + PreviewMaterial.SetVector( m_cachedPropertyId, new Vector4( m_materialValue[ 0 ], m_materialValue[ 1 ], m_materialValue[ 2 ], m_materialValue[ 3 ] ) ); + else + PreviewMaterial.SetVector( m_cachedPropertyId, new Vector4( m_defaultValue[ 0 ], m_defaultValue[ 1 ], m_defaultValue[ 2 ], m_defaultValue[ 3 ] ) ); + } + + public override void OnNodeLayout( DrawInfo drawInfo ) + { + base.OnNodeLayout( drawInfo ); + + m_propertyDrawPos = m_remainingBox; + m_propertyDrawPos.x = m_remainingBox.x - LabelWidth * drawInfo.InvertedZoom; + m_propertyDrawPos.width = drawInfo.InvertedZoom * Constants.FLOAT_DRAW_WIDTH_FIELD_SIZE; + m_propertyDrawPos.height = drawInfo.InvertedZoom * Constants.FLOAT_DRAW_HEIGHT_FIELD_SIZE; + } + + public override void DrawGUIControls( DrawInfo drawInfo ) + { + base.DrawGUIControls( drawInfo ); + + if ( drawInfo.CurrentEventType != EventType.MouseDown ) + return; + + Rect hitBox = m_remainingBox; + hitBox.xMin -= LabelWidth * drawInfo.InvertedZoom; + bool insideBox = hitBox.Contains( drawInfo.MousePosition ); + + if ( insideBox ) + { + GUI.FocusControl( null ); + m_isEditingFields = true; + } + else if ( m_isEditingFields && !insideBox ) + { + GUI.FocusControl( null ); + m_isEditingFields = false; + } + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + if ( !m_isVisible ) + return; + + if ( m_isEditingFields && m_currentParameterType != PropertyType.Global ) + { + EditorGUI.BeginChangeCheck(); + for ( int i = 0; i < 4; i++ ) + { + m_propertyDrawPos.y = m_outputPorts[ i + 1 ].Position.y - 2 * drawInfo.InvertedZoom; + if ( m_materialMode && m_currentParameterType != PropertyType.Constant ) + { + float val = m_materialValue[ i ]; + UIUtils.DrawFloat( this, ref m_propertyDrawPos, ref val, LabelWidth * drawInfo.InvertedZoom ); + m_materialValue[ i ] = val; + } + else + { + float val = m_defaultValue[ i ]; + UIUtils.DrawFloat( this, ref m_propertyDrawPos, ref val, LabelWidth * drawInfo.InvertedZoom ); + m_defaultValue[ i ] = val; + } + } + if ( EditorGUI.EndChangeCheck() ) + { + PreviewIsDirty = true; + m_requireMaterialUpdate = m_materialMode; + BeginDelayedDirtyProperty(); + //m_propertyNameIsDirty = true; + } + } + else if ( drawInfo.CurrentEventType == EventType.Repaint && ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD4 ) + { + bool guiEnabled = GUI.enabled; + GUI.enabled = m_currentParameterType != PropertyType.Global; + + for( int i = 0; i < 4; i++ ) + { + m_propertyDrawPos.y = m_outputPorts[ i + 1 ].Position.y - 2 * drawInfo.InvertedZoom; + + Rect fakeField = m_propertyDrawPos; + fakeField.xMin += LabelWidth * drawInfo.InvertedZoom; + if( GUI.enabled ) + { + Rect fakeLabel = m_propertyDrawPos; + fakeLabel.xMax = fakeField.xMin; + EditorGUIUtility.AddCursorRect( fakeLabel, MouseCursor.SlideArrow ); + EditorGUIUtility.AddCursorRect( fakeField, MouseCursor.Text ); + } + if ( m_materialMode && m_currentParameterType != PropertyType.Constant ) + { + if ( m_previousValue[ i ] != m_materialValue[ i ] ) + { + m_previousValue[ i ] = m_materialValue[ i ]; + m_fieldText[ i ] = m_materialValue[ i ].ToString(); + } + } + else + { + if ( m_previousValue[ i ] != m_defaultValue[ i ] ) + { + m_previousValue[ i ] = m_defaultValue[ i ]; + m_fieldText[ i ] = m_defaultValue[ i ].ToString(); + } + } + + GUI.Label( fakeField, m_fieldText[ i ], UIUtils.MainSkin.textField ); + } + GUI.enabled = guiEnabled; + } + } + + public override void ConfigureLocalVariable( ref MasterNodeDataCollector dataCollector ) + { + Vector4 value = m_defaultValue; + dataCollector.AddLocalVariable( UniqueId, CreateLocalVarDec( value.x + "," + value.y + "," + value.z + "," + value.w ) ); + m_outputPorts[ 0 ].SetLocalValue( m_propertyName, dataCollector.PortCategory ); + m_outputPorts[ 1 ].SetLocalValue( m_propertyName + ".x" , dataCollector.PortCategory ); + m_outputPorts[ 2 ].SetLocalValue( m_propertyName + ".y" , dataCollector.PortCategory ); + m_outputPorts[ 3 ].SetLocalValue( m_propertyName + ".z" , dataCollector.PortCategory ); + m_outputPorts[ 4 ].SetLocalValue( m_propertyName + ".w", dataCollector.PortCategory ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + m_precisionString = UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, m_outputPorts[ 0 ].DataType ); + + if ( m_currentParameterType != PropertyType.Constant ) + return GetOutputVectorItem( 0, outputId, PropertyData( dataCollector.PortCategory ) ); + + if ( m_outputPorts[ outputId ].IsLocalValue( dataCollector.PortCategory ) ) + { + return m_outputPorts[ outputId ].LocalValue( dataCollector.PortCategory ); + } + + if ( CheckLocalVariable( ref dataCollector ) ) + { + return m_outputPorts[ outputId ].LocalValue( dataCollector.PortCategory ); + } + + Vector4 value = m_defaultValue; + string result = string.Empty; + switch ( outputId ) + { + case 0: + { + result = m_precisionString+"(" + value.x + "," + value.y + "," + value.z + "," + value.w + ")"; + } + break; + + case 1: + { + result = value.x.ToString(); + } + break; + case 2: + { + result = value.y.ToString(); + } + break; + case 3: + { + result = value.z.ToString(); + } + break; + case 4: + { + result = value.w.ToString(); + } + break; + } + + if ( result.Equals( string.Empty ) ) + { + UIUtils.ShowMessage( UniqueId, "Vector4Node generating empty code", MessageSeverity.Warning ); + } + return result; + } + + public override string GetPropertyValue() + { + return PropertyAttributes + m_propertyName + "(\"" + m_propertyInspectorName + "\", Vector) = (" + m_defaultValue.x + "," + m_defaultValue.y + "," + m_defaultValue.z + "," + m_defaultValue.w + ")"; + } + + public override void UpdateMaterial( Material mat ) + { + base.UpdateMaterial( mat ); + if ( UIUtils.IsProperty( m_currentParameterType ) && !InsideShaderFunction ) + { + mat.SetVector( m_propertyName, m_materialValue ); + } + } + + public override void SetMaterialMode( Material mat , bool fetchMaterialValues ) + { + base.SetMaterialMode( mat , fetchMaterialValues ); + if ( fetchMaterialValues && m_materialMode && UIUtils.IsProperty( m_currentParameterType ) && mat.HasProperty( m_propertyName ) ) + { + m_materialValue = mat.GetVector( m_propertyName ); + } + } + + public override void ForceUpdateFromMaterial( Material material ) + { + if( UIUtils.IsProperty( m_currentParameterType ) && material.HasProperty( m_propertyName ) ) + { + m_materialValue = material.GetVector( m_propertyName ); + PreviewIsDirty = true; + } + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_defaultValue = IOUtils.StringToVector4( GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > 14101 ) + m_materialValue = IOUtils.StringToVector4( GetCurrentParam( ref nodeParams ) ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, IOUtils.Vector4ToString( m_defaultValue ) ); + IOUtils.AddFieldValueToString( ref nodeInfo, IOUtils.Vector4ToString( m_materialValue ) ); + } + + public override void SetGlobalValue() { Shader.SetGlobalVector( m_propertyName, m_defaultValue ); } + public override void FetchGlobalValue() { m_materialValue = Shader.GetGlobalVector( m_propertyName ); } + + public override string GetPropertyValStr() + { + return ( m_materialMode && m_currentParameterType != PropertyType.Constant ) ? m_materialValue.x.ToString( Mathf.Abs( m_materialValue.x ) > 1000 ? Constants.PropertyBigVectorFormatLabel : Constants.PropertyVectorFormatLabel ) + IOUtils.VECTOR_SEPARATOR + + m_materialValue.y.ToString( Mathf.Abs( m_materialValue.y ) > 1000 ? Constants.PropertyBigVectorFormatLabel : Constants.PropertyVectorFormatLabel ) + IOUtils.VECTOR_SEPARATOR + + m_materialValue.z.ToString( Mathf.Abs( m_materialValue.z ) > 1000 ? Constants.PropertyBigVectorFormatLabel : Constants.PropertyVectorFormatLabel ) + IOUtils.VECTOR_SEPARATOR + + m_materialValue.w.ToString( Mathf.Abs( m_materialValue.w ) > 1000 ? Constants.PropertyBigVectorFormatLabel : Constants.PropertyVectorFormatLabel ) : + m_defaultValue.x.ToString( Mathf.Abs( m_defaultValue.x ) > 1000 ? Constants.PropertyBigVectorFormatLabel : Constants.PropertyVectorFormatLabel ) + IOUtils.VECTOR_SEPARATOR + + m_defaultValue.y.ToString( Mathf.Abs( m_defaultValue.y ) > 1000 ? Constants.PropertyBigVectorFormatLabel : Constants.PropertyVectorFormatLabel ) + IOUtils.VECTOR_SEPARATOR + + m_defaultValue.z.ToString( Mathf.Abs( m_defaultValue.z ) > 1000 ? Constants.PropertyBigVectorFormatLabel : Constants.PropertyVectorFormatLabel ) + IOUtils.VECTOR_SEPARATOR + + m_defaultValue.w.ToString( Mathf.Abs( m_defaultValue.w ) > 1000 ? Constants.PropertyBigVectorFormatLabel : Constants.PropertyVectorFormatLabel ); + } + + public Vector4 Value + { + get { return m_defaultValue; } + set { m_defaultValue = value; } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Vector4Node.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Vector4Node.cs.meta new file mode 100644 index 0000000..1cccc21 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Constants/Vector4Node.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3bc3c79c7cc57df49bedb9d9b64b0bea +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/CustomAddNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/CustomAddNode.cs new file mode 100644 index 0000000..c057097 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/CustomAddNode.cs @@ -0,0 +1,19 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Custom Add Node", "Debug", "Custom Node Debug ( Only for debug purposes)", null, UnityEngine.KeyCode.None, false )] + public sealed class CustomAddNode : CustomNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddOutputsFromString( "customOut0", "#IP2*(#IP0 + #IP1 / #IP2)" ); + AddOutputsFromString( "customOut1", "#IP3 + #IP0*#IP2 + #IP1 / #IP2" ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/CustomAddNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/CustomAddNode.cs.meta new file mode 100644 index 0000000..771b8a6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/CustomAddNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6fdecc48f5be618428240490565e9d8b +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/CustomNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/CustomNode.cs new file mode 100644 index 0000000..bffd2b4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/CustomNode.cs @@ -0,0 +1,183 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class CustomNodeOutputData + { + public string expression; + public string name; + public List inputData; + + public CustomNodeOutputData( string newName, string newExpression ) + { + name = newName; + expression = newExpression; + inputData = new List(); + } + public void Destroy() + { + inputData.Clear(); + inputData = null; + } + + public override string ToString() + { + string result = "name: " + name + " outputExpression: " + expression + '\n'; + for ( int i = 0; i < inputData.Count; i++ ) + { + result += inputData[ i ].ToString() + '\n'; + } + return result; + } + } + + [Serializable] + public class CustomNodeInputData + { + public int index; + public int length; + public string name; + public CustomNodeInputData( int newIndex, int newLength, string newName ) + { + index = newIndex; + length = newLength; + name = newName; + + } + + public override string ToString() + { + return "index: " + index + " length: " + length + " name: " + name; + } + } + + [Serializable] + public class CustomNode : ParentNode + { + [SerializeField] + private List m_includes; + + [SerializeField] + private List m_outputData; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_outputData = new List(); + } + + public void AddIncludes( string newInclude ) + { + m_includes.Add( newInclude ); + } + + protected void AddOutputsFromString( string outputName, string output ) + { + AddOutputPort( WirePortDataType.OBJECT, outputName ); + + CustomNodeOutputData currOutputData = new CustomNodeOutputData( outputName, output ); + + + // Get existing input nodes so we can test for duplicates + Dictionary existingPorts = InputPortsDict; + + // Create dictionary to prevent duplicates when dealing with expresssions with multiple occurences of an input + Dictionary inputDuplicatePrevention = new Dictionary(); + + + // Get all inputs on the expression and save their info + int[] indexes = output.AllIndexesOf( Constants.CNIP ); + for ( int i = 0; i < indexes.Length; i++ ) + { + string name = output.Substring( indexes[ i ], Constants.CNIP.Length + 1 ); + currOutputData.inputData.Add( new CustomNodeInputData( indexes[ i ], Constants.CNIP.Length + 1, name ) ); + + if ( !inputDuplicatePrevention.ContainsKey( name ) && !existingPorts.ContainsKey( name ) ) + { + inputDuplicatePrevention.Add( name, name ); + AddInputPort( WirePortDataType.OBJECT, false, name ); + } + } + + inputDuplicatePrevention.Clear(); + inputDuplicatePrevention = null; + + existingPorts.Clear(); + existingPorts = null; + + m_outputData.Add( currOutputData ); + + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + if ( outputId < m_outputData.Count ) + { + Dictionary inputs = InputPortsDict; + + string value = m_outputData[ outputId ].expression; + for ( int i = 0; i < m_outputData[ outputId ].inputData.Count; i++ ) + { + if ( inputs.ContainsKey( m_outputData[ outputId ].inputData[ i ].name ) ) + { + InputPort inputPort = inputs[ m_outputData[ outputId ].inputData[ i ].name ]; + if ( inputPort != null ) + { + string inputValue = inputPort.GenerateShaderForOutput( ref dataCollector, WirePortDataType.OBJECT, ignoreLocalvar ); + value = value.Replace( m_outputData[ outputId ].inputData[ i ].name, inputValue ); + } + else + { + UIUtils.ShowMessage( UniqueId, m_outputData[ outputId ].inputData[ i ].name + " invalid on the inputs list", MessageSeverity.Error ); + return string.Empty; + } + } + else + { + UIUtils.ShowMessage( UniqueId, m_outputData[ outputId ].inputData[ i ].name + " Not found on the inputs list", MessageSeverity.Error ); + return string.Empty; + } + } + return value; + + } + + return string.Empty; + } + public void DumpOutputData() + { + for ( int i = 0; i < m_outputData.Count; i++ ) + { + Debug.Log( m_outputData[ i ] ); + } + } + + public override void Destroy() + { + base.Destroy(); + + if ( m_outputData != null ) + { + for ( int i = 0; i < m_outputData.Count; i++ ) + { + m_outputData[ i ].Destroy(); + } + m_outputData.Clear(); + m_outputData = null; + } + if ( m_includes != null ) + { + m_includes.Clear(); + m_includes = null; + } + } + + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/CustomNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/CustomNode.cs.meta new file mode 100644 index 0000000..d5cd5ec --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/CustomNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c89fd369755de3e49a669e8e5daa8c2f +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/DrawInfo.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/DrawInfo.cs new file mode 100644 index 0000000..6a42344 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/DrawInfo.cs @@ -0,0 +1,19 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +namespace AmplifyShaderEditor +{ + public class DrawInfo + { + public Rect TransformedCameraArea; + public Rect CameraArea; + public Vector2 MousePosition; + public Vector2 CameraOffset; + public float InvertedZoom; + public bool LeftMouseButtonPressed; + public EventType CurrentEventType; + public Vector2 TransformedMousePos; + public bool ZoomChanged; + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/DrawInfo.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/DrawInfo.cs.meta new file mode 100644 index 0000000..8783ef2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/DrawInfo.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 36f40ed0b172d8f45810b3f6b8e2243d +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/DynamicTypeNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/DynamicTypeNode.cs new file mode 100644 index 0000000..2649803 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/DynamicTypeNode.cs @@ -0,0 +1,521 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +using UnityEngine; +using UnityEditor; +using System; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class DynamicTypeNode : ParentNode + { + protected string m_inputA = string.Empty; + protected string m_inputB = string.Empty; + protected List m_extensibleInputResults; + protected bool m_dynamicOutputType = true; + + protected bool m_extensibleInputPorts = false; + protected bool m_allowMatrixCheck = false; + protected bool m_vectorMatrixOps = false; + //[SerializeField] + private int m_inputCount = 2; + + //[SerializeField] + private int m_lastInputCount = 2; + + private bool m_previouslyDragging = false; + private int m_beforePreviewCount = 0; + + [UnityEngine.SerializeField] + protected WirePortDataType m_mainDataType = WirePortDataType.FLOAT; + + protected WirePortDataType[] m_dynamicRestrictions = + { + WirePortDataType.OBJECT, + WirePortDataType.FLOAT, + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR, + WirePortDataType.INT, + WirePortDataType.UINT + }; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_useInternalPortData = true; + m_textLabelWidth = 35; + AddPorts(); + } + + protected virtual void AddPorts() + { + AddInputPort( WirePortDataType.FLOAT, false, "A" ); + AddInputPort( WirePortDataType.FLOAT, false, "B" ); + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + m_inputPorts[ 0 ].CreatePortRestrictions( m_dynamicRestrictions ); + m_inputPorts[ 1 ].CreatePortRestrictions( m_dynamicRestrictions ); + } + + public override void OnConnectedOutputNodeChanges( int inputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + UpdateConnection( inputPortId ); + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + UpdateConnection( portId ); + } + + public override void OnInputPortDisconnected( int portId ) + { + base.OnInputPortDisconnected( portId ); + UpdateDisconnectedConnection( portId ); + UpdateConnection( portId ); + UpdateEmptyInputPorts( true ); + } + + void UpdateDisconnectedConnection( int portId ) + { + if( m_extensibleInputPorts || m_allowMatrixCheck ) + { + int higher = 0; + int groupOneType = 0; + int groupTwoType = 0; + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + if( m_inputPorts[ i ].IsConnected ) + { + int currentPriority = UIUtils.GetPriority( m_inputPorts[ i ].DataType ); + if( !m_vectorMatrixOps && currentPriority < 3 ) + currentPriority += 7; + if( currentPriority > higher && currentPriority > 2 ) + { + higher = currentPriority; + m_mainDataType = m_inputPorts[ i ].DataType; + } + switch( m_inputPorts[ i ].DataType ) + { + case WirePortDataType.FLOAT2: + case WirePortDataType.FLOAT3: + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: + { + groupOneType++; + groupTwoType++; + } + break; + case WirePortDataType.FLOAT3x3: + { + groupOneType++; + } + break; + case WirePortDataType.FLOAT4x4: + { + groupTwoType++; + } + break; + } + } + } + + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + if( !m_inputPorts[ i ].IsConnected ) + { + m_inputPorts[ i ].ChangeType( m_mainDataType, false ); + } + } + + if( groupOneType > 0 && m_mainDataType == WirePortDataType.FLOAT4x4 ) + { + m_errorMessageTooltip = "Doing this operation with FLOAT4x4 value only works against other FLOAT4x4 or FLOAT values"; + m_showErrorMessage = true; + } + else if( groupTwoType > 0 && m_mainDataType == WirePortDataType.FLOAT3x3 ) + { + m_errorMessageTooltip = "Doing this operation with FLOAT3x3 value only works against other FLOAT3x3 or FLOAT values"; + m_showErrorMessage = true; + } + else + { + m_showErrorMessage = false; + } + + if( m_dynamicOutputType ) + m_outputPorts[ 0 ].ChangeType( m_mainDataType, false ); + } + else + + if( m_inputPorts[ 0 ].DataType != m_inputPorts[ 1 ].DataType ) + { + int otherPortId = ( portId + 1 ) % 2; + if( m_inputPorts[ otherPortId ].IsConnected ) + { + m_mainDataType = m_inputPorts[ otherPortId ].DataType; + m_inputPorts[ portId ].ChangeType( m_mainDataType, false ); + if( m_dynamicOutputType ) + m_outputPorts[ 0 ].ChangeType( m_mainDataType, false ); + } + else + { + if( UIUtils.GetPriority( m_inputPorts[ 0 ].DataType ) > UIUtils.GetPriority( m_inputPorts[ 1 ].DataType ) ) + { + m_mainDataType = m_inputPorts[ 0 ].DataType; + m_inputPorts[ 1 ].ChangeType( m_mainDataType, false ); + } + else + { + m_mainDataType = m_inputPorts[ 1 ].DataType; + m_inputPorts[ 0 ].ChangeType( m_mainDataType, false ); + } + + if( m_dynamicOutputType ) + { + if( m_mainDataType != m_outputPorts[ 0 ].DataType ) + { + m_outputPorts[ 0 ].ChangeType( m_mainDataType, false ); + } + } + } + } + } + + void UpdateConnection( int portId ) + { + if( m_extensibleInputPorts || m_allowMatrixCheck ) + { + m_inputPorts[ portId ].MatchPortToConnection(); + + int higher = 0; + int groupOneType = 0; + int groupTwoType = 0; + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + if( m_inputPorts[ i ].IsConnected ) + { + int currentPriority = UIUtils.GetPriority( m_inputPorts[ i ].DataType ); + if( !m_vectorMatrixOps && currentPriority < 3 ) + currentPriority += 7; + if( currentPriority > higher ) + { + higher = currentPriority; + m_mainDataType = m_inputPorts[ i ].DataType; + } + switch( m_inputPorts[ i ].DataType ) + { + case WirePortDataType.FLOAT2: + case WirePortDataType.FLOAT3: + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: + { + groupOneType++; + groupTwoType++; + } + break; + case WirePortDataType.FLOAT3x3: + { + groupOneType++; + } + break; + case WirePortDataType.FLOAT4x4: + { + groupTwoType++; + } + break; + } + } + } + + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + if( !m_inputPorts[ i ].IsConnected ) + { + m_inputPorts[ i ].ChangeType( m_mainDataType, false ); + } + } + if( groupOneType > 0 && m_mainDataType == WirePortDataType.FLOAT4x4 ) + { + m_errorMessageTooltip = "Doing this operation with FLOAT4x4 value only works against other FLOAT4x4 or FLOAT values"; + m_showErrorMessage = true; + } + else if( groupTwoType > 0 && m_mainDataType == WirePortDataType.FLOAT3x3 ) + { + m_errorMessageTooltip = "Doing this operation with FLOAT3x3 value only works against other FLOAT3x3 or FLOAT values"; + m_showErrorMessage = true; + } + else + { + m_showErrorMessage = false; + } + + if( m_dynamicOutputType ) + m_outputPorts[ 0 ].ChangeType( m_mainDataType, false ); + } + + else + { + m_inputPorts[ portId ].MatchPortToConnection(); + int otherPortId = ( portId + 1 ) % 2; + if( !m_inputPorts[ otherPortId ].IsConnected ) + { + m_inputPorts[ otherPortId ].ChangeType( m_inputPorts[ portId ].DataType, false ); + } + + if( m_inputPorts[ 0 ].DataType == m_inputPorts[ 1 ].DataType ) + { + m_mainDataType = m_inputPorts[ 0 ].DataType; + if( m_dynamicOutputType ) + m_outputPorts[ 0 ].ChangeType( InputPorts[ 0 ].DataType, false ); + } + else + { + if( UIUtils.GetPriority( m_inputPorts[ 0 ].DataType ) > UIUtils.GetPriority( m_inputPorts[ 1 ].DataType ) ) + { + m_mainDataType = m_inputPorts[ 0 ].DataType; + } + else + { + m_mainDataType = m_inputPorts[ 1 ].DataType; + } + + if( m_dynamicOutputType ) + { + if( m_mainDataType != m_outputPorts[ 0 ].DataType ) + { + m_outputPorts[ 0 ].ChangeType( m_mainDataType, false ); + } + } + } + } + } + + public override void OnNodeLogicUpdate( DrawInfo drawInfo ) + { + base.OnNodeLogicUpdate( drawInfo ); + + if( !m_extensibleInputPorts ) + return; + + if( m_previouslyDragging != m_containerGraph.ParentWindow.WireReferenceUtils.OutputPortReference.IsValid && m_containerGraph.ParentWindow.WireReferenceUtils.OutputPortReference.NodeId != UniqueId ) + { + if( m_containerGraph.ParentWindow.WireReferenceUtils.OutputPortReference.IsValid ) + { + m_beforePreviewCount = 2; + for( int i = 2; i < m_inputPorts.Count; i++ ) + { + if( m_inputPorts[ i ].IsConnected ) + { + m_beforePreviewCount++; + } + } + + m_inputCount = m_beforePreviewCount + 1; + if( m_inputCount <= 10 ) + { + if( m_inputCount > m_lastInputCount ) + { + Undo.RegisterCompleteObjectUndo( m_containerGraph.ParentWindow, Constants.UndoCreateDynamicPortId ); + RecordObject( Constants.UndoCreateDynamicPortId ); + + AddInputPort( m_mainDataType, false, ( ( char ) ( 'A' + m_inputCount - 1 ) ).ToString() ); + m_inputPorts[ m_inputCount - 1 ].CreatePortRestrictions( m_dynamicRestrictions ); + } + + m_lastInputCount = m_inputCount; + m_sizeIsDirty = true; + m_isDirty = true; + SetSaveIsDirty(); + } + } + else + { + bool hasEmpty = CheckValidConnections(); + if( hasEmpty ) + UpdateEmptyInputPorts( false ); + } + + m_previouslyDragging = m_containerGraph.ParentWindow.WireReferenceUtils.OutputPortReference.IsValid; + } + + UpdateEmptyInputPorts( false ); + } + + private bool CheckValidConnections() + { + if( !m_extensibleInputPorts ) + return false; + + bool hasEmptyConnections = false; + + bool hasMatrix = m_inputPorts[ 0 ].DataType == WirePortDataType.FLOAT3x3 || m_inputPorts[ 0 ].DataType == WirePortDataType.FLOAT4x4 || m_inputPorts[ 1 ].DataType == WirePortDataType.FLOAT3x3 || m_inputPorts[ 1 ].DataType == WirePortDataType.FLOAT4x4; + + if( m_inputPorts.Count != m_beforePreviewCount ) + { + if( hasMatrix ) + { + bool showError = false; + for( int i = m_inputPorts.Count - 1; i >= 2; i-- ) + { + if( m_inputPorts[ i ].IsConnected ) + { + showError = true; + m_inputPorts[ i ].FullDeleteConnections(); + } + + hasEmptyConnections = true; + } + if( showError ) + m_containerGraph.ParentWindow.ShowMessage( UniqueId, "Matrix operations are only valid for the first two inputs to prevent errors" ); + } + else + { + for( int i = m_inputPorts.Count - 1; i >= 2; i-- ) + { + if( m_inputPorts[ i ].DataType == WirePortDataType.FLOAT3x3 || m_inputPorts[ i ].DataType == WirePortDataType.FLOAT4x4 ) + { + m_containerGraph.ParentWindow.ShowMessage( UniqueId, "Matrix operations are only valid for the first two inputs to prevent errors" ); + m_inputPorts[ i ].FullDeleteConnections(); + hasEmptyConnections = true; + } + else if( !m_inputPorts[ i ].IsConnected ) + { + hasEmptyConnections = true; + } + } + } + } + + return hasEmptyConnections; + } + + private void UpdateEmptyInputPorts( bool recordUndo ) + { + if( !m_extensibleInputPorts ) + return; + NodeWireReferencesUtils wireReferenceUtils = m_containerGraph.ParentWindow.WireReferenceUtils; + if( !wireReferenceUtils.OutputPortReference.IsValid ) + { + if( recordUndo ) + { + Undo.RegisterCompleteObjectUndo( m_containerGraph.ParentWindow, Constants.UndoDeleteDynamicPortId ); + RecordObject( Constants.UndoDeleteDynamicPortId ); + } + + bool hasDeleted = false; + m_inputCount = 2; + for( int i = m_inputPorts.Count - 1; i >= 2; i-- ) + { + if( !m_inputPorts[ i ].IsConnected ) + { + hasDeleted = true; + if( wireReferenceUtils.InputPortReference.IsValid && + wireReferenceUtils.InputPortReference.NodeId == UniqueId && + wireReferenceUtils.InputPortReference.PortId == m_inputPorts[ i ].PortId ) + { + wireReferenceUtils.InputPortReference.Invalidate(); + } + DeleteInputPortByArrayIdx( i ); + } + else + { + m_inputCount++; + } + } + + if( hasDeleted || m_inputCount != m_lastInputCount ) + { + for( int i = 2; i < m_inputPorts.Count; i++ ) + { + m_inputPorts[ i ].Name = ( ( char ) ( 'A' + i ) ).ToString(); + } + + m_beforePreviewCount = m_inputPorts.Count; + m_inputCount = m_beforePreviewCount; + m_lastInputCount = m_inputCount; + m_sizeIsDirty = true; + m_isDirty = true; + SetSaveIsDirty(); + } + } + + m_inputCount = Mathf.Clamp( m_inputCount, 2, 10 ); + } + + public virtual string BuildResults( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( !m_extensibleInputPorts ) + SetInputData( outputId, ref dataCollector, ignoreLocalvar ); + else + SetExtensibleInputData( outputId, ref dataCollector, ignoreLocalvar ); + return string.Empty; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + string result = BuildResults( outputId, ref dataCollector, ignoreLocalvar ); + return CreateOutputLocalVariable( 0, result, ref dataCollector ); + } + + protected void SetInputData( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + m_inputA = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + if( m_inputPorts[ 0 ].DataType != m_mainDataType ) + { + m_inputA = UIUtils.CastPortType( ref dataCollector, CurrentPrecisionType, new NodeCastInfo( UniqueId, outputId ), m_inputA, m_inputPorts[ 0 ].DataType, m_mainDataType, m_inputA ); + } + m_inputB = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + if( m_inputPorts[ 1 ].DataType != m_mainDataType ) + { + m_inputB = UIUtils.CastPortType( ref dataCollector, CurrentPrecisionType, new NodeCastInfo( UniqueId, outputId ), m_inputB, m_inputPorts[ 1 ].DataType, m_mainDataType, m_inputB ); + } + } + + protected void SetExtensibleInputData( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + m_extensibleInputResults = new List(); + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + m_extensibleInputResults.Add( m_inputPorts[ i ].GeneratePortInstructions( ref dataCollector ) ); + if( m_inputPorts[ i ].DataType != m_mainDataType && m_inputPorts[ i ].DataType != WirePortDataType.FLOAT && m_inputPorts[ i ].DataType != WirePortDataType.INT ) + { + m_extensibleInputResults[ i ] = UIUtils.CastPortType( ref dataCollector, CurrentPrecisionType, new NodeCastInfo( UniqueId, outputId ), m_extensibleInputResults[ i ], m_inputPorts[ i ].DataType, m_mainDataType, m_extensibleInputResults[ i ] ); + } + } + } + + void UpdatePorts() + { + m_lastInputCount = Mathf.Clamp( m_inputCount, 2, 10 ); + + for( int i = 2; i < m_inputCount; i++ ) + { + AddInputPort( m_mainDataType, false, ( ( char ) ( 'A' + i ) ).ToString() ); + m_inputPorts[ i ].CreatePortRestrictions( m_dynamicRestrictions ); + } + + m_sizeIsDirty = true; + SetSaveIsDirty(); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( m_extensibleInputPorts && UIUtils.CurrentShaderVersion() > 10005 ) + { + m_inputCount = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + UpdatePorts(); + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + if( m_extensibleInputPorts ) + IOUtils.AddFieldValueToString( ref nodeInfo, m_inputCount ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/DynamicTypeNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/DynamicTypeNode.cs.meta new file mode 100644 index 0000000..bac40f9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/DynamicTypeNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5b60c440b5db81c4d9df9c048aa22b48 +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs.meta new file mode 100644 index 0000000..2eaea63 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 868823c936b45494aa7f3ce9f16b5372 +folderAsset: yes +timeCreated: 1481126946 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/CameraDepthFade.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/CameraDepthFade.cs new file mode 100644 index 0000000..e8c9fc5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/CameraDepthFade.cs @@ -0,0 +1,130 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Camera Depth Fade", "Camera And Screen", "Outputs a 0 - 1 gradient representing the distance between the surface of this object and camera near plane" )] + public sealed class CameraDepthFade : ParentNode + { + //{0} - Eye Depth + //{1} - Offset + //{2} - Distance + private const string CameraDepthFadeFormat = "(( {0} -_ProjectionParams.y - {1} ) / {2})"; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT3, false, "Vertex Position", -1, MasterNodePortCategory.Fragment, 2 ); + AddInputPort( WirePortDataType.FLOAT, false, "Length", -1, MasterNodePortCategory.Fragment, 0 ); + AddInputPort( WirePortDataType.FLOAT, false, "Offset", -1, MasterNodePortCategory.Fragment, 1 ); + GetInputPortByUniqueId( 0 ).FloatInternalData = 1; + AddOutputPort( WirePortDataType.FLOAT, "Out" ); + m_useInternalPortData = true; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + InputPort vertexPort = GetInputPortByUniqueId( 2 ); + InputPort lengthPort = GetInputPortByUniqueId( 0 ); + InputPort offsetPort = GetInputPortByUniqueId( 1 ); + + string distance = lengthPort.GeneratePortInstructions( ref dataCollector ); + string offset = offsetPort.GeneratePortInstructions( ref dataCollector ); + + string value = string.Empty; + string eyeDepth = string.Empty; + + if( dataCollector.IsTemplate ) + { + if( vertexPort.IsConnected ) + { + string varName = "customSurfaceDepth" + OutputId; + GenerateInputInVertex( ref dataCollector, 2, varName, false ); + + string formatStr = string.Empty; + if( dataCollector.IsSRP ) + formatStr = "-TransformWorldToView(TransformObjectToWorld({0})).z"; + else + formatStr = "-UnityObjectToViewPos({0}).z"; + + string eyeInstruction = string.Format( formatStr, varName ); + eyeDepth = "customEye" + OutputId; + dataCollector.TemplateDataCollectorInstance.RegisterCustomInterpolatedData( eyeDepth, WirePortDataType.FLOAT, CurrentPrecisionType, eyeInstruction ); + } + else + { + eyeDepth = dataCollector.TemplateDataCollectorInstance.GetEyeDepth( CurrentPrecisionType ); + } + + value = string.Format( CameraDepthFadeFormat, eyeDepth, offset, distance ); + RegisterLocalVariable( 0, value, ref dataCollector, "cameraDepthFade" + OutputId ); + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + + if( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + { + string vertexVarName = string.Empty; + if( vertexPort.IsConnected ) + { + vertexVarName = vertexPort.GeneratePortInstructions( ref dataCollector ); + } + else + { + vertexVarName = Constants.VertexShaderInputStr + ".vertex.xyz"; + } + + //dataCollector.AddVertexInstruction( "float cameraDepthFade" + UniqueId + " = (( -UnityObjectToViewPos( " + Constants.VertexShaderInputStr + ".vertex.xyz ).z -_ProjectionParams.y - " + offset + " ) / " + distance + ");", UniqueId ); + value = string.Format( CameraDepthFadeFormat, "-UnityObjectToViewPos( " + vertexVarName + " ).z", offset, distance ); + RegisterLocalVariable( 0, value, ref dataCollector, "cameraDepthFade" + OutputId ); + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + + dataCollector.AddToIncludes( UniqueId, Constants.UnityShaderVariables ); + + if( dataCollector.TesselationActive ) + { + if( vertexPort.IsConnected ) + { + string vertexValue = vertexPort.GeneratePortInstructions( ref dataCollector ); + eyeDepth = "customSurfaceDepth" + OutputId; + RegisterLocalVariable( 0, string.Format( "-UnityObjectToViewPos( {0} ).z", vertexValue ), ref dataCollector, eyeDepth ); + } + else + { + eyeDepth = GeneratorUtils.GenerateScreenDepthOnFrag( ref dataCollector, UniqueId, CurrentPrecisionType ); + } + } + else + { + + if( vertexPort.IsConnected ) + { + string varName = "customSurfaceDepth" + OutputId; + GenerateInputInVertex( ref dataCollector, 2, varName, false ); + dataCollector.AddToInput( UniqueId, varName, WirePortDataType.FLOAT ); + string vertexInstruction = "-UnityObjectToViewPos( " + varName + " ).z"; + dataCollector.AddToVertexLocalVariables( UniqueId, Constants.VertexShaderOutputStr + "." + varName + " = " + vertexInstruction + ";" ); + eyeDepth = Constants.InputVarStr + "." + varName; + } + else + { + dataCollector.AddToInput( UniqueId, "eyeDepth", WirePortDataType.FLOAT ); + string instruction = "-UnityObjectToViewPos( " + Constants.VertexShaderInputStr + ".vertex.xyz ).z"; + dataCollector.AddToVertexLocalVariables( UniqueId, Constants.VertexShaderOutputStr + ".eyeDepth = " + instruction + ";" ); + eyeDepth = Constants.InputVarStr + ".eyeDepth"; + } + } + + value = string.Format( CameraDepthFadeFormat, eyeDepth, offset, distance ); + RegisterLocalVariable( 0, value, ref dataCollector, "cameraDepthFade" + OutputId ); + //dataCollector.AddToLocalVariables( UniqueId, "float cameraDepthFade" + UniqueId + " = (( " + Constants.InputVarStr + ".eyeDepth -_ProjectionParams.y - "+ offset + " ) / " + distance + ");" ); + + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/CameraDepthFade.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/CameraDepthFade.cs.meta new file mode 100644 index 0000000..2e13b8f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/CameraDepthFade.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 96f38a9f14906ca49b505b8e305c37ec +timeCreated: 1491316341 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ComputeGrabScreenPosHlpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ComputeGrabScreenPosHlpNode.cs new file mode 100644 index 0000000..362415d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ComputeGrabScreenPosHlpNode.cs @@ -0,0 +1,54 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Compute Grab Screen Pos", "Camera And Screen", "Computes texture coordinate for doing a screenspace-mapped texture sample. Input is clip space position" )] + public sealed class ComputeGrabScreenPosHlpNode : HelperParentNode + { + private readonly string[] ComputeGrabScreenPosFunction = + { + "inline float4 ComputeGrabScreenPos( float4 pos )\n", + "{\n", + "#if UNITY_UV_STARTS_AT_TOP\n", + "\tfloat scale = -1.0;\n", + "#else\n", + "\tfloat scale = 1.0;\n", + "#endif\n", + "\tfloat4 o = pos * 0.5f;\n", + "\to.xy = float2( o.x, o.y*scale ) + o.w;\n", + "#ifdef UNITY_SINGLE_PASS_STEREO\n", + "\to.xy = TransformStereoScreenSpaceTex ( o.xy, pos.w );\n", + "#endif\n", + "\to.zw = pos.zw;\n", + "\treturn o;\n", + "}\n" + }; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_funcType = "ComputeGrabScreenPos"; + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT4, false ); + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT4, false ); + m_outputPorts[ 0 ].Name = "XYZW"; + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + m_localVarName = "computeGrabScreenPos" + OutputId; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.IsTemplate && dataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.HD ) + { + dataCollector.AddFunction( m_funcType, ComputeGrabScreenPosFunction, false ); + } + return base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ComputeGrabScreenPosHlpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ComputeGrabScreenPosHlpNode.cs.meta new file mode 100644 index 0000000..4e68be7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ComputeGrabScreenPosHlpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5fe7f4be962b9e8459eb156503b99d41 +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ComputeScreenPosHlpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ComputeScreenPosHlpNode.cs new file mode 100644 index 0000000..883009b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ComputeScreenPosHlpNode.cs @@ -0,0 +1,76 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +using UnityEngine; +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Compute Screen Pos", "Camera And Screen", "Computes texture coordinate for doing a screenspace-mapped texture sample. Input is clip space position" )] + public sealed class ComputeScreenPosHlpNode : HelperParentNode + { + [SerializeField] + private bool m_normalize = false; + private string NormalizeStr = "Normalize"; + private readonly string[] NormalizeOps = + { "{0} = {0} / {0}.w;", + "{0}.z = ( UNITY_NEAR_CLIP_VALUE >= 0 ) ? {0}.z : {0}.z* 0.5 + 0.5;" + }; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_funcType = "ComputeScreenPos"; + m_funcHDFormatOverride = "ComputeScreenPos( {0} , _ProjectionParams.x )"; + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT4, false ); + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT4, false ); + m_outputPorts[ 0 ].Name = "XYZW"; + m_autoWrapProperties = true; + m_previewShaderGUID = "97bd4895d847d764eb21d2bf7aa13671"; + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + m_previewMaterialPassId = m_normalize ? 1 : 0; + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + m_localVarName = "computeScreenPos" + OutputId; + } + + public override void DrawProperties() + { + base.DrawProperties(); + m_normalize = EditorGUILayoutToggle( NormalizeStr, m_normalize ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + string result = base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + if( m_normalize ) + { + dataCollector.AddLocalVariable( UniqueId, string.Format( NormalizeOps[ 0 ], m_localVarName ) ); + dataCollector.AddLocalVariable( UniqueId, string.Format( NormalizeOps[ 1 ], m_localVarName ) ); + } + return result; + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_normalize ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > 15404 ) + { + m_normalize = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + } + + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ComputeScreenPosHlpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ComputeScreenPosHlpNode.cs.meta new file mode 100644 index 0000000..a5dba00 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ComputeScreenPosHlpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c220606396d6e6048a901f217be1435e +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeDepthNormalNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeDepthNormalNode.cs new file mode 100644 index 0000000..79ebf7e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeDepthNormalNode.cs @@ -0,0 +1,46 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Decode Depth Normal", "Miscellaneous", "Decodes both Depth and Normal from a previously encoded pixel value" )] + public sealed class DecodeDepthNormalNode : ParentNode + { + // URP will only have support for depth normals texture over v.10 ... must revisit this node when it comes out + private const string SRPErrorMessage = "This node is only currently supported on the Built-in pipeline"; + private const string DecodeDepthNormalFunc = "DecodeDepthNormal( {0}, {1}, {2} );"; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT4, false, "Encoded" ); + AddOutputPort( WirePortDataType.FLOAT, "Depth" ); + AddOutputPort( WirePortDataType.FLOAT3, "Normal" ); + m_previewShaderGUID = "dbf37c4d3ce0f0b41822584d6c9ba203"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.IsSRP ) + { + UIUtils.ShowMessage( SRPErrorMessage, MessageSeverity.Error ); + return GenerateErrorValue( outputId ); + } + + if( m_outputPorts[ outputId ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ outputId ].LocalValue( dataCollector.PortCategory ); + + dataCollector.AddToIncludes( UniqueId, Constants.UnityCgLibFuncs ); + string encodedValue = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string depthDecodedVal = "depthDecodedVal" + OutputId; + string normalDecodedVal = "normalDecodedVal" + OutputId; + RegisterLocalVariable( 0, "0", ref dataCollector, depthDecodedVal ); + RegisterLocalVariable( 1, "float3(0,0,0)", ref dataCollector, normalDecodedVal ); + dataCollector.AddLocalVariable( UniqueId, string.Format( DecodeDepthNormalFunc, encodedValue , depthDecodedVal, normalDecodedVal) ); + return m_outputPorts[ outputId ].LocalValue( dataCollector.PortCategory ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeDepthNormalNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeDepthNormalNode.cs.meta new file mode 100644 index 0000000..032de06 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeDepthNormalNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1cc4e3c718669d54c97614ac6abcfaff +timeCreated: 1513695160 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeFloatRGBAHlpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeFloatRGBAHlpNode.cs new file mode 100644 index 0000000..a80ad39 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeFloatRGBAHlpNode.cs @@ -0,0 +1,27 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Decode Float RGBA", "Miscellaneous", "Decodes RGBA color into a float" )] + public sealed class DecodeFloatRGBAHlpNode : HelperParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_funcType = "DecodeFloatRGBA"; + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT4, false ); + m_inputPorts[ 0 ].Name = "RGBA"; + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT, false ); + m_previewShaderGUID = "f71b31b15ff3f2042bafbed40acd29f4"; + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + m_localVarName = "decodeFloatRGBA" + OutputId; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeFloatRGBAHlpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeFloatRGBAHlpNode.cs.meta new file mode 100644 index 0000000..132cd57 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeFloatRGBAHlpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2c5479ff48207cf43a308ec9f110fa9f +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeFloatRGHlpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeFloatRGHlpNode.cs new file mode 100644 index 0000000..3751b22 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeFloatRGHlpNode.cs @@ -0,0 +1,27 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Decode Float RG", "Miscellaneous", "Decodes a previously-encoded RG float" )] + public sealed class DecodeFloatRGHlpNode : HelperParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_funcType = "DecodeFloatRG"; + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT2, false ); + m_inputPorts[ 0 ].Name = "RG"; + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT, false ); + m_previewShaderGUID = "1fb3121b1c8febb4dbcc2a507a2df2db"; + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + m_localVarName = "decodeFloatRG" + OutputId; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeFloatRGHlpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeFloatRGHlpNode.cs.meta new file mode 100644 index 0000000..e436b07 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeFloatRGHlpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a965812ada2b83343a1f511273fcfc52 +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeLightmapHlpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeLightmapHlpNode.cs new file mode 100644 index 0000000..a7f52dd --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeLightmapHlpNode.cs @@ -0,0 +1,109 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Decode Lightmap", "Miscellaneous", "Decodes color from Unity lightmap (RGBM or dLDR depending on platform)" )] + public sealed class DecodeLightmapHlpNode : ParentNode + { + private const string m_funcStandard = "DecodeLightmap({0})"; + private string m_funcSRP = "DecodeLightmap({0},{1})"; + + private const string DecodeInstructionsLWValueStr = "half4 decodeLightmapInstructions = half4(LIGHTMAP_HDR_MULTIPLIER, LIGHTMAP_HDR_EXPONENT, 0.0h, 0.0h);"; + private const string DecodeInstructionsNameStr = "decodeLightmapInstructions"; + private readonly string[] DecodeInstructionsHDValueStr = + { + "#ifdef UNITY_LIGHTMAP_FULL_HDR//ase_decode_lightmap_0", + "\tbool useRGBMLightmap = false;//ase_decode_lightmap_1", + "\tfloat4 decodeLightmapInstructions = float4( 0.0, 0.0, 0.0, 0.0 );//ase_decode_lightmap_2", + "#else//ase_decode_lightmap//ase_decode_lightmap_3", + "\tbool useRGBMLightmap = true;//ase_decode_lightmap_4", + "#if defined(UNITY_LIGHTMAP_RGBM_ENCODING)//ase_decode_lightmap_5", + "\tfloat4 decodeLightmapInstructions = float4(34.493242, 2.2, 0.0, 0.0);//ase_decode_lightmap_6", + "#else//ase_decode_lightmap_7", + "\tfloat4 decodeLightmapInstructions = float4( 2.0, 2.2, 0.0, 0.0 );//ase_decode_lightmap_8", + "#endif//ase_decode_lightmap_9", + "#endif//ase_decode_lightmap_10" + }; + private string m_localVarName = null; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT4, false, "Value" ); + AddInputPort( WirePortDataType.FLOAT4, false, "Instructions" ); + + AddOutputPort( WirePortDataType.FLOAT3, Constants.EmptyPortValue ); + + m_previewShaderGUID = "c2d3bee1aee183343b31b9208cb402e9"; + m_useInternalPortData = true; + } + + public override string GetIncludes() + { + return Constants.UnityCgLibFuncs; + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + m_localVarName = "decodeLightMap" + OutputId; + } + + public override void OnNodeLogicUpdate( DrawInfo drawInfo ) + { + base.OnNodeLogicUpdate( drawInfo ); + m_inputPorts[ 1 ].Visible = m_containerGraph.ParentWindow.IsShaderFunctionWindow || m_containerGraph.IsSRP; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + + string value = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string finalResult = string.Empty; + if( dataCollector.IsTemplate && dataCollector.IsSRP ) + { + string instructions = string.Empty; + if( m_inputPorts[ 1 ].IsConnected ) + { + instructions = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + } + else + { + if( dataCollector.TemplateDataCollectorInstance.IsHDRP ) + { + for( int i = 0; i < DecodeInstructionsHDValueStr.Length; i++ ) + { + dataCollector.AddLocalVariable( UniqueId, DecodeInstructionsHDValueStr[ i ] ); + } + } + else + { + dataCollector.AddLocalVariable( UniqueId, DecodeInstructionsLWValueStr ); + } + instructions = DecodeInstructionsNameStr; + + } + + finalResult = string.Format( m_funcSRP, value , instructions ); + + } + else + { + dataCollector.AddToIncludes( UniqueId, Constants.UnityCgLibFuncs ); + finalResult = string.Format( m_funcStandard, value ); + } + + RegisterLocalVariable( 0, finalResult, ref dataCollector, m_localVarName ); + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeLightmapHlpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeLightmapHlpNode.cs.meta new file mode 100644 index 0000000..07aca76 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeLightmapHlpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b3d1879d1e402b34f98b8e8cdf94d719 +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeViewNormalStereoHlpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeViewNormalStereoHlpNode.cs new file mode 100644 index 0000000..a69b499 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeViewNormalStereoHlpNode.cs @@ -0,0 +1,27 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Decode View Normal Stereo", "Miscellaneous", "Decodes view space normal from enc4.xy" )] + public sealed class DecodeViewNormalStereoHlpNode : HelperParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_funcType = "DecodeViewNormalStereo"; + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT4, false ); + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT3, false ); + m_outputPorts[ 0 ].Name = "XYZ"; + m_previewShaderGUID = "e996db1cc4510c84185cb9f933f916bb"; + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + m_localVarName = "decodeViewNormalStereo" + OutputId; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeViewNormalStereoHlpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeViewNormalStereoHlpNode.cs.meta new file mode 100644 index 0000000..0bf4466 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DecodeViewNormalStereoHlpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 94df47461b7e6244eaf92b0dab7cc7ee +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DepthFade.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DepthFade.cs new file mode 100644 index 0000000..cc6db43 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DepthFade.cs @@ -0,0 +1,168 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Depth Fade", "Surface Data", "Outputs a linear gradient representing the distance between the surface of this object and geometry behind" )] + public sealed class DepthFade : ParentNode + { + private const string ConvertToLinearStr = "Convert To Linear"; + private const string SaturateStr = "Saturate"; + private const string MirrorStr = "Mirror"; + + [SerializeField] + private bool m_convertToLinear = true; + + [SerializeField] + private bool m_saturate = false; + + [SerializeField] + private bool m_mirror = true; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT3, false, "Vertex Position", -1, MasterNodePortCategory.Fragment, 1 ); + AddInputPort( WirePortDataType.FLOAT, false, "Distance",-1,MasterNodePortCategory.Fragment,0 ); + GetInputPortByUniqueId(0).FloatInternalData = 1; + AddOutputPort( WirePortDataType.FLOAT, "Out" ); + m_useInternalPortData = true; + m_autoWrapProperties = true; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + { + UIUtils.ShowNoVertexModeNodeMessage( this ); + return "0"; + } + + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return GetOutputColorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + + if( !( dataCollector.IsTemplate && dataCollector.IsSRP ) ) + dataCollector.AddToIncludes( UniqueId, Constants.UnityCgLibFuncs ); + + if( !dataCollector.IsTemplate || dataCollector.TemplateDataCollectorInstance.CurrentSRPType != TemplateSRPType.HD ) + { + if( dataCollector.IsTemplate && dataCollector.CurrentSRPType == TemplateSRPType.Lightweight ) + { + //dataCollector.AddToUniforms( UniqueId, Constants.CameraDepthTextureSRPVar ); + //dataCollector.AddToUniforms( UniqueId, Constants.CameraDepthTextureSRPSampler ); + dataCollector.AddToDirectives( Constants.CameraDepthTextureLWEnabler, -1, AdditionalLineType.Define ); + } + else + { + dataCollector.AddToUniforms( UniqueId, Constants.CameraDepthTextureValue ); + } + + dataCollector.AddToUniforms( UniqueId, Constants.CameraDepthTextureTexelSize ); + } + + string screenPosNorm = string.Empty; + InputPort vertexPosPort = GetInputPortByUniqueId( 1 ); + if( vertexPosPort.IsConnected ) + { + string vertexPosVar = "vertexPos" + OutputId; + GenerateInputInVertex( ref dataCollector, 1, vertexPosVar, false ); + screenPosNorm = GeneratorUtils.GenerateScreenPositionNormalizedForValue( vertexPosVar, OutputId, ref dataCollector, UniqueId, CurrentPrecisionType, !dataCollector.UsingCustomScreenPos ); + } + else + { + if( dataCollector.IsTemplate ) + { + string ppsScreenPos = string.Empty; + if( !dataCollector.TemplateDataCollectorInstance.GetCustomInterpolatedData( TemplateInfoOnSematics.SCREEN_POSITION_NORMALIZED, WirePortDataType.FLOAT4, PrecisionType.Float, ref ppsScreenPos, true, MasterNodePortCategory.Fragment ) ) + { + screenPosNorm = GeneratorUtils.GenerateScreenPositionNormalized( ref dataCollector, UniqueId, CurrentPrecisionType, !dataCollector.UsingCustomScreenPos ); + } + else + { + screenPosNorm = ppsScreenPos; + } + } + else + { + screenPosNorm = GeneratorUtils.GenerateScreenPositionNormalized( ref dataCollector, UniqueId, CurrentPrecisionType, !dataCollector.UsingCustomScreenPos ); + } + } + + string screenDepth = TemplateHelperFunctions.CreateDepthFetch( dataCollector, screenPosNorm ); + if( m_convertToLinear ) + { + if( dataCollector.IsTemplate && dataCollector.IsSRP ) + screenDepth = string.Format( "LinearEyeDepth({0},_ZBufferParams)", screenDepth ); + else + screenDepth = string.Format( "LinearEyeDepth({0})", screenDepth ); + } + else + { + screenDepth = string.Format( "({0}*( _ProjectionParams.z - _ProjectionParams.y ))", screenDepth ); + } + + string distance = GetInputPortByUniqueId( 0 ).GeneratePortInstructions( ref dataCollector ); + + dataCollector.AddLocalVariable( UniqueId, "float screenDepth" + OutputId + " = " + screenDepth + ";" ); + + string finalVarName = "distanceDepth" + OutputId; + string finalVarValue = string.Empty; + if( dataCollector.IsTemplate && dataCollector.IsSRP ) + finalVarValue = "( screenDepth" + OutputId + " - LinearEyeDepth( " + screenPosNorm + ".z,_ZBufferParams ) ) / ( " + distance + " )"; + else + finalVarValue = "( screenDepth" + OutputId + " - LinearEyeDepth( " + screenPosNorm + ".z ) ) / ( " + distance + " )"; + + if( m_mirror ) + { + finalVarValue = string.Format( "abs( {0} )", finalVarValue ); + } + + if( m_saturate ) + { + finalVarValue = string.Format( "saturate( {0} )", finalVarValue ); + } + + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT, finalVarName, finalVarValue ); + m_outputPorts[ 0 ].SetLocalValue( finalVarName, dataCollector.PortCategory ); + return GetOutputColorItem( 0, outputId, finalVarName ); + } + + public override void DrawProperties() + { + base.DrawProperties(); + m_convertToLinear = EditorGUILayoutToggle( ConvertToLinearStr, m_convertToLinear ); + m_mirror = EditorGUILayoutToggle( MirrorStr, m_mirror ); + m_saturate = EditorGUILayoutToggle( SaturateStr, m_saturate ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() >= 13901 ) + { + m_convertToLinear = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + if( UIUtils.CurrentShaderVersion() > 15607 ) + { + m_saturate = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + + if( UIUtils.CurrentShaderVersion() > 15700 ) + { + m_mirror = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_convertToLinear ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_saturate ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_mirror ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DepthFade.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DepthFade.cs.meta new file mode 100644 index 0000000..c302a61 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DepthFade.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 279c74ce44e24204d803be6ec743c290 +timeCreated: 1491316341 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DiffuseAndSpecularFromMetallicNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DiffuseAndSpecularFromMetallicNode.cs new file mode 100644 index 0000000..af59933 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DiffuseAndSpecularFromMetallicNode.cs @@ -0,0 +1,59 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Diffuse And Specular From Metallic", "Miscellaneous", "Gets Diffuse and Specular values from Metallic. Uses DiffuseAndSpecularFromMetallic function from UnityStandardUtils." )] + public class DiffuseAndSpecularFromMetallicNode : ParentNode + { + //half3 DiffuseAndSpecularFromMetallic (half3 albedo, half metallic, out half3 specColor, out half oneMinusReflectivity) + private const string FuncFormat = "DiffuseAndSpecularFromMetallic({0},{1},{2},{3})"; + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT3, false, "Albedo" ); + AddInputPort( WirePortDataType.FLOAT, false, "Metallic" ); + AddOutputPort( WirePortDataType.FLOAT3, "Out" ); + AddOutputPort( WirePortDataType.FLOAT3, "Spec Color" ); + AddOutputPort( WirePortDataType.FLOAT, "One Minus Reflectivity" ); + m_previewShaderGUID = "c7c4485750948a045b5dab0985896e17"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.IsSRP ) + { + UIUtils.ShowMessage( UniqueId, "Diffuse And Specular From Metallic Node not compatible with SRP" ); + return m_outputPorts[0].ErrorValue; + } + + if( m_outputPorts[ outputId ].IsLocalValue( dataCollector.PortCategory ) ) + { + return m_outputPorts[ outputId ].LocalValue( dataCollector.PortCategory ); + } + + dataCollector.AddToIncludes( UniqueId, Constants.UnityStandardUtilsLibFuncs ); + + string albedo = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string metallic = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + + string specColorVar = "specColor" + OutputId; + string oneMinusReflectivityVar = "oneMinusReflectivity" + OutputId; + string varName = "diffuseAndSpecularFromMetallic" + OutputId; + + dataCollector.AddLocalVariable( UniqueId, PrecisionType.Half, WirePortDataType.FLOAT3, specColorVar, "(0).xxx" ); + dataCollector.AddLocalVariable( UniqueId, PrecisionType.Half, WirePortDataType.FLOAT, oneMinusReflectivityVar, "0" ); + + + string varValue = string.Format( FuncFormat, albedo, metallic, specColorVar, oneMinusReflectivityVar ); + dataCollector.AddLocalVariable( UniqueId, PrecisionType.Half, WirePortDataType.FLOAT3, varName, varValue ); + m_outputPorts[ 0 ].SetLocalValue( varName, dataCollector.PortCategory ); + m_outputPorts[ 1 ].SetLocalValue( specColorVar, dataCollector.PortCategory ); + m_outputPorts[ 2 ].SetLocalValue( oneMinusReflectivityVar, dataCollector.PortCategory ); + + return m_outputPorts[ outputId ].LocalValue( dataCollector.PortCategory ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DiffuseAndSpecularFromMetallicNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DiffuseAndSpecularFromMetallicNode.cs.meta new file mode 100644 index 0000000..4ab9e6f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DiffuseAndSpecularFromMetallicNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a792f114a5433af499dce78ebe05a9e6 +timeCreated: 1534266498 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DitheringNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DitheringNode.cs new file mode 100644 index 0000000..2e98709 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DitheringNode.cs @@ -0,0 +1,311 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Dither", "Camera And Screen", "Generates a dithering pattern" )] + public sealed class DitheringNode : ParentNode + { + private const string InputTypeStr = "Pattern"; + private const string CustomScreenPosStr = "screenPosition"; + + private string m_functionHeader = "Dither4x4Bayer( {0}, {1} )"; + private string m_functionBody = string.Empty; + + [SerializeField] + private int m_selectedPatternInt = 0; + + [SerializeField] + private bool m_customScreenPos = false; + + private readonly string[] PatternsFuncStr = { "4x4Bayer", "8x8Bayer", "NoiseTex" }; + private readonly string[] PatternsStr = { "4x4 Bayer", "8x8 Bayer", "Noise Texture" }; + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + + private InputPort m_texPort; + private InputPort m_ssPort; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, Constants.EmptyPortValue ); + AddInputPort( WirePortDataType.SAMPLER2D, false, "Pattern"); + m_inputPorts[ 1 ].CreatePortRestrictions( WirePortDataType.SAMPLER2D ); + m_texPort = m_inputPorts[ 1 ]; + AddInputPort( WirePortDataType.FLOAT4, false, "Screen Position" ); + + AddInputPort( WirePortDataType.SAMPLERSTATE, false, "SS" ); + m_inputPorts[ 3 ].CreatePortRestrictions( WirePortDataType.SAMPLERSTATE ); + m_ssPort = m_inputPorts[ 3 ]; + + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + m_textLabelWidth = 110; + m_autoWrapProperties = true; + m_hasLeftDropdown = true; + SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, PatternsStr[ m_selectedPatternInt ] ) ); + UpdatePorts(); + } + + public override void Destroy() + { + base.Destroy(); + m_upperLeftWidget = null; + m_texPort = null; + m_ssPort = null; + } + + public override void AfterCommonInit() + { + base.AfterCommonInit(); + if( PaddingTitleLeft == 0 ) + { + PaddingTitleLeft = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + if( PaddingTitleRight == 0 ) + PaddingTitleRight = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + } + } + + public override void OnConnectedOutputNodeChanges( int outputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( outputPortId, otherNodeId, otherPortId, name, type ); + if( !m_texPort.CheckValidType( type ) ) + { + m_texPort.FullDeleteConnections(); + UIUtils.ShowMessage( UniqueId, "Dithering node only accepts SAMPLER2D input type.\nTexture Object connected changed to " + type + ", connection was lost, please review and update accordingly.", MessageSeverity.Warning ); + } + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + EditorGUI.BeginChangeCheck(); + m_selectedPatternInt = m_upperLeftWidget.DrawWidget( this, m_selectedPatternInt, PatternsStr ); + if( EditorGUI.EndChangeCheck() ) + { + UpdatePorts(); + } + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUI.BeginChangeCheck(); + m_selectedPatternInt = EditorGUILayoutPopup( "Pattern", m_selectedPatternInt, PatternsStr ); + if ( EditorGUI.EndChangeCheck() ) + { + UpdatePorts(); + } + EditorGUI.BeginChangeCheck(); + m_customScreenPos = EditorGUILayoutToggle( "Screen Position", m_customScreenPos ); + if( EditorGUI.EndChangeCheck() ) + { + UpdatePorts(); + } + } + + private void UpdatePorts() + { + m_texPort.Visible = ( m_selectedPatternInt == 2 ); + m_ssPort.Visible = ( m_selectedPatternInt == 2 ); + m_inputPorts[ 2 ].Visible = m_customScreenPos; + m_sizeIsDirty = true; + } + + private void GeneratePattern( ref MasterNodeDataCollector dataCollector ) + { + SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, PatternsStr[ m_selectedPatternInt ] ) ); + switch ( m_selectedPatternInt ) + { + default: + case 0: + { + m_functionBody = string.Empty; + m_functionHeader = "Dither" + PatternsFuncStr[ m_selectedPatternInt ] + "( {0}, {1} )"; + IOUtils.AddFunctionHeader( ref m_functionBody, "inline float Dither" + PatternsFuncStr[ m_selectedPatternInt ] + "( int x, int y )" ); + IOUtils.AddFunctionLine( ref m_functionBody, "const float dither[ 16 ] = {" ); + IOUtils.AddFunctionLine( ref m_functionBody, " 1, 9, 3, 11," ); + IOUtils.AddFunctionLine( ref m_functionBody, " 13, 5, 15, 7," ); + IOUtils.AddFunctionLine( ref m_functionBody, " 4, 12, 2, 10," ); + IOUtils.AddFunctionLine( ref m_functionBody, " 16, 8, 14, 6 };" ); + IOUtils.AddFunctionLine( ref m_functionBody, "int r = y * 4 + x;" ); + IOUtils.AddFunctionLine( ref m_functionBody, "return dither[r] / 16; // same # of instructions as pre-dividing due to compiler magic" ); + IOUtils.CloseFunctionBody( ref m_functionBody ); + } + break; + case 1: + { + m_functionBody = string.Empty; + m_functionHeader = "Dither" + PatternsFuncStr[ m_selectedPatternInt ] + "( {0}, {1} )"; + IOUtils.AddFunctionHeader( ref m_functionBody, "inline float Dither" + PatternsFuncStr[ m_selectedPatternInt ] + "( int x, int y )" ); + IOUtils.AddFunctionLine( ref m_functionBody, "const float dither[ 64 ] = {" ); + IOUtils.AddFunctionLine( ref m_functionBody, " 1, 49, 13, 61, 4, 52, 16, 64," ); + IOUtils.AddFunctionLine( ref m_functionBody, " 33, 17, 45, 29, 36, 20, 48, 32," ); + IOUtils.AddFunctionLine( ref m_functionBody, " 9, 57, 5, 53, 12, 60, 8, 56," ); + IOUtils.AddFunctionLine( ref m_functionBody, " 41, 25, 37, 21, 44, 28, 40, 24," ); + IOUtils.AddFunctionLine( ref m_functionBody, " 3, 51, 15, 63, 2, 50, 14, 62," ); + IOUtils.AddFunctionLine( ref m_functionBody, " 35, 19, 47, 31, 34, 18, 46, 30," ); + IOUtils.AddFunctionLine( ref m_functionBody, " 11, 59, 7, 55, 10, 58, 6, 54," ); + IOUtils.AddFunctionLine( ref m_functionBody, " 43, 27, 39, 23, 42, 26, 38, 22};" ); + IOUtils.AddFunctionLine( ref m_functionBody, "int r = y * 8 + x;" ); + IOUtils.AddFunctionLine( ref m_functionBody, "return dither[r] / 64; // same # of instructions as pre-dividing due to compiler magic" ); + IOUtils.CloseFunctionBody( ref m_functionBody ); + } + break; + case 2: + { + ParentGraph outsideGraph = UIUtils.CurrentWindow.OutsideGraph; + + m_functionBody = string.Empty; + m_functionHeader = "Dither" + PatternsFuncStr[ m_selectedPatternInt ] + "({0}, {1}, {2})"; + + IOUtils.AddFunctionHeader( ref m_functionBody, "inline float Dither" + PatternsFuncStr[ m_selectedPatternInt ] + "( float4 screenPos, " + GeneratorUtils.GetPropertyDeclaraction( "noiseTexture", TextureType.Texture2D, ", " ) + GeneratorUtils.GetSamplerDeclaraction( "samplernoiseTexture", TextureType.Texture2D, ", " ) + "float4 noiseTexelSize )" ); + + string samplingCall = GeneratorUtils.GenerateSamplingCall( ref dataCollector, WirePortDataType.SAMPLER2D, "noiseTexture", "samplernoiseTexture", "screenPos.xy * _ScreenParams.xy * noiseTexelSize.xy", MipType.MipLevel, "0" ); + IOUtils.AddFunctionLine( ref m_functionBody, "float dither = "+ samplingCall + ".g;" ); + IOUtils.AddFunctionLine( ref m_functionBody, "float ditherRate = noiseTexelSize.x * noiseTexelSize.y;" ); + IOUtils.AddFunctionLine( ref m_functionBody, "dither = ( 1 - ditherRate ) * dither + ditherRate;" ); + IOUtils.AddFunctionLine( ref m_functionBody, "return dither;" ); + IOUtils.CloseFunctionBody( ref m_functionBody ); + } + break; + } + } + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + base.PropagateNodeData( nodeData, ref dataCollector ); + dataCollector.UsingCustomScreenPos = true; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + GeneratePattern( ref dataCollector ); + + if( !( dataCollector.IsTemplate && dataCollector.IsSRP ) ) + dataCollector.AddToIncludes( UniqueId, Constants.UnityShaderVariables ); + string varName = string.Empty; + bool isFragment = dataCollector.IsFragmentCategory; + if( m_customScreenPos && m_inputPorts[ 2 ].IsConnected ) + { + varName = "ditherCustomScreenPos" + OutputId; + string customScreenPosVal = m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector ); + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT4, varName, customScreenPosVal ); + } + else + { + if( dataCollector.TesselationActive && isFragment ) + { + varName = GeneratorUtils.GenerateClipPositionOnFrag( ref dataCollector, UniqueId, CurrentPrecisionType ); + } + else + { + if( dataCollector.IsTemplate ) + { + varName = dataCollector.TemplateDataCollectorInstance.GetScreenPosNormalized( CurrentPrecisionType ); + } + else + { + varName = GeneratorUtils.GenerateScreenPositionNormalized( ref dataCollector, UniqueId, CurrentPrecisionType, !dataCollector.UsingCustomScreenPos ); + } + } + } + string surfInstruction = varName + ".xy * _ScreenParams.xy"; + m_showErrorMessage = false; + string functionResult = ""; + string noiseTex = string.Empty; + switch ( m_selectedPatternInt ) + { + default: + case 0: + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT2, "clipScreen" + OutputId, surfInstruction ); + functionResult = dataCollector.AddFunctions( m_functionHeader, m_functionBody, "fmod(" + "clipScreen" + OutputId + ".x, 4)", "fmod(" + "clipScreen" + OutputId + ".y, 4)" ); + break; + case 1: + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT2, "clipScreen" + OutputId, surfInstruction ); + functionResult = dataCollector.AddFunctions( m_functionHeader, m_functionBody, "fmod(" + "clipScreen" + OutputId + ".x, 8)", "fmod(" + "clipScreen" + OutputId + ".y, 8)" ); + break; + case 2: + { + if( !m_texPort.IsConnected ) + { + m_showErrorMessage = true; + m_errorMessageTypeIsError = NodeMessageType.Warning; + m_errorMessageTooltip = "Please connect a texture object to the Pattern input port to generate a proper dithered pattern"; + return "0"; + } else + { + ParentGraph outsideGraph = UIUtils.CurrentWindow.OutsideGraph; + noiseTex = m_texPort.GeneratePortInstructions( ref dataCollector ); + //GeneratePattern( ref dataCollector ); + dataCollector.AddToUniforms( UniqueId, "float4 " + noiseTex + "_TexelSize;", dataCollector.IsSRP ); +#if UNITY_2018_1_OR_NEWER + if( outsideGraph.SamplingMacros ) +#else + if( outsideGraph.SamplingMacros && !outsideGraph.IsStandardSurface ) +#endif + { + string sampler = string.Empty; + if( m_ssPort.IsConnected ) + { + sampler = m_ssPort.GeneratePortInstructions( ref dataCollector ); + } + else + { + sampler = GeneratorUtils.GenerateSamplerState( ref dataCollector, UniqueId, noiseTex ); + } + //if( outsideGraph.IsSRP ) + // functionResult = dataCollector.AddFunctions( m_functionHeader, m_functionBody, varName, noiseTex + ", " + sampler, noiseTex + "_TexelSize" ); + //else + functionResult = dataCollector.AddFunctions( m_functionHeader, m_functionBody, varName, noiseTex + ", " + sampler, noiseTex + "_TexelSize" ); + } + else + { + functionResult = dataCollector.AddFunctions( m_functionHeader, m_functionBody, varName, noiseTex, noiseTex + "_TexelSize" ); + } + } + } + break; + } + + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT, "dither" + OutputId, functionResult ); + + if( m_inputPorts[ 0 ].IsConnected ) + { + string driver = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + dataCollector.AddLocalVariable( UniqueId, "dither" + OutputId+" = step( dither"+ OutputId + ", "+ driver + " );" ); + } + + //RegisterLocalVariable( 0, functionResult, ref dataCollector, "dither" + OutputId ); + m_outputPorts[ 0 ].SetLocalValue( "dither" + OutputId, dataCollector.PortCategory ); + + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_selectedPatternInt = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > 15404 ) + { + m_customScreenPos = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + UpdatePorts(); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_selectedPatternInt ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_customScreenPos ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DitheringNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DitheringNode.cs.meta new file mode 100644 index 0000000..0fc9587 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/DitheringNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 284ebed5f88c13e45bc331b2df93aa75 +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/EncodeDepthNormalNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/EncodeDepthNormalNode.cs new file mode 100644 index 0000000..eec5532 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/EncodeDepthNormalNode.cs @@ -0,0 +1,34 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Encode Depth Normal", "Miscellaneous", "Encodes both Depth and Normal values into a Float4 value" )] + public sealed class EncodeDepthNormalNode : ParentNode + { + private const string EncodeDepthNormalFunc = "EncodeDepthNormal( {0}, {1} )"; + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, "Depth" ); + AddInputPort( WirePortDataType.FLOAT3, false, "Normal" ); + AddOutputPort( WirePortDataType.FLOAT4, Constants.EmptyPortValue ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + dataCollector.AddToIncludes( UniqueId, Constants.UnityCgLibFuncs ); + string depthValue = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string normalValue = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + + RegisterLocalVariable( 0, string.Format( EncodeDepthNormalFunc, depthValue, normalValue ), ref dataCollector, "encodedDepthNormal" + OutputId ); + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/EncodeDepthNormalNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/EncodeDepthNormalNode.cs.meta new file mode 100644 index 0000000..acc45fc --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/EncodeDepthNormalNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: cabbbe25e4b26b54c84e27007c08a7dd +timeCreated: 1513695146 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/EncodeFloatRGBAHlpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/EncodeFloatRGBAHlpNode.cs new file mode 100644 index 0000000..b3f95a0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/EncodeFloatRGBAHlpNode.cs @@ -0,0 +1,27 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Encode Float RGBA", "Miscellaneous", "Encodes [0..1] range float into RGBA color, for storage in low precision render target" )] + public sealed class EncodeFloatRGBAHlpNode : HelperParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_funcType = "EncodeFloatRGBA"; + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT, false ); + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT4, false ); + m_outputPorts[ 0 ].Name = "RGBA"; + m_previewShaderGUID = "c21569bf5b9371b4ca13c0c00abd5562"; + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + m_localVarName = "encodeFloatRGBA" + OutputId; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/EncodeFloatRGBAHlpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/EncodeFloatRGBAHlpNode.cs.meta new file mode 100644 index 0000000..0d25dc4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/EncodeFloatRGBAHlpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6532496dc1791d94cbb46004000bda61 +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/EncodeFloatRGHlpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/EncodeFloatRGHlpNode.cs new file mode 100644 index 0000000..093389e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/EncodeFloatRGHlpNode.cs @@ -0,0 +1,27 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Encode Float RG ", "Miscellaneous", "Encodes [0..1] range float into a float2" )] + public sealed class EncodeFloatRGHlpNode : HelperParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_funcType = "EncodeFloatRG "; + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT, false ); + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT2, false ); + m_outputPorts[ 0 ].Name = "RG"; + m_previewShaderGUID = "a44b520baa5c39e41bc69a22ea46f24d"; + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + m_localVarName = "encodeFloatRG" + OutputId; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/EncodeFloatRGHlpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/EncodeFloatRGHlpNode.cs.meta new file mode 100644 index 0000000..e5ce8e8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/EncodeFloatRGHlpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d8bce5e7063ac6b4d93aaf15f7fd1b10 +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/EncodeViewNormalStereoHlpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/EncodeViewNormalStereoHlpNode.cs new file mode 100644 index 0000000..767097b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/EncodeViewNormalStereoHlpNode.cs @@ -0,0 +1,27 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Encode View Normal Stereo", "Miscellaneous", "Encodes view space normal into two numbers in [0..1] range" )] + public sealed class EncodeViewNormalStereoHlpNode : HelperParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_funcType = "EncodeViewNormalStereo"; + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT3, false ); + m_inputPorts[ 0 ].Name = "XYZ"; + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT2, false ); + m_previewShaderGUID = "3d0b3d482b7246c4cb60fa73e6ceac6c"; + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + m_localVarName = "encodeViewNormalStereo" + OutputId; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/EncodeViewNormalStereoHlpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/EncodeViewNormalStereoHlpNode.cs.meta new file mode 100644 index 0000000..48043ee --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/EncodeViewNormalStereoHlpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 17511ec398441ac479a2dd77d2531837 +timeCreated: 1481126953 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/GammaToLinearNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/GammaToLinearNode.cs new file mode 100644 index 0000000..afeaae0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/GammaToLinearNode.cs @@ -0,0 +1,122 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Gamma To Linear", "Image Effects", "Converts color from gamma space to linear space" )] + public sealed class GammaToLinearNode : HelperParentNode + { + public readonly static string[] ModeListStr = { "Fast sRGB to Linear", "Exact sRGB to Linear" }; + public readonly static int[] ModeListInt = { 0, 1 }; + + public readonly static string[] ModeListStrLW = { "Fast sRGB to Linear", "Exact sRGB to Linear", "Gamma 2.0 to Linear", "Gamma 2.2 to Linear" }; + public readonly static int[] ModeListIntLW = { 0, 1, 2, 3 }; + + [SerializeField] + public int m_selectedMode = 0; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_funcType = "GammaToLinearSpace"; + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT3, false ); + m_inputPorts[ 0 ].Name = "RGB"; + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT3, false ); + m_autoWrapProperties = true; + m_previewShaderGUID = "e82a888a6ebdb1443823aafceaa051b9"; + m_textLabelWidth = 120; + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + m_localVarName = "gammaToLinear" + OutputId; + } + + public override void DrawProperties() + { + base.DrawProperties(); + if( ContainerGraph.IsSRP ) + { + m_selectedMode = EditorGUILayoutIntPopup( "Mode", m_selectedMode, ModeListStrLW, ModeListIntLW ); + EditorGUILayout.HelpBox( "Fast sRGB: fast approximation from sRGB to Linear\n\nExact sRGB: a more expensive but exact calculation from sRGB to Linear.\n\nGamma 2.0: crude approximation from Gamma to Linear using a power of 2.0 gamma value\n\nGamma 2.2: an approximation from Gamma to Linear using a power of 2.2 gamma value", MessageType.None ); + } + else + { + m_selectedMode = EditorGUILayoutIntPopup( "Mode", m_selectedMode, ModeListStr, ModeListInt ); + EditorGUILayout.HelpBox( "Fast sRGB: fast approximation from sRGB to Linear\n\nExact sRGB: a more expensive but exact calculation from sRGB to Linear.", MessageType.None ); + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + string result = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + + if( !dataCollector.IsSRP ) + { + m_selectedMode = Mathf.Min( m_selectedMode, 1 ); + + if( m_selectedMode == 1 ) + { + dataCollector.AddLocalVariable( UniqueId, "half3 " + m_localVarName + " = " + result + ";" ); + dataCollector.AddLocalVariable( UniqueId, m_localVarName + " = half3( GammaToLinearSpaceExact(" + m_localVarName + ".r), GammaToLinearSpaceExact(" + m_localVarName + ".g), GammaToLinearSpaceExact(" + m_localVarName + ".b) );" ); + return m_localVarName; + } + return base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + } + else + { + dataCollector.AddToIncludes( UniqueId, TemplateHelperFunctions.CoreCommonLib ); + dataCollector.AddToIncludes( UniqueId, TemplateHelperFunctions.CoreColorLib ); + switch( m_selectedMode ) + { + default: + case 0: + m_funcLWFormatOverride = "FastSRGBToLinear( {0} )"; + m_funcHDFormatOverride = "FastSRGBToLinear( {0} )"; + break; + case 1: + m_funcLWFormatOverride = "SRGBToLinear( {0} )"; + m_funcHDFormatOverride = "SRGBToLinear( {0} )"; + break; + case 2: + m_funcLWFormatOverride = "Gamma20ToLinear( {0} )"; + m_funcHDFormatOverride = "Gamma20ToLinear( {0} )"; + break; + case 3: + m_funcLWFormatOverride = "Gamma22ToLinear( {0} )"; + m_funcHDFormatOverride = "Gamma22ToLinear( {0} )"; + break; + } + + return base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_selectedMode ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > 11003 && UIUtils.CurrentShaderVersion() <= 14503 ) + { + bool fast = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + if( fast ) + m_selectedMode = 1; + } + + if( UIUtils.CurrentShaderVersion() > 14503 ) + { + m_selectedMode = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/GammaToLinearNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/GammaToLinearNode.cs.meta new file mode 100644 index 0000000..5c2ec6a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/GammaToLinearNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: cb2775ac410d0134c85b7f1ac0a0399f +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/HelperParentNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/HelperParentNode.cs new file mode 100644 index 0000000..79c18bb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/HelperParentNode.cs @@ -0,0 +1,93 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +//https://docs.unity3d.com/Manual/SL-BuiltinFunctions.html + +using System; +using UnityEngine; +namespace AmplifyShaderEditor +{ + [Serializable] + public class HelperParentNode : ParentNode + { + [SerializeField] + protected string m_funcType = string.Empty; + + [SerializeField] + protected string m_funcLWFormatOverride = string.Empty; + + [SerializeField] + protected string m_funcHDFormatOverride = string.Empty; + + protected string m_localVarName = null; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, Constants.EmptyPortValue ); + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + m_useInternalPortData = true; + } + + public override string GetIncludes() + { + return Constants.UnityCgLibFuncs; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + + if( !( dataCollector.IsTemplate && dataCollector.IsSRP ) ) + dataCollector.AddToIncludes( UniqueId, Constants.UnityCgLibFuncs ); + + string concatResults = string.Empty; + bool first = true; + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + if( m_inputPorts[ i ].Visible ) + { + if( !first ) + { + concatResults += " , "; + } + else + { + first = false; + } + + string result = string.Empty; + if( m_inputPorts[ i ].IsConnected ) + { + result = m_inputPorts[ i ].GeneratePortInstructions( ref dataCollector ); + } + else + { + result = m_inputPorts[ i ].WrappedInternalData; + } + + concatResults += result; + } + } + string finalResult = m_funcType + "( " + concatResults + " )"; + if( dataCollector.IsTemplate ) + { + if( dataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.Lightweight && !string.IsNullOrEmpty( m_funcLWFormatOverride ) ) + { + finalResult = string.Format( m_funcLWFormatOverride, concatResults ); + } + else if( dataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.HD && !string.IsNullOrEmpty( m_funcHDFormatOverride ) ) + { + finalResult = string.Format( m_funcHDFormatOverride, concatResults ); + } + + } + + RegisterLocalVariable( 0, finalResult, ref dataCollector, m_localVarName ); + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/HelperParentNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/HelperParentNode.cs.meta new file mode 100644 index 0000000..504a4cc --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/HelperParentNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0eba64bdadd330743894a0623677cb83 +timeCreated: 1481126953 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/LinearToGammaNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/LinearToGammaNode.cs new file mode 100644 index 0000000..81171cc --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/LinearToGammaNode.cs @@ -0,0 +1,127 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Linear To Gamma", "Image Effects", "Converts color from linear space to gamma space" )] + public sealed class LinearToGammaNode : HelperParentNode + { + //[SerializeField] + //private bool m_exact = false; + + //private readonly static GUIContent LGExactContent = new GUIContent( "Exact Conversion", "Uses a precise version of the conversion, it's more expensive and often not needed." ); + + public readonly static string[] ModeListStr = { "Fast Linear to sRGB", "Exact Linear to sRGB" }; + public readonly static int[] ModeListInt = { 0, 1 }; + + public readonly static string[] ModeListStrLW = { "Fast Linear to sRGB", "Exact Linear to sRGB", "Linear to Gamma 2.0", "Linear to Gamma 2.2" }; + public readonly static int[] ModeListIntLW = { 0, 1, 2, 3 }; + + [SerializeField] + public int m_selectedMode = 0; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_funcType = "LinearToGammaSpace"; + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT3, false ); + m_inputPorts[ 0 ].Name = "RGB"; + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT3, false ); + m_autoWrapProperties = true; + m_previewShaderGUID = "9027c408b928c5c4d8b450712049d541"; + m_textLabelWidth = 120; + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + m_localVarName = "linearToGamma" + OutputId; + } + + public override void DrawProperties() + { + base.DrawProperties(); + if( ContainerGraph.IsSRP ) + { + m_selectedMode = EditorGUILayoutIntPopup( "Mode", m_selectedMode, ModeListStrLW, ModeListIntLW ); + EditorGUILayout.HelpBox( "Fast Linear: fast approximation from Linear to sRGB\n\nExact Linear: a more expensive but exact calculation from Linear to sRGB.\n\nLinear 2.0: crude approximation from Linear to Gamma using a power of 1/2.0 gamma value\n\nLinear 2.2: an approximation from Linear to Gamma using a power of 1/2.2 gamma value", MessageType.None ); + } + else + { + m_selectedMode = EditorGUILayoutIntPopup( "Mode", m_selectedMode, ModeListStr, ModeListInt ); + EditorGUILayout.HelpBox( "Fast Linear: fast approximation from Linear to sRGB\n\nExact Linear: a more expensive but exact calculation from Linear to sRGB.", MessageType.None ); + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + string result = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + + if( !dataCollector.IsSRP ) + { + m_selectedMode = Mathf.Min( m_selectedMode, 1 ); + + if( m_selectedMode == 1 ) + { + dataCollector.AddLocalVariable( UniqueId, "half3 " + m_localVarName + " = " + result + ";" ); + dataCollector.AddLocalVariable( UniqueId, m_localVarName + " = half3( LinearToGammaSpaceExact(" + m_localVarName + ".r), LinearToGammaSpaceExact(" + m_localVarName + ".g), LinearToGammaSpaceExact(" + m_localVarName + ".b) );" ); + return m_localVarName; + } + return base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + } + else + { + dataCollector.AddToIncludes( UniqueId, TemplateHelperFunctions.CoreCommonLib ); + dataCollector.AddToIncludes( UniqueId, TemplateHelperFunctions.CoreColorLib ); + switch( m_selectedMode ) + { + default: + case 0: + m_funcLWFormatOverride = "FastLinearToSRGB( {0} )"; + m_funcHDFormatOverride = "FastLinearToSRGB( {0} )"; + break; + case 1: + m_funcLWFormatOverride = "LinearToSRGB( {0} )"; + m_funcHDFormatOverride = "LinearToSRGB( {0} )"; + break; + case 2: + m_funcLWFormatOverride = "LinearToGamma20( {0} )"; + m_funcHDFormatOverride = "LinearToGamma20( {0} )"; + break; + case 3: + m_funcLWFormatOverride = "LinearToGamma22( {0} )"; + m_funcHDFormatOverride = "LinearToGamma22( {0} )"; + break; + } + + return base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_selectedMode ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > 11003 && UIUtils.CurrentShaderVersion() <= 14503 ) + { + bool fast = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + if( fast ) + m_selectedMode = 1; + } + + if( UIUtils.CurrentShaderVersion() > 14503 ) + { + m_selectedMode = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/LinearToGammaNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/LinearToGammaNode.cs.meta new file mode 100644 index 0000000..a4065b8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/LinearToGammaNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a5b8a474628aeca4e86b1599f0b26ebc +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/LuminanceHlpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/LuminanceHlpNode.cs new file mode 100644 index 0000000..6f9dd6c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/LuminanceHlpNode.cs @@ -0,0 +1,26 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Luminance", "Image Effects", "Converts color to luminance (grayscale)", Deprecated = true, DeprecatedAlternativeType = typeof( TFHCGrayscale ), DeprecatedAlternative = "Grayscale" )] + public sealed class LuminanceHlpNode : HelperParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_funcType = "Luminance"; + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT3, false ); + m_inputPorts[ 0 ].Name = "RGB"; + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT, false ); + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + m_localVarName = "luminance" + OutputId; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/LuminanceHlpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/LuminanceHlpNode.cs.meta new file mode 100644 index 0000000..0b33efd --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/LuminanceHlpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e8567c2e3eb634a428819fbdfbff110f +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ObjSpaceLightDirHlpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ObjSpaceLightDirHlpNode.cs new file mode 100644 index 0000000..d862fda --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ObjSpaceLightDirHlpNode.cs @@ -0,0 +1,43 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Object Space Light Dir", "Light", "Computes object space light direction (not normalized)" )] + public sealed class ObjSpaceLightDirHlpNode : HelperParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_funcType = "ObjSpaceLightDir"; + m_inputPorts[ 0 ].Visible = false; + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT3, false ); + m_outputPorts[ 0 ].Name = "XYZ"; + + AddOutputPort( WirePortDataType.FLOAT, "X" ); + AddOutputPort( WirePortDataType.FLOAT, "Y" ); + AddOutputPort( WirePortDataType.FLOAT, "Z" ); + + m_useInternalPortData = false; + m_previewShaderGUID = "c7852de24cec4a744b5358921e23feee"; + m_drawPreviewAsSphere = true; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.IsTemplate ) + { + //Template must have its Light Mode correctly configured on tags to work as intended + return GetOutputVectorItem( 0, outputId, dataCollector.TemplateDataCollectorInstance.GetObjectSpaceLightDir( CurrentPrecisionType ) ); + } + + dataCollector.AddToIncludes( UniqueId, Constants.UnityCgLibFuncs ); + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_POS ); + + string vertexPos = GeneratorUtils.GenerateVertexPosition( ref dataCollector, UniqueId, WirePortDataType.FLOAT4 ); + return GetOutputVectorItem( 0, outputId, GeneratorUtils.GenerateObjectLightDirection( ref dataCollector, UniqueId, CurrentPrecisionType, vertexPos ) ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ObjSpaceLightDirHlpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ObjSpaceLightDirHlpNode.cs.meta new file mode 100644 index 0000000..b8965aa --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ObjSpaceLightDirHlpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0da9baf35c74c7e468cbe50c3d23ccf0 +timeCreated: 1481126953 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ObjSpaceViewDirHlpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ObjSpaceViewDirHlpNode.cs new file mode 100644 index 0000000..12c1ef8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ObjSpaceViewDirHlpNode.cs @@ -0,0 +1,34 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Object Space View Dir", "Object Transform", "Object space direction (not normalized) from given object space vertex position towards the camera" )] + public sealed class ObjSpaceViewDirHlpNode : HelperParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_funcType = "ObjSpaceViewDir"; + //TODO: revisit this later + m_funcLWFormatOverride = "( mul(GetWorldToObjectMatrix(), float4(_WorldSpaceCameraPos.xyz, 1)).xyz - {0}.xyz )"; + m_funcHDFormatOverride = "( mul(GetWorldToObjectMatrix(), float4(_WorldSpaceCameraPos.xyz, 1)).xyz - {0}.xyz )"; + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT4, false ); + m_inputPorts[ 0 ].Vector4InternalData = new UnityEngine.Vector4( 0, 0, 0, 1 ); + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT3, false ); + m_outputPorts[ 0 ].Name = "XYZ"; + AddOutputPort( WirePortDataType.FLOAT, "X" ); + AddOutputPort( WirePortDataType.FLOAT, "Y" ); + AddOutputPort( WirePortDataType.FLOAT, "Z" ); + m_previewShaderGUID = "c7852de24cec4a744b5358921e23feee"; + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + m_localVarName = "objectSpaceViewDir" + OutputId; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ObjSpaceViewDirHlpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ObjSpaceViewDirHlpNode.cs.meta new file mode 100644 index 0000000..fc6c58f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ObjSpaceViewDirHlpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 590b8e54b63ad344f8d8c372e4fc5ed5 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ParallaxMappingNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ParallaxMappingNode.cs new file mode 100644 index 0000000..929f41b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ParallaxMappingNode.cs @@ -0,0 +1,148 @@ +using UnityEngine; +using UnityEditor; + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Parallax Mapping", "UV Coordinates", "Calculates offseted UVs for parallax mapping" )] + public sealed class ParallaxMappingNode : ParentNode + { + private enum ParallaxType { Normal, Planar } + + [SerializeField] + private int m_selectedParallaxTypeInt = 0; + + [SerializeField] + private ParallaxType m_selectedParallaxType = ParallaxType.Normal; + + private readonly string[] m_parallaxTypeStr = { "Normal", "Planar" }; + + private int m_cachedPropertyId = -1; + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT2, false, "UV" ); + AddInputPort( WirePortDataType.FLOAT, false, "Height" ); + AddInputPort( WirePortDataType.FLOAT, false, "Scale" ); + AddInputPort( WirePortDataType.FLOAT3, false, "ViewDir (tan)" ); + AddOutputPort( WirePortDataType.FLOAT2, "Out" ); + m_useInternalPortData = true; + m_autoDrawInternalPortData = true; + m_autoWrapProperties = true; + m_textLabelWidth = 105; + UpdateTitle(); + m_forceDrawPreviewAsPlane = true; + m_hasLeftDropdown = true; + m_previewShaderGUID = "589f12f68e00ac74286815aa56053fcc"; + } + + public override void Destroy() + { + base.Destroy(); + m_upperLeftWidget = null; + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + if( m_cachedPropertyId == -1 ) + m_cachedPropertyId = Shader.PropertyToID( "_ParallaxType" ); + + PreviewMaterial.SetFloat( m_cachedPropertyId, ( m_selectedParallaxType == ParallaxType.Normal ? 0 : 1 ) ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + + string textcoords = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string height = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + string scale = m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector ); + string viewDirTan = m_inputPorts[ 3 ].GeneratePortInstructions( ref dataCollector ); + string localVarName = "Offset" + OutputId; + string calculation = ""; + + switch( m_selectedParallaxType ) + { + default: + case ParallaxType.Normal: + calculation = "( ( " + height + " - 1 ) * " + viewDirTan + ".xy * " + scale + " ) + " + textcoords; + break; + case ParallaxType.Planar: + calculation = "( ( " + height + " - 1 ) * ( " + viewDirTan + ".xy / " + viewDirTan + ".z ) * " + scale + " ) + " + textcoords; + break; + } + + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, m_outputPorts[ 0 ].DataType, localVarName, calculation ); + //dataCollector.AddToLocalVariables( UniqueId, m_currentPrecisionType, m_outputPorts[ 0 ].DataType, localVarName, calculation ); + return GetOutputVectorItem( 0, outputId, localVarName ); + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + EditorGUI.BeginChangeCheck(); + m_selectedParallaxTypeInt = m_upperLeftWidget.DrawWidget( this, m_selectedParallaxTypeInt, m_parallaxTypeStr ); + if( EditorGUI.EndChangeCheck() ) + { + switch( m_selectedParallaxTypeInt ) + { + default: + case 0: m_selectedParallaxType = ParallaxType.Normal; break; + case 1: m_selectedParallaxType = ParallaxType.Planar; break; + } + UpdateTitle(); + } + } + + public override void DrawProperties() + { + base.DrawProperties(); + + EditorGUI.BeginChangeCheck(); + m_selectedParallaxTypeInt = EditorGUILayoutPopup( "Parallax Type", m_selectedParallaxTypeInt, m_parallaxTypeStr ); + if( EditorGUI.EndChangeCheck() ) + { + switch( m_selectedParallaxTypeInt ) + { + default: + case 0: m_selectedParallaxType = ParallaxType.Normal; break; + case 1: m_selectedParallaxType = ParallaxType.Planar; break; + } + UpdateTitle(); + } + + EditorGUILayout.HelpBox( "Normal type does a cheaper approximation thats view dependent while Planar is more accurate but generates higher aliasing artifacts at steep angles.", MessageType.None ); + } + + + void UpdateTitle() + { + m_additionalContent.text = string.Format( Constants.SubTitleTypeFormatStr, m_parallaxTypeStr[ m_selectedParallaxTypeInt ] ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_selectedParallaxType = (ParallaxType)Enum.Parse( typeof( ParallaxType ), GetCurrentParam( ref nodeParams ) ); + switch( m_selectedParallaxType ) + { + default: + case ParallaxType.Normal: m_selectedParallaxTypeInt = 0; break; + case ParallaxType.Planar: m_selectedParallaxTypeInt = 1; break; + } + UpdateTitle(); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_selectedParallaxType ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ParallaxMappingNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ParallaxMappingNode.cs.meta new file mode 100644 index 0000000..97f1c33 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ParallaxMappingNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 96d8f50a7481d5247b16cb16c053d5f6 +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ParallaxOcclusionMappingNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ParallaxOcclusionMappingNode.cs new file mode 100644 index 0000000..e789cac --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ParallaxOcclusionMappingNode.cs @@ -0,0 +1,650 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; + +using System; +namespace AmplifyShaderEditor +{ + enum POMTexTypes + { + Texture2D, + Texture3D, + TextureArray + }; + + [Serializable] + [NodeAttributes( "Parallax Occlusion Mapping", "UV Coordinates", "Calculates offseted UVs for parallax occlusion mapping" )] + public sealed class ParallaxOcclusionMappingNode : ParentNode + { + private const string ArrayIndexStr = "Array Index"; + private const string Tex3DSliceStr = "Tex3D Slice"; + + private readonly string[] m_channelTypeStr = { "Red Channel", "Green Channel", "Blue Channel", "Alpha Channel" }; + private readonly string[] m_channelTypeVal = { "r", "g", "b", "a" }; + + [SerializeField] + private int m_selectedChannelInt = 0; + + //[SerializeField] + //private int m_minSamples = 8; + + //[SerializeField] + //private int m_maxSamples = 16; + [SerializeField] + private InlineProperty m_inlineMinSamples = new InlineProperty( 8 ); + + [SerializeField] + private InlineProperty m_inlineMaxSamples = new InlineProperty( 16 ); + + [ SerializeField] + private int m_sidewallSteps = 2; + + [SerializeField] + private float m_defaultScale = 0.02f; + + [SerializeField] + private float m_defaultRefPlane = 0f; + + [SerializeField] + private bool m_clipEnds = false; + + [SerializeField] + private Vector2 m_tilling = new Vector2( 1, 1 ); + + [SerializeField] + private bool m_useCurvature = false; + + [SerializeField] + private Vector2 m_CurvatureVector = new Vector2( 0, 0 ); + + private string m_functionHeader = "POM( {0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}, {11}, {12}, {13} )"; + private string m_functionBody = string.Empty; + + //private const string WorldDirVarStr = "worldViewDir"; + + private InputPort m_uvPort; + private InputPort m_texPort; + private InputPort m_ssPort; + private InputPort m_scalePort; + private InputPort m_viewdirTanPort; + private InputPort m_refPlanePort; + private InputPort m_curvaturePort; + private InputPort m_arrayIndexPort; + + private OutputPort m_pomUVPort; + + private Vector4Node m_texCoordsHelper; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT2, false, "UV",-1,MasterNodePortCategory.Fragment,0); + AddInputPort( WirePortDataType.SAMPLER2D, false, "Tex", -1, MasterNodePortCategory.Fragment, 1 ); + AddInputPort( WirePortDataType.SAMPLERSTATE, false, "SS", -1, MasterNodePortCategory.Fragment, 7 ); + AddInputPort( WirePortDataType.FLOAT, false, "Scale", -1, MasterNodePortCategory.Fragment, 2 ); + AddInputPort( WirePortDataType.FLOAT3, false, "ViewDir (tan)", -1, MasterNodePortCategory.Fragment, 3 ); + AddInputPort( WirePortDataType.FLOAT, false, "Ref Plane", -1, MasterNodePortCategory.Fragment, 4 ); + AddInputPort( WirePortDataType.FLOAT2, false, "Curvature", -1, MasterNodePortCategory.Fragment, 5 ); + AddInputPort( WirePortDataType.FLOAT, false, ArrayIndexStr, -1, MasterNodePortCategory.Fragment, 6 ); + + AddOutputPort( WirePortDataType.FLOAT2, "Out" ); + + m_uvPort = GetInputPortByUniqueId( 0 ); + m_texPort = GetInputPortByUniqueId( 1 ); + m_texPort.CreatePortRestrictions( WirePortDataType.SAMPLER2D, WirePortDataType.SAMPLER3D, WirePortDataType.SAMPLER2DARRAY ); + m_ssPort = GetInputPortByUniqueId( 7 ); + m_ssPort.CreatePortRestrictions( WirePortDataType.SAMPLERSTATE ); + m_scalePort = GetInputPortByUniqueId( 2 ); + m_viewdirTanPort = GetInputPortByUniqueId( 3 ); + m_refPlanePort = GetInputPortByUniqueId( 4 ); + m_pomUVPort = m_outputPorts[ 0 ]; + m_curvaturePort = GetInputPortByUniqueId( 5 ); + m_arrayIndexPort = GetInputPortByUniqueId( 6 ); + + m_scalePort.FloatInternalData = 0.02f; + m_useInternalPortData = false; + m_textLabelWidth = 130; + m_autoWrapProperties = true; + m_curvaturePort.Visible = false; + m_arrayIndexPort.Visible = false; + UpdateSampler(); + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + m_texPort.MatchPortToConnection(); + UpdateIndexPort(); + } + + public override void OnConnectedOutputNodeChanges( int outputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( outputPortId, otherNodeId, otherPortId, name, type ); + if( !m_texPort.CheckValidType( type ) ) + { + m_texPort.FullDeleteConnections(); + UIUtils.ShowMessage( UniqueId, "Parallax Occlusion Mapping node only accepts SAMPLER2D, SAMPLER3D and SAMPLER2DARRAY input types.\nTexture Object connected changed to "+ type + ", connection was lost, please review and update accordingly.", MessageSeverity.Warning ); + } else + { + m_texPort.MatchPortToConnection(); + } + UpdateIndexPort(); + } + + public override void DrawProperties() + { + base.DrawProperties(); + + EditorGUI.BeginChangeCheck(); + m_selectedChannelInt = EditorGUILayoutPopup( "Channel", m_selectedChannelInt, m_channelTypeStr ); + if ( EditorGUI.EndChangeCheck() ) + { + UpdateSampler(); + } + //EditorGUIUtility.labelWidth = 105; + + //m_minSamples = EditorGUILayoutIntSlider( "Min Samples", m_minSamples, 1, 128 ); + UndoParentNode inst = this; + m_inlineMinSamples.CustomDrawer( ref inst, ( x ) => { m_inlineMinSamples.IntValue = EditorGUILayoutIntSlider( "Min Samples", m_inlineMinSamples.IntValue, 1, 128 ); }, "Min Samples" ); + //m_maxSamples = EditorGUILayoutIntSlider( "Max Samples", m_maxSamples, 1, 128 ); + m_inlineMaxSamples.CustomDrawer( ref inst, ( x ) => { m_inlineMaxSamples.IntValue = EditorGUILayoutIntSlider( "Max Samples", m_inlineMaxSamples.IntValue, 1, 128 ); }, "Max Samples" ); + + m_sidewallSteps = EditorGUILayoutIntSlider( "Sidewall Steps", m_sidewallSteps, 0, 10 ); + + EditorGUI.BeginDisabledGroup(m_scalePort.IsConnected ); + m_defaultScale = EditorGUILayoutSlider( "Default Scale", m_defaultScale, 0, 1 ); + EditorGUI.EndDisabledGroup(); + + EditorGUI.BeginDisabledGroup( m_refPlanePort.IsConnected ); + m_defaultRefPlane = EditorGUILayoutSlider( "Default Ref Plane", m_defaultRefPlane, 0, 1 ); + EditorGUI.EndDisabledGroup(); + //EditorGUIUtility.labelWidth = m_textLabelWidth; + + if( m_arrayIndexPort.Visible && !m_arrayIndexPort.IsConnected ) + { + m_arrayIndexPort.FloatInternalData = EditorGUILayoutFloatField( "Array Index", m_arrayIndexPort.FloatInternalData ); + } + + //float cached = EditorGUIUtility.labelWidth; + //EditorGUIUtility.labelWidth = 70; + m_clipEnds = EditorGUILayoutToggle( "Clip Edges", m_clipEnds ); + //EditorGUIUtility.labelWidth = -1; + //EditorGUIUtility.labelWidth = 100; + //EditorGUILayout.BeginHorizontal(); + //EditorGUI.BeginDisabledGroup( !m_clipEnds ); + //m_tilling = EditorGUILayout.Vector2Field( string.Empty, m_tilling ); + //EditorGUI.EndDisabledGroup(); + //EditorGUILayout.EndHorizontal(); + //EditorGUIUtility.labelWidth = cached; + + EditorGUI.BeginChangeCheck(); + m_useCurvature = EditorGUILayoutToggle( "Clip Silhouette", m_useCurvature ); + if ( EditorGUI.EndChangeCheck() ) + { + UpdateCurvaturePort(); + } + + EditorGUI.BeginDisabledGroup( !(m_useCurvature && !m_curvaturePort.IsConnected) ); + m_CurvatureVector = EditorGUILayoutVector2Field( string.Empty, m_CurvatureVector ); + EditorGUI.EndDisabledGroup(); + + EditorGUILayout.HelpBox( "WARNING:\nTex must be connected to a Texture Object for this node to work\n\nMin and Max samples:\nControl the minimum and maximum number of layers extruded\n\nSidewall Steps:\nThe number of interpolations done to smooth the extrusion result on the side of the layer extrusions, min is used at steep angles while max is used at orthogonal angles\n\n"+ + "Ref Plane:\nReference plane lets you adjust the starting reference height, 0 = deepen ground, 1 = raise ground, any value above 0 might cause distortions at higher angles\n\n"+ + "Clip Edges:\nThis will clip the ends of your uvs to give a more 3D look at the edges. It'll use the tilling given by your Heightmap input.\n\n"+ + "Clip Silhouette:\nTurning this on allows you to use the UV coordinates to clip the effect curvature in U or V axis, useful for cylinders, works best with 'Clip Edges' turned OFF", MessageType.None ); + } + + private void UpdateIndexPort() + { + m_arrayIndexPort.Visible = m_texPort.DataType != WirePortDataType.SAMPLER2D; + if( m_arrayIndexPort.Visible ) + { + m_arrayIndexPort.Name = m_texPort.DataType == WirePortDataType.SAMPLER3D ? Tex3DSliceStr : ArrayIndexStr; + } + SizeIsDirty = true; + } + + private void UpdateSampler() + { + m_texPort.Name = "Tex (" + m_channelTypeVal[ m_selectedChannelInt ].ToUpper() + ")"; + } + + private void UpdateCurvaturePort() + { + if ( m_useCurvature ) + m_curvaturePort.Visible = true; + else + m_curvaturePort.Visible = false; + + m_sizeIsDirty = true; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( !m_texPort.IsConnected ) + { + UIUtils.ShowMessage( UniqueId, "Parallax Occlusion Mapping node only works if a Texture Object is connected to its Tex (R) port" ); + return "0"; + } + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + ParentGraph outsideGraph = UIUtils.CurrentWindow.OutsideGraph; + + string arrayIndex = m_arrayIndexPort.Visible?m_arrayIndexPort.GeneratePortInstructions( ref dataCollector ):"0"; + string textcoords = m_uvPort.GeneratePortInstructions( ref dataCollector ); + if( m_texPort.DataType == WirePortDataType.SAMPLER3D ) + { + string texName = "pomTexCoord" + OutputId; + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT3, texName, string.Format( "float3({0},{1})", textcoords, arrayIndex ) ); + textcoords = texName; + } + + string texture = m_texPort.GeneratePortInstructions( ref dataCollector ); + GeneratePOMfunction( ref dataCollector ); + string scale = m_defaultScale.ToString(); + if( m_scalePort.IsConnected ) + scale = m_scalePort.GeneratePortInstructions( ref dataCollector ); + + string viewDirTan = ""; + if ( !m_viewdirTanPort.IsConnected ) + { + if ( !dataCollector.DirtyNormal ) + dataCollector.ForceNormal = true; + + + if ( dataCollector.IsTemplate ) + { + viewDirTan = dataCollector.TemplateDataCollectorInstance.GetTangentViewDir( CurrentPrecisionType ); + } + else + { + viewDirTan = GeneratorUtils.GenerateViewDirection( ref dataCollector, UniqueId, ViewSpace.Tangent ); + //dataCollector.AddToInput( UniqueId, SurfaceInputs.VIEW_DIR, m_currentPrecisionType ); + //viewDirTan = Constants.InputVarStr + "." + UIUtils.GetInputValueFromType( SurfaceInputs.VIEW_DIR ); + } + } + else + { + viewDirTan = m_viewdirTanPort.GeneratePortInstructions( ref dataCollector ); + } + + //generate world normal + string normalWorld = string.Empty; + if ( dataCollector.IsTemplate ) + { + normalWorld = dataCollector.TemplateDataCollectorInstance.GetWorldNormal( CurrentPrecisionType ); + } + else + { + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_NORMAL, CurrentPrecisionType ); + dataCollector.AddToInput( UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + normalWorld = GeneratorUtils.GenerateWorldNormal( ref dataCollector, UniqueId ); + } + + string worldViewDir = GeneratorUtils.GenerateViewDirection( ref dataCollector, UniqueId, ViewSpace.World ); + + string dx = "ddx("+ textcoords + ")"; + string dy = "ddy(" + textcoords + ")"; + + string refPlane = m_defaultRefPlane.ToString(); + if ( m_refPlanePort.IsConnected ) + refPlane = m_refPlanePort.GeneratePortInstructions( ref dataCollector ); + + + string curvature = "float2("+ m_CurvatureVector.x + "," + m_CurvatureVector.y + ")"; + if ( m_useCurvature ) + { + dataCollector.AddToProperties( UniqueId, "[Header(Parallax Occlusion Mapping)]", 300 ); + dataCollector.AddToProperties( UniqueId, "_CurvFix(\"Curvature Bias\", Range( 0 , 1)) = 1", 301 ); + dataCollector.AddToUniforms( UniqueId, "uniform float _CurvFix;" ); + + if ( m_curvaturePort.IsConnected ) + curvature = m_curvaturePort.GeneratePortInstructions( ref dataCollector ); + } + + + string localVarName = "OffsetPOM" + OutputId; + string textCoordsST = string.Empty; + //string textureSTType = dataCollector.IsSRP ? "float4 " : "uniform float4 "; + //dataCollector.AddToUniforms( UniqueId, textureSTType + texture +"_ST;"); + if( m_texCoordsHelper == null ) + { + m_texCoordsHelper = CreateInstance(); + m_texCoordsHelper.ContainerGraph = ContainerGraph; + m_texCoordsHelper.SetBaseUniqueId( UniqueId, true ); + m_texCoordsHelper.RegisterPropertyOnInstancing = false; + m_texCoordsHelper.AddGlobalToSRPBatcher = true; + } + + if( outsideGraph.IsInstancedShader ) + { + m_texCoordsHelper.CurrentParameterType = PropertyType.InstancedProperty; + } + else + { + m_texCoordsHelper.CurrentParameterType = PropertyType.Global; + } + m_texCoordsHelper.ResetOutputLocals(); + m_texCoordsHelper.SetRawPropertyName( texture + "_ST" ); + textCoordsST = m_texCoordsHelper.GenerateShaderForOutput( 0, ref dataCollector, false ); + ////// + + string textureArgs = string.Empty; +#if UNITY_2018_1_OR_NEWER + if( outsideGraph.SamplingMacros || m_texPort.DataType == WirePortDataType.SAMPLER2DARRAY ) +#else + if( ( outsideGraph.SamplingMacros && !outsideGraph.IsStandardSurface ) || m_texPort.DataType == WirePortDataType.SAMPLER2DARRAY ) +#endif + { + string sampler = string.Empty; + if( m_ssPort.IsConnected ) + { + sampler = m_ssPort.GeneratePortInstructions( ref dataCollector ); + } + else + { + sampler = GeneratorUtils.GenerateSamplerState( ref dataCollector, UniqueId, texture ); + } + if( outsideGraph.IsSRP ) + { + textureArgs = texture + ", " + sampler; + } + else + { +#if !UNITY_2018_1_OR_NEWER + if( outsideGraph.IsStandardSurface ) + textureArgs = "UNITY_PASS_TEX2DARRAY(" + texture + ")"; + else +#endif + textureArgs = texture + ", " + sampler; + } + } + else + { + textureArgs = texture; + } + //string functionResult = dataCollector.AddFunctions( m_functionHeader, m_functionBody, ( (m_pomTexType == POMTexTypes.TextureArray) ? "UNITY_PASS_TEX2DARRAY(" + texture + ")": texture), textcoords, dx, dy, normalWorld, worldViewDir, viewDirTan, m_minSamples, m_maxSamples, scale, refPlane, texture+"_ST.xy", curvature, arrayIndex ); + string functionResult = dataCollector.AddFunctions( m_functionHeader, m_functionBody, textureArgs, textcoords, dx, dy, normalWorld, worldViewDir, viewDirTan, m_inlineMinSamples.GetValueOrProperty(false), m_inlineMinSamples.GetValueOrProperty(false), scale, refPlane, textCoordsST + ".xy", curvature, arrayIndex ); + + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, m_pomUVPort.DataType, localVarName, functionResult ); + + return GetOutputVectorItem( 0, outputId, localVarName ); + } + + private void GeneratePOMfunction( ref MasterNodeDataCollector dataCollector ) + { + ParentGraph outsideGraph = UIUtils.CurrentWindow.OutsideGraph; + m_functionBody = string.Empty; + switch( m_texPort.DataType ) + { + default: + case WirePortDataType.SAMPLER2D: + { + string sampleParam = string.Empty; + sampleParam = GeneratorUtils.GetPropertyDeclaraction( "heightMap", TextureType.Texture2D, ", " ) + GeneratorUtils.GetSamplerDeclaraction( "samplerheightMap", TextureType.Texture2D, ", " ); + IOUtils.AddFunctionHeader( ref m_functionBody, string.Format("inline float2 POM( {0}float2 uvs, float2 dx, float2 dy, float3 normalWorld, float3 viewWorld, float3 viewDirTan, int minSamples, int maxSamples, float parallax, float refPlane, float2 tilling, float2 curv, int index )", sampleParam )); + } + break; + case WirePortDataType.SAMPLER3D: + { + string sampleParam = string.Empty; + sampleParam = GeneratorUtils.GetPropertyDeclaraction( "heightMap", TextureType.Texture3D, ", " ) + GeneratorUtils.GetSamplerDeclaraction( "samplerheightMap", TextureType.Texture3D, ", " ); + IOUtils.AddFunctionHeader( ref m_functionBody, string.Format("inline float2 POM( {0}float3 uvs, float3 dx, float3 dy, float3 normalWorld, float3 viewWorld, float3 viewDirTan, int minSamples, int maxSamples, float parallax, float refPlane, float2 tilling, float2 curv, int index )", sampleParam ) ); + } + break; + case WirePortDataType.SAMPLER2DARRAY: + if( outsideGraph.IsSRP ) + IOUtils.AddFunctionHeader( ref m_functionBody, "inline float2 POM( TEXTURE2D_ARRAY(heightMap), SAMPLER(samplerheightMap), float2 uvs, float2 dx, float2 dy, float3 normalWorld, float3 viewWorld, float3 viewDirTan, int minSamples, int maxSamples, float parallax, float refPlane, float2 tilling, float2 curv, int index )" ); + else +#if !UNITY_2018_1_OR_NEWER + if( outsideGraph.IsStandardSurface ) + IOUtils.AddFunctionHeader( ref m_functionBody, "inline float2 POM( UNITY_ARGS_TEX2DARRAY(heightMap), float2 uvs, float2 dx, float2 dy, float3 normalWorld, float3 viewWorld, float3 viewDirTan, int minSamples, int maxSamples, float parallax, float refPlane, float2 tilling, float2 curv, int index )" ); + else +#endif + IOUtils.AddFunctionHeader( ref m_functionBody, "inline float2 POM( UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(heightMap), SamplerState samplerheightMap, float2 uvs, float2 dx, float2 dy, float3 normalWorld, float3 viewWorld, float3 viewDirTan, int minSamples, int maxSamples, float parallax, float refPlane, float2 tilling, float2 curv, int index )" ); + break; + } + + IOUtils.AddFunctionLine( ref m_functionBody, "float3 result = 0;" ); + IOUtils.AddFunctionLine( ref m_functionBody, "int stepIndex = 0;" ); + //IOUtils.AddFunctionLine( ref m_functionBody, "int numSteps = ( int )( minSamples + dot( viewWorld, normalWorld ) * ( maxSamples - minSamples ) );" ); + //IOUtils.AddFunctionLine( ref m_functionBody, "int numSteps = ( int )lerp( maxSamples, minSamples, length( fwidth( uvs ) ) * 10 );" ); + IOUtils.AddFunctionLine( ref m_functionBody, "int numSteps = ( int )lerp( (float)maxSamples, (float)minSamples, saturate( dot( normalWorld, viewWorld ) ) );" ); + IOUtils.AddFunctionLine( ref m_functionBody, "float layerHeight = 1.0 / numSteps;" ); + IOUtils.AddFunctionLine( ref m_functionBody, "float2 plane = parallax * ( viewDirTan.xy / viewDirTan.z );" ); + IOUtils.AddFunctionLine( ref m_functionBody, "uvs.xy += refPlane * plane;" ); + IOUtils.AddFunctionLine( ref m_functionBody, "float2 deltaTex = -plane * layerHeight;" ); + IOUtils.AddFunctionLine( ref m_functionBody, "float2 prevTexOffset = 0;" ); + IOUtils.AddFunctionLine( ref m_functionBody, "float prevRayZ = 1.0f;" ); + IOUtils.AddFunctionLine( ref m_functionBody, "float prevHeight = 0.0f;" ); + IOUtils.AddFunctionLine( ref m_functionBody, "float2 currTexOffset = deltaTex;" ); + IOUtils.AddFunctionLine( ref m_functionBody, "float currRayZ = 1.0f - layerHeight;" ); + IOUtils.AddFunctionLine( ref m_functionBody, "float currHeight = 0.0f;" ); + IOUtils.AddFunctionLine( ref m_functionBody, "float intersection = 0;" ); + IOUtils.AddFunctionLine( ref m_functionBody, "float2 finalTexOffset = 0;" ); + IOUtils.AddFunctionLine( ref m_functionBody, "while ( stepIndex < numSteps + 1 )" ); + IOUtils.AddFunctionLine( ref m_functionBody, "{" ); + + string textureProp = "heightMap"; + string sampleState = "samplerheightMap"; + + string uvs = "uvs + currTexOffset"; + if( m_texPort.DataType == WirePortDataType.SAMPLER3D ) + uvs = "float3(uvs.xy + currTexOffset, uvs.z)"; + else if( m_texPort.DataType == WirePortDataType.SAMPLER2DARRAY ) + uvs = outsideGraph.IsSRP ? uvs + ", index" : "float3(" + uvs + ", index)"; + + string samplingCall = GeneratorUtils.GenerateSamplingCall( ref dataCollector, m_texPort.DataType, textureProp, sampleState, uvs, MipType.Derivative, "dx", "dy" ); + if( m_useCurvature ) + { + IOUtils.AddFunctionLine( ref m_functionBody, " \tresult.z = dot( curv, currTexOffset * currTexOffset );" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \tcurrHeight = " + samplingCall + "." + m_channelTypeVal[ m_selectedChannelInt ] + " * ( 1 - result.z );" ); + } + else + { + IOUtils.AddFunctionLine( ref m_functionBody, " \tcurrHeight = " + samplingCall + "." + m_channelTypeVal[ m_selectedChannelInt ] + ";" ); + } + IOUtils.AddFunctionLine( ref m_functionBody, " \tif ( currHeight > currRayZ )" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t{" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t \tstepIndex = numSteps + 1;" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t}" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \telse" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t{" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t \tstepIndex++;" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t \tprevTexOffset = currTexOffset;" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t \tprevRayZ = currRayZ;" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t \tprevHeight = currHeight;" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t \tcurrTexOffset += deltaTex;" ); + if ( m_useCurvature ) + IOUtils.AddFunctionLine( ref m_functionBody, " \t \tcurrRayZ -= layerHeight * ( 1 - result.z ) * (1+_CurvFix);" ); + else + IOUtils.AddFunctionLine( ref m_functionBody, " \t \tcurrRayZ -= layerHeight;" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t}" ); + IOUtils.AddFunctionLine( ref m_functionBody, "}" ); + + if ( m_sidewallSteps > 0 ) + { + IOUtils.AddFunctionLine( ref m_functionBody, "int sectionSteps = " + m_sidewallSteps + ";" ); + IOUtils.AddFunctionLine( ref m_functionBody, "int sectionIndex = 0;" ); + IOUtils.AddFunctionLine( ref m_functionBody, "float newZ = 0;" ); + IOUtils.AddFunctionLine( ref m_functionBody, "float newHeight = 0;" ); + IOUtils.AddFunctionLine( ref m_functionBody, "while ( sectionIndex < sectionSteps )" ); + IOUtils.AddFunctionLine( ref m_functionBody, "{" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \tintersection = ( prevHeight - prevRayZ ) / ( prevHeight - currHeight + currRayZ - prevRayZ );" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \tfinalTexOffset = prevTexOffset + intersection * deltaTex;" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \tnewZ = prevRayZ - intersection * layerHeight;" ); + + string uvs2 = "uvs + finalTexOffset"; + if( m_texPort.DataType == WirePortDataType.SAMPLER3D ) + uvs2 = "float3(uvs.xy + finalTexOffset, uvs.z)"; + else if( m_texPort.DataType == WirePortDataType.SAMPLER2DARRAY ) + uvs2 = outsideGraph.IsSRP ? uvs2 + ", index" : "float3(" + uvs2 + ", index)"; + + string samplingCall2 = GeneratorUtils.GenerateSamplingCall( ref dataCollector, m_texPort.DataType, textureProp, sampleState, uvs2, MipType.Derivative, "dx", "dy" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \tnewHeight = " + samplingCall2 + "." + m_channelTypeVal[ m_selectedChannelInt ] + ";" ); + + IOUtils.AddFunctionLine( ref m_functionBody, " \tif ( newHeight > newZ )" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t{" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t \tcurrTexOffset = finalTexOffset;" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t \tcurrHeight = newHeight;" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t \tcurrRayZ = newZ;" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t \tdeltaTex = intersection * deltaTex;" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t \tlayerHeight = intersection * layerHeight;" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t}" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \telse" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t{" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t \tprevTexOffset = finalTexOffset;" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t \tprevHeight = newHeight;" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t \tprevRayZ = newZ;" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t \tdeltaTex = ( 1 - intersection ) * deltaTex;" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t \tlayerHeight = ( 1 - intersection ) * layerHeight;" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t}" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \tsectionIndex++;" ); + IOUtils.AddFunctionLine( ref m_functionBody, "}" ); + } + else + { + IOUtils.AddFunctionLine( ref m_functionBody, "finalTexOffset = currTexOffset;" ); + } + + if ( m_useCurvature ) + { + IOUtils.AddFunctionLine( ref m_functionBody, "#ifdef UNITY_PASS_SHADOWCASTER" ); + IOUtils.AddFunctionLine( ref m_functionBody, "if ( unity_LightShadowBias.z == 0.0 )" ); + IOUtils.AddFunctionLine( ref m_functionBody, "{" ); + IOUtils.AddFunctionLine( ref m_functionBody, "#endif" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \tif ( result.z > 1 )" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t \tclip( -1 );" ); + IOUtils.AddFunctionLine( ref m_functionBody, "#ifdef UNITY_PASS_SHADOWCASTER" ); + IOUtils.AddFunctionLine( ref m_functionBody, "}" ); + IOUtils.AddFunctionLine( ref m_functionBody, "#endif" ); + } + + if ( m_clipEnds ) + { + IOUtils.AddFunctionLine( ref m_functionBody, "result.xy = uvs.xy + finalTexOffset;" ); + IOUtils.AddFunctionLine( ref m_functionBody, "#ifdef UNITY_PASS_SHADOWCASTER" ); + IOUtils.AddFunctionLine( ref m_functionBody, "if ( unity_LightShadowBias.z == 0.0 )" ); + IOUtils.AddFunctionLine( ref m_functionBody, "{" ); + IOUtils.AddFunctionLine( ref m_functionBody, "#endif" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \tif ( result.x < 0 )" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t \tclip( -1 );" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \tif ( result.x > tilling.x )" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t \tclip( -1 );" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \tif ( result.y < 0 )" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t \tclip( -1 );" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \tif ( result.y > tilling.y )" ); + IOUtils.AddFunctionLine( ref m_functionBody, " \t \tclip( -1 );" ); + IOUtils.AddFunctionLine( ref m_functionBody, "#ifdef UNITY_PASS_SHADOWCASTER" ); + IOUtils.AddFunctionLine( ref m_functionBody, "}" ); + IOUtils.AddFunctionLine( ref m_functionBody, "#endif" ); + IOUtils.AddFunctionLine( ref m_functionBody, "return result.xy;" ); + } + else + { + IOUtils.AddFunctionLine( ref m_functionBody, "return uvs.xy + finalTexOffset;" ); + } + IOUtils.CloseFunctionBody( ref m_functionBody ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_selectedChannelInt = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + //m_minSamples = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + //m_maxSamples = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() < 15406 ) + { + m_inlineMinSamples.IntValue = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_inlineMaxSamples.IntValue = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + else + { + m_inlineMinSamples.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + m_inlineMaxSamples.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + m_sidewallSteps = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_defaultScale = Convert.ToSingle( GetCurrentParam( ref nodeParams ) ); + m_defaultRefPlane = Convert.ToSingle( GetCurrentParam( ref nodeParams ) ); + if ( UIUtils.CurrentShaderVersion() > 3001 ) + { + m_clipEnds = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + string[] vector2Component = GetCurrentParam( ref nodeParams ).Split( IOUtils.VECTOR_SEPARATOR ); + if ( vector2Component.Length == 2 ) + { + m_tilling.x = Convert.ToSingle( vector2Component[ 0 ] ); + m_tilling.y = Convert.ToSingle( vector2Component[ 1 ] ); + } + } + + if ( UIUtils.CurrentShaderVersion() > 5005 ) + { + m_useCurvature = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + m_CurvatureVector = IOUtils.StringToVector2( GetCurrentParam( ref nodeParams ) ); + } + + if( UIUtils.CurrentShaderVersion() > 13103 ) + { + //if( UIUtils.CurrentShaderVersion() < 15307 ) + //{ + // GetCurrentParam( ref nodeParams ); + // //bool arrayIndexVisible = false; + // //arrayIndexVisible = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + // //m_pomTexType = arrayIndexVisible ? POMTexTypes.TextureArray : POMTexTypes.Texture2D; + //} + //else + //{ + // GetCurrentParam( ref nodeParams ); + // //m_pomTexType = (POMTexTypes)Enum.Parse( typeof(POMTexTypes), GetCurrentParam( ref nodeParams ) ); + //} + if( UIUtils.CurrentShaderVersion() <= 18201 ) + { + GetCurrentParam( ref nodeParams ); + } + UpdateIndexPort(); + } + + UpdateSampler(); + //GeneratePOMfunction( string.Empty ); + UpdateCurvaturePort(); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_selectedChannelInt ); + //IOUtils.AddFieldValueToString( ref nodeInfo, m_minSamples ); + //IOUtils.AddFieldValueToString( ref nodeInfo, m_maxSamples ); + m_inlineMinSamples.WriteToString( ref nodeInfo ); + m_inlineMaxSamples.WriteToString( ref nodeInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_sidewallSteps ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_defaultScale ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_defaultRefPlane ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_clipEnds ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_tilling.x.ToString() + IOUtils.VECTOR_SEPARATOR + m_tilling.y.ToString() ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_useCurvature ); + IOUtils.AddFieldValueToString( ref nodeInfo, IOUtils.Vector2ToString( m_CurvatureVector ) ); + //IOUtils.AddFieldValueToString( ref nodeInfo, m_useTextureArray ); + //IOUtils.AddFieldValueToString( ref nodeInfo, true ); + } + + public override void Destroy() + { + base.Destroy(); + //Not calling m_texCoordsHelper.Destroy() on purpose so UIUtils does not incorrectly unregister stuff + if( m_texCoordsHelper != null ) + { + DestroyImmediate( m_texCoordsHelper ); + m_texCoordsHelper = null; + } + + + m_uvPort = null; + m_texPort = null; + m_scalePort = null; + m_viewdirTanPort = null; + m_pomUVPort = null; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ParallaxOcclusionMappingNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ParallaxOcclusionMappingNode.cs.meta new file mode 100644 index 0000000..3a7443c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ParallaxOcclusionMappingNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b2350150f3f2a0443827ca8925d5e759 +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ParallaxOffsetHlpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ParallaxOffsetHlpNode.cs new file mode 100644 index 0000000..26b8a54 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ParallaxOffsetHlpNode.cs @@ -0,0 +1,47 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Parallax Offset", "UV Coordinates", "Calculates UV offset for parallax normal mapping" )] + public sealed class ParallaxOffsetHlpNode : HelperParentNode + { + public readonly string[] ParallaxOffsetFunc = + { + "inline float2 ParallaxOffset( half h, half height, half3 viewDir )\n", + "{\n", + "\th = h * height - height/2.0;\n", + "\tfloat3 v = normalize( viewDir );\n", + "\tv.z += 0.42;\n", + "\treturn h* (v.xy / v.z);\n", + "}\n" + }; + + void OnSRPActionEvent( int outputId, ref MasterNodeDataCollector dataCollector ) + { + dataCollector.AddFunction( ParallaxOffsetFunc[ 0 ], ParallaxOffsetFunc, false ); + } + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_funcType = "ParallaxOffset"; + m_inputPorts[ 0 ].ChangeProperties( "H", WirePortDataType.FLOAT, false ); + AddInputPort( WirePortDataType.FLOAT, false, "Height" ); + AddInputPort( WirePortDataType.FLOAT3, false, "ViewDir (tan)" ); + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT2, false ); + m_outputPorts[ 0 ].Name = "Out"; + OnHDAction = OnSRPActionEvent; + OnLightweightAction = OnSRPActionEvent; + m_previewShaderGUID = "6085f804c6fbf354eac039c11feaa7cc"; + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + m_localVarName = "paralaxOffset" + OutputId; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ParallaxOffsetHlpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ParallaxOffsetHlpNode.cs.meta new file mode 100644 index 0000000..76316ee --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ParallaxOffsetHlpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 83b7d6fe57585b74d80c429aef719200 +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ShadeVertexLightsHlpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ShadeVertexLightsHlpNode.cs new file mode 100644 index 0000000..e337326 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ShadeVertexLightsHlpNode.cs @@ -0,0 +1,105 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; +using UnityEditor; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Shade Vertex Lights", "Light", "Computes illumination from four per-vertex lights and ambient, given object space position & normal" )] + public sealed class ShadeVertexLightsHlpNode : ParentNode + { + private const string HelperMessage = "Shade Vertex Lights node only outputs correct results on\nTemplate Vertex/Frag shaders with their LightMode set to Vertex."; + private const string ShadeVertexLightFunc = "ShadeVertexLightsFull({0},{1},{2},{3})"; + private const string LightCount = "Light Count"; + private const string IsSpotlight = "Is Spotlight"; + private const int MinLightCount = 0; + private const int MaxLightCount = 8; + [SerializeField] + private int m_lightCount = 4; + + [SerializeField] + private bool m_enableSpotlight = false; + + private int _LightCountId; + private int _IsSpotlightId; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT4, false, "Vertex Position" ); + AddInputPort( WirePortDataType.FLOAT3, false, "Vertex Normal" ); + AddOutputPort( WirePortDataType.FLOAT3, Constants.EmptyPortValue ); + m_useInternalPortData = true; + //m_autoWrapProperties = true; + m_textLabelWidth = 90; + m_previewShaderGUID = "3b6075034a85ad047be2d31dd213fb4f"; + } + + public override void OnEnable() + { + base.OnEnable(); + _LightCountId = Shader.PropertyToID( "_LightCount" ); + _IsSpotlightId = Shader.PropertyToID( "_IsSpotlight" ); + } + + public override void DrawProperties() + { + base.DrawProperties(); + NodeUtils.DrawPropertyGroup( ref m_propertiesFoldout, Constants.ParameterLabelStr, DrawGeneralProperties ); + EditorGUILayout.HelpBox( HelperMessage, MessageType.Info ); + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + PreviewMaterial.SetInt( _LightCountId, m_lightCount ); + PreviewMaterial.SetInt( _IsSpotlightId, ( m_enableSpotlight ? 1 : 0 ) ); + + } + + void DrawGeneralProperties() + { + m_lightCount = EditorGUILayoutIntSlider( LightCount, m_lightCount, MinLightCount, MaxLightCount ); + m_enableSpotlight = EditorGUILayoutToggle( IsSpotlight, m_enableSpotlight ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.MasterNodeCategory == AvailableShaderTypes.SurfaceShader ) + UIUtils.ShowMessage( UniqueId, HelperMessage, MessageSeverity.Warning ); + + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + dataCollector.AddToIncludes( UniqueId, Constants.UnityCgLibFuncs ); + + string vertexPosition = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string vertexNormal = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + + string value = string.Format( ShadeVertexLightFunc, vertexPosition, vertexNormal, m_lightCount, m_enableSpotlight.ToString().ToLower() ); + + RegisterLocalVariable( 0, value, ref dataCollector, "shadeVertexLight" + OutputId ); + + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > 14301 ) + { + m_lightCount = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_enableSpotlight = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_lightCount ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_enableSpotlight ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ShadeVertexLightsHlpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ShadeVertexLightsHlpNode.cs.meta new file mode 100644 index 0000000..100f876 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/ShadeVertexLightsHlpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 74f44334b702bce4ba8e2681dc80fe3c +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/SurfaceDepthNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/SurfaceDepthNode.cs new file mode 100644 index 0000000..93e01b4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/SurfaceDepthNode.cs @@ -0,0 +1,184 @@ +using UnityEngine; +using UnityEditor; + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Surface Depth", "Surface Data", "Returns the surface view depth" )] + public sealed class SurfaceDepthNode : ParentNode + { + [SerializeField] + private int m_viewSpaceInt = 0; + + private readonly string[] m_viewSpaceStr = { "Eye Space", "0-1 Space" }; + private readonly string[] m_vertexNameStr = { "eyeDepth", "clampDepth" }; + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT3, false, "Vertex Position" ); + AddOutputPort( WirePortDataType.FLOAT, "Depth" ); + m_autoWrapProperties = true; + m_hasLeftDropdown = true; + SetAdditonalTitleText( string.Format( Constants.SubTitleSpaceFormatStr, m_viewSpaceStr[ m_viewSpaceInt ] ) ); + } + + public override void Destroy() + { + base.Destroy(); + m_upperLeftWidget = null; + } + + public override void AfterCommonInit() + { + base.AfterCommonInit(); + if( PaddingTitleLeft == 0 ) + { + PaddingTitleLeft = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + if( PaddingTitleRight == 0 ) + PaddingTitleRight = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + } + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + EditorGUI.BeginChangeCheck(); + m_viewSpaceInt = m_upperLeftWidget.DrawWidget( this, m_viewSpaceInt, m_viewSpaceStr ); + if( EditorGUI.EndChangeCheck() ) + { + SetAdditonalTitleText( string.Format( Constants.SubTitleSpaceFormatStr, m_viewSpaceStr[ m_viewSpaceInt ] ) ); + } + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUI.BeginChangeCheck(); + m_viewSpaceInt = EditorGUILayoutPopup( "View Space", m_viewSpaceInt, m_viewSpaceStr ); + if( EditorGUI.EndChangeCheck() ) + { + SetAdditonalTitleText( string.Format( Constants.SubTitleSpaceFormatStr, m_viewSpaceStr[ m_viewSpaceInt ] ) ); + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.IsTemplate ) + { + if( m_inputPorts[ 0 ].IsConnected ) + { + string space = string.Empty; + if( m_viewSpaceInt == 1 ) + space = " * _ProjectionParams.w"; + + string varName = "customSurfaceDepth" + OutputId; + GenerateInputInVertex( ref dataCollector, 0, varName, false ); + string instruction = "-UnityObjectToViewPos( " + varName + " ).z" + space; + if( dataCollector.IsSRP ) + instruction = "-TransformWorldToView(TransformObjectToWorld( " + varName + " )).z" + space; + string eyeVarName = "customEye" + OutputId; + dataCollector.TemplateDataCollectorInstance.RegisterCustomInterpolatedData( eyeVarName, WirePortDataType.FLOAT, CurrentPrecisionType, instruction ); + return eyeVarName; + } + else + { + return dataCollector.TemplateDataCollectorInstance.GetEyeDepth( CurrentPrecisionType, true, MasterNodePortCategory.Fragment, m_viewSpaceInt ); + } + } + + if( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + { + string vertexVarName = string.Empty; + if( m_inputPorts[ 0 ].IsConnected ) + { + vertexVarName = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + } + else + { + vertexVarName = Constants.VertexShaderInputStr + ".vertex.xyz"; + } + + string vertexSpace = m_viewSpaceInt == 1 ? " * _ProjectionParams.w" : ""; + string vertexInstruction = "-UnityObjectToViewPos( " + vertexVarName + " ).z" + vertexSpace; + dataCollector.AddVertexInstruction( "float " + m_vertexNameStr[ m_viewSpaceInt ] + " = " + vertexInstruction, UniqueId ); + + return m_vertexNameStr[ m_viewSpaceInt ]; + } + + dataCollector.AddToIncludes( UniqueId, Constants.UnityShaderVariables ); + + + if( dataCollector.TesselationActive ) + { + if( m_inputPorts[ 0 ].IsConnected ) + { + string space = string.Empty; + if( m_viewSpaceInt == 1 ) + space = " * _ProjectionParams.w"; + + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string value = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + RegisterLocalVariable( 0, string.Format( "-UnityObjectToViewPos( {0} ).z", value ) + space, ref dataCollector, "customSurfaceDepth" + OutputId ); + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + else + { + string eyeDepth = GeneratorUtils.GenerateScreenDepthOnFrag( ref dataCollector, UniqueId, CurrentPrecisionType ); + if( m_viewSpaceInt == 1 ) + { + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT, m_vertexNameStr[ 1 ], eyeDepth + " * _ProjectionParams.w" ); + return m_vertexNameStr[ 1 ]; + } + else + { + return eyeDepth; + } + } + } + else + { + + string space = string.Empty; + if( m_viewSpaceInt == 1 ) + space = " * _ProjectionParams.w"; + + if( m_inputPorts[ 0 ].IsConnected ) + { + string varName = "customSurfaceDepth" + OutputId; + GenerateInputInVertex( ref dataCollector, 0, varName, false ); + dataCollector.AddToInput( UniqueId, varName, WirePortDataType.FLOAT ); + string instruction = "-UnityObjectToViewPos( " + varName + " ).z" + space; + dataCollector.AddToVertexLocalVariables( UniqueId , Constants.VertexShaderOutputStr + "." + varName + " = " + instruction+";" ); + return Constants.InputVarStr + "." + varName; + } + else + { + dataCollector.AddToInput( UniqueId, m_vertexNameStr[ m_viewSpaceInt ], WirePortDataType.FLOAT ); + string instruction = "-UnityObjectToViewPos( " + Constants.VertexShaderInputStr + ".vertex.xyz ).z" + space; + dataCollector.AddToVertexLocalVariables( UniqueId , Constants.VertexShaderOutputStr + "." + m_vertexNameStr[ m_viewSpaceInt ] + " = " + instruction+";" ); + return Constants.InputVarStr + "." + m_vertexNameStr[ m_viewSpaceInt ]; + } + } + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_viewSpaceInt = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + SetAdditonalTitleText( string.Format( Constants.SubTitleSpaceFormatStr, m_viewSpaceStr[ m_viewSpaceInt ] ) ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_viewSpaceInt ); + } + } + +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/SurfaceDepthNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/SurfaceDepthNode.cs.meta new file mode 100644 index 0000000..e1aa08a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/SurfaceDepthNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d3b0855152b8c5d478f236423cfb1959 +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/TriplanarNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/TriplanarNode.cs new file mode 100644 index 0000000..56eb384 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/TriplanarNode.cs @@ -0,0 +1,1535 @@ +using UnityEngine; +using UnityEditor; + +using System; +using System.Collections.Generic; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Triplanar Sample", "Textures", "Triplanar Mapping" )] + public sealed class TriplanarNode : ParentNode + { + [SerializeField] + private string m_uniqueName; + + private bool m_editPropertyNameMode = false; + [SerializeField] + private string m_propertyInspectorName = "Triplanar Sampler"; + + private enum TriplanarType { Spherical, Cylindrical } + + [SerializeField] + private TriplanarType m_selectedTriplanarType = TriplanarType.Spherical; + + private enum TriplanarSpace { Object, World } + + [SerializeField] + private TriplanarSpace m_selectedTriplanarSpace = TriplanarSpace.World; + + [SerializeField] + private bool m_normalCorrection = false; + + [SerializeField] + private ViewSpace m_normalSpace = ViewSpace.Tangent; + + [SerializeField] + private TexturePropertyNode m_topTexture; + [SerializeField] + private TexturePropertyNode m_midTexture; + [SerializeField] + private TexturePropertyNode m_botTexture; + + bool m_texturesInitialize = false; + + [SerializeField] + private string m_tempTopInspectorName = string.Empty; + [SerializeField] + private string m_tempTopName = string.Empty; + private TexturePropertyValues m_tempTopDefaultValue = TexturePropertyValues.white; + private int m_tempTopOrderIndex = -1; + private Texture2D m_tempTopDefaultTexture = null; + + private string m_tempMidInspectorName = string.Empty; + private string m_tempMidName = string.Empty; + private TexturePropertyValues m_tempMidDefaultValue = TexturePropertyValues.white; + private int m_tempMidOrderIndex = -1; + private Texture2D m_tempMidDefaultTexture = null; + + private string m_tempBotInspectorName = string.Empty; + private string m_tempBotName = string.Empty; + private TexturePropertyValues m_tempBotDefaultValue = TexturePropertyValues.white; + private int m_tempBotOrderIndex = -1; + private Texture2D m_tempBotDefaultTexture = null; + + private bool m_topTextureFoldout = true; + private bool m_midTextureFoldout = true; + private bool m_botTextureFoldout = true; + + private InputPort m_topTexPort; + private InputPort m_midTexPort; + private InputPort m_botTexPort; + private InputPort m_tilingPort; + private InputPort m_falloffPort; + private InputPort m_topIndexPort; + private InputPort m_midIndexPort; + private InputPort m_botIndexPort; + private InputPort m_scalePort; + private InputPort m_posPort; + + + private readonly string m_functionCall = "TriplanarSampling{0}( {1} )"; + private readonly string m_functionHeader = "inline {0} TriplanarSampling{1}( {2}float3 worldPos, float3 worldNormal, float falloff, float2 tiling, float3 normalScale, float3 index )"; + + private readonly List m_functionSamplingBodyProj = new List() { + "float3 projNormal = ( pow( abs( worldNormal ), falloff ) );", + "projNormal /= ( projNormal.x + projNormal.y + projNormal.z ) + 0.00001;",// 0.00001 is to prevent division by 0 + "float3 nsign = sign( worldNormal );" + }; + + private readonly List m_functionSamplingBodyNegProj = new List() { + "float negProjNormalY = max( 0, projNormal.y * -nsign.y );", + "projNormal.y = max( 0, projNormal.y * nsign.y );" + }; + + private readonly List m_functionSamplingBodySignsSphere = new List() { + "xNorm.xyz = half3( {0}( xNorm{1} ).xy * float2( nsign.x, 1.0 ) + worldNormal.zy, worldNormal.x ).zyx;", + "yNorm.xyz = half3( {0}( yNorm{1} ).xy * float2( nsign.y, 1.0 ) + worldNormal.xz, worldNormal.y ).xzy;", + "zNorm.xyz = half3( {0}( zNorm{1} ).xy * float2( -nsign.z, 1.0 ) + worldNormal.xy, worldNormal.z ).xyz;" + }; + + private readonly List m_functionSamplingBodySignsSphereScale = new List() { + "xNorm.xyz = half3( {0}( xNorm, normalScale.y ).xy * float2( nsign.x, 1.0 ) + worldNormal.zy, worldNormal.x ).zyx;", + "yNorm.xyz = half3( {0}( yNorm, normalScale.x ).xy * float2( nsign.y, 1.0 ) + worldNormal.xz, worldNormal.y ).xzy;", + "zNorm.xyz = half3( {0}( zNorm, normalScale.y ).xy * float2( -nsign.z, 1.0 ) + worldNormal.xy, worldNormal.z ).xyz;" + }; + + private readonly List m_functionSamplingBodySignsCylinder = new List() { + "yNormN.xyz = half3( {0}( yNormN {1}).xy * float2( nsign.y, 1.0 ) + worldNormal.xz, worldNormal.y ).xzy;" + }; + + private readonly List m_functionSamplingBodySignsCylinderScale = new List() { + "yNormN.xyz = half3( {0}( yNormN, normalScale.z ).xy * float2( nsign.y, 1.0 ) + worldNormal.xz, worldNormal.y ).xzy;" + }; + + private readonly List m_functionSamplingBodyReturnSphereNormalize = new List() { + "return normalize( xNorm.xyz * projNormal.x + yNorm.xyz * projNormal.y + zNorm.xyz * projNormal.z );" + }; + + private readonly List m_functionSamplingBodyReturnCylinderNormalize = new List() { + "return normalize( xNorm.xyz * projNormal.x + yNorm.xyz * projNormal.y + yNormN.xyz * negProjNormalY + zNorm.xyz * projNormal.z );" + }; + + private readonly List m_functionSamplingBodyReturnSphere = new List() { + "return xNorm * projNormal.x + yNorm * projNormal.y + zNorm * projNormal.z;" + }; + + private readonly List m_functionSamplingBodyReturnCylinder = new List() { + "return xNorm * projNormal.x + yNorm * projNormal.y + yNormN * negProjNormalY + zNorm * projNormal.z;" + }; + + private Rect m_allPicker; + private Rect m_startPicker; + private Rect m_pickerButton; + private bool m_editing; + + void ConvertListTo( MasterNodeDataCollector dataCollector, bool scaleInfo, List original, List dest ) + { + int count = original.Count; + string scale = string.Empty; + string func = string.Empty; + bool applyScale = false; + if( dataCollector.IsTemplate && dataCollector.IsSRP ) + { + if( dataCollector.TemplateDataCollectorInstance.IsHDRP ) + { + func = "UnpackNormalmapRGorAG"; + } + else + { + func = "UnpackNormalScale"; + } + + if( !scaleInfo ) + { + scale = " , 1.0"; + applyScale = true; + } + } + else + { + func = scaleInfo ? "UnpackScaleNormal" : "UnpackNormal"; + applyScale = !scaleInfo; + } + + for( int i = 0; i < count; i++ ) + { + if( applyScale ) + dest.Add( string.Format( original[ i ], func, scale ) ); + else + dest.Add( string.Format( original[ i ], func ) ); + } + } + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.SAMPLER2D, false, "Top", -1, MasterNodePortCategory.Fragment, 0 ); + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.SAMPLER2D, WirePortDataType.SAMPLER2DARRAY ); + AddInputPort( WirePortDataType.FLOAT, false, "Top Index", -1, MasterNodePortCategory.Fragment, 5 ); + AddInputPort( WirePortDataType.SAMPLER2D, false, "Middle", -1, MasterNodePortCategory.Fragment, 1 ); + m_inputPorts[ 2 ].CreatePortRestrictions( WirePortDataType.SAMPLER2D, WirePortDataType.SAMPLER2DARRAY ); + AddInputPort( WirePortDataType.FLOAT, false, "Mid Index", -1, MasterNodePortCategory.Fragment, 6 ); + AddInputPort( WirePortDataType.SAMPLER2D, false, "Bottom", -1, MasterNodePortCategory.Fragment, 2 ); + m_inputPorts[ 4 ].CreatePortRestrictions( WirePortDataType.SAMPLER2D, WirePortDataType.SAMPLER2DARRAY ); + AddInputPort( WirePortDataType.FLOAT, false, "Bot Index", -1, MasterNodePortCategory.Fragment, 7 ); + AddInputPort( WirePortDataType.FLOAT3, false, "Pos", -1, MasterNodePortCategory.Fragment, 9 ); + AddInputPort( WirePortDataType.FLOAT3, false, "Scale", -1, MasterNodePortCategory.Fragment, 8 ); + AddInputPort( WirePortDataType.FLOAT2, false, "Tiling", -1, MasterNodePortCategory.Fragment, 3 ); + AddInputPort( WirePortDataType.FLOAT, false, "Falloff", -1, MasterNodePortCategory.Fragment, 4 ); + AddOutputColorPorts( "RGBA" ); + m_useInternalPortData = true; + m_topTexPort = InputPorts[ 0 ]; + m_topIndexPort = InputPorts[ 1 ]; + m_midTexPort = InputPorts[ 2 ]; + m_midIndexPort = InputPorts[ 3 ]; + m_botTexPort = InputPorts[ 4 ]; + m_botIndexPort = InputPorts[ 5 ]; + m_posPort = InputPorts[ 6 ]; + m_scalePort = InputPorts[ 7 ]; + m_tilingPort = InputPorts[ 8 ]; + m_falloffPort = InputPorts[ 9 ]; + + m_scalePort.Visible = false; + m_scalePort.Vector3InternalData = Vector3.one; + m_tilingPort.FloatInternalData = 1; + m_tilingPort.Vector2InternalData = Vector2.one; + m_topIndexPort.FloatInternalData = 1; + m_falloffPort.FloatInternalData = 1; + m_topIndexPort.Visible = false; + m_selectedLocation = PreviewLocation.TopCenter; + m_marginPreviewLeft = 43; + m_drawPreviewAsSphere = true; + m_drawPreviewExpander = false; + m_drawPreview = true; + m_showPreview = true; + m_autoDrawInternalPortData = false; + m_textLabelWidth = 125; + //m_propertyInspectorName = "Triplanar Sampler"; + m_previewShaderGUID = "8723015ec59743143aadfbe480e34391"; + } + + public void ReadPropertiesData() + { + // Top + if( UIUtils.IsUniformNameAvailable( m_tempTopName ) ) + { + UIUtils.ReleaseUniformName( UniqueId, m_topTexture.PropertyName ); + if( !string.IsNullOrEmpty( m_tempTopInspectorName ) ) + { + m_topTexture.SetInspectorName( m_tempTopInspectorName ); + } + if( !string.IsNullOrEmpty( m_tempTopName ) ) + m_topTexture.SetPropertyName( m_tempTopName ); + UIUtils.RegisterUniformName( UniqueId, m_topTexture.PropertyName ); + } + m_topTexture.DefaultTextureValue = m_tempTopDefaultValue; + m_topTexture.OrderIndex = m_tempTopOrderIndex; + m_topTexture.DefaultValue = m_tempTopDefaultTexture; + //m_topTexture.SetMaterialMode( UIUtils.CurrentWindow.CurrentGraph.CurrentMaterial, true ); + + // Mid + if( UIUtils.IsUniformNameAvailable( m_tempMidName ) ) + { + UIUtils.ReleaseUniformName( UniqueId, m_midTexture.PropertyName ); + if( !string.IsNullOrEmpty( m_tempMidInspectorName ) ) + m_midTexture.SetInspectorName( m_tempMidInspectorName ); + if( !string.IsNullOrEmpty( m_tempMidName ) ) + m_midTexture.SetPropertyName( m_tempMidName ); + UIUtils.RegisterUniformName( UniqueId, m_midTexture.PropertyName ); + } + m_midTexture.DefaultTextureValue = m_tempMidDefaultValue; + m_midTexture.OrderIndex = m_tempMidOrderIndex; + m_midTexture.DefaultValue = m_tempMidDefaultTexture; + + // Bot + if( UIUtils.IsUniformNameAvailable( m_tempBotName ) ) + { + UIUtils.ReleaseUniformName( UniqueId, m_botTexture.PropertyName ); + if( !string.IsNullOrEmpty( m_tempBotInspectorName ) ) + m_botTexture.SetInspectorName( m_tempBotInspectorName ); + if( !string.IsNullOrEmpty( m_tempBotName ) ) + m_botTexture.SetPropertyName( m_tempBotName ); + UIUtils.RegisterUniformName( UniqueId, m_botTexture.PropertyName ); + } + m_botTexture.DefaultTextureValue = m_tempBotDefaultValue; + m_botTexture.OrderIndex = m_tempBotOrderIndex; + m_botTexture.DefaultValue = m_tempBotDefaultTexture; + } + + public override void SetMaterialMode( Material mat, bool fetchMaterialValues ) + { + base.SetMaterialMode( mat, fetchMaterialValues ); + + if( !m_texturesInitialize ) + return; + + m_topTexture.SetMaterialMode( mat, fetchMaterialValues ); + m_midTexture.SetMaterialMode( mat, fetchMaterialValues ); + m_botTexture.SetMaterialMode( mat, fetchMaterialValues ); + } + + public void Init() + { + if( m_texturesInitialize ) + return; + else + m_texturesInitialize = true; + + // Top + if( m_topTexture == null ) + { + m_topTexture = ScriptableObject.CreateInstance(); + } + m_topTexture.ContainerGraph = ContainerGraph; + m_topTexture.CustomPrefix = "Top Texture "; + m_topTexture.UniqueId = UniqueId; + m_topTexture.DrawAutocast = false; + m_topTexture.CurrentParameterType = PropertyType.Property; + + // Mid + if( m_midTexture == null ) + { + m_midTexture = ScriptableObject.CreateInstance(); + } + m_midTexture.ContainerGraph = ContainerGraph; + m_midTexture.CustomPrefix = "Mid Texture "; + m_midTexture.UniqueId = UniqueId; + m_midTexture.DrawAutocast = false; + m_midTexture.CurrentParameterType = PropertyType.Property; + + // Bot + if( m_botTexture == null ) + { + m_botTexture = ScriptableObject.CreateInstance(); + } + m_botTexture.ContainerGraph = ContainerGraph; + m_botTexture.CustomPrefix = "Bot Texture "; + m_botTexture.UniqueId = UniqueId; + m_botTexture.DrawAutocast = false; + m_botTexture.CurrentParameterType = PropertyType.Property; + + if( m_materialMode ) + SetDelayedMaterialMode( ContainerGraph.CurrentMaterial ); + + if( m_nodeAttribs != null ) + m_uniqueName = m_nodeAttribs.Name + UniqueId; + + ConfigurePorts(); + + ReRegisterPorts(); + } + + public override void Destroy() + { + base.Destroy(); + + //UIUtils.UnregisterPropertyNode( m_topTexture ); + //UIUtils.UnregisterTexturePropertyNode( m_topTexture ); + + //UIUtils.UnregisterPropertyNode( m_midTexture ); + //UIUtils.UnregisterTexturePropertyNode( m_midTexture ); + + //UIUtils.UnregisterPropertyNode( m_botTexture ); + //UIUtils.UnregisterTexturePropertyNode( m_botTexture ); + if( m_topTexture != null ) + m_topTexture.Destroy(); + m_topTexture = null; + if( m_midTexture != null ) + m_midTexture.Destroy(); + m_midTexture = null; + if( m_botTexture != null ) + m_botTexture.Destroy(); + m_botTexture = null; + + m_tempTopDefaultTexture = null; + m_tempMidDefaultTexture = null; + m_tempBotDefaultTexture = null; + + m_topTexPort = null; + m_midTexPort = null; + m_botTexPort = null; + m_tilingPort = null; + m_falloffPort = null; + m_topIndexPort = null; + m_midIndexPort = null; + m_botIndexPort = null; + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + if( m_topTexture == null ) + return; + + + if( m_topTexPort.IsConnected ) + { + PreviewMaterial.SetTexture( "_A", m_topTexPort.InputPreviewTexture( ContainerGraph ) ); + } + else + { + PreviewMaterial.SetTexture( "_A", m_topTexture.Value ); + } + if( m_selectedTriplanarType == TriplanarType.Cylindrical && m_midTexture != null ) + { + if( m_midTexPort.IsConnected ) + PreviewMaterial.SetTexture( "_B", m_midTexPort.InputPreviewTexture( ContainerGraph ) ); + else + PreviewMaterial.SetTexture( "_B", m_midTexture.Value ); + if( m_botTexPort.IsConnected ) + PreviewMaterial.SetTexture( "_C", m_botTexPort.InputPreviewTexture( ContainerGraph ) ); + else + PreviewMaterial.SetTexture( "_C", m_botTexture.Value ); + } + + PreviewMaterial.SetFloat( "_IsNormal", ( m_normalCorrection ? 1 : 0 ) ); + PreviewMaterial.SetFloat( "_IsTangent", ( m_normalSpace == ViewSpace.Tangent ? 1 : 0 ) ); + PreviewMaterial.SetFloat( "_IsSpherical", ( m_selectedTriplanarType == TriplanarType.Spherical ? 1 : 0 ) ); + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + if( portId == 0 ) + m_topTexPort.MatchPortToConnection(); + + if( portId == 1 ) + m_midTexPort.MatchPortToConnection(); + + if( portId == 2 ) + m_botTexPort.MatchPortToConnection(); + + if( m_texturesInitialize ) + ReRegisterPorts(); + + ConfigurePorts(); + } + + public override void OnInputPortDisconnected( int portId ) + { + base.OnInputPortDisconnected( portId ); + if( m_texturesInitialize ) + ReRegisterPorts(); + } + + public override void OnConnectedOutputNodeChanges( int portId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( portId, otherNodeId, otherPortId, name, type ); + if( portId == 0 ) + { + if( !m_topTexPort.CheckValidType( type ) ) + { + m_topTexPort.FullDeleteConnections(); + UIUtils.ShowMessage( UniqueId, "Triplanar Sampler node only accepts SAMPLER2D and SAMPLER2DARRAY input types.\nTexture Object connected changed to " + type + ", connection was lost, please review and update accordingly.", MessageSeverity.Warning ); + } + else + { + m_topTexPort.MatchPortToConnection(); + } + } + + if( portId == 1 ) + { + if( !m_midTexPort.CheckValidType( type ) ) + { + m_midTexPort.FullDeleteConnections(); + UIUtils.ShowMessage( UniqueId, "Triplanar Sampler node only accepts SAMPLER2D and SAMPLER2DARRAY input types.\nTexture Object connected changed to " + type + ", connection was lost, please review and update accordingly.", MessageSeverity.Warning ); + } + else + { + m_midTexPort.MatchPortToConnection(); + } + } + + if( portId == 2 ) + { + if( !m_botTexPort.CheckValidType( type ) ) + { + m_botTexPort.FullDeleteConnections(); + UIUtils.ShowMessage( UniqueId, "Triplanar Sampler node only accepts SAMPLER2D and SAMPLER2DARRAY input types.\nTexture Object connected changed to " + type + ", connection was lost, please review and update accordingly.", MessageSeverity.Warning ); + } + else + { + m_botTexPort.MatchPortToConnection(); + } + } + + if( m_texturesInitialize ) + ReRegisterPorts(); + + ConfigurePorts(); + } + + public void ReRegisterPorts() + { + if( m_topTexPort.IsConnected ) + { + UIUtils.UnregisterPropertyNode( m_topTexture ); + UIUtils.UnregisterTexturePropertyNode( m_topTexture ); + } + else if( m_topTexPort.Visible ) + { + UIUtils.RegisterPropertyNode( m_topTexture ); + UIUtils.RegisterTexturePropertyNode( m_topTexture ); + } + + if( m_midTexPort.IsConnected || m_selectedTriplanarType == TriplanarType.Spherical ) + { + UIUtils.UnregisterPropertyNode( m_midTexture ); + UIUtils.UnregisterTexturePropertyNode( m_midTexture ); + } + else if( m_midTexPort.Visible && m_selectedTriplanarType == TriplanarType.Cylindrical ) + { + UIUtils.RegisterPropertyNode( m_midTexture ); + UIUtils.RegisterTexturePropertyNode( m_midTexture ); + } + + if( m_botTexPort.IsConnected || m_selectedTriplanarType == TriplanarType.Spherical ) + { + UIUtils.UnregisterPropertyNode( m_botTexture ); + UIUtils.UnregisterTexturePropertyNode( m_botTexture ); + } + else if( m_botTexPort.Visible && m_selectedTriplanarType == TriplanarType.Cylindrical ) + { + UIUtils.RegisterPropertyNode( m_botTexture ); + UIUtils.RegisterTexturePropertyNode( m_botTexture ); + } + } + + public void ConfigurePorts() + { + switch( m_selectedTriplanarType ) + { + case TriplanarType.Spherical: + m_topTexPort.Name = "Tex"; + m_midTexPort.Visible = false; + m_botTexPort.Visible = false; + m_scalePort.ChangeType( WirePortDataType.FLOAT, false ); + break; + case TriplanarType.Cylindrical: + m_topTexPort.Name = "Top"; + m_midTexPort.Visible = true; + m_botTexPort.Visible = true; + m_scalePort.ChangeType( WirePortDataType.FLOAT3, false ); + break; + } + + if( m_normalCorrection ) + { + m_outputPorts[ 0 ].ChangeProperties( "XYZ", WirePortDataType.FLOAT3, false ); + m_outputPorts[ 1 ].ChangeProperties( "X", WirePortDataType.FLOAT, false ); + m_outputPorts[ 2 ].ChangeProperties( "Y", WirePortDataType.FLOAT, false ); + m_outputPorts[ 3 ].ChangeProperties( "Z", WirePortDataType.FLOAT, false ); + + m_outputPorts[ 4 ].Visible = false; + + m_scalePort.Visible = true; + } + else + { + m_outputPorts[ 0 ].ChangeProperties( "RGBA", WirePortDataType.FLOAT4, false ); + m_outputPorts[ 1 ].ChangeProperties( "R", WirePortDataType.FLOAT, false ); + m_outputPorts[ 2 ].ChangeProperties( "G", WirePortDataType.FLOAT, false ); + m_outputPorts[ 3 ].ChangeProperties( "B", WirePortDataType.FLOAT, false ); + m_outputPorts[ 4 ].ChangeProperties( "A", WirePortDataType.FLOAT, false ); + + m_outputPorts[ 4 ].Visible = true; + + m_scalePort.Visible = false; + } + + if( m_topTexPort.DataType == WirePortDataType.SAMPLER2DARRAY ) + m_topIndexPort.Visible = true; + else + m_topIndexPort.Visible = false; + + if( m_midTexPort.DataType == WirePortDataType.SAMPLER2DARRAY && m_selectedTriplanarType == TriplanarType.Cylindrical ) + m_midIndexPort.Visible = true; + else + m_midIndexPort.Visible = false; + + if( m_botTexPort.DataType == WirePortDataType.SAMPLER2DARRAY && m_selectedTriplanarType == TriplanarType.Cylindrical ) + m_botIndexPort.Visible = true; + else + m_botIndexPort.Visible = false; + + if( m_selectedTriplanarSpace == TriplanarSpace.World ) + m_posPort.Name = "World Pos"; + else + m_posPort.Name = "Local Pos"; + + m_outputPorts[ 0 ].DirtyLabelSize = true; + m_sizeIsDirty = true; + } + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + base.PropagateNodeData( nodeData, ref dataCollector ); + dataCollector.DirtyNormal = true; + } + + public override void DrawProperties() + { + base.DrawProperties(); + NodeUtils.DrawPropertyGroup( ref m_propertiesFoldout, "Parameters", DrawMainOptions ); + DrawInternalDataGroup(); + if( m_selectedTriplanarType == TriplanarType.Spherical && !m_topTexPort.IsConnected ) + NodeUtils.DrawPropertyGroup( ref m_topTextureFoldout, "Texture", DrawTopTextureOptions ); + else if( !m_topTexPort.IsConnected ) + NodeUtils.DrawPropertyGroup( ref m_topTextureFoldout, "Top Texture", DrawTopTextureOptions ); + + if( m_selectedTriplanarType == TriplanarType.Cylindrical ) + { + if( !m_midTexPort.IsConnected ) + NodeUtils.DrawPropertyGroup( ref m_midTextureFoldout, "Middle Texture", DrawMidTextureOptions ); + if( !m_botTexPort.IsConnected ) + NodeUtils.DrawPropertyGroup( ref m_botTextureFoldout, "Bottom Texture", DrawBotTextureOptions ); + } + } + + void DrawMainOptions() + { + EditorGUI.BeginChangeCheck(); + m_propertyInspectorName = EditorGUILayoutTextField( "Name", m_propertyInspectorName ); + + m_selectedTriplanarType = (TriplanarType)EditorGUILayoutEnumPopup( "Mapping", m_selectedTriplanarType ); + + m_selectedTriplanarSpace = (TriplanarSpace)EditorGUILayoutEnumPopup( "Space", m_selectedTriplanarSpace ); + + m_normalCorrection = EditorGUILayoutToggle( "Normal Map", m_normalCorrection ); + + if( m_normalCorrection ) + m_normalSpace = (ViewSpace)EditorGUILayoutEnumPopup( "Output Normal Space", m_normalSpace ); + + if( EditorGUI.EndChangeCheck() ) + { + SetTitleText( m_propertyInspectorName ); + ConfigurePorts(); + ReRegisterPorts(); + } + } + + void DrawTopTextureOptions() + { + EditorGUI.BeginChangeCheck(); + m_topTexture.ShowPropertyInspectorNameGUI(); + m_topTexture.ShowPropertyNameGUI( true ); + m_topTexture.ShowToolbar(); + if( EditorGUI.EndChangeCheck() ) + { + m_topTexture.BeginPropertyFromInspectorCheck(); + if( m_materialMode ) + m_requireMaterialUpdate = true; + } + + m_topTexture.CheckPropertyFromInspector(); + } + + void DrawMidTextureOptions() + { + if( m_midTexture == null ) + return; + + EditorGUI.BeginChangeCheck(); + m_midTexture.ShowPropertyInspectorNameGUI(); + m_midTexture.ShowPropertyNameGUI( true ); + m_midTexture.ShowToolbar(); + if( EditorGUI.EndChangeCheck() ) + { + m_midTexture.BeginPropertyFromInspectorCheck(); + if( m_materialMode ) + m_requireMaterialUpdate = true; + } + + m_midTexture.CheckPropertyFromInspector(); + } + + void DrawBotTextureOptions() + { + if( m_botTexture == null ) + return; + + EditorGUI.BeginChangeCheck(); + m_botTexture.ShowPropertyInspectorNameGUI(); + m_botTexture.ShowPropertyNameGUI( true ); + m_botTexture.ShowToolbar(); + if( EditorGUI.EndChangeCheck() ) + { + m_botTexture.BeginPropertyFromInspectorCheck(); + if( m_materialMode ) + m_requireMaterialUpdate = true; + } + + m_botTexture.CheckPropertyFromInspector(); + } + + public override void OnEnable() + { + base.OnEnable(); + //if( !m_afterDeserialize ) + //Init(); //Generate texture properties + //else + //m_afterDeserialize = false; + + //if( m_topTexture != null ) + // m_topTexture.ReRegisterName = true; + + //if( m_selectedTriplanarType == TriplanarType.Cylindrical ) + //{ + // if( m_midTexture != null ) + // m_midTexture.ReRegisterName = true; + + // if( m_botTexture != null ) + // m_botTexture.ReRegisterName = true; + //} + } + + //bool m_afterDeserialize = false; + + //public override void OnAfterDeserialize() + //{ + // base.OnAfterDeserialize(); + // m_afterDeserialize = true; + //} + + + public override void OnNodeLogicUpdate( DrawInfo drawInfo ) + { + base.OnNodeLogicUpdate( drawInfo ); + + Init(); + + if( m_topTexture.ReRegisterName ) + { + m_topTexture.ReRegisterName = false; + UIUtils.RegisterUniformName( UniqueId, m_topTexture.PropertyName ); + } + + m_topTexture.CheckDelayedDirtyProperty(); + m_topTexture.CheckPropertyFromInspector(); + m_topTexture.CheckDuplicateProperty(); + + if( m_selectedTriplanarType == TriplanarType.Cylindrical ) + { + if( m_midTexture.ReRegisterName ) + { + m_midTexture.ReRegisterName = false; + UIUtils.RegisterUniformName( UniqueId, m_midTexture.PropertyName ); + } + + m_midTexture.CheckDelayedDirtyProperty(); + m_midTexture.CheckPropertyFromInspector(); + m_midTexture.CheckDuplicateProperty(); + + if( m_botTexture.ReRegisterName ) + { + m_botTexture.ReRegisterName = false; + UIUtils.RegisterUniformName( UniqueId, m_botTexture.PropertyName ); + } + + m_botTexture.CheckDelayedDirtyProperty(); + m_botTexture.CheckPropertyFromInspector(); + m_botTexture.CheckDuplicateProperty(); + } + } + + public override void OnNodeLayout( DrawInfo drawInfo ) + { + base.OnNodeLayout( drawInfo ); + + m_allPicker = m_previewRect; + m_allPicker.x -= 43 * drawInfo.InvertedZoom; + m_allPicker.width = 43 * drawInfo.InvertedZoom; + + m_startPicker = m_previewRect; + m_startPicker.x -= 43 * drawInfo.InvertedZoom; + m_startPicker.width = 43 * drawInfo.InvertedZoom; + m_startPicker.height = 43 * drawInfo.InvertedZoom; + + m_pickerButton = m_startPicker; + m_pickerButton.width = 30 * drawInfo.InvertedZoom; + m_pickerButton.x = m_startPicker.xMax - m_pickerButton.width - 2; + m_pickerButton.height = 10 * drawInfo.InvertedZoom; + m_pickerButton.y = m_startPicker.yMax - m_pickerButton.height - 2; + } + + + + public override void DrawGUIControls( DrawInfo drawInfo ) + { + base.DrawGUIControls( drawInfo ); + + if( !( drawInfo.CurrentEventType == EventType.MouseDown || drawInfo.CurrentEventType == EventType.MouseUp || drawInfo.CurrentEventType == EventType.ExecuteCommand || drawInfo.CurrentEventType == EventType.DragPerform ) ) + return; + + bool insideBox = m_allPicker.Contains( drawInfo.MousePosition ); + + if( insideBox ) + { + m_editing = true; + } + else if( m_editing && !insideBox && drawInfo.CurrentEventType != EventType.ExecuteCommand ) + { + GUI.FocusControl( null ); + m_editing = false; + } + } + private int m_pickId = 0; + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + Rect pickerButtonClone = m_pickerButton; + Rect startPickerClone = m_startPicker; + + if( m_editing ) + { + if( GUI.Button( pickerButtonClone, string.Empty, GUIStyle.none ) ) + { + int controlID = EditorGUIUtility.GetControlID( FocusType.Passive ); + EditorGUIUtility.ShowObjectPicker( m_topTexture.Value, false, "", controlID ); + m_pickId = 0; + } + + if( m_selectedTriplanarType == TriplanarType.Cylindrical ) + { + pickerButtonClone.y += startPickerClone.height; + if( GUI.Button( pickerButtonClone, string.Empty, GUIStyle.none ) ) + { + int controlID = EditorGUIUtility.GetControlID( FocusType.Passive ); + EditorGUIUtility.ShowObjectPicker( m_midTexture.Value, false, "", controlID ); + m_pickId = 1; + } + + pickerButtonClone.y += startPickerClone.height; + if( GUI.Button( pickerButtonClone, string.Empty, GUIStyle.none ) ) + { + int controlID = EditorGUIUtility.GetControlID( FocusType.Passive ); + EditorGUIUtility.ShowObjectPicker( m_botTexture.Value, false, "", controlID ); + m_pickId = 2; + } + } + + string commandName = Event.current.commandName; + UnityEngine.Object newValue = null; + if( commandName.Equals( "ObjectSelectorUpdated" ) || commandName.Equals( "ObjectSelectorClosed" ) ) + { + newValue = EditorGUIUtility.GetObjectPickerObject(); + if( m_pickId == 2 ) + { + if( newValue != (UnityEngine.Object)m_botTexture.Value ) + { + PreviewIsDirty = true; + UndoRecordObject( "Changing value EditorGUIObjectField on node Triplanar Node" ); + m_botTexture.Value = newValue != null ? (Texture2D)newValue : null; + + if( m_materialMode ) + m_requireMaterialUpdate = true; + } + } + else if( m_pickId == 1 ) + { + if( newValue != (UnityEngine.Object)m_midTexture.Value ) + { + PreviewIsDirty = true; + UndoRecordObject( "Changing value EditorGUIObjectField on node Triplanar Node" ); + m_midTexture.Value = newValue != null ? (Texture2D)newValue : null; + + if( m_materialMode ) + m_requireMaterialUpdate = true; + } + } + else + { + if( newValue != (UnityEngine.Object)m_topTexture.Value ) + { + PreviewIsDirty = true; + UndoRecordObject( "Changing value EditorGUIObjectField on node Triplanar Node" ); + m_topTexture.Value = newValue != null ? (Texture2D)newValue : null; + + if( m_materialMode ) + m_requireMaterialUpdate = true; + } + } + + if( commandName.Equals( "ObjectSelectorClosed" ) ) + m_editing = false; + } + + if( GUI.Button( startPickerClone, string.Empty, GUIStyle.none ) ) + { + if( m_topTexPort.IsConnected ) + { + UIUtils.FocusOnNode( m_topTexPort.GetOutputNode( 0 ), 1, true ); + } + else + { + if( m_topTexture.Value != null ) + { + Selection.activeObject = m_topTexture.Value; + EditorGUIUtility.PingObject( Selection.activeObject ); + } + } + m_editing = false; + } + + if( m_selectedTriplanarType == TriplanarType.Cylindrical ) + { + startPickerClone.y += startPickerClone.height; + if( GUI.Button( startPickerClone, string.Empty, GUIStyle.none ) ) + { + if( m_midTexPort.IsConnected ) + { + UIUtils.FocusOnNode( m_midTexPort.GetOutputNode( 0 ), 1, true ); + } + else + { + if( m_midTexture.Value != null ) + { + Selection.activeObject = m_midTexture.Value; + EditorGUIUtility.PingObject( Selection.activeObject ); + } + } + m_editing = false; + } + + startPickerClone.y += startPickerClone.height; + if( GUI.Button( startPickerClone, string.Empty, GUIStyle.none ) ) + { + if( m_botTexPort.IsConnected ) + { + UIUtils.FocusOnNode( m_botTexPort.GetOutputNode( 0 ), 1, true ); + } + else + { + if( m_botTexture.Value != null ) + { + Selection.activeObject = m_botTexture.Value; + EditorGUIUtility.PingObject( Selection.activeObject ); + } + } + m_editing = false; + } + } + } + + pickerButtonClone = m_pickerButton; + startPickerClone = m_startPicker; + + if( drawInfo.CurrentEventType == EventType.Repaint ) + { + // Top + if( m_topTexPort.IsConnected ) + { + EditorGUI.DrawPreviewTexture( startPickerClone, m_topTexPort.GetOutputConnection( 0 ).OutputPreviewTexture, null, ScaleMode.ScaleAndCrop ); + } + else if( m_topTexture.Value != null ) + { + EditorGUI.DrawPreviewTexture( startPickerClone, m_topTexture.Value, null, ScaleMode.ScaleAndCrop ); + if( ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD2 ) + GUI.Label( pickerButtonClone, "Select", UIUtils.MiniSamplerButton ); + } + else + { + GUI.Label( startPickerClone, string.Empty, UIUtils.ObjectFieldThumb ); + if( ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD2 ) + { + GUI.Label( startPickerClone, "None (Texture2D)", UIUtils.MiniObjectFieldThumbOverlay ); + GUI.Label( pickerButtonClone, "Select", UIUtils.MiniSamplerButton ); + } + } + GUI.Label( startPickerClone, string.Empty, UIUtils.GetCustomStyle( CustomStyle.SamplerFrame ) ); + + if( m_selectedTriplanarType == TriplanarType.Cylindrical ) + { + // Mid + startPickerClone.y += startPickerClone.height; + pickerButtonClone.y += startPickerClone.height; + if( m_midTexPort.IsConnected ) + { + EditorGUI.DrawPreviewTexture( startPickerClone, m_midTexPort.GetOutputConnection( 0 ).OutputPreviewTexture, null, ScaleMode.ScaleAndCrop ); + } + else if( m_midTexture.Value != null ) + { + EditorGUI.DrawPreviewTexture( startPickerClone, m_midTexture.Value, null, ScaleMode.ScaleAndCrop ); + if( ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD2 ) + GUI.Label( pickerButtonClone, "Select", UIUtils.MiniSamplerButton ); + } + else + { + GUI.Label( startPickerClone, string.Empty, UIUtils.ObjectFieldThumb ); + if( ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD2 ) + { + GUI.Label( startPickerClone, "None (Texture2D)", UIUtils.MiniObjectFieldThumbOverlay ); + GUI.Label( pickerButtonClone, "Select", UIUtils.MiniSamplerButton ); + } + } + GUI.Label( startPickerClone, string.Empty, UIUtils.GetCustomStyle( CustomStyle.SamplerFrame ) ); + + // Bot + startPickerClone.y += startPickerClone.height; + startPickerClone.height = 42 * drawInfo.InvertedZoom; + pickerButtonClone.y += startPickerClone.height; + if( m_botTexPort.IsConnected ) + { + EditorGUI.DrawPreviewTexture( startPickerClone, m_botTexPort.GetOutputConnection( 0 ).OutputPreviewTexture, null, ScaleMode.ScaleAndCrop ); + } + else if( m_botTexture.Value != null ) + { + EditorGUI.DrawPreviewTexture( startPickerClone, m_botTexture.Value, null, ScaleMode.ScaleAndCrop ); + if( ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD2 ) + GUI.Label( pickerButtonClone, "Select", UIUtils.MiniSamplerButton ); + } + else + { + GUI.Label( startPickerClone, string.Empty, UIUtils.ObjectFieldThumb ); + if( ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD2 ) + { + GUI.Label( startPickerClone, "None (Texture2D)", UIUtils.MiniObjectFieldThumbOverlay ); + GUI.Label( pickerButtonClone, "Select", UIUtils.MiniSamplerButton ); + } + } + GUI.Label( startPickerClone, string.Empty, UIUtils.GetCustomStyle( CustomStyle.SamplerFrame ) ); + } + } + } + + public override void OnNodeDoubleClicked( Vector2 currentMousePos2D ) + { + if( currentMousePos2D.y - m_globalPosition.y > Constants.NODE_HEADER_HEIGHT + Constants.NODE_HEADER_EXTRA_HEIGHT ) + { + ContainerGraph.ParentWindow.ParametersWindow.IsMaximized = !ContainerGraph.ParentWindow.ParametersWindow.IsMaximized; + } + else + { + m_editPropertyNameMode = true; + GUI.FocusControl( m_uniqueName ); + TextEditor te = (TextEditor)GUIUtility.GetStateObject( typeof( TextEditor ), GUIUtility.keyboardControl ); + if( te != null ) + { + te.SelectAll(); + } + } + } + + public override void OnNodeSelected( bool value ) + { + base.OnNodeSelected( value ); + if( !value ) + m_editPropertyNameMode = false; + } + + public override void DrawTitle( Rect titlePos ) + { + if( m_editPropertyNameMode ) + { + titlePos.height = Constants.NODE_HEADER_HEIGHT; + EditorGUI.BeginChangeCheck(); + GUI.SetNextControlName( m_uniqueName ); + m_propertyInspectorName = GUITextField( titlePos, m_propertyInspectorName, UIUtils.GetCustomStyle( CustomStyle.NodeTitle ) ); + if( EditorGUI.EndChangeCheck() ) + { + SetTitleText( m_propertyInspectorName ); + } + + if( Event.current.isKey && ( Event.current.keyCode == KeyCode.Return || Event.current.keyCode == KeyCode.KeypadEnter ) ) + { + m_editPropertyNameMode = false; + GUIUtility.keyboardControl = 0; + } + } + else + { + base.DrawTitle( titlePos ); + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return GetOutputColorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + + ParentGraph outsideGraph = UIUtils.CurrentWindow.OutsideGraph; + + dataCollector.AddPropertyNode( m_topTexture ); + dataCollector.AddPropertyNode( m_midTexture ); + dataCollector.AddPropertyNode( m_botTexture ); + + bool isVertex = ( dataCollector.PortCategory == MasterNodePortCategory.Tessellation || dataCollector.PortCategory == MasterNodePortCategory.Vertex ); + + string texTop = string.Empty; + string texMid = string.Empty; + string texBot = string.Empty; + string ssTop = string.Empty; + string ssMid = string.Empty; + string ssBot = string.Empty; + + if( m_topTexPort.IsConnected ) + { + texTop = m_topTexPort.GeneratePortInstructions( ref dataCollector ); + } + else + { + dataCollector.AddToUniforms( UniqueId, m_topTexture.GetTexture2DUniformValue() ); + dataCollector.AddToProperties( UniqueId, m_topTexture.GetTexture2DPropertyValue(), m_topTexture.OrderIndex ); + texTop = m_topTexture.PropertyName; + } + + if( m_selectedTriplanarType == TriplanarType.Spherical ) + { + texMid = texTop; + texBot = texTop; + +#if UNITY_2018_1_OR_NEWER + if( ( outsideGraph.SamplingMacros || m_topTexPort.DataType == WirePortDataType.SAMPLER2DARRAY ) ) +#else + if( ( outsideGraph.SamplingMacros || m_topTexPort.DataType == WirePortDataType.SAMPLER2DARRAY ) && !outsideGraph.IsStandardSurface ) +#endif + ssTop = GeneratorUtils.GenerateSamplerState( ref dataCollector, UniqueId, texTop ); + } + else + { + if( m_midTexPort.IsConnected ) + { + texMid = m_midTexPort.GeneratePortInstructions( ref dataCollector ); + } + else + { + dataCollector.AddToUniforms( UniqueId, m_midTexture.GetTexture2DUniformValue() ); + dataCollector.AddToProperties( UniqueId, m_midTexture.GetTexture2DPropertyValue(), m_midTexture.OrderIndex ); + texMid = m_midTexture.PropertyName; + } + + if( m_botTexPort.IsConnected ) + { + texBot = m_botTexPort.GeneratePortInstructions( ref dataCollector ); + } + else + { + dataCollector.AddToUniforms( UniqueId, m_botTexture.GetTexture2DUniformValue() ); + dataCollector.AddToProperties( UniqueId, m_botTexture.GetTexture2DPropertyValue(), m_botTexture.OrderIndex ); + texBot = m_botTexture.PropertyName; + } +#if UNITY_2018_1_OR_NEWER + if( ( outsideGraph.SamplingMacros || m_topTexPort.DataType == WirePortDataType.SAMPLER2DARRAY ) ) + ssTop = GeneratorUtils.GenerateSamplerState( ref dataCollector, UniqueId, texTop ); + if( ( outsideGraph.SamplingMacros || m_midTexPort.DataType == WirePortDataType.SAMPLER2DARRAY ) ) + ssMid = GeneratorUtils.GenerateSamplerState( ref dataCollector, UniqueId, texMid ); + if( ( outsideGraph.SamplingMacros || m_botTexPort.DataType == WirePortDataType.SAMPLER2DARRAY ) ) + ssBot = GeneratorUtils.GenerateSamplerState( ref dataCollector, UniqueId, texBot ); +#else + if( ( outsideGraph.SamplingMacros || m_topTexPort.DataType == WirePortDataType.SAMPLER2DARRAY ) && !outsideGraph.IsStandardSurface ) + ssTop = GeneratorUtils.GenerateSamplerState( ref dataCollector, UniqueId, texTop ); + if( ( outsideGraph.SamplingMacros || m_midTexPort.DataType == WirePortDataType.SAMPLER2DARRAY ) && !outsideGraph.IsStandardSurface ) + ssMid = GeneratorUtils.GenerateSamplerState( ref dataCollector, UniqueId, texMid ); + if( ( outsideGraph.SamplingMacros || m_botTexPort.DataType == WirePortDataType.SAMPLER2DARRAY ) && !outsideGraph.IsStandardSurface ) + ssBot = GeneratorUtils.GenerateSamplerState( ref dataCollector, UniqueId, texBot ); +#endif + } + + if( !isVertex ) + { + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_POS ); + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_NORMAL, CurrentPrecisionType ); + dataCollector.AddToInput( UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + dataCollector.ForceNormal = true; + } + + string topIndex = "0"; + string midIndex = "0"; + string botIndex = "0"; + if( m_topIndexPort.Visible ) + topIndex = m_topIndexPort.GeneratePortInstructions( ref dataCollector ); + if( m_midIndexPort.Visible ) + midIndex = m_midIndexPort.GeneratePortInstructions( ref dataCollector ); + if( m_botIndexPort.Visible ) + botIndex = m_botIndexPort.GeneratePortInstructions( ref dataCollector ); + + string tiling = m_tilingPort.GeneratePortInstructions( ref dataCollector ); + string falloff = m_falloffPort.GeneratePortInstructions( ref dataCollector ); + + bool scaleNormals = false; + if( m_scalePort.IsConnected || ( m_scalePort.IsConnected && ( m_scalePort.Vector3InternalData == Vector3.one || m_scalePort.FloatInternalData == 1 ) ) ) + scaleNormals = true; + + MipType mip = isVertex ? MipType.MipLevel : MipType.Auto; + string samplingTriplanar = string.Empty; + string headerID = string.Empty; + string header = string.Empty; + string callHeader = string.Empty; + string samplers = string.Empty; + string extraArguments = string.Empty; + List triplanarBody = new List(); + + triplanarBody.AddRange( m_functionSamplingBodyProj ); + headerID += OutputId; + if( m_selectedTriplanarType == TriplanarType.Spherical ) + { + samplers = GeneratorUtils.GetPropertyDeclaraction( "topTexMap", m_topTexPort.DataType, ", " ) + GeneratorUtils.GetSamplerDeclaraction( "samplertopTexMap", m_topTexPort.DataType, ", " ); +#if !UNITY_2018_1_OR_NEWER + if( m_topTexPort.DataType == WirePortDataType.SAMPLER2DARRAY && outsideGraph.IsStandardSurface ) + samplers = "UNITY_ARGS_TEX2DARRAY(topTexMap), "; +#endif + + string array1 = ""; + string array2 = ""; + if( m_topTexPort.DataType == WirePortDataType.SAMPLER2DARRAY ) + { + if( outsideGraph.IsSRP ) + { + array1 = ""; + array2 = ", index.x"; + } + else + { + array1 = "float3( "; + array2 = ", index.x )"; + } + } + + triplanarBody.Add( "half4 xNorm; half4 yNorm; half4 zNorm;" ); + triplanarBody.Add( "xNorm = " + GeneratorUtils.GenerateSamplingCall( ref dataCollector, m_topTexPort.DataType, "topTexMap", "samplertopTexMap", string.Format( "{0}tiling * worldPos.zy * float2( nsign.x, 1.0 ){1}", array1, array2 ), mip, "0" ) + ";" ); + triplanarBody.Add( "yNorm = " + GeneratorUtils.GenerateSamplingCall( ref dataCollector, m_topTexPort.DataType, "topTexMap", "samplertopTexMap", string.Format( "{0}tiling * worldPos.xz * float2( nsign.y, 1.0 ){1}", array1, array2 ), mip, "0" ) + ";" ); + triplanarBody.Add( "zNorm = " + GeneratorUtils.GenerateSamplingCall( ref dataCollector, m_topTexPort.DataType, "topTexMap", "samplertopTexMap", string.Format( "{0}tiling * worldPos.xy * float2( -nsign.z, 1.0 ){1}", array1, array2 ), mip, "0" ) + ";" ); + + if( m_normalCorrection ) + { + if( scaleNormals ) + { + ConvertListTo( dataCollector, true, m_functionSamplingBodySignsSphereScale, triplanarBody ); + } + else + { + ConvertListTo( dataCollector, false, m_functionSamplingBodySignsSphere, triplanarBody ); + } + triplanarBody.AddRange( m_functionSamplingBodyReturnSphereNormalize ); + } + else + { + triplanarBody.AddRange( m_functionSamplingBodyReturnSphere ); + } + } + else + { + string topArgs = GeneratorUtils.GetPropertyDeclaraction( "topTexMap", m_topTexPort.DataType, ", " ) + GeneratorUtils.GetSamplerDeclaraction( "samplertopTexMap", m_topTexPort.DataType, ", " ); + string midArgs = GeneratorUtils.GetPropertyDeclaraction( "midTexMap", m_midTexPort.DataType, ", " ) + GeneratorUtils.GetSamplerDeclaraction( "samplermidTexMap", m_midTexPort.DataType, ", " ); + string botArgs = GeneratorUtils.GetPropertyDeclaraction( "botTexMap", m_botTexPort.DataType, ", " ) + GeneratorUtils.GetSamplerDeclaraction( "samplerbotTexMap", m_botTexPort.DataType, ", " ); + +#if !UNITY_2018_1_OR_NEWER + if( m_topTexPort.DataType == WirePortDataType.SAMPLER2DARRAY && outsideGraph.IsStandardSurface ) + topArgs = "UNITY_ARGS_TEX2DARRAY(topTexMap), "; + + if( m_midTexPort.DataType == WirePortDataType.SAMPLER2DARRAY && outsideGraph.IsStandardSurface ) + midArgs = "UNITY_ARGS_TEX2DARRAY(midTexMap), "; + + if( m_botTexPort.DataType == WirePortDataType.SAMPLER2DARRAY && outsideGraph.IsStandardSurface ) + botArgs = "UNITY_ARGS_TEX2DARRAY(botTexMap), "; +#endif + + samplers = topArgs + midArgs + botArgs; + + string uvTop = "tiling * worldPos.xz * float2( nsign.y, 1.0 )"; + if( m_topTexPort.DataType == WirePortDataType.SAMPLER2DARRAY ) + uvTop = outsideGraph.IsSRP ? uvTop + ", index.x" : "float3( " + uvTop + ", index.x )"; + + string uvMid = "tiling * worldPos.zy * float2( nsign.x, 1.0 )"; + if( m_midTexPort.DataType == WirePortDataType.SAMPLER2DARRAY ) + uvMid = outsideGraph.IsSRP ? uvMid + ", index.y" : "float3( " + uvMid + ", index.y )"; + + string uvMidNeg = "tiling * worldPos.xy * float2( -nsign.z, 1.0 )"; + if( m_midTexPort.DataType == WirePortDataType.SAMPLER2DARRAY ) + uvMidNeg = outsideGraph.IsSRP ? uvMidNeg + ", index.y" : "float3( " + uvMidNeg + ", index.y )"; + + string uvBot = "tiling * worldPos.xz * float2( nsign.y, 1.0 )"; + if( m_botTexPort.DataType == WirePortDataType.SAMPLER2DARRAY ) + uvBot = outsideGraph.IsSRP ? uvBot + ", index.z" : "float3( " + uvBot + ", index.z )"; + + extraArguments = ", {7}, {8}"; + triplanarBody.AddRange( m_functionSamplingBodyNegProj ); + + triplanarBody.Add( "half4 xNorm; half4 yNorm; half4 yNormN; half4 zNorm;" ); + triplanarBody.Add( "xNorm = " + GeneratorUtils.GenerateSamplingCall( ref dataCollector, m_midTexPort.DataType, "midTexMap", "samplermidTexMap", uvMid, mip, "0" ) + ";" ); + triplanarBody.Add( "yNorm = " + GeneratorUtils.GenerateSamplingCall( ref dataCollector, m_topTexPort.DataType, "topTexMap", "samplertopTexMap", uvTop, mip, "0" ) + ";" ); + triplanarBody.Add( "yNormN = " + GeneratorUtils.GenerateSamplingCall( ref dataCollector, m_botTexPort.DataType, "botTexMap", "samplerbotTexMap", uvBot, mip, "0" ) + ";" ); + triplanarBody.Add( "zNorm = " + GeneratorUtils.GenerateSamplingCall( ref dataCollector, m_midTexPort.DataType, "midTexMap", "samplermidTexMap", uvMidNeg, mip, "0" ) + ";" ); + + if( m_normalCorrection ) + { + if( scaleNormals ) + { + if( !( dataCollector.IsTemplate && dataCollector.IsSRP ) ) + { + dataCollector.AddToIncludes( UniqueId, Constants.UnityStandardUtilsLibFuncs ); + } + + ConvertListTo( dataCollector, true, m_functionSamplingBodySignsSphereScale, triplanarBody ); + ConvertListTo( dataCollector, true, m_functionSamplingBodySignsCylinderScale, triplanarBody ); + } + else + { + ConvertListTo( dataCollector, false, m_functionSamplingBodySignsSphere, triplanarBody ); + ConvertListTo( dataCollector, false, m_functionSamplingBodySignsCylinder, triplanarBody ); + } + triplanarBody.AddRange( m_functionSamplingBodyReturnCylinderNormalize ); + } + else + { + triplanarBody.AddRange( m_functionSamplingBodyReturnCylinder ); + } + } + + string type = UIUtils.WirePortToCgType( m_outputPorts[ 0 ].DataType ); + header = string.Format( m_functionHeader, type, headerID, samplers ); + callHeader = string.Format( m_functionCall, headerID, "{0}, {1}, {2}, {3}, {4}, {5}, {6}" + extraArguments ); + + IOUtils.AddFunctionHeader( ref samplingTriplanar, header ); + foreach( string line in triplanarBody ) + IOUtils.AddFunctionLine( ref samplingTriplanar, line ); + IOUtils.CloseFunctionBody( ref samplingTriplanar ); + + string pos = GeneratorUtils.GenerateWorldPosition( ref dataCollector, UniqueId ); + string norm = GeneratorUtils.GenerateWorldNormal( ref dataCollector, UniqueId ); + string worldToTangent = string.Empty; + if( m_normalCorrection && m_normalSpace == ViewSpace.Tangent ) + worldToTangent = GeneratorUtils.GenerateWorldToTangentMatrix( ref dataCollector, UniqueId, CurrentPrecisionType ); + + if( m_selectedTriplanarSpace == TriplanarSpace.Object ) + { + if( m_normalCorrection && m_normalSpace == ViewSpace.Tangent ) + { + string vt = GeneratorUtils.GenerateVertexTangent( ref dataCollector, UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT3 ); + string vbt = GeneratorUtils.GenerateVertexBitangent( ref dataCollector, UniqueId, CurrentPrecisionType ); + norm = GeneratorUtils.GenerateVertexNormal( ref dataCollector, UniqueId, CurrentPrecisionType ); + dataCollector.AddLocalVariable( UniqueId, "float3x3 objectToTangent = float3x3("+ vt + ", "+ vbt + ", "+ norm + ");" ); + pos = GeneratorUtils.GenerateVertexPosition( ref dataCollector, UniqueId, WirePortDataType.FLOAT3 ); + worldToTangent = "objectToTangent"; + } + else + { + pos = GeneratorUtils.GenerateVertexPosition( ref dataCollector, UniqueId, WirePortDataType.FLOAT3 ); + norm = GeneratorUtils.GenerateVertexNormal( ref dataCollector, UniqueId, CurrentPrecisionType ); + } + } + + if( m_posPort.IsConnected ) + { + pos = m_posPort.GeneratePortInstructions( ref dataCollector ); + } + +#if !UNITY_2018_1_OR_NEWER + if( outsideGraph.IsStandardSurface && m_topTexPort.DataType == WirePortDataType.SAMPLER2DARRAY ) + texTop = "UNITY_PASS_TEX2DARRAY(" + texTop + ")"; + if( outsideGraph.IsStandardSurface && m_midTexPort.DataType == WirePortDataType.SAMPLER2DARRAY ) + texMid = "UNITY_PASS_TEX2DARRAY(" + texMid + ")"; + if( outsideGraph.IsStandardSurface && m_botTexPort.DataType == WirePortDataType.SAMPLER2DARRAY ) + texBot = "UNITY_PASS_TEX2DARRAY(" + texBot + ")"; +#endif + + string call = string.Empty; + string normalScale = m_scalePort.GeneratePortInstructions( ref dataCollector ); + + if( !string.IsNullOrEmpty( ssTop ) ) + ssTop = ", " + ssTop; + if( !string.IsNullOrEmpty( ssMid ) ) + ssMid = ", " + ssMid; + if( !string.IsNullOrEmpty( ssBot ) ) + ssBot = ", " + ssBot; + + if( m_selectedTriplanarType == TriplanarType.Spherical ) + call = dataCollector.AddFunctions( callHeader, samplingTriplanar, texTop + ssTop, pos, norm, falloff, tiling, normalScale, topIndex ); + else + call = dataCollector.AddFunctions( callHeader, samplingTriplanar, texTop + ssTop, texMid + ssMid, texBot + ssBot, pos, norm, falloff, tiling, normalScale, "float3(" + topIndex + "," + midIndex + "," + botIndex + ")" ); + string triplanarVarName = "triplanar" + OutputId; + + dataCollector.AddToLocalVariables( dataCollector.PortCategory, UniqueId, type + " "+ triplanarVarName + " = " + call + ";" ); + if( m_normalCorrection && m_normalSpace == ViewSpace.Tangent ) + { + string tanTriplanarVarName = "tanTriplanarNormal" + OutputId; + + dataCollector.AddToLocalVariables( dataCollector.PortCategory, UniqueId, "float3 " + tanTriplanarVarName + " = mul( " + worldToTangent + ", "+ triplanarVarName + " );" ); + + m_outputPorts[ 0 ].SetLocalValue( tanTriplanarVarName, dataCollector.PortCategory ); + + return GetOutputVectorItem( 0, outputId, tanTriplanarVarName ); + } + else + { + return GetOutputVectorItem( 0, outputId, triplanarVarName ); + } + } + + public override void UpdateMaterial( Material mat ) + { + base.UpdateMaterial( mat ); + m_topTexture.OnPropertyNameChanged(); + if( mat.HasProperty( m_topTexture.PropertyName ) && !InsideShaderFunction ) + { + mat.SetTexture( m_topTexture.PropertyName, m_topTexture.MaterialValue ); + } + + m_midTexture.OnPropertyNameChanged(); + if( mat.HasProperty( m_midTexture.PropertyName ) && !InsideShaderFunction ) + { + mat.SetTexture( m_midTexture.PropertyName, m_midTexture.MaterialValue ); + } + + m_botTexture.OnPropertyNameChanged(); + if( mat.HasProperty( m_botTexture.PropertyName ) && !InsideShaderFunction ) + { + mat.SetTexture( m_botTexture.PropertyName, m_botTexture.MaterialValue ); + } + } + + public void SetDelayedMaterialMode( Material mat ) + { + m_topTexture.SetMaterialMode( mat, false ); + if( mat.HasProperty( m_topTexture.PropertyName ) ) + { + m_topTexture.MaterialValue = mat.GetTexture( m_topTexture.PropertyName ); + } + + m_midTexture.SetMaterialMode( mat, false ); + if( mat.HasProperty( m_midTexture.PropertyName ) ) + { + m_midTexture.MaterialValue = mat.GetTexture( m_midTexture.PropertyName ); + } + + m_botTexture.SetMaterialMode( mat, false ); + if( mat.HasProperty( m_botTexture.PropertyName ) ) + { + m_botTexture.MaterialValue = mat.GetTexture( m_botTexture.PropertyName ); + } + } + + public override void ForceUpdateFromMaterial( Material material ) + { + base.ForceUpdateFromMaterial( material ); + if( material.HasProperty( m_topTexture.PropertyName ) ) + { + m_topTexture.MaterialValue = material.GetTexture( m_topTexture.PropertyName ); + PreviewIsDirty = true; + } + + if( material.HasProperty( m_midTexture.PropertyName ) ) + { + m_midTexture.MaterialValue = material.GetTexture( m_midTexture.PropertyName ); + PreviewIsDirty = true; + } + + if( material.HasProperty( m_botTexture.PropertyName ) ) + { + m_botTexture.MaterialValue = material.GetTexture( m_botTexture.PropertyName ); + PreviewIsDirty = true; + } + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_selectedTriplanarType = (TriplanarType)Enum.Parse( typeof( TriplanarType ), GetCurrentParam( ref nodeParams ) ); + m_selectedTriplanarSpace = (TriplanarSpace)Enum.Parse( typeof( TriplanarSpace ), GetCurrentParam( ref nodeParams ) ); + m_normalCorrection = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + + m_tempTopInspectorName = GetCurrentParam( ref nodeParams ); + m_tempTopName = GetCurrentParam( ref nodeParams ); + m_tempTopDefaultValue = (TexturePropertyValues)Enum.Parse( typeof( TexturePropertyValues ), GetCurrentParam( ref nodeParams ) ); + m_tempTopOrderIndex = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_tempTopDefaultTexture = AssetDatabase.LoadAssetAtPath( GetCurrentParam( ref nodeParams ) ); + + m_tempMidInspectorName = GetCurrentParam( ref nodeParams ); + m_tempMidName = GetCurrentParam( ref nodeParams ); + m_tempMidDefaultValue = (TexturePropertyValues)Enum.Parse( typeof( TexturePropertyValues ), GetCurrentParam( ref nodeParams ) ); + m_tempMidOrderIndex = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_tempMidDefaultTexture = AssetDatabase.LoadAssetAtPath( GetCurrentParam( ref nodeParams ) ); + + m_tempBotInspectorName = GetCurrentParam( ref nodeParams ); + m_tempBotName = GetCurrentParam( ref nodeParams ); + m_tempBotDefaultValue = (TexturePropertyValues)Enum.Parse( typeof( TexturePropertyValues ), GetCurrentParam( ref nodeParams ) ); + m_tempBotOrderIndex = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_tempBotDefaultTexture = AssetDatabase.LoadAssetAtPath( GetCurrentParam( ref nodeParams ) ); + + if( UIUtils.CurrentShaderVersion() > 6102 ) + m_propertyInspectorName = GetCurrentParam( ref nodeParams ); + + if( UIUtils.CurrentShaderVersion() <= 18301 ) + Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + + if( UIUtils.CurrentShaderVersion() > 18201 ) + m_normalSpace = (ViewSpace)Enum.Parse( typeof( ViewSpace ), GetCurrentParam( ref nodeParams ) ); + + SetTitleText( m_propertyInspectorName ); + + ConfigurePorts(); + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + + Init(); + + ReadPropertiesData(); + + ConfigurePorts(); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_selectedTriplanarType ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_selectedTriplanarSpace ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_normalCorrection ); + + IOUtils.AddFieldValueToString( ref nodeInfo, m_topTexture.PropertyInspectorName ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_topTexture.PropertyName ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_topTexture.DefaultTextureValue ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_topTexture.OrderIndex.ToString() ); + IOUtils.AddFieldValueToString( ref nodeInfo, ( m_topTexture.DefaultValue != null ) ? AssetDatabase.GetAssetPath( m_topTexture.DefaultValue ) : Constants.NoStringValue ); + + IOUtils.AddFieldValueToString( ref nodeInfo, m_midTexture.PropertyInspectorName ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_midTexture.PropertyName ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_midTexture.DefaultTextureValue ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_midTexture.OrderIndex.ToString() ); + IOUtils.AddFieldValueToString( ref nodeInfo, ( m_midTexture.DefaultValue != null ) ? AssetDatabase.GetAssetPath( m_midTexture.DefaultValue ) : Constants.NoStringValue ); + + IOUtils.AddFieldValueToString( ref nodeInfo, m_botTexture.PropertyInspectorName ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_botTexture.PropertyName ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_botTexture.DefaultTextureValue ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_botTexture.OrderIndex.ToString() ); + IOUtils.AddFieldValueToString( ref nodeInfo, ( m_botTexture.DefaultValue != null ) ? AssetDatabase.GetAssetPath( m_botTexture.DefaultValue ) : Constants.NoStringValue ); + + IOUtils.AddFieldValueToString( ref nodeInfo, m_propertyInspectorName ); + + //IOUtils.AddFieldValueToString( ref nodeInfo, m_arraySupport ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_normalSpace ); + } + public override void RefreshOnUndo() + { + base.RefreshOnUndo(); + if( m_topTexture != null ) + { + m_topTexture.BeginPropertyFromInspectorCheck(); + } + + if( m_midTexture != null ) + { + m_midTexture.BeginPropertyFromInspectorCheck(); + } + + if( m_botTexture != null ) + { + m_botTexture.BeginPropertyFromInspectorCheck(); + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/TriplanarNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/TriplanarNode.cs.meta new file mode 100644 index 0000000..39ce8da --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/TriplanarNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 396e5bf33f08d3a42a19d7b161f573f2 +timeCreated: 1490358806 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/UnityObjToClipPosHlpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/UnityObjToClipPosHlpNode.cs new file mode 100644 index 0000000..277effc --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/UnityObjToClipPosHlpNode.cs @@ -0,0 +1,34 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Object To Clip Pos", "Object Transform", "Transforms a point from object space to the camera’s clip space in homogeneous coordinates" )] + public sealed class UnityObjToClipPosHlpNode : HelperParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_funcType = "UnityObjectToClipPos"; + //TODO: revisit this later + m_funcLWFormatOverride = "TransformWorldToHClip(TransformObjectToWorld({0}))"; + m_funcHDFormatOverride = "TransformWorldToHClip(TransformObjectToWorld({0}))"; + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT3, false ); + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT4, false ); + m_outputPorts[ 0 ].Name = "XYZW"; + AddOutputPort( WirePortDataType.FLOAT, "X" ); + AddOutputPort( WirePortDataType.FLOAT, "Y" ); + AddOutputPort( WirePortDataType.FLOAT, "Z" ); + AddOutputPort( WirePortDataType.FLOAT, "W" ); + m_previewShaderGUID = "14ec765a147a53340877b489e73f1c9f"; + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + m_localVarName = "unityObjectToClipPos" + OutputId; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/UnityObjToClipPosHlpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/UnityObjToClipPosHlpNode.cs.meta new file mode 100644 index 0000000..0f62b63 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/UnityObjToClipPosHlpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c01e190d996825f42bdc81e1fab5e897 +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/UnityObjToViewPosHlpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/UnityObjToViewPosHlpNode.cs new file mode 100644 index 0000000..89258e8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/UnityObjToViewPosHlpNode.cs @@ -0,0 +1,33 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Object To View Pos", "Object Transform", "Transforms a point from object space to view space" )] + public sealed class UnityObjToViewPosHlpNode : HelperParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_funcType = "UnityObjectToViewPos"; + //TODO: revisit this later + m_funcLWFormatOverride = "TransformWorldToView( TransformObjectToWorld( {0}) )"; + m_funcHDFormatOverride = "TransformWorldToView( TransformObjectToWorld( {0}) )"; + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT3, false ); + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT3, false ); + m_outputPorts[ 0 ].Name = "XYZ"; + AddOutputPort( WirePortDataType.FLOAT, "X" ); + AddOutputPort( WirePortDataType.FLOAT, "Y" ); + AddOutputPort( WirePortDataType.FLOAT, "Z" ); + m_previewShaderGUID = "b790bc1d468a51840a9facef372b4729"; + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + m_localVarName = "unityObjectToViewPos" + OutputId; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/UnityObjToViewPosHlpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/UnityObjToViewPosHlpNode.cs.meta new file mode 100644 index 0000000..c0ea4e5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/UnityObjToViewPosHlpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5f35cf284cf7d2b47be5a32426fc7a77 +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/WorldSpaceLightDirHlpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/WorldSpaceLightDirHlpNode.cs new file mode 100644 index 0000000..2848003 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/WorldSpaceLightDirHlpNode.cs @@ -0,0 +1,78 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "World Space Light Dir", "Light", "Computes normalized world space light direction" )] + public sealed class WorldSpaceLightDirHlpNode : HelperParentNode + { + private const string NormalizeOptionStr = "Safe Normalize"; + + [SerializeField] + private bool m_safeNormalize = false; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_funcType = "UnityWorldSpaceLightDir"; + m_inputPorts[ 0 ].Visible = false; + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT3, false ); + m_outputPorts[ 0 ].Name = "XYZ"; + + AddOutputPort( WirePortDataType.FLOAT, "X" ); + AddOutputPort( WirePortDataType.FLOAT, "Y" ); + AddOutputPort( WirePortDataType.FLOAT, "Z" ); + + m_useInternalPortData = false; + m_drawPreviewAsSphere = true; + m_autoWrapProperties = true; + m_textLabelWidth = 120; + m_previewShaderGUID = "2e8dc46eb6fb2124d9f0007caf9567e3"; + } + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + base.PropagateNodeData( nodeData, ref dataCollector ); + if( m_safeNormalize ) + dataCollector.SafeNormalizeLightDir = true; + } + + public override void DrawProperties() + { + base.DrawProperties(); + m_safeNormalize = EditorGUILayoutToggle( NormalizeOptionStr, m_safeNormalize ); + EditorGUILayout.HelpBox( "Having safe normalize ON makes sure your light vector is not zero even if there's no lights in your scene.", MessageType.None ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.IsTemplate ) + return GetOutputVectorItem( 0, outputId, dataCollector.TemplateDataCollectorInstance.GetWorldSpaceLightDir( CurrentPrecisionType ) ); ; + + dataCollector.AddToIncludes( UniqueId, Constants.UnityCgLibFuncs ); + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_POS ); + + return GetOutputVectorItem( 0, outputId, GeneratorUtils.GenerateWorldLightDirection( ref dataCollector, UniqueId, CurrentPrecisionType ) ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > 15201 ) + { + m_safeNormalize = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_safeNormalize ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/WorldSpaceLightDirHlpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/WorldSpaceLightDirHlpNode.cs.meta new file mode 100644 index 0000000..87a3bc3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/WorldSpaceLightDirHlpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2134a58fb8235524d84046a051bce6b5 +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/WorldSpaceViewDirHlpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/WorldSpaceViewDirHlpNode.cs new file mode 100644 index 0000000..27b3dcb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/WorldSpaceViewDirHlpNode.cs @@ -0,0 +1,34 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "World Space View Dir", "Object Transform", "World space direction (not normalized) from given object space vertex position towards the camera" )] + public sealed class WorldSpaceViewDirHlpNode : HelperParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_funcType = "WorldSpaceViewDir"; + //TODO: revisit this later + m_funcLWFormatOverride = "( _WorldSpaceCameraPos.xyz - mul(GetObjectToWorldMatrix(), {0} ).xyz )"; + m_funcHDFormatOverride = "( _WorldSpaceCameraPos.xyz - mul(GetObjectToWorldMatrix(), {0} ).xyz )"; + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT4, false ); + m_inputPorts[ 0 ].Vector4InternalData = new UnityEngine.Vector4( 0, 0, 0, 1 ); + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT3, false ); + m_outputPorts[ 0 ].Name = "XYZ"; + AddOutputPort( WirePortDataType.FLOAT, "X" ); + AddOutputPort( WirePortDataType.FLOAT, "Y" ); + AddOutputPort( WirePortDataType.FLOAT, "Z" ); + m_previewShaderGUID = "fe0e09756a8a0ba408015b43e66cb8a6"; + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + m_localVarName = "worldSpaceViewDir" + OutputId; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/WorldSpaceViewDirHlpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/WorldSpaceViewDirHlpNode.cs.meta new file mode 100644 index 0000000..4097cec --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/HelperFuncs/WorldSpaceViewDirHlpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 61d7064bd5523634496fa412627603d7 +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ISignalGenerator.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ISignalGenerator.cs new file mode 100644 index 0000000..aa64904 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ISignalGenerator.cs @@ -0,0 +1,11 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + interface ISignalGenerator + { + void GenerateSignalPropagation(); + void GenerateSignalInibitor(); + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ISignalGenerator.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ISignalGenerator.cs.meta new file mode 100644 index 0000000..3bfa978 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ISignalGenerator.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: cfeab503d3318794ea1af322505320ef +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects.meta new file mode 100644 index 0000000..ba29e65 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2a5d24ae30c4ee74f81a2fa0615e2e95 +folderAsset: yes +timeCreated: 1481126945 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/BlendOpsNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/BlendOpsNode.cs new file mode 100644 index 0000000..20ff09a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/BlendOpsNode.cs @@ -0,0 +1,445 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +//https://www.shadertoy.com/view/XdS3RW +//http://www.deepskycolors.com/archivo/2010/04/21/formulas-for-Photoshop-blending-modes.html +//http://www.pegtop.net/delphi/articles/blendmodes/softlight.htm + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + public enum BlendOps + { + ColorBurn, + ColorDodge, + Darken, + Divide, + Difference, + Exclusion, + SoftLight, + HardLight, + HardMix, + Lighten, + LinearBurn, + LinearDodge, + LinearLight, + Multiply, + Overlay, + PinLight, + Subtract, + Screen, + VividLight + } + [Serializable] + [NodeAttributes( "Blend Operations", "Image Effects", "Common layer blending modes" )] + public class BlendOpsNode : ParentNode + { + //private const string ASEHardLightCall = "ASEHardLight({0},{1})"; + //private const string ASEHardLightFunc = + //"inline float ASEHardLight( float srcLocalVar, float dstLocalVar ){" + + //" return ( ( srcLocalVar > 0.5 ) ? ( 1.0 - ( 1.0 - 2.0 * ( srcLocalVar - 0.5 ) ) * ( 1.0 - dstLocalVar ) ) : ( 2.0 * srcLocalVar * dstLocalVar ) ); }"; + + //private const string ASELinearLightCall = "ASELinearLight({0},{1})"; + //private const string ASELinearLightFunc = + //"inline float ASELinearLight( float srcLocalVar, float dstLocalVar ){" + + //" return ( ( srcLocalVar > 0.5 ) ? ( dstLocalVar + 2.0 * srcLocalVar - 1.0 ) : ( dstLocalVar + 2.0 * ( srcLocalVar - 0.5 ) ) ); }"; + + //private const string ASEOverlayCall = "ASEOverlay({0},{1})"; + //private const string ASEOverlayFunc = + //"inline float ASEOverlay( float srcLocalVar, float dstLocalVar ){" + + //" return ( ( dstLocalVar > 0.5 ) ? ( 1.0 - ( 1.0 - 2.0 * ( dstLocalVar - 0.5 ) ) * ( 1.0 - srcLocalVar ) ) : ( 2.0 * dstLocalVar * srcLocalVar ) ); }"; + ////" return (dstLocalVar < 0.5) ? 2.0 * srcLocalVar * dstLocalVar : 1.0 - 2.0 * (1.0 - srcLocalVar) * (1.0 - dstLocalVar); }"; + + //private const string ASEPinLightCall = "ASEPinLight({0},{1})"; + //private const string ASEPinLightFunc = + //"inline float ASEPinLight( float srcLocalVar, float dstLocalVar ){" + + //" return ( ( srcLocalVar > 0.5 ) ? max( dstLocalVar , 2.0 * ( srcLocalVar - 0.5 ) ) : min( dstLocalVar , 2.0 * srcLocalVar ) ); }"; + + //private const string ASEVividLightCall = "ASEVividLight({0},{1})"; + //private const string ASEVividLightFunc = "inline float ASEVividLight( float srcLocalVar, float dstLocalVar ){" + + //" return ( ( srcLocalVar > 0.5 ) ? ( dstLocalVar / ( ( 1.0 - srcLocalVar ) * 2.0 ) ) : ( 1.0 - ( ( ( 1.0 - dstLocalVar ) * 0.5 ) / srcLocalVar ) ) ); }"; + + private const string ASEDarkerColorCall = "ASEDarkerColor{}({0},{1})"; + private const string ASEDarkerColorFunc = "inline float ASEDarkerColor{0}( float srcLocalVar, float dstLocalVar ){" + + " return ({1} < {2}) ? s : d; }"; + + private const string ASELighterColorCall = "ASELighterColor{}({0},{1})"; + private const string ASELighterColorFunc = "inline float ASELighterColor{0}( float srcLocalVar, float dstLocalVar ){" + + " return ({1} > {2}) ? s : d; }"; + + private const string BlendOpsModeStr = "Blend Op"; + private const string SaturateResultStr = "Saturate"; + + [SerializeField] + private BlendOps m_currentBlendOp = BlendOps.ColorBurn; + + [SerializeField] + private WirePortDataType m_mainDataType = WirePortDataType.COLOR; + + [SerializeField] + private bool m_saturate = true; + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.COLOR, false, "Source" ); + AddInputPort( WirePortDataType.COLOR, false, "Destiny" ); + AddInputPort( WirePortDataType.FLOAT, false,"Alpha" ); + m_inputPorts[ 2 ].FloatInternalData = 1; + AddOutputPort( WirePortDataType.COLOR, Constants.EmptyPortValue ); + m_inputPorts[ 0 ].AddPortForbiddenTypes( WirePortDataType.FLOAT3x3, + WirePortDataType.FLOAT4x4, + WirePortDataType.SAMPLER1D, + WirePortDataType.SAMPLER2D, + WirePortDataType.SAMPLER3D, + WirePortDataType.SAMPLERCUBE, + WirePortDataType.SAMPLER2DARRAY ); + m_inputPorts[ 1 ].AddPortForbiddenTypes( WirePortDataType.FLOAT3x3, + WirePortDataType.FLOAT4x4, + WirePortDataType.SAMPLER1D, + WirePortDataType.SAMPLER2D, + WirePortDataType.SAMPLER3D, + WirePortDataType.SAMPLERCUBE, + WirePortDataType.SAMPLER2DARRAY ); + m_textLabelWidth = 75; + m_autoWrapProperties = true; + m_hasLeftDropdown = true; + SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, m_currentBlendOp ) ); + m_useInternalPortData = true; + m_previewShaderGUID = "6d6b3518705b3ba49acdc6e18e480257"; + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + m_previewMaterialPassId = (int)m_currentBlendOp; + PreviewMaterial.SetInt( "_Sat", m_saturate ? 1 : 0 ); + int lerpMode = ( m_inputPorts[ 2 ].IsConnected || m_inputPorts[ 2 ].FloatInternalData < 1 ) ? 1 : 0; + PreviewMaterial.SetInt( "_Lerp", lerpMode ); + } + + public override void AfterCommonInit() + { + base.AfterCommonInit(); + + if( PaddingTitleLeft == 0 ) + { + PaddingTitleLeft = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + if( PaddingTitleRight == 0 ) + PaddingTitleRight = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + } + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + UpdateConnection( portId ); + } + + public override void OnConnectedOutputNodeChanges( int inputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( inputPortId, otherNodeId, otherPortId, name, type ); + UpdateConnection( inputPortId ); + } + + public override void OnInputPortDisconnected( int portId ) + { + base.OnInputPortDisconnected( portId ); + UpdateDisconnection( portId ); + } + + void UpdateConnection( int portId ) + { + if( portId == 2 ) + return; + + m_inputPorts[ portId ].MatchPortToConnection(); + int otherPortId = ( portId + 1 ) % 2; + if( m_inputPorts[ otherPortId ].IsConnected ) + { + m_mainDataType = UIUtils.GetPriority( m_inputPorts[ 0 ].DataType ) > UIUtils.GetPriority( m_inputPorts[ 1 ].DataType ) ? m_inputPorts[ 0 ].DataType : m_inputPorts[ 1 ].DataType; + } + else + { + m_mainDataType = m_inputPorts[ portId ].DataType; + m_inputPorts[ otherPortId ].ChangeType( m_mainDataType, false ); + } + m_outputPorts[ 0 ].ChangeType( m_mainDataType, false ); + } + + void UpdateDisconnection( int portId ) + { + if( portId == 2 ) + return; + + int otherPortId = ( portId + 1 ) % 2; + if( m_inputPorts[ otherPortId ].IsConnected ) + { + m_mainDataType = m_inputPorts[ otherPortId ].DataType; + m_inputPorts[ portId ].ChangeType( m_mainDataType, false ); + m_outputPorts[ 0 ].ChangeType( m_mainDataType, false ); + } + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUI.BeginChangeCheck(); + m_currentBlendOp = (BlendOps)EditorGUILayoutEnumPopup( BlendOpsModeStr, m_currentBlendOp ); + if( EditorGUI.EndChangeCheck() ) + { + SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, m_currentBlendOp ) ); + } + m_saturate = EditorGUILayoutToggle( SaturateResultStr, m_saturate ); + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + m_upperLeftWidget.DrawWidget( ref m_currentBlendOp, this, OnWidgetUpdate ); + } + + private readonly Action OnWidgetUpdate = ( x ) => + { + x.SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, ( x as BlendOpsNode ).m_currentBlendOp ) ); + }; + + private string CreateMultiChannel( ref MasterNodeDataCollector dataCollector, string function, string srcLocalVar, string dstLocalVar, string varName ) + { + switch( m_outputPorts[ 0 ].DataType ) + { + default: + { + return string.Format( function, srcLocalVar, dstLocalVar ); + } + case WirePortDataType.FLOAT2: + { + string xChannelName = varName + OutputId + "X"; + string xChannelValue = string.Format( function, srcLocalVar + ".x", dstLocalVar + ".x" ); + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT, xChannelName, xChannelValue ); + + string yChannelName = varName + OutputId + "Y"; + string yChannelValue = string.Format( function, srcLocalVar + ".y", dstLocalVar + ".y" ); + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT, yChannelName, yChannelValue ); + + return string.Format( "float2({0},{1})", xChannelName, yChannelName ); + } + case WirePortDataType.FLOAT3: + { + string xChannelName = varName + OutputId + "X"; + string xChannelValue = string.Format( function, srcLocalVar + ".x", dstLocalVar + ".x" ); + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT, xChannelName, xChannelValue ); + + string yChannelName = varName + OutputId + "Y"; + string yChannelValue = string.Format( function, srcLocalVar + ".y", dstLocalVar + ".y" ); + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT, yChannelName, yChannelValue ); + + string zChannelName = varName + OutputId + "Z"; + string zChannelValue = string.Format( function, srcLocalVar + ".z", dstLocalVar + ".z" ); + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT, zChannelName, zChannelValue ); + + return string.Format( "float3({0},{1},{2})", xChannelName, yChannelName, zChannelName ); + } + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: + { + string xChannelName = varName + OutputId + "X"; + string xChannelValue = string.Format( function, srcLocalVar + ".x", dstLocalVar + ".x" ); + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT, xChannelName, xChannelValue ); + + string yChannelName = varName + OutputId + "Y"; + string yChannelValue = string.Format( function, srcLocalVar + ".y", dstLocalVar + ".y" ); + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT, yChannelName, yChannelValue ); + + string zChannelName = varName + OutputId + "Z"; + string zChannelValue = string.Format( function, srcLocalVar + ".z", dstLocalVar + ".z" ); + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT, zChannelName, zChannelValue ); + + string wChannelName = varName + OutputId + "W"; + string wChannelValue = string.Format( function, srcLocalVar + ".w", dstLocalVar + ".w" ); + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT, wChannelName, wChannelValue ); + + return string.Format( "float4({0},{1},{2},{3})", xChannelName, yChannelName, zChannelName, wChannelName ); + } + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string src = m_inputPorts[ 0 ].GenerateShaderForOutput( ref dataCollector, m_mainDataType, false, true ); + string dst = m_inputPorts[ 1 ].GenerateShaderForOutput( ref dataCollector, m_mainDataType, false, true ); + + string srcLocalVar = "blendOpSrc" + OutputId; + string dstLocalVar = "blendOpDest" + OutputId; + dataCollector.AddLocalVariable( UniqueId, UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, m_mainDataType ) + " " + srcLocalVar, src + ";" ); + dataCollector.AddLocalVariable( UniqueId, UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, m_mainDataType ) + " " + dstLocalVar, dst + ";" ); + + int currIndent = UIUtils.ShaderIndentLevel; + if( dataCollector.MasterNodeCategory == AvailableShaderTypes.Template ) + { + UIUtils.ShaderIndentLevel = 0; + } + else + { + UIUtils.ShaderIndentLevel = 1; + UIUtils.ShaderIndentLevel++; + } + + string result = string.Empty; + switch( m_currentBlendOp ) + { + case BlendOps.ColorBurn: + { + result = string.Format( "( 1.0 - ( ( 1.0 - {0}) / max( {1}, 0.00001) ) )", dstLocalVar, srcLocalVar); + } + break; + case BlendOps.ColorDodge: + { + result = string.Format( "( {0}/ max( 1.0 - {1}, 0.00001 ) )", dstLocalVar, srcLocalVar ); + } + break; + case BlendOps.Darken: + { + result = "min( " + srcLocalVar + " , " + dstLocalVar + " )"; + } + break; + case BlendOps.Divide: + { + result = string.Format( "( {0} / max({1},0.00001) )", dstLocalVar, srcLocalVar ); + } + break; + case BlendOps.Difference: + { + result = "abs( " + srcLocalVar + " - " + dstLocalVar + " )"; + } + break; + case BlendOps.Exclusion: + { + result = "( 0.5 - 2.0 * ( " + srcLocalVar + " - 0.5 ) * ( " + dstLocalVar + " - 0.5 ) )"; + } + break; + case BlendOps.SoftLight: + { + result = string.Format( "2.0f*{0}*{1} + {0}*{0}*(1.0f - 2.0f*{1})", dstLocalVar, srcLocalVar ); + } + break; + case BlendOps.HardLight: + { + result = " (( " + srcLocalVar + " > 0.5 ) ? ( 1.0 - ( 1.0 - 2.0 * ( " + srcLocalVar + " - 0.5 ) ) * ( 1.0 - " + dstLocalVar + " ) ) : ( 2.0 * " + srcLocalVar + " * " + dstLocalVar + " ) )"; + //dataCollector.AddFunction( ASEHardLightCall, UIUtils.ShaderIndentTabs + ASEHardLightFunc ); + //result = CreateMultiChannel( ref dataCollector, ASEHardLightCall, srcLocalVar, dstLocalVar, "hardLightBlend" ); + } + break; + case BlendOps.HardMix: + { + result = " round( 0.5 * ( " + srcLocalVar + " + " + dstLocalVar + " ) )"; + } + break; + case BlendOps.Lighten: + { + result = " max( " + srcLocalVar + ", " + dstLocalVar + " )"; + } + break; + case BlendOps.LinearBurn: + { + result = "( " + srcLocalVar + " + " + dstLocalVar + " - 1.0 )"; + } + break; + case BlendOps.LinearDodge: + { + result = "( " + srcLocalVar + " + " + dstLocalVar + " )"; + } + break; + case BlendOps.LinearLight: + { + result = "(( " + srcLocalVar + " > 0.5 )? ( " + dstLocalVar + " + 2.0 * " + srcLocalVar + " - 1.0 ) : ( " + dstLocalVar + " + 2.0 * ( " + srcLocalVar + " - 0.5 ) ) )"; + //dataCollector.AddFunction( ASELinearLightCall, UIUtils.ShaderIndentTabs + ASELinearLightFunc ); + //result = CreateMultiChannel( ref dataCollector, ASELinearLightCall, srcLocalVar, dstLocalVar, "linearLightBlend" ); + } + break; + case BlendOps.Multiply: + { + result = "( " + srcLocalVar + " * " + dstLocalVar + " )"; + } + break; + case BlendOps.Overlay: + { + //result = "(( " + dstLocalVar + " > 0.5 ) ? ( 1.0 - ( 1.0 - 2.0 * ( " + dstLocalVar + " - 0.5 ) ) * ( 1.0 - " + srcLocalVar + " ) ) : ( 2.0 * " + dstLocalVar + " * " + srcLocalVar + " ) )"; + result = "(( " + dstLocalVar + " > 0.5 ) ? ( 1.0 - 2.0 * ( 1.0 - " + dstLocalVar + " ) * ( 1.0 - " + srcLocalVar + " ) ) : ( 2.0 * " + dstLocalVar + " * " + srcLocalVar + " ) )"; + //dataCollector.AddFunction( ASEOverlayCall, UIUtils.ShaderIndentTabs + ASEOverlayFunc ); + //result = CreateMultiChannel( ref dataCollector, ASEOverlayCall, srcLocalVar, dstLocalVar, "overlayBlend" ); + } + break; + case BlendOps.PinLight: + { + result = "(( " + srcLocalVar + " > 0.5 ) ? max( " + dstLocalVar + ", 2.0 * ( " + srcLocalVar + " - 0.5 ) ) : min( " + dstLocalVar + ", 2.0 * " + srcLocalVar + " ) )"; + //dataCollector.AddFunction( ASEPinLightCall, UIUtils.ShaderIndentTabs + ASEPinLightFunc ); + //result = CreateMultiChannel( ref dataCollector, ASEPinLightCall, srcLocalVar, dstLocalVar, "pinLightBlend" ); + } + break; + case BlendOps.Subtract: + { + result = "( " + dstLocalVar + " - " + srcLocalVar + " )"; + } + break; + case BlendOps.Screen: + { + result = "( 1.0 - ( 1.0 - " + srcLocalVar + " ) * ( 1.0 - " + dstLocalVar + " ) )"; + } + break; + case BlendOps.VividLight: + { + result = string.Format( "(( {0} > 0.5 ) ? ( {1} / max( ( 1.0 - {0} ) * 2.0 ,0.00001) ) : ( 1.0 - ( ( ( 1.0 - {1} ) * 0.5 ) / max( {0},0.00001) ) ) )", srcLocalVar, dstLocalVar); + //dataCollector.AddFunction( ASEVividLightCall, UIUtils.ShaderIndentTabs + ASEVividLightFunc ); + //result = CreateMultiChannel( ref dataCollector, ASEVividLightCall, srcLocalVar, dstLocalVar, "vividLightBlend" ); + } + break; + } + + UIUtils.ShaderIndentLevel = currIndent; + if( m_inputPorts[ 2 ].IsConnected || m_inputPorts[ 2 ].FloatInternalData < 1.0 ) + { + string opacity = m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector ); + string lerpVar = "lerpBlendMode" + OutputId; + string lerpResult = string.Format( "lerp({0},{1},{2})", dstLocalVar, result, opacity ); + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, m_outputPorts[ 0 ].DataType, lerpVar, lerpResult ); + result = lerpVar; + } + + if( m_saturate ) + result = "( saturate( " + result + " ))"; + + return CreateOutputLocalVariable( 0, result, ref dataCollector ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_currentBlendOp ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_saturate ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_currentBlendOp = (BlendOps)Enum.Parse( typeof( BlendOps ), GetCurrentParam( ref nodeParams ) ); + m_saturate = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, m_currentBlendOp ) ); + } + + public override void Destroy() + { + base.Destroy(); + m_upperLeftWidget = null; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/BlendOpsNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/BlendOpsNode.cs.meta new file mode 100644 index 0000000..3a53cbc --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/BlendOpsNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 09fb0867c2a616c488bad8929f4f7ad7 +timeCreated: 1481126953 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/DesaturateOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/DesaturateOpNode.cs new file mode 100644 index 0000000..507c678 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/DesaturateOpNode.cs @@ -0,0 +1,57 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +// http://stackoverflow.com/questions/9320953/what-algorithm-does-photoshop-use-to-desaturate-an-image +// https://www.shadertoy.com/view/lsdXDH + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Desaturate", "Image Effects", "Generic desaturation operation" )] + public sealed class DesaturateOpNode : ParentNode + { + private const string GenericDesaturateOp0 = "dot( {0}, float3( 0.299, 0.587, 0.114 ))"; + private const string GenericDesaturateOp1 = "lerp( {0}, {1}.xxx, {2} )"; + //private const string GenericDesaturateOp = "lerp( {0},dot({0},float3(0.299,0.587,0.114)).xxx,{1})"; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT3, false, "RGB" ); + AddInputPort( WirePortDataType.FLOAT, false, "Fraction" ); + AddOutputPort( WirePortDataType.FLOAT3, Constants.EmptyPortValue ); + m_useInternalPortData = true; + m_previewShaderGUID = "faabe9efdf44b9648a523f1742abdfd3"; + } + + void UpdatePorts( int portId ) + { + if ( portId == 0 ) + { + m_inputPorts[ 0 ].MatchPortToConnection(); + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + + if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string initalColorValue = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string fraction = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + + string initialColorVarName = "desaturateInitialColor" + OutputId; + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT3, initialColorVarName, initalColorValue ); + + string dotVarName = "desaturateDot" + OutputId; + string dotVarValue = string.Format( GenericDesaturateOp0, initialColorVarName ); + + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT, dotVarName, dotVarValue ); + RegisterLocalVariable( 0, string.Format( GenericDesaturateOp1, initialColorVarName, dotVarName,fraction ), ref dataCollector, "desaturateVar" + OutputId ); + + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/DesaturateOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/DesaturateOpNode.cs.meta new file mode 100644 index 0000000..c931cbd --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/DesaturateOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: eddae0a124877fc47b28ae8853286174 +timeCreated: 1489414268 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/HSVToRGBNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/HSVToRGBNode.cs new file mode 100644 index 0000000..a30c69a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/HSVToRGBNode.cs @@ -0,0 +1,87 @@ +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "HSV to RGB", "Image Effects", "Converts from HSV to RGB color space" )] + public sealed class HSVToRGBNode : ParentNode + { + public static readonly string HSVToRGBHeader = "HSVToRGB( {0}3({1},{2},{3}) )"; + public static readonly string[] HSVToRGBFunction = { "{0}3 HSVToRGB( {0}3 c )\n", + "{\n", + "\t{0}4 K = {0}4( 1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0 );\n", + "\t{0}3 p = abs( frac( c.xxx + K.xyz ) * 6.0 - K.www );\n", + "\treturn c.z * lerp( K.xxx, saturate( p - K.xxx ), c.y );\n", + "}\n"}; + public static readonly bool[] HSVToRGBFlags = { true, + false, + true, + true, + false, + false}; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, "Hue" ); + AddInputPort( WirePortDataType.FLOAT, false, "Saturation" ); + AddInputPort( WirePortDataType.FLOAT, false, "Value" ); + AddOutputColorPorts( "RGB", false ); + m_previewShaderGUID = "fab445eb945d63047822a7a6b81b959d"; + m_useInternalPortData = true; + m_autoWrapProperties = true; + m_customPrecision = true; + } + + public override void DrawProperties() + { + base.DrawProperties(); + DrawPrecisionProperty(); + } + + public static void AddHSVToRGBFunction( ref MasterNodeDataCollector dataCollector , string precisionString ) + { + if( !dataCollector.HasFunction( HSVToRGBHeader ) ) + { + //Hack to be used util indent is properly used + int currIndent = UIUtils.ShaderIndentLevel; + if( dataCollector.MasterNodeCategory == AvailableShaderTypes.Template ) + { + UIUtils.ShaderIndentLevel = 0; + } + else + { + UIUtils.ShaderIndentLevel = 1; + UIUtils.ShaderIndentLevel++; + } + + string finalFunction = string.Empty; + for( int i = 0; i < HSVToRGBFunction.Length; i++ ) + { + finalFunction += UIUtils.ShaderIndentTabs + ( HSVToRGBFlags[ i ] ? string.Format( HSVToRGBFunction[ i ], precisionString ) : HSVToRGBFunction[ i ] ); + } + + UIUtils.ShaderIndentLevel = currIndent; + + dataCollector.AddFunction( HSVToRGBHeader, finalFunction ); + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + + string precisionString = UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, WirePortDataType.FLOAT ); + + AddHSVToRGBFunction( ref dataCollector , precisionString ); + + string hue = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string saturation = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + string value = m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector ); + + RegisterLocalVariable( 0, string.Format( HSVToRGBHeader, precisionString, hue, saturation, value ), ref dataCollector, "hsvTorgb" + OutputId ); + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/HSVToRGBNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/HSVToRGBNode.cs.meta new file mode 100644 index 0000000..5d33d3a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/HSVToRGBNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3d992a68cff329a4a9bd1deb999fe691 +timeCreated: 1494857111 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/LuminanceNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/LuminanceNode.cs new file mode 100644 index 0000000..2582a59 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/LuminanceNode.cs @@ -0,0 +1,32 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Luminance", "Image Effects", "Calculates Luminance value from input")] + public sealed class LuminanceNode : ParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT3, false, "RGB" ); + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + m_previewShaderGUID = "81e1d8ffeec8a4b4cabb1094bc981048"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string value = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string grayscale = "Luminance(" + value + ")"; + + RegisterLocalVariable( 0, grayscale, ref dataCollector, "luminance" + OutputId ); + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/LuminanceNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/LuminanceNode.cs.meta new file mode 100644 index 0000000..20c21f3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/LuminanceNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c5f40d01acf184946b8660599f33109f +timeCreated: 1574935849 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/NoiseGeneratorNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/NoiseGeneratorNode.cs new file mode 100644 index 0000000..c6805a4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/NoiseGeneratorNode.cs @@ -0,0 +1,466 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +// Based on the work by https://github.com/keijiro/NoiseShader + +using System; +using UnityEditor; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + public enum NoiseGeneratorType + { + Simplex2D, + Simplex3D, + Gradient, + Simple + }; + + [Serializable] + [NodeAttributes( "Noise Generator", "Miscellaneous", "Collection of procedural noise generators", tags: "simplex gradient" )] + public sealed class NoiseGeneratorNode : ParentNode + { + private const string TypeLabelStr = "Type"; + private const string SetTo01RangeOpStr = "{0} = {0}*0.5 + 0.5;"; + private const string SetToMinus1To1RangeOpStr = "{0} = {0}*2 - 1;"; + private const string SetTo01RangeLabel = "0-1 Range"; + private const string SetTo01RangePreviewId = "_To01Range"; + private const string UseUnityVersionLabel = "Use Unity Version"; + + // Simple + private const string SimpleNoiseRandomValueFunc = "inline float noise_randomValue (float2 uv) { return frac(sin(dot(uv, float2(12.9898, 78.233)))*43758.5453); }"; + private const string SimpleNoiseInterpolateFunc = "inline float noise_interpolate (float a, float b, float t) { return (1.0-t)*a + (t*b); }"; + private const string SimpleValueNoiseHeader = "inline float valueNoise (float2 uv)"; + private readonly string[] SimpleValueNoiseBody = { "inline float valueNoise (float2 uv)\n", + "{\n", + "\tfloat2 i = floor(uv);\n", + "\tfloat2 f = frac( uv );\n", + "\tf = f* f * (3.0 - 2.0 * f);\n", + "\tuv = abs( frac(uv) - 0.5);\n", + "\tfloat2 c0 = i + float2( 0.0, 0.0 );\n", + "\tfloat2 c1 = i + float2( 1.0, 0.0 );\n", + "\tfloat2 c2 = i + float2( 0.0, 1.0 );\n", + "\tfloat2 c3 = i + float2( 1.0, 1.0 );\n", + "\tfloat r0 = noise_randomValue( c0 );\n", + "\tfloat r1 = noise_randomValue( c1 );\n", + "\tfloat r2 = noise_randomValue( c2 );\n", + "\tfloat r3 = noise_randomValue( c3 );\n", + "\tfloat bottomOfGrid = noise_interpolate( r0, r1, f.x );\n", + "\tfloat topOfGrid = noise_interpolate( r2, r3, f.x );\n", + "\tfloat t = noise_interpolate( bottomOfGrid, topOfGrid, f.y );\n", + "\treturn t;\n", + "}\n"}; + + private const string SimpleNoiseHeader = "float SimpleNoise(float2 UV, float Scale)"; + private const string SimpleNoiseFunc = "SimpleNoise( {0} )"; + private readonly string[] SimpleNoiseBody = { "float SimpleNoise(float2 UV)\n", + "{\n", + "\tfloat t = 0.0;\n", + "\tfloat freq = pow( 2.0, float( 0 ) );\n", + "\tfloat amp = pow( 0.5, float( 3 - 0 ) );\n", + "\tt += valueNoise( UV/freq )*amp;\n", + "\tfreq = pow(2.0, float(1));\n", + "\tamp = pow(0.5, float(3-1));\n", + "\tt += valueNoise( UV/freq )*amp;\n", + "\tfreq = pow(2.0, float(2));\n", + "\tamp = pow(0.5, float(3-2));\n", + "\tt += valueNoise( UV/freq )*amp;\n", + "\treturn t;\n", + "}\n"}; + + // Simplex 2D + private const string Simplex2DFloat3Mod289Func = "float3 mod2D289( float3 x ) { return x - floor( x * ( 1.0 / 289.0 ) ) * 289.0; }"; + private const string Simplex2DFloat2Mod289Func = "float2 mod2D289( float2 x ) { return x - floor( x * ( 1.0 / 289.0 ) ) * 289.0; }"; + private const string Simplex2DPermuteFunc = "float3 permute( float3 x ) { return mod2D289( ( ( x * 34.0 ) + 1.0 ) * x ); }"; + + private const string SimplexNoise2DHeader = "float snoise( float2 v )"; + private const string SimplexNoise2DFunc = "snoise( {0} )"; + private readonly string[] SimplexNoise2DBody = {"float snoise( float2 v )\n", + "{\n", + "\tconst float4 C = float4( 0.211324865405187, 0.366025403784439, -0.577350269189626, 0.024390243902439 );\n", + "\tfloat2 i = floor( v + dot( v, C.yy ) );\n", + "\tfloat2 x0 = v - i + dot( i, C.xx );\n", + "\tfloat2 i1;\n", + "\ti1 = ( x0.x > x0.y ) ? float2( 1.0, 0.0 ) : float2( 0.0, 1.0 );\n", + "\tfloat4 x12 = x0.xyxy + C.xxzz;\n", + "\tx12.xy -= i1;\n", + "\ti = mod2D289( i );\n", + "\tfloat3 p = permute( permute( i.y + float3( 0.0, i1.y, 1.0 ) ) + i.x + float3( 0.0, i1.x, 1.0 ) );\n", + "\tfloat3 m = max( 0.5 - float3( dot( x0, x0 ), dot( x12.xy, x12.xy ), dot( x12.zw, x12.zw ) ), 0.0 );\n", + "\tm = m * m;\n", + "\tm = m * m;\n", + "\tfloat3 x = 2.0 * frac( p * C.www ) - 1.0;\n", + "\tfloat3 h = abs( x ) - 0.5;\n", + "\tfloat3 ox = floor( x + 0.5 );\n", + "\tfloat3 a0 = x - ox;\n", + "\tm *= 1.79284291400159 - 0.85373472095314 * ( a0 * a0 + h * h );\n", + "\tfloat3 g;\n", + "\tg.x = a0.x * x0.x + h.x * x0.y;\n", + "\tg.yz = a0.yz * x12.xz + h.yz * x12.yw;\n", + "\treturn 130.0 * dot( m, g );\n", + "}\n"}; + // Simplex 3D + + + + private const string Simplex3DFloat3Mod289 = "float3 mod3D289( float3 x ) { return x - floor( x / 289.0 ) * 289.0; }"; + private const string Simplex3DFloat4Mod289 = "float4 mod3D289( float4 x ) { return x - floor( x / 289.0 ) * 289.0; }"; + private const string Simplex3DFloat4Permute = "float4 permute( float4 x ) { return mod3D289( ( x * 34.0 + 1.0 ) * x ); }"; + private const string TaylorInvSqrtFunc = "float4 taylorInvSqrt( float4 r ) { return 1.79284291400159 - r * 0.85373472095314; }"; + + private const string SimplexNoise3DHeader = "float snoise( float3 v )"; + private const string SimplexNoise3DFunc = "snoise( {0} )"; + private readonly string[] SimplexNoise3DBody = + { + "float snoise( float3 v )\n", + "{\n", + "\tconst float2 C = float2( 1.0 / 6.0, 1.0 / 3.0 );\n", + "\tfloat3 i = floor( v + dot( v, C.yyy ) );\n", + "\tfloat3 x0 = v - i + dot( i, C.xxx );\n", + "\tfloat3 g = step( x0.yzx, x0.xyz );\n", + "\tfloat3 l = 1.0 - g;\n", + "\tfloat3 i1 = min( g.xyz, l.zxy );\n", + "\tfloat3 i2 = max( g.xyz, l.zxy );\n", + "\tfloat3 x1 = x0 - i1 + C.xxx;\n", + "\tfloat3 x2 = x0 - i2 + C.yyy;\n", + "\tfloat3 x3 = x0 - 0.5;\n", + "\ti = mod3D289( i);\n", + "\tfloat4 p = permute( permute( permute( i.z + float4( 0.0, i1.z, i2.z, 1.0 ) ) + i.y + float4( 0.0, i1.y, i2.y, 1.0 ) ) + i.x + float4( 0.0, i1.x, i2.x, 1.0 ) );\n", + "\tfloat4 j = p - 49.0 * floor( p / 49.0 ); // mod(p,7*7)\n", + "\tfloat4 x_ = floor( j / 7.0 );\n", + "\tfloat4 y_ = floor( j - 7.0 * x_ ); // mod(j,N)\n", + "\tfloat4 x = ( x_ * 2.0 + 0.5 ) / 7.0 - 1.0;\n", + "\tfloat4 y = ( y_ * 2.0 + 0.5 ) / 7.0 - 1.0;\n", + "\tfloat4 h = 1.0 - abs( x ) - abs( y );\n", + "\tfloat4 b0 = float4( x.xy, y.xy );\n", + "\tfloat4 b1 = float4( x.zw, y.zw );\n", + "\tfloat4 s0 = floor( b0 ) * 2.0 + 1.0;\n", + "\tfloat4 s1 = floor( b1 ) * 2.0 + 1.0;\n", + "\tfloat4 sh = -step( h, 0.0 );\n", + "\tfloat4 a0 = b0.xzyw + s0.xzyw * sh.xxyy;\n", + "\tfloat4 a1 = b1.xzyw + s1.xzyw * sh.zzww;\n", + "\tfloat3 g0 = float3( a0.xy, h.x );\n", + "\tfloat3 g1 = float3( a0.zw, h.y );\n", + "\tfloat3 g2 = float3( a1.xy, h.z );\n", + "\tfloat3 g3 = float3( a1.zw, h.w );\n", + "\tfloat4 norm = taylorInvSqrt( float4( dot( g0, g0 ), dot( g1, g1 ), dot( g2, g2 ), dot( g3, g3 ) ) );\n", + "\tg0 *= norm.x;\n", + "\tg1 *= norm.y;\n", + "\tg2 *= norm.z;\n", + "\tg3 *= norm.w;\n", + "\tfloat4 m = max( 0.6 - float4( dot( x0, x0 ), dot( x1, x1 ), dot( x2, x2 ), dot( x3, x3 ) ), 0.0 );\n", + "\tm = m* m;\n", + "\tm = m* m;\n", + "\tfloat4 px = float4( dot( x0, g0 ), dot( x1, g1 ), dot( x2, g2 ), dot( x3, g3 ) );\n", + "\treturn 42.0 * dot( m, px);\n", + "}\n" + }; + + //Gradient Noise + private readonly string UnityGradientNoiseFunc = "UnityGradientNoise({0},{1})"; + private readonly string[] UnityGradientNoiseFunctionsBody = + { + "float2 UnityGradientNoiseDir( float2 p )\n", + "{\n", + "\tp = fmod(p , 289);\n", + "\tfloat x = fmod((34 * p.x + 1) * p.x , 289) + p.y;\n", + "\tx = fmod( (34 * x + 1) * x , 289);\n", + "\tx = frac( x / 41 ) * 2 - 1;\n", + "\treturn normalize( float2(x - floor(x + 0.5 ), abs( x ) - 0.5 ) );\n", + "}\n", + "\n", + "float UnityGradientNoise( float2 UV, float Scale )\n", + "{\n", + "\tfloat2 p = UV * Scale;\n", + "\tfloat2 ip = floor( p );\n", + "\tfloat2 fp = frac( p );\n", + "\tfloat d00 = dot( UnityGradientNoiseDir( ip ), fp );\n", + "\tfloat d01 = dot( UnityGradientNoiseDir( ip + float2( 0, 1 ) ), fp - float2( 0, 1 ) );\n", + "\tfloat d10 = dot( UnityGradientNoiseDir( ip + float2( 1, 0 ) ), fp - float2( 1, 0 ) );\n", + "\tfloat d11 = dot( UnityGradientNoiseDir( ip + float2( 1, 1 ) ), fp - float2( 1, 1 ) );\n", + "\tfp = fp * fp * fp * ( fp * ( fp * 6 - 15 ) + 10 );\n", + "\treturn lerp( lerp( d00, d01, fp.y ), lerp( d10, d11, fp.y ), fp.x ) + 0.5;\n", + "}\n" + }; + private readonly string GradientNoiseFunc = "GradientNoise({0},{1})"; + private readonly string[] GradientNoiseFunctionsBody = + { + "//https://www.shadertoy.com/view/XdXGW8\n", + "float2 GradientNoiseDir( float2 x )\n", + "{\n", + "\tconst float2 k = float2( 0.3183099, 0.3678794 );\n", + "\tx = x * k + k.yx;\n", + "\treturn -1.0 + 2.0 * frac( 16.0 * k * frac( x.x * x.y * ( x.x + x.y ) ) );\n", + "}\n", + "\n", + "float GradientNoise( float2 UV, float Scale )\n", + "{\n", + "\tfloat2 p = UV * Scale;\n", + "\tfloat2 i = floor( p );\n", + "\tfloat2 f = frac( p );\n", + "\tfloat2 u = f * f * ( 3.0 - 2.0 * f );\n", + "\treturn lerp( lerp( dot( GradientNoiseDir( i + float2( 0.0, 0.0 ) ), f - float2( 0.0, 0.0 ) ),\n", + "\t\t\tdot( GradientNoiseDir( i + float2( 1.0, 0.0 ) ), f - float2( 1.0, 0.0 ) ), u.x ),\n", + "\t\t\tlerp( dot( GradientNoiseDir( i + float2( 0.0, 1.0 ) ), f - float2( 0.0, 1.0 ) ),\n", + "\t\t\tdot( GradientNoiseDir( i + float2( 1.0, 1.0 ) ), f - float2( 1.0, 1.0 ) ), u.x ), u.y );\n", + "}\n" + }; + + [SerializeField] + private NoiseGeneratorType m_type = NoiseGeneratorType.Simplex2D; + + [SerializeField] + private bool m_setTo01Range = true; + + [SerializeField] + private bool m_unityVersion = false; + private int m_setTo01RangePreviewId; + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT2, false, "UV" ); + AddInputPort( WirePortDataType.FLOAT, false, "Scale" ); + m_inputPorts[ 1 ].FloatInternalData = 1; + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + m_useInternalPortData = true; + m_autoWrapProperties = true; + m_hasLeftDropdown = true; + SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, m_type ) ); + m_previewShaderGUID = "cd2d37ef5da190b42a91a5a690ba2a7d"; + ConfigurePorts(); + } + + public override void OnEnable() + { + base.OnEnable(); + m_setTo01RangePreviewId = Shader.PropertyToID( SetTo01RangePreviewId ); + } + + public override void AfterCommonInit() + { + base.AfterCommonInit(); + if( PaddingTitleLeft == 0 ) + { + PaddingTitleLeft = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + if( PaddingTitleRight == 0 ) + PaddingTitleRight = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + } + } + + public override void Destroy() + { + base.Destroy(); + m_upperLeftWidget = null; + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + float range01 = m_setTo01Range ? 1 : 0; + PreviewMaterial.SetFloat( m_setTo01RangePreviewId, range01 ); + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + m_upperLeftWidget.DrawWidget( ref m_type, this, OnWidgetUpdate ); + } + + private readonly Action OnWidgetUpdate = ( x ) => + { + ( x as NoiseGeneratorNode ).ConfigurePorts(); + }; + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUI.BeginChangeCheck(); + m_type = (NoiseGeneratorType)EditorGUILayoutEnumPopup( TypeLabelStr, m_type ); + if( EditorGUI.EndChangeCheck() ) + { + ConfigurePorts(); + } + + m_setTo01Range = EditorGUILayoutToggle( SetTo01RangeLabel, m_setTo01Range ); + + if( m_type == NoiseGeneratorType.Gradient ) + { + EditorGUI.BeginChangeCheck(); + m_unityVersion = EditorGUILayoutToggle( UseUnityVersionLabel, m_unityVersion ); + if( EditorGUI.EndChangeCheck() ) + { + ConfigurePorts(); + } + } + //EditorGUILayout.HelpBox( "Node still under construction. Use with caution", MessageType.Info ); + } + + private void ConfigurePorts() + { + SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, m_type ) ); + + switch( m_type ) + { + case NoiseGeneratorType.Simplex2D: + { + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT2, false ); + m_previewMaterialPassId = 0; + } + break; + + case NoiseGeneratorType.Simplex3D: + { + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT3, false ); + m_previewMaterialPassId = 1; + } + break; + case NoiseGeneratorType.Gradient: + { + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT2, false ); + m_previewMaterialPassId = m_unityVersion ? 3 : 2; + } + break; + case NoiseGeneratorType.Simple: + { + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT2, false ); + m_previewMaterialPassId = 4; + } + break; + } + PreviewIsDirty = true; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ outputId ].IsLocalValue( dataCollector.PortCategory ) ) + { + return m_outputPorts[ outputId ].LocalValue( dataCollector.PortCategory ); + } + + string size = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string scale = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + + switch( m_type ) + { + case NoiseGeneratorType.Simplex2D: + { + + string float3Mod289Func = ( dataCollector.IsTemplate ) ? Simplex2DFloat3Mod289Func : "\t\t" + Simplex2DFloat3Mod289Func; + dataCollector.AddFunction( Simplex2DFloat3Mod289Func, float3Mod289Func ); + + string float2Mod289Func = ( dataCollector.IsTemplate ) ? Simplex2DFloat2Mod289Func : "\t\t" + Simplex2DFloat2Mod289Func; + dataCollector.AddFunction( Simplex2DFloat2Mod289Func, float2Mod289Func ); + + string permuteFunc = ( dataCollector.IsTemplate ) ? Simplex2DPermuteFunc : "\t\t" + Simplex2DPermuteFunc; + dataCollector.AddFunction( Simplex2DPermuteFunc, permuteFunc ); + + dataCollector.AddFunction( SimplexNoise2DHeader, SimplexNoise2DBody, false ); + + + if( m_inputPorts[ 1 ].IsConnected || m_inputPorts[ 1 ].FloatInternalData != 1.0f ) + { + size = string.Format( "{0}*{1}", size, scale ); + } + + RegisterLocalVariable( 0, string.Format( SimplexNoise2DFunc, size ), ref dataCollector, ( "simplePerlin2D" + OutputId ) ); + } + break; + case NoiseGeneratorType.Simplex3D: + { + + string float3Mod289Func = ( dataCollector.IsTemplate ) ? Simplex3DFloat3Mod289 : "\t\t" + Simplex3DFloat3Mod289; + dataCollector.AddFunction( Simplex3DFloat3Mod289, float3Mod289Func ); + + string float4Mod289Func = ( dataCollector.IsTemplate ) ? Simplex3DFloat4Mod289 : "\t\t" + Simplex3DFloat4Mod289; + dataCollector.AddFunction( Simplex3DFloat4Mod289, float4Mod289Func ); + + string permuteFunc = ( dataCollector.IsTemplate ) ? Simplex3DFloat4Permute : "\t\t" + Simplex3DFloat4Permute; + dataCollector.AddFunction( Simplex3DFloat4Permute, permuteFunc ); + + string taylorInvSqrtFunc = ( dataCollector.IsTemplate ) ? TaylorInvSqrtFunc : "\t\t" + TaylorInvSqrtFunc; + dataCollector.AddFunction( TaylorInvSqrtFunc, taylorInvSqrtFunc ); + + dataCollector.AddFunction( SimplexNoise3DHeader, SimplexNoise3DBody, false ); + + if( m_inputPorts[ 1 ].IsConnected || m_inputPorts[ 1 ].FloatInternalData != 1.0f ) + { + size = string.Format( "{0}*{1}", size, scale ); + } + + RegisterLocalVariable( 0, string.Format( SimplexNoise3DFunc, size ), ref dataCollector, ( "simplePerlin3D" + OutputId ) ); + } + break; + + case NoiseGeneratorType.Gradient: + { + string[] body = m_unityVersion ? UnityGradientNoiseFunctionsBody : GradientNoiseFunctionsBody; + string func = m_unityVersion ? UnityGradientNoiseFunc : GradientNoiseFunc; + + dataCollector.AddFunction( body[ 0 ], body, false); + RegisterLocalVariable( 0, string.Format( func, size, scale ), ref dataCollector, ( "gradientNoise" + OutputId ) ); + } + break; + + case NoiseGeneratorType.Simple: + { + string randomValue = ( dataCollector.IsTemplate ) ? SimpleNoiseRandomValueFunc : "\t\t" + SimpleNoiseRandomValueFunc; + dataCollector.AddFunction( SimpleNoiseRandomValueFunc, randomValue ); + + string interpolate = ( dataCollector.IsTemplate ) ? SimpleNoiseInterpolateFunc : "\t\t" + SimpleNoiseInterpolateFunc; + dataCollector.AddFunction( SimpleNoiseInterpolateFunc, interpolate ); + + dataCollector.AddFunction( SimpleValueNoiseHeader, SimpleValueNoiseBody, false ); + + dataCollector.AddFunction( SimpleNoiseHeader, SimpleNoiseBody, false ); + + if( m_inputPorts[ 1 ].IsConnected || m_inputPorts[ 1 ].FloatInternalData != 1.0f ) + { + size = string.Format( "{0}*{1}", size, scale ); + } + RegisterLocalVariable( 0, string.Format( SimpleNoiseFunc, size ), ref dataCollector, ( "simpleNoise" + OutputId ) ); + } + break; + } + + if( m_type == NoiseGeneratorType.Simple && !m_setTo01Range ) + { + dataCollector.AddLocalVariable( outputId, string.Format( SetToMinus1To1RangeOpStr, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ) ); + } + + if( m_setTo01Range && m_type != NoiseGeneratorType.Simple ) + { + dataCollector.AddLocalVariable( outputId, string.Format( SetTo01RangeOpStr, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ) ); + } + + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_type = (NoiseGeneratorType)Enum.Parse( typeof( NoiseGeneratorType ), GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() < 16903 ) + { + m_setTo01Range = false; + } + else + { + m_setTo01Range = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + m_unityVersion = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + + ConfigurePorts(); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_type ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_setTo01Range ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_unityVersion ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/NoiseGeneratorNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/NoiseGeneratorNode.cs.meta new file mode 100644 index 0000000..cb3c00c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/NoiseGeneratorNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6b82a8d1dffe4204fa03a09e2fe783b3 +timeCreated: 1485355115 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/PosterizeNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/PosterizeNode.cs new file mode 100644 index 0000000..9518f64 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/PosterizeNode.cs @@ -0,0 +1,98 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +//https://www.shadertoy.com/view/ldX3D4 +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Posterize", "Image Effects", "Converts a continuous gradation of tones to multiple regions of fewer tones" )] + public sealed class PosterizeNode : ParentNode + { + private const string PosterizationPowerStr = "Power"; + [SerializeField] + private int m_posterizationPower = 1; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.COLOR, false, "RGBA", -1, MasterNodePortCategory.Fragment, 1 ); + AddInputPort( WirePortDataType.INT, false, "Power", -1, MasterNodePortCategory.Fragment, 0 ); + m_inputPorts[ 1 ].AutoDrawInternalData = true; + AddOutputPort( WirePortDataType.COLOR, Constants.EmptyPortValue ); + m_textLabelWidth = 60; + m_autoWrapProperties = true; + m_previewShaderGUID = "ecb3048ef0eec1645bad1d72a98d8279"; + } + + public override void DrawProperties() + { + base.DrawProperties(); + if( !m_inputPorts[ 1 ].IsConnected ) + { + EditorGUILayout.BeginVertical(); + { + EditorGUI.BeginChangeCheck(); + m_posterizationPower = EditorGUILayoutIntSlider( PosterizationPowerStr, m_posterizationPower, 1, 256 ); + if( EditorGUI.EndChangeCheck() ) + { + GetInputPortByUniqueId( 0 ).IntInternalData = m_posterizationPower; + } + } + EditorGUILayout.EndVertical(); + } + else + { + EditorGUILayout.Space(); + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string posterizationPower = "1"; + if( m_inputPorts[ 1 ].IsConnected ) + { + posterizationPower = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + } + else + { + posterizationPower = m_posterizationPower.ToString(); + } + + string colorTarget = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + + string divVar = "div" + OutputId; + dataCollector.AddLocalVariable( UniqueId, "float " + divVar + "=256.0/float(" + posterizationPower + ");" ); + string result = "( floor( " + colorTarget + " * " + divVar + " ) / " + divVar + " )"; + + RegisterLocalVariable( 0, result, ref dataCollector, "posterize" + OutputId ); + + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + m_inputPorts[ 0 ].ChangeType( WirePortDataType.COLOR, false ); + m_inputPorts[ 1 ].ChangeType( WirePortDataType.INT, false ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_posterizationPower ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_posterizationPower = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/PosterizeNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/PosterizeNode.cs.meta new file mode 100644 index 0000000..edceea3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/PosterizeNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7dc4667cd643835489312daa244a03b9 +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/RGBToHSVNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/RGBToHSVNode.cs new file mode 100644 index 0000000..1fa7c92 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/RGBToHSVNode.cs @@ -0,0 +1,93 @@ +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "RGB to HSV", "Image Effects", "Converts from RGB to HSV color space" )] + public sealed class RGBToHSVNode : ParentNode + { + public static readonly string RGBToHSVHeader = "RGBToHSV( {0} )"; + public static readonly string[] RGBToHSVFunction = { "{0}3 RGBToHSV({0}3 c)\n", + "{\n", + "\t{0}4 K = {0}4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n", + "\t{0}4 p = lerp( {0}4( c.bg, K.wz ), {0}4( c.gb, K.xy ), step( c.b, c.g ) );\n", + "\t{0}4 q = lerp( {0}4( p.xyw, c.r ), {0}4( c.r, p.yzx ), step( p.x, c.r ) );\n", + "\t{0} d = q.x - min( q.w, q.y );\n", + "\t{0} e = 1.0e-10;\n", + "\treturn {0}3( abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n", + "}" + }; + + public static readonly bool[] RGBToHSVFlags = { true, + false, + true, + true, + true, + true, + true, + true, + false}; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT3, false, "RGB" ); + AddOutputPort( WirePortDataType.FLOAT3, "HSV" ); + AddOutputPort( WirePortDataType.FLOAT, "Hue" ); + AddOutputPort( WirePortDataType.FLOAT, "Saturation" ); + AddOutputPort( WirePortDataType.FLOAT, "Value" ); + m_previewShaderGUID = "0f2f09b49bf4954428aafa2dfe1a9a09"; + m_useInternalPortData = true; + m_autoWrapProperties = true; + m_customPrecision = true; + } + + public override void DrawProperties() + { + base.DrawProperties(); + DrawPrecisionProperty(); + } + + public void AddRGBToHSVFunction( ref MasterNodeDataCollector dataCollector, string precisionString ) + { + if( !dataCollector.HasFunction( RGBToHSVHeader ) ) + { + //Hack to be used util indent is properly used + int currIndent = UIUtils.ShaderIndentLevel; + if( dataCollector.MasterNodeCategory == AvailableShaderTypes.Template ) + { + UIUtils.ShaderIndentLevel = 0; + } + else + { + UIUtils.ShaderIndentLevel = 1; + UIUtils.ShaderIndentLevel++; + } + + string finalFunction = string.Empty; + for( int i = 0; i < RGBToHSVFunction.Length; i++ ) + { + finalFunction += UIUtils.ShaderIndentTabs + ( RGBToHSVFlags[ i ] ? string.Format( RGBToHSVFunction[ i ], precisionString ) : RGBToHSVFunction[ i ] ); + } + UIUtils.ShaderIndentLevel--; + UIUtils.ShaderIndentLevel = currIndent; + + dataCollector.AddFunction( RGBToHSVHeader, finalFunction ); + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + + string precisionString = UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, WirePortDataType.FLOAT ); + AddRGBToHSVFunction( ref dataCollector, precisionString ); + + string rgbValue = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + + RegisterLocalVariable( 0, string.Format( RGBToHSVHeader, rgbValue ), ref dataCollector, "hsvTorgb" + OutputId ); + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/RGBToHSVNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/RGBToHSVNode.cs.meta new file mode 100644 index 0000000..b5abf86 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/RGBToHSVNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4d24b838adbc80d4cb63e3fc4f5a1c79 +timeCreated: 1494863846 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/SimpleContrastOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/SimpleContrastOpNode.cs new file mode 100644 index 0000000..0131092 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/SimpleContrastOpNode.cs @@ -0,0 +1,55 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Simple Contrast", "Image Effects", "Simple contrast matrix multiplication" )] + public sealed class SimpleContrastOpNode : ParentNode + { + private const string InputTypeStr = "Contrast"; + private const string FunctionHeader = "CalculateContrast({0},{1})"; + private readonly string[] m_functionBody = { "float4 CalculateContrast( float contrastValue, float4 colorTarget )\n", + "{\n", + "\tfloat t = 0.5 * ( 1.0 - contrastValue );\n", + "\treturn mul( float4x4( contrastValue,0,0,t, 0,contrastValue,0,t, 0,0,contrastValue,t, 0,0,0,1 ), colorTarget );\n", + "}"}; + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddPorts(); + m_textLabelWidth = 70; + m_useInternalPortData = true; + m_previewShaderGUID = "8d76799413f9f0547ac9b1de7ba798f1"; + } + + void AddPorts() + { + AddInputPort( WirePortDataType.COLOR, false, "RGBA", -1, MasterNodePortCategory.Fragment, 1 ); + AddInputPort( WirePortDataType.FLOAT, false, "Value", -1, MasterNodePortCategory.Fragment, 0 ); + AddOutputPort( WirePortDataType.COLOR, Constants.EmptyPortValue ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string contrastValue = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + string colorTarget = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string result = dataCollector.AddFunctions( FunctionHeader, m_functionBody, false, contrastValue, colorTarget ); + + return CreateOutputLocalVariable( 0, result, ref dataCollector ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() < 5004 ) + { + m_inputPorts[ 1 ].FloatInternalData = Convert.ToSingle( GetCurrentParam( ref nodeParams ) ); + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/SimpleContrastOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/SimpleContrastOpNode.cs.meta new file mode 100644 index 0000000..a860f21 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/SimpleContrastOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3f49defa61805f948a04775d391e507a +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/SimplexNoiseNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/SimplexNoiseNode.cs new file mode 100644 index 0000000..ec94623 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/SimplexNoiseNode.cs @@ -0,0 +1,104 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +//https://www.shadertoy.com/view/XsX3zB +using System; +using UnityEngine; +using UnityEditor; + + +namespace AmplifyShaderEditor +{ + public enum NoiseType + { + Simplex3D, + Simplex3DFractal + } + + [Serializable] + [NodeAttributes( "[Deprecated] Simplex Noise", "Image Effects", "Noise generated via the Simplex algorithm",null,KeyCode.None,false,true)] + public sealed class SimplexNoiseNode : ParentNode + { + private string m_randomFuncBody; + private string m_simplex3dFuncBody; + private string m_simplex3dFractalFuncBody; + + private const string RandomfunctionHeader = "Random3({0})"; + private const string Simplex3dfunctionHeader = "Simplex3d({0})"; + private const string Simplex3dFractalfunctionHeader = "Simplex3dFractal( {0})"; + + private const string NoiseTypeStr = "Type"; + + [SerializeField] + private NoiseType m_type = NoiseType.Simplex3D; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + + IOUtils.AddFunctionHeader( ref m_randomFuncBody, "float3 Random3 ( float3 c )" ); + IOUtils.AddFunctionLine( ref m_randomFuncBody, "float fracMul = 512.0;float j = 4096.0*sin ( dot ( c, float3 ( 17.0, 59.4, 15.0 ) ) );float3 r;r.z = frac ( fracMul*j );j *= .125;r.x = frac ( fracMul*j );j *= .125;r.y = frac ( fracMul*j );return r - 0.5;" ); + IOUtils.CloseFunctionBody( ref m_randomFuncBody ); + + IOUtils.AddFunctionHeader( ref m_simplex3dFuncBody, "float3 Simplex3d ( float3 p )" ); + IOUtils.AddFunctionLine( ref m_simplex3dFuncBody, "float F3 = 0.3333333;float G3 = 0.1666667;float3 s = floor ( p + dot ( p, F3.xxx ) );float3 x = p - s + dot ( s, G3.xxx );float3 e = step ( ( 0.0 ).xxx, x - x.yzx );float3 i1 = e*( 1.0 - e.zxy );float3 i2 = 1.0 - e.zxy*( 1.0 - e );float3 x1 = x - i1 + G3;float3 x2 = x - i2 + 2.0*G3;float3 x3 = x - 1.0 + 3.0*G3;float4 w, d;w.x = dot ( x, x );w.y = dot ( x1, x1 );w.z = dot ( x2, x2 );w.w = dot ( x3, x3 );w = max ( 0.6 - w, 0.0 );d.x = dot ( Random3 ( s ), x );d.y = dot ( Random3 ( s + i1 ), x1 );d.z = dot ( Random3 ( s + i2 ), x2 );d.w = dot ( Random3 ( s + 1.0 ), x3 );w *= w;w *= w;d *= w;return dot ( d, ( 52.0 ).xxx ).xxx;" ); + IOUtils.CloseFunctionBody( ref m_simplex3dFuncBody ); + + IOUtils.AddFunctionHeader( ref m_simplex3dFractalFuncBody, "float3 Simplex3dFractal ( float3 m )" ); + IOUtils.AddFunctionLine( ref m_simplex3dFractalFuncBody, "return (0.5333333*Simplex3d ( m ) + 0.2666667*Simplex3d ( 2.0*m ) + 0.1333333*Simplex3d ( 4.0*m ) + 0.0666667*Simplex3d ( 8.0*m )).xxx;" ); + IOUtils.CloseFunctionBody( ref m_simplex3dFractalFuncBody ); + + AddInputPort( WirePortDataType.FLOAT3, false, "Position" ); + AddInputPort( WirePortDataType.FLOAT, false, "Width" ); + AddOutputPort( WirePortDataType.FLOAT3, Constants.EmptyPortValue ); + m_textLabelWidth = 50; + m_useInternalPortData = true; + m_autoWrapProperties = true; + } + + public override void DrawProperties() + { + base.DrawProperties(); + m_type = ( NoiseType ) EditorGUILayoutEnumPopup( NoiseTypeStr, m_type ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + + + string posValue = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string widthValue = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + dataCollector.AddFunctions( RandomfunctionHeader, m_randomFuncBody, "0" ); + string result = string.Empty; + switch ( m_type ) + { + case NoiseType.Simplex3D: + { + string finalValue = dataCollector.AddFunctions( Simplex3dfunctionHeader, m_simplex3dFuncBody, posValue + "*" + widthValue ); + result = finalValue + "* 0.5 + 0.5"; + }break; + + case NoiseType.Simplex3DFractal: + { + dataCollector.AddFunctions( Simplex3dfunctionHeader, m_simplex3dFuncBody, posValue + "*" + widthValue ); + string finalValue = dataCollector.AddFunctions( Simplex3dFractalfunctionHeader, m_simplex3dFractalFuncBody, posValue + "*" + widthValue + "+" + widthValue ); + result = finalValue + "* 0.5 + 0.5"; + }break; + } + + return CreateOutputLocalVariable( 0, result, ref dataCollector ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_type = ( NoiseType ) Enum.Parse( typeof( NoiseType ), GetCurrentParam( ref nodeParams ) ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_type ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/SimplexNoiseNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/SimplexNoiseNode.cs.meta new file mode 100644 index 0000000..477f0e3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/SimplexNoiseNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3f888e3dadb5df94199547ab13cb74d2 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/TFHCGrayscale.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/TFHCGrayscale.cs new file mode 100644 index 0000000..5620173 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/TFHCGrayscale.cs @@ -0,0 +1,116 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +// +// Custom Node Grayscale +// Donated by The Four Headed Cat - @fourheadedcat + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Grayscale", "Image Effects", "Convert image colors to grayscale", null, KeyCode.None, true, false, null, null, "The Four Headed Cat - @fourheadedcat", tags:"luminance" )] + public sealed class TFHCGrayscale : ParentNode + { + private const string GrayscaleStyleStr = "Grayscale Style"; + + [SerializeField] + private int m_grayscaleStyle; + + [SerializeField] + private readonly string[] m_GrayscaleStyleValues = { "Luminance", "Natural Classic", "Old School" }; + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT3, false, "RGB" ); + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + m_textLabelWidth = 120; + m_useInternalPortData = true; + m_hasLeftDropdown = true; + m_autoWrapProperties = true; + SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, m_GrayscaleStyleValues[ m_grayscaleStyle ] ) ); + m_previewShaderGUID = "56781cd022be9124597f0f396a46a35f"; + } + + public override void AfterCommonInit() + { + base.AfterCommonInit(); + if( PaddingTitleLeft == 0 ) + { + PaddingTitleLeft = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + if( PaddingTitleRight == 0 ) + PaddingTitleRight = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + } + } + + public override void Destroy() + { + base.Destroy(); + m_upperLeftWidget = null; + } + + void UpdateFromSelected() + { + m_previewMaterialPassId = m_grayscaleStyle; + SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, m_GrayscaleStyleValues[ m_grayscaleStyle ] ) ); + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + EditorGUI.BeginChangeCheck(); + m_grayscaleStyle = m_upperLeftWidget.DrawWidget( this, m_grayscaleStyle, m_GrayscaleStyleValues ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateFromSelected(); + } + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUI.BeginChangeCheck(); + m_grayscaleStyle = EditorGUILayoutPopup( GrayscaleStyleStr, m_grayscaleStyle, m_GrayscaleStyleValues ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateFromSelected(); + } + EditorGUILayout.HelpBox( "Grayscale Old:\n\n - In: Image to convert.\n - Grayscale Style: Select the grayscale style.\n\n - Out: Grayscale version of the image.", MessageType.None ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_grayscaleStyle = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + UpdateFromSelected(); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_grayscaleStyle ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string i = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string grayscale = string.Empty; + switch( m_grayscaleStyle ) + { + case 1: { grayscale = "dot(" + i + ", float3(0.299,0.587,0.114))"; } break; + case 2: { grayscale = "(" + i + ".r + " + i + ".g + " + i + ".b) / 3"; } break; + default: { grayscale = "Luminance(" + i + ")"; } break; + } + RegisterLocalVariable( 0, grayscale, ref dataCollector, "grayscale" + OutputId ); + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/TFHCGrayscale.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/TFHCGrayscale.cs.meta new file mode 100644 index 0000000..07f01e0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/TFHCGrayscale.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 32d7b01a9f453d448abf3685a35c4a19 +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/VoronoiNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/VoronoiNode.cs new file mode 100644 index 0000000..46e0f19 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/VoronoiNode.cs @@ -0,0 +1,593 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEditor; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Voronoi", "Miscellaneous", "Voronoi", Tags = "noise" )] + public sealed class VoronoiNode : ParentNode + { + // Unity Voronoi + private readonly string UnityVoronoiNoiseFunc = "UnityVoronoi({0},{1},{2},{3})"; + private readonly string[] UnityVoroniNoiseFunctionsBody = + { + "inline float2 UnityVoronoiRandomVector( float2 UV, float offset )\n", + "{\n", + "\tfloat2x2 m = float2x2( 15.27, 47.63, 99.41, 89.98 );\n", + "\tUV = frac( sin(mul(UV, m) ) * 46839.32 );\n", + "\treturn float2( sin(UV.y* +offset ) * 0.5 + 0.5, cos( UV.x* offset ) * 0.5 + 0.5 );\n", + "}\n", + "\n", + "//x - Out y - Cells\n", + "float3 UnityVoronoi( float2 UV, float AngleOffset, float CellDensity, inout float2 mr )\n", + "{\n", + "\tfloat2 g = floor( UV * CellDensity );\n", + "\tfloat2 f = frac( UV * CellDensity );\n", + "\tfloat t = 8.0;\n", + "\tfloat3 res = float3( 8.0, 0.0, 0.0 );\n", + "\n", + "\tfor( int y = -1; y <= 1; y++ )\n", + "\t{\n", + "\t for( int x = -1; x <= 1; x++ )\n", + "\t {\n", + "\t\t\tfloat2 lattice = float2( x, y );\n", + "\t\t\tfloat2 offset = UnityVoronoiRandomVector( lattice + g, AngleOffset );\n", + "\t\t\tfloat d = distance( lattice + offset, f );\n", + "\n", + "\t\t\tif( d < res.x )\n", + "\t\t\t{\n", + "\t\t\t\tmr = f - lattice - offset;\n", + "\t\t\t\tres = float3( d, offset.x, offset.y );\n", + "\t\t\t}\n", + "\t }\n", + "\t}\n", + "\treturn res;\n", + "}\n", + }; + + //////////// + + private const string VoronoiHashHeader = "float2 voronoihash{0}( float2 p )"; + private readonly string[] VoronoiHashBody = { "p = p - 2 * floor( p / 2 );", + "p = float2( dot( p, float2( 127.1, 311.7 ) ), dot( p, float2( 269.5, 183.3 ) ) );", + "return frac( sin( p ) *43758.5453);" }; + + + private const string VoronoiHeader = "float voronoi{0}( float2 v, float time, inout float2 id, inout float2 mr, float smoothness )"; + private const string VoronoiFunc = "voronoi{0}( {1}, {2}, {3}, {4}, {5} )"; + private string[] VoronoiBody = + { + "float2 n = floor( v );", + "float2 f = frac( v );", + "float F1 = 8.0;", + "float F2 = 8.0; float2 mg = 0;", + "for ( int j = -1; j <= 1; j++ )", + "{", + " \tfor ( int i = -1; i <= 1; i++ )", + " \t{", + " \t\tfloat2 g = float2( i, j );", + " \t\tfloat2 o = voronoihash{0}( n + g );", + " \t\tfloat2 r = f - g - ( sin( 0 + o * 6.2831 ) * 0.5 + 0.5 );", + " \t\tfloat d = dot( r, r );", + " \t\tif( d + { + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + if( m_inputPorts[ i ].ValidInternalData && !m_inputPorts[ i ].IsConnected && m_inputPorts[ i ].Visible && m_inputPorts[ i ].AutoDrawInternalData ) + { + m_inputPorts[ i ].ShowInternalData( this ); + } + } + } ); + } + + void ChangeFunction( string scale ) + { + VoronoiBody[ 10 ] = "\t\to = ( sin( time + o * 6.2831 ) * 0.5 + 0.5 ); float2 r = f - g - o;"; + int q = m_searchQuality + 1; + VoronoiBody[ 4 ] = "for ( int j = -" + q + "; j <= " + q + "; j++ )"; + VoronoiBody[ 6 ] = "\tfor ( int i = -" + q + "; i <= " + q + "; i++ )"; + int dFunction = m_distanceFunction; + if( m_functionType == 4 ) + dFunction = 0; + switch( dFunction ) + { + default: + case 0: + VoronoiBody[ 11 ] = "\t\tfloat d = 0.5 * dot( r, r );"; + break; + case 1: + VoronoiBody[ 11 ] = "\t\tfloat d = 0.707 * sqrt(dot( r, r ));"; + break; + case 2: + VoronoiBody[ 11 ] = "\t\tfloat d = 0.5 * ( abs(r.x) + abs(r.y) );"; + break; + case 3: + VoronoiBody[ 11 ] = "\t\tfloat d = max(abs(r.x), abs(r.y));"; + break; + case 4: + VoronoiBody[ 11 ] = "\t\tfloat d = " + ( 1 / Mathf.Pow( 2, 1 / m_minkowskiPower ) ).ToString( "n3" ) + " * pow( ( pow( abs( r.x ), " + m_minkowskiPower + " ) + pow( abs( r.y ), " + m_minkowskiPower + " ) ), " + ( 1 / m_minkowskiPower ).ToString( "n3" ) + " );"; + break; + } + + if( m_functionType == 0 ) + { + if( m_calculateSmoothValue ) + { + VoronoiBody[ 12 ] = " //\t\tif( d 17402 ) + { + m_calculateSmoothValue = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + + ChangePorts(); + ChechSmoothPorts(); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_searchQuality ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_distanceFunction ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_minkowskiPower ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_functionType ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_octaves ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_tileable.ToString() ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_tileScale ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_useUnity ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_calculateSmoothValue ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/VoronoiNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/VoronoiNode.cs.meta new file mode 100644 index 0000000..fb9562a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ImageEffects/VoronoiNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a3f99c25e876b164789b7612a63ec748 +timeCreated: 1566897514 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators.meta new file mode 100644 index 0000000..5a304e6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2123282111ea51445b360151bd090f3a +folderAsset: yes +timeCreated: 1481126945 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/Compare.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/Compare.cs new file mode 100644 index 0000000..dab5a15 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/Compare.cs @@ -0,0 +1,293 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; +using System.CodeDom; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Compare", "Logical Operators", "Compare A to B given the selected operator. If comparison is true return value of True else return value of False", tags: "If Ternary Compare Less Equal Not Greater" )] + public sealed class Compare : ParentNode + { + private static readonly string[] LabelsSTR = { "Equal", "Not Equal", "Greater", "Greater Or Equal", "Less", "Less Or Equal" }; + + enum Comparision + { + Equal, + NotEqual, + Greater, + GreaterOrEqual, + Less, + LessOrEqual, + } + + private WirePortDataType m_mainInputType = WirePortDataType.FLOAT; + private WirePortDataType m_mainOutputType = WirePortDataType.FLOAT; + + private int m_cachedOperatorId = -1; + + [SerializeField] + private Comparision m_comparision = Comparision.Equal; + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, "A" ); + AddInputPort( WirePortDataType.FLOAT, false, "B" ); + AddInputPort( WirePortDataType.FLOAT, false, "True" ); + AddInputPort( WirePortDataType.FLOAT, false, "False" ); + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + m_inputPorts[ 0 ].AutoDrawInternalData = true; + m_inputPorts[ 1 ].AutoDrawInternalData = true; + m_inputPorts[ 2 ].AutoDrawInternalData = true; + m_inputPorts[ 3 ].AutoDrawInternalData = true; + m_textLabelWidth = 100; + m_autoWrapProperties = true; + m_hasLeftDropdown = true; + m_previewShaderGUID = "381937898f0c15747af1da09a751890c"; + UpdateTitle(); + } + + public override void Destroy() + { + base.Destroy(); + m_upperLeftWidget = null; + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + EditorGUI.BeginChangeCheck(); + m_comparision = (Comparision)m_upperLeftWidget.DrawWidget( this, (int)m_comparision, LabelsSTR ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateTitle(); + } + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + if( m_cachedOperatorId == -1 ) + m_cachedOperatorId = Shader.PropertyToID( "_Operator" ); + + PreviewMaterial.SetInt( m_cachedOperatorId, (int)m_comparision ); + } + + void UpdateTitle() + { + switch( m_comparision ) + { + default: + case Comparision.Equal: + m_additionalContent.text = "( A = B )"; + break; + case Comparision.NotEqual: + m_additionalContent.text = "( A \u2260 B )"; + break; + case Comparision.Greater: + m_additionalContent.text = "( A > B )"; + break; + case Comparision.GreaterOrEqual: + m_additionalContent.text = "( A \u2265 B )"; + break; + case Comparision.Less: + m_additionalContent.text = "( A < B )"; + break; + case Comparision.LessOrEqual: + m_additionalContent.text = "( A \u2264 B )"; + break; + } + m_sizeIsDirty = true; + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUI.BeginChangeCheck(); + m_comparision = (Comparision)EditorGUILayoutEnumPopup( "", m_comparision ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateTitle(); + } + + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + if( m_inputPorts[ i ].ValidInternalData && !m_inputPorts[ i ].IsConnected && m_inputPorts[ i ].Visible ) + { + m_inputPorts[ i ].ShowInternalData( this ); + } + } + } + + public override void OnConnectedOutputNodeChanges( int inputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( inputPortId, otherNodeId, otherPortId, name, type ); + UpdateConnection( inputPortId ); + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + UpdateConnection( portId ); + } + + public override void OnInputPortDisconnected( int portId ) + { + base.OnInputPortDisconnected( portId ); + + int otherPortId = 0; + if( portId < 2 ) + { + otherPortId = ( portId == 0 ) ? 1 : 0; + if( m_inputPorts[ otherPortId ].IsConnected ) + { + m_mainInputType = m_inputPorts[ otherPortId ].DataType; + m_inputPorts[ portId ].ChangeType( m_mainInputType, false ); + } + } + else + { + otherPortId = ( portId == 2 ) ? 3 : 2; + if( m_inputPorts[ otherPortId ].IsConnected ) + { + m_mainOutputType = m_inputPorts[ otherPortId ].DataType; + m_inputPorts[ portId ].ChangeType( m_mainOutputType, false ); + m_outputPorts[ 0 ].ChangeType( m_mainOutputType, false ); + } + } + } + + public void UpdateConnection( int portId ) + { + m_inputPorts[ portId ].MatchPortToConnection(); + int otherPortId = 0; + WirePortDataType otherPortType = WirePortDataType.FLOAT; + if( portId < 2 ) + { + otherPortId = ( portId == 0 ) ? 1 : 0; + otherPortType = m_inputPorts[ otherPortId ].IsConnected ? m_inputPorts[ otherPortId ].DataType : WirePortDataType.FLOAT; + m_mainInputType = UIUtils.GetPriority( m_inputPorts[ portId ].DataType ) > UIUtils.GetPriority( otherPortType ) ? m_inputPorts[ portId ].DataType : otherPortType; + if( !m_inputPorts[ otherPortId ].IsConnected ) + { + m_inputPorts[ otherPortId ].ChangeType( m_mainInputType, false ); + } + } + else + { + otherPortId = ( portId == 2 ) ? 3 : 2; + otherPortType = m_inputPorts[ otherPortId ].IsConnected ? m_inputPorts[ otherPortId ].DataType : WirePortDataType.FLOAT; + m_mainOutputType = UIUtils.GetPriority( m_inputPorts[ portId ].DataType ) > UIUtils.GetPriority( otherPortType ) ? m_inputPorts[ portId ].DataType : otherPortType; + + m_outputPorts[ 0 ].ChangeType( m_mainOutputType, false ); + + if( !m_inputPorts[ otherPortId ].IsConnected ) + { + m_inputPorts[ otherPortId ].ChangeType( m_mainOutputType, false ); + } + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + //Conditional Operator ?: has some shenanigans + //If the first operand is of type bool, one of the following must hold for the second and third operands: + //Both operands have compatible structure types. + //Both operands are scalars with numeric or bool type. + //Both operands are vectors with numeric or bool type, where the two vectors are of the same size, which is less than or equal to four. + //If the first operand is a packed vector of bool, then the conditional selection is performed on an elementwise basis.Both the second and third operands must be numeric vectors of the same size as the first operand. + WirePortDataType compatibleInputType = m_mainInputType; + if( m_mainInputType != WirePortDataType.FLOAT && m_mainInputType != WirePortDataType.INT && m_mainInputType != m_mainOutputType ) + { + compatibleInputType = m_mainOutputType; + } + + string a = m_inputPorts[ 0 ].GenerateShaderForOutput( ref dataCollector, compatibleInputType, ignoreLocalvar, true ); + string b = m_inputPorts[ 1 ].GenerateShaderForOutput( ref dataCollector, compatibleInputType, ignoreLocalvar, true ); + string op = string.Empty; + switch( m_comparision ) + { + default: + case Comparision.Equal: + op = "=="; + break; + case Comparision.NotEqual: + op = "!="; + break; + case Comparision.Greater: + op = ">"; + break; + case Comparision.GreaterOrEqual: + op = ">="; + break; + case Comparision.Less: + op = "<"; + break; + case Comparision.LessOrEqual: + op = "<="; + break; + } + string T = m_inputPorts[ 2 ].GenerateShaderForOutput( ref dataCollector, m_mainOutputType, ignoreLocalvar, true ); + string F = m_inputPorts[ 3 ].GenerateShaderForOutput( ref dataCollector, m_mainOutputType, ignoreLocalvar, true ); + return CreateOutputLocalVariable( 0, string.Format( "( {0} {2} {1} ? {3} : {4} )", a, b, op, T, F ), ref dataCollector ); + } + + public override void ReadFromDeprecated( ref string[] nodeParams, Type oldType = null ) + { + base.ReadFromDeprecated( ref nodeParams, oldType ); + + if( oldType == typeof( TFHCCompareEqual ) ) + { + m_comparision = Comparision.Equal; + } + else + if( oldType == typeof( TFHCCompareNotEqual ) ) + { + m_comparision = Comparision.NotEqual; + } + else + if( oldType == typeof( TFHCCompareGreater ) ) + { + m_comparision = Comparision.Greater; + } + else + if( oldType == typeof( TFHCCompareGreaterEqual ) ) + { + m_comparision = Comparision.GreaterOrEqual; + } + else + if( oldType == typeof( TFHCCompareLower ) ) + { + m_comparision = Comparision.Less; + } + else + if( oldType == typeof( TFHCCompareLowerEqual ) ) + { + m_comparision = Comparision.LessOrEqual; + } + + UpdateTitle(); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + + m_comparision = (Comparision)Convert.ToSingle( GetCurrentParam( ref nodeParams ) ); + UpdateTitle(); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + + IOUtils.AddFieldValueToString( ref nodeInfo, (int)m_comparision ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/Compare.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/Compare.cs.meta new file mode 100644 index 0000000..b8307fa --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/Compare.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ab308ada4f120144b8d44aef5c834fe6 +timeCreated: 1588859716 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/ConditionalIfNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/ConditionalIfNode.cs new file mode 100644 index 0000000..d42d970 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/ConditionalIfNode.cs @@ -0,0 +1,297 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using System; +//using System.Collections.Generic; +//using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "If", "Logical Operators", "Conditional comparison between A with B." )] + public sealed class ConditionalIfNode : ParentNode + { + private const string UseUnityBranchesStr = "Dynamic Branching"; + private const string UnityBranchStr = "UNITY_BRANCH "; + + private readonly string[] IfOps = { "if( {0} > {1} )", + "if( {0} == {1} )", + "if( {0} < {1} )", + "if( {0} >= {1} )", + "if( {0} <= {1} )", + "if( {0} != {1} )" }; + + //private WirePortDataType m_inputMainDataType = WirePortDataType.FLOAT; + private WirePortDataType m_outputMainDataType = WirePortDataType.FLOAT; + private string[] m_results = { string.Empty, string.Empty, string.Empty }; + + [SerializeField] + private bool m_useUnityBranch = false; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, "A" ); + AddInputPort( WirePortDataType.FLOAT, false, "B" ); + m_inputPorts[ 0 ].AddPortRestrictions( WirePortDataType.FLOAT, WirePortDataType.INT ); + m_inputPorts[ 1 ].AddPortRestrictions( WirePortDataType.FLOAT, WirePortDataType.INT ); + + AddInputPort( WirePortDataType.FLOAT, false, "A > B" ); + AddInputPort( WirePortDataType.FLOAT, false, "A == B" ); + AddInputPort( WirePortDataType.FLOAT, false, "A < B" ); + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + m_inputPorts[ 0 ].AutoDrawInternalData = true; + m_inputPorts[ 1 ].AutoDrawInternalData = true; + m_textLabelWidth = 131; + //m_useInternalPortData = true; + m_autoWrapProperties = true; + m_previewShaderGUID = "f6fb4d46bddf29e45a8a3ddfed75d0c0"; + } + + public override void OnConnectedOutputNodeChanges( int inputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( inputPortId, otherNodeId, otherPortId, name, type ); + UpdateConnection( inputPortId ); + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + UpdateConnection( portId ); + } + + public override void DrawProperties() + { + base.DrawProperties(); + if( !m_inputPorts[ 0 ].IsConnected ) + m_inputPorts[ 0 ].FloatInternalData = EditorGUILayoutFloatField( m_inputPorts[ 0 ].Name, m_inputPorts[ 0 ].FloatInternalData ); + if( !m_inputPorts[ 1 ].IsConnected ) + m_inputPorts[ 1 ].FloatInternalData = EditorGUILayoutFloatField( m_inputPorts[ 1 ].Name, m_inputPorts[ 1 ].FloatInternalData ); + m_useUnityBranch = EditorGUILayoutToggle( UseUnityBranchesStr, m_useUnityBranch ); + } + + public override void OnInputPortDisconnected( int portId ) + { + base.OnInputPortDisconnected( portId ); + UpdateConnection( portId ); + } + + //void TestMainInputDataType() + //{ + // WirePortDataType newType = WirePortDataType.FLOAT; + // if ( m_inputPorts[ 0 ].IsConnected && UIUtils.GetPriority( m_inputPorts[ 0 ].DataType ) > UIUtils.GetPriority( newType ) ) + // { + // newType = m_inputPorts[ 0 ].DataType; + // } + + // if ( m_inputPorts[ 1 ].IsConnected && ( UIUtils.GetPriority( m_inputPorts[ 1 ].DataType ) > UIUtils.GetPriority( newType ) ) ) + // { + // newType = m_inputPorts[ 1 ].DataType; + // } + + // m_inputMainDataType = newType; + //} + + void TestMainOutputDataType() + { + WirePortDataType newType = WirePortDataType.FLOAT; + for( int i = 2; i < 5; i++ ) + { + if( m_inputPorts[ i ].IsConnected && ( UIUtils.GetPriority( m_inputPorts[ i ].DataType ) > UIUtils.GetPriority( newType ) ) ) + { + newType = m_inputPorts[ i ].DataType; + } + } + + if( newType != m_outputMainDataType ) + { + m_outputMainDataType = newType; + } + m_outputPorts[ 0 ].ChangeType( m_outputMainDataType, false ); + } + + public void UpdateConnection( int portId ) + { + m_inputPorts[ portId ].MatchPortToConnection(); + switch( portId ) + { + //case 0: + //case 1: + //{ + // TestMainInputDataType(); + //} + //break; + case 2: + case 3: + case 4: + { + TestMainOutputDataType(); + } + break; + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string AValue = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector); + string BValue = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + + m_results[ 0 ] = m_inputPorts[ 2 ].GenerateShaderForOutput( ref dataCollector, m_outputMainDataType, ignoreLocalvar, true ); + m_results[ 1 ] = m_inputPorts[ 3 ].GenerateShaderForOutput( ref dataCollector, m_outputMainDataType, ignoreLocalvar, true ); + m_results[ 2 ] = m_inputPorts[ 4 ].GenerateShaderForOutput( ref dataCollector, m_outputMainDataType, ignoreLocalvar, true ); + + string localVarName = "ifLocalVar" + OutputId; + string localVarDec = string.Format( "{0} {1} = 0;", UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, m_outputPorts[ 0 ].DataType ), localVarName ); + + bool lequal = false; + bool greater = false; + bool lesser = false; + bool gequal = false; + bool equal = false; + bool nequal = false; + bool welse = false; + bool midCon = false; + + if( m_inputPorts[ 2 ].IsConnected ) + { + greater = true; + } + + if( m_inputPorts[ 4 ].IsConnected ) + { + lesser = true; + } + + if( greater && m_inputPorts[ 2 ].GetOutputConnection() == m_inputPorts[ 3 ].GetOutputConnection() ) + { + gequal = true; + } + + if( lesser && m_inputPorts[ 4 ].GetOutputConnection() == m_inputPorts[ 3 ].GetOutputConnection() ) + { + lequal = true; + } + + if( m_inputPorts[ 2 ].GetOutputConnection() == m_inputPorts[ 4 ].GetOutputConnection() ) + { + if( m_inputPorts[ 3 ].IsConnected ) + equal = true; + else if( m_inputPorts[ 2 ].IsConnected ) + nequal = true; + } + + if( m_inputPorts[ 3 ].IsConnected ) + { + midCon = true; + + if( greater && lesser ) + welse = true; + } + + dataCollector.AddLocalVariable( UniqueId, localVarDec, true ); + if ( m_useUnityBranch && !( lequal && gequal ) && !( !greater && !midCon && !lesser ) ) + dataCollector.AddLocalVariable( UniqueId, UnityBranchStr, true ); + + if( lequal && gequal ) // all equal + { + dataCollector.AddLocalVariable( UniqueId, string.Format( "{0} = {1};", localVarName, m_results[ 1 ] ), true ); + } + else if( !lequal && gequal ) // greater or equal + { + dataCollector.AddLocalVariable( UniqueId, string.Format( IfOps[ 3 ], AValue, BValue ), true ); + dataCollector.AddLocalVariable( UniqueId, string.Format( "\t{0} = {1};", localVarName, m_results[ 0 ] ), true ); + + if( welse ) + { + dataCollector.AddLocalVariable( UniqueId, "else", true ); + dataCollector.AddLocalVariable( UniqueId, string.Format( "\t{0} = {1};", localVarName, m_results[ 2 ] ), true ); + } + } + else if( lequal && !gequal )// lesser or equal + { + dataCollector.AddLocalVariable( UniqueId, string.Format( IfOps[ 4 ], AValue, BValue ), true ); + dataCollector.AddLocalVariable( UniqueId, string.Format( "\t{0} = {1};", localVarName, m_results[ 2 ] ), true ); + + if( welse ) + { + dataCollector.AddLocalVariable( UniqueId, "else", true ); + dataCollector.AddLocalVariable( UniqueId, string.Format( "\t{0} = {1};", localVarName, m_results[ 0 ] ), true ); + } + } + else if( nequal )// not equal + { + dataCollector.AddLocalVariable( UniqueId, string.Format( IfOps[ 5 ], AValue, BValue ), true ); + dataCollector.AddLocalVariable( UniqueId, string.Format( "\t{0} = {1};", localVarName, m_results[ 0 ] ), true ); + } + else if( equal )// equal + { + dataCollector.AddLocalVariable( UniqueId, string.Format( IfOps[ 1 ], AValue, BValue ), true ); + dataCollector.AddLocalVariable( UniqueId, string.Format( "\t{0} = {1};", localVarName, m_results[ 1 ] ), true ); + + if( welse ) + { + dataCollector.AddLocalVariable( UniqueId, "else", true ); + dataCollector.AddLocalVariable( UniqueId, string.Format( "\t{0} = {1};", localVarName, m_results[ 0 ] ), true ); + } + } + else if( lesser && !midCon && !greater ) // lesser + { + dataCollector.AddLocalVariable( UniqueId, string.Format( IfOps[ 2 ], AValue, BValue ), true ); + dataCollector.AddLocalVariable( UniqueId, string.Format( "\t{0} = {1};", localVarName, m_results[ 2 ] ), true ); + } + else if( greater && !midCon && !lesser ) // greater + { + dataCollector.AddLocalVariable( UniqueId, string.Format( IfOps[ 0 ], AValue, BValue ), true ); + dataCollector.AddLocalVariable( UniqueId, string.Format( "\t{0} = {1};", localVarName, m_results[ 0 ] ), true ); + } + else if( !greater && !midCon && !lesser ) // none + { + //dataCollector.AddLocalVariable( UniqueId, localVarDec ); + } + else // all different + { + bool ifStarted = false; + if( greater ) + { + dataCollector.AddLocalVariable( UniqueId, string.Format( IfOps[ 0 ], AValue, BValue ), true ); + dataCollector.AddLocalVariable( UniqueId, string.Format( "\t{0} = {1};", localVarName, m_results[ 0 ] ), true ); + ifStarted = true; + } + + if( midCon ) + { + dataCollector.AddLocalVariable( UniqueId, ( ifStarted ? "else " : string.Empty ) +string.Format( IfOps[ 1 ], AValue, BValue ), true ); + dataCollector.AddLocalVariable( UniqueId, string.Format( "\t{0} = {1};", localVarName, m_results[ 1 ] ), true ); + ifStarted = true; + } + + if( lesser ) + { + dataCollector.AddLocalVariable( UniqueId, "else " + string.Format( IfOps[ 2 ], AValue, BValue ), true ); + dataCollector.AddLocalVariable( UniqueId, string.Format( "\t{0} = {1};", localVarName, m_results[ 2 ] ), true ); + } + } + + m_outputPorts[ 0 ].SetLocalValue( localVarName, dataCollector.PortCategory ); + return localVarName; + } + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > 4103 ) + { + m_useUnityBranch = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_useUnityBranch ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/ConditionalIfNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/ConditionalIfNode.cs.meta new file mode 100644 index 0000000..930b353 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/ConditionalIfNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3deb719c04d269e49bcd2a2c365da6fb +timeCreated: 1486405023 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/KeywordSwitchNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/KeywordSwitchNode.cs new file mode 100644 index 0000000..2365036 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/KeywordSwitchNode.cs @@ -0,0 +1,133 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Keyword Switch", "Logical Operators", "Attributes a value according to the existance of a selected keyword", Deprecated = true, DeprecatedAlternativeType = typeof(StaticSwitch), DeprecatedAlternative = "Static Switch" )] + public sealed class KeywordSwitchNode : ParentNode + { + private const string KeywordStr = "Keyword"; + private const string CustomStr = "Custom"; + + [SerializeField] + private string m_currentKeyword = string.Empty; + + [SerializeField] + private int m_currentKeywordId = 0; + + [SerializeField] + private WirePortDataType m_mainPortType = WirePortDataType.FLOAT; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, "True" ); + AddInputPort( WirePortDataType.FLOAT, false, "False" ); + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + m_textLabelWidth = 65; + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUI.BeginChangeCheck(); + m_currentKeywordId = EditorGUILayoutPopup( KeywordStr, m_currentKeywordId, UIUtils.AvailableKeywords ); + if ( EditorGUI.EndChangeCheck() ) + { + if ( m_currentKeywordId != 0 ) + { + m_currentKeyword = UIUtils.AvailableKeywords[ m_currentKeywordId ]; + } + } + if ( m_currentKeywordId == 0 ) + { + m_currentKeyword = EditorGUILayoutTextField( CustomStr, m_currentKeyword ); + } + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + UpdateConnected( portId ); + } + + public override void OnConnectedOutputNodeChanges( int portId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( portId, otherNodeId, otherPortId, name, type ); + UpdateConnected( portId ); + } + + public override void OnInputPortDisconnected( int portId ) + { + base.OnInputPortDisconnected( portId ); + UpdateDisconnected( portId ); + } + + void UpdateConnected( int portId ) + { + m_inputPorts[ portId ].MatchPortToConnection(); + int otherPortId = ( portId + 1 ) % 2; + if ( m_inputPorts[ otherPortId ].IsConnected ) + { + m_mainPortType = ( UIUtils.GetPriority( m_inputPorts[ portId ].DataType ) > UIUtils.GetPriority( m_inputPorts[ otherPortId ].DataType ) ) ? + m_inputPorts[ portId ].DataType : + m_inputPorts[ otherPortId ].DataType; + } + else + { + m_mainPortType = m_inputPorts[ portId ].DataType; + m_inputPorts[ otherPortId ].ChangeType( m_mainPortType, false ); + } + m_outputPorts[ 0 ].ChangeType( m_mainPortType, false ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string trueCode = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string falseCode = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + + string localVarName = "simpleKeywordVar"+OutputId; + string outType = UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, m_outputPorts[ 0 ].DataType ); + dataCollector.AddLocalVariable( UniqueId, "#ifdef " + m_currentKeyword, true ); + dataCollector.AddLocalVariable( UniqueId, outType + " " + localVarName + " = " + trueCode + ";", true ); + dataCollector.AddLocalVariable( UniqueId, "#else", true ); + dataCollector.AddLocalVariable( UniqueId, outType + " " + localVarName + " = " + falseCode + ";", true ); + dataCollector.AddLocalVariable( UniqueId, "#endif", true ); + m_outputPorts[ 0 ].SetLocalValue( localVarName, dataCollector.PortCategory ); + + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + + void UpdateDisconnected( int portId ) + { + int otherPortId = ( portId + 1 ) % 2; + if ( m_inputPorts[ otherPortId ].IsConnected ) + { + m_mainPortType = m_inputPorts[ otherPortId ].DataType; + m_inputPorts[ portId ].ChangeType( m_mainPortType, false ); + } + m_outputPorts[ 0 ].ChangeType( m_mainPortType, false ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_currentKeyword = GetCurrentParam( ref nodeParams ); + m_currentKeywordId = UIUtils.GetKeywordId( m_currentKeyword ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_currentKeyword ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/KeywordSwitchNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/KeywordSwitchNode.cs.meta new file mode 100644 index 0000000..7549755 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/KeywordSwitchNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 04eb50f45d1416e4bb61902a49f06d58 +timeCreated: 1500648134 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareEqual.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareEqual.cs new file mode 100644 index 0000000..dea9b14 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareEqual.cs @@ -0,0 +1,35 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +// +// Custom Node Compare (A == B) +// Donated by The Four Headed Cat - @fourheadedcat + +using UnityEngine; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Compare (A = B)", "Logical Operators", "Check if A is equal to B. If true return value of True else return value of False", null, KeyCode.None, true, true, "Compare", typeof( Compare ), "The Four Headed Cat - @fourheadedcat" )] + public sealed class TFHCCompareEqual : TFHCStub + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_inputPorts[ 0 ].Name = "A"; + m_inputPorts[ 1 ].Name = "B"; + AddInputPort( WirePortDataType.FLOAT, false, "True" ); + AddInputPort( WirePortDataType.FLOAT, false, "False" ); + m_textLabelWidth = 100; + m_useInternalPortData = true; + m_previewShaderGUID = "6904de6cf8c08e7439672390b425ab50"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + GetInputData( ref dataCollector, ignoreLocalvar ); + string strout = "(( " + m_inputDataPort0 + " == " + m_inputDataPort1 + " ) ? " + m_inputDataPort2 + " : " + m_inputDataPort3 + " )"; + return CreateOutputLocalVariable( 0, strout, ref dataCollector ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareEqual.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareEqual.cs.meta new file mode 100644 index 0000000..d8255b8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareEqual.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d6d04219b3c5c5a4282aa9a763b9ad3c +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareGreater.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareGreater.cs new file mode 100644 index 0000000..3d6db6a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareGreater.cs @@ -0,0 +1,36 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +// +// Custom Node Compare (A > B) +// Donated by The Four Headed Cat - @fourheadedcat + +using UnityEngine; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes("Compare (A > B)", "Logical Operators", "Check if A is greater than B. If true return value of True else return value of False", null, KeyCode.None, true, true, "Compare", typeof( Compare ), "The Four Headed Cat - @fourheadedcat" )] + public sealed class TFHCCompareGreater : TFHCStub + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_inputPorts[ 0 ].Name = "A"; + m_inputPorts[ 1 ].Name = "B"; + AddInputPort( WirePortDataType.FLOAT, false, "True" ); + AddInputPort( WirePortDataType.FLOAT, false, "False" ); + m_textLabelWidth = 100; + m_useInternalPortData = true; + m_previewShaderGUID = "363192dbd019ad2478f2fe6c277b7e48"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + GetInputData( ref dataCollector, ignoreLocalvar ); + string strout = "(( " + m_inputDataPort0 + " > " + m_inputDataPort1 + " ) ? " + m_inputDataPort2 + " : " + m_inputDataPort3 + " )"; + //Debug.Log(strout); + return CreateOutputLocalVariable( 0, strout, ref dataCollector ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareGreater.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareGreater.cs.meta new file mode 100644 index 0000000..7d1c572 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareGreater.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ff04934859005cd41ac644f2a9349e8b +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareGreaterEqual.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareGreaterEqual.cs new file mode 100644 index 0000000..5dc0fe6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareGreaterEqual.cs @@ -0,0 +1,37 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +// +// Custom Node Compare (A >= B) +// Donated by The Four Headed Cat - @fourheadedcat + +using UnityEngine; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes("Compare (A \u2265 B)", "Logical Operators", "Check if A is greater than or equal to B. If true return value of True else return value of False", null, KeyCode.None, true, true, "Compare", typeof(Compare), "The Four Headed Cat - @fourheadedcat" )] + public sealed class TFHCCompareGreaterEqual : TFHCStub + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_inputPorts[ 0 ].Name = "A"; + m_inputPorts[ 1 ].Name = "B"; + AddInputPort( WirePortDataType.FLOAT, false, "True" ); + AddInputPort( WirePortDataType.FLOAT, false, "False" ); + m_textLabelWidth = 100; + m_useInternalPortData = true; + m_previewShaderGUID = "f4ff76282a117c2429a1bcd8ba3a9112"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + GetInputData( ref dataCollector, ignoreLocalvar ); + string strout = "(( " + m_inputDataPort0 + " >= " + m_inputDataPort1 + " ) ? " + m_inputDataPort2 + " : " + m_inputDataPort3 + " )"; + //Debug.Log(strout); + return CreateOutputLocalVariable( 0, strout, ref dataCollector ); + + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareGreaterEqual.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareGreaterEqual.cs.meta new file mode 100644 index 0000000..d871371 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareGreaterEqual.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b2792c240940c3349bdef401f5683f70 +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareLower.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareLower.cs new file mode 100644 index 0000000..8f98947 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareLower.cs @@ -0,0 +1,35 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +// +// Custom Node Compare (A < B) +// Donated by The Four Headed Cat - @fourheadedcat + +using UnityEngine; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes("Compare (A < B)", "Logical Operators", "Check if A is lower than B. If true return value of True else return value of False", null, KeyCode.None, true, true, "Compare", typeof( Compare ), "The Four Headed Cat - @fourheadedcat" )] + public sealed class TFHCCompareLower : TFHCStub + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_inputPorts[ 0 ].Name = "A"; + m_inputPorts[ 1 ].Name = "B"; + AddInputPort( WirePortDataType.FLOAT, false, "True" ); + AddInputPort( WirePortDataType.FLOAT, false, "False" ); + m_textLabelWidth = 100; + m_useInternalPortData = true; + m_previewShaderGUID = "8024509244392ed44b37c28473e66a8a"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + GetInputData( ref dataCollector, ignoreLocalvar ); + string strout = "(( " + m_inputDataPort0 + " < " + m_inputDataPort1 + " ) ? " + m_inputDataPort2 + " : " + m_inputDataPort3 + " )"; + return CreateOutputLocalVariable( 0, strout, ref dataCollector ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareLower.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareLower.cs.meta new file mode 100644 index 0000000..e5abcf6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareLower.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1a70dcf76fe65a64ca70400d6d08563d +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareLowerEqual.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareLowerEqual.cs new file mode 100644 index 0000000..d9bcafd --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareLowerEqual.cs @@ -0,0 +1,35 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +// +// Custom Node Compare (A <= B) +// Donated by The Four Headed Cat - @fourheadedcat + +using UnityEngine; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes("Compare (A \u2264 B)", "Logical Operators", "Check if A is lower than or equal to B. If true return value of True else return value of False", null, KeyCode.None, true, true, "Compare", typeof( Compare ), "The Four Headed Cat - @fourheadedcat" )] + public sealed class TFHCCompareLowerEqual : TFHCStub + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_inputPorts[ 0 ].Name = "A"; + m_inputPorts[ 1 ].Name = "B"; + AddInputPort( WirePortDataType.FLOAT, false, "True" ); + AddInputPort( WirePortDataType.FLOAT, false, "False" ); + m_textLabelWidth = 100; + m_useInternalPortData = true; + m_previewShaderGUID = "9a3e17508793b9d42b1efaaf5bcd2554"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + GetInputData( ref dataCollector, ignoreLocalvar ); + string strout = "(( " + m_inputDataPort0 + " <= " + m_inputDataPort1 + " ) ? " + m_inputDataPort2 + " : " + m_inputDataPort3 + " )"; + return CreateOutputLocalVariable( 0, strout, ref dataCollector ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareLowerEqual.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareLowerEqual.cs.meta new file mode 100644 index 0000000..4fd5bee --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareLowerEqual.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e1e66ddf48770134b806dd1f397e4ac3 +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareNotEqual.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareNotEqual.cs new file mode 100644 index 0000000..98ec281 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareNotEqual.cs @@ -0,0 +1,35 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +// +// Custom Node Compare (A != B) +// Donated by The Four Headed Cat - @fourheadedcat + +using UnityEngine; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes("Compare (A \u2260 B)", "Logical Operators", "Check if A is not equal to B. If true return value of True else return value of False", null, KeyCode.None, true, true, "Compare", typeof( Compare ), "The Four Headed Cat - @fourheadedcat" )] + public sealed class TFHCCompareNotEqual : TFHCStub + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_inputPorts[ 0 ].Name = "A"; + m_inputPorts[ 1 ].Name = "B"; + AddInputPort( WirePortDataType.FLOAT, false, "True" ); + AddInputPort( WirePortDataType.FLOAT, false, "False" ); + m_textLabelWidth = 100; + m_useInternalPortData = true; + m_previewShaderGUID = "75f433376eef1ad4a881d99124e08008"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + GetInputData( ref dataCollector, ignoreLocalvar ); + string strout = "(( " + m_inputDataPort0 + " != " + m_inputDataPort1 + " ) ? " + m_inputDataPort2 + " : " + m_inputDataPort3 + " )"; + return CreateOutputLocalVariable( 0, strout, ref dataCollector ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareNotEqual.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareNotEqual.cs.meta new file mode 100644 index 0000000..77f259d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareNotEqual.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 48f885e2f5fa775409b9f50be6aaf80a +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareWithRange.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareWithRange.cs new file mode 100644 index 0000000..efd0d40 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareWithRange.cs @@ -0,0 +1,122 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +// +// Custom Node Compare With Range +// Donated by The Four Headed Cat - @fourheadedcat + +using UnityEngine; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Compare With Range", "Logical Operators", "Check if A is in the range between Range Min and Range Max. If true return value of True else return value of False", null, KeyCode.None, true, false, null, null, "The Four Headed Cat - @fourheadedcat" )] + public sealed class TFHCCompareWithRange : DynamicTypeNode + { + private WirePortDataType m_mainInputType = WirePortDataType.FLOAT; + private WirePortDataType m_mainOutputType = WirePortDataType.FLOAT; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_inputPorts[ 0 ].Name = "Value"; + m_inputPorts[ 1 ].Name = "Range Min"; + AddInputPort( WirePortDataType.FLOAT, false, "Range Max" ); + AddInputPort( WirePortDataType.FLOAT, false, "True" ); + AddInputPort( WirePortDataType.FLOAT, false, "False" ); + m_textLabelWidth = 100; + m_useInternalPortData = true; + m_previewShaderGUID = "127d114eed178d7409f900134a6c00d1"; + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + UpdateConnections( portId ); + } + + public override void OnConnectedOutputNodeChanges( int outputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + UpdateConnections( outputPortId ); + } + + public override void OnInputPortDisconnected( int portId ) + { + if ( portId < 3 ) + { + if ( portId > 0 ) + { + m_inputPorts[ portId ].ChangeType( m_mainInputType, false ); + } + } + else + { + int otherPortId = ( portId == 3 ) ? 4 : 3; + if ( m_inputPorts[ otherPortId ].IsConnected ) + { + m_mainOutputType = m_inputPorts[ otherPortId ].DataType; + m_inputPorts[ portId ].ChangeType( m_mainOutputType, false ); + m_outputPorts[ 0 ].ChangeType( m_mainOutputType, false ); + } + } + } + + void UpdateConnections( int portId ) + { + m_inputPorts[ portId ].MatchPortToConnection(); + int otherPortId = 0; + WirePortDataType otherPortType = WirePortDataType.FLOAT; + if ( portId < 3 ) + { + if ( portId == 0 ) + { + m_mainInputType = m_inputPorts[ 0 ].DataType; + for ( int i = 1; i < 3; i++ ) + { + if ( !m_inputPorts[ i ].IsConnected ) + { + m_inputPorts[ i ].ChangeType( m_mainInputType, false ); + } + } + } + } + else + { + otherPortId = ( portId == 3 ) ? 4 : 3; + otherPortType = m_inputPorts[ otherPortId ].IsConnected ? m_inputPorts[ otherPortId ].DataType : WirePortDataType.FLOAT; + m_mainOutputType = UIUtils.GetPriority( m_inputPorts[ portId ].DataType ) > UIUtils.GetPriority( otherPortType ) ? m_inputPorts[ portId ].DataType : otherPortType; + + m_outputPorts[ 0 ].ChangeType( m_mainOutputType, false ); + + if ( !m_inputPorts[ otherPortId ].IsConnected ) + { + m_inputPorts[ otherPortId ].ChangeType( m_mainOutputType, false ); + } + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + //Conditional Operator ?: has some shenanigans + //If the first operand is of type bool, one of the following must hold for the second and third operands: + //Both operands have compatible structure types. + //Both operands are scalars with numeric or bool type. + //Both operands are vectors with numeric or bool type, where the two vectors are of the same size, which is less than or equal to four. + //If the first operand is a packed vector of bool, then the conditional selection is performed on an elementwise basis.Both the second and third operands must be numeric vectors of the same size as the first operand. + WirePortDataType compatibleInputType = m_mainInputType; + if ( m_mainInputType != WirePortDataType.FLOAT && m_mainInputType != WirePortDataType.INT && m_mainInputType != m_mainOutputType ) + { + compatibleInputType = m_mainOutputType; + } + + //Check if VALUE is in range between MIN and MAX. If true return VALUE IF TRUE else VALUE IF FALSE" + string a = m_inputPorts[ 0 ].GenerateShaderForOutput( ref dataCollector, compatibleInputType, ignoreLocalvar, true ); + string b = m_inputPorts[ 1 ].GenerateShaderForOutput( ref dataCollector, compatibleInputType, ignoreLocalvar, true ); + string c = m_inputPorts[ 2 ].GenerateShaderForOutput( ref dataCollector, compatibleInputType, ignoreLocalvar, true ); + string d = m_inputPorts[ 3 ].GenerateShaderForOutput( ref dataCollector, m_mainOutputType, ignoreLocalvar, true ); + string e = m_inputPorts[ 4 ].GenerateShaderForOutput( ref dataCollector, m_mainOutputType, ignoreLocalvar, true ); + string strout = "(( " + a + " >= " + b + " && " + a + " <= " + c + " ) ? " + d + " : " + e + " )"; + //Debug.Log(strout); + return CreateOutputLocalVariable( 0, strout, ref dataCollector ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareWithRange.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareWithRange.cs.meta new file mode 100644 index 0000000..9cef3a3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCCompareWithRange.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e7d30ad11b781804ebd54834781a32d9 +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCIf.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCIf.cs new file mode 100644 index 0000000..7ed7272 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCIf.cs @@ -0,0 +1,133 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +// +// Custom Node If +// Donated by The Four Headed Cat - @fourheadedcat + +using UnityEngine; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "If [Community]", "Logical Operators", "Compare A with B. If A is greater than B output the value of A > B port. If A is equal to B output the value of A == B port. If A is lower than B output the value of A < B port. Equal Threshold parameter will be used to check A == B adding and subtracting this value to A.", null, KeyCode.None, true, false, null, null, "The Four Headed Cat - @fourheadedcat" )] + public sealed class TFHCIf : ParentNode + { + private WirePortDataType m_inputMainDataType = WirePortDataType.FLOAT; + private WirePortDataType m_outputMainDataType = WirePortDataType.FLOAT; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, "A" ); + AddInputPort( WirePortDataType.FLOAT, false, "B" ); + AddInputPort( WirePortDataType.FLOAT, false, "A > B" ); + AddInputPort( WirePortDataType.FLOAT, false, "A == B" ); + AddInputPort( WirePortDataType.FLOAT, false, "A < B" ); + AddInputPort( WirePortDataType.FLOAT, false, "Equal Threshold" ); + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + m_textLabelWidth = 110; + m_useInternalPortData = true; + m_previewShaderGUID = "5c7bc7e3cab81da499e4864ace0d86c5"; + } + + public override void OnConnectedOutputNodeChanges( int inputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( inputPortId, otherNodeId, otherPortId, name, type ); + UpdateConnection( inputPortId ); + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + UpdateConnection( portId ); + } + + public override void OnInputPortDisconnected( int portId ) + { + UpdateConnection( portId ); + } + + void TestMainInputDataType() + { + WirePortDataType newType = WirePortDataType.FLOAT; + if( m_inputPorts[ 0 ].IsConnected && UIUtils.GetPriority( m_inputPorts[ 0 ].DataType ) > UIUtils.GetPriority( newType ) ) + { + newType = m_inputPorts[ 0 ].DataType; + } + + if( m_inputPorts[ 1 ].IsConnected && ( UIUtils.GetPriority( m_inputPorts[ 1 ].DataType ) > UIUtils.GetPriority( newType ) ) ) + { + newType = m_inputPorts[ 1 ].DataType; + } + + if( m_inputPorts[ 5 ].IsConnected && ( UIUtils.GetPriority( m_inputPorts[ 5 ].DataType ) > UIUtils.GetPriority( newType ) ) ) + { + newType = m_inputPorts[ 5 ].DataType; + } + + m_inputMainDataType = newType; + } + + void TestMainOutputDataType() + { + WirePortDataType newType = WirePortDataType.FLOAT; + for( int i = 2; i < 5; i++ ) + { + if( m_inputPorts[ i ].IsConnected && ( UIUtils.GetPriority( m_inputPorts[ i ].DataType ) > UIUtils.GetPriority( newType ) ) ) + { + newType = m_inputPorts[ i ].DataType; + } + } + + if( newType != m_outputMainDataType ) + { + m_outputMainDataType = newType; + m_outputPorts[ 0 ].ChangeType( m_outputMainDataType, false ); + } + } + + public void UpdateConnection( int portId ) + { + m_inputPorts[ portId ].MatchPortToConnection(); + switch( portId ) + { + case 0: + case 1: + case 5: + { + TestMainInputDataType(); + } + break; + case 2: + case 3: + case 4: + { + TestMainOutputDataType(); + } + break; + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + string a = m_inputPorts[ 0 ].GenerateShaderForOutput( ref dataCollector, m_inputMainDataType, ignoreLocalvar, true ); + string b = m_inputPorts[ 1 ].GenerateShaderForOutput( ref dataCollector, m_inputMainDataType, ignoreLocalvar, true ); + string r1 = m_inputPorts[ 2 ].GenerateShaderForOutput( ref dataCollector, m_outputMainDataType, ignoreLocalvar, true ); + string r2 = m_inputPorts[ 3 ].GenerateShaderForOutput( ref dataCollector, m_outputMainDataType, ignoreLocalvar, true ); + string r3 = m_inputPorts[ 4 ].GenerateShaderForOutput( ref dataCollector, m_outputMainDataType, ignoreLocalvar, true ); + string tr = m_inputPorts[ 5 ].GenerateShaderForOutput( ref dataCollector, m_inputMainDataType, ignoreLocalvar, true ); + + // No Equal Threshold parameter + //(a > b ? r1 : a == b ? r2 : r3 ) + //string strout = " ( " + a + " > " + b + " ? " + r1 + " : " + a + " == " + b + " ? " + r2 + " : " + r3 + " ) "; + + // With Equal Threshold parameter + // ( a - tr > b ? r1 : a - tr <= b && a + tr >= b ? r2 : r3 ) + string strout = " ( " + a + " - " + tr + " > " + b + " ? " + r1 + " : " + a + " - " + tr + " <= " + b + " && " + a + " + " + tr + " >= " + b + " ? " + r2 + " : " + r3 + " ) "; + + //Debug.Log( strout ); + return CreateOutputLocalVariable( 0, strout, ref dataCollector ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCIf.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCIf.cs.meta new file mode 100644 index 0000000..8d6fe58 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCIf.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1a3d561a45c21114c99f52c5432b25e9 +timeCreated: 1481126953 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCStub.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCStub.cs new file mode 100644 index 0000000..38dd405 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCStub.cs @@ -0,0 +1,103 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + + +namespace AmplifyShaderEditor +{ + [System.Serializable] + public class TFHCStub : DynamicTypeNode + { + protected WirePortDataType m_mainInputType = WirePortDataType.FLOAT; + protected WirePortDataType m_mainOutputType = WirePortDataType.FLOAT; + protected string m_inputDataPort0 = string.Empty; + protected string m_inputDataPort1 = string.Empty; + protected string m_inputDataPort2 = string.Empty; + protected string m_inputDataPort3 = string.Empty; + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + UpdateConnections( portId ); + } + + public override void OnConnectedOutputNodeChanges( int outputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + UpdateConnections( outputPortId ); + } + + public override void OnInputPortDisconnected( int portId ) + { + int otherPortId = 0; + if ( portId < 2 ) + { + otherPortId = ( portId == 0 ) ? 1 : 0; + if ( m_inputPorts[ otherPortId ].IsConnected ) + { + m_mainInputType = m_inputPorts[ otherPortId ].DataType; + m_inputPorts[ portId ].ChangeType( m_mainInputType, false ); + } + } + else + { + otherPortId = ( portId == 2 ) ? 3 : 2; + if ( m_inputPorts[ otherPortId ].IsConnected ) + { + m_mainOutputType = m_inputPorts[ otherPortId ].DataType; + m_inputPorts[ portId ].ChangeType( m_mainOutputType, false ); + m_outputPorts[ 0 ].ChangeType( m_mainOutputType, false ); + } + } + } + + public void GetInputData( ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + //Conditional Operator ?: has some shenanigans + //If the first operand is of type bool, one of the following must hold for the second and third operands: + //Both operands have compatible structure types. + //Both operands are scalars with numeric or bool type. + //Both operands are vectors with numeric or bool type, where the two vectors are of the same size, which is less than or equal to four. + //If the first operand is a packed vector of bool, then the conditional selection is performed on an elementwise basis.Both the second and third operands must be numeric vectors of the same size as the first operand. + WirePortDataType compatibleInputType = m_mainInputType; + if ( m_mainInputType != WirePortDataType.FLOAT && m_mainInputType != WirePortDataType.INT && m_mainInputType != m_mainOutputType ) + { + compatibleInputType = m_mainOutputType; + } + + m_inputDataPort0 = m_inputPorts[ 0 ].GenerateShaderForOutput( ref dataCollector, compatibleInputType, ignoreLocalvar, true ); + m_inputDataPort1 = m_inputPorts[ 1 ].GenerateShaderForOutput( ref dataCollector, compatibleInputType, ignoreLocalvar, true ); + + + m_inputDataPort2 = m_inputPorts[ 2 ].GenerateShaderForOutput( ref dataCollector, m_mainOutputType, ignoreLocalvar, true ); + m_inputDataPort3 = m_inputPorts[ 3 ].GenerateShaderForOutput( ref dataCollector, m_mainOutputType, ignoreLocalvar, true ); + } + + void UpdateConnections( int portId ) + { + m_inputPorts[ portId ].MatchPortToConnection(); + int otherPortId = 0; + WirePortDataType otherPortType = WirePortDataType.FLOAT; + if ( portId < 2 ) + { + otherPortId = ( portId == 0 ) ? 1 : 0; + otherPortType = m_inputPorts[ otherPortId ].IsConnected ? m_inputPorts[ otherPortId ].DataType : WirePortDataType.FLOAT; + m_mainInputType = UIUtils.GetPriority( m_inputPorts[ portId ].DataType ) > UIUtils.GetPriority( otherPortType ) ? m_inputPorts[ portId ].DataType : otherPortType; + if ( !m_inputPorts[ otherPortId ].IsConnected ) + { + m_inputPorts[ otherPortId ].ChangeType( m_mainInputType, false ); + } + } + else + { + otherPortId = ( portId == 2 ) ? 3 : 2; + otherPortType = m_inputPorts[ otherPortId ].IsConnected ? m_inputPorts[ otherPortId ].DataType : WirePortDataType.FLOAT; + m_mainOutputType = UIUtils.GetPriority( m_inputPorts[ portId ].DataType ) > UIUtils.GetPriority( otherPortType ) ? m_inputPorts[ portId ].DataType : otherPortType; + + m_outputPorts[ 0 ].ChangeType( m_mainOutputType, false ); + + if ( !m_inputPorts[ otherPortId ].IsConnected ) + { + m_inputPorts[ otherPortId ].ChangeType( m_mainOutputType, false ); + } + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCStub.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCStub.cs.meta new file mode 100644 index 0000000..ca618e7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/LogicalOperators/TFHCStub.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 67238b98f61049c45b496af625863edf +timeCreated: 1481646118 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master.meta new file mode 100644 index 0000000..e014e2d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 7787d08c0679d324c99a7ca9a1a3e6a4 +folderAsset: yes +timeCreated: 1481126946 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/AdditionalDefinesHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/AdditionalDefinesHelper.cs new file mode 100644 index 0000000..7aa08d9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/AdditionalDefinesHelper.cs @@ -0,0 +1,140 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class AdditionalDefinesHelper + { + private const string AdditionalDefinesStr = " Additional Defines"; + private const float ShaderKeywordButtonLayoutWidth = 15; + private ParentNode m_currentOwner; + + [SerializeField] + private List m_additionalDefines = new List(); + public List DefineList { get { return m_additionalDefines; } set { m_additionalDefines = value; } } + + [SerializeField] + private List m_outsideDefines = new List(); + public List OutsideList { get { return m_outsideDefines; } set { m_outsideDefines = value; } } + + public void Draw( ParentNode owner ) + { + m_currentOwner = owner; + bool value = owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedAdditionalDefines; + NodeUtils.DrawPropertyGroup( ref value, AdditionalDefinesStr, DrawMainBody, DrawButtons ); + owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedAdditionalDefines = value; + } + + void DrawButtons() + { + EditorGUILayout.Separator(); + + // Add keyword + if( GUILayout.Button( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + m_additionalDefines.Add( string.Empty ); + EditorGUI.FocusTextInControl( null ); + } + + //Remove keyword + if( GUILayout.Button( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + if( m_additionalDefines.Count > 0 ) + { + m_additionalDefines.RemoveAt( m_additionalDefines.Count - 1 ); + EditorGUI.FocusTextInControl( null ); + } + } + } + + void DrawMainBody() + { + EditorGUILayout.Separator(); + int itemCount = m_additionalDefines.Count; + int markedToDelete = -1; + for( int i = 0; i < itemCount; i++ ) + { + EditorGUILayout.BeginHorizontal(); + { + EditorGUI.BeginChangeCheck(); + m_additionalDefines[ i ] = EditorGUILayout.TextField( m_additionalDefines[ i ] ); + if( EditorGUI.EndChangeCheck() ) + { + m_additionalDefines[ i ] = UIUtils.RemoveShaderInvalidCharacters( m_additionalDefines[ i ] ); + } + + // Add new port + if( m_currentOwner.GUILayoutButton( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + m_additionalDefines.Insert( i + 1, string.Empty ); + EditorGUI.FocusTextInControl( null ); + } + + //Remove port + if( m_currentOwner.GUILayoutButton( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + markedToDelete = i; + } + } + EditorGUILayout.EndHorizontal(); + } + + if( markedToDelete > -1 ) + { + if( m_additionalDefines.Count > markedToDelete ) + { + m_additionalDefines.RemoveAt( markedToDelete ); + EditorGUI.FocusTextInControl( null ); + } + } + EditorGUILayout.Separator(); + EditorGUILayout.HelpBox( "Please add your defines without the #define keywords", MessageType.Info ); + } + + public void ReadFromString( ref uint index, ref string[] nodeParams ) + { + int count = Convert.ToInt32( nodeParams[ index++ ] ); + for( int i = 0; i < count; i++ ) + { + m_additionalDefines.Add( nodeParams[ index++ ] ); + } + } + + public void WriteToString( ref string nodeInfo ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_additionalDefines.Count ); + for( int i = 0; i < m_additionalDefines.Count; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_additionalDefines[ i ] ); + } + } + + public void AddToDataCollector( ref MasterNodeDataCollector dataCollector ) + { + for( int i = 0; i < m_additionalDefines.Count; i++ ) + { + if( !string.IsNullOrEmpty( m_additionalDefines[ i ] ) ) + dataCollector.AddToDefines( -1, m_additionalDefines[ i ] ); + } + + for( int i = 0; i < m_outsideDefines.Count; i++ ) + { + if( !string.IsNullOrEmpty( m_outsideDefines[ i ] ) ) + dataCollector.AddToDefines( -1, m_outsideDefines[ i ] ); + } + } + + public void Destroy() + { + m_additionalDefines.Clear(); + m_additionalDefines = null; + m_currentOwner = null; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/AdditionalDefinesHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/AdditionalDefinesHelper.cs.meta new file mode 100644 index 0000000..6839c0e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/AdditionalDefinesHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0801a5994efb46142ad8dcc0fe3c47f8 +timeCreated: 1513252939 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/AdditionalIncludesHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/AdditionalIncludesHelper.cs new file mode 100644 index 0000000..542b586 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/AdditionalIncludesHelper.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class AdditionalIncludesHelper + { + private const string AdditionalIncludesStr = " Additional Includes"; + private const float ShaderKeywordButtonLayoutWidth = 15; + private ParentNode m_currentOwner; + + [SerializeField] + private List m_additionalIncludes = new List(); + public List IncludeList { get { return m_additionalIncludes; } set { m_additionalIncludes = value; } } + + [SerializeField] + private List m_outsideIncludes = new List(); + public List OutsideList { get { return m_outsideIncludes; } set { m_outsideIncludes = value; } } + + public void Draw( ParentNode owner ) + { + m_currentOwner = owner; + bool value = owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedAdditionalIncludes; + NodeUtils.DrawPropertyGroup( ref value, AdditionalIncludesStr, DrawMainBody, DrawButtons ); + owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedAdditionalIncludes = value; + + } + + void DrawButtons() + { + EditorGUILayout.Separator(); + + // Add keyword + if( GUILayout.Button( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + m_additionalIncludes.Add( string.Empty ); + EditorGUI.FocusTextInControl( null ); + } + + //Remove keyword + if( GUILayout.Button( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + if( m_additionalIncludes.Count > 0 ) + { + m_additionalIncludes.RemoveAt( m_additionalIncludes.Count - 1 ); + EditorGUI.FocusTextInControl( null ); + } + } + } + + void DrawMainBody() + { + EditorGUILayout.Separator(); + //if( OutsideList != null && OutsideList.Count > 0 ) + //{ + // m_drawElements.Clear(); + // EditorGUI.BeginDisabledGroup( true ); + // int outsideCount = OutsideList.Count; + // for( int i = 0; i < outsideCount; i++ ) + // { + // if( !m_drawElements.Contains( OutsideList[ i ] ) ) + // { + // m_drawElements.Add( OutsideList[ i ] ); + // EditorGUILayout.TextField( OutsideList[ i ] ); + // } + // } + // EditorGUI.EndDisabledGroup(); + // EditorGUILayout.Separator(); + //} + int itemCount = m_additionalIncludes.Count; + int markedToDelete = -1; + for( int i = 0; i < itemCount; i++ ) + { + EditorGUILayout.BeginHorizontal(); + { + EditorGUI.BeginChangeCheck(); + m_additionalIncludes[ i ] = EditorGUILayout.TextField( m_additionalIncludes[ i ] ); + if( EditorGUI.EndChangeCheck() ) + { + m_additionalIncludes[ i ] = UIUtils.RemoveShaderInvalidCharacters( m_additionalIncludes[ i ] ); + } + + // Add new port + if( m_currentOwner.GUILayoutButton( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + m_additionalIncludes.Insert( i + 1, string.Empty ); + EditorGUI.FocusTextInControl( null ); + } + + //Remove port + if( m_currentOwner.GUILayoutButton( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + markedToDelete = i; + } + } + EditorGUILayout.EndHorizontal(); + } + + if( markedToDelete > -1 ) + { + if( m_additionalIncludes.Count > markedToDelete ) + { + m_additionalIncludes.RemoveAt( markedToDelete ); + EditorGUI.FocusTextInControl( null ); + } + } + EditorGUILayout.Separator(); + EditorGUILayout.HelpBox( "Please add your includes without the #include \"\" keywords", MessageType.Info ); + } + + public void ReadFromString( ref uint index, ref string[] nodeParams ) + { + int count = Convert.ToInt32( nodeParams[ index++ ] ); + for( int i = 0; i < count; i++ ) + { + m_additionalIncludes.Add( nodeParams[ index++ ] ); + } + } + + public void WriteToString( ref string nodeInfo ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_additionalIncludes.Count ); + for( int i = 0; i < m_additionalIncludes.Count; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_additionalIncludes[ i ] ); + } + } + + public void AddToDataCollector( ref MasterNodeDataCollector dataCollector ) + { + for( int i = 0; i < m_additionalIncludes.Count; i++ ) + { + if( !string.IsNullOrEmpty( m_additionalIncludes[ i ] ) ) + dataCollector.AddToIncludes( -1, m_additionalIncludes[ i ] ); + } + + for( int i = 0; i < m_outsideIncludes.Count; i++ ) + { + if( !string.IsNullOrEmpty( m_outsideIncludes[ i ] ) ) + dataCollector.AddToIncludes( -1, m_outsideIncludes[ i ] ); + } + } + + public void Destroy() + { + m_additionalIncludes.Clear(); + m_additionalIncludes = null; + m_currentOwner = null; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/AdditionalIncludesHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/AdditionalIncludesHelper.cs.meta new file mode 100644 index 0000000..0997164 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/AdditionalIncludesHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 74ff3d342e013f64198aaf767e623962 +timeCreated: 1498123240 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/AdditionalPragmasHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/AdditionalPragmasHelper.cs new file mode 100644 index 0000000..a7e8970 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/AdditionalPragmasHelper.cs @@ -0,0 +1,141 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class AdditionalPragmasHelper + { + private const string AdditionalPragmasStr = " Additional Pragmas"; + private const float ShaderKeywordButtonLayoutWidth = 15; + private ParentNode m_currentOwner; + + [SerializeField] + private List m_additionalPragmas = new List(); + public List PragmaList { get { return m_additionalPragmas; } set { m_additionalPragmas = value; } } + + [SerializeField] + private List m_outsidePragmas = new List(); + public List OutsideList { get { return m_outsidePragmas; } set { m_outsidePragmas = value; } } + + public void Draw( ParentNode owner ) + { + m_currentOwner = owner; + bool value = owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedAdditionalPragmas; + NodeUtils.DrawPropertyGroup( ref value, AdditionalPragmasStr, DrawMainBody, DrawButtons ); + owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedAdditionalPragmas = value; + + } + + void DrawButtons() + { + EditorGUILayout.Separator(); + + // Add keyword + if( GUILayout.Button( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + m_additionalPragmas.Add( string.Empty ); + EditorGUI.FocusTextInControl( null ); + } + + //Remove keyword + if( GUILayout.Button( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + if( m_additionalPragmas.Count > 0 ) + { + m_additionalPragmas.RemoveAt( m_additionalPragmas.Count - 1 ); + EditorGUI.FocusTextInControl( null ); + } + } + } + + void DrawMainBody() + { + EditorGUILayout.Separator(); + int itemCount = m_additionalPragmas.Count; + int markedToDelete = -1; + for( int i = 0; i < itemCount; i++ ) + { + EditorGUILayout.BeginHorizontal(); + { + EditorGUI.BeginChangeCheck(); + m_additionalPragmas[ i ] = EditorGUILayout.TextField( m_additionalPragmas[ i ] ); + if( EditorGUI.EndChangeCheck() ) + { + m_additionalPragmas[ i ] = UIUtils.RemoveShaderInvalidCharacters( m_additionalPragmas[ i ] ); + } + + // Add new port + if( m_currentOwner.GUILayoutButton( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + m_additionalPragmas.Insert( i + 1, string.Empty ); + EditorGUI.FocusTextInControl( null ); + } + + //Remove port + if( m_currentOwner.GUILayoutButton( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + markedToDelete = i; + } + } + EditorGUILayout.EndHorizontal(); + } + + if( markedToDelete > -1 ) + { + if( m_additionalPragmas.Count > markedToDelete ) + { + m_additionalPragmas.RemoveAt( markedToDelete ); + EditorGUI.FocusTextInControl( null ); + } + } + EditorGUILayout.Separator(); + EditorGUILayout.HelpBox( "Please add your pragmas without the #pragma keywords", MessageType.Info ); + } + + public void ReadFromString( ref uint index, ref string[] nodeParams ) + { + int count = Convert.ToInt32( nodeParams[ index++ ] ); + for( int i = 0; i < count; i++ ) + { + m_additionalPragmas.Add( nodeParams[ index++ ] ); + } + } + + public void WriteToString( ref string nodeInfo ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_additionalPragmas.Count ); + for( int i = 0; i < m_additionalPragmas.Count; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_additionalPragmas[ i ] ); + } + } + + public void AddToDataCollector( ref MasterNodeDataCollector dataCollector ) + { + for( int i = 0; i < m_additionalPragmas.Count; i++ ) + { + if( !string.IsNullOrEmpty( m_additionalPragmas[ i ] ) ) + dataCollector.AddToPragmas( -1, m_additionalPragmas[ i ] ); + } + + for( int i = 0; i < m_outsidePragmas.Count; i++ ) + { + if( !string.IsNullOrEmpty( m_outsidePragmas[ i ] ) ) + dataCollector.AddToPragmas( -1, m_outsidePragmas[ i ] ); + } + } + + public void Destroy() + { + m_additionalPragmas.Clear(); + m_additionalPragmas = null; + m_currentOwner = null; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/AdditionalPragmasHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/AdditionalPragmasHelper.cs.meta new file mode 100644 index 0000000..3f245aa --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/AdditionalPragmasHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3153b4d10effd174988d75b84b12d281 +timeCreated: 1504515475 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/AdditionalSurfaceOptionsHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/AdditionalSurfaceOptionsHelper.cs new file mode 100644 index 0000000..cd3efae --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/AdditionalSurfaceOptionsHelper.cs @@ -0,0 +1,153 @@ +using System; +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + + [Serializable] + public class AdditionalSurfaceOptionsHelper + { + private const string AdditionalOptionsStr = " Additional Surface Options"; + + + private const float ShaderKeywordButtonLayoutWidth = 15; + private ParentNode m_currentOwner; + + [SerializeField] + private List m_availableOptions = new List(); + + public void Draw( ParentNode owner ) + { + m_currentOwner = owner; + bool value = owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedAdditionalSurfaceOptions; + NodeUtils.DrawPropertyGroup( ref value, AdditionalOptionsStr, DrawMainBody, DrawButtons ); + owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedAdditionalSurfaceOptions = value; + } + + void DrawButtons() + { + EditorGUILayout.Separator(); + + // Add tag + if( GUILayout.Button( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + m_availableOptions.Add( string.Empty ); + EditorGUI.FocusTextInControl( null ); + } + + //Remove tag + if( GUILayout.Button( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + if( m_availableOptions.Count > 0 ) + { + m_availableOptions.RemoveAt( m_availableOptions.Count - 1 ); + EditorGUI.FocusTextInControl( null ); + } + } + } + + void DrawMainBody() + { + EditorGUILayout.Separator(); + int itemCount = m_availableOptions.Count; + + if( itemCount == 0 ) + { + EditorGUILayout.HelpBox( "Your list is Empty!\nUse the plus button to add one.", MessageType.Info ); + } + + int markedToDelete = -1; + float originalLabelWidth = EditorGUIUtility.labelWidth; + for( int i = 0; i < itemCount; i++ ) + { + + EditorGUI.indentLevel += 1; + EditorGUIUtility.labelWidth = 62; + EditorGUILayout.BeginHorizontal(); + //Option + EditorGUI.BeginChangeCheck(); + m_availableOptions[ i ] = EditorGUILayout.TextField( "["+i+"] -", m_availableOptions[ i ] ); + if( EditorGUI.EndChangeCheck() ) + { + m_availableOptions[ i ] = UIUtils.RemoveShaderInvalidCharacters( m_availableOptions[ i ] ); + } + + EditorGUIUtility.labelWidth = originalLabelWidth; + + { + // Add new port + if( m_currentOwner.GUILayoutButton( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + m_availableOptions.Insert( i + 1, string.Empty ); + EditorGUI.FocusTextInControl( null ); + } + + //Remove port + if( m_currentOwner.GUILayoutButton( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + markedToDelete = i; + } + } + EditorGUILayout.EndHorizontal(); + EditorGUI.indentLevel -= 1; + } + + if( markedToDelete > -1 ) + { + if( m_availableOptions.Count > markedToDelete ) + { + m_availableOptions.RemoveAt( markedToDelete ); + EditorGUI.FocusTextInControl( null ); + } + } + EditorGUILayout.Separator(); + } + + public void ReadFromString( ref uint index, ref string[] nodeParams ) + { + int count = Convert.ToInt32( nodeParams[ index++ ] ); + for( int i = 0; i < count; i++ ) + { + m_availableOptions.Add( nodeParams[ index++ ] ); + } + } + + public void WriteToString( ref string nodeInfo ) + { + int optionsCount = m_availableOptions.Count; + IOUtils.AddFieldValueToString( ref nodeInfo, optionsCount ); + for( int i = 0; i < optionsCount; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_availableOptions[ i ].ToString() ); + } + } + + public void WriteToOptionalSurfaceOptions( ref string currentOptions ) + { + int tagsCount = m_availableOptions.Count; + if( tagsCount == 0 ) + return; + + string result = " "; + + for( int i = 0; i < tagsCount; i++ ) + { + result += m_availableOptions[ i ]; + if( i < tagsCount - 1 ) + { + result += " "; + } + } + currentOptions = currentOptions + result; + } + + public void Destroy() + { + m_availableOptions.Clear(); + m_availableOptions = null; + m_currentOwner = null; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/AdditionalSurfaceOptionsHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/AdditionalSurfaceOptionsHelper.cs.meta new file mode 100644 index 0000000..ccd630e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/AdditionalSurfaceOptionsHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d830b2cc8bc5e174485077319135fc1e +timeCreated: 1528881842 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/BillboardOpHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/BillboardOpHelper.cs new file mode 100644 index 0000000..87cc202 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/BillboardOpHelper.cs @@ -0,0 +1,249 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +// Billboard based on: +// https://gist.github.com/renaudbedard/7a90ec4a5a7359712202 +using System; +using UnityEngine; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + public enum BillboardType + { + Cylindrical, + Spherical + } + + [Serializable] + public class BillboardOpHelper + { + public static readonly string BillboardTitleStr = " Billboard"; + public static readonly string BillboardTypeStr = "Type"; + public static readonly string BillboardRotIndStr = "Ignore Rotation"; + + public static readonly string[] BillboardCylindricalInstructions = { "//Calculate new billboard vertex position and normal", + "float3 upCamVec = float3( 0, 1, 0 )"}; + + public static readonly string[] BillboardSphericalInstructions = { "//Calculate new billboard vertex position and normal", + "float3 upCamVec = normalize ( UNITY_MATRIX_V._m10_m11_m12 )"}; + + + public static readonly string[] BillboardCommonInstructions = { "float3 forwardCamVec = -normalize ( UNITY_MATRIX_V._m20_m21_m22 )", + "float3 rightCamVec = normalize( UNITY_MATRIX_V._m00_m01_m02 )", + "float4x4 rotationCamMatrix = float4x4( rightCamVec, 0, upCamVec, 0, forwardCamVec, 0, 0, 0, 0, 1 )", + "{0} = normalize( mul( float4( {0} , 0 ), rotationCamMatrix )).xyz"}; + + public static readonly string[] BillboardRotDependent = { "//This unfortunately must be made to take non-uniform scaling into account", + "//Transform to world coords, apply rotation and transform back to local", + "{0} = mul( {1} , unity_ObjectToWorld ){2}", + "{0} = mul( {1} , rotationCamMatrix ){2}", + "{0} = mul( {1} , unity_WorldToObject ){2}"}; + + + public static readonly string[] BillboardRotIndependent = { "{0}.x *= length( unity_ObjectToWorld._m00_m10_m20 )", + "{0}.y *= length( unity_ObjectToWorld._m01_m11_m21 )", + "{0}.z *= length( unity_ObjectToWorld._m02_m12_m22 )", + "{0} = mul( {0}, rotationCamMatrix )", + "{0}.xyz += unity_ObjectToWorld._m03_m13_m23", + "//Need to nullify rotation inserted by generated surface shader", + "{0} = mul( unity_WorldToObject, {0} )"}; + + + + public static readonly string[] BillboardHDRotDependent = { "//This unfortunately must be made to take non-uniform scaling into account", + "//Transform to world coords, apply rotation and transform back to local", + "{0} = mul( {1} , GetObjectToWorldMatrix() ){2}", + "{0} = mul( {1} , rotationCamMatrix ){2}", + "{0} = mul( {1} , GetWorldToObjectMatrix() ){2}"}; + + + public static readonly string[] BillboardHDRotIndependent = { "{0}.x *= length( GetObjectToWorldMatrix()._m00_m10_m20 )", + "{0}.y *= length( GetObjectToWorldMatrix()._m01_m11_m21 )", + "{0}.z *= length( GetObjectToWorldMatrix()._m02_m12_m22 )", + "{0} = mul( {0}, rotationCamMatrix )", + //Had to comment this one out in HDRP since it was moving the vertices to incorrect locations + // Over HDRP the correct results are achievied without having to do this operation + //This is because the vertex position variable is a float3 and an implicit cast is done to float4 + //with w set to 0, this makes the multiplication below only affects rotation and not translation + //thus no adding the world translation is needed to counter the GetObjectToWorldMatrix() operation + "//{0}.xyz += GetObjectToWorldMatrix()._m03_m13_m23", + "//Need to nullify rotation inserted by generated surface shader", + "{0} = mul( GetWorldToObjectMatrix(), {0} )"}; + + + [SerializeField] + private bool m_isBillboard = false; + + [SerializeField] + private BillboardType m_billboardType = BillboardType.Cylindrical; + + [SerializeField] + private bool m_rotationIndependent = false; + + public void Draw( ParentNode owner ) + { + bool visible = owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedVertexOptions; + bool enabled = m_isBillboard; + NodeUtils.DrawPropertyGroup( owner, ref visible, ref m_isBillboard, BillboardTitleStr, () => + { + m_billboardType = (BillboardType)owner.EditorGUILayoutEnumPopup( BillboardTypeStr, m_billboardType ); + m_rotationIndependent = owner.EditorGUILayoutToggle( BillboardRotIndStr, m_rotationIndependent ); + } ); + + owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedVertexOptions = visible; + if( m_isBillboard != enabled ) + { + UIUtils.RequestSave(); + } + } + public void FillDataCollectorWithInternalData( ref MasterNodeDataCollector dataCollector ) + { + if( m_isBillboard ) + { + FillDataCollector( ref dataCollector, m_billboardType, m_rotationIndependent, "v.vertex", "v.normal", false ); + } + } + + + // This should be called after the Vertex Offset and Vertex Normal ports are analised + public static void FillDataCollector( ref MasterNodeDataCollector dataCollector, BillboardType billboardType, bool rotationIndependent, string vertexPosValue, string vertexNormalValue, bool vertexIsFloat3 ) + { + switch( billboardType ) + { + case BillboardType.Cylindrical: + { + for( int i = 0; i < BillboardCylindricalInstructions.Length; i++ ) + { + dataCollector.AddVertexInstruction( BillboardCylindricalInstructions[ i ] + ( dataCollector.IsTemplate ? ";" : string.Empty ), -1, true ); + } + } + break; + + case BillboardType.Spherical: + { + for( int i = 0; i < BillboardCylindricalInstructions.Length; i++ ) + { + dataCollector.AddVertexInstruction( BillboardSphericalInstructions[ i ] + ( dataCollector.IsTemplate ? ";" : string.Empty ), -1, true ); + } + } + break; + } + + for( int i = 0; i < BillboardCommonInstructions.Length; i++ ) + { + string value = ( i == 3 ) ? string.Format( BillboardCommonInstructions[ i ], vertexNormalValue ) : BillboardCommonInstructions[ i ]; + dataCollector.AddVertexInstruction( value + ( dataCollector.IsTemplate ? ";" : string.Empty ), -1, true ); + } + + if( rotationIndependent ) + { + for( int i = 0; i < BillboardRotIndependent.Length; i++ ) + { + string value = string.Empty; + if( dataCollector.IsTemplate && dataCollector.TemplateDataCollectorInstance.CurrentSRPType != TemplateSRPType.BuiltIn ) + { + value = ( i != 5 ) ? string.Format( BillboardHDRotIndependent[ i ], vertexPosValue ) : BillboardHDRotIndependent[ i ]; + } + else + { + value = ( i != 5 ) ? string.Format( BillboardRotIndependent[ i ], vertexPosValue ) : BillboardRotIndependent[ i ]; + } + dataCollector.AddVertexInstruction( value + ( dataCollector.IsTemplate ? ";" : string.Empty ), -1, true ); + } + } + else + { + string vertexPosConverted = vertexIsFloat3 ? string.Format( "float4({0},0)", vertexPosValue ) : vertexPosValue; + for( int i = 0; i < BillboardRotDependent.Length; i++ ) + { + string value = string.Empty; + if( dataCollector.IsTemplate && dataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.HD ) + { + value = ( i > 1 ) ? string.Format( BillboardHDRotDependent[ i ], vertexPosValue, vertexPosConverted, ( vertexIsFloat3 ? ".xyz" : string.Empty ) ) : BillboardHDRotDependent[ i ]; + } + else + { + value = ( i > 1 ) ? string.Format( BillboardRotDependent[ i ], vertexPosValue, vertexPosConverted, ( vertexIsFloat3 ? ".xyz" : string.Empty ) ) : BillboardRotDependent[ i ]; + } + dataCollector.AddVertexInstruction( value + ( dataCollector.IsTemplate ? ";" : string.Empty ), -1, true ); + } + } + } + + public string[] GetInternalMultilineInstructions() + { + // This method is only used on Surface ... no HD variation is needed + return GetMultilineInstructions( m_billboardType, m_rotationIndependent, "v.vertex", "v.normal" ); + } + + public static string[] GetMultilineInstructions( BillboardType billboardType, bool rotationIndependent, string vertexPosValue, string vertexNormalValue ) + { + // This method is only used on Surface ... no HD variation is needed + List body = new List(); + switch( billboardType ) + { + case BillboardType.Cylindrical: + { + for( int i = 0; i < BillboardCylindricalInstructions.Length; i++ ) + { + body.Add( BillboardCylindricalInstructions[ i ] ); + } + } + break; + + case BillboardType.Spherical: + { + for( int i = 0; i < BillboardCylindricalInstructions.Length; i++ ) + { + body.Add( BillboardSphericalInstructions[ i ] ); + } + } + break; + } + + for( int i = 0; i < BillboardCommonInstructions.Length; i++ ) + { + string value = ( i == 3 ) ? string.Format( BillboardCommonInstructions[ i ], vertexNormalValue ) : BillboardCommonInstructions[ i ]; + body.Add( value ); + } + + if( rotationIndependent ) + { + for( int i = 0; i < BillboardRotIndependent.Length; i++ ) + { + string value = ( i != 5 ) ? string.Format( BillboardRotIndependent[ i ], vertexPosValue ) : BillboardRotIndependent[ i ]; + body.Add( value ); + } + } + else + { + for( int i = 0; i < BillboardRotDependent.Length; i++ ) + { + string value = ( i > 1 ) ? string.Format( BillboardRotDependent[ i ], vertexPosValue ) : BillboardRotDependent[ i ]; + body.Add( value ); + } + } + return body.ToArray(); + } + + public void ReadFromString( ref uint index, ref string[] nodeParams ) + { + m_isBillboard = Convert.ToBoolean( nodeParams[ index++ ] ); + m_billboardType = (BillboardType)Enum.Parse( typeof( BillboardType ), nodeParams[ index++ ] ); + if( UIUtils.CurrentShaderVersion() > 11007 ) + { + m_rotationIndependent = Convert.ToBoolean( nodeParams[ index++ ] ); + } + } + + public void WriteToString( ref string nodeInfo ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_isBillboard ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_billboardType ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_rotationIndependent ); + } + + public bool IsBillboard { get { return m_isBillboard; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/BillboardOpHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/BillboardOpHelper.cs.meta new file mode 100644 index 0000000..812475f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/BillboardOpHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 837b906a268babc49ac733573c5b3394 +timeCreated: 1489159407 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/BlendOpsHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/BlendOpsHelper.cs new file mode 100644 index 0000000..989ace5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/BlendOpsHelper.cs @@ -0,0 +1,447 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + public enum AvailableBlendFactor + { + One = 1, + Zero = 0, + SrcColor = 3, + SrcAlpha = 5, + DstColor = 2, + DstAlpha = 7, + OneMinusSrcColor = 6, + OneMinusSrcAlpha = 10, + OneMinusDstColor = 4, + OneMinusDstAlpha = 8, + SrcAlphaSaturate = 9 + }; + + public enum AvailableBlendOps + { + OFF = 0, + Add, + Sub, + RevSub, + Min, + Max, + //Direct X11 only + LogicalClear, + LogicalSet, + LogicalCopy, + LogicalCopyInverted, + LogicalNoop, + LogicalInvert, + LogicalAnd, + LogicalNand, + LogicalOr, + LogicalNor, + LogicalXor, + LogicalEquiv, + LogicalAndReverse, + LogicalAndInverted, + LogicalOrReverse, + LogicalOrInverted + }; + + public class CommonBlendTypes + { + public string Name; + public AvailableBlendFactor SourceFactor; + public AvailableBlendFactor DestFactor; + public CommonBlendTypes( string name, AvailableBlendFactor sourceFactor, AvailableBlendFactor destFactor ) + { + Name = name; + SourceFactor = sourceFactor; + DestFactor = destFactor; + } + } + + [Serializable] + public class BlendOpsHelper + { + public static readonly string[] BlendOpsLabels = + { + "", + "Add", + "Sub", + "RevSub", + "Min", + "Max", + "LogicalClear ( DX11.1 Only )", + "LogicalSet ( DX11.1 Only )", + "LogicalCopy ( DX11.1 Only )", + "LogicalCopyInverted ( DX11.1 Only )", + "LogicalNoop ( DX11.1 Only )", + "LogicalInvert ( DX11.1 Only )", + "LogicalAnd ( DX11.1 Only )", + "LogicalNand ( DX11.1 Only )", + "LogicalOr ( DX11.1 Only )", + "LogicalNor ( DX11.1 Only )", + "LogicalXor ( DX11.1 Only )", + "LogicalEquiv ( DX11.1 Only )", + "LogicalAndReverse ( DX11.1 Only )", + "LogicalAndInverted ( DX11.1 Only )", + "LogicalOrReverse ( DX11.1 Only )", + "LogicalOrInverted ( DX11.1 Only )" + }; + + private const string BlendModesRGBStr = "Blend RGB"; + private const string BlendModesAlphaStr = "Blend Alpha"; + + private const string BlendOpsRGBStr = "Blend Op RGB"; + private const string BlendOpsAlphaStr = "Blend Op Alpha"; + + private const string SourceFactorStr = "Src"; + private const string DstFactorStr = "Dst"; + + private const string SingleBlendFactorStr = "Blend {0} {1}"; + private const string SeparateBlendFactorStr = "Blend {0} {1} , {2} {3}"; + + private const string SingleBlendOpStr = "BlendOp {0}"; + private const string SeparateBlendOpStr = "BlendOp {0} , {1}"; + + private string[] m_commonBlendTypesArr; + private List m_commonBlendTypes = new List { new CommonBlendTypes("", AvailableBlendFactor.Zero, AvailableBlendFactor.Zero ), + new CommonBlendTypes("Custom", AvailableBlendFactor.Zero, AvailableBlendFactor.Zero ) , + new CommonBlendTypes("Alpha Blend", AvailableBlendFactor.SrcAlpha, AvailableBlendFactor.OneMinusSrcAlpha ) , + new CommonBlendTypes("Premultiplied", AvailableBlendFactor.One, AvailableBlendFactor.OneMinusSrcAlpha ), + new CommonBlendTypes("Additive", AvailableBlendFactor.One, AvailableBlendFactor.One ), + new CommonBlendTypes("Soft Additive", AvailableBlendFactor.OneMinusDstColor, AvailableBlendFactor.One ), + new CommonBlendTypes("Multiplicative", AvailableBlendFactor.DstColor, AvailableBlendFactor.Zero ), + new CommonBlendTypes("2x Multiplicative", AvailableBlendFactor.DstColor, AvailableBlendFactor.SrcColor ), + new CommonBlendTypes("Particle Additive", AvailableBlendFactor.SrcAlpha, AvailableBlendFactor.One ),}; + + [SerializeField] + private bool m_enabled = false; + + // Blend Factor + // RGB + [SerializeField] + private int m_currentIndex = 0; + + + [SerializeField] + private InlineProperty m_sourceFactorRGB = new InlineProperty( 0 ); + + [SerializeField] + private InlineProperty m_destFactorRGB = new InlineProperty( 0 ); + + // Alpha + [SerializeField] + private int m_currentAlphaIndex = 0; + + [SerializeField] + private InlineProperty m_sourceFactorAlpha = new InlineProperty( 0 ); + + [SerializeField] + private InlineProperty m_destFactorAlpha = new InlineProperty( 0 ); + + //Blend Ops + [SerializeField] + private bool m_blendOpEnabled = false; + + [SerializeField] + private InlineProperty m_blendOpRGB = new InlineProperty( 0 ); + + [SerializeField] + private InlineProperty m_blendOpAlpha = new InlineProperty( 0 ); + + public BlendOpsHelper() + { + m_commonBlendTypesArr = new string[ m_commonBlendTypes.Count ]; + for( int i = 0; i < m_commonBlendTypesArr.Length; i++ ) + { + m_commonBlendTypesArr[ i ] = m_commonBlendTypes[ i ].Name; + } + } + + public void Draw( UndoParentNode owner, bool customBlendAvailable ) + { + m_enabled = customBlendAvailable; + + // RGB + EditorGUI.BeginChangeCheck(); + m_currentIndex = owner.EditorGUILayoutPopup( BlendModesRGBStr, m_currentIndex, m_commonBlendTypesArr ); + if( EditorGUI.EndChangeCheck() ) + { + if( m_currentIndex > 1 ) + { + m_sourceFactorRGB.IntValue = (int)m_commonBlendTypes[ m_currentIndex ].SourceFactor; + m_sourceFactorRGB.SetInlineNodeValue(); + + m_destFactorRGB.IntValue = (int)m_commonBlendTypes[ m_currentIndex ].DestFactor; + m_destFactorRGB.SetInlineNodeValue(); + } + } + EditorGUI.BeginDisabledGroup( m_currentIndex == 0 ); + + EditorGUI.BeginChangeCheck(); + float cached = EditorGUIUtility.labelWidth; + EditorGUIUtility.labelWidth = 40; + + EditorGUILayout.BeginHorizontal(); + AvailableBlendFactor tempCast = (AvailableBlendFactor)m_sourceFactorRGB.IntValue; + m_sourceFactorRGB.CustomDrawer( ref owner, ( x ) => { tempCast = (AvailableBlendFactor)x.EditorGUILayoutEnumPopup( SourceFactorStr, tempCast ); }, SourceFactorStr ); + m_sourceFactorRGB.IntValue = (int)tempCast; + EditorGUI.indentLevel--; + EditorGUIUtility.labelWidth = 25; + tempCast = (AvailableBlendFactor)m_destFactorRGB.IntValue; + m_destFactorRGB.CustomDrawer( ref owner, ( x ) => { tempCast = (AvailableBlendFactor)x.EditorGUILayoutEnumPopup( DstFactorStr, tempCast ); }, DstFactorStr ); + m_destFactorRGB.IntValue = (int)tempCast; + EditorGUI.indentLevel++; + EditorGUILayout.EndHorizontal(); + + EditorGUIUtility.labelWidth = cached; + if( EditorGUI.EndChangeCheck() ) + { + CheckRGBIndex(); + } + + // Both these tests should be removed on a later stage + // ASE v154dev004 changed AvailableBlendOps.OFF value from -1 to 0 + // If importing the new package into an already opened ASE window makes + // hotcode to preserve the -1 value on these variables + if( m_blendOpRGB.FloatValue < 0 ) + m_blendOpRGB.FloatValue = 0; + + if( m_blendOpAlpha.FloatValue < 0 ) + m_blendOpAlpha.FloatValue = 0; + + EditorGUI.BeginChangeCheck(); + //AvailableBlendOps tempOpCast = (AvailableBlendOps)m_blendOpRGB.IntValue; + m_blendOpRGB.CustomDrawer( ref owner, ( x ) => { m_blendOpRGB.IntValue = x.EditorGUILayoutPopup( BlendOpsRGBStr, m_blendOpRGB.IntValue, BlendOpsLabels ); }, BlendOpsRGBStr ); + //m_blendOpRGB.IntValue = (int)tempOpCast; + if( EditorGUI.EndChangeCheck() ) + { + m_blendOpEnabled = ( !m_blendOpRGB.Active && m_blendOpRGB.IntValue > -1 ) || ( m_blendOpRGB.Active && m_blendOpRGB.NodeId > -1 );//AvailableBlendOps.OFF; + m_blendOpRGB.SetInlineNodeValue(); + } + + EditorGUI.EndDisabledGroup(); + + // Alpha + EditorGUILayout.Separator(); + + EditorGUI.BeginChangeCheck(); + m_currentAlphaIndex = owner.EditorGUILayoutPopup( BlendModesAlphaStr, m_currentAlphaIndex, m_commonBlendTypesArr ); + if( EditorGUI.EndChangeCheck() ) + { + if( m_currentAlphaIndex > 0 ) + { + m_sourceFactorAlpha.IntValue = (int)m_commonBlendTypes[ m_currentAlphaIndex ].SourceFactor; + m_sourceFactorAlpha.SetInlineNodeValue(); + + m_destFactorAlpha.IntValue = (int)m_commonBlendTypes[ m_currentAlphaIndex ].DestFactor; + m_destFactorAlpha.SetInlineNodeValue(); + } + } + EditorGUI.BeginDisabledGroup( m_currentAlphaIndex == 0 ); + + EditorGUI.BeginChangeCheck(); + cached = EditorGUIUtility.labelWidth; + EditorGUIUtility.labelWidth = 40; + EditorGUILayout.BeginHorizontal(); + tempCast = (AvailableBlendFactor)m_sourceFactorAlpha.IntValue; + m_sourceFactorAlpha.CustomDrawer( ref owner, ( x ) => { tempCast = (AvailableBlendFactor)x.EditorGUILayoutEnumPopup( SourceFactorStr, tempCast ); }, SourceFactorStr ); + m_sourceFactorAlpha.IntValue = (int)tempCast; + EditorGUI.indentLevel--; + EditorGUIUtility.labelWidth = 25; + tempCast = (AvailableBlendFactor)m_destFactorAlpha.IntValue; + m_destFactorAlpha.CustomDrawer( ref owner, ( x ) => { tempCast = (AvailableBlendFactor)x.EditorGUILayoutEnumPopup( DstFactorStr, tempCast ); }, DstFactorStr ); + m_destFactorAlpha.IntValue = (int)tempCast; + EditorGUI.indentLevel++; + EditorGUILayout.EndHorizontal(); + EditorGUIUtility.labelWidth = cached; + + if( EditorGUI.EndChangeCheck() ) + { + CheckAlphaIndex(); + } + EditorGUI.BeginChangeCheck(); + //tempOpCast = (AvailableBlendOps)m_blendOpAlpha.IntValue; + m_blendOpAlpha.CustomDrawer( ref owner, ( x ) => { m_blendOpAlpha.IntValue = x.EditorGUILayoutPopup( BlendOpsAlphaStr, m_blendOpAlpha.IntValue, BlendOpsLabels ); }, BlendOpsAlphaStr ); + //m_blendOpAlpha.IntValue = (int)tempOpCast; + if( EditorGUI.EndChangeCheck() ) + { + m_blendOpAlpha.SetInlineNodeValue(); + } + EditorGUI.EndDisabledGroup(); + EditorGUILayout.Separator(); + } + + void CheckRGBIndex() + { + int count = m_commonBlendTypes.Count; + m_currentIndex = 1; + for( int i = 1; i < count; i++ ) + { + if( m_commonBlendTypes[ i ].SourceFactor == (AvailableBlendFactor)m_sourceFactorRGB.IntValue && m_commonBlendTypes[ i ].DestFactor == (AvailableBlendFactor)m_destFactorRGB.IntValue ) + { + m_currentIndex = i; + return; + } + } + + } + + void CheckAlphaIndex() + { + int count = m_commonBlendTypes.Count; + m_currentAlphaIndex = 1; + for( int i = 1; i < count; i++ ) + { + if( m_commonBlendTypes[ i ].SourceFactor == (AvailableBlendFactor)m_sourceFactorAlpha.IntValue && m_commonBlendTypes[ i ].DestFactor == (AvailableBlendFactor)m_destFactorAlpha.IntValue ) + { + m_currentAlphaIndex = i; + if( m_currentAlphaIndex > 0 && m_currentIndex == 0 ) + m_currentIndex = 1; + return; + } + } + + if( m_currentAlphaIndex > 0 && m_currentIndex == 0 ) + m_currentIndex = 1; + } + + public void ReadFromString( ref uint index, ref string[] nodeParams ) + { + m_currentIndex = Convert.ToInt32( nodeParams[ index++ ] ); + if( UIUtils.CurrentShaderVersion() > 15103 ) + { + m_sourceFactorRGB.ReadFromString( ref index, ref nodeParams ); + m_destFactorRGB.ReadFromString( ref index, ref nodeParams ); + } + else + { + m_sourceFactorRGB.IntValue = (int)(AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), nodeParams[ index++ ] ); + m_destFactorRGB.IntValue = (int)(AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), nodeParams[ index++ ] ); + } + + m_currentAlphaIndex = Convert.ToInt32( nodeParams[ index++ ] ); + if( UIUtils.CurrentShaderVersion() > 15103 ) + { + m_sourceFactorAlpha.ReadFromString( ref index, ref nodeParams ); + m_destFactorAlpha.ReadFromString( ref index, ref nodeParams ); + + m_blendOpRGB.ReadFromString( ref index, ref nodeParams ); + m_blendOpAlpha.ReadFromString( ref index, ref nodeParams ); + if( UIUtils.CurrentShaderVersion() < 15404 ) + { + // Now BlendOps enum starts at 0 and not -1 + m_blendOpRGB.FloatValue += 1; + m_blendOpAlpha.FloatValue += 1; + } + } + else + { + m_sourceFactorAlpha.IntValue = (int)(AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), nodeParams[ index++ ] ); + m_destFactorAlpha.IntValue = (int)(AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), nodeParams[ index++ ] ); + m_blendOpRGB.IntValue = (int)(AvailableBlendOps)Enum.Parse( typeof( AvailableBlendOps ), nodeParams[ index++ ] ); + m_blendOpAlpha.IntValue = (int)(AvailableBlendOps)Enum.Parse( typeof( AvailableBlendOps ), nodeParams[ index++ ] ); + } + + m_enabled = ( m_currentIndex > 0 || m_currentAlphaIndex > 0 ); + m_blendOpEnabled = ( !m_blendOpRGB.Active && m_blendOpRGB.IntValue > -1 ) || ( m_blendOpRGB.Active && m_blendOpRGB.NodeId > -1 ); + } + + + public void WriteToString( ref string nodeInfo ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_currentIndex ); + m_sourceFactorRGB.WriteToString( ref nodeInfo ); + m_destFactorRGB.WriteToString( ref nodeInfo ); + + IOUtils.AddFieldValueToString( ref nodeInfo, m_currentAlphaIndex ); + m_sourceFactorAlpha.WriteToString( ref nodeInfo ); + m_destFactorAlpha.WriteToString( ref nodeInfo ); + + m_blendOpRGB.WriteToString( ref nodeInfo ); + m_blendOpAlpha.WriteToString( ref nodeInfo ); + } + + public void SetBlendOpsFromBlendMode( AlphaMode mode, bool customBlendAvailable ) + { + switch( mode ) + { + case AlphaMode.Transparent: + m_currentIndex = 2; + m_sourceFactorRGB.IntValue = (int)m_commonBlendTypes[ m_currentIndex ].SourceFactor; + m_destFactorRGB.IntValue = (int)m_commonBlendTypes[ m_currentIndex ].DestFactor; + break; + case AlphaMode.Masked: + case AlphaMode.Translucent: + m_currentIndex = 0; + break; + case AlphaMode.Premultiply: + m_currentIndex = 3; + m_sourceFactorRGB.IntValue = (int)m_commonBlendTypes[ m_currentIndex ].SourceFactor; + m_destFactorRGB.IntValue = (int)m_commonBlendTypes[ m_currentIndex ].DestFactor; + break; + } + m_enabled = customBlendAvailable; + } + + public string CreateBlendOps() + { + + string result = "\t\t" + CurrentBlendFactor + "\n"; + if( m_blendOpEnabled ) + { + result += "\t\t" + CurrentBlendOp + "\n"; + } + return result; + } + + public string CurrentBlendRGB { get { return m_commonBlendTypes[ m_currentIndex ].Name; } } + + public string CurrentBlendFactorSingle { get { return string.Format( SingleBlendFactorStr, m_sourceFactorRGB.GetValueOrProperty( ( (AvailableBlendFactor)m_sourceFactorRGB.IntValue ).ToString() ), m_destFactorRGB.GetValueOrProperty( ( (AvailableBlendFactor)m_destFactorRGB.IntValue ).ToString() ) ); } } + //public string CurrentBlendFactorSingleAlpha { get { return string.Format(SeparateBlendFactorStr, m_sourceFactorRGB, m_destFactorRGB, m_sourceFactorAlpha, m_destFactorAlpha); } } + public string CurrentBlendFactorSeparate + { + get + { + string src = ( m_currentIndex > 0 ? m_sourceFactorRGB.GetValueOrProperty( ( (AvailableBlendFactor)m_sourceFactorRGB.IntValue ).ToString() ) : AvailableBlendFactor.One.ToString() ); + string dst = ( m_currentIndex > 0 ? m_destFactorRGB.GetValueOrProperty( ( (AvailableBlendFactor)m_destFactorRGB.IntValue ).ToString() ) : AvailableBlendFactor.Zero.ToString() ); + string srca = m_sourceFactorAlpha.GetValueOrProperty( ( (AvailableBlendFactor)m_sourceFactorAlpha.IntValue ).ToString() ); + string dsta = m_destFactorAlpha.GetValueOrProperty( ( (AvailableBlendFactor)m_destFactorAlpha.IntValue ).ToString() ); + return string.Format( SeparateBlendFactorStr, src, dst, srca, dsta ); + } + } + public string CurrentBlendFactor { get { return ( ( m_currentAlphaIndex > 0 ) ? CurrentBlendFactorSeparate : CurrentBlendFactorSingle ); } } + + public string CurrentBlendOpSingle + { + get + { + string value = m_blendOpRGB.GetValueOrProperty( ( (AvailableBlendOps)m_blendOpRGB.IntValue ).ToString() ); + if( value.Equals( ( AvailableBlendOps.OFF ).ToString() ) ) + return string.Empty; + + return string.Format( SingleBlendOpStr, value ); + } + } + public string CurrentBlendOpSeparate + { + get + { + string rgbValue = m_blendOpRGB.GetValueOrProperty( ( (AvailableBlendOps)m_blendOpRGB.IntValue ).ToString() ); + + if( rgbValue.Equals( ( AvailableBlendOps.OFF ).ToString() )) + rgbValue = "Add"; + + string alphaValue = m_blendOpAlpha.GetValueOrProperty( ( (AvailableBlendOps)m_blendOpAlpha.IntValue ).ToString() ); + return string.Format( SeparateBlendOpStr, ( m_currentIndex > 0 ? rgbValue : AvailableBlendOps.Add.ToString() ), alphaValue ); + } + } + public string CurrentBlendOp { get { return ( ( m_currentAlphaIndex > 0 && m_blendOpAlpha.GetValueOrProperty( ( (AvailableBlendOps)m_blendOpAlpha.IntValue ).ToString() ) != AvailableBlendOps.OFF.ToString() ) ? CurrentBlendOpSeparate : CurrentBlendOpSingle ); } } + + public bool Active { get { return m_enabled && ( m_currentIndex > 0 || m_currentAlphaIndex > 0 ); } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/BlendOpsHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/BlendOpsHelper.cs.meta new file mode 100644 index 0000000..95ea7b5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/BlendOpsHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8b59649a5f829e24cb4de8c1a715f8b4 +timeCreated: 1485530925 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/CodeGenerationData.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/CodeGenerationData.cs new file mode 100644 index 0000000..5245c9f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/CodeGenerationData.cs @@ -0,0 +1,24 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +namespace AmplifyShaderEditor +{ + [System.Serializable] + public class CodeGenerationData + { + [SerializeField] + public bool IsActive; + [SerializeField] + public string Name; + [SerializeField] + public string Value; + + public CodeGenerationData( string name, string value ) + { + IsActive = false; + Name = name; + Value = value; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/CodeGenerationData.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/CodeGenerationData.cs.meta new file mode 100644 index 0000000..2c5d759 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/CodeGenerationData.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7a47d8101acb2e94d95016b69a1c2e41 +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/ColorMaskHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/ColorMaskHelper.cs new file mode 100644 index 0000000..2280c9f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/ColorMaskHelper.cs @@ -0,0 +1,107 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +using System; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + class ColorMaskHelper + { + private GUIContent ColorMaskContent = new GUIContent( "Color Mask", "Sets color channel writing mask, turning all off makes the object completely invisible\nDefault: RGBA" ); + private readonly char[] m_colorMaskChar = { 'R', 'G', 'B', 'A' }; + + private GUIStyle m_leftToggleColorMask; + private GUIStyle m_middleToggleColorMask; + private GUIStyle m_rightToggleColorMask; + + + [SerializeField] + private bool[] m_colorMask = { true, true, true, true }; + + [SerializeField] + private InlineProperty m_inlineMask = new InlineProperty(); + + public void Draw( UndoParentNode owner ) + { + m_inlineMask.CustomDrawer( ref owner, DrawColorMaskControls, ColorMaskContent.text ); + } + + private void DrawColorMaskControls( UndoParentNode owner ) + { + if( m_leftToggleColorMask == null || m_leftToggleColorMask.normal.background == null ) + { + m_leftToggleColorMask = GUI.skin.GetStyle( "miniButtonLeft" ); + } + + if( m_middleToggleColorMask == null || m_middleToggleColorMask.normal.background == null ) + { + m_middleToggleColorMask = GUI.skin.GetStyle( "miniButtonMid" ); + } + + if( m_rightToggleColorMask == null || m_rightToggleColorMask.normal.background == null ) + { + m_rightToggleColorMask = GUI.skin.GetStyle( "miniButtonRight" ); + } + + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField( ColorMaskContent, GUILayout.Width( 90 ) ); + + m_colorMask[ 0 ] = owner.GUILayoutToggle( m_colorMask[ 0 ], "R", m_leftToggleColorMask ); + m_colorMask[ 1 ] = owner.GUILayoutToggle( m_colorMask[ 1 ], "G", m_middleToggleColorMask ); + m_colorMask[ 2 ] = owner.GUILayoutToggle( m_colorMask[ 2 ], "B", m_middleToggleColorMask ); + m_colorMask[ 3 ] = owner.GUILayoutToggle( m_colorMask[ 3 ], "A", m_rightToggleColorMask ); + + EditorGUILayout.EndHorizontal(); + } + + public void BuildColorMask( ref string ShaderBody, bool customBlendAvailable ) + { + int count = 0; + string colorMask = string.Empty; + for( int i = 0; i < m_colorMask.Length; i++ ) + { + if( m_colorMask[ i ] ) + { + count++; + colorMask += m_colorMaskChar[ i ]; + } + } + + if( ( count != m_colorMask.Length && customBlendAvailable ) || m_inlineMask.Active ) + { + MasterNode.AddRenderState( ref ShaderBody, "ColorMask", m_inlineMask.GetValueOrProperty( ( ( count == 0 ) ? "0" : colorMask ) ) ); + } + } + + public void ReadFromString( ref uint index, ref string[] nodeParams ) + { + for( int i = 0; i < m_colorMask.Length; i++ ) + { + m_colorMask[ i ] = Convert.ToBoolean( nodeParams[ index++ ] ); + } + + if( UIUtils.CurrentShaderVersion() > 14501 ) + m_inlineMask.ReadFromString( ref index, ref nodeParams ); + } + + public void WriteToString( ref string nodeInfo ) + { + for( int i = 0; i < m_colorMask.Length; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_colorMask[ i ] ); + } + + m_inlineMask.WriteToString( ref nodeInfo ); + } + + public void Destroy() + { + m_leftToggleColorMask = null; + m_middleToggleColorMask = null; + m_rightToggleColorMask = null; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/ColorMaskHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/ColorMaskHelper.cs.meta new file mode 100644 index 0000000..69c24b0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/ColorMaskHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: bf65efd881afd1b4cbd2b27f3f17251b +timeCreated: 1488903773 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/CustomTagsHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/CustomTagsHelper.cs new file mode 100644 index 0000000..89a450c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/CustomTagsHelper.cs @@ -0,0 +1,482 @@ +using System; +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class CustomTagData + { + private const string TagFormat = "\"{0}\"=\"{1}\""; + public string TagName; + public string TagValue; + public int TagId = -1; + public bool TagFoldout = true; + + [SerializeField] + private TemplateSpecialTags m_specialTag = TemplateSpecialTags.None; + [SerializeField] + private DisableBatching m_disableBatching = DisableBatching.False; + [SerializeField] + private RenderType m_renderType = RenderType.Opaque; + [SerializeField] + private RenderQueue m_renderQueue = RenderQueue.Geometry; + [SerializeField] + private int m_renderQueueOffset = 0; + + public CustomTagData() + { + TagName = string.Empty; + TagValue = string.Empty; + m_specialTag = TemplateSpecialTags.None; + m_disableBatching = DisableBatching.False; + m_renderType = RenderType.Opaque; + m_renderQueue = RenderQueue.Geometry; + m_renderQueueOffset = 0; + } + + public CustomTagData( CustomTagData other ) + { + TagName = other.TagName; + TagValue = other.TagValue; + TagId = other.TagId; + TagFoldout = other.TagFoldout; + + m_specialTag = other.m_specialTag; + m_disableBatching = other.m_disableBatching; + m_renderType = other.m_renderType; + m_renderQueue = other.m_renderQueue; + m_renderQueueOffset = other.m_renderQueueOffset; + } + + public void SetTagValue( params string[] value ) + { + TagValue = value[ 0 ]; + switch( m_specialTag ) + { + case TemplateSpecialTags.RenderType: + { + if( !TemplateHelperFunctions.StringToRenderType.TryGetValue( value[ 0 ], out m_renderType ) ) + { + m_renderType = RenderType.Custom; + TagValue = value[ 0 ]; + } + } + break; + case TemplateSpecialTags.Queue: + { + if( value.Length == 2 ) + { + m_renderQueue = TemplateHelperFunctions.StringToRenderQueue[ value[ 0 ] ]; + int.TryParse( value[ 1 ], out m_renderQueueOffset ); + } + else + { + int indexPlus = value[ 0 ].IndexOf( '+' ); + if( indexPlus > 0 ) + { + string[] args = value[ 0 ].Split( '+' ); + m_renderQueue = TemplateHelperFunctions.StringToRenderQueue[ args[ 0 ] ]; + int.TryParse( args[ 1 ], out m_renderQueueOffset ); + } + else + { + int indexMinus = value[ 0 ].IndexOf( '-' ); + if( indexMinus > 0 ) + { + string[] args = value[ 0 ].Split( '-' ); + m_renderQueue = TemplateHelperFunctions.StringToRenderQueue[ args[ 0 ] ]; + int.TryParse( args[ 1 ], out m_renderQueueOffset ); + m_renderQueueOffset *= -1; + } + else + { + m_renderQueue = TemplateHelperFunctions.StringToRenderQueue[ value[ 0 ] ]; + m_renderQueueOffset = 0; + } + } + } + BuildQueueTagValue(); + } + break; + case TemplateSpecialTags.DisableBatching: + { + if( !TemplateHelperFunctions.StringToDisableBatching.TryGetValue( value[ 0 ], out m_disableBatching ) ) + { + m_disableBatching = DisableBatching.False; + TagValue = value[ 0 ]; + } + } + break; + } + } + + void CheckSpecialTag() + { + if( TagName.Equals( Constants.RenderTypeHelperStr ) ) + { + m_specialTag = TemplateSpecialTags.RenderType; + if( !TemplateHelperFunctions.StringToRenderType.TryGetValue( TagValue, out m_renderType )) + { + m_renderType = RenderType.Custom; + } + } + else if( TagName.Equals( Constants.RenderQueueHelperStr ) ) + { + m_specialTag = TemplateSpecialTags.Queue; + SetTagValue( TagValue ); + } + else if( TagName.Equals( Constants.DisableBatchingHelperStr ) ) + { + m_specialTag = TemplateSpecialTags.DisableBatching; + if( !TemplateHelperFunctions.StringToDisableBatching.TryGetValue( TagValue, out m_disableBatching ) ) + { + m_disableBatching = DisableBatching.False; + } + } + else + { + m_specialTag = TemplateSpecialTags.None; + } + } + + public CustomTagData( string name, string value, int id ) + { + TagName = name; + TagValue = value; + TagId = id; + CheckSpecialTag(); + } + + //Used on Template based shaders loading + public CustomTagData( string data, int id ) + { + TagId = id; + string[] arr = data.Split( IOUtils.VALUE_SEPARATOR ); + if( arr.Length > 1 ) + { + TagName = arr[ 0 ]; + TagValue = arr[ 1 ]; + } + + if( arr.Length > 2 ) + { + m_specialTag = (TemplateSpecialTags)Enum.Parse( typeof( TemplateSpecialTags ), arr[ 2 ] ); + switch( m_specialTag ) + { + case TemplateSpecialTags.RenderType: + { + if( !TemplateHelperFunctions.StringToRenderType.TryGetValue( TagValue, out m_renderType ) ) + { + m_renderType = RenderType.Custom; + } + } + break; + case TemplateSpecialTags.Queue: + { + if( arr.Length == 4 ) + { + m_renderQueue = (RenderQueue)Enum.Parse( typeof( RenderQueue ), TagValue ); + int.TryParse( arr[ 3 ], out m_renderQueueOffset ); + } + BuildQueueTagValue(); + } + break; + case TemplateSpecialTags.DisableBatching: + { + if( !TemplateHelperFunctions.StringToDisableBatching.TryGetValue( TagValue, out m_disableBatching ) ) + { + m_disableBatching = DisableBatching.False; + } + } + break; + } + } + else if( UIUtils.CurrentShaderVersion() < 15600 ) + { + CheckSpecialTag(); + } + } + + //Used on Standard Surface shaders loading + public CustomTagData( string data ) + { + string[] arr = data.Split( IOUtils.VALUE_SEPARATOR ); + if( arr.Length > 1 ) + { + TagName = arr[ 0 ]; + TagValue = arr[ 1 ]; + } + } + + public override string ToString() + { + switch( m_specialTag ) + { + case TemplateSpecialTags.RenderType: + return TagName + IOUtils.VALUE_SEPARATOR + + ( RenderType != RenderType.Custom? RenderType.ToString(): TagValue ) + IOUtils.VALUE_SEPARATOR + + m_specialTag; + case TemplateSpecialTags.Queue: + return TagName + IOUtils.VALUE_SEPARATOR + + m_renderQueue.ToString() + IOUtils.VALUE_SEPARATOR + + m_specialTag + IOUtils.VALUE_SEPARATOR + + m_renderQueueOffset; + case TemplateSpecialTags.DisableBatching: + return TagName + IOUtils.VALUE_SEPARATOR + + Batching.ToString() + IOUtils.VALUE_SEPARATOR + + m_specialTag; + } + + return TagName + IOUtils.VALUE_SEPARATOR + TagValue; + } + + public string GenerateTag() + { + switch( m_specialTag ) + { + case TemplateSpecialTags.RenderType: + return string.Format( TagFormat, TagName, ( RenderType != RenderType.Custom ? RenderType.ToString() : TagValue ) ); + case TemplateSpecialTags.DisableBatching: + case TemplateSpecialTags.Queue: + case TemplateSpecialTags.None: + default: + return string.Format( TagFormat, TagName, TagValue ); + } + } + + public void BuildQueueTagValue() + { + TagValue = m_renderQueue.ToString(); + if( m_renderQueueOffset > 0 ) + { + TagValue += "+" + m_renderQueueOffset; + } + else if( m_renderQueueOffset < 0 ) + { + TagValue += m_renderQueueOffset; + } + } + + public TemplateSpecialTags SpecialTag + { + get { return m_specialTag; } + set + { + m_specialTag = value; + switch( value ) + { + case TemplateSpecialTags.DisableBatching: + { + TagValue = m_disableBatching.ToString(); + } + break; + case TemplateSpecialTags.RenderType: + { + //if( m_renderType != RenderType.Custom ) + // TagValue = m_renderType.ToString(); + } + break; + case TemplateSpecialTags.Queue: + { + BuildQueueTagValue(); + } + break; + } + } + } + + public DisableBatching Batching + { + get { return m_disableBatching; } + set { m_disableBatching = value; + TagValue = value.ToString(); + } + } + + public RenderType RenderType + { + get { return m_renderType; } + set + { + m_renderType = value; + //if( m_renderType != RenderType.Custom ) + // TagValue = value.ToString(); + } + } + + public RenderQueue RenderQueue + { + get { return m_renderQueue; } + set { m_renderQueue = value; } + } + public int RenderQueueOffset + { + get { return m_renderQueueOffset; } + set { m_renderQueueOffset = value; } + } + + public bool IsValid { get { return ( !string.IsNullOrEmpty( TagValue ) && !string.IsNullOrEmpty( TagName ) ); } } + } + + [Serializable] + public class CustomTagsHelper + { + private const string CustomTagsStr = " Custom SubShader Tags"; + private const string TagNameStr = "Name"; + private const string TagValueStr = "Value"; + + private const float ShaderKeywordButtonLayoutWidth = 15; + private ParentNode m_currentOwner; + + [SerializeField] + private List m_availableTags = new List(); + + public void Draw( ParentNode owner ) + { + m_currentOwner = owner; + bool value = owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedCustomTags; + NodeUtils.DrawPropertyGroup( ref value, CustomTagsStr, DrawMainBody, DrawButtons ); + owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedCustomTags = value; + } + + void DrawButtons() + { + EditorGUILayout.Separator(); + + // Add tag + if( GUILayout.Button( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + m_availableTags.Add( new CustomTagData() ); + EditorGUI.FocusTextInControl( null ); + } + + //Remove tag + if( GUILayout.Button( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + if( m_availableTags.Count > 0 ) + { + m_availableTags.RemoveAt( m_availableTags.Count - 1 ); + EditorGUI.FocusTextInControl( null ); + } + } + } + + void DrawMainBody() + { + EditorGUILayout.Separator(); + int itemCount = m_availableTags.Count; + + if( itemCount == 0 ) + { + EditorGUILayout.HelpBox( "Your list is Empty!\nUse the plus button to add one.", MessageType.Info ); + } + + int markedToDelete = -1; + float originalLabelWidth = EditorGUIUtility.labelWidth; + for( int i = 0; i < itemCount; i++ ) + { + m_availableTags[ i ].TagFoldout = m_currentOwner.EditorGUILayoutFoldout( m_availableTags[ i ].TagFoldout, string.Format( "[{0}] - {1}", i, m_availableTags[ i ].TagName ) ); + if( m_availableTags[ i ].TagFoldout ) + { + EditorGUI.indentLevel += 1; + EditorGUIUtility.labelWidth = 70; + //Tag Name + EditorGUI.BeginChangeCheck(); + m_availableTags[ i ].TagName = EditorGUILayout.TextField( TagNameStr, m_availableTags[ i ].TagName ); + if( EditorGUI.EndChangeCheck() ) + { + m_availableTags[ i ].TagName = UIUtils.RemoveShaderInvalidCharacters( m_availableTags[ i ].TagName ); + } + + //Tag Value + EditorGUI.BeginChangeCheck(); + m_availableTags[ i ].TagValue = EditorGUILayout.TextField( TagValueStr, m_availableTags[ i ].TagValue ); + if( EditorGUI.EndChangeCheck() ) + { + m_availableTags[ i ].TagValue = UIUtils.RemoveShaderInvalidCharacters( m_availableTags[ i ].TagValue ); + } + + EditorGUIUtility.labelWidth = originalLabelWidth; + + EditorGUILayout.BeginHorizontal(); + { + GUILayout.Label( " " ); + // Add new port + if( m_currentOwner.GUILayoutButton( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + m_availableTags.Insert( i + 1, new CustomTagData() ); + EditorGUI.FocusTextInControl( null ); + } + + //Remove port + if( m_currentOwner.GUILayoutButton( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + markedToDelete = i; + } + } + EditorGUILayout.EndHorizontal(); + + EditorGUI.indentLevel -= 1; + } + + } + if( markedToDelete > -1 ) + { + if( m_availableTags.Count > markedToDelete ) + { + m_availableTags.RemoveAt( markedToDelete ); + EditorGUI.FocusTextInControl( null ); + } + } + EditorGUILayout.Separator(); + } + + + public void ReadFromString( ref uint index, ref string[] nodeParams ) + { + int count = Convert.ToInt32( nodeParams[ index++ ] ); + for( int i = 0; i < count; i++ ) + { + m_availableTags.Add( new CustomTagData( nodeParams[ index++ ] ) ); + } + } + + public void WriteToString( ref string nodeInfo ) + { + int tagsCount = m_availableTags.Count; + IOUtils.AddFieldValueToString( ref nodeInfo, tagsCount ); + for( int i = 0; i < tagsCount; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_availableTags[ i ].ToString() ); + } + } + + public string GenerateCustomTags() + { + int tagsCount = m_availableTags.Count; + string result = tagsCount == 0 ? string.Empty : " "; + + for( int i = 0; i < tagsCount; i++ ) + { + if( m_availableTags[ i ].IsValid ) + { + result += m_availableTags[ i ].GenerateTag(); + if( i < tagsCount - 1 ) + { + result += " "; + } + } + } + return result; + } + + public void Destroy() + { + m_availableTags.Clear(); + m_availableTags = null; + m_currentOwner = null; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/CustomTagsHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/CustomTagsHelper.cs.meta new file mode 100644 index 0000000..de6b426 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/CustomTagsHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5ed32be99aefda24483c9e3499a5cd23 +timeCreated: 1500400244 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/DependenciesHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/DependenciesHelper.cs new file mode 100644 index 0000000..915f173 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/DependenciesHelper.cs @@ -0,0 +1,210 @@ +using System; +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class DependenciesData + { + private string DependencyFormat = "Dependency \"{0}\"=\"{1}\"\n"; + public string DependencyName; + public string DependencyValue; + public bool DependencyFoldout = true; + + public DependenciesData() + { + DependencyName = string.Empty; + DependencyValue = string.Empty; + } + + public DependenciesData( string data ) + { + string[] arr = data.Split( IOUtils.VALUE_SEPARATOR ); + if( arr.Length > 1 ) + { + DependencyName = arr[ 0 ]; + DependencyValue = arr[ 1 ]; + } + } + + public override string ToString() + { + return DependencyName + IOUtils.VALUE_SEPARATOR + DependencyValue; + } + + public string GenerateDependency() + { + return string.Format( DependencyFormat, DependencyName, DependencyValue ); + } + + public bool IsValid { get { return ( !string.IsNullOrEmpty( DependencyValue ) && !string.IsNullOrEmpty( DependencyName ) ); } } + } + + [Serializable] + public class DependenciesHelper + { + private const string CustomDependencysStr = " Dependencies"; + private const string DependencyNameStr = "Name"; + private const string DependencyValueStr = "Value"; + + private const float ShaderKeywordButtonLayoutWidth = 15; + private ParentNode m_currentOwner; + + [SerializeField] + private List m_availableDependencies = new List(); + + public void Draw( ParentNode owner, bool isNested = false ) + { + m_currentOwner = owner; + bool value = owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedDependencies; + if( isNested ) + { + NodeUtils.DrawNestedPropertyGroup( ref value, CustomDependencysStr, DrawMainBody, DrawButtons ); + } + else + { + NodeUtils.DrawPropertyGroup( ref value, CustomDependencysStr, DrawMainBody, DrawButtons ); + } + owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedDependencies = value; + } + + void DrawButtons() + { + EditorGUILayout.Separator(); + + // Add Dependency + if( GUILayout.Button( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + m_availableDependencies.Add( new DependenciesData() ); + EditorGUI.FocusTextInControl( null ); + } + + //Remove Dependency + if( GUILayout.Button( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + if( m_availableDependencies.Count > 0 ) + { + m_availableDependencies.RemoveAt( m_availableDependencies.Count - 1 ); + EditorGUI.FocusTextInControl( null ); + } + } + } + + void DrawMainBody() + { + EditorGUILayout.Separator(); + int itemCount = m_availableDependencies.Count; + + if( itemCount == 0 ) + { + EditorGUILayout.HelpBox( "Your list is Empty!\nUse the plus button to add one.", MessageType.Info ); + } + + int markedToDelete = -1; + float originalLabelWidth = EditorGUIUtility.labelWidth; + for( int i = 0; i < itemCount; i++ ) + { + m_availableDependencies[ i ].DependencyFoldout = m_currentOwner.EditorGUILayoutFoldout( m_availableDependencies[ i ].DependencyFoldout, string.Format( "[{0}] - {1}", i, m_availableDependencies[ i ].DependencyName ) ); + if( m_availableDependencies[ i ].DependencyFoldout ) + { + EditorGUI.indentLevel += 1; + EditorGUIUtility.labelWidth = 70; + //Dependency Name + EditorGUI.BeginChangeCheck(); + m_availableDependencies[ i ].DependencyName = EditorGUILayout.TextField( DependencyNameStr, m_availableDependencies[ i ].DependencyName ); + if( EditorGUI.EndChangeCheck() ) + { + m_availableDependencies[ i ].DependencyName = UIUtils.RemoveShaderInvalidCharacters( m_availableDependencies[ i ].DependencyName ); + } + + //Dependency Value + EditorGUI.BeginChangeCheck(); + m_availableDependencies[ i ].DependencyValue = EditorGUILayout.TextField( DependencyValueStr, m_availableDependencies[ i ].DependencyValue ); + if( EditorGUI.EndChangeCheck() ) + { + m_availableDependencies[ i ].DependencyValue = UIUtils.RemoveShaderInvalidCharacters( m_availableDependencies[ i ].DependencyValue ); + } + + EditorGUIUtility.labelWidth = originalLabelWidth; + + EditorGUILayout.BeginHorizontal(); + { + GUILayout.Label( " " ); + // Add new port + if( m_currentOwner.GUILayoutButton( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + m_availableDependencies.Insert( i + 1, new DependenciesData() ); + EditorGUI.FocusTextInControl( null ); + } + + //Remove port + if( m_currentOwner.GUILayoutButton( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + markedToDelete = i; + } + } + EditorGUILayout.EndHorizontal(); + + EditorGUI.indentLevel -= 1; + } + + } + if( markedToDelete > -1 ) + { + if( m_availableDependencies.Count > markedToDelete ) + { + m_availableDependencies.RemoveAt( markedToDelete ); + EditorGUI.FocusTextInControl( null ); + } + } + EditorGUILayout.Separator(); + } + + + public void ReadFromString( ref uint index, ref string[] nodeParams ) + { + int count = Convert.ToInt32( nodeParams[ index++ ] ); + for( int i = 0; i < count; i++ ) + { + m_availableDependencies.Add( new DependenciesData( nodeParams[ index++ ] ) ); + } + } + + public void WriteToString( ref string nodeInfo ) + { + int dependencyCount = m_availableDependencies.Count; + IOUtils.AddFieldValueToString( ref nodeInfo, dependencyCount ); + for( int i = 0; i < dependencyCount; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_availableDependencies[ i ].ToString() ); + } + } + + public string GenerateDependencies() + { + int dependencyCount = m_availableDependencies.Count; + string result = dependencyCount == 0 ? string.Empty : "\n"; + UIUtils.ShaderIndentLevel++; + for( int i = 0; i < dependencyCount; i++ ) + { + if( m_availableDependencies[ i ].IsValid ) + { + result += UIUtils.ShaderIndentTabs + m_availableDependencies[ i ].GenerateDependency(); + } + } + UIUtils.ShaderIndentLevel--; + return result; + } + + public void Destroy() + { + m_availableDependencies.Clear(); + m_availableDependencies = null; + m_currentOwner = null; + } + + public bool HasDependencies { get { return m_availableDependencies.Count > 0; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/DependenciesHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/DependenciesHelper.cs.meta new file mode 100644 index 0000000..92e4d81 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/DependenciesHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2daff2983fe91ac43953017a8be984a7 +timeCreated: 1512404972 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FallbackPickerHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FallbackPickerHelper.cs new file mode 100644 index 0000000..6d006a9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FallbackPickerHelper.cs @@ -0,0 +1,119 @@ +using System; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class FallbackPickerHelper : ScriptableObject + { + private const string FallbackFormat = "Fallback \"{0}\""; + private const string FallbackShaderStr = "Fallback"; + private const string ShaderPoputContext = "CONTEXT/ShaderPopup"; + + private Material m_dummyMaterial; + private MenuCommand m_dummyCommand; + + [SerializeField] + private string m_fallbackShader = string.Empty; + + public void Init() + { + hideFlags = HideFlags.HideAndDontSave; + m_dummyMaterial = null; + m_dummyCommand = null; + } + + public void Draw( ParentNode owner ) + { + EditorGUILayout.BeginHorizontal(); + m_fallbackShader = owner.EditorGUILayoutTextField( FallbackShaderStr, m_fallbackShader ); + if ( GUILayout.Button( string.Empty, UIUtils.InspectorPopdropdownFallback, GUILayout.Width( 17 ), GUILayout.Height( 19 ) ) ) + { + EditorGUI.FocusTextInControl( null ); + GUI.FocusControl( null ); + DisplayShaderContext( owner, GUILayoutUtility.GetRect( GUIContent.none, EditorStyles.popup ) ); + } + EditorGUILayout.EndHorizontal(); + } + + private void DisplayShaderContext( ParentNode node, Rect r ) + { + if ( m_dummyCommand == null ) + m_dummyCommand = new MenuCommand( this, 0 ); + + if ( m_dummyMaterial == null ) + m_dummyMaterial = new Material( Shader.Find( "Hidden/ASESShaderSelectorUnlit" ) ); + +#pragma warning disable 0618 + UnityEditorInternal.InternalEditorUtility.SetupShaderMenu( m_dummyMaterial ); +#pragma warning restore 0618 + EditorUtility.DisplayPopupMenu( r, ShaderPoputContext, m_dummyCommand ); + } + + private void OnSelectedShaderPopup( string command, Shader shader ) + { + if ( shader != null ) + { + UIUtils.MarkUndoAction(); + Undo.RecordObject( this, "Selected fallback shader" ); + m_fallbackShader = shader.name; + } + } + + public void ReadFromString( ref uint index, ref string[] nodeParams ) + { + m_fallbackShader = nodeParams[ index++ ]; + } + + public void WriteToString( ref string nodeInfo ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_fallbackShader ); + } + + public void Destroy() + { + GameObject.DestroyImmediate( m_dummyMaterial ); + m_dummyMaterial = null; + m_dummyCommand = null; + } + + public string TabbedFallbackShader + { + get + { + if( string.IsNullOrEmpty( m_fallbackShader ) ) + return string.Empty; + + return "\t" + string.Format( FallbackFormat, m_fallbackShader ) + "\n"; + } + } + + public string FallbackShader + { + get + { + if( string.IsNullOrEmpty( m_fallbackShader ) ) + return string.Empty; + + return string.Format( FallbackFormat, m_fallbackShader ); + } + } + + public string RawFallbackShader + { + get + { + return m_fallbackShader; + } + set + { + m_fallbackShader = value; + } + } + + + public bool Active { get { return !string.IsNullOrEmpty( m_fallbackShader ); } } + + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FallbackPickerHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FallbackPickerHelper.cs.meta new file mode 100644 index 0000000..2336aa8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FallbackPickerHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: cd5a03cee1255ba438e2062d215b70b6 +timeCreated: 1490378537 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionInput.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionInput.cs new file mode 100644 index 0000000..155d200 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionInput.cs @@ -0,0 +1,527 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Function Input", "Functions", "Function Input adds an input port to the shader function", NodeAvailabilityFlags = (int)NodeAvailability.ShaderFunction )] + public sealed class FunctionInput : ParentNode + { + private const string InputTypeStr = "Input Type"; + private readonly string[] m_inputValueTypes ={ "Int", + "Float", + "Vector2", + "Vector3", + "Vector4", + "Color", + "Matrix 3x3", + "Matrix 4x4", + "Sampler 1D", + "Sampler 2D", + "Sampler 3D", + "Sampler Cube", + "Sampler 2D Array", + "Sampler State", + "Custom"}; + + [SerializeField] + private int m_selectedInputTypeInt = 1; + + private WirePortDataType m_selectedInputType = WirePortDataType.FLOAT; + + [SerializeField] + private FunctionNode m_functionNode; + + [SerializeField] + private string m_inputName = "Input"; + + [SerializeField] + private bool m_autoCast = false; + + [SerializeField] + private int m_orderIndex = -1; + + private int m_typeId = -1; + + public bool m_ignoreConnection = false; + + public delegate string PortGeneration( ref MasterNodeDataCollector dataCollector, int index, ParentGraph graph ); + public PortGeneration OnPortGeneration = null; + + //Title editing + [SerializeField] + private string m_uniqueName; + + private bool m_isEditing; + private bool m_stopEditing; + private bool m_startEditing; + private double m_clickTime; + private double m_doubleClickTime = 0.3; + private Rect m_titleClickArea; + private bool m_showTitleWhenNotEditing = true; + + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, Constants.EmptyPortValue ); + m_inputPorts[ 0 ].AutoDrawInternalData = true; + //m_inputPorts[ 0 ].Visible = false; + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + m_autoWrapProperties = true; + m_textLabelWidth = 100; + SetTitleText( m_inputName ); + UpdatePorts(); + SetAdditonalTitleText( "( " + m_inputValueTypes[ m_selectedInputTypeInt ] + " )" ); + m_previewShaderGUID = "04bc8e7b317dccb4d8da601680dd8140"; + } + + public override void SetPreviewInputs() + { + if( Fnode == null ) + { + m_ignoreConnection = false; + CheckSpherePreview(); + } + else + { + var input = Fnode.GetInput( this ); + if( input != null && ( !InputPorts[ 0 ].IsConnected || input.IsConnected ) ) + { + m_ignoreConnection = true; + InputPorts[ 0 ].PreparePortCacheID(); + Fnode.SetPreviewInput( input ); + if( input.ExternalReferences.Count > 0 ) + { + SpherePreview = Fnode.ContainerGraph.GetNode( input.ExternalReferences[ 0 ].NodeId ).SpherePreview; + } + else + { + SpherePreview = false; + } + PreviewMaterial.SetTexture( InputPorts[ 0 ].CachedPropertyId, input.InputPreviewTexture( Fnode.ContainerGraph ) ); + } + else + { + m_ignoreConnection = false; + CheckSpherePreview(); + } + } + + if( !m_ignoreConnection ) + base.SetPreviewInputs(); + + for( int i = 0; i < OutputPorts[ 0 ].ExternalReferences.Count; i++ ) + { + ContainerGraph.GetNode( OutputPorts[ 0 ].ExternalReferences[ i ].NodeId ).OnNodeChange(); + } + + if( m_typeId == -1 ) + m_typeId = Shader.PropertyToID( "_Type" ); + + if( m_inputPorts[ 0 ].DataType == WirePortDataType.FLOAT || m_inputPorts[ 0 ].DataType == WirePortDataType.INT ) + PreviewMaterial.SetInt( m_typeId, 1 ); + else if( m_inputPorts[ 0 ].DataType == WirePortDataType.FLOAT2 ) + PreviewMaterial.SetInt( m_typeId, 2 ); + else if( m_inputPorts[ 0 ].DataType == WirePortDataType.FLOAT3 ) + PreviewMaterial.SetInt( m_typeId, 3 ); + else + PreviewMaterial.SetInt( m_typeId, 0 ); + + } + + public override bool RecursivePreviewUpdate( Dictionary duplicatesDict = null ) + { + if( duplicatesDict == null ) + { + duplicatesDict = ContainerGraph.ParentWindow.VisitedChanged; + } + + for( int i = 0; i < InputPorts.Count; i++ ) + { + ParentNode outNode = null; + if( Fnode != null ) + { + var input = Fnode.GetInput( this ); + if( input.ExternalReferences.Count > 0 ) + { + outNode = Fnode.ContainerGraph.GetNode( input.ExternalReferences[ 0 ].NodeId ); + } + else if( InputPorts[ i ].ExternalReferences.Count > 0 ) + { + outNode = ContainerGraph.GetNode( InputPorts[ i ].ExternalReferences[ 0 ].NodeId ); + } + } + else + { + if( InputPorts[ i ].ExternalReferences.Count > 0 ) + { + outNode = ContainerGraph.GetNode( InputPorts[ i ].ExternalReferences[ 0 ].NodeId ); + } + } + if( outNode != null ) + { + if( !duplicatesDict.ContainsKey( outNode.OutputId ) ) + { + bool result = outNode.RecursivePreviewUpdate(); + if( result ) + PreviewIsDirty = true; + } + else if( duplicatesDict[ outNode.OutputId ] ) + { + PreviewIsDirty = true; + } + } + } + + bool needsUpdate = PreviewIsDirty; + RenderNodePreview(); + if( !duplicatesDict.ContainsKey( OutputId ) ) + duplicatesDict.Add( OutputId, needsUpdate ); + return needsUpdate; + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + UIUtils.RegisterFunctionInputNode( this ); + if( m_nodeAttribs != null ) + m_uniqueName = m_nodeAttribs.Name + UniqueId; + } + + public override void Destroy() + { + base.Destroy(); + OnPortGeneration = null; + UIUtils.UnregisterFunctionInputNode( this ); + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + if( AutoCast ) + { + m_inputPorts[ 0 ].MatchPortToConnection(); + SetIntTypeFromPort(); + UpdatePorts(); + SetAdditonalTitleText( "( " + m_inputValueTypes[ m_selectedInputTypeInt ] + " )" ); + } + } + + public override void OnConnectedOutputNodeChanges( int portId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( portId, otherNodeId, otherPortId, name, type ); + if( AutoCast ) + { + m_inputPorts[ 0 ].MatchPortToConnection(); + SetIntTypeFromPort(); + UpdatePorts(); + SetAdditonalTitleText( "( " + m_inputValueTypes[ m_selectedInputTypeInt ] + " )" ); + } + } + + public void SetIntTypeFromPort() + { + switch( m_inputPorts[ 0 ].DataType ) + { + case WirePortDataType.INT: m_selectedInputTypeInt = 0; break; + default: + case WirePortDataType.FLOAT: m_selectedInputTypeInt = 1; break; + case WirePortDataType.FLOAT2: m_selectedInputTypeInt = 2; break; + case WirePortDataType.FLOAT3: m_selectedInputTypeInt = 3; break; + case WirePortDataType.FLOAT4: m_selectedInputTypeInt = 4; break; + case WirePortDataType.COLOR: m_selectedInputTypeInt = 5; break; + case WirePortDataType.FLOAT3x3: m_selectedInputTypeInt = 6; break; + case WirePortDataType.FLOAT4x4: m_selectedInputTypeInt = 7; break; + case WirePortDataType.SAMPLER1D: m_selectedInputTypeInt = 8; break; + case WirePortDataType.SAMPLER2D: m_selectedInputTypeInt = 9; break; + case WirePortDataType.SAMPLER3D: m_selectedInputTypeInt = 10; break; + case WirePortDataType.SAMPLERCUBE: m_selectedInputTypeInt = 11; break; + case WirePortDataType.SAMPLER2DARRAY: m_selectedInputTypeInt = 12; break; + case WirePortDataType.SAMPLERSTATE: m_selectedInputTypeInt = 13; break; + case WirePortDataType.OBJECT: m_selectedInputTypeInt = 14; break; + } + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + // Custom Editable Title + if( ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD3 ) + { + if( !m_isEditing && ( ( !ContainerGraph.ParentWindow.MouseInteracted && drawInfo.CurrentEventType == EventType.MouseDown && m_titleClickArea.Contains( drawInfo.MousePosition ) ) ) ) + { + if( ( EditorApplication.timeSinceStartup - m_clickTime ) < m_doubleClickTime ) + m_startEditing = true; + else + GUI.FocusControl( null ); + m_clickTime = EditorApplication.timeSinceStartup; + } + else if( m_isEditing && ( ( drawInfo.CurrentEventType == EventType.MouseDown && !m_titleClickArea.Contains( drawInfo.MousePosition ) ) || !EditorGUIUtility.editingTextField ) ) + { + m_stopEditing = true; + } + + if( m_isEditing || m_startEditing ) + { + EditorGUI.BeginChangeCheck(); + GUI.SetNextControlName( m_uniqueName ); + m_inputName = EditorGUITextField( m_titleClickArea, string.Empty, m_inputName, UIUtils.GetCustomStyle( CustomStyle.NodeTitle ) ); + if( EditorGUI.EndChangeCheck() ) + { + SetTitleText( m_inputName ); + UIUtils.UpdateFunctionInputData( UniqueId, m_inputName ); + } + + if( m_startEditing ) + EditorGUI.FocusTextInControl( m_uniqueName ); + + } + + if( drawInfo.CurrentEventType == EventType.Repaint ) + { + if( m_startEditing ) + { + m_startEditing = false; + m_isEditing = true; + } + + if( m_stopEditing ) + { + m_stopEditing = false; + m_isEditing = false; + GUI.FocusControl( null ); + } + } + + + } + } + + public override void OnNodeLayout( DrawInfo drawInfo ) + { + // RUN LAYOUT CHANGES AFTER TITLES CHANGE + base.OnNodeLayout( drawInfo ); + m_titleClickArea = m_titlePos; + m_titleClickArea.height = Constants.NODE_HEADER_HEIGHT; + } + + public override void OnNodeRepaint( DrawInfo drawInfo ) + { + base.OnNodeRepaint( drawInfo ); + + if( !m_isVisible ) + return; + + // Fixed Title ( only renders when not editing ) + if( m_showTitleWhenNotEditing && !m_isEditing && !m_startEditing && ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD3 ) + { + GUI.Label( m_titleClickArea, m_content, UIUtils.GetCustomStyle( CustomStyle.NodeTitle ) ); + } + } + + public override void OnNodeDoubleClicked( Vector2 currentMousePos2D ) + { + if( currentMousePos2D.y - m_globalPosition.y > ( Constants.NODE_HEADER_HEIGHT + Constants.NODE_HEADER_EXTRA_HEIGHT ) * ContainerGraph.ParentWindow.CameraDrawInfo.InvertedZoom ) + { + ContainerGraph.ParentWindow.ParametersWindow.IsMaximized = !ContainerGraph.ParentWindow.ParametersWindow.IsMaximized; + } + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUILayout.BeginVertical(); + EditorGUI.BeginChangeCheck(); + m_inputName = EditorGUILayoutTextField( "Name", m_inputName ); + if( EditorGUI.EndChangeCheck() ) + { + SetTitleText( m_inputName ); + UIUtils.UpdateFunctionInputData( UniqueId, m_inputName ); + } + EditorGUI.BeginChangeCheck(); + m_selectedInputTypeInt = EditorGUILayoutPopup( InputTypeStr, m_selectedInputTypeInt, m_inputValueTypes ); + if( EditorGUI.EndChangeCheck() ) + { + UpdatePorts(); + SetAdditonalTitleText( "( " + m_inputValueTypes[ m_selectedInputTypeInt ] + " )" ); + } + + m_autoCast = EditorGUILayoutToggle( "Auto Cast", m_autoCast ); + + EditorGUILayout.Separator(); + if( !m_inputPorts[ 0 ].IsConnected && m_inputPorts[ 0 ].ValidInternalData ) + { + m_inputPorts[ 0 ].ShowInternalData( this, true, "Default Value" ); + } + + + EditorGUILayout.EndVertical(); + } + + void UpdatePorts() + { + switch( m_selectedInputTypeInt ) + { + case 0: m_selectedInputType = WirePortDataType.INT; break; + default: + case 1: m_selectedInputType = WirePortDataType.FLOAT; break; + case 2: m_selectedInputType = WirePortDataType.FLOAT2; break; + case 3: m_selectedInputType = WirePortDataType.FLOAT3; break; + case 4: m_selectedInputType = WirePortDataType.FLOAT4; break; + case 5: m_selectedInputType = WirePortDataType.COLOR; break; + case 6: m_selectedInputType = WirePortDataType.FLOAT3x3; break; + case 7: m_selectedInputType = WirePortDataType.FLOAT4x4; break; + case 8: m_selectedInputType = WirePortDataType.SAMPLER1D; break; + case 9: m_selectedInputType = WirePortDataType.SAMPLER2D; break; + case 10: m_selectedInputType = WirePortDataType.SAMPLER3D; break; + case 11: m_selectedInputType = WirePortDataType.SAMPLERCUBE; break; + case 12: m_selectedInputType = WirePortDataType.SAMPLER2DARRAY; break; + case 13: m_selectedInputType = WirePortDataType.SAMPLERSTATE; break; + case 14: m_selectedInputType = WirePortDataType.OBJECT; break; + } + + ChangeInputType( m_selectedInputType, false ); + + //This node doesn't have any restrictions but changing types should be restricted to prevent invalid connections + m_outputPorts[ 0 ].ChangeTypeWithRestrictions( m_selectedInputType, PortCreateRestriction( m_selectedInputType ) ); + m_sizeIsDirty = true; + } + + public int PortCreateRestriction( WirePortDataType dataType ) + { + int restrictions = 0; + WirePortDataType[] types = null; + switch( dataType ) + { + case WirePortDataType.OBJECT: + break; + case WirePortDataType.FLOAT: + case WirePortDataType.FLOAT2: + case WirePortDataType.FLOAT3: + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: + case WirePortDataType.INT: + { + types = new WirePortDataType[] { WirePortDataType.FLOAT, WirePortDataType.FLOAT2, WirePortDataType.FLOAT3, WirePortDataType.FLOAT4, WirePortDataType.COLOR, WirePortDataType.INT, WirePortDataType.OBJECT }; + } + break; + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + { + types = new WirePortDataType[] { WirePortDataType.FLOAT3x3, WirePortDataType.FLOAT4x4, WirePortDataType.OBJECT }; + } + break; + case WirePortDataType.SAMPLER1D: + case WirePortDataType.SAMPLER2D: + case WirePortDataType.SAMPLER3D: + case WirePortDataType.SAMPLERCUBE: + case WirePortDataType.SAMPLER2DARRAY: + { + types = new WirePortDataType[] { WirePortDataType.SAMPLER1D, WirePortDataType.SAMPLER2D, WirePortDataType.SAMPLER3D, WirePortDataType.SAMPLERCUBE, WirePortDataType.SAMPLER2DARRAY, WirePortDataType.OBJECT }; + } + break; + case WirePortDataType.SAMPLERSTATE: + { + types = new WirePortDataType[] { WirePortDataType.SAMPLERSTATE }; + } + break; + default: + break; + } + + if( types != null ) + { + for( int i = 0; i < types.Length; i++ ) + { + restrictions = restrictions | (int)types[ i ]; + } + } + + return restrictions; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ outputId ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ outputId ].LocalValue( dataCollector.PortCategory ); + + string result = string.Empty; + if( OnPortGeneration != null ) + result = OnPortGeneration( ref dataCollector, m_orderIndex, ContainerGraph.ParentWindow.CustomGraph ); + else + result = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + + if( m_outputPorts[ outputId ].ConnectionCount > 1 ) + RegisterLocalVariable( outputId, result, ref dataCollector ); + else + m_outputPorts[ outputId ].SetLocalValue( result, dataCollector.PortCategory ); + + return m_outputPorts[ outputId ].LocalValue( dataCollector.PortCategory ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_inputName ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_selectedInputTypeInt ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_orderIndex ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_autoCast ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_inputName = GetCurrentParam( ref nodeParams ); + m_selectedInputTypeInt = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_orderIndex = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_autoCast = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + + SetTitleText( m_inputName ); + UpdatePorts(); + SetAdditonalTitleText( "( " + m_inputValueTypes[ m_selectedInputTypeInt ] + " )" ); + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + + SetTitleText( m_inputName ); + UpdatePorts(); + SetAdditonalTitleText( "( " + m_inputValueTypes[ m_selectedInputTypeInt ] + " )" ); + } + + public WirePortDataType SelectedInputType + { + get { return m_selectedInputType; } + } + + public string InputName + { + get { return m_inputName; } + } + + public int OrderIndex + { + get { return m_orderIndex; } + set { m_orderIndex = value; } + } + + public bool AutoCast + { + get { return m_autoCast; } + set { m_autoCast = value; } + } + + public FunctionNode Fnode + { + get { return m_functionNode; } + set { m_functionNode = value; } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionInput.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionInput.cs.meta new file mode 100644 index 0000000..c5aa550 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionInput.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 64064ea01705e084cbe00a3bbeef2c3d +timeCreated: 1491927259 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionNode.cs new file mode 100644 index 0000000..d6fa21e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionNode.cs @@ -0,0 +1,1246 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +//#define ADD_SHADER_FUNCTION_HEADERS + +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Function Node", "Functions", "Function Node", KeyCode.None, false, 0, int.MaxValue, typeof( AmplifyShaderFunction ) )] + public class FunctionNode : ParentNode + { + [SerializeField] + private AmplifyShaderFunction m_function; + + [SerializeField] + private ParentGraph m_functionGraph; + + [SerializeField] + private int m_functionGraphId = -1; + + [SerializeField] + private List m_allFunctionInputs; + private Dictionary m_allFunctionInputsDict = new Dictionary(); + + [SerializeField] + private List m_allFunctionOutputs; + private Dictionary m_allFunctionOutputsDict = new Dictionary(); + + [SerializeField] + private List m_allFunctionSwitches; + private Dictionary m_allFunctionSwitchesDict = new Dictionary(); + + [SerializeField] + private ReordenatorNode m_reordenator; + + [SerializeField] + private string m_filename; + + [SerializeField] + private string m_headerTitle = string.Empty; + + [SerializeField] + private int m_orderIndex; + + [SerializeField] + private string m_functionCheckSum; + + [SerializeField] + private string m_functionGUID = string.Empty; + + //[SerializeField] + //private List m_includes = new List(); + + //[SerializeField] + //private List m_pragmas = new List(); + + [SerializeField] + private List m_directives = new List(); + + private bool m_parametersFoldout = true; + [SerializeField] + private ParentGraph m_outsideGraph = null; + + [SerializeField] + private FunctionOutput m_mainPreviewNode; + + bool m_portsChanged = false; + //[SerializeField] + bool m_initialGraphDraw = false; + + private bool m_refreshIdsRequired = false; + + public string[] ReadOptionsHelper = new string[] { }; + + private bool m_lateRefresh = false; + + private Dictionary m_duplicatesBuffer = new Dictionary(); + string LastLine( string text ) + { + string[] lines = text.Replace( "\r", "" ).Split( '\n' ); + return lines[ lines.Length - 1 ]; + } + + public void CommonInit( AmplifyShaderFunction function, int uniqueId ) + { + SetBaseUniqueId( uniqueId ); + + if( function == null ) + return; + + m_refreshIdsRequired = UIUtils.IsLoading && ( UIUtils.CurrentShaderVersion() < 14004 ); + + m_function = function; + + if( Function.FunctionName.Length > 1 ) + { + SetTitleText( GraphContextMenu.AddSpacesToSentence( Function.FunctionName ) ); + } + else + { + SetTitleText( Function.FunctionName ); + } + m_tooltipText = Function.Description; + m_hasTooltipLink = false; + if( m_functionGraph == null ) + { + //m_functionGraph = new ParentGraph(); + m_functionGraph = CreateInstance(); + m_functionGraph.Init(); + m_functionGraph.ParentWindow = ContainerGraph.ParentWindow; + } + + if( string.IsNullOrEmpty( m_functionGUID ) ) + { + m_functionGUID = AssetDatabase.AssetPathToGUID( AssetDatabase.GetAssetPath( m_function ) ); + } + + m_functionGraphId = Mathf.Max( m_functionGraphId, ContainerGraph.ParentWindow.GraphCount ); + ContainerGraph.ParentWindow.GraphCount = m_functionGraphId + 1; + m_functionGraph.SetGraphId( m_functionGraphId ); + + ParentGraph cachedGraph = ContainerGraph.ParentWindow.CustomGraph; + ContainerGraph.ParentWindow.CustomGraph = m_functionGraph; + + AmplifyShaderEditorWindow.LoadFromMeta( ref m_functionGraph, ContainerGraph.ParentWindow.ContextMenuInstance, Function.FunctionInfo ); + //m_functionCheckSum = LastLine( m_function.FunctionInfo ); + m_functionCheckSum = AssetDatabase.GetAssetDependencyHash( AssetDatabase.GetAssetPath( m_function ) ).ToString(); + List propertyList = UIUtils.PropertyNodesList(); + m_allFunctionInputs = UIUtils.FunctionInputList(); + m_allFunctionOutputs = UIUtils.FunctionOutputList(); + m_allFunctionSwitches = UIUtils.FunctionSwitchList(); + + ContainerGraph.ParentWindow.CustomGraph = cachedGraph; + + m_allFunctionInputs.Sort( ( x, y ) => { return x.OrderIndex.CompareTo( y.OrderIndex ); } ); + m_allFunctionOutputs.Sort( ( x, y ) => { return x.OrderIndex.CompareTo( y.OrderIndex ); } ); + m_allFunctionSwitches.Sort( ( x, y ) => { return x.OrderIndex.CompareTo( y.OrderIndex ); } ); + + int inputCount = m_allFunctionInputs.Count; + for( int i = 0; i < inputCount; i++ ) + { + if( m_refreshIdsRequired ) + { + AddInputPort( m_allFunctionInputs[ i ].SelectedInputType, false, m_allFunctionInputs[ i ].InputName ); + } + else + { + AddInputPort( m_allFunctionInputs[ i ].SelectedInputType, false, m_allFunctionInputs[ i ].InputName, -1, MasterNodePortCategory.Fragment, m_allFunctionInputs[ i ].UniqueId ); + } + InputPortSwitchRestriction( m_inputPorts[ i ] ); + + if( !m_allFunctionInputs[ i ].InputPorts[ 0 ].IsConnected ) + { + m_inputPorts[ i ].AutoDrawInternalData = true; + m_inputPorts[ i ].InternalData = m_allFunctionInputs[ i ].InputPorts[ 0 ].InternalData; + } + m_allFunctionInputs[ i ].Fnode = this; + } + + int outputCount = m_allFunctionOutputs.Count; + FunctionOutput first = null; + for( int i = 0; i < outputCount; i++ ) + { + if( i == 0 ) + first = m_allFunctionOutputs[ i ]; + + if( m_allFunctionOutputs[ i ].PreviewNode ) + { + m_mainPreviewNode = m_allFunctionOutputs[ i ]; + } + + if( m_refreshIdsRequired ) + { + AddOutputPort( m_allFunctionOutputs[ i ].AutoOutputType, m_allFunctionOutputs[ i ].OutputName ); + } + else + { + AddOutputPort( m_allFunctionOutputs[ i ].AutoOutputType, m_allFunctionOutputs[ i ].OutputName, m_allFunctionOutputs[ i ].UniqueId ); + } + OutputPortSwitchRestriction( m_outputPorts[ i ] ); + } + + // make sure to hide the ports properly + CheckPortVisibility(); + + if( m_mainPreviewNode == null ) + m_mainPreviewNode = first; + + //create reordenator to main graph + bool inside = false; + if( ContainerGraph.ParentWindow.CustomGraph != null ) + inside = true; + + if( /*hasConnectedProperties*/propertyList.Count > 0 ) + { + m_reordenator = ScriptableObject.CreateInstance(); + m_reordenator.Init( "_" + Function.FunctionName, Function.FunctionName, propertyList, false ); + m_reordenator.OrderIndex = m_orderIndex; + m_reordenator.HeaderTitle = Function.FunctionName; + m_reordenator.IsInside = inside; + } + + if( m_reordenator != null ) + { + cachedGraph = ContainerGraph.ParentWindow.CustomGraph; + ContainerGraph.ParentWindow.CustomGraph = null; + UIUtils.RegisterPropertyNode( m_reordenator ); + ContainerGraph.ParentWindow.CustomGraph = cachedGraph; + + if( inside ) + { + UIUtils.RegisterPropertyNode( m_reordenator ); + } + } + + UIUtils.RegisterFunctionNode( this ); + + m_previewShaderGUID = "aca70c900c50c004e8ef0b47c4fac4d4"; + m_useInternalPortData = false; + m_selectedLocation = function.PreviewPosition; + UIUtils.CurrentWindow.OutsideGraph.OnLODMasterNodesAddedEvent += OnLODMasterNodesAddedEvent; + } + + public InputPort GetInput( FunctionInput input ) + { + int index = m_allFunctionInputs.FindIndex( ( x ) => { return x.Equals( input ); } ); + if( index >= 0 ) + return InputPorts[ index ]; + else + return null; + } + + private void OnLODMasterNodesAddedEvent( int lod ) + { + AddShaderFunctionDirectivesInternal( lod ); + } + + public void SetPreviewInput( InputPort input ) + { + if( !HasPreviewShader || !m_initialized ) + return; + + if( input.IsConnected && input.InputNodeHasPreview( ContainerGraph ) ) + { + input.SetPreviewInputTexture( ContainerGraph ); + } + else + { + input.SetPreviewInputValue( ContainerGraph ); + } + } + + public override bool RecursivePreviewUpdate( Dictionary duplicatesDict = null ) + { + if( duplicatesDict == null ) + { + duplicatesDict = ContainerGraph.ParentWindow.VisitedChanged; + } + + if( m_allFunctionOutputs == null || m_allFunctionOutputs.Count == 0 ) + return false; + + for( int i = 0; i < m_allFunctionOutputs.Count; i++ ) + { + ParentNode outNode = m_allFunctionOutputs[ i ]; + if( outNode != null ) + { + if( !duplicatesDict.ContainsKey( outNode.OutputId ) ) + { + bool result = outNode.RecursivePreviewUpdate(); + if( result ) + PreviewIsDirty = true; + } + else if( duplicatesDict[ outNode.OutputId ] ) + { + PreviewIsDirty = true; + } + } + } + + bool needsUpdate = PreviewIsDirty; + RenderNodePreview(); + if( !duplicatesDict.ContainsKey( OutputId ) ) + duplicatesDict.Add( OutputId, needsUpdate ); + return needsUpdate; + } + + public override void RenderNodePreview() + { + if( m_outputPorts == null ) + return; + + if( !PreviewIsDirty && !m_continuousPreviewRefresh ) + return; + + // this is in the wrong place?? + if( m_drawPreviewAsSphere != m_mainPreviewNode.SpherePreview ) + { + m_drawPreviewAsSphere = m_mainPreviewNode.SpherePreview; + OnNodeChange(); + } + + int count = m_outputPorts.Count; + for( int i = 0; i < count; i++ ) + { + m_outputPorts[ i ].OutputPreviewTexture = m_allFunctionOutputs[ i ].PreviewTexture; + } + + if( PreviewIsDirty ) + FinishPreviewRender = true; + + PreviewIsDirty = false; + } + + public override RenderTexture PreviewTexture + { + get + { + if( m_mainPreviewNode != null ) + return m_mainPreviewNode.PreviewTexture; + else + return base.PreviewTexture; + } + } + + private void AddShaderFunctionDirectivesInternal( int lod ) + { + List nodes = ContainerGraph.ParentWindow.OutsideGraph.GetMultiPassMasterNodes( lod ); + int count = nodes.Count; + for( int i = 0; i < count; i++ ) + { + nodes[ i ].PassModule.AdditionalDirectives.AddShaderFunctionItems( OutputId, Function.AdditionalDirectives.DirectivesList ); + } + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + if( Function == null ) + return; + + //Debug.Log( "RefreshExternalReferences " + m_function.FunctionName + " " + UIUtils.CurrentWindow.IsShaderFunctionWindow ); + + Function.UpdateDirectivesList(); + + MasterNode masterNode = UIUtils.CurrentWindow.OutsideGraph.CurrentMasterNode; + StandardSurfaceOutputNode surface = masterNode as StandardSurfaceOutputNode; + + + + if( surface != null ) + { + //for( int i = 0; i < Function.AdditionalIncludes.IncludeList.Count; i++ ) + //{ + // //ContainerGraph.ParentWindow.OutsideGraph.CurrentStandardSurface.AdditionalIncludes.OutsideList.Add( Function.AdditionalIncludes.IncludeList[ i ] ); + // ContainerGraph.ParentWindow.OutsideGraph.CurrentStandardSurface.AdditionalDirectives.AddShaderFunctionItem( AdditionalLineType.Include, Function.AdditionalIncludes.IncludeList[ i ] ); + // m_includes.Add( Function.AdditionalIncludes.IncludeList[ i ] ); + //} + + //for( int i = 0; i < Function.AdditionalPragmas.PragmaList.Count; i++ ) + //{ + // //ContainerGraph.ParentWindow.OutsideGraph.CurrentStandardSurface.AdditionalPragmas.OutsideList.Add( Function.AdditionalPragmas.PragmaList[ i ] ); + // ContainerGraph.ParentWindow.OutsideGraph.CurrentStandardSurface.AdditionalDirectives.AddShaderFunctionItem(AdditionalLineType.Pragma, Function.AdditionalPragmas.PragmaList[ i ] ); + // m_pragmas.Add( Function.AdditionalPragmas.PragmaList[ i ] ); + //} + surface.AdditionalDirectives.AddShaderFunctionItems( OutputId, Function.AdditionalDirectives.DirectivesList ); + } + else + { + if( ContainerGraph.ParentWindow.OutsideGraph.MultiPassMasterNodes.Count > 0 ) + { + for( int lod = -1; lod < ContainerGraph.ParentWindow.OutsideGraph.LodMultiPassMasternodes.Count; lod++ ) + { + AddShaderFunctionDirectivesInternal( lod ); + } + } + else + { + // Assuring that we're not editing a Shader Function, as directives setup is not needed there + if( !UIUtils.CurrentWindow.IsShaderFunctionWindow ) + { + // This function is nested inside a shader function itself and this method + // was called before the main output node was created. + // This is possible since all nodes RefreshExternalReferences(...) are called at the end + // of a LoadFromMeta + // Need to delay this setup to after all nodes are loaded to then setup the directives + m_lateRefresh = true; + return; + } + } + + } + m_directives.AddRange( Function.AdditionalDirectives.DirectivesList ); + + if( m_refreshIdsRequired ) + { + m_refreshIdsRequired = false; + int inputCount = m_inputPorts.Count; + for( int i = 0; i < inputCount; i++ ) + { + m_inputPorts[ i ].ChangePortId( m_allFunctionInputs[ i ].UniqueId ); + } + + int outputCount = m_outputPorts.Count; + for( int i = 0; i < outputCount; i++ ) + { + m_outputPorts[ i ].ChangePortId( m_allFunctionOutputs[ i ].UniqueId ); + } + } + + if( ContainerGraph.ParentWindow.CurrentGraph != m_functionGraph ) + ContainerGraph.ParentWindow.CurrentGraph.InstancePropertyCount += m_functionGraph.InstancePropertyCount; + + ParentGraph cachedGraph = ContainerGraph.ParentWindow.CustomGraph; + ContainerGraph.ParentWindow.CustomGraph = m_functionGraph; + + if( ReadOptionsHelper.Length > 2 ) + { + for( int i = 1; i < ReadOptionsHelper.Length; i += 2 ) + { + int optionId = Convert.ToInt32( ReadOptionsHelper[ i ] ); + int optionValue = Convert.ToInt32( ReadOptionsHelper[ i + 1 ] ); + for( int j = 0; j < m_allFunctionSwitches.Count; j++ ) + { + if( m_allFunctionSwitches[ j ].UniqueId == optionId ) + { + m_allFunctionSwitches[ j ].SetCurrentSelectedInput( optionValue, m_allFunctionSwitches[ j ].GetCurrentSelectedInput() ); + break; + } + } + } + } + + ContainerGraph.ParentWindow.CustomGraph = cachedGraph; + + m_portsChanged = true; + } + + void InputPortSwitchRestriction( WirePort port ) + { + switch( port.DataType ) + { + case WirePortDataType.OBJECT: + break; + case WirePortDataType.FLOAT: + case WirePortDataType.FLOAT2: + case WirePortDataType.FLOAT3: + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: + case WirePortDataType.INT: + { + port.CreatePortRestrictions( WirePortDataType.FLOAT, WirePortDataType.FLOAT2, WirePortDataType.FLOAT3, WirePortDataType.FLOAT4, WirePortDataType.COLOR, WirePortDataType.INT, WirePortDataType.OBJECT ); + } + break; + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + { + port.CreatePortRestrictions( WirePortDataType.FLOAT3x3, WirePortDataType.FLOAT4x4, WirePortDataType.OBJECT ); + } + break; + case WirePortDataType.SAMPLER1D: + case WirePortDataType.SAMPLER2D: + case WirePortDataType.SAMPLER3D: + case WirePortDataType.SAMPLERCUBE: + case WirePortDataType.SAMPLER2DARRAY: + { + port.CreatePortRestrictions( WirePortDataType.SAMPLER1D, WirePortDataType.SAMPLER2D, WirePortDataType.SAMPLER3D, WirePortDataType.SAMPLERCUBE, WirePortDataType.SAMPLER2DARRAY, WirePortDataType.OBJECT ); + } + break; + case WirePortDataType.SAMPLERSTATE: + { + port.CreatePortRestrictions( WirePortDataType.SAMPLERSTATE ); + } + break; + default: + break; + } + } + + void OutputPortSwitchRestriction( WirePort port ) + { + switch( port.DataType ) + { + case WirePortDataType.OBJECT: + break; + case WirePortDataType.FLOAT: + case WirePortDataType.FLOAT2: + case WirePortDataType.FLOAT3: + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: + case WirePortDataType.INT: + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + { + port.AddPortForbiddenTypes( WirePortDataType.SAMPLER1D, WirePortDataType.SAMPLER2D, WirePortDataType.SAMPLER3D, WirePortDataType.SAMPLERCUBE, WirePortDataType.SAMPLER2DARRAY ); + } + break; + case WirePortDataType.SAMPLER1D: + case WirePortDataType.SAMPLER2D: + case WirePortDataType.SAMPLER3D: + case WirePortDataType.SAMPLERCUBE: + case WirePortDataType.SAMPLER2DARRAY: + { + port.CreatePortRestrictions( WirePortDataType.SAMPLER1D, WirePortDataType.SAMPLER2D, WirePortDataType.SAMPLER3D, WirePortDataType.SAMPLERCUBE, WirePortDataType.SAMPLER2DARRAY, WirePortDataType.OBJECT ); + } + break; + case WirePortDataType.SAMPLERSTATE: + { + port.CreatePortRestrictions( WirePortDataType.SAMPLERSTATE ); + } + break; + default: + break; + } + } + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + ParentGraph cachedGraph = ContainerGraph.ParentWindow.CustomGraph; + m_outsideGraph = cachedGraph; + ContainerGraph.ParentWindow.CustomGraph = m_functionGraph; + + for( int i = 0; i < m_allFunctionOutputs.Count; i++ ) + { + m_allFunctionOutputs[ i ].PropagateNodeData( nodeData, ref dataCollector ); + } + + ContainerGraph.ParentWindow.CustomGraph = cachedGraph; + + base.PropagateNodeData( nodeData, ref dataCollector ); + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + UIUtils.RegisterFunctionNode( this ); + } + + public override void SetupFromCastObject( UnityEngine.Object obj ) + { + base.SetupFromCastObject( obj ); + AmplifyShaderFunction function = obj as AmplifyShaderFunction; + CommonInit( function, UniqueId ); + RefreshExternalReferences(); + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + FunctionInput functionInput = m_refreshIdsRequired ? m_allFunctionInputs[ portId ] : GetFunctionInputByUniqueId( portId ); + functionInput.PreviewIsDirty = true; + if( functionInput.AutoCast ) + { + InputPort inputPort = m_refreshIdsRequired ? m_inputPorts[ portId ] : GetInputPortByUniqueId( portId ); + inputPort.MatchPortToConnection(); + + ParentGraph cachedGraph = ContainerGraph.ParentWindow.CustomGraph; + ContainerGraph.ParentWindow.CustomGraph = m_functionGraph; + functionInput.ChangeOutputType( inputPort.DataType, false ); + ContainerGraph.ParentWindow.CustomGraph = cachedGraph; + } + + for( int i = 0; i < m_allFunctionOutputs.Count; i++ ) + { + m_outputPorts[ i ].ChangeType( m_allFunctionOutputs[ i ].InputPorts[ 0 ].DataType, false ); + } + } + + public override void OnInputPortDisconnected( int portId ) + { + base.OnInputPortDisconnected( portId ); + + FunctionInput functionInput = m_refreshIdsRequired ? m_allFunctionInputs[ portId ] : GetFunctionInputByUniqueId( portId ); + functionInput.PreviewIsDirty = true; + } + + public override void OnConnectedOutputNodeChanges( int inputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( inputPortId, otherNodeId, otherPortId, name, type ); + FunctionInput functionInput = m_refreshIdsRequired ? m_allFunctionInputs[ inputPortId ] : GetFunctionInputByUniqueId( inputPortId ); + functionInput.PreviewIsDirty = true; + if( functionInput.AutoCast ) + { + InputPort inputPort = m_refreshIdsRequired ? m_inputPorts[ inputPortId ] : GetInputPortByUniqueId( inputPortId ); + inputPort.MatchPortToConnection(); + + ParentGraph cachedGraph = ContainerGraph.ParentWindow.CustomGraph; + ContainerGraph.ParentWindow.CustomGraph = m_functionGraph; + functionInput.ChangeOutputType( inputPort.DataType, false ); + ContainerGraph.ParentWindow.CustomGraph = cachedGraph; + } + + for( int i = 0; i < m_allFunctionOutputs.Count; i++ ) + { + m_outputPorts[ i ].ChangeType( m_allFunctionOutputs[ i ].InputPorts[ 0 ].DataType, false ); + } + } + + public override void DrawProperties() + { + base.DrawProperties(); + + if( Function == null ) + return; + + if( Function.Description.Length > 0 || m_allFunctionSwitches.Count > 0 ) + NodeUtils.DrawPropertyGroup( ref m_parametersFoldout, "Parameters", DrawDescription ); + + bool drawInternalDataUI = false; + int inputCount = m_inputPorts.Count; + if( inputCount > 0 ) + { + for( int i = 0; i < inputCount; i++ ) + { + if( m_inputPorts[ i ].Available && m_inputPorts[ i ].ValidInternalData && !m_inputPorts[ i ].IsConnected && m_inputPorts[ i ].AutoDrawInternalData /*&& ( m_inputPorts[ i ].AutoDrawInternalData || ( m_autoDrawInternalPortData && m_useInternalPortData ) )*/ /*&& m_inputPorts[ i ].AutoDrawInternalData*/ ) + { + drawInternalDataUI = true; + break; + } + } + } + + if( drawInternalDataUI ) + NodeUtils.DrawPropertyGroup( ref m_internalDataFoldout, Constants.InternalDataLabelStr, () => + { + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + if( m_inputPorts[ i ].ValidInternalData && !m_inputPorts[ i ].IsConnected && m_inputPorts[ i ].Visible && m_inputPorts[ i ].AutoDrawInternalData ) + { + EditorGUI.BeginChangeCheck(); + m_inputPorts[ i ].ShowInternalData( this ); + if( EditorGUI.EndChangeCheck() ) + { + m_allFunctionInputs[ i ].PreviewIsDirty = true; + } + } + } + } ); + } + + private void DrawDescription() + { + if( Function.Description.Length > 0 ) + EditorGUILayout.HelpBox( Function.Description, MessageType.Info ); + + ParentGraph cachedGraph = ContainerGraph.ParentWindow.CustomGraph; + ContainerGraph.ParentWindow.CustomGraph = m_functionGraph; + for( int i = 0; i < m_allFunctionSwitches.Count; i++ ) + { + m_allFunctionSwitches[ i ].AsDrawn = false; + } + + for( int i = 0; i < m_allFunctionSwitches.Count; i++ ) + { + if( m_allFunctionSwitches[ i ].DrawOption( this ) ) + { + m_portsChanged = true; + } + } + ContainerGraph.ParentWindow.CustomGraph = cachedGraph; + } + + private void RemoveShaderFunctionDirectivesInternal( int lod ) + { + List nodes = ContainerGraph.ParentWindow.OutsideGraph.GetMultiPassMasterNodes( lod ); + int count = nodes.Count; + for( int i = 0; i < count; i++ ) + { + nodes[ i ].PassModule.AdditionalDirectives.RemoveShaderFunctionItems( OutputId ); + } + } + + public override void Destroy() + { + m_mainPreviewNode = null; + base.Destroy(); + + m_duplicatesBuffer.Clear(); + m_duplicatesBuffer = null; + + if( m_functionGraph != null && ContainerGraph.ParentWindow.CurrentGraph != m_functionGraph ) + ContainerGraph.ParentWindow.CurrentGraph.InstancePropertyCount -= m_functionGraph.InstancePropertyCount; + + if( ContainerGraph.ParentWindow.OutsideGraph.CurrentStandardSurface != null ) + { + //for( int i = 0; i < m_includes.Count; i++ ) + //{ + // //if( ContainerGraph.ParentWindow.OutsideGraph.CurrentStandardSurface.AdditionalIncludes.OutsideList.Contains( m_includes[ i ] ) ) + // //{ + // // ContainerGraph.ParentWindow.OutsideGraph.CurrentStandardSurface.AdditionalIncludes.OutsideList.Remove( m_includes[ i ] ); + // //} + // ContainerGraph.ParentWindow.OutsideGraph.CurrentStandardSurface.AdditionalDirectives.RemoveShaderFunctionItem( AdditionalLineType.Include, m_includes[ i ] ); + //} + + //for( int i = 0; i < m_pragmas.Count; i++ ) + //{ + // //if( ContainerGraph.ParentWindow.OutsideGraph.CurrentStandardSurface.AdditionalPragmas.OutsideList.Contains( m_pragmas[ i ] ) ) + // //{ + // // ContainerGraph.ParentWindow.OutsideGraph.CurrentStandardSurface.AdditionalPragmas.OutsideList.Remove( m_pragmas[ i ] ); + // //} + // ContainerGraph.ParentWindow.OutsideGraph.CurrentStandardSurface.AdditionalDirectives.RemoveShaderFunctionItem( AdditionalLineType.Pragma, m_pragmas[ i ] ); + //} + ContainerGraph.ParentWindow.OutsideGraph.CurrentStandardSurface.AdditionalDirectives.RemoveShaderFunctionItems( OutputId/*, m_directives */); + } + else + { + if( ContainerGraph.ParentWindow.OutsideGraph.MultiPassMasterNodes.Count > 0 ) + { + for( int lod = -1; lod < ContainerGraph.ParentWindow.OutsideGraph.LodMultiPassMasternodes.Count; lod++ ) + { + RemoveShaderFunctionDirectivesInternal( lod ); + } + } + } + + + + + // Cannot GameObject.Destroy(m_directives[i]) since we would be removing them from + // the shader function asset itself + + m_directives.Clear(); + m_directives = null; + + if( m_reordenator != null ) + { + ParentGraph cachedGraph = ContainerGraph.ParentWindow.CustomGraph; + ContainerGraph.ParentWindow.CustomGraph = null; + UIUtils.UnregisterPropertyNode( m_reordenator ); + ContainerGraph.ParentWindow.CustomGraph = cachedGraph; + + m_reordenator.Destroy(); + m_reordenator = null; + } + + UIUtils.UnregisterFunctionNode( this ); + + ParentGraph cachedGraph2 = ContainerGraph.ParentWindow.CustomGraph; + ContainerGraph.ParentWindow.CustomGraph = m_functionGraph; + + if( m_allFunctionInputs != null ) + m_allFunctionInputs.Clear(); + m_allFunctionInputs = null; + + if( m_allFunctionOutputs != null ) + m_allFunctionOutputs.Clear(); + m_allFunctionOutputs = null; + + if( m_functionGraph != null ) + m_functionGraph.SoftDestroy(); + m_functionGraph = null; + + ContainerGraph.ParentWindow.CustomGraph = cachedGraph2; + m_function = null; + + m_allFunctionOutputsDict.Clear(); + m_allFunctionOutputsDict = null; + + m_allFunctionSwitchesDict.Clear(); + m_allFunctionSwitchesDict = null; + + m_allFunctionInputsDict.Clear(); + m_allFunctionInputsDict = null; + + UIUtils.CurrentWindow.OutsideGraph.OnLODMasterNodesAddedEvent -= OnLODMasterNodesAddedEvent; + } + + public override void OnNodeLogicUpdate( DrawInfo drawInfo ) + { + if( m_lateRefresh ) + { + m_lateRefresh = false; + RefreshExternalReferences(); + } + + CheckForChangesRecursively(); + + base.OnNodeLogicUpdate( drawInfo ); + ParentGraph cachedGraph = ContainerGraph.ParentWindow.CustomGraph; + ContainerGraph.ParentWindow.CustomGraph = m_functionGraph; + + if( m_functionGraph != null ) + { + int nodeCount = m_functionGraph.AllNodes.Count; + for( int i = 0; i < nodeCount; i++ ) + { + m_functionGraph.AllNodes[ i ].OnNodeLogicUpdate( drawInfo ); + } + + //if( !string.IsNullOrEmpty( FunctionGraph.CurrentFunctionOutput.SubTitle ) ) + { + SetAdditonalTitleText( FunctionGraph.CurrentFunctionOutput.SubTitle ); + } + } + + ContainerGraph.ParentWindow.CustomGraph = cachedGraph; + if( m_portsChanged ) + { + m_portsChanged = false; + for( int i = 0; i < m_allFunctionOutputs.Count; i++ ) + { + m_outputPorts[ i ].ChangeType( m_allFunctionOutputs[ i ].InputPorts[ 0 ].DataType, false ); + } + + CheckPortVisibility(); + } + } + + public override void Draw( DrawInfo drawInfo ) + { + //CheckForChangesRecursively(); + + if( !m_initialGraphDraw && drawInfo.CurrentEventType == EventType.Repaint ) + { + m_initialGraphDraw = true; + ParentGraph cachedGraph = ContainerGraph.ParentWindow.CustomGraph; + ContainerGraph.ParentWindow.CustomGraph = m_functionGraph; + if( m_functionGraph != null ) + { + for( int i = 0; i < m_functionGraph.AllNodes.Count; i++ ) + { + ParentNode node = m_functionGraph.AllNodes[ i ]; + if( node != null ) + { + node.OnNodeLayout( drawInfo ); + } + } + } + ContainerGraph.ParentWindow.CustomGraph = cachedGraph; + } + + base.Draw( drawInfo ); + } + + public bool CheckForChanges( bool forceCheck = false, bool forceChange = false ) + { + if( ( ContainerGraph.ParentWindow.CheckFunctions || forceCheck || forceChange ) && m_function != null ) + { + //string newCheckSum = LastLine( m_function.FunctionInfo ); + string newCheckSum = AssetDatabase.GetAssetDependencyHash( AssetDatabase.GetAssetPath( m_function ) ).ToString(); + if( !m_functionCheckSum.Equals( newCheckSum ) || forceChange ) + { + m_functionCheckSum = newCheckSum; + ContainerGraph.OnDuplicateEvent += DuplicateMe; + return true; + } + } + return false; + } + + public bool CheckForChangesRecursively() + { + if( m_functionGraph == null ) + return false; + + bool result = false; + for( int i = 0; i < m_functionGraph.FunctionNodes.NodesList.Count; i++ ) + { + if( m_functionGraph.FunctionNodes.NodesList[ i ].CheckForChangesRecursively() ) + result = true; + } + if( CheckForChanges( false, result ) ) + result = true; + + return result; + } + + public void DuplicateMe() + { + bool previewOpen = m_showPreview; + + string allOptions = m_allFunctionSwitches.Count.ToString(); + for( int i = 0; i < m_allFunctionSwitches.Count; i++ ) + { + allOptions += "," + m_allFunctionSwitches[ i ].UniqueId + "," + m_allFunctionSwitches[ i ].GetCurrentSelectedInput(); + } + + ReadOptionsHelper = allOptions.Split( ',' ); + + ParentGraph cachedGraph = ContainerGraph.ParentWindow.CustomGraph; + ContainerGraph.ParentWindow.CustomGraph = null; + MasterNode masterNode = ContainerGraph.ParentWindow.CurrentGraph.CurrentMasterNode; + if( masterNode != null ) + masterNode.InvalidateMaterialPropertyCount(); + + ContainerGraph.ParentWindow.CustomGraph = cachedGraph; + + ParentNode newNode = ContainerGraph.CreateNode( m_function, false, Vec2Position ); + newNode.ShowPreview = previewOpen; + ( newNode as FunctionNode ).ReadOptionsHelper = ReadOptionsHelper; + newNode.RefreshExternalReferences(); + if( ( newNode as FunctionNode ).m_reordenator && m_reordenator ) + ( newNode as FunctionNode ).m_reordenator.OrderIndex = m_reordenator.OrderIndex; + + for( int i = 0; i < m_outputPorts.Count; i++ ) + { + if( m_outputPorts[ i ].IsConnected ) + { + OutputPort newOutputPort = newNode.GetOutputPortByUniqueId( m_outputPorts[ i ].PortId ); + if( newNode.OutputPorts != null && newOutputPort != null ) + { + for( int j = m_outputPorts[ i ].ExternalReferences.Count - 1; j >= 0; j-- ) + { + ContainerGraph.CreateConnection( m_outputPorts[ i ].ExternalReferences[ j ].NodeId, m_outputPorts[ i ].ExternalReferences[ j ].PortId, newOutputPort.NodeId, newOutputPort.PortId ); + } + } + } + //else + //{ + //if( newNode.OutputPorts != null && newNode.OutputPorts[ i ] != null ) + //{ + // ContainerGraph.DeleteConnection( false, newNode.UniqueId, newNode.OutputPorts[ i ].PortId, false, false, false ); + //} + //} + } + + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + if( m_inputPorts[ i ].IsConnected ) + { + InputPort newInputPort = newNode.GetInputPortByUniqueId( m_inputPorts[ i ].PortId ); + if( newNode.InputPorts != null && newInputPort != null ) + { + ContainerGraph.CreateConnection( newInputPort.NodeId, newInputPort.PortId, m_inputPorts[ i ].ExternalReferences[ 0 ].NodeId, m_inputPorts[ i ].ExternalReferences[ 0 ].PortId ); + } + } + } + + ContainerGraph.OnDuplicateEvent -= DuplicateMe; + + if( Selected ) + { + ContainerGraph.DeselectNode( this ); + ContainerGraph.SelectNode( newNode, true, false ); + } + + ContainerGraph.DestroyNode( this, false ); + } + + private FunctionOutput GetFunctionOutputByUniqueId( int uniqueId ) + { + int listCount = m_allFunctionOutputs.Count; + if( m_allFunctionOutputsDict.Count != m_allFunctionOutputs.Count ) + { + m_allFunctionOutputsDict.Clear(); + for( int i = 0; i < listCount; i++ ) + { + m_allFunctionOutputsDict.Add( m_allFunctionOutputs[ i ].UniqueId, m_allFunctionOutputs[ i ] ); + } + } + + if( m_allFunctionOutputsDict.ContainsKey( uniqueId ) ) + return m_allFunctionOutputsDict[ uniqueId ]; + + return null; + } + + private FunctionInput GetFunctionInputByUniqueId( int uniqueId ) + { + int listCount = m_allFunctionInputs.Count; + if( m_allFunctionInputsDict.Count != m_allFunctionInputs.Count ) + { + m_allFunctionInputsDict.Clear(); + for( int i = 0; i < listCount; i++ ) + { + m_allFunctionInputsDict.Add( m_allFunctionInputs[ i ].UniqueId, m_allFunctionInputs[ i ] ); + } + } + + if( m_allFunctionInputsDict.ContainsKey( uniqueId ) ) + return m_allFunctionInputsDict[ uniqueId ]; + + return null; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + OutputPort outputPort = GetOutputPortByUniqueId( outputId ); + FunctionOutput functionOutput = GetFunctionOutputByUniqueId( outputId ); + + if( outputPort.IsLocalValue( dataCollector.PortCategory ) ) + return outputPort.LocalValue( dataCollector.PortCategory ); + + m_functionGraph.CurrentPrecision = ContainerGraph.ParentWindow.CurrentGraph.CurrentPrecision; + ParentGraph cachedGraph = ContainerGraph.ParentWindow.CustomGraph; + m_outsideGraph = cachedGraph; + ContainerGraph.ParentWindow.CustomGraph = m_functionGraph; +#if ADD_SHADER_FUNCTION_HEADERS + if( m_reordenator != null && m_reordenator.RecursiveCount() > 0 && m_reordenator.HasTitle ) + { + dataCollector.AddToProperties( UniqueId, "[Header(" + m_reordenator.HeaderTitle.Replace( "-", " " ) + ")]", m_reordenator.OrderIndex ); + } +#endif + string result = string.Empty; + for( int i = 0; i < m_allFunctionInputs.Count; i++ ) + { + if( !m_allFunctionInputs[ i ].InputPorts[ 0 ].IsConnected || m_inputPorts[ i ].IsConnected ) + m_allFunctionInputs[ i ].OnPortGeneration += FunctionNodeOnPortGeneration; + } + + result += functionOutput.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + + for( int i = 0; i < m_allFunctionInputs.Count; i++ ) + { + if( !m_allFunctionInputs[ i ].InputPorts[ 0 ].IsConnected || m_inputPorts[ i ].IsConnected ) + m_allFunctionInputs[ i ].OnPortGeneration -= FunctionNodeOnPortGeneration; + } + + ContainerGraph.ParentWindow.CustomGraph = cachedGraph; + + if( outputPort.ConnectionCount > 1 ) + RegisterLocalVariable( outputId, result, ref dataCollector ); + else + outputPort.SetLocalValue( result, dataCollector.PortCategory ); + + return outputPort.LocalValue( dataCollector.PortCategory ); + } + + private string FunctionNodeOnPortGeneration( ref MasterNodeDataCollector dataCollector, int index, ParentGraph graph ) + { + ParentGraph cachedGraph = ContainerGraph.ParentWindow.CustomGraph; + ContainerGraph.ParentWindow.CustomGraph = m_outsideGraph; + string result = m_inputPorts[ index ].GeneratePortInstructions( ref dataCollector ); + ContainerGraph.ParentWindow.CustomGraph = cachedGraph; + return result; + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + + if( Function != null ) + IOUtils.AddFieldValueToString( ref nodeInfo, m_function.name ); + else + IOUtils.AddFieldValueToString( ref nodeInfo, m_filename ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_reordenator != null ? m_reordenator.RawOrderIndex : -1 ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_headerTitle ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_functionGraphId ); + IOUtils.AddFieldValueToString( ref nodeInfo, AssetDatabase.AssetPathToGUID( AssetDatabase.GetAssetPath( m_function ) ) ); + + int functionSwitchCount = m_allFunctionSwitches != null ? m_allFunctionSwitches.Count : 0; + string allOptions = functionSwitchCount.ToString(); + for( int i = 0; i < functionSwitchCount; i++ ) + { + allOptions += "," + m_allFunctionSwitches[ i ].UniqueId + "," + m_allFunctionSwitches[ i ].GetCurrentSelectedInput(); + } + IOUtils.AddFieldValueToString( ref nodeInfo, allOptions ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_filename = GetCurrentParam( ref nodeParams ); + m_orderIndex = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_headerTitle = GetCurrentParam( ref nodeParams ); + + if( UIUtils.CurrentShaderVersion() > 7203 ) + { + m_functionGraphId = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + + if( UIUtils.CurrentShaderVersion() > 13704 ) + { + m_functionGUID = GetCurrentParam( ref nodeParams ); + } + + AmplifyShaderFunction loaded = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( m_functionGUID ) ); + if( loaded != null ) + { + CommonInit( loaded, UniqueId ); + } + else + { + string[] guids = AssetDatabase.FindAssets( "t:AmplifyShaderFunction " + m_filename ); + if( guids.Length > 0 ) + { + string sfGuid = null; + + foreach( string guid in guids ) + { + string assetPath = AssetDatabase.GUIDToAssetPath( guid ); + string name = System.IO.Path.GetFileNameWithoutExtension( assetPath ); + if( name.Equals( m_filename, StringComparison.OrdinalIgnoreCase ) ) + { + sfGuid = guid; + break; + } + } + loaded = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( sfGuid ) ); + + if( loaded != null ) + { + CommonInit( loaded, UniqueId ); + } + else + { + SetTitleText( "ERROR" ); + UIUtils.ShowMessage( UniqueId, string.Format( "Error loading {0} shader function from project folder", m_filename ), MessageSeverity.Error ); + } + } + else + { + SetTitleText( "Missing Function" ); + UIUtils.ShowMessage( UniqueId, string.Format( "Missing {0} shader function on project folder", m_filename ), MessageSeverity.Error ); + } + } + if( UIUtils.CurrentShaderVersion() > 14203 ) + { + ReadOptionsHelper = GetCurrentParam( ref nodeParams ).Split( ',' ); + } + } + + public override void ReadOutputDataFromString( ref string[] nodeParams ) + { + if( Function == null ) + return; + + base.ReadOutputDataFromString( ref nodeParams ); + + ConfigureInputportsAfterRead(); + } + + public override void OnNodeDoubleClicked( Vector2 currentMousePos2D ) + { + if( Function == null ) + return; + + ContainerGraph.DeSelectAll(); + this.Selected = true; + + ContainerGraph.ParentWindow.OnLeftMouseUp(); + AmplifyShaderEditorWindow.LoadShaderFunctionToASE( Function, true ); + this.Selected = false; + } + + private void ConfigureInputportsAfterRead() + { + if( InputPorts != null ) + { + int inputCount = InputPorts.Count; + for( int i = 0; i < inputCount; i++ ) + { + InputPorts[ i ].ChangeProperties( m_allFunctionInputs[ i ].InputName, m_allFunctionInputs[ i ].SelectedInputType, false ); + } + } + + if( OutputPorts != null ) + { + int outputCount = OutputPorts.Count; + for( int i = 0; i < outputCount; i++ ) + { + OutputPorts[ i ].ChangeProperties( m_allFunctionOutputs[ i ].OutputName, m_allFunctionOutputs[ i ].AutoOutputType, false ); + } + } + } + + private void CheckPortVisibility() + { + bool changes = false; + if( InputPorts != null ) + { + for( int i = 0; i < m_allFunctionInputs.Count; i++ ) + { + if( m_inputPorts[ i ].Visible != m_allFunctionInputs[ i ].IsConnected ) + { + m_inputPorts[ i ].Visible = m_allFunctionInputs[ i ].IsConnected; + changes = true; + } + } + } + + if( changes ) + m_sizeIsDirty = true; + } + + public bool HasProperties { get { return m_reordenator != null; } } + + public ParentGraph FunctionGraph + { + get { return m_functionGraph; } + set { m_functionGraph = value; } + } + + public AmplifyShaderFunction Function + { + get { return m_function; } + set { m_function = value; } + } + + public override void RecordObjectOnDestroy( string Id ) + { + base.RecordObjectOnDestroy( Id ); + if( m_reordenator != null ) + m_reordenator.RecordObject( Id ); + + if( m_functionGraph != null ) + { + Undo.RegisterCompleteObjectUndo( m_functionGraph, Id ); + for( int i = 0; i < m_functionGraph.AllNodes.Count; i++ ) + { + m_functionGraph.AllNodes[ i ].RecordObject( Id ); + } + } + } + + public override void SetContainerGraph( ParentGraph newgraph ) + { + base.SetContainerGraph( newgraph ); + if( m_functionGraph == null ) + return; + for( int i = 0; i < m_functionGraph.AllNodes.Count; i++ ) + { + m_functionGraph.AllNodes[ i ].SetContainerGraph( m_functionGraph ); + } + } + + public override void OnMasterNodeReplaced( MasterNode newMasterNode ) + { + base.OnMasterNodeReplaced( newMasterNode ); + if( m_functionGraph == null ) + return; + + m_functionGraph.FireMasterNodeReplacedEvent( newMasterNode ); + + StandardSurfaceOutputNode surface = newMasterNode as StandardSurfaceOutputNode; + if( surface != null ) + { + surface.AdditionalDirectives.AddShaderFunctionItems( OutputId, Function.AdditionalDirectives.DirectivesList ); + } + else + { + if( ContainerGraph.ParentWindow.OutsideGraph.MultiPassMasterNodes.Count > 0 ) + { + for( int lod = -1; lod < ContainerGraph.ParentWindow.OutsideGraph.LodMultiPassMasternodes.Count; lod++ ) + { + AddShaderFunctionDirectivesInternal( lod ); + } + } + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionNode.cs.meta new file mode 100644 index 0000000..15ea8d3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7b3de46feda5b0f4ea58c852c4a521a9 +timeCreated: 1492001141 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionOutput.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionOutput.cs new file mode 100644 index 0000000..baa4963 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionOutput.cs @@ -0,0 +1,318 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Function Output", "Functions", "Function Output adds an output port to the shader function, it's port type is determined automatically.", NodeAvailabilityFlags = (int)NodeAvailability.ShaderFunction )] + public sealed class FunctionOutput : OutputNode + { + public FunctionOutput() : base() { CommonInit(); } + public FunctionOutput( int uniqueId, float x, float y, float width, float height ) : base( uniqueId, x, y, width, height ) { CommonInit(); } + + [SerializeField] + private bool m_previewNode = false; + + [SerializeField] + private string m_outputName = "Output"; + + [SerializeField] + private int m_orderIndex = -1; + + [SerializeField] + private AmplifyShaderFunction m_function; + + //Title editing + [SerializeField] + private string m_uniqueName; + + private bool m_isEditing; + private bool m_stopEditing; + private bool m_startEditing; + private double m_clickTime; + private double m_doubleClickTime = 0.3; + private Rect m_titleClickArea; + private bool m_showTitleWhenNotEditing = true; + + [SerializeField] + private string m_subTitle = string.Empty; + + + void CommonInit() + { + m_isMainOutputNode = false; + m_connStatus = NodeConnectionStatus.Connected; + m_activeType = GetType(); + m_currentPrecisionType = PrecisionType.Inherit; + m_textLabelWidth = 100; + m_autoWrapProperties = true; + AddInputPort( WirePortDataType.FLOAT, false, " " ); + AddOutputPort( WirePortDataType.FLOAT, " " ); + m_outputPorts[ 0 ].Visible = false; + SetTitleText( m_outputName ); + m_previewShaderGUID = "e6d5f64114b18e24f99dc65290c0fe98"; + } + + public override void SetupNodeCategories() + { + //base.SetupNodeCategories(); + ContainerGraph.ResetNodesData(); + MasterNode masterNode = ContainerGraph.ParentWindow.CurrentGraph.CurrentMasterNode; + if( masterNode != null ) + { + int count = m_inputPorts.Count; + for( int i = 0; i < count; i++ ) + { + if( m_inputPorts[ i ].IsConnected ) + { + NodeData nodeData = new NodeData( m_inputPorts[ i ].Category ); + ParentNode node = m_inputPorts[ i ].GetOutputNode(); + MasterNodeDataCollector temp = masterNode.CurrentDataCollector; + node.PropagateNodeData( nodeData, ref temp ); + temp = null; + } + } + } + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + UIUtils.RegisterFunctionOutputNode( this ); + if( m_nodeAttribs != null ) + m_uniqueName = m_nodeAttribs.Name + UniqueId; + } + + + public override void Destroy() + { + base.Destroy(); + UIUtils.UnregisterFunctionOutputNode( this ); + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + m_inputPorts[ 0 ].MatchPortToConnection(); + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + } + + public override void OnConnectedOutputNodeChanges( int outputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( outputPortId, otherNodeId, otherPortId, name, type ); + m_inputPorts[ 0 ].MatchPortToConnection(); + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + return m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUI.BeginChangeCheck(); + m_outputName = EditorGUILayoutTextField( "Name", m_outputName ); + + if( EditorGUI.EndChangeCheck() ) + { + SetTitleText( m_outputName ); + UIUtils.UpdateFunctionOutputData( UniqueId, m_outputName ); + } + + EditorGUI.BeginDisabledGroup( m_previewNode ); + if( GUILayout.Button( "Set as Preview" ) ) + { + List allOutputs = UIUtils.FunctionOutputList(); + + foreach( FunctionOutput item in allOutputs ) + item.PreviewNode = false; + + m_previewNode = true; + } + EditorGUI.EndDisabledGroup(); + } + [SerializeField] + private string m_currentTitle = string.Empty; + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + if( m_previewNode ) + m_currentTitle = "Preview"; + else + m_currentTitle = string.Empty; + + SetAdditonalTitleTextOnCallback( m_currentTitle, ( instance, newSubTitle ) => instance.AdditonalTitleContent.text = newSubTitle ); + + if( ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD3 ) + { + if( !m_isEditing && ( ( !ContainerGraph.ParentWindow.MouseInteracted && drawInfo.CurrentEventType == EventType.MouseDown && m_titleClickArea.Contains( drawInfo.MousePosition ) ) ) ) + { + if( ( EditorApplication.timeSinceStartup - m_clickTime ) < m_doubleClickTime ) + m_startEditing = true; + else + GUI.FocusControl( null ); + m_clickTime = EditorApplication.timeSinceStartup; + } + else if( m_isEditing && ( ( drawInfo.CurrentEventType == EventType.MouseDown && !m_titleClickArea.Contains( drawInfo.MousePosition ) ) || !EditorGUIUtility.editingTextField ) ) + { + m_stopEditing = true; + } + + if( m_isEditing || m_startEditing ) + { + EditorGUI.BeginChangeCheck(); + GUI.SetNextControlName( m_uniqueName ); + m_outputName = EditorGUITextField( m_titleClickArea, string.Empty, m_outputName, UIUtils.GetCustomStyle( CustomStyle.NodeTitle ) ); + if( EditorGUI.EndChangeCheck() ) + { + SetTitleText( m_outputName ); + UIUtils.UpdateFunctionInputData( UniqueId, m_outputName ); + } + + if( m_startEditing ) + EditorGUI.FocusTextInControl( m_uniqueName ); + + } + + if( drawInfo.CurrentEventType == EventType.Repaint ) + { + if( m_startEditing ) + { + m_startEditing = false; + m_isEditing = true; + } + + if( m_stopEditing ) + { + m_stopEditing = false; + m_isEditing = false; + GUI.FocusControl( null ); + } + } + } + } + + public override void OnNodeLayout( DrawInfo drawInfo ) + { + // RUN LAYOUT CHANGES AFTER TITLES CHANGE + base.OnNodeLayout( drawInfo ); + m_titleClickArea = m_titlePos; + m_titleClickArea.height = Constants.NODE_HEADER_HEIGHT; + } + + public override void OnNodeRepaint( DrawInfo drawInfo ) + { + base.OnNodeRepaint( drawInfo ); + + if( !m_isVisible ) + return; + + // Fixed Title ( only renders when not editing ) + if( m_showTitleWhenNotEditing && !m_isEditing && !m_startEditing && ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD3 ) + { + GUI.Label( m_titleClickArea, m_content, UIUtils.GetCustomStyle( CustomStyle.NodeTitle ) ); + } + } + + public override void OnNodeDoubleClicked( Vector2 currentMousePos2D ) + { + if( currentMousePos2D.y - m_globalPosition.y > ( Constants.NODE_HEADER_HEIGHT + Constants.NODE_HEADER_EXTRA_HEIGHT ) * ContainerGraph.ParentWindow.CameraDrawInfo.InvertedZoom ) + { + ContainerGraph.ParentWindow.ParametersWindow.IsMaximized = !ContainerGraph.ParentWindow.ParametersWindow.IsMaximized; + } + } + + public WirePortDataType AutoOutputType + { + get { return m_inputPorts[ 0 ].DataType; } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_outputName ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_orderIndex ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_previewNode ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_outputName = GetCurrentParam( ref nodeParams ); + m_orderIndex = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + + if( UIUtils.CurrentShaderVersion() > 13706 ) + m_previewNode = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + + if( IsNodeBeingCopied ) + PreviewNode = false; + + if( m_function == null ) + m_function = UIUtils.CurrentWindow.OpenedShaderFunction; + + if( m_isMainOutputNode && m_function != null ) + { + m_function.UpdateDirectivesList(); + } + + SetTitleText( m_outputName ); + UIUtils.UpdateFunctionOutputData( UniqueId, m_outputName ); + } + + public AmplifyShaderFunction Function + { + get { return m_function; } + set + { + m_function = value; + if( m_isMainOutputNode && m_function != null ) + { + m_function.UpdateDirectivesList(); + } + } + } + + public string OutputName + { + get { return m_outputName; } + } + + public int OrderIndex + { + get { return m_orderIndex; } + set { m_orderIndex = value; } + } + + public string SubTitle + { + get { return m_subTitle; } + set { m_subTitle = value; } + } + + public bool PreviewNode + { + get { return m_previewNode; } + set + { + m_previewNode = value; + m_sizeIsDirty = true; + if( m_previewNode ) + { + m_currentTitle = "Preview"; + } + else + { + m_currentTitle = ""; + } + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionOutput.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionOutput.cs.meta new file mode 100644 index 0000000..7ece512 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionOutput.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6293b1f56d13d6c4ca6a8e2a8099cca9 +timeCreated: 1491917775 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionSubtitle.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionSubtitle.cs new file mode 100644 index 0000000..b912446 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionSubtitle.cs @@ -0,0 +1,124 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Function Subtitle", "Functions", "Adds a subtitle to its shader function", NodeAvailabilityFlags = (int)NodeAvailability.ShaderFunction )] + public sealed class FunctionSubtitle : ParentNode + { + + //protected override void CommonInit( int uniqueId ) + //{ + // base.CommonInit( uniqueId ); + // AddInputPort( WirePortDataType.FLOAT, false, Constants.EmptyPortValue ); + // AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + // m_autoWrapProperties = true; + // m_textLabelWidth = 100; + // //SetTitleText( m_inputName ); + // //SetAdditonalTitleText( "( " + m_inputValueTypes[ m_selectedInputTypeInt ] + " )" ); + // m_previewShaderGUID = "04bc8e7b317dccb4d8da601680dd8140"; + //} + [SerializeField] + private string m_subtitle = "Subtitle"; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, Constants.EmptyPortValue ); + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + m_autoWrapProperties = true; + m_textLabelWidth = 100; + SetTitleText( m_subtitle ); + m_previewShaderGUID = "74e4d859fbdb2c0468de3612145f4929"; + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + m_inputPorts[ 0 ].MatchPortToConnection(); + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + } + + public override void OnConnectedOutputNodeChanges( int outputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( outputPortId, otherNodeId, otherPortId, name, type ); + m_inputPorts[ 0 ].MatchPortToConnection(); + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + return m_inputPorts[ 0 ].GenerateShaderForOutput( ref dataCollector, m_inputPorts[ 0 ].DataType, ignoreLocalvar ); + } + + //public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + //{ + // base.PropagateNodeData( nodeData, ref dataCollector ); + + // //if( m_containerGraph.CurrentShaderFunction != null ) + // //m_containerGraph.CurrentShaderFunction.FunctionSubtitle = m_subttile; + //} + + public override void OnNodeLogicUpdate( DrawInfo drawInfo ) + { + base.OnNodeLogicUpdate( drawInfo ); + //public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + //{ + // base.PropagateNodeData( nodeData, ref dataCollector ); + //Debug.Log( IsConnected + " " + m_containerGraph.CurrentFunctionOutput ); + if( m_containerGraph.CurrentFunctionOutput != null && IsConnected ) + m_containerGraph.CurrentFunctionOutput.SubTitle = m_subtitle; + // m_containerGraph.CurrentShaderFunction.FunctionSubtitle = m_subttile; + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUILayout.BeginVertical(); + EditorGUI.BeginChangeCheck(); + m_subtitle = EditorGUILayoutTextField( "Name", m_subtitle ); + if( EditorGUI.EndChangeCheck() ) + { + SetTitleText( m_subtitle ); + //UIUtils.UpdateFunctionInputData( UniqueId, m_inputName ); + } + EditorGUI.BeginChangeCheck(); + //m_selectedInputTypeInt = EditorGUILayoutPopup( InputTypeStr, m_selectedInputTypeInt, m_inputValueTypes ); + //if( EditorGUI.EndChangeCheck() ) + //{ + // UpdatePorts(); + // SetAdditonalTitleText( "( " + m_inputValueTypes[ m_selectedInputTypeInt ] + " )" ); + //} + + //m_autoCast = EditorGUILayoutToggle( "Auto Cast", m_autoCast ); + + //EditorGUILayout.Separator(); + //if( !m_inputPorts[ 0 ].IsConnected && m_inputPorts[ 0 ].ValidInternalData ) + //{ + // m_inputPorts[ 0 ].ShowInternalData( this, true, "Default Value" ); + //} + + + EditorGUILayout.EndVertical(); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_subtitle ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_subtitle = GetCurrentParam( ref nodeParams ); + SetTitleText( m_subtitle ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionSubtitle.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionSubtitle.cs.meta new file mode 100644 index 0000000..bd87bd9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionSubtitle.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 97d5e0cd26200a64fa9d127599406008 +timeCreated: 1522434121 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionSwitch.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionSwitch.cs new file mode 100644 index 0000000..d10be2d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionSwitch.cs @@ -0,0 +1,885 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Function Switch", "Functions", "Function Switch allows switching options at compile time for shader function", NodeAvailabilityFlags = (int)NodeAvailability.ShaderFunction )] + public sealed class FunctionSwitch : ParentNode + { + private const string InputPortNameStr = "In "; + + private const string ToggleFalseStr = "False"; + private const string ToggleTrueStr = "True"; + + private const string CurrSelectedStr = "Current"; + private const string MaxAmountStr = "Amount"; + private const int MaxAllowedAmount = 9; + + private const int MinComboSize = 50; + private const int MaxComboSize = 105; + + [SerializeField] + private string m_optionLabel = "Option"; + + [SerializeField] + private string[] AvailableInputsLabels = { "In 0", "In 1" }; + + [SerializeField] + private int[] AvailableInputsValues = { 0, 1 }; + + [SerializeField] + private int m_previousSelectedInput = 0; + + [SerializeField] + private int m_currentSelectedInput = 0; + + [SerializeField] + private int m_maxAmountInputs = 2; + + [SerializeField] + private bool m_toggleMode = false; + + [SerializeField] + private string[] m_optionNames = { "In 0", "In 1", "In 2", "In 3", "In 4", "In 5", "In 6", "In 7", "In 8" }; + + [SerializeField] + private int m_orderIndex = -1; + + [SerializeField] + private TexReferenceType m_referenceType = TexReferenceType.Object; + + [SerializeField] + private FunctionSwitch m_functionSwitchReference = null; + + [SerializeField] + private int m_referenceUniqueId = -1; + + [SerializeField] + private bool m_validReference = false; + + private bool m_asDrawn = false; + + private GUIContent m_checkContent; + private GUIContent m_popContent; + + private const double MaxTimestamp = 1; + private bool m_nameModified = false; + private double m_lastTimeNameModified = 0; + + private Rect m_varRect; + private Rect m_imgRect; + private bool m_editing; + + private int m_cachedPropertyId = -1; + + private bool m_dirtySettings = false; + + [SerializeField] + private int m_refMaxInputs = -1; + + [SerializeField] + private string m_refOptionLabel = string.Empty; + + [SerializeField] + private int m_refSelectedInput = -1; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + for( int i = 0; i < MaxAllowedAmount; i++ ) + { + AddInputPort( WirePortDataType.FLOAT, false, InputPortNameStr + i ); + m_inputPorts[ i ].Visible = ( i < 2 ); + } + AddOutputPort( WirePortDataType.FLOAT, " " ); + + m_checkContent = new GUIContent(); + m_checkContent.image = UIUtils.CheckmarkIcon; + + m_popContent = new GUIContent(); + m_popContent.image = UIUtils.PopupIcon; + + m_textLabelWidth = 100; + m_autoWrapProperties = true; + m_insideSize.Set( 80, 25 ); + m_previewShaderGUID = "a58e46feaa5e3d14383bfeac24d008bc"; + } + + public void SetCurrentSelectedInput( int newValue, int prevValue ) + { + m_previousSelectedInput = prevValue; + if( m_validReference ) + m_currentSelectedInput = Mathf.Clamp( newValue, 0, m_refMaxInputs - 1 ); + else + m_currentSelectedInput = Mathf.Clamp( newValue, 0, m_maxAmountInputs - 1 ); + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ m_currentSelectedInput ].DataType, false ); + PreviewIsDirty = true; + ChangeSignalPropagation(); + } + + public int GetCurrentSelectedInput() + { + return m_currentSelectedInput; + } + + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + if( m_cachedPropertyId == -1 ) + m_cachedPropertyId = Shader.PropertyToID( "_Current" ); + + PreviewMaterial.SetInt( m_cachedPropertyId, m_currentSelectedInput ); + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + if( m_referenceType == TexReferenceType.Object ) + { + UIUtils.RegisterFunctionSwitchNode( this ); + } + else + { + if( ContainerGraph.ParentWindow.CustomGraph != null ) + UIUtils.RegisterFunctionSwitchNode( this ); + UIUtils.RegisterFunctionSwitchCopyNode( this ); + } + } + + public override void Destroy() + { + base.Destroy(); + + m_functionSwitchReference = null; + m_referenceUniqueId = -1; + + if( m_referenceType == TexReferenceType.Object ) + { + UIUtils.UnregisterFunctionSwitchNode( this ); + } + else + { + UIUtils.UnregisterFunctionSwitchNode( this ); + UIUtils.UnregisterFunctionSwitchCopyNode( this ); + } + } + + public override void OnConnectedOutputNodeChanges( int portId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( portId, otherNodeId, otherPortId, name, type ); + m_inputPorts[ portId ].MatchPortToConnection(); + if( portId == m_currentSelectedInput ) + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ portId ].DataType, false ); + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + InputPort port = GetInputPortByUniqueId( portId ); + int arrayPos = m_inputPorts.IndexOf( port ); + if( activateNode && m_connStatus == NodeConnectionStatus.Connected && arrayPos == m_currentSelectedInput ) + { + port.GetOutputNode().ActivateNode( m_activeNode, m_activePort, m_activeType ); + } + + OnNodeChange(); + SetSaveIsDirty(); + + m_inputPorts[ portId ].MatchPortToConnection(); + if( arrayPos == m_currentSelectedInput ) + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ portId ].DataType, false ); + } + + public override void ActivateNode( int signalGenNodeId, int signalGenPortId, Type signalGenNodeType ) + { + if( m_selfPowered ) + return; + + ConnStatus = m_restrictions.GetRestiction( signalGenNodeType, signalGenPortId ) ? NodeConnectionStatus.Error : NodeConnectionStatus.Connected; + m_activeConnections += 1; + + m_activeType = signalGenNodeType; + m_activeNode = signalGenNodeId; + m_activePort = signalGenPortId; + if( m_activeConnections == 1 ) + if( m_inputPorts[ m_currentSelectedInput ].IsConnected ) + m_inputPorts[ m_currentSelectedInput ].GetOutputNode().ActivateNode( signalGenNodeId, signalGenPortId, signalGenNodeType ); + + SetSaveIsDirty(); + } + + public override void DeactivateInputPortNode( int deactivatedPort, bool forceComplete ) + { + InputPort port = GetInputPortByUniqueId( deactivatedPort ); + if( deactivatedPort == m_currentSelectedInput ) + port.GetOutputNode().DeactivateNode( deactivatedPort, false ); + } + + public override void DeactivateNode( int deactivatedPort, bool forceComplete ) + { + if( m_selfPowered ) + return; + + SetSaveIsDirty(); + m_activeConnections -= 1; + + if( ( forceComplete || m_activeConnections <= 0 ) ) + { + m_activeConnections = 0; + ConnStatus = NodeConnectionStatus.Not_Connected; + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + if( m_inputPorts[ i ].IsConnected && i == m_currentSelectedInput ) + { + ParentNode node = m_inputPorts[ i ].GetOutputNode(); + if( node != null ) + node.DeactivateNode( deactivatedPort == -1 ? m_inputPorts[ i ].PortId : deactivatedPort, false ); + } + } + } + } + + public void ChangeSignalPropagation() + { + if( m_previousSelectedInput != m_currentSelectedInput && ConnStatus == NodeConnectionStatus.Connected ) + { + if( m_inputPorts[ m_previousSelectedInput ].IsConnected ) + m_inputPorts[ m_previousSelectedInput ].GetOutputNode().DeactivateNode( m_inputPorts[ m_previousSelectedInput ].PortId, false ); + + if( m_inputPorts[ m_currentSelectedInput ].IsConnected ) + m_inputPorts[ m_currentSelectedInput ].GetOutputNode().ActivateNode( UniqueId, m_inputPorts[ m_currentSelectedInput ].PortId, m_activeType ); + } + } + + public bool DrawOption( ParentNode owner, bool forceDraw = false ) + { + if( !IsConnected && !forceDraw ) + { + //EditorGUILayout.LabelField( "Not Connected" ); + return false; + } + + if( m_asDrawn ) //used to prevent the same property to be drawn more than once + return false; + + if( m_validReference ) + { + return m_functionSwitchReference.DrawOption( owner, true ); + } + + int prev = m_currentSelectedInput; + m_asDrawn = true; + if( m_toggleMode ) + { + m_currentSelectedInput = owner.EditorGUILayoutToggle( m_optionLabel, ( m_currentSelectedInput != 0 ? true : false ) ) ? 1 : 0; + + if( m_currentSelectedInput != prev ) + { + SetCurrentSelectedInput( m_currentSelectedInput, prev ); + return true; + } + else + { + return false; + } + } + else + { + m_currentSelectedInput = owner.EditorGUILayoutIntPopup( m_optionLabel, m_currentSelectedInput, AvailableInputsLabels, AvailableInputsValues ); + + if( m_currentSelectedInput != prev ) + { + SetCurrentSelectedInput( m_currentSelectedInput, prev ); + return true; + } + else + { + return false; + } + } + } + + public void CheckReference() + { + if( m_referenceType != TexReferenceType.Instance ) + { + m_validReference = false; + return; + } + + if( m_functionSwitchReference == null ) + { + m_validReference = false; + ResetToSelf(); + return; + } + + if( m_referenceUniqueId != m_functionSwitchReference.UniqueId ) + { + UpdateFromSelected(); + } + if( m_refSelectedInput != m_functionSwitchReference.GetCurrentSelectedInput() || m_refMaxInputs != m_functionSwitchReference.MaxAmountInputs || m_refOptionLabel != m_functionSwitchReference.OptionLabel ) + { + UpdateFromSelected(); + } + + if( m_functionSwitchReference.DirtySettings ) + { + UpdateFromSelected(); + } + + m_validReference = true; + } + + void ResetToSelf() + { + m_functionSwitchReference = null; + m_validReference = false; + m_referenceUniqueId = -1; + m_refMaxInputs = -1; + m_refOptionLabel = string.Empty; + m_refSelectedInput = -1; + + for( int i = 0; i < MaxAllowedAmount; i++ ) + { + m_inputPorts[ i ].Visible = ( i < m_maxAmountInputs ); + m_inputPorts[ i ].Name = m_optionNames[ i ]; + } + + if( m_currentSelectedInput >= m_maxAmountInputs ) + { + m_currentSelectedInput = m_maxAmountInputs - 1; + } + + UpdateLabels(); + m_sizeIsDirty = true; + } + + void UpdateFromSelected() + { + if( m_referenceUniqueId < 0 ) + return; + + m_functionSwitchReference = UIUtils.GetNode( m_referenceUniqueId ) as FunctionSwitch; + if( m_functionSwitchReference != null ) + { + m_validReference = true; + for( int i = 0; i < MaxAllowedAmount; i++ ) + { + m_inputPorts[ i ].Visible = ( i < m_functionSwitchReference.MaxAmountInputs ); + m_inputPorts[ i ].Name = m_functionSwitchReference.InputPorts[ i ].Name; + } + UpdateLabels(); + m_refMaxInputs = m_functionSwitchReference.m_maxAmountInputs; + m_refOptionLabel = m_functionSwitchReference.OptionLabel; + m_refSelectedInput = m_functionSwitchReference.GetCurrentSelectedInput(); + OrderIndex = m_functionSwitchReference.OrderIndex; + + SetCurrentSelectedInput( m_functionSwitchReference.GetCurrentSelectedInput(), m_currentSelectedInput ); + } + + m_sizeIsDirty = true; + m_isDirty = true; + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUI.BeginChangeCheck(); + { + EditorGUI.BeginChangeCheck(); + m_referenceType = (TexReferenceType)EditorGUILayoutPopup( Constants.ReferenceTypeStr, (int)m_referenceType, Constants.ReferenceArrayLabels ); + if( EditorGUI.EndChangeCheck() ) + { + if( m_referenceType == TexReferenceType.Object ) + { + if( ContainerGraph.ParentWindow.CustomGraph == null ) + UIUtils.UnregisterFunctionSwitchCopyNode( this ); + UIUtils.RegisterFunctionSwitchNode( this ); + ResetToSelf(); + } + else + { + if( ContainerGraph.ParentWindow.CustomGraph == null ) + UIUtils.UnregisterFunctionSwitchNode( this ); + UIUtils.RegisterFunctionSwitchCopyNode( this ); + } + } + + if( m_referenceType == TexReferenceType.Instance ) + { + EditorGUI.BeginChangeCheck(); + string[] arr = new string[ UIUtils.FunctionSwitchList().Count ]; + int[] ids = new int[ UIUtils.FunctionSwitchList().Count ]; + for( int i = 0; i < arr.Length; i++ ) + { + arr[ i ] = i + " - " + UIUtils.FunctionSwitchList()[ i ].OptionLabel; + ids[ i ] = UIUtils.FunctionSwitchList()[ i ].UniqueId; + } + m_referenceUniqueId = EditorGUILayout.IntPopup( Constants.AvailableReferenceStr, m_referenceUniqueId, arr, ids ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateFromSelected(); + } + return; + } + + EditorGUI.BeginChangeCheck(); + m_optionLabel = EditorGUILayoutTextField( "Option Label", m_optionLabel ); + if( EditorGUI.EndChangeCheck() ) + { + m_optionLabel = UIUtils.RemoveInvalidEnumCharacters( m_optionLabel ); + if( string.IsNullOrEmpty( m_optionLabel ) ) + { + m_optionLabel = "Option"; + } + + UIUtils.UpdateFunctionSwitchData( UniqueId, m_optionLabel ); + } + + EditorGUI.BeginChangeCheck(); + m_toggleMode = EditorGUILayoutToggle( "Toggle Mode", m_toggleMode ); + if( EditorGUI.EndChangeCheck() ) + { + if( m_toggleMode ) + { + m_inputPorts[ 0 ].Name = ToggleFalseStr; + m_inputPorts[ 1 ].Name = ToggleTrueStr; + + for( int i = 0; i < MaxAllowedAmount; i++ ) + { + m_inputPorts[ i ].Visible = ( i < 2 ); + } + + if( m_currentSelectedInput >= 2 ) + { + m_currentSelectedInput = 1; + } + UpdateLabels(); + m_sizeIsDirty = true; + } + else + { + m_inputPorts[ 0 ].Name = m_optionNames[ 0 ]; + m_inputPorts[ 1 ].Name = m_optionNames[ 1 ]; + + for( int i = 0; i < MaxAllowedAmount; i++ ) + { + m_inputPorts[ i ].Visible = ( i < m_maxAmountInputs ); + } + + if( m_currentSelectedInput >= m_maxAmountInputs ) + { + m_currentSelectedInput = m_maxAmountInputs - 1; + } + + UpdateLabels(); + m_sizeIsDirty = true; + } + } + + if( !m_toggleMode ) + { + EditorGUI.BeginChangeCheck(); + m_maxAmountInputs = EditorGUILayoutIntSlider( MaxAmountStr, m_maxAmountInputs, 2, MaxAllowedAmount ); + if( EditorGUI.EndChangeCheck() ) + { + for( int i = 0; i < MaxAllowedAmount; i++ ) + { + m_inputPorts[ i ].Visible = ( i < m_maxAmountInputs ); + } + + if( m_currentSelectedInput >= m_maxAmountInputs ) + { + m_currentSelectedInput = m_maxAmountInputs - 1; + } + + UpdateLabels(); + m_sizeIsDirty = true; + } + + EditorGUI.indentLevel++; + for( int i = 0; i < m_maxAmountInputs; i++ ) + { + EditorGUI.BeginChangeCheck(); + m_inputPorts[ i ].Name = EditorGUILayoutTextField( "Item " + i, m_inputPorts[ i ].Name ); + if( EditorGUI.EndChangeCheck() ) + { + m_nameModified = true; + m_lastTimeNameModified = EditorApplication.timeSinceStartup; + m_inputPorts[ i ].Name = UIUtils.RemoveInvalidEnumCharacters( m_inputPorts[ i ].Name ); + m_optionNames[ i ] = m_inputPorts[ i ].Name; + if( string.IsNullOrEmpty( m_inputPorts[ i ].Name ) ) + { + m_inputPorts[ i ].Name = InputPortNameStr + i; + } + m_sizeIsDirty = true; + } + } + EditorGUI.indentLevel--; + + if( m_nameModified ) + { + UpdateLabels(); + } + } + + if( m_toggleMode ) + { + EditorGUI.BeginChangeCheck(); + int prevVal = m_currentSelectedInput; + m_currentSelectedInput = EditorGUILayoutToggle( CurrSelectedStr, ( m_currentSelectedInput != 0 ? true : false ) ) ? 1 : 0; + if( EditorGUI.EndChangeCheck() ) + SetCurrentSelectedInput( m_currentSelectedInput, prevVal ); + } + else + { + EditorGUI.BeginChangeCheck(); + int prevVal = m_currentSelectedInput; + m_currentSelectedInput = EditorGUILayoutIntPopup( CurrSelectedStr, m_currentSelectedInput, AvailableInputsLabels, AvailableInputsValues ); + if( EditorGUI.EndChangeCheck() ) + { + SetCurrentSelectedInput( m_currentSelectedInput, prevVal ); + } + } + } + if( EditorGUI.EndChangeCheck() ) + { + m_dirtySettings = true; + } + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + if( UIUtils.CurrentShaderVersion() > 14205 ) + { + if( m_referenceType == TexReferenceType.Instance ) + { + m_functionSwitchReference = UIUtils.GetNode( m_referenceUniqueId ) as FunctionSwitch; + UpdateFromSelected(); + } + } + + SetCurrentSelectedInput( m_currentSelectedInput, m_previousSelectedInput ); + } + + public void UpdateLabels() + { + int maxinputs = m_maxAmountInputs; + if( m_validReference ) + maxinputs = m_functionSwitchReference.MaxAmountInputs; + + AvailableInputsLabels = new string[ maxinputs ]; + AvailableInputsValues = new int[ maxinputs ]; + + for( int i = 0; i < maxinputs; i++ ) + { + AvailableInputsLabels[ i ] = m_optionNames[ i ]; + AvailableInputsValues[ i ] = i; + } + } + + public override void OnNodeLogicUpdate( DrawInfo drawInfo ) + { + base.OnNodeLogicUpdate( drawInfo ); + CheckReference(); + if( m_dirtySettings ) + m_dirtySettings = false; + } + + public override void OnNodeLayout( DrawInfo drawInfo ) + { + float finalSize = 0; + if( !m_toggleMode ) + { + GUIContent dropdown = new GUIContent( m_inputPorts[ m_currentSelectedInput ].Name ); + int cacheSize = UIUtils.GraphDropDown.fontSize; + UIUtils.GraphDropDown.fontSize = 10; + Vector2 calcSize = UIUtils.GraphDropDown.CalcSize( dropdown ); + UIUtils.GraphDropDown.fontSize = cacheSize; + finalSize = Mathf.Clamp( calcSize.x, MinComboSize, MaxComboSize ); + if( m_insideSize.x != finalSize ) + { + m_insideSize.Set( finalSize, 25 ); + m_sizeIsDirty = true; + } + } + + base.OnNodeLayout( drawInfo ); + + bool toggleMode = m_toggleMode; + if( m_validReference ) + { + toggleMode = m_functionSwitchReference.m_toggleMode; + } + + if( toggleMode ) + { + m_varRect = m_remainingBox; + m_varRect.size = Vector2.one * 22 * drawInfo.InvertedZoom; + m_varRect.center = m_remainingBox.center; + if( m_showPreview ) + m_varRect.y = m_remainingBox.y; + } + else + { + m_varRect = m_remainingBox; + m_varRect.width = finalSize * drawInfo.InvertedZoom; + m_varRect.height = 16 * drawInfo.InvertedZoom; + m_varRect.x = m_remainingBox.xMax - m_varRect.width; + m_varRect.y += 1 * drawInfo.InvertedZoom; + + m_imgRect = m_varRect; + m_imgRect.x = m_varRect.xMax - 16 * drawInfo.InvertedZoom; + m_imgRect.width = 16 * drawInfo.InvertedZoom; + m_imgRect.height = m_imgRect.width; + } + } + + public override void DrawGUIControls( DrawInfo drawInfo ) + { + if( m_validReference ) + { + base.DrawGUIControls( drawInfo ); + } + else + { + base.DrawGUIControls( drawInfo ); + + if( drawInfo.CurrentEventType != EventType.MouseDown ) + return; + + if( m_varRect.Contains( drawInfo.MousePosition ) ) + { + m_editing = true; + } + else if( m_editing ) + { + m_editing = false; + } + } + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + if( m_nameModified ) + { + if( ( EditorApplication.timeSinceStartup - m_lastTimeNameModified ) > MaxTimestamp ) + { + m_nameModified = false; + } + } + + if( m_validReference ) + { + SetAdditonalTitleTextOnCallback( m_functionSwitchReference.OptionLabel, ( instance, newSubTitle ) => instance.AdditonalTitleContent.text = string.Format( Constants.SubTitleVarNameFormatStr, newSubTitle ) ); + } + else + { + SetAdditonalTitleTextOnCallback( m_optionLabel, ( instance, newSubTitle ) => instance.AdditonalTitleContent.text = string.Format( Constants.SubTitleValueFormatStr, newSubTitle ) ); + + if( m_editing ) + { + if( m_toggleMode ) + { + if( GUI.Button( m_varRect, GUIContent.none, UIUtils.GraphButton ) ) + { + PreviewIsDirty = true; + int prevVal = m_currentSelectedInput; + m_currentSelectedInput = m_currentSelectedInput == 1 ? 0 : 1; + if( m_currentSelectedInput != prevVal ) + SetCurrentSelectedInput( m_currentSelectedInput, prevVal ); + m_editing = false; + } + + if( m_currentSelectedInput == 1 ) + { + GUI.Label( m_varRect, m_checkContent, UIUtils.GraphButtonIcon ); + } + } + else + { + EditorGUI.BeginChangeCheck(); + int prevVal = m_currentSelectedInput; + m_currentSelectedInput = EditorGUIIntPopup( m_varRect, m_currentSelectedInput, AvailableInputsLabels, AvailableInputsValues, UIUtils.GraphDropDown ); + if( EditorGUI.EndChangeCheck() ) + { + PreviewIsDirty = true; + SetCurrentSelectedInput( m_currentSelectedInput, prevVal ); + m_editing = false; + } + } + } + } + + } + + public override void OnNodeRepaint( DrawInfo drawInfo ) + { + base.OnNodeRepaint( drawInfo ); + + if( !m_isVisible ) + return; + + if( ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD2 ) + { + if( m_validReference ) + { + bool cacheState = GUI.enabled; + GUI.enabled = false; + if( m_functionSwitchReference.m_toggleMode ) + { + GUI.Label( m_varRect, GUIContent.none, UIUtils.GraphButton ); + if( m_functionSwitchReference.GetCurrentSelectedInput() == 1 ) + { + GUI.Label( m_varRect, m_checkContent, UIUtils.GraphButtonIcon ); + } + } + else + { + GUI.Label( m_varRect, m_functionSwitchReference.AvailableInputsLabels[ m_currentSelectedInput ], UIUtils.GraphDropDown ); + } + GUI.enabled = cacheState; + } + else + { + if( !m_editing ) + { + if( m_toggleMode ) + { + GUI.Label( m_varRect, GUIContent.none, UIUtils.GraphButton ); + + if( m_currentSelectedInput == 1 ) + { + GUI.Label( m_varRect, m_checkContent, UIUtils.GraphButtonIcon ); + } + } + else + { + GUI.Label( m_varRect, AvailableInputsLabels[ m_currentSelectedInput ], UIUtils.GraphDropDown ); + GUI.Label( m_imgRect, m_popContent, UIUtils.GraphButtonIcon ); + } + } + } + } + } + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + if( m_inputPorts[ m_currentSelectedInput ].IsConnected ) + m_inputPorts[ m_currentSelectedInput ].GetOutputNode().PropagateNodeData( nodeData, ref dataCollector ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + return m_inputPorts[ m_currentSelectedInput ].GeneratePortInstructions( ref dataCollector ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_optionLabel = GetCurrentParam( ref nodeParams ); + m_toggleMode = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + m_currentSelectedInput = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_previousSelectedInput = m_currentSelectedInput; + m_maxAmountInputs = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_orderIndex = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + + for( int i = 0; i < MaxAllowedAmount; i++ ) + { + m_inputPorts[ i ].Visible = ( i < m_maxAmountInputs ); + } + + if( m_currentSelectedInput >= m_maxAmountInputs ) + { + m_currentSelectedInput = m_maxAmountInputs - 1; + } + + for( int i = 0; i < m_maxAmountInputs; i++ ) + { + m_optionNames[ i ] = GetCurrentParam( ref nodeParams ); + m_inputPorts[ i ].Name = m_optionNames[ i ]; + } + + if( m_toggleMode ) + { + m_inputPorts[ 0 ].Name = ToggleFalseStr; + m_inputPorts[ 1 ].Name = ToggleTrueStr; + } + + UpdateLabels(); + m_sizeIsDirty = true; + + UIUtils.UpdateFunctionSwitchData( UniqueId, m_optionLabel ); + UIUtils.UpdateFunctionSwitchCopyData( UniqueId, m_optionLabel ); + if( UIUtils.CurrentShaderVersion() > 14205 ) + { + m_referenceType = (TexReferenceType)Enum.Parse( typeof( TexReferenceType ), GetCurrentParam( ref nodeParams ) ); + m_referenceUniqueId = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + + if( m_referenceType == TexReferenceType.Object ) + { + if( ContainerGraph.ParentWindow.CustomGraph == null ) + UIUtils.UnregisterFunctionSwitchCopyNode( this ); + UIUtils.RegisterFunctionSwitchNode( this ); + ResetToSelf(); + } + else + { + if( ContainerGraph.ParentWindow.CustomGraph == null ) + UIUtils.UnregisterFunctionSwitchNode( this ); + UIUtils.RegisterFunctionSwitchCopyNode( this ); + } + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_optionLabel ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_toggleMode ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_currentSelectedInput ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_maxAmountInputs ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_orderIndex ); + + for( int i = 0; i < m_maxAmountInputs; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_optionNames[ i ] ); + } + + IOUtils.AddFieldValueToString( ref nodeInfo, m_referenceType ); + IOUtils.AddFieldValueToString( ref nodeInfo, ( m_functionSwitchReference != null ? m_functionSwitchReference.UniqueId : -1 ) ); + } + + public int OrderIndex + { + get { return m_orderIndex; } + set { m_orderIndex = value; } + } + + public string OptionLabel + { + get { return m_optionLabel; } + set { m_optionLabel = value; } + } + + public bool AsDrawn { get { return m_asDrawn; } set { m_asDrawn = value; } } + + public override string DataToArray { get { return m_optionLabel; } } + public int MaxAmountInputs + { + get { return m_maxAmountInputs; } + } + public bool DirtySettings { get { return m_dirtySettings; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionSwitch.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionSwitch.cs.meta new file mode 100644 index 0000000..8929a45 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionSwitch.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2bd66b9ffd0acf84ab46c9f83300495c +timeCreated: 1515408158 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionSwitchByPipeline.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionSwitchByPipeline.cs new file mode 100644 index 0000000..5a05605 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionSwitchByPipeline.cs @@ -0,0 +1,102 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Switch by Pipeline", "Functions", "Executes branch according to current pipeline", NodeAvailabilityFlags = (int)NodeAvailability.ShaderFunction )] + public sealed class FunctionSwitchByPipeline : ParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, "Surface", -1, MasterNodePortCategory.Fragment, 0 ); + AddInputPort( WirePortDataType.FLOAT, false, "Default RP", -1, MasterNodePortCategory.Fragment, 3 ); + AddInputPort( WirePortDataType.FLOAT, false, "Lightweight", -1, MasterNodePortCategory.Fragment, 1 ); + AddInputPort( WirePortDataType.FLOAT, false, "HD", -1, MasterNodePortCategory.Fragment, 2 ); + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + GetInputPortByUniqueId( portId ).MatchPortToConnection(); + UpdateOutputPort(); + } + + public override void OnConnectedOutputNodeChanges( int outputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( outputPortId, otherNodeId, otherPortId, name, type ); + GetInputPortByUniqueId( outputPortId ).MatchPortToConnection(); + UpdateOutputPort(); + } + + void UpdateOutputPort() + { + switch( UIUtils.CurrentWindow.OutsideGraph.CurrentSRPType ) + { + case TemplateSRPType.BuiltIn: + { + InputPort port = UIUtils.CurrentWindow.OutsideGraph.IsStandardSurface ? GetInputPortByUniqueId( 0 ) : GetInputPortByUniqueId( 3 ); + m_outputPorts[ 0 ].ChangeType( port.DataType, false ); + } + break; + case TemplateSRPType.Lightweight: + { + InputPort port = GetInputPortByUniqueId( 1 ); + m_outputPorts[ 0 ].ChangeType( port.DataType, false ); + } + break; + case TemplateSRPType.HD: + { + InputPort port = GetInputPortByUniqueId( 2 ); + m_outputPorts[ 0 ].ChangeType( port.DataType, false ); + } + break; + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + switch( dataCollector.CurrentSRPType ) + { + case TemplateSRPType.BuiltIn: + { + InputPort port = UIUtils.CurrentWindow.OutsideGraph.IsStandardSurface ? GetInputPortByUniqueId( 0 ) : GetInputPortByUniqueId( 3 ); + return port.GeneratePortInstructions( ref dataCollector ); + } + case TemplateSRPType.Lightweight: + { + InputPort port = GetInputPortByUniqueId( 1 ); + return port.GeneratePortInstructions( ref dataCollector ); + } + case TemplateSRPType.HD: + { + InputPort port = GetInputPortByUniqueId( 2 ); + return port.GeneratePortInstructions( ref dataCollector ); + } + } + + return "0"; + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + if( UIUtils.CurrentShaderVersion() < 16303 ) + { + InputPort standardPort = GetInputPortByUniqueId( 0 ); + if( standardPort.IsConnected ) + { + UIUtils.SetConnection( UniqueId, 3, standardPort.GetConnection().NodeId, standardPort.GetConnection().PortId ); + } + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionSwitchByPipeline.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionSwitchByPipeline.cs.meta new file mode 100644 index 0000000..9ecd808 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/FunctionSwitchByPipeline.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 84a4868e0b1e8dd4bb0e71c8d9a9c130 +timeCreated: 1535365719 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/LogNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/LogNode.cs new file mode 100644 index 0000000..d431cbb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/LogNode.cs @@ -0,0 +1,80 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Log", "Master", "Debug node to dump output to log", null, KeyCode.None, false )] + public sealed class LogNode : MasterNode + { + private const string InputAmountStr = "Input amount"; + + [SerializeField] + private int m_inputCount = 1; + + [SerializeField] + private int m_lastInputCount = 1; + + public LogNode() : base() { } + public LogNode( int uniqueId, float x, float y, float width, float height ) : base( uniqueId, x, y, width, height ) { } + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddMasterPorts(); + } + + public override void AddMasterPorts() + { + DeleteAllInputConnections( true ); + base.AddMasterPorts(); + + for ( int i = 0; i < m_inputCount; i++ ) + { + AddInputPort( WirePortDataType.OBJECT, false, i.ToString() ); + } + m_sizeIsDirty = true; + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUILayout.BeginVertical(); + { + EditorGUILayout.LabelField( InputAmountStr ); + m_inputCount = EditorGUILayoutIntField( m_inputCount ); + } + EditorGUILayout.EndVertical(); + if ( m_inputCount != m_lastInputCount ) + { + m_lastInputCount = Mathf.Max( m_inputCount, 1 ); + AddMasterPorts(); + } + } + + public override void Execute( Shader currentSelected ) + { + string valueDump = ""; + string valueInstructions = ""; + + MasterNodeDataCollector dataCollector = new MasterNodeDataCollector( this ); + foreach ( InputPort port in InputPorts ) + { + if ( port.IsConnected ) + { + valueInstructions += "Port: " + port.PortId + " Value: " + port.GenerateShaderForOutput( ref dataCollector, port.DataType, false ); + } + } + Debug.Log( "Value: " + valueDump ); + Debug.Log( "Instructions: " + valueInstructions ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + } + + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/LogNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/LogNode.cs.meta new file mode 100644 index 0000000..d2debab --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/LogNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3b0e734d4c354c74999e20ce054628d2 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/MasterNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/MasterNode.cs new file mode 100644 index 0000000..483aa75 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/MasterNode.cs @@ -0,0 +1,1021 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using UnityEditorInternal; + +namespace AmplifyShaderEditor +{ + public enum PrecisionType + { + Float = 0, + Half, + Inherit + } + + public enum AvailableShaderTypes + { + SurfaceShader = 0, + Template + } + + [Serializable] + public class MasterNodeCategoriesData + { + public AvailableShaderTypes Category; + public string Name; + public MasterNodeCategoriesData( AvailableShaderTypes category, string name ) { Category = category; Name = name; } + } + + [Serializable] + public class MasterNode : OutputNode + { + protected const string CustomInspectorStr = "Custom Editor"; + protected const string CustomInspectorFormat = "CustomEditor \"{0}\""; + + private const string PropertyOrderFoldoutStr = " Material Properties"; + private const string PropertyOrderTemplateFoldoutStr = "Material Properties"; + + protected MasterNodeDataCollector m_currentDataCollector; + + protected const string ShaderNameStr = "Shader Name"; + protected GUIContent m_shaderNameContent; + + private const string IndentationHelper = "\t\t{0}\n"; + private const string ShaderLODFormat = "\t\tLOD {0}\n"; + + public delegate void OnMaterialUpdated( MasterNode masterNode ); + public event OnMaterialUpdated OnMaterialUpdatedEvent; + public event OnMaterialUpdated OnShaderUpdatedEvent; + + protected const string GeneralFoldoutStr = " General"; + + protected readonly string[] ShaderModelTypeArr = { "2.0", "2.5", "3.0", "3.5", "4.0", "4.5", "4.6", "5.0" }; + private const string ShaderKeywordsStr = "Shader Keywords"; + + [SerializeField] + protected int m_shaderLOD = 0; + + [SerializeField] + protected int m_shaderModelIdx = 2; + + [SerializeField] + protected Shader m_currentShader; + + [SerializeField] + protected Material m_currentMaterial; + + //[SerializeField] + //private bool m_isMainMasterNode = false; + + [SerializeField] + private Rect m_masterNodeIconCoords; + + [SerializeField] + protected string m_shaderName = Constants.DefaultShaderName; + + [SerializeField] + protected string m_croppedShaderName = Constants.DefaultShaderName; + + [SerializeField] + protected string m_customInspectorName = Constants.DefaultCustomInspector; + + [SerializeField] + protected int m_masterNodeCategory = 0;// MasterNodeCategories.SurfaceShader; + + [SerializeField] + protected bool m_samplingMacros = false; + + [SerializeField] + protected string m_currentShaderData = string.Empty; + + private Texture2D m_masterNodeOnTex; + private Texture2D m_masterNodeOffTex; + + private Texture2D m_gpuInstanceOnTex; + private Texture2D m_gpuInstanceOffTex; + + // Shader Keywords + [SerializeField] + private List m_shaderKeywords = new List(); + + [SerializeField] + private bool m_shaderKeywordsFoldout = true; + + private GUIStyle m_addShaderKeywordStyle; + private GUIStyle m_removeShaderKeywordStyle; + private GUIStyle m_smallAddShaderKeywordItemStyle; + private GUIStyle m_smallRemoveShaderKeywordStyle; + private const float ShaderKeywordButtonLayoutWidth = 15; + + + public MasterNode() : base() { CommonInit(); } + public MasterNode( int uniqueId, float x, float y, float width, float height ) : base( uniqueId, x, y, width, height ) { CommonInit(); } + + protected GUIContent m_categoryLabel = new GUIContent( "Shader Type ", "Specify the shader type you want to be working on" ); + + protected GUIContent[] m_availableCategoryLabels; + protected MasterNodeCategoriesData[] m_availableCategories; + + [SerializeField] + private List m_propertyNodesVisibleList = new List(); + + private ReorderableList m_propertyReordableList; + protected bool m_propertyOrderChanged = false; + //private int m_availableCount = 0; + private int m_lastCount = 0; + + private GUIStyle m_propertyAdjustment; + protected bool m_shaderNameIsTitle = true; + + void CommonInit() + { + m_currentMaterial = null; + m_masterNodeIconCoords = new Rect( 0, 0, 64, 64 ); + m_isMainOutputNode = false; + m_connStatus = NodeConnectionStatus.Connected; + m_activeType = GetType(); + m_currentPrecisionType = PrecisionType.Float; + m_textLabelWidth = 120; + m_shaderNameContent = new GUIContent( ShaderNameStr, string.Empty ); + + AddMasterPorts(); + } + + void InitAvailableCategories() + { + int templateCount = m_containerGraph.ParentWindow.TemplatesManagerInstance.TemplateCount; + m_availableCategories = new MasterNodeCategoriesData[ templateCount + 1 ]; + m_availableCategoryLabels = new GUIContent[ templateCount + 1 ]; + + m_availableCategories[ 0 ] = new MasterNodeCategoriesData( AvailableShaderTypes.SurfaceShader, string.Empty ); + m_availableCategoryLabels[ 0 ] = new GUIContent( "Surface" ); + + for( int i = 0; i < templateCount; i++ ) + { + int idx = i + 1; + TemplateDataParent templateData = m_containerGraph.ParentWindow.TemplatesManagerInstance.GetTemplate( i ); + m_availableCategories[ idx ] = new MasterNodeCategoriesData( AvailableShaderTypes.Template, templateData.GUID ); + m_availableCategoryLabels[ idx ] = new GUIContent( templateData.Name ); + } + } + + public void SetMasterNodeCategoryFromGUID( string GUID ) + { + if( m_availableCategories == null ) + InitAvailableCategories(); + + m_masterNodeCategory = 0; + for( int i = 1; i < m_availableCategories.Length; i++ ) + { + if( m_availableCategories[ i ].Name.Equals( GUID ) ) + m_masterNodeCategory = i; + } + + } + + public override void SetupNodeCategories() + { + //base.SetupNodeCategories(); + ContainerGraph.ResetNodesData(); + int count = m_inputPorts.Count; + for( int i = 0; i < count; i++ ) + { + if( m_inputPorts[ i ].IsConnected ) + { + NodeData nodeData = new NodeData( m_inputPorts[ i ].Category ); + ParentNode node = m_inputPorts[ i ].GetOutputNode(); + node.PropagateNodeData( nodeData, ref m_currentDataCollector ); + } + else if( m_inputPorts[ i ].HasExternalLink ) + { + InputPort linkedPort = m_inputPorts[ i ].ExternalLink; + if( linkedPort != null && linkedPort.IsConnected ) + { + NodeData nodeData = new NodeData( linkedPort.Category ); + ParentNode node = linkedPort.GetOutputNode(); + node.PropagateNodeData( nodeData, ref m_currentDataCollector ); + } + } + } + } + + public virtual void RefreshAvailableCategories() + { + InitAvailableCategories(); + } + + public virtual void AddMasterPorts() { } + + public virtual void ForcePortType() { } + + public virtual void UpdateMasterNodeMaterial( Material material ) { } + + public virtual void SetName( string name ) { } + + public void CopyFrom( MasterNode other ) + { + Vec2Position = other.Vec2Position; + CurrentShader = other.CurrentShader; + CurrentMaterial = other.CurrentMaterial; + ShaderName = other.ShaderName; + m_masterNodeCategory = other.CurrentMasterNodeCategoryIdx; + } + + protected void DrawCurrentShaderType() + { + if( m_availableCategories == null ) + InitAvailableCategories(); + + int oldType = m_masterNodeCategory; + m_masterNodeCategory = EditorGUILayoutPopup( m_categoryLabel, m_masterNodeCategory, m_availableCategoryLabels ); + if( oldType != m_masterNodeCategory ) + { + m_containerGraph.ParentWindow.ReplaceMasterNode( m_availableCategories[ m_masterNodeCategory ], false ); + } + } + + protected void DrawCustomInspector( bool dropdown ) + { +#if !UNITY_2018_3_OR_NEWER + dropdown = false; +#else + if( ASEPackageManagerHelper.CurrentHDVersion <= ASESRPVersions.ASE_SRP_5_16_1 ) + dropdown = false; +#endif + + EditorGUILayout.BeginHorizontal(); + m_customInspectorName = EditorGUILayoutTextField( CustomInspectorStr, m_customInspectorName ); + if( !dropdown ) + { + if( GUILayoutButton( string.Empty, UIUtils.GetCustomStyle( CustomStyle.ResetToDefaultInspectorButton ), GUILayout.Width( 15 ), GUILayout.Height( 15 ) ) ) + { + GUIUtility.keyboardControl = 0; + m_customInspectorName = Constants.DefaultCustomInspector; + } + } + else + { + if( GUILayoutButton( string.Empty, UIUtils.InspectorPopdropdownFallback, GUILayout.Width( 17 ), GUILayout.Height( 19 ) ) ) + { + EditorGUI.FocusTextInControl( null ); + GUI.FocusControl( null ); + + GenericMenu menu = new GenericMenu(); + AddMenuItem( menu, Constants.DefaultCustomInspector ); +#if UNITY_2018_3_OR_NEWER + if( ASEPackageManagerHelper.CurrentHDVersion > ASESRPVersions.ASE_SRP_6_9_1 ) + { + if( ASEPackageManagerHelper.CurrentHDVersion > ASESRPVersions.ASE_SRP_10_0_0 ) + { + AddMenuItem( menu, "Rendering.HighDefinition.LightingShaderGraphGUI" ); + AddMenuItem( menu, "Rendering.HighDefinition.HDUnlitGUI" ); + } + else + { + AddMenuItem( menu, "UnityEditor.Rendering.HighDefinition.HDLitGUI" ); + } + AddMenuItem( menu, "UnityEditor.ShaderGraph.PBRMasterGUI" ); + } + else + { + AddMenuItem( menu, "UnityEditor.Experimental.Rendering.HDPipeline.HDLitGUI" ); + } +#else + AddMenuItem( menu, "UnityEditor.Experimental.Rendering.HDPipeline.HDLitGUI" ); +#endif + menu.ShowAsContext(); + } + } + EditorGUILayout.EndHorizontal(); + } + + private void AddMenuItem( GenericMenu menu, string newClass ) + { + menu.AddItem( new GUIContent( newClass ), m_customInspectorName.Equals( newClass ), OnSelection, newClass ); + } + + private void OnSelection( object newClass ) + { + m_customInspectorName = (string)newClass; + } + + protected void DrawShaderName() + { +#if UNITY_2019_1_OR_NEWER + // this is a hack to control the automatic selection of text fields when the window is selected after serialization + // by having a selectable label the focus happens on it instead and doesn't interupt the usual flow of the editor + EditorGUILayout.SelectableLabel( "", GUILayout.Height( 0 ) ); +#endif + EditorGUI.BeginChangeCheck(); + string newShaderName = EditorGUILayoutTextField( m_shaderNameContent, m_shaderName ); + if( EditorGUI.EndChangeCheck() ) + { + if( newShaderName.Length > 0 ) + { + newShaderName = UIUtils.RemoveShaderInvalidCharacters( newShaderName ); + } + else + { + newShaderName = Constants.DefaultShaderName; + } + ShaderName = newShaderName; + ContainerGraph.ParentWindow.UpdateTabTitle( ShaderName, true ); + } + m_shaderNameContent.tooltip = m_shaderName; + } + + protected void DrawSamplingMacros() + { + EditorGUI.BeginChangeCheck(); + m_samplingMacros = EditorGUILayoutToggle( "Use Sampling Macros", m_samplingMacros ); + if( EditorGUI.EndChangeCheck() ) + ContainerGraph.SamplingMacros = SamplingMacros; + } + + public void DrawShaderKeywords() + { + if( m_addShaderKeywordStyle == null ) + m_addShaderKeywordStyle = UIUtils.PlusStyle; + + if( m_removeShaderKeywordStyle == null ) + m_removeShaderKeywordStyle = UIUtils.MinusStyle; + + if( m_smallAddShaderKeywordItemStyle == null ) + m_smallAddShaderKeywordItemStyle = UIUtils.PlusStyle; + + if( m_smallRemoveShaderKeywordStyle == null ) + m_smallRemoveShaderKeywordStyle = UIUtils.MinusStyle; + + EditorGUILayout.BeginHorizontal(); + { + m_shaderKeywordsFoldout = EditorGUILayout.Foldout( m_shaderKeywordsFoldout, ShaderKeywordsStr ); + + // Add keyword + if( GUILayout.Button( string.Empty, m_addShaderKeywordStyle ) ) + { + m_shaderKeywords.Insert( 0, "" ); + } + + //Remove keyword + if( GUILayout.Button( string.Empty, m_removeShaderKeywordStyle ) ) + { + m_shaderKeywords.RemoveAt( m_shaderKeywords.Count - 1 ); + } + } + EditorGUILayout.EndHorizontal(); + + if( m_shaderKeywordsFoldout ) + { + EditorGUI.indentLevel += 1; + int itemCount = m_shaderKeywords.Count; + int markedToDelete = -1; + for( int i = 0; i < itemCount; i++ ) + { + EditorGUILayout.BeginHorizontal(); + { + GUILayout.Label( " " ); + // Add new port + if( GUILayoutButton( string.Empty, m_smallAddShaderKeywordItemStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + m_shaderKeywords.Insert( i, "" ); + } + + //Remove port + if( GUILayoutButton( string.Empty, m_smallRemoveShaderKeywordStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + markedToDelete = i; + } + } + EditorGUILayout.EndHorizontal(); + } + if( markedToDelete > -1 ) + { + m_shaderKeywords.RemoveAt( markedToDelete ); + } + EditorGUI.indentLevel -= 1; + } + } + + public override void Draw( DrawInfo drawInfo ) + { + if( m_availableCategories == null ) + InitAvailableCategories(); + + base.Draw( drawInfo ); + } + + public override void OnNodeRepaint( DrawInfo drawInfo ) + { + base.OnNodeRepaint( drawInfo ); + + if( m_isMainOutputNode ) + { + if( m_masterNodeOnTex == null ) + { + m_masterNodeOnTex = UIUtils.MasterNodeOnTexture; + } + + if( m_masterNodeOffTex == null ) + { + m_masterNodeOffTex = UIUtils.MasterNodeOffTexture; + } + + if( m_gpuInstanceOnTex == null ) + { + m_gpuInstanceOnTex = UIUtils.GPUInstancedOnTexture; + } + + if( m_gpuInstanceOffTex == null ) + { + m_gpuInstanceOffTex = UIUtils.GPUInstancedOffTexture; + } + + m_masterNodeIconCoords = m_globalPosition; + m_masterNodeIconCoords.x += m_globalPosition.width - m_masterNodeOffTex.width * drawInfo.InvertedZoom; + m_masterNodeIconCoords.y += m_globalPosition.height - m_masterNodeOffTex.height * drawInfo.InvertedZoom; + m_masterNodeIconCoords.width = m_masterNodeOffTex.width * drawInfo.InvertedZoom; + m_masterNodeIconCoords.height = m_masterNodeOffTex.height * drawInfo.InvertedZoom; + + GUI.DrawTexture( m_masterNodeIconCoords, m_masterNodeOffTex ); + + if( m_gpuInstanceOnTex == null ) + { + m_gpuInstanceOnTex = UIUtils.GPUInstancedOnTexture; + } + } + } + + protected void DrawInstancedIcon( DrawInfo drawInfo ) + { + if( m_gpuInstanceOffTex == null || drawInfo.CurrentEventType != EventType.Repaint ) + return; + + m_masterNodeIconCoords = m_globalPosition; + m_masterNodeIconCoords.x += m_globalPosition.width - 5 - m_gpuInstanceOffTex.width * drawInfo.InvertedZoom; + m_masterNodeIconCoords.y += m_headerPosition.height; + m_masterNodeIconCoords.width = m_gpuInstanceOffTex.width * drawInfo.InvertedZoom; + m_masterNodeIconCoords.height = m_gpuInstanceOffTex.height * drawInfo.InvertedZoom; + GUI.DrawTexture( m_masterNodeIconCoords, m_gpuInstanceOffTex ); + } + //public override void DrawProperties() + //{ + // base.DrawProperties(); + // //EditorGUILayout.LabelField( _shaderTypeLabel ); + //} + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + //IOUtils.AddFieldValueToString( ref nodeInfo, m_isMainMasterNode ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_shaderModelIdx ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_customInspectorName ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_shaderLOD ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_masterNodeCategory ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > 21 ) + { + m_shaderModelIdx = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() < 17005 ) + { + string val = GetCurrentParam( ref nodeParams ); + if( m_customPrecision ) + { + if( val.Equals( "Fixed" ) ) + m_currentPrecisionType = PrecisionType.Half; + else + m_currentPrecisionType = (PrecisionType)Enum.Parse( typeof( PrecisionType ), val ); + } + else + { + m_currentPrecisionType = PrecisionType.Inherit; + } + } + } + + if( UIUtils.CurrentShaderVersion() > 2404 ) + { + m_customInspectorName = GetCurrentParam( ref nodeParams ); + } + + if( UIUtils.CurrentShaderVersion() > 6101 ) + { + ShaderLOD = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + + if( UIUtils.CurrentShaderVersion() >= 13001 ) + { + //Debug.LogWarning( "Add correct version as soon as it is merged into master" ); + m_masterNodeCategory = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + if( activateNode ) + { + InputPort port = GetInputPortByUniqueId( portId ); + port.GetOutputNode().ActivateNode( UniqueId, portId, m_activeType ); + } + } + + public void FireMaterialChangedEvt() + { + if( OnMaterialUpdatedEvent != null ) + { + OnMaterialUpdatedEvent( this ); + } + } + + public void FireShaderChangedEvt() + { + if( OnShaderUpdatedEvent != null ) + OnShaderUpdatedEvent( this ); + } + + public void RegisterStandaloneFuntions() + { + List nodes = m_containerGraph.CustomExpressionOnFunctionMode.NodesList; + int count = nodes.Count; + Dictionary examinedNodes = new Dictionary(); + for( int i = 0; i < count; i++ ) + { + if( nodes[ i ].AutoRegisterMode ) + { + nodes[ i ].CheckDependencies( ref m_currentDataCollector, ref examinedNodes ); + } + } + examinedNodes.Clear(); + examinedNodes = null; + } + + // What operation this node does + public virtual void Execute( Shader selectedShader ) + { + Execute( AssetDatabase.GetAssetPath( selectedShader ), false ); + } + + public virtual Shader Execute( string pathname, bool isFullPath ) + { + ContainerGraph.ResetNodesLocalVariables(); + m_currentDataCollector = new MasterNodeDataCollector( this ); + return null; + } + + public void CheckSamplingMacrosFlag() + { + if( ContainerGraph.SamplingMacros && m_currentDataCollector != null ) + m_currentDataCollector.AddToDirectives( Constants.SamplingMacrosDirective ); + + } + protected void SortInputPorts( ref List vertexPorts, ref List fragmentPorts ) + { + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + if( m_inputPorts[ i ].Category == MasterNodePortCategory.Fragment || m_inputPorts[ i ].Category == MasterNodePortCategory.Debug ) + { + if( fragmentPorts != null ) + fragmentPorts.Add( m_inputPorts[ i ] ); + } + else + { + if( vertexPorts != null ) + vertexPorts.Add( m_inputPorts[ i ] ); + } + } + + if( fragmentPorts.Count > 0 ) + { + fragmentPorts.Sort( ( x, y ) => x.OrderId.CompareTo( y.OrderId ) ); + } + + if( vertexPorts.Count > 0 ) + { + vertexPorts.Sort( ( x, y ) => x.OrderId.CompareTo( y.OrderId ) ); + } + } + + protected void UpdateShaderAsset( ref string pathname, ref string shaderBody, bool isFullPath ) + { + // Generate Graph info + shaderBody += ContainerGraph.ParentWindow.GenerateGraphInfo(); + + //TODO: Remove current SaveDebugShader and uncomment SaveToDisk as soon as pathname is editable + if( !String.IsNullOrEmpty( pathname ) ) + { + IOUtils.StartSaveThread( shaderBody, ( isFullPath ? pathname : ( IOUtils.dataPath + pathname ) ) ); + } + else + { + IOUtils.StartSaveThread( shaderBody, Application.dataPath + "/AmplifyShaderEditor/Samples/Shaders/" + m_shaderName + ".shader" ); + } + + + if( CurrentShader == null ) + { + AssetDatabase.Refresh( ImportAssetOptions.ForceUpdate ); + CurrentShader = Shader.Find( ShaderName ); + } + + //else + //{ + // // need to always get asset datapath because a user can change and asset location from the project window + // AssetDatabase.ImportAsset( AssetDatabase.GetAssetPath( m_currentShader ) ); + // //ShaderUtil.UpdateShaderAsset( m_currentShader, ShaderBody ); + // //ShaderImporter importer = (ShaderImporter)ShaderImporter.GetAtPath( AssetDatabase.GetAssetPath( CurrentShader ) ); + // //importer.SaveAndReimport(); + //} + + if( m_currentShader != null ) + { + m_currentDataCollector.UpdateShaderImporter( ref m_currentShader ); + if( m_currentMaterial != null ) + { + if( m_currentMaterial.shader != m_currentShader ) + m_currentMaterial.shader = m_currentShader; + + //m_currentDataCollector.UpdateMaterialOnPropertyNodes( m_currentMaterial ); + //This master node UpdateMaterial is needed on Standard Surface node to update its internal properties + UpdateMaterial( m_currentMaterial ); + + UIUtils.CurrentWindow.OutsideGraph.UpdateMaterialOnPropertyNodes( m_currentMaterial ); + + FireMaterialChangedEvt(); + // need to always get asset datapath because a user can change and asset location from the project window + //AssetDatabase.ImportAsset( AssetDatabase.GetAssetPath( m_currentMaterial ) ); + } + + } + + m_currentDataCollector.Destroy(); + m_currentDataCollector = null; + } + + + public void InvalidateMaterialPropertyCount() + { + m_lastCount = -1; + } + + private void RefreshVisibleList( ref List allNodes ) + { + // temp reference for lambda expression + List nodes = allNodes; + m_propertyNodesVisibleList.Clear(); + + for( int i = 0; i < nodes.Count; i++ ) + { + ReordenatorNode rnode = nodes[ i ] as ReordenatorNode; + if( ( rnode == null || !rnode.IsInside ) && ( !m_propertyNodesVisibleList.Exists( x => x.PropertyName.Equals( nodes[ i ].PropertyName ) ) ) ) + m_propertyNodesVisibleList.Add( nodes[ i ] ); + } + + m_propertyNodesVisibleList.Sort( ( x, y ) => { return x.OrderIndex.CompareTo( y.OrderIndex ); } ); + } + + public void DrawMaterialInputs( GUIStyle toolbarstyle, bool style = true ) + { + m_propertyOrderChanged = false; + Color cachedColor = GUI.color; + GUI.color = new Color( cachedColor.r, cachedColor.g, cachedColor.b, 0.5f ); + EditorGUILayout.BeginHorizontal( toolbarstyle ); + GUI.color = cachedColor; + + EditorGUI.BeginChangeCheck(); + if( style ) + { + ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedProperties = GUILayoutToggle( ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedProperties, PropertyOrderFoldoutStr, UIUtils.MenuItemToggleStyle ); + } + else + { + ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedProperties = GUILayoutToggle( ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedProperties, PropertyOrderTemplateFoldoutStr, UIUtils.MenuItemToggleStyle ); + } + + if( EditorGUI.EndChangeCheck() ) + { + EditorPrefs.SetBool( "ExpandedProperties", ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedProperties ); + } + + EditorGUILayout.EndHorizontal(); + if( !ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedProperties ) + return; + + cachedColor = GUI.color; + GUI.color = new Color( cachedColor.r, cachedColor.g, cachedColor.b, ( EditorGUIUtility.isProSkin ? 0.5f : 0.25f ) ); + EditorGUILayout.BeginVertical( UIUtils.MenuItemBackgroundStyle ); + GUI.color = cachedColor; + + List nodes = UIUtils.PropertyNodesList(); + + if( nodes.Count != m_lastCount ) + { + RefreshVisibleList( ref nodes ); + m_lastCount = nodes.Count; + } + + if( m_propertyReordableList == null ) + { + m_propertyReordableList = new ReorderableList( m_propertyNodesVisibleList, typeof( PropertyNode ), true, false, false, false ) + { + headerHeight = 0, + footerHeight = 0, + showDefaultBackground = false, + + drawElementCallback = ( Rect rect, int index, bool isActive, bool isFocused ) => + { + var first = rect; + first.width *= 0.60f; + EditorGUI.LabelField( first, m_propertyNodesVisibleList[ index ].PropertyInspectorName ); + var second = rect; + second.width *= 0.4f; + second.x += first.width; + if( GUI.Button( second, m_propertyNodesVisibleList[ index ].PropertyName, new GUIStyle( "AssetLabel Partial" ) ) ) + { + UIUtils.FocusOnNode( m_propertyNodesVisibleList[ index ], 1, false ); + } + }, + + onReorderCallback = ( list ) => + { + ReorderList( ref nodes ); + m_propertyOrderChanged = true; + //RecursiveLog(); + } + }; + ReorderList( ref nodes ); + } + + if( m_propertyReordableList != null ) + { + if( m_propertyAdjustment == null ) + { + m_propertyAdjustment = new GUIStyle(); + m_propertyAdjustment.padding.left = 17; + } + EditorGUILayout.BeginVertical( m_propertyAdjustment ); + m_propertyReordableList.DoLayoutList(); + EditorGUILayout.EndVertical(); + } + EditorGUILayout.EndVertical(); + } + + public void ForceReordering() + { + List nodes = UIUtils.PropertyNodesList(); + + if( nodes.Count != m_lastCount ) + { + RefreshVisibleList( ref nodes ); + m_lastCount = nodes.Count; + } + + ReorderList( ref nodes ); + //RecursiveLog(); + } + + private void RecursiveLog() + { + List nodes = UIUtils.PropertyNodesList(); + nodes.Sort( ( x, y ) => { return x.OrderIndex.CompareTo( y.OrderIndex ); } ); + for( int i = 0; i < nodes.Count; i++ ) + { + if( ( nodes[ i ] is ReordenatorNode ) ) + ( nodes[ i ] as ReordenatorNode ).RecursiveLog(); + else + Debug.Log( nodes[ i ].OrderIndex + " " + nodes[ i ].PropertyName ); + } + } + + private void ReorderList( ref List nodes ) + { + // clear lock list before reordering because of multiple sf being used + for( int i = 0; i < nodes.Count; i++ ) + { + ReordenatorNode rnode = nodes[ i ] as ReordenatorNode; + if( rnode != null ) + rnode.RecursiveClear(); + } + + int propoffset = 0; + int count = 0; + for( int i = 0; i < m_propertyNodesVisibleList.Count; i++ ) + { + ReordenatorNode renode = m_propertyNodesVisibleList[ i ] as ReordenatorNode; + if( renode != null ) + { + if( !renode.IsInside ) + { + m_propertyNodesVisibleList[ i ].OrderIndex = count + propoffset; + + if( renode.PropertyListCount > 0 ) + { + propoffset += renode.RecursiveCount(); + // the same reordenator can exist multiple times, apply ordering to all of them + for( int j = 0; j < nodes.Count; j++ ) + { + ReordenatorNode pnode = ( nodes[ j ] as ReordenatorNode ); + if( pnode != null && pnode.PropertyName.Equals( renode.PropertyName ) ) + { + pnode.OrderIndex = renode.RawOrderIndex; + pnode.RecursiveSetOrderOffset( renode.RawOrderIndex, true ); + } + } + } + else + { + count++; + } + } + else + { + m_propertyNodesVisibleList[ i ].OrderIndex = 0; + } + } + else + { + m_propertyNodesVisibleList[ i ].OrderIndex = count + propoffset; + count++; + } + } + } + + public void CopyPropertyListFrom( MasterNode masterNode ) + { + m_lastCount = masterNode.ReordableListLastCount; + m_propertyNodesVisibleList.Clear(); + m_propertyNodesVisibleList.AddRange( masterNode.PropertyNodesVisibleList ); + } + + public virtual void UpdateFromShader( Shader newShader ) { } + + public void ClearUpdateEvents() + { + OnShaderUpdatedEvent = null; + OnMaterialUpdatedEvent = null; + } + + public Material CurrentMaterial { get { return m_currentMaterial; } set { m_currentMaterial = value; } } + public Shader CurrentShader + { + set + { + if( value != null ) + { + SetName( value.name ); + } + + m_currentShader = value; + FireShaderChangedEvt(); + } + get { return m_currentShader; } + } + public virtual void OnRefreshLinkedPortsComplete() { } + public virtual void ReleaseResources() { } + public override void Destroy() + { + base.Destroy(); + OnMaterialUpdatedEvent = null; + OnShaderUpdatedEvent = null; + m_masterNodeOnTex = null; + m_masterNodeOffTex = null; + m_gpuInstanceOnTex = null; + m_gpuInstanceOffTex = null; + m_addShaderKeywordStyle = null; + m_removeShaderKeywordStyle = null; + m_smallAddShaderKeywordItemStyle = null; + m_smallRemoveShaderKeywordStyle = null; + m_shaderKeywords.Clear(); + m_shaderKeywords = null; + m_propertyReordableList = null; + m_propertyAdjustment = null; + if( m_currentDataCollector != null ) + { + m_currentDataCollector.Destroy(); + m_currentDataCollector = null; + } + } + + public static void OpenShaderBody( ref string result, string name ) + { + result += string.Format( "Shader \"{0}\"\n", name ) + "{\n"; + } + + public static void CloseShaderBody( ref string result ) + { + result += "}\n"; + } + + public static void OpenSubShaderBody( ref string result ) + { + result += "\n\tSubShader\n\t{\n"; + } + + public static void CloseSubShaderBody( ref string result ) + { + result += "\t}\n"; + } + + public static void AddShaderProperty( ref string result, string name, string value ) + { + result += string.Format( "\t{0} \"{1}\"\n", name, value ); + } + + public static void AddShaderPragma( ref string result, string value ) + { + result += string.Format( "\t\t#pragma {0}\n", value ); + } + + public static void AddRenderState( ref string result, string state, string stateParams ) + { + result += string.Format( "\t\t{0} {1}\n", state, stateParams ); + } + + public static void AddRenderTags( ref string result, string tags ) + { + result += string.Format( IndentationHelper, tags ); ; + } + + public static void AddShaderLOD( ref string result, int shaderLOD ) + { + if( shaderLOD > 0 ) + { + result += string.Format( ShaderLODFormat, shaderLOD ); + } + } + + public static void AddMultilineBody( ref string result, string[] lines ) + { + for( int i = 0; i < lines.Length; i++ ) + { + result += string.Format( IndentationHelper, lines[ i ] ); + } + } + + public static void OpenCGInclude( ref string result ) + { + result += "\t\tCGINCLUDE\n"; + } + + public static void OpenCGProgram( ref string result ) + { + result += "\t\tCGPROGRAM\n"; + } + + public static void CloseCGProgram( ref string result ) + { + result += "\n\t\tENDCG\n"; + } + + public string ShaderName + { + //get { return ( ( _isHidden ? "Hidden/" : string.Empty ) + ( String.IsNullOrEmpty( _shaderCategory ) ? "" : ( _shaderCategory + "/" ) ) + _shaderName ); } + get { return m_shaderName; } + set + { + m_shaderName = value; + string[] shaderNameArr = m_shaderName.Split( '/' ); + m_croppedShaderName = shaderNameArr[ shaderNameArr.Length - 1 ]; + + if( m_shaderNameIsTitle ) + m_content.text = GenerateClippedTitle( m_croppedShaderName ); + + m_sizeIsDirty = true; + } + } + public string CurrentInspector { get { return m_customInspectorName; } } + public string CustomInspectorFormatted { get { return string.Format( CustomInspectorFormat, m_customInspectorName ); } } + public string CroppedShaderName { get { return m_croppedShaderName; } } + public virtual AvailableShaderTypes CurrentMasterNodeCategory { get { return ( m_masterNodeCategory == 0 ) ? AvailableShaderTypes.SurfaceShader : AvailableShaderTypes.Template; } } + public int CurrentMasterNodeCategoryIdx { get { return m_masterNodeCategory; } } + public MasterNodeDataCollector CurrentDataCollector { get { return m_currentDataCollector; } set { m_currentDataCollector = value; } } + public List PropertyNodesVisibleList { get { return m_propertyNodesVisibleList; } } + public ReorderableList PropertyReordableList { get { return m_propertyReordableList; } } + public int ReordableListLastCount { get { return m_lastCount; } } + public MasterNodeCategoriesData CurrentCategoriesData { get { return m_availableCategories[ m_masterNodeCategory ]; } } + public int ShaderLOD + { + get { return m_shaderLOD; } + set + { + m_shaderLOD = Mathf.Max( 0, value ); + } + } + public bool SamplingMacros + { + get { return m_samplingMacros; } + set + { + m_samplingMacros = value; + if( IsLODMainMasterNode ) + ContainerGraph.SamplingMacros = value; + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/MasterNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/MasterNode.cs.meta new file mode 100644 index 0000000..8a8a933 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/MasterNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7fc2c839ab9f3a045877b59493c51502 +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/MasterNodeDataCollector.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/MasterNodeDataCollector.cs new file mode 100644 index 0000000..4db1b03 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/MasterNodeDataCollector.cs @@ -0,0 +1,2277 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using System.Text.RegularExpressions; + +namespace AmplifyShaderEditor +{ + public class PropertyDataCollector + { + public int NodeId; + public int OrderIndex; + public string PropertyName; + public WirePortDataType DataType; + public bool IsDirective; + + public PropertyDataCollector( int nodeId, string propertyName, int orderIndex = -1, bool isDirective = false ) + { + NodeId = nodeId; + PropertyName = propertyName; + OrderIndex = orderIndex; + IsDirective = isDirective; + } + } + + public class InputCoordsCollector + { + public int NodeId; + public string CoordName; + public WirePortDataType DataType; + public PrecisionType Precision; + public int TextureSlot; + public int TextureIndex; + + public InputCoordsCollector( int nodeId, string coordName, WirePortDataType dataType, PrecisionType precision, int textureSlot, int textureIndex ) + { + NodeId = nodeId; + CoordName = coordName; + DataType = dataType; + Precision = precision; + TextureSlot = textureSlot; + TextureIndex = textureIndex; + } + } + + public class TextureDefaultsDataColector + { + private List m_names = new List(); + private List m_values = new List(); + public void AddValue( string newName, Texture newValue ) + { + m_names.Add( newName ); + m_values.Add( newValue ); + } + + public void Destroy() + { + m_names.Clear(); + m_names = null; + + m_values.Clear(); + m_values = null; + } + + public string[] NamesArr { get { return m_names.ToArray(); } } + public Texture[] ValuesArr { get { return m_values.ToArray(); } } + } + + public enum TextureChannelUsage + { + Not_Used, + Used, + Required + } + + [Flags] + public enum MacrosMask + { + NONE = 0, + AUTO = 1 << 1, + LOD = 1 << 2, + BIAS = 1 << 3, + GRAD = 1 << 4, + } + + public class MasterNodeDataCollector + { + private bool m_showDebugMessages = false; + private string m_input; + private string m_customInput; + private string m_properties; + private string m_instancedProperties; + private string m_instanceBlockName; + private string m_uniforms; + private string m_includes; + private string m_pragmas; + private string m_defines; + private string m_instructions; + private string m_localVariables; + private string m_vertexLocalVariables; + private string m_specialLocalVariables; + private string m_vertexData; + private string m_customOutput; + private string m_functions; + private string m_grabPass; + + private List m_inputList; + private List m_customInputList; + private List m_propertiesList; + private List m_instancedPropertiesList; + private List m_dotsPropertiesList; + private List m_dotsDefinesList; + private List m_uniformsList; + private List m_includesList; + private List m_additionalDirectivesList; + //private List m_tagsList; + private List m_pragmasList; + private List m_definesList; + private List m_instructionsList; + private List m_localVariablesList; + private List m_vertexLocalVariablesList; + private List m_specialLocalVariablesList; + private List m_vertexDataList; + private List m_customOutputList; + private List m_functionsList; + private List m_grabPassList; + private List m_aboveUsePassesList; + private List m_belowUsePassesList; + + private List m_customShadowCoordsList; + private List m_packSlotsList; + private string m_customAppDataItems; + + private Dictionary m_inputDict; + private Dictionary m_customInputDict; + private Dictionary m_propertiesDict; + private Dictionary m_instancedPropertiesDict; + private Dictionary m_dotsPropertiesDict; + private Dictionary m_uniformsDict; + private Dictionary m_softRegisteredUniformsDict; + private Dictionary m_includesDict; + private Dictionary m_additionalDirectivesDict; + private Dictionary m_includesExclusionDict; + + //private Dictionary m_tagsDict; + private Dictionary m_pragmasDict; + private Dictionary m_definesDict; + private Dictionary m_virtualCoordinatesDict; + private Dictionary m_virtualVariablesDict; + private Dictionary m_localVariablesDict; + private Dictionary m_vertexLocalVariablesDict; + private Dictionary m_specialLocalVariablesDict; + private Dictionary m_vertexDataDict; + private Dictionary m_customOutputDict; + private Dictionary m_localFunctions; + private Dictionary m_grabPassDict; + private Dictionary m_usePassesDict; + private Dictionary m_customAppDataItemsDict; + + private Dictionary m_customShadowCoordsDict; + + private TextureChannelUsage[] m_requireTextureProperty = { TextureChannelUsage.Not_Used, TextureChannelUsage.Not_Used, TextureChannelUsage.Not_Used, TextureChannelUsage.Not_Used }; + + private bool m_dirtyAppData; + private bool m_dirtyInputs; + private bool m_dirtyCustomInputs; + private bool m_dirtyFunctions; + private bool m_dirtyProperties; + private bool m_dirtyInstancedProperties; + private bool m_dirtyUniforms; + private bool m_dirtyIncludes; + private bool m_dirtyPragmas; + private bool m_dirtyDefines; + private bool m_dirtyAdditionalDirectives; + private bool m_dirtyInstructions; + private bool m_dirtyLocalVariables; + private bool m_dirtyVertexLocalVariables; + private bool m_dirtySpecialLocalVariables; + private bool m_dirtyPerVertexData; + private bool m_dirtyNormal; + private bool m_forceNormal; + + private bool m_usingInternalData; + private bool m_usingVertexColor; + private bool m_usingWorldPosition; + private bool m_usingWorldNormal; + private bool m_usingScreenPos; + private bool m_usingWorldReflection; + private bool m_usingViewDirection; + private bool m_usingLightAttenuation; + private bool m_usingArrayDerivatives; + private bool m_usingTextureArrays; + private bool m_usingExtraStandardMacros; + private MacrosMask m_using2DMacrosMask; + private MacrosMask m_using3DMacrosMask; + private MacrosMask m_usingCUBEMacrosMask; + private MacrosMask m_using2DArrayMacrosMask; + private bool m_usingExtra3DSRPMacros; + + private bool m_usingHigherSizeTexcoords; + private bool m_usingCustomScreenPos; + + private bool m_usingCustomOutlineColor; + private bool m_usingCustomOutlineWidth; + private bool m_usingCustomOutlineAlpha; + private int m_customOutlineSelectedAlpha = 0; + private bool m_usingCustomOutput; + + private bool m_safeNormalizeLightDir; + private bool m_safeNormalizeViewDir; + + private bool m_isOutlineDataCollector = false; + + private bool m_forceNormalIsDirty; + private bool m_grabPassIsDirty; + private bool m_tesselationActive; + + private Dictionary m_propertyNodes; + private MasterNode m_masterNode; + + private int m_availableVertexTempId = 0; + private int m_availableFragTempId = 0; + + private MasterNodePortCategory m_portCategory; + private PortGenType m_genType; + private RenderPath m_renderPath = RenderPath.All; + private NodeAvailability m_currentCanvasMode = NodeAvailability.SurfaceShader; + + //Templates specific data + private AvailableShaderTypes m_masterNodeCategory; + private List m_vertexInputList; + private Dictionary m_vertexInputDict; + private List m_interpolatorsList; + private Dictionary m_interpolatorsDict; + private List m_vertexInterpDeclList; + private Dictionary m_vertexInterpDeclDict; + private TemplateDataCollector m_templateDataCollector; + + public MasterNodeDataCollector( MasterNode masterNode ) : this() + { + m_masterNode = masterNode; + m_masterNodeCategory = masterNode.CurrentMasterNodeCategory; + m_currentCanvasMode = masterNode.ContainerGraph.CurrentCanvasMode; + } + + public MasterNodeDataCollector() + { + //m_masterNode = masterNode; + m_input = "struct Input\n\t\t{\n"; + m_customInput = "\t\tstruct SurfaceOutput{0}\n\t\t{\n"; + m_properties = IOUtils.PropertiesBegin;//"\tProperties\n\t{\n"; + m_uniforms = string.Empty; + m_instructions = string.Empty; + m_includes = string.Empty; + m_pragmas = string.Empty; + m_defines = string.Empty; + m_localVariables = string.Empty; + m_specialLocalVariables = string.Empty; + m_customOutput = string.Empty; + + m_inputList = new List(); + m_customInputList = new List(); + m_propertiesList = new List(); + m_instancedPropertiesList = new List(); + m_dotsPropertiesList = new List(); + m_dotsDefinesList = new List(); + m_uniformsList = new List(); + m_includesList = new List(); + m_additionalDirectivesList = new List(); + //m_tagsList = new List(); + m_pragmasList = new List(); + m_definesList = new List(); + m_instructionsList = new List(); + m_localVariablesList = new List(); + m_vertexLocalVariablesList = new List(); + m_specialLocalVariablesList = new List(); + m_vertexDataList = new List(); + m_customOutputList = new List(); + m_functionsList = new List(); + m_grabPassList = new List(); + m_aboveUsePassesList = new List(); + m_belowUsePassesList = new List(); + m_customAppDataItems = string.Empty; + m_customAppDataItemsDict = new Dictionary(); + m_customShadowCoordsList = new List(); + m_packSlotsList = new List(); + + m_inputDict = new Dictionary(); + m_customInputDict = new Dictionary(); + + m_propertiesDict = new Dictionary(); + m_instancedPropertiesDict = new Dictionary(); + m_dotsPropertiesDict = new Dictionary(); + m_uniformsDict = new Dictionary(); + m_softRegisteredUniformsDict = new Dictionary(); + m_includesDict = new Dictionary(); + m_additionalDirectivesDict = new Dictionary(); + m_includesExclusionDict = new Dictionary(); + + //m_tagsDict = new Dictionary(); + m_pragmasDict = new Dictionary(); + m_definesDict = new Dictionary(); + m_virtualCoordinatesDict = new Dictionary(); + m_localVariablesDict = new Dictionary(); + m_virtualVariablesDict = new Dictionary(); + m_specialLocalVariablesDict = new Dictionary(); + m_vertexLocalVariablesDict = new Dictionary(); + m_localFunctions = new Dictionary(); + m_vertexDataDict = new Dictionary(); + m_customOutputDict = new Dictionary(); + m_grabPassDict = new Dictionary(); + m_usePassesDict = new Dictionary(); + + m_customShadowCoordsDict = new Dictionary(); + + m_dirtyAppData = false; + m_dirtyInputs = false; + m_dirtyCustomInputs = false; + m_dirtyProperties = false; + m_dirtyInstancedProperties = false; + m_dirtyUniforms = false; + m_dirtyInstructions = false; + m_dirtyIncludes = false; + m_dirtyPragmas = false; + m_dirtyDefines = false; + m_dirtyAdditionalDirectives = false; + m_dirtyLocalVariables = false; + m_dirtySpecialLocalVariables = false; + m_grabPassIsDirty = false; + + m_portCategory = MasterNodePortCategory.Fragment; + m_propertyNodes = new Dictionary(); + m_showDebugMessages = ( m_showDebugMessages && DebugConsoleWindow.DeveloperMode ); + + //templates + //m_masterNodeCategory = masterNode.CurrentMasterNodeCategory; + + m_vertexInputList = new List(); + m_vertexInputDict = new Dictionary(); + + m_interpolatorsList = new List(); + m_interpolatorsDict = new Dictionary(); + + m_vertexInterpDeclList = new List(); + m_vertexInterpDeclDict = new Dictionary(); + + m_templateDataCollector = new TemplateDataCollector(); + } + + public void SetChannelUsage( int channelId, TextureChannelUsage usage ) + { + if( channelId > -1 && channelId < 4 ) + m_requireTextureProperty[ channelId ] = usage; + } + + public TextureChannelUsage GetChannelUsage( int channelId ) + { + if( channelId > -1 && channelId < 4 ) + return m_requireTextureProperty[ channelId ]; + + return TextureChannelUsage.Not_Used; + } + public string SurfaceVertexStructure { get { return ( m_dirtyAppData ? Constants.CustomAppDataFullName : Constants.AppDataFullName ); } } + public void OpenPerVertexHeader( bool includeCustomData ) + { + string appData = "inout " + ( m_dirtyAppData ? Constants.CustomAppDataFullName : Constants.AppDataFullName ) + " "; + if( m_dirtyPerVertexData ) + return; + + m_dirtyPerVertexData = true; + if( m_tesselationActive ) + { + m_vertexData = "\t\tvoid " + Constants.VertexDataFunc + "( " + appData + Constants.VertexShaderInputStr + " )\n\t\t{\n"; + } + else + { + m_vertexData = "\t\tvoid " + Constants.VertexDataFunc + "( " + appData + Constants.VertexShaderInputStr + ( includeCustomData ? ( string.Format( ", out Input {0}", Constants.VertexShaderOutputStr ) ) : string.Empty ) + " )\n\t\t{\n"; + if( includeCustomData ) + m_vertexData += string.Format( "\t\t\tUNITY_INITIALIZE_OUTPUT( Input, {0} );\n", Constants.VertexShaderOutputStr ); + } + } + + public void ClosePerVertexHeader() + { + if( m_dirtyPerVertexData ) + m_vertexData += "\t\t}\n\n"; + } + + public void AddToVertexDisplacement( string value, VertexMode vertexMode ) + { + if( string.IsNullOrEmpty( value ) ) + return; + + if( !m_dirtyPerVertexData ) + { + OpenPerVertexHeader( true ); + } + + switch( vertexMode ) + { + default: + case VertexMode.Relative: + { + m_vertexData += "\t\t\t" + Constants.VertexShaderInputStr + ".vertex.xyz += " + value + ";\n"; + } + break; + case VertexMode.Absolute: + { + m_vertexData += "\t\t\t" + Constants.VertexShaderInputStr + ".vertex.xyz = " + value + ";\n"; + } + break; + } + m_vertexData += "\t\t\t" + Constants.VertexShaderInputStr + ".vertex.w = 1;\n"; + } + + + public void AddToVertexNormal( string value ) + { + if( string.IsNullOrEmpty( value ) ) + return; + + if( !m_dirtyPerVertexData ) + { + OpenPerVertexHeader( true ); + } + + m_vertexData += "\t\t\t" + Constants.VertexShaderInputStr + ".normal = " + value + ";\n"; + } + + + public void AddVertexInstruction( string value, int nodeId = -1, bool addDelimiters = true ) + { + if( !m_dirtyPerVertexData && !IsOutlineDataCollector/*&& !(m_usingCustomOutlineColor || m_usingCustomOutlineWidth)*/ ) + { + OpenPerVertexHeader( true ); + } + if( !m_vertexDataDict.ContainsKey( value ) ) + { + m_vertexDataDict.Add( value, new PropertyDataCollector( nodeId, value ) ); + m_vertexDataList.Add( m_vertexDataDict[ value ] ); + m_vertexData += ( addDelimiters ? ( "\t\t\t" + value + ";\n" ) : value ); + } + } + + public bool ContainsInput( string value ) + { + return m_inputDict.ContainsKey( value ); + } + + public void AddToInput( int nodeId, string interpName, WirePortDataType dataType, PrecisionType precision = PrecisionType.Float, bool addSemiColon = true ) + { + string value = UIUtils.PrecisionWirePortToCgType( precision, dataType ) + " " + interpName; + AddToInput( nodeId, value, addSemiColon ); + + if( !m_customShadowCoordsDict.ContainsKey( interpName ) ) + { + int slot = 0; + int index = 0; + int size = UIUtils.GetChannelsAmount( dataType ); + + if( m_packSlotsList.Count == 0 ) + m_packSlotsList.Add( 4 ); + + for( int i = 0; i < m_packSlotsList.Count; i++ ) + { + slot = i; + if( m_packSlotsList[ i ] >= size ) + { + index = 4 - m_packSlotsList[ i ]; + m_packSlotsList[ i ] -= size; + break; + } + else if( i == m_packSlotsList.Count - 1 ) + { + m_packSlotsList.Add( 4 ); + } + } + m_customShadowCoordsDict.Add( interpName, new InputCoordsCollector( nodeId, interpName, dataType, precision, slot, index ) ); + m_customShadowCoordsList.Add( m_customShadowCoordsDict[ interpName ] ); + } + } + + public void AddToInput( int nodeId, SurfaceInputs surfaceInput, PrecisionType precision = PrecisionType.Float, bool addSemiColon = true ) + { + switch( surfaceInput ) + { + case SurfaceInputs.VIEW_DIR: + UsingViewDirection = true; + break; + case SurfaceInputs.SCREEN_POS: + UsingScreenPos = true; + break; + case SurfaceInputs.WORLD_POS: + UsingWorldPosition = true; + break; + case SurfaceInputs.WORLD_REFL: + UsingWorldReflection = true; + break; + case SurfaceInputs.WORLD_NORMAL: + UsingWorldNormal = true; + break; + case SurfaceInputs.INTERNALDATA: + UsingInternalData = true; + break; + case SurfaceInputs.COLOR: + UsingVertexColor = true; + break; + } + + AddToInput( nodeId, UIUtils.GetInputDeclarationFromType( precision, surfaceInput ), addSemiColon ); + } + + /// + /// Direct access to inputs, plese use another overload + /// + /// + /// + /// + public void AddToInput( int nodeId, string value, bool addSemiColon ) + { + if( string.IsNullOrEmpty( value ) ) + return; + + if( !m_inputDict.ContainsKey( value ) ) + { + m_inputDict.Add( value, new PropertyDataCollector( nodeId, value ,-1, !addSemiColon) ); + m_inputList.Add( m_inputDict[ value ] ); + + m_input += "\t\t\t" + value + ( ( addSemiColon ) ? ( ";\n" ) : "\n" ); + m_dirtyInputs = true; + } + } + + public void CloseInputs() + { + m_input += "\t\t};"; + } + + public void ChangeCustomInputHeader( string value ) + { + m_customInput = m_customInput.Replace( "{0}", value ); + } + + public void AddToCustomInput( int nodeId, string value, bool addSemiColon ) + { + if( string.IsNullOrEmpty( value ) ) + return; + + if( !m_customInputDict.ContainsKey( value ) ) + { + m_customInputDict.Add( value, new PropertyDataCollector( nodeId, value ) ); + m_customInputList.Add( m_customInputDict[ value ] ); + m_customInput += "\t\t\t" + value + ( ( addSemiColon ) ? ( ";\n" ) : "\n" ); + m_dirtyCustomInputs = true; + } + } + + public void CloseCustomInputs() + { + m_customInput += "\t\t};"; + } + + + // Used by Template Master Node to add tabs into variable declaration + public void TabifyInstancedVars() + { + for( int i = 0; i < m_instancedPropertiesList.Count; i++ ) + { + m_instancedPropertiesList[ i ].PropertyName = '\t' + m_instancedPropertiesList[ i ].PropertyName; + } + } + + private int GetWeightForInstancedType( WirePortDataType type ) + { + switch( type ) + { + case WirePortDataType.INT: + case WirePortDataType.FLOAT: return -1; + case WirePortDataType.FLOAT2: return -2; + case WirePortDataType.FLOAT3: return -3; + case WirePortDataType.COLOR: + case WirePortDataType.FLOAT4: return -4; + case WirePortDataType.FLOAT3x3: return -9; + case WirePortDataType.FLOAT4x4: return -16; + default: + case WirePortDataType.OBJECT: + case WirePortDataType.SAMPLER1D: + case WirePortDataType.SAMPLER2D: + case WirePortDataType.SAMPLER3D: + case WirePortDataType.SAMPLERCUBE: + case WirePortDataType.SAMPLER2DARRAY: + case WirePortDataType.SAMPLERSTATE: + return 0; + } + } + + public void OptimizeInstancedProperties() + { + if( m_instancedPropertiesList.Count > 0 ) + { + m_instancedProperties = string.Empty; + m_instancedPropertiesList.Sort( ( x, y ) => { return GetWeightForInstancedType( x.DataType ).CompareTo( GetWeightForInstancedType( y.DataType ) ); } ); + int count = m_instancedPropertiesList.Count; + for( int i = 0; i < count; i++ ) + { + m_instancedProperties += m_instancedPropertiesList[ i ].PropertyName; + } + } + } + // Instanced properties + public void SetupInstancePropertiesBlock( string blockName ) + { + m_instanceBlockName = blockName; + if( IsTemplate ) + { + //if( DebugConsoleWindow.DeveloperMode ) + // Debug.LogWarning( "SetupInstancePropertiesBlock should not be used during template mode" ); + + return; + } + + OptimizeInstancedProperties(); + + if( m_dirtyInstancedProperties ) + { + m_instancedProperties = string.Format( IOUtils.InstancedPropertiesBeginTabs, blockName ) + m_instancedProperties + IOUtils.InstancedPropertiesEndTabs; + } + } + + public void AddToDotsProperties( WirePortDataType dataType, int nodeId, string value, int orderIndex, PrecisionType precision ) + { + if( string.IsNullOrEmpty( value ) ) + return; + + string prop = string.Format( IOUtils.DotsInstancedPropertiesData, UIUtils.PrecisionWirePortToCgType( precision, dataType ), value ); + string define = string.Format( IOUtils.DotsInstancedDefinesData, UIUtils.PrecisionWirePortToCgType( precision, dataType ), value ); + + if( !m_dotsPropertiesDict.ContainsKey( value ) ) + { + PropertyDataCollector dataColl = new PropertyDataCollector( nodeId, prop, orderIndex ); + dataColl.DataType = dataType; + m_dotsPropertiesDict.Add( value, dataColl ); + m_dotsPropertiesList.Add( dataColl ); + + dataColl = new PropertyDataCollector( nodeId, define, orderIndex ); + m_dotsDefinesList.Add( dataColl ); + } + } + + public void AddToInstancedProperties( WirePortDataType dataType, int nodeId, string value, int orderIndex ) + { + if( string.IsNullOrEmpty( value ) ) + return; + string uniformValue = value.Contains( "uniform" ) ? value : "uniform " + value; + if( !m_instancedPropertiesDict.ContainsKey( value ) && + !m_uniformsDict.ContainsKey( value ) && + !m_uniformsDict.ContainsKey( uniformValue ) + ) + { + PropertyDataCollector dataColl = new PropertyDataCollector( nodeId, value, orderIndex ); + dataColl.DataType = dataType; + m_instancedPropertiesDict.Add( value, dataColl ); + m_instancedPropertiesList.Add( dataColl ); + m_instancedProperties += value; + m_dirtyInstancedProperties = true; + } + } + + public void CloseInstancedProperties() + { + if( m_dirtyInstancedProperties ) + { + m_instancedProperties += IOUtils.InstancedPropertiesEnd; + } + } + + // Properties + public void CopyPropertiesFromDataCollector( MasterNodeDataCollector dataCollector ) + { + if( dataCollector == null ) + return; + + int propertyCount = dataCollector.PropertiesList.Count; + for( int i = 0; i < propertyCount; i++ ) + { + AddToProperties( dataCollector.PropertiesList[ i ].NodeId, + dataCollector.PropertiesList[ i ].PropertyName, + dataCollector.PropertiesList[ i ].OrderIndex ); + } + + foreach( KeyValuePair kvp in dataCollector.GrabPassDict ) + { + AddGrabPass( kvp.Value ); + } + + m_templateDataCollector.CopySRPPropertiesFromDataCollector( -1, dataCollector.TemplateDataCollectorInstance ); + } + + public void AddToProperties( int nodeId, string value, int orderIndex ) + { + if( string.IsNullOrEmpty( value ) ) + return; + + if( !m_propertiesDict.ContainsKey( value ) ) + { + //Debug.Log( UIUtils ); + m_propertiesDict.Add( value, new PropertyDataCollector( nodeId, value, orderIndex ) ); + m_propertiesList.Add( m_propertiesDict[ value ] ); + m_properties += string.Format( IOUtils.PropertiesElement, value ); + m_dirtyProperties = true; + } + } + + public string BuildPropertiesString() + { + List list = new List( m_propertiesDict.Values ); + //for ( int i = 0; i < list.Count; i++ ) + //{ + // Debug.Log( list[ i ].OrderIndex + " " + list[ i ].PropertyName ); + //} + + list.Sort( ( x, y ) => { return x.OrderIndex.CompareTo( y.OrderIndex ); } ); + CleanUpList( ref list ); + m_properties = IOUtils.PropertiesBegin; + for( int i = 0; i < list.Count; i++ ) + { + m_properties += string.Format( IOUtils.PropertiesElement, list[ i ].PropertyName ); + //Debug.Log() + } + m_properties += IOUtils.PropertiesEnd; + return m_properties; + } + + public bool ContainsProperty( string propertyName ) + { + // TODO: this needs to change, find the property should be dependant of have a "(" + List list = new List( m_propertiesDict.Values ); + return list.Find( x => x.PropertyName.Contains( propertyName+"(" ) ) != null; + } + + public string[] BuildUnformatedPropertiesStringArr() + { + List list = new List( m_propertiesDict.Values ); + list.Sort( ( x, y ) => { return x.OrderIndex.CompareTo( y.OrderIndex ); } ); + CleanUpList( ref list ); + string[] arr = new string[ list.Count ]; + for( int i = 0; i < list.Count; i++ ) + { + arr[ i ] = list[ i ].PropertyName; + } + return arr; + } + //This clean up was set to remove Header attributes from shader functions which would be last on the property list + //Thus creating a label on the inspector with no properties below + public void CleanUpList( ref List list ) + { + if( list.Count == 0 ) + return; + + if( list[ list.Count - 1 ].PropertyName.Contains( "[Header(" ) ) + { + //Check if this is a complete property or just a standalone header + Match match = Regex.Match( list[ list.Count - 1 ].PropertyName, TemplateHelperFunctions.PropertiesPatternG ); + if( !match.Success ) + { + list.RemoveAt( list.Count - 1 ); + CleanUpList( ref list ); + } + } + } + + public void CloseProperties() + { + if( m_dirtyProperties ) + { + m_properties += IOUtils.PropertiesEnd; + } + } + + public void AddUsePass( string value, bool above ) + { + if( m_usePassesDict.ContainsKey( value ) ) + return; + m_usePassesDict.Add( value, value ); + if( above ) + { + m_aboveUsePassesList.Add( new PropertyDataCollector( -1, value ) ); + } + else + { + m_belowUsePassesList.Add( new PropertyDataCollector( -1, value ) ); + } + } + + public void AddGrabPass( string value ) + { + if( m_grabPassDict.ContainsKey( value ) ) + return; + + m_grabPassDict.Add( value, value ); + + if( string.IsNullOrEmpty( value ) ) + { + if( !m_grabPassIsDirty ) + m_grabPass += IOUtils.GrabPassEmpty; + } + else + { + m_grabPass += IOUtils.GrabPassBegin + value + IOUtils.GrabPassEnd; + } + m_grabPassList.Add( new PropertyDataCollector( -1, m_grabPass.Replace( "\t", string.Empty ).Replace( "\n", string.Empty ) ) ); + m_grabPassIsDirty = true; + } + + // This is used by templates global variables to register already existing globals/properties + //public void SoftRegisterUniform( string dataName ) + //{ + // if( !m_uniformsDict.ContainsKey( dataName ) ) + // { + // m_uniformsDict.Add( dataName, new PropertyDataCollector( -1, dataName ) ); + // } + //} + + public string GenerateInstanced(PrecisionType precisionType, WirePortDataType dataType,string propertyName ) + { + if( IsSRP ) + { + return string.Format( IOUtils.LWSRPInstancedPropertiesElement, UIUtils.PrecisionWirePortToCgType( precisionType, dataType ), propertyName ); + } + else + { + return string.Format( IOUtils.InstancedPropertiesElement, UIUtils.PrecisionWirePortToCgType( precisionType, dataType ), propertyName ); + } + } + + public bool CheckIfSoftRegistered( string name ) + { + return m_softRegisteredUniformsDict.ContainsKey( name ); + } + + public void SoftRegisterUniform( TemplateShaderPropertyData data ) + { + bool excludeUniformKeyword = ( data.PropertyType == PropertyType.InstancedProperty ) || IsSRP; + + string uniformName = data.IsMacro? data.PropertyName: + UIUtils.GenerateUniformName( excludeUniformKeyword, data.PropertyDataType, data.PropertyName ); + if( !m_uniformsDict.ContainsKey( uniformName ) ) + { + PropertyDataCollector newEntry = new PropertyDataCollector( -1, uniformName ); + m_uniformsDict.Add( uniformName, newEntry ); + m_softRegisteredUniformsDict.Add( uniformName, newEntry ); + } + + string instancedUniform = GenerateInstanced( PrecisionType.Float, data.PropertyDataType, data.PropertyName ); + if( !m_uniformsDict.ContainsKey( instancedUniform ) ) + { + PropertyDataCollector newEntry = new PropertyDataCollector( -1, instancedUniform ); + m_uniformsDict.Add( instancedUniform, newEntry ); + m_softRegisteredUniformsDict.Add( instancedUniform, newEntry ); + } + + instancedUniform = GenerateInstanced( PrecisionType.Half, data.PropertyDataType, data.PropertyName ); + if( !m_uniformsDict.ContainsKey( instancedUniform ) ) + { + PropertyDataCollector newEntry = new PropertyDataCollector( -1, instancedUniform ); + m_uniformsDict.Add( instancedUniform, newEntry ); + m_softRegisteredUniformsDict.Add( instancedUniform, newEntry ); + } + } + + public void AddToUniforms( int nodeId, string dataType, string dataName, bool checkSRPBatch = false, bool excludeUniform = false ) + { + if( string.IsNullOrEmpty( dataName ) || string.IsNullOrEmpty( dataType ) ) + return; + + string value = UIUtils.GenerateUniformName( IsSRP || excludeUniform, dataType, dataName ); + if( !m_uniformsDict.ContainsKey( value ) && !m_uniformsDict.ContainsKey( dataName ) ) + { + m_uniformsDict.Add( value, new PropertyDataCollector( nodeId, value ) ); + if( IsSRP && checkSRPBatch ) + { + m_templateDataCollector.AddSRPBatcherProperty( nodeId, value ); + } + else + { + m_uniforms += "\t\t" + value + '\n'; + m_uniformsList.Add( m_uniformsDict[ value ] ); + } + m_dirtyUniforms = true; + } + } + + public void AddToUniforms( int nodeId, string value, bool checkSRPBatch = false ) + { + if( string.IsNullOrEmpty( value ) ) + return; + + if( !m_uniformsDict.ContainsKey( value ) ) + { + m_uniformsDict.Add( value, new PropertyDataCollector( nodeId, value ) ); + if( IsSRP && checkSRPBatch ) + { + m_templateDataCollector.AddSRPBatcherProperty( nodeId, value ); + } + else + { + m_uniforms += "\t\t" + value + '\n'; + m_uniformsList.Add( m_uniformsDict[ value ] ); + } + m_dirtyUniforms = true; + } + } + + public void AddASEMacros() + { + if( Using2DMacrosMask == MacrosMask.NONE && Using3DMacrosMask == MacrosMask.NONE && UsingCUBEMacrosMask == MacrosMask.NONE && Using2DArrayMacrosMask == MacrosMask.NONE ) + return; + + ParentGraph outsideGraph = UIUtils.CurrentWindow.OutsideGraph; +#if !UNITY_2018_1_OR_NEWER + if( outsideGraph.IsStandardSurface && ( ( Using2DArrayMacrosMask & MacrosMask.AUTO ) == MacrosMask.AUTO || ( Using2DArrayMacrosMask & MacrosMask.LOD ) == MacrosMask.LOD ) ) + { + return; + } +#endif + + //Debug.Log( UsingMacrosMask ); + AddToDirectives( Constants.CustomASEStandarSamplingMacrosHelper[ 0 ], 1 ); + + if( ( Using2DMacrosMask & MacrosMask.AUTO ) == MacrosMask.AUTO ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosRecent[ 0 ], 1 ); + if( ( Using2DMacrosMask & MacrosMask.LOD ) == MacrosMask.LOD ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosRecent[ 1 ], 1 ); + if( ( Using2DMacrosMask & MacrosMask.BIAS ) == MacrosMask.BIAS ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosRecent[ 2 ], 1 ); + if( ( Using2DMacrosMask & MacrosMask.GRAD ) == MacrosMask.GRAD ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosRecent[ 3 ], 1 ); + + if( ( Using3DMacrosMask & MacrosMask.AUTO ) == MacrosMask.AUTO ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosRecent[ 4 ], 1 ); + if( ( Using3DMacrosMask & MacrosMask.LOD ) == MacrosMask.LOD ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosRecent[ 5 ], 1 ); + if( ( Using3DMacrosMask & MacrosMask.BIAS ) == MacrosMask.BIAS ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosRecent[ 6 ], 1 ); + if( ( Using3DMacrosMask & MacrosMask.GRAD ) == MacrosMask.GRAD ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosRecent[ 7 ], 1 ); + + if( ( UsingCUBEMacrosMask & MacrosMask.AUTO ) == MacrosMask.AUTO ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosRecent[ 8 ], 1 ); + if( ( UsingCUBEMacrosMask & MacrosMask.LOD ) == MacrosMask.LOD ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosRecent[ 9 ], 1 ); + if( ( UsingCUBEMacrosMask & MacrosMask.BIAS ) == MacrosMask.BIAS ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosRecent[ 10 ], 1 ); + if( ( UsingCUBEMacrosMask & MacrosMask.GRAD ) == MacrosMask.GRAD ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosRecent[ 11 ], 1 ); + +#if !UNITY_2018_1_OR_NEWER + if( outsideGraph.IsStandardSurface ) + { + //if( ( Using2DArrayMacrosMask & MacrosMask.AUTO ) == MacrosMask.AUTO ) + // AddToDirectives( Constants.CustomASEArraySamplingMacrosRecent[ 0 ], 1 ); + //if( ( Using2DArrayMacrosMask & MacrosMask.LOD ) == MacrosMask.LOD ) + // AddToDirectives( Constants.CustomASEArraySamplingMacrosRecent[ 1 ], 1 ); + if( ( Using2DArrayMacrosMask & MacrosMask.BIAS ) == MacrosMask.BIAS ) + AddToDirectives( Constants.CustomASEArraySamplingMacrosRecent[ 2 ], 1 ); + if( ( Using2DArrayMacrosMask & MacrosMask.GRAD ) == MacrosMask.GRAD ) + AddToDirectives( Constants.CustomASEArraySamplingMacrosRecent[ 3 ], 1 ); + } + else +#endif + { + if( ( Using2DArrayMacrosMask & MacrosMask.AUTO ) == MacrosMask.AUTO ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosRecent[ 12 ], 1 ); + if( ( Using2DArrayMacrosMask & MacrosMask.LOD ) == MacrosMask.LOD ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosRecent[ 13 ], 1 ); + if( ( Using2DArrayMacrosMask & MacrosMask.BIAS ) == MacrosMask.BIAS ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosRecent[ 14 ], 1 ); + if( ( Using2DArrayMacrosMask & MacrosMask.GRAD ) == MacrosMask.GRAD ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosRecent[ 15 ], 1 ); + } + + AddToDirectives( Constants.CustomASEStandarSamplingMacrosHelper[ 1 ], 1 ); + + if( ( Using2DMacrosMask & MacrosMask.AUTO ) == MacrosMask.AUTO ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosOlder[ 0 ], 1 ); + if( ( Using2DMacrosMask & MacrosMask.LOD ) == MacrosMask.LOD ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosOlder[ 1 ], 1 ); + if( ( Using2DMacrosMask & MacrosMask.BIAS ) == MacrosMask.BIAS ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosOlder[ 2 ], 1 ); + if( ( Using2DMacrosMask & MacrosMask.GRAD ) == MacrosMask.GRAD ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosOlder[ 3 ], 1 ); + + if( ( Using3DMacrosMask & MacrosMask.AUTO ) == MacrosMask.AUTO ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosOlder[ 4 ], 1 ); + if( ( Using3DMacrosMask & MacrosMask.LOD ) == MacrosMask.LOD ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosOlder[ 5 ], 1 ); + if( ( Using3DMacrosMask & MacrosMask.BIAS ) == MacrosMask.BIAS ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosOlder[ 6 ], 1 ); + if( ( Using3DMacrosMask & MacrosMask.GRAD ) == MacrosMask.GRAD ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosOlder[ 7 ], 1 ); + + if( ( UsingCUBEMacrosMask & MacrosMask.AUTO ) == MacrosMask.AUTO ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosOlder[ 8 ], 1 ); + if( ( UsingCUBEMacrosMask & MacrosMask.LOD ) == MacrosMask.LOD ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosOlder[ 9 ], 1 ); + if( ( UsingCUBEMacrosMask & MacrosMask.BIAS ) == MacrosMask.BIAS ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosOlder[ 10 ], 1 ); + if( ( UsingCUBEMacrosMask & MacrosMask.GRAD ) == MacrosMask.GRAD ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosOlder[ 11 ], 1 ); + +#if !UNITY_2018_1_OR_NEWER + if( outsideGraph.IsStandardSurface ) + { + //if( ( Using2DArrayMacrosMask & MacrosMask.AUTO ) == MacrosMask.AUTO ) + // AddToDirectives( Constants.CustomASEArraySamplingMacrosOlder[ 0 ], 1 ); + //if( ( Using2DArrayMacrosMask & MacrosMask.LOD ) == MacrosMask.LOD ) + // AddToDirectives( Constants.CustomASEArraySamplingMacrosOlder[ 1 ], 1 ); + if( ( Using2DArrayMacrosMask & MacrosMask.BIAS ) == MacrosMask.BIAS ) + AddToDirectives( Constants.CustomASEArraySamplingMacrosOlder[ 2 ], 1 ); + if( ( Using2DArrayMacrosMask & MacrosMask.GRAD ) == MacrosMask.GRAD ) + AddToDirectives( Constants.CustomASEArraySamplingMacrosOlder[ 3 ], 1 ); + } + else +#endif + { + if( ( Using2DArrayMacrosMask & MacrosMask.AUTO ) == MacrosMask.AUTO ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosOlder[ 12 ], 1 ); + if( ( Using2DArrayMacrosMask & MacrosMask.LOD ) == MacrosMask.LOD ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosOlder[ 13 ], 1 ); + if( ( Using2DArrayMacrosMask & MacrosMask.BIAS ) == MacrosMask.BIAS ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosOlder[ 14 ], 1 ); + if( ( Using2DArrayMacrosMask & MacrosMask.GRAD ) == MacrosMask.GRAD ) + AddToDirectives( Constants.CustomASEStandarSamplingMacrosOlder[ 15 ], 1 ); + } + + AddToDirectives( Constants.CustomASEStandarSamplingMacrosHelper[ 2 ], 1 ); + } + + public void AddToDirectives( string value, int orderIndex = -1 , AdditionalLineType type = AdditionalLineType.Custom ) + { + if( string.IsNullOrEmpty( value ) ) + return; + + switch( type ) + { + case AdditionalLineType.Include:value = "#include " + value;break; + case AdditionalLineType.Define:value = "#define " + value; break; + case AdditionalLineType.Pragma:value = "#pragma " + value; break; + } + if( !m_additionalDirectivesDict.ContainsKey( value ) ) + { + PropertyDataCollector data = new PropertyDataCollector( -1, value, orderIndex ); + m_additionalDirectivesDict.Add( value, data ); + m_additionalDirectivesList.Add( data ); + m_dirtyAdditionalDirectives = true; + } + } + + public void AddToIncludes( int nodeId, string value ) + { + if( string.IsNullOrEmpty( value ) ) + return; + + if( m_includesExclusionDict.ContainsKey( value ) ) + { + return; + } + + if( IsTemplate ) + { + if( m_templateDataCollector.HasDirective( AdditionalLineType.Include, value ) ) + return; + } + + if( !m_includesDict.ContainsKey( value ) ) + { + PropertyDataCollector data = new PropertyDataCollector( nodeId, "#include \"" + value + "\"" ); + m_includesDict.Add( value, data ); + m_includesList.Add( data ); + m_includes += "\t\t#include \"" + value + "\"\n"; + m_dirtyIncludes = true; + } + else + { + if( m_showDebugMessages ) UIUtils.ShowMessage( "AddToIncludes:Attempting to add duplicate " + value, MessageSeverity.Warning ); + } + } + + + public void RemoveFromIncludes( string value ) + { + if( string.IsNullOrEmpty( value ) ) + return; + + if( !m_includesExclusionDict.ContainsKey( value ) ) + { + m_includesExclusionDict.Add( value, value ); + } + + if( m_includesDict.ContainsKey( value ) ) + { + PropertyDataCollector data = m_includesDict[ value ]; + m_includesDict.Remove( value ); + m_includesList.Remove( data ); + m_dirtyIncludes = true; + string finalValueName = "\t\t#include \"" + value + "\"\n"; + m_includes = m_includes.Replace( finalValueName, string.Empty ); + } + } + + //public void AddToTags( int nodeId, string name, string value ) + //{ + // if( string.IsNullOrEmpty( name ) || string.IsNullOrEmpty( value ) ) + // return; + + // if( !m_tagsDict.ContainsKey( name ) ) + // { + // string finalResult = string.Format( "\"{0}\"=\"{1}\"", name, value ); + // m_tagsDict.Add( name, new PropertyDataCollector( nodeId, finalResult ) ); + // m_tagsList.Add( new PropertyDataCollector( nodeId, finalResult ) ); + // } + //} + + public void AddToPragmas( int nodeId, string value ) + { + if( string.IsNullOrEmpty( value ) ) + return; + + if( IsTemplate ) + { + if( m_templateDataCollector.HasDirective( AdditionalLineType.Pragma, value ) ) + return; + } + + if( !m_pragmasDict.ContainsKey( value ) ) + { + m_pragmasDict.Add( value, new PropertyDataCollector( nodeId, "#pragma " + value ) ); + m_pragmasList.Add( m_pragmasDict[ value ] ); + m_pragmas += "\t\t#pragma " + value + "\n"; + m_dirtyPragmas = true; + } + else + { + if( m_showDebugMessages ) UIUtils.ShowMessage( "AddToPragmas:Attempting to add duplicate " + value, MessageSeverity.Warning ); + } + } + + public void AddToDefines( int nodeId, string value, bool define = true ) + { + if( string.IsNullOrEmpty( value ) ) + return; + + if( IsTemplate ) + { + if( m_templateDataCollector.HasDirective( AdditionalLineType.Define, value ) ) + return; + } + + if( !m_definesDict.ContainsKey( value ) ) + { + string defineValue = ( define ? "#define " : "#undef " ) + value; + m_definesDict.Add( value, new PropertyDataCollector( nodeId, defineValue ) ); + m_definesList.Add( m_definesDict[ value ] ); + m_defines += "\t\t" + defineValue + "\n"; + m_dirtyDefines = true; + } + else + { + if( m_showDebugMessages ) UIUtils.ShowMessage( "AddToDefines:Attempting to add duplicate " + value, MessageSeverity.Warning ); + } + } + + public int GetVirtualCoordinatesId( int nodeId, string coord, string lodBias ) + { + if( !m_virtualCoordinatesDict.ContainsKey( coord ) ) + { + m_virtualCoordinatesDict.Add( coord, nodeId ); + AddLocalVariable( nodeId, "VirtualCoord " + Constants.VirtualCoordNameStr + nodeId + " = VTComputeVirtualCoord" + lodBias + "(" + coord + ");" ); + return nodeId; + } + else + { + int fetchedId = 0; + m_virtualCoordinatesDict.TryGetValue( coord, out fetchedId ); + return fetchedId; + } + } + + public bool AddToLocalVariables( MasterNodePortCategory category, int nodeId, PrecisionType precisionType, WirePortDataType type, string varName, string varValue ) + { + if( string.IsNullOrEmpty( varName ) || string.IsNullOrEmpty( varValue ) ) + return false; + + string value = UIUtils.PrecisionWirePortToCgType( precisionType, type ) + " " + varName + " = " + varValue + ";"; + return AddToLocalVariables( category, nodeId, value ); + } + + public bool AddToLocalVariables( int nodeId, PrecisionType precisionType, WirePortDataType type, string varName, string varValue ) + { + if( string.IsNullOrEmpty( varName ) || string.IsNullOrEmpty( varValue ) ) + return false; + + string value = UIUtils.PrecisionWirePortToCgType( precisionType, type ) + " " + varName + " = " + varValue + ";"; + return AddToLocalVariables( nodeId, value ); + } + + public bool AddToLocalVariables( MasterNodePortCategory category, int nodeId, string value, bool ignoreDuplicates = false ) + { + if( string.IsNullOrEmpty( value ) ) + return false; + + switch( category ) + { + case MasterNodePortCategory.Vertex: + case MasterNodePortCategory.Tessellation: + { + return AddToVertexLocalVariables( nodeId, value, ignoreDuplicates ); + } + case MasterNodePortCategory.Fragment: + case MasterNodePortCategory.Debug: + { + return AddToLocalVariables( nodeId, value, ignoreDuplicates ); + } + } + + return false; + } + + public bool AddLocalVariable( int nodeId, string customType, string varName, string varValue ) + { + if( string.IsNullOrEmpty( varName ) || string.IsNullOrEmpty( varValue ) ) + return false; + + string value = customType + " " + varName + " = " + varValue + ";"; + return AddLocalVariable( nodeId, value ); + } + + private bool UsedLocalVariable( string value ) + { + switch( m_portCategory ) + { + case MasterNodePortCategory.Vertex: + case MasterNodePortCategory.Tessellation: + { + if( m_vertexLocalVariablesDict.ContainsKey( value ) ) + { + return true; + } + } + break; + case MasterNodePortCategory.Fragment: + case MasterNodePortCategory.Debug: + { + if( m_usingCustomOutput ) + { + if( m_customOutputDict.ContainsKey( value ) ) + { + return true; + } + } + else + { + if( m_localVariablesDict.ContainsKey( value ) ) + { + return true; + } + } + } + break; + } + return false; + } + + private bool ValidadeLocalVariable( PrecisionType precisionType, WirePortDataType type, string varName, string varValue, ref string result ) + { + Array enumValues = Enum.GetValues( typeof( PrecisionType ) ); + foreach( PrecisionType currPrecision in enumValues) + { + string value = UIUtils.PrecisionWirePortToTypeValue( currPrecision, type, varName ) + " = " + varValue + ";"; + if( UsedLocalVariable( value ) ) + return false; + + if( precisionType == currPrecision ) + result = value; + } + + return true; + } + + public bool AddLocalVariable( int nodeId, PrecisionType precisionType, WirePortDataType type, string varName, string varValue ) + { + if( string.IsNullOrEmpty( varName ) || string.IsNullOrEmpty( varValue ) ) + return false; + + //string value = UIUtils.PrecisionWirePortToTypeValue( precisionType, type, varName ) + " = " + varValue + ";"; + string value = string.Empty; + if( ValidadeLocalVariable( precisionType, type, varName, varValue, ref value)) + return AddLocalVariable( nodeId, value ); + + return false; + } + + public bool AddLocalVariable( int nodeId, string name, string value, bool ignoreDuplicates = false , bool addSemiColon = false ) + { + string finalValue = addSemiColon ? name + " = " + value + ";" : name + " = " + value; + return AddLocalVariable( nodeId, finalValue, ignoreDuplicates ); + } + + public bool AddLocalVariable( int nodeId, string value, bool ignoreDuplicates = false ) + { + if( string.IsNullOrEmpty( value ) ) + return false; + + switch( m_portCategory ) + { + case MasterNodePortCategory.Vertex: + case MasterNodePortCategory.Tessellation: + { + return AddToVertexLocalVariables( nodeId, value, ignoreDuplicates ); + } + case MasterNodePortCategory.Fragment: + case MasterNodePortCategory.Debug: + { + return AddToLocalVariables( nodeId, value, ignoreDuplicates ); + } + } + + return false; + } + + public string AddVirtualLocalVariable( int nodeId, string variable, string value ) + { + if( string.IsNullOrEmpty( value ) ) + return string.Empty; + + string result = string.Empty; + + //switch ( m_portCategory ) + //{ + //case MasterNodePortCategory.Vertex: + //case MasterNodePortCategory.Tessellation: + //{ + //} + //break; + //case MasterNodePortCategory.Fragment: + //case MasterNodePortCategory.Debug: + //{ + if( !m_virtualVariablesDict.ContainsKey( value ) ) + { + m_virtualVariablesDict.Add( value, variable ); + result = variable; + } + else + { + m_virtualVariablesDict.TryGetValue( value, out result ); + } + //} + //break; + //} + + return result; + } + + public void AddCodeComments( bool forceForwardSlash, params string[] comments ) + { + if( m_portCategory == MasterNodePortCategory.Tessellation || m_portCategory == MasterNodePortCategory.Vertex ) + { + AddToVertexLocalVariables( 0, IOUtils.CreateCodeComments( forceForwardSlash, comments ) ); + } + else + { + AddToLocalVariables( 0, IOUtils.CreateCodeComments( forceForwardSlash, comments ) ); + } + } + + public bool HasLocalVariable( string value ) + { + switch( m_portCategory ) + { + case MasterNodePortCategory.Vertex: + case MasterNodePortCategory.Tessellation: + { + return m_vertexLocalVariablesDict.ContainsKey( value ); + } + case MasterNodePortCategory.Fragment: + case MasterNodePortCategory.Debug: + { + if( m_usingCustomOutput ) + { + return m_customOutputDict.ContainsKey( value ); + } + else + { + return m_localVariablesDict.ContainsKey( value ); + } + } + } + return false; + } + + public bool AddToLocalVariables( int nodeId, string value, bool ignoreDuplicates = false ) + { + if( string.IsNullOrEmpty( value ) ) + return false; + + if( m_usingCustomOutput ) + { + if( !m_customOutputDict.ContainsKey( value ) || ignoreDuplicates ) + { + if( !m_customOutputDict.ContainsKey( value ) ) + m_customOutputDict.Add( value, new PropertyDataCollector( nodeId, value ) ); + + m_customOutputList.Add( m_customOutputDict[ value ] ); + m_customOutput += "\t\t\t" + value + '\n'; + return true; + } + else + { + if( m_showDebugMessages ) UIUtils.ShowMessage( "AddToLocalVariables:Attempting to add duplicate " + value, MessageSeverity.Warning ); + } + } + else + { + if( !m_localVariablesDict.ContainsKey( value ) || ignoreDuplicates ) + { + if( !m_localVariablesDict.ContainsKey( value ) ) + m_localVariablesDict.Add( value, new PropertyDataCollector( nodeId, value ) ); + + m_localVariablesList.Add( m_localVariablesDict[ value ] ); + AddToSpecialLocalVariables( nodeId, value, ignoreDuplicates ); + return true; + } + else + { + if( m_showDebugMessages ) UIUtils.ShowMessage( "AddToLocalVariables:Attempting to add duplicate " + value, MessageSeverity.Warning ); + } + } + return false; + } + + public void AddToSpecialLocalVariables( int nodeId, string value, bool ignoreDuplicates = false ) + { + if( string.IsNullOrEmpty( value ) ) + return; + + if( m_usingCustomOutput ) + { + if( !m_customOutputDict.ContainsKey( value ) || ignoreDuplicates ) + { + if( !m_customOutputDict.ContainsKey( value ) ) + m_customOutputDict.Add( value, new PropertyDataCollector( nodeId, value ) ); + + m_customOutputList.Add( m_customOutputDict[ value ] ); + m_customOutput += "\t\t\t" + value + '\n'; + m_dirtySpecialLocalVariables = true; + } + else + { + if( m_showDebugMessages ) UIUtils.ShowMessage( "AddToSpecialLocalVariables:Attempting to add duplicate " + value, MessageSeverity.Warning ); + } + } + else + { + if( !m_specialLocalVariablesDict.ContainsKey( value ) || ignoreDuplicates ) + { + if( !m_specialLocalVariablesDict.ContainsKey( value ) ) + m_specialLocalVariablesDict.Add( value, new PropertyDataCollector( nodeId, value ) ); + + m_specialLocalVariablesList.Add( m_specialLocalVariablesDict[ value ] ); + m_specialLocalVariables += "\t\t\t" + value + '\n'; + m_dirtySpecialLocalVariables = true; + } + else + { + if( m_showDebugMessages ) UIUtils.ShowMessage( "AddToSpecialLocalVariables:Attempting to add duplicate " + value, MessageSeverity.Warning ); + } + } + } + + public void ClearSpecialLocalVariables() + { + //m_specialLocalVariablesDict.Clear(); + m_specialLocalVariables = string.Empty; + m_dirtySpecialLocalVariables = false; + } + + public bool AddToVertexLocalVariables( int nodeId, string varName, string varValue ) + { + if( string.IsNullOrEmpty( varName ) || string.IsNullOrEmpty( varValue ) ) + return false; + + string value = varName + " = " + varValue + ";"; + return AddToVertexLocalVariables( nodeId, value ); + } + + public bool AddToVertexLocalVariables( int nodeId, PrecisionType precisionType, WirePortDataType type, string varName, string varValue ) + { + if( string.IsNullOrEmpty( varName ) || string.IsNullOrEmpty( varValue ) ) + return false; + + string value = UIUtils.PrecisionWirePortToCgType( precisionType, type ) + " " + varName + " = " + varValue + ";"; + return AddToVertexLocalVariables( nodeId, value ); + } + + public bool AddToVertexLocalVariables( int nodeId, string value, bool ignoreDuplicates = false ) + { + if( string.IsNullOrEmpty( value ) ) + return false; + + if( !m_vertexLocalVariablesDict.ContainsKey( value ) || ignoreDuplicates ) + { + if( !m_vertexLocalVariablesDict.ContainsKey( value ) ) + m_vertexLocalVariablesDict.Add( value, new PropertyDataCollector( nodeId, value ) ); + + m_vertexLocalVariablesList.Add( m_vertexLocalVariablesDict[ value ] ); + m_vertexLocalVariables += "\t\t\t" + value + '\n'; + m_dirtyVertexLocalVariables = true; + return true; + } + else + { + if( m_showDebugMessages ) UIUtils.ShowMessage( "AddToVertexLocalVariables:Attempting to add duplicate " + value, MessageSeverity.Warning ); + } + + return false; + } + + public void ClearVertexLocalVariables() + { + //m_vertexLocalVariablesDict.Clear(); + m_vertexLocalVariables = string.Empty; + m_dirtyVertexLocalVariables = false; + } + + + public bool CheckFunction( string header ) + { + return m_localFunctions.ContainsKey( header ); + } + + public string AddFunctions( string header, string body, params object[] inParams ) + { + if( !m_localFunctions.ContainsKey( header ) ) + { + m_localFunctions.Add( header, body ); + m_functionsList.Add( new PropertyDataCollector( -1, body.Replace( "\t\t", string.Empty ) ) ); + m_functions += "\n" + body + "\n"; + m_dirtyFunctions = true; + } + + return String.Format( header, inParams ); + } + + public string AddFunctions( string header, string[] bodyLines, bool addNewLine, params object[] inParams ) + { + if( !m_localFunctions.ContainsKey( header ) ) + { + string body = string.Empty; + for( int i = 0; i < bodyLines.Length; i++ ) + { + body += ( m_masterNodeCategory == AvailableShaderTypes.Template ) ? bodyLines[ i ] : "\t\t" + bodyLines[ i ]; + if( addNewLine ) + body += '\n'; + } + + m_localFunctions.Add( header, body ); + m_functionsList.Add( new PropertyDataCollector( -1, body ) ); + m_functions += "\n" + body + "\n"; + m_dirtyFunctions = true; + } + + return String.Format( header, inParams ); + } + + public bool HasFunction( string functionId ) + { + return m_localFunctions.ContainsKey( functionId ); + } + + public void AddFunction( string functionId, string body ) + { + if( !m_localFunctions.ContainsKey( functionId ) ) + { + m_functionsList.Add( new PropertyDataCollector( -1, body ) ); + + m_localFunctions.Add( functionId, body ); + m_functions += "\n" + body + "\n"; + m_dirtyFunctions = true; + } + } + + public void AddFunction( string functionId, string[] bodyLines, bool addNewline ) + { + if( !m_localFunctions.ContainsKey( functionId ) ) + { + string body = string.Empty; + for( int i = 0; i < bodyLines.Length; i++ ) + { + body += ( m_masterNodeCategory == AvailableShaderTypes.Template ) ? bodyLines[ i ] : "\t\t" + bodyLines[ i ]; + if( addNewline ) + body += '\n'; + + } + m_functionsList.Add( new PropertyDataCollector( -1, body ) ); + + m_localFunctions.Add( functionId, body ); + m_functions += "\n" + body + "\n"; + m_dirtyFunctions = true; + } + } + + public void AddInstructions( string value, bool addTabs = false, bool addLineEnding = false ) + { + m_instructionsList.Add( new PropertyDataCollector( -1, value ) ); + m_instructions += addTabs ? "\t\t\t" + value : value; + if( addLineEnding ) + { + m_instructions += '\n'; + } + m_dirtyInstructions = true; + } + + + public void AddInstructions( bool addLineEnding, bool addTabs, params string[] values ) + { + for( int i = 0; i < values.Length; i++ ) + { + m_instructionsList.Add( new PropertyDataCollector( -1, values[ i ] ) ); + m_instructions += addTabs ? "\t\t\t" + values[ i ] : values[ i ]; + if( addLineEnding ) + { + m_instructions += '\n'; + } + } + m_dirtyInstructions = true; + } + + + + public void AddToStartInstructions( string value ) + { + if( string.IsNullOrEmpty( value ) ) + return; + + m_instructions = value + m_instructions; + m_dirtyInstructions = true; + } + + public void ResetInstructions() + { + m_instructionsList.Clear(); + m_instructions = string.Empty; + m_dirtyInstructions = false; + } + + + public void ResetVertexInstructions() + { + m_vertexDataList.Clear(); + m_vertexData = string.Empty; + m_dirtyPerVertexData = false; + } + + public void AddPropertyNode( PropertyNode node ) + { + if( !m_propertyNodes.ContainsKey( node.UniqueId ) ) + { + m_propertyNodes.Add( node.UniqueId, node ); + } + } + + public void UpdateMaterialOnPropertyNodes( Material material ) + { + m_masterNode.UpdateMaterial( material ); + foreach( KeyValuePair kvp in m_propertyNodes ) + { + kvp.Value.UpdateMaterial( material ); + } + } + + public void AddToVertexInput( string value ) + { + if( !m_vertexInputDict.ContainsKey( value ) ) + { + m_vertexInputDict.Add( value, value ); + m_vertexInputList.Add( value ); + } + } + + public void AddToInterpolators( string value ) + { + if( !m_interpolatorsDict.ContainsKey( value ) ) + { + m_interpolatorsDict.Add( value, value ); + m_interpolatorsList.Add( value ); + } + } + + public void AddToVertexInterpolatorsDecl( string value ) + { + if( !m_vertexInterpDeclDict.ContainsKey( value ) ) + { + m_vertexInterpDeclDict.Add( value, value ); + m_vertexInterpDeclList.Add( value ); + } + } + + public void UpdateShaderImporter( ref Shader shader ) + { + ShaderImporter importer = (ShaderImporter)ShaderImporter.GetAtPath( AssetDatabase.GetAssetPath( shader ) ); + if( m_propertyNodes.Count > 0 ) + { + try + { + bool hasContents = false; + TextureDefaultsDataColector defaultCol = new TextureDefaultsDataColector(); + foreach( KeyValuePair kvp in m_propertyNodes ) + { + hasContents = kvp.Value.UpdateShaderDefaults( ref shader, ref defaultCol ) || hasContents; + } + + if( hasContents ) + { + importer.SetDefaultTextures( defaultCol.NamesArr, defaultCol.ValuesArr ); + defaultCol.Destroy(); + defaultCol = null; + } + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + importer.SaveAndReimport(); + } + + public void AddCustomAppData( string value ) + { + if( m_customAppDataItemsDict.ContainsKey( value ) ) + return; + + m_customAppDataItemsDict.Add( value, value ); + m_customAppDataItems += "\t\t\t" + value + "\n"; + m_dirtyAppData = true; + } + public string CustomAppDataName { get { return m_dirtyAppData ? Constants.CustomAppDataFullName : Constants.AppDataFullName; } } + + public string CustomAppData + { + get + { + if( m_dirtyPerVertexData ) + return Constants.CustomAppDataFullBody + m_customAppDataItems + "\t\t};\n"; + + return string.Empty; + } + } + + public void Destroy() + { + m_masterNode = null; + + m_customAppDataItemsDict.Clear(); + m_customAppDataItemsDict = null; + + m_inputList.Clear(); + m_inputList = null; + + m_customInputList.Clear(); + m_customInputList = null; + + m_propertiesList.Clear(); + m_propertiesList = null; + + m_instancedPropertiesList.Clear(); + m_instancedPropertiesList = null; + + m_dotsPropertiesList.Clear(); + m_dotsPropertiesList = null; + + m_dotsDefinesList.Clear(); + m_dotsDefinesList = null; + + m_uniformsList.Clear(); + m_uniformsList = null; + + m_additionalDirectivesList.Clear(); + m_additionalDirectivesList = null; + + m_includesList.Clear(); + m_includesList = null; + + //m_tagsList.Clear(); + //m_tagsList = null; + + m_pragmasList.Clear(); + m_pragmasList = null; + + m_definesList.Clear(); + m_definesList = null; + + m_instructionsList.Clear(); + m_instructionsList = null; + + m_localVariablesList.Clear(); + m_localVariablesList = null; + + m_vertexLocalVariablesList.Clear(); + m_vertexLocalVariablesList = null; + + m_specialLocalVariablesList.Clear(); + m_specialLocalVariablesList = null; + + m_vertexDataList.Clear(); + m_vertexDataList = null; + + m_customOutputList.Clear(); + m_customOutputList = null; + + m_functionsList.Clear(); + m_functionsList = null; + + m_grabPassList.Clear(); + m_grabPassList = null; + + m_aboveUsePassesList.Clear(); + m_aboveUsePassesList = null; + + m_belowUsePassesList.Clear(); + m_belowUsePassesList = null; + + m_grabPassDict.Clear(); + m_grabPassDict = null; + + m_usePassesDict.Clear(); + m_usePassesDict = null; + + m_propertyNodes.Clear(); + m_propertyNodes = null; + + m_inputDict.Clear(); + m_inputDict = null; + + m_customInputDict.Clear(); + m_customInputDict = null; + + m_propertiesDict.Clear(); + m_propertiesDict = null; + + m_dotsPropertiesDict.Clear(); + m_dotsPropertiesDict = null; + + m_instancedPropertiesDict.Clear(); + m_instancedPropertiesDict = null; + + m_uniformsDict.Clear(); + m_uniformsDict = null; + + m_softRegisteredUniformsDict.Clear(); + m_softRegisteredUniformsDict = null; + + m_includesDict.Clear(); + m_includesDict = null; + + m_additionalDirectivesDict.Clear(); + m_additionalDirectivesDict = null; + + m_includesExclusionDict.Clear(); + m_includesExclusionDict = null; + //m_tagsDict.Clear(); + //m_tagsDict = null; + + m_pragmasDict.Clear(); + m_pragmasDict = null; + + m_definesDict.Clear(); + m_definesDict = null; + + m_virtualCoordinatesDict.Clear(); + m_virtualCoordinatesDict = null; + + m_virtualVariablesDict.Clear(); + m_virtualVariablesDict = null; + + m_localVariablesDict.Clear(); + m_localVariablesDict = null; + + m_specialLocalVariablesDict.Clear(); + m_specialLocalVariablesDict = null; + + m_vertexLocalVariablesDict.Clear(); + m_vertexLocalVariablesDict = null; + + m_localFunctions.Clear(); + m_localFunctions = null; + + m_vertexDataDict.Clear(); + m_vertexDataDict = null; + + m_customOutputDict.Clear(); + m_customOutputDict = null; + + //templates + m_vertexInputList.Clear(); + m_vertexInputList = null; + + m_vertexInputDict.Clear(); + m_vertexInputDict = null; + + m_interpolatorsList.Clear(); + m_interpolatorsList = null; + + m_interpolatorsDict.Clear(); + m_interpolatorsDict = null; + + m_vertexInterpDeclList.Clear(); + m_vertexInterpDeclList = null; + + m_vertexInterpDeclDict.Clear(); + m_vertexInterpDeclDict = null; + + m_templateDataCollector.Destroy(); + m_templateDataCollector = null; + + m_customShadowCoordsDict.Clear(); + m_customShadowCoordsDict = null; + + m_customShadowCoordsList.Clear(); + m_customShadowCoordsDict = null; + + m_packSlotsList.Clear(); + m_packSlotsList = null; + } + + public string Inputs { get { return m_input; } } + public string CustomInput { get { return m_customInput; } } + public string Properties { get { return m_properties; } } + public string InstanceBlockName { get { return m_instanceBlockName; } } + public string InstancedProperties { get { return m_instancedProperties; } } + public string Uniforms { get { return m_uniforms; } } + public string Instructions { get { return m_instructions; } } + public string Includes { get { return m_includes; } } + public string Pragmas { get { return m_pragmas; } } + public string Defines { get { return m_defines; } } + public string LocalVariables { get { return m_localVariables; } } + public string SpecialLocalVariables { get { return m_specialLocalVariables; } } + public string VertexLocalVariables { get { return m_vertexLocalVariables; } } + //public string VertexLocalVariablesFromList + //{ + // get + // { + // string result = string.Empty; + // int count = m_vertexLocalVariablesList.Count; + // for( int i = 0; i < count; i++ ) + // { + // result += m_vertexLocalVariablesList[ i ].PropertyName + "\n"; + // } + // return result; + // } + //} + public string VertexData { get { return m_vertexData; } } + public string CustomOutput { get { return m_customOutput; } } + public string Functions { get { return m_functions; } } + public string GrabPass { get { return m_grabPass; } } + public bool DirtyAppData { get { return m_dirtyAppData; } } + public bool DirtyInstructions { get { return m_dirtyInstructions; } } + public bool DirtyUniforms { get { return m_dirtyUniforms; } } + public bool DirtyProperties { get { return m_dirtyProperties; } } + public bool DirtyInstancedProperties { get { return m_dirtyInstancedProperties; } } + public bool DirtyInputs { get { return m_dirtyInputs; } } + public bool DirtyCustomInput { get { return m_dirtyCustomInputs; } } + public bool DirtyIncludes { get { return m_dirtyIncludes; } } + public bool DirtyPragmas { get { return m_dirtyPragmas; } } + public bool DirtyDefines { get { return m_dirtyDefines; } } + public bool DirtyAdditionalDirectives { get { return m_dirtyAdditionalDirectives; } } + public bool DirtyLocalVariables { get { return m_dirtyLocalVariables; } } + public bool DirtyVertexVariables { get { return m_dirtyVertexLocalVariables; } } + public bool DirtySpecialLocalVariables { get { return m_dirtySpecialLocalVariables; } } + public bool DirtyPerVertexData { get { return m_dirtyPerVertexData; } } + public bool DirtyFunctions { get { return m_dirtyFunctions; } } + public bool DirtyGrabPass { get { return m_grabPassIsDirty; } } + public int LocalVariablesAmount { get { return m_localVariablesDict.Count; } } + public int SpecialLocalVariablesAmount { get { return m_specialLocalVariablesDict.Count; } } + public int VertexLocalVariablesAmount { get { return m_vertexLocalVariablesDict.Count; } } + public bool TesselationActive { set { m_tesselationActive = value; } get { return m_tesselationActive; } } + + + public int AvailableVertexTempId { get { return m_availableVertexTempId++; } } + public int AvailableFragTempId { get { return m_availableFragTempId++; } } + + /// + /// Returns true if Normal output is being written by something else + /// + public bool DirtyNormal + { + get { return m_dirtyNormal; } + set { m_dirtyNormal = value; } + } + + public bool IsFragmentCategory + { + get { return m_portCategory == MasterNodePortCategory.Fragment || m_portCategory == MasterNodePortCategory.Debug; } + } + + public MasterNodePortCategory PortCategory + { + get { return m_portCategory; } + set { m_portCategory = value; } + } + + public PortGenType GenType + { + get { return m_genType; } + set { m_genType = value; } + } + + public bool IsTemplate { get { return m_masterNodeCategory == AvailableShaderTypes.Template; } } + + public bool IsSRP { get { return ( TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.Lightweight || TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.HD ); } } + + public AvailableShaderTypes MasterNodeCategory + { + get { return m_masterNodeCategory; } + set { m_masterNodeCategory = value; } + } + + /// + /// Forces write to Normal output when the output is not connected + /// + public bool ForceNormal + { + get { return m_forceNormal; } + set + { + if( value ) + { + if( !m_forceNormalIsDirty ) + { + m_forceNormal = value; + m_forceNormalIsDirty = value; + } + } + else + { + m_forceNormal = value; + } + } + } + + public bool UsingVertexColor + { + get { return m_usingVertexColor; } + set { m_usingVertexColor = value; } + } + + public bool UsingInternalData + { + get { return m_usingInternalData; } + set { m_usingInternalData = value; } + } + + public bool UsingScreenPos + { + get { return m_usingScreenPos; } + set { m_usingScreenPos = value; } + } + + public bool UsingCustomScreenPos + { + get { return m_usingCustomScreenPos; } + set { m_usingCustomScreenPos = value; } + } + + public bool UsingWorldNormal + { + get { return m_usingWorldNormal; } + set { m_usingWorldNormal = value; } + } + + public bool UsingWorldReflection + { + get { return m_usingWorldReflection; } + set { m_usingWorldReflection = value; } + } + + public bool UsingWorldPosition + { + get { return m_usingWorldPosition; } + set { m_usingWorldPosition = value; } + } + + public bool UsingViewDirection + { + get { return m_usingViewDirection; } + set { m_usingViewDirection = value; } + } + + public bool IsOutlineDataCollector + { + get { return m_isOutlineDataCollector; } + set { m_isOutlineDataCollector = value; } + } + + public bool UsingCustomOutlineColor + { + get { return m_usingCustomOutlineColor; } + set { m_usingCustomOutlineColor = value; } + } + + public bool UsingCustomOutlineWidth + { + get { return m_usingCustomOutlineWidth; } + set { m_usingCustomOutlineWidth = value; } + } + + public bool UsingCustomOutlineAlpha + { + get { return m_usingCustomOutlineAlpha; } + set { m_usingCustomOutlineAlpha = value; } + } + + public int CustomOutlineSelectedAlpha + { + get { return m_customOutlineSelectedAlpha; } + set { m_customOutlineSelectedAlpha = value; } + } + + public bool UsingCustomOutput + { + get { return m_usingCustomOutput; } + set { m_usingCustomOutput = value; } + } + + public bool UsingHigherSizeTexcoords + { + get { return m_usingHigherSizeTexcoords; } + set { m_usingHigherSizeTexcoords = value; } + } + + public bool UsingLightAttenuation + { + get { return m_usingLightAttenuation; } + set { m_usingLightAttenuation = value; } + } + + public bool UsingTextureArrays + { + get { return m_usingTextureArrays; } + set { m_usingTextureArrays = value; } + } + + public bool UsingExtraStandardMacros + { + get { return m_usingExtraStandardMacros; } + set { m_usingExtraStandardMacros = value; } + } + + public MacrosMask Using2DMacrosMask + { + get { return m_using2DMacrosMask; } + set { m_using2DMacrosMask = value; } + } + + public MacrosMask Using3DMacrosMask + { + get { return m_using3DMacrosMask; } + set { m_using3DMacrosMask = value; } + } + + public MacrosMask UsingCUBEMacrosMask + { + get { return m_usingCUBEMacrosMask; } + set { m_usingCUBEMacrosMask = value; } + } + + public MacrosMask Using2DArrayMacrosMask + { + get { return m_using2DArrayMacrosMask; } + set { m_using2DArrayMacrosMask = value; } + } + + public bool UsingExtra3DSRPMacros + { + get { return m_usingExtra3DSRPMacros; } + set { m_usingExtra3DSRPMacros = value; } + } + + public bool UsingArrayDerivatives + { + get { return m_usingArrayDerivatives; } + set { m_usingArrayDerivatives = value; } + } + + public bool SafeNormalizeLightDir + { + get { return m_safeNormalizeLightDir; } + set { m_safeNormalizeLightDir = value; } + } + + public bool SafeNormalizeViewDir + { + get { return m_safeNormalizeViewDir; } + set { m_safeNormalizeViewDir = value; } + } + + public string StandardAdditionalDirectives + { + get + { + string body = string.Empty; + int count = m_additionalDirectivesList.Count; + for( int i = 0; i < count; i++ ) + { + body += "\t\t" + m_additionalDirectivesList[ i ].PropertyName + "\n"; + } + return body; + } + } + + public List InputList { get { return m_inputList; } } + public List CustomInputList { get { return m_customInputList; } } + public List PropertiesList { get { return m_propertiesList; } } + public List InstancedPropertiesList { get { return m_instancedPropertiesList; } } + public List DotsPropertiesList { get { return m_dotsPropertiesList; } } + public List DotsDefinesList { get { return m_dotsDefinesList; } } + public List UniformsList { get { return m_uniformsList; } } + public List MiscList { get { return m_additionalDirectivesList; } } + public List BeforeNativeDirectivesList { get { return m_additionalDirectivesList.FindAll( obj => obj.OrderIndex < 0 ); } } + public List AfterNativeDirectivesList { get { return m_additionalDirectivesList.FindAll( obj => obj.OrderIndex > 0 ); } } + public List IncludesList { get { return m_includesList; } } + //public List TagsList { get { return m_tagsList; } } + public List PragmasList { get { return m_pragmasList; } } + public List DefinesList { get { return m_definesList; } } + public List InstructionsList { get { return m_instructionsList; } } + public List LocalVariablesList { get { return m_localVariablesList; } } + public List VertexLocalVariablesList { get { return m_vertexLocalVariablesList; } } + public List SpecialLocalVariablesList { get { return m_specialLocalVariablesList; } } + public List VertexDataList { get { return m_vertexDataList; } } + public List CustomOutputList { get { return m_customOutputList; } } + public List FunctionsList { get { return m_functionsList; } } + public List GrabPassList { get { return m_grabPassList; } } + public Dictionary GrabPassDict { get { return m_grabPassDict; } } + public List AboveUsePassesList { get { return m_aboveUsePassesList; } } + public List BelowUsePassesList { get { return m_belowUsePassesList; } } + public Dictionary AboveUsePassesDict { get { return m_usePassesDict; } } + public List CustomShadowCoordsList { get { return m_customShadowCoordsList; } } + public List PackSlotsList { get { return m_packSlotsList; } } + public Dictionary LocalFunctions { get { return m_localFunctions; } } + //Templates + public List VertexInputList { get { return m_vertexInputList; } } + public List InterpolatorList { get { return m_interpolatorsList; } } + public List VertexInterpDeclList { get { return m_vertexInterpDeclList; } } + public TemplateDataCollector TemplateDataCollectorInstance { get { return m_templateDataCollector; } } + public RenderPath CurrentRenderPath + { + get { return m_renderPath; } + set { m_renderPath = value; } + } + + public NodeAvailability CurrentCanvasMode { get { return m_currentCanvasMode; } set { m_currentCanvasMode = value; } } + public TemplateSRPType CurrentSRPType + { + get + { + if( IsTemplate ) + return m_templateDataCollector.CurrentSRPType; + + return TemplateSRPType.BuiltIn; + } + } + + public Dictionary PropertiesDict { get { return m_propertiesDict; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/MasterNodeDataCollector.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/MasterNodeDataCollector.cs.meta new file mode 100644 index 0000000..2b16420 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/MasterNodeDataCollector.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d026d775ff431f34789437db3fb4abbb +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/OutlineOpHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/OutlineOpHelper.cs new file mode 100644 index 0000000..8a29ef8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/OutlineOpHelper.cs @@ -0,0 +1,633 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +using UnityEngine; +using UnityEditor; +using System; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + public enum OutlineMode + { + VertexOffset, + VertexScale + } + + [Serializable] + public sealed class OutlineOpHelper + { + + private string[] ModeTags = + { + "Tags{ }", + "Tags{ \"RenderType\" = \"TransparentCutout\" \"Queue\" = \"AlphaTest+0\"}", + "Tags{ \"RenderType\" = \"Transparent\" \"Queue\" = \"Transparent+0\"}", + "Tags{ \"RenderType\" = \"Transparent\" \"Queue\" = \"Transparent+0\" }" + }; + + private string[] ModePragma = + { + string.Empty, + string.Empty, + "alpha:fade ", + "alpha:premul " + }; + + + private readonly string OutlineSurfaceConfig = "#pragma surface outlineSurf Outline {0} keepalpha noshadow noambient novertexlights nolightmap nodynlightmap nodirlightmap nometa noforwardadd vertex:outlineVertexDataFunc "; + + private readonly string OutlineBodyStructBegin = "struct Input {"; + private readonly string OutlineBodyStructDefault = "\thalf filler;"; + private readonly string OutlineBodyStructEnd = "};"; + + private readonly string OutlineDefaultUniformColor = "half4 _ASEOutlineColor;"; + private readonly string OutlineDefaultUniformWidth = "half _ASEOutlineWidth;"; + private readonly string OutlineDefaultUniformColorInstanced = "UNITY_DEFINE_INSTANCED_PROP( half4, _ASEOutlineColor )"; + private readonly string OutlineDefaultUniformWidthInstanced = "UNITY_DEFINE_INSTANCED_PROP( half, _ASEOutlineWidth )"; + + private readonly string OutlineDefaultVertexHeader = "void outlineVertexDataFunc( inout appdata_full v, out Input o )\n\t\t{"; + private readonly string OutlineTessVertexHeader = "void outlineVertexDataFunc( inout appdata_full v )\n\t\t{"; + + private readonly string OutlineDefaultVertexOutputDeclaration = "\tUNITY_INITIALIZE_OUTPUT( Input, o );"; + + private readonly string[] OutlineSurfBody = { + "\to.Emission = _ASEOutlineColor.rgb;", + "\to.Alpha = 1;" + }; + + private readonly string[] OutlineSurfBodyInstanced = { + "\to.Emission = UNITY_ACCESS_INSTANCED_PROP(_ASEOutlineColor).rgb;", + "\to.Alpha = 1;" + }; + + private readonly string[] OutlineBodyDefaultSurfBegin = { + "}", + "inline half4 LightingOutline( SurfaceOutput s, half3 lightDir, half atten ) { return half4 ( 0,0,0, s.Alpha); }", + "void outlineSurf( Input i, inout SurfaceOutput o )", + "{"}; + + private readonly string[] OutlineBodyDefaultSurfEnd = { + "}", + "ENDCG", + "\n"}; + + //private const string OutlineInstancedHeader = "#pragma multi_compile_instancing"; + + //private readonly string[] OutlineBodyInstancedBegin = { + // "UNITY_INSTANCING_CBUFFER_START({0})", + // "\tUNITY_DEFINE_INSTANCED_PROP( half4, _ASEOutlineColor )", + // "\tUNITY_DEFINE_INSTANCED_PROP(half, _ASEOutlineWidth)", + // "UNITY_INSTANCING_CBUFFER_END", + // "void outlineVertexDataFunc( inout appdata_full v, out Input o )", + // "{", + // "\tUNITY_INITIALIZE_OUTPUT( Input, o );"}; + + //private readonly string[] OutlineBodyInstancedEnd = { + // "}", + // "inline half4 LightingOutline( SurfaceOutput s, half3 lightDir, half atten ) { return half4 ( 0,0,0, s.Alpha); }", + // "void outlineSurf( Input i, inout SurfaceOutput o ) { o.Emission = UNITY_ACCESS_INSTANCED_PROP( _ASEOutlineColor ).rgb; o.Alpha = 1; }", + // "ENDCG", + // "\n"}; + + private const string WidthVariableAccessInstanced = "UNITY_ACCESS_INSTANCED_PROP( _ASEOutlineWidth )"; + + private const string OutlineVertexOffsetMode = "\tv.vertex.xyz += ( v.normal * {0} );"; + private const string OutlineVertexScaleMode = "\tv.vertex.xyz *= ( 1 + {0});"; + private const string OutlineVertexCustomMode = "\tv.vertex.xyz += {0};"; + + private const string OutlineColorLabel = "Color"; + private const string OutlineWidthLabel = "Width"; + + private const string ColorPropertyName = "_ASEOutlineColor"; + private const string WidthPropertyName = "_ASEOutlineWidth"; + + + private const string WidthPropertyNameInstanced = "UNITY_ACCESS_INSTANCED_PROP(_ASEOutlineWidth)"; + + + + private const string ColorPropertyDec = "_ASEOutlineColor( \"Outline Color\", Color ) = ({0})"; + private const string OutlinePropertyDec = "_ASEOutlineWidth( \"Outline Width\", Float ) = {0}"; + + private const string ModePropertyStr = "Mode"; + + private const string NoFogStr = "No Fog"; + + private const string BillboardInstructionFormat = "\t{0};"; + + [SerializeField] + private Color m_outlineColor; + + [SerializeField] + private float m_outlineWidth; + + [SerializeField] + private bool m_enabled; + + [SerializeField] + private OutlineMode m_mode = OutlineMode.VertexOffset; + + [SerializeField] + private bool m_noFog = true; + + private CullMode m_cullMode = CullMode.Front; + private int m_zTestMode = 0; + private int m_zWriteMode = 0; + private bool m_dirtyInput = false; + private string m_inputs = string.Empty; + private List m_inputList = new List(); + private string m_uniforms = string.Empty; + private List m_uniformList = new List(); + private List m_instancedPropertiesList = new List(); + private string m_instancedProperties = string.Empty; + private string m_instructions = string.Empty; + private string m_functions = string.Empty; + private string m_includes = string.Empty; + private string m_pragmas = string.Empty; + private string m_defines = string.Empty; + private string m_standardAdditionalDirectives = string.Empty; + private string m_vertexData = string.Empty; + private string m_grabPasses = string.Empty; + private Dictionary m_localFunctions; + + //private OutlineMode m_customMode = OutlineMode.VertexOffset; + private int m_offsetMode = 0; + private bool m_customNoFog = true; + + public void Draw( ParentNode owner, GUIStyle toolbarstyle, Material mat ) + { + Color cachedColor = GUI.color; + GUI.color = new Color( cachedColor.r, cachedColor.g, cachedColor.b, 0.5f ); + EditorGUILayout.BeginHorizontal( toolbarstyle ); + GUI.color = cachedColor; + owner.ContainerGraph.ParentWindow.InnerWindowVariables.OutlineActiveMode = owner.GUILayoutToggle( owner.ContainerGraph.ParentWindow.InnerWindowVariables.OutlineActiveMode , EditorVariablesManager.OutlineActiveMode.LabelName, UIUtils.MenuItemToggleStyle, GUILayout.ExpandWidth( true ) ); + EditorGUI.BeginChangeCheck(); + m_enabled = owner.EditorGUILayoutToggle( string.Empty, m_enabled, UIUtils.MenuItemEnableStyle, GUILayout.Width( 16 ) ); + if( EditorGUI.EndChangeCheck() ) + { + if( m_enabled ) + UpdateToMaterial( mat ); + + UIUtils.RequestSave(); + } + EditorGUILayout.EndHorizontal(); + + if( owner.ContainerGraph.ParentWindow.InnerWindowVariables.OutlineActiveMode ) + { + cachedColor = GUI.color; + GUI.color = new Color( cachedColor.r, cachedColor.g, cachedColor.b, ( EditorGUIUtility.isProSkin ? 0.5f : 0.25f ) ); + EditorGUILayout.BeginVertical( UIUtils.MenuItemBackgroundStyle ); + GUI.color = cachedColor; + + EditorGUILayout.Separator(); + EditorGUI.BeginDisabledGroup( !m_enabled ); + + EditorGUI.indentLevel += 1; + { + m_mode = (OutlineMode)owner.EditorGUILayoutEnumPopup( ModePropertyStr, m_mode ); + + EditorGUI.BeginChangeCheck(); + m_outlineColor = owner.EditorGUILayoutColorField( OutlineColorLabel, m_outlineColor ); + if( EditorGUI.EndChangeCheck() && mat != null ) + { + if( mat.HasProperty( ColorPropertyName ) ) + { + mat.SetColor( ColorPropertyName, m_outlineColor ); + } + } + + EditorGUI.BeginChangeCheck(); + m_outlineWidth = owner.EditorGUILayoutFloatField( OutlineWidthLabel, m_outlineWidth ); + if( EditorGUI.EndChangeCheck() && mat != null ) + { + if( mat.HasProperty( WidthPropertyName ) ) + { + mat.SetFloat( WidthPropertyName, m_outlineWidth ); + } + } + + m_noFog = owner.EditorGUILayoutToggle( NoFogStr, m_noFog ); + } + + EditorGUI.indentLevel -= 1; + EditorGUI.EndDisabledGroup(); + EditorGUILayout.Separator(); + EditorGUILayout.EndVertical(); + } + } + + public void UpdateToMaterial( Material mat ) + { + if( mat == null ) + return; + + if( mat.HasProperty( ColorPropertyName ) ) + { + mat.SetColor( ColorPropertyName, m_outlineColor ); + } + + if( mat.HasProperty( WidthPropertyName ) ) + { + mat.SetFloat( WidthPropertyName, m_outlineWidth ); + } + } + + public void ReadFromString( ref uint index, ref string[] nodeParams ) + { + m_enabled = Convert.ToBoolean( nodeParams[ index++ ] ); + m_outlineWidth = Convert.ToSingle( nodeParams[ index++ ] ); + m_outlineColor = IOUtils.StringToColor( nodeParams[ index++ ] ); + if( UIUtils.CurrentShaderVersion() > 5004 ) + { + m_mode = (OutlineMode)Enum.Parse( typeof( OutlineMode ), nodeParams[ index++ ] ); + } + + if( UIUtils.CurrentShaderVersion() > 13902 ) + { + m_noFog = Convert.ToBoolean( nodeParams[ index++ ] ); + } + } + + public void WriteToString( ref string nodeInfo ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_enabled ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_outlineWidth ); + IOUtils.AddFieldValueToString( ref nodeInfo, IOUtils.ColorToString( m_outlineColor ) ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_mode ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_noFog ); + } + + public void AddToDataCollector( ref MasterNodeDataCollector dataCollector ) + { + if( !dataCollector.UsingCustomOutlineColor ) + dataCollector.AddToProperties( -1, string.Format( ColorPropertyDec, IOUtils.ColorToString( m_outlineColor ) ), -1 ); + if( !dataCollector.UsingCustomOutlineWidth ) + dataCollector.AddToProperties( -1, string.Format( OutlinePropertyDec, m_outlineWidth ), -1 ); + } + + public void UpdateFromMaterial( Material mat ) + { + if( mat.HasProperty( ColorPropertyName ) ) + { + m_outlineColor = mat.GetColor( ColorPropertyName ); + } + + if( mat.HasProperty( WidthPropertyName ) ) + { + m_outlineWidth = mat.GetFloat( WidthPropertyName ); + } + } + + void AddMultibodyString( string body , List list ) + { + body = body.Replace( "\t\t", string.Empty ); + string[] strArr = body.Split( '\n' ); + for( int i = 0; i < strArr.Length; i++ ) + { + list.Add( strArr[ i ] ); + } + + } + public string[] OutlineFunctionBody( ref MasterNodeDataCollector dataCollector, bool instanced, bool isShadowCaster, string shaderName, string[] billboardInfo, ref TessellationOpHelper tessOpHelper, string target, PrecisionType precision ) + { + List body = new List(); + body.Add( ModeTags[ dataCollector.CustomOutlineSelectedAlpha ] ); + if( !string.IsNullOrEmpty( m_grabPasses )) + body.Add( m_grabPasses.Replace( "\t\t",string.Empty )); + + if( m_zWriteMode != 0 ) + body.Add( "ZWrite " + ZBufferOpHelper.ZWriteModeValues[ m_zWriteMode ] ); + if( m_zTestMode != 0 ) + body.Add( "ZTest " + ZBufferOpHelper.ZTestModeValues[ m_zTestMode ] ); + + body.Add( "Cull " + m_cullMode ); + body.Add( "CGPROGRAM" ); + if( tessOpHelper.EnableTesselation ) + { + body.Add( "#include \"" + TessellationOpHelper.TessInclude + "\"" ); + body.Add( "#pragma target " + target ); + } + else + { + body.Add( "#pragma target 3.0" ); + } + bool customOutline = dataCollector.UsingCustomOutlineColor || dataCollector.UsingCustomOutlineWidth || dataCollector.UsingCustomOutlineAlpha; + int outlineMode = customOutline ? m_offsetMode : ( m_mode == OutlineMode.VertexOffset ? 0 : 1 ); + string extraOptions = ( customOutline ? m_customNoFog : m_noFog ) ? "nofog " : string.Empty; + if( dataCollector.CustomOutlineSelectedAlpha > 0 ) + { + extraOptions += ModePragma[ dataCollector.CustomOutlineSelectedAlpha ]; + } + + string surfConfig = string.Format( OutlineSurfaceConfig, extraOptions ); + + if( tessOpHelper.EnableTesselation ) + tessOpHelper.WriteToOptionalParams( ref surfConfig ); + + body.Add( surfConfig ); + if( !isShadowCaster ) + { + AddMultibodyString( m_defines, body ); + AddMultibodyString( m_includes, body ); + AddMultibodyString( m_pragmas, body ); + } + AddMultibodyString( m_standardAdditionalDirectives, body ); + //if( instanced ) + //{ + // body.Add( OutlineInstancedHeader ); + //} + + if( customOutline ) + { + if( isShadowCaster ) + { + + for( int i = 0; i < InputList.Count; i++ ) + { + dataCollector.AddToInput( InputList[ i ].NodeId, InputList[ i ].PropertyName, !InputList[ i ].IsDirective ); + } + } + else + { + if( !string.IsNullOrEmpty( m_inputs ) ) + body.Add( m_inputs.Trim( '\t', '\n' ) ); + } + + if( !DirtyInput && !isShadowCaster ) + body.Add( OutlineBodyStructDefault ); + + if( !isShadowCaster ) + body.Add( OutlineBodyStructEnd ); + } + else if( !isShadowCaster ) + { + body.Add( OutlineBodyStructBegin ); + body.Add( OutlineBodyStructDefault ); + body.Add( OutlineBodyStructEnd ); + } + + if( instanced ) + { + //for( int i = 0; i < OutlineBodyInstancedBegin.Length; i++ ) + //{ + // body.Add( ( i == 0 ) ? string.Format( OutlineBodyInstancedBegin[ i ], shaderName ) : OutlineBodyInstancedBegin[ i ] ); + //} + + //if( (object)billboardInfo != null ) + //{ + // for( int j = 0; j < billboardInfo.Length; j++ ) + // { + // body.Add( string.Format( BillboardInstructionFormat, billboardInfo[ j ] ) ); + // } + //} + + //switch( outlineMode ) + //{ + // case 0: body.Add( string.Format( OutlineVertexOffsetMode, WidthVariableAccessInstanced ) ); break; + // case 1: body.Add( string.Format( OutlineVertexScaleMode, WidthVariableAccessInstanced ) ); break; + // case 2: body.Add( string.Format( OutlineVertexCustomMode, WidthVariableAccessInstanced ) ); break; + //} + //for( int i = 0; i < OutlineBodyInstancedEnd.Length; i++ ) + //{ + // body.Add( OutlineBodyInstancedEnd[ i ] ); + //} + + //Instanced block name must differ from used on main shader so it won't throw a duplicate name error + shaderName = shaderName+ "Outline"; + bool openCBuffer = true; + if( customOutline ) + { + if( isShadowCaster ) + { + for( int i = 0; i < UniformList.Count; i++ ) + { + dataCollector.AddToUniforms( UniformList[ i ].NodeId, UniformList[ i ].PropertyName ); + } + + foreach( KeyValuePair kvp in m_localFunctions ) + { + dataCollector.AddFunction( kvp.Key, kvp.Value ); + } + } + else + { + if( !string.IsNullOrEmpty( Uniforms ) ) + body.Add( Uniforms.Trim( '\t', '\n' ) ); + + openCBuffer = false; + body.Add( string.Format( IOUtils.InstancedPropertiesBegin, shaderName )); + if( !string.IsNullOrEmpty( InstancedProperties ) ) + body.Add( InstancedProperties.Trim( '\t', '\n' ) ); + } + } + + if( openCBuffer) + body.Add( string.Format( IOUtils.InstancedPropertiesBegin, shaderName ) ); + + if( !dataCollector.UsingCustomOutlineColor ) + body.Add( precision == PrecisionType.Float ? OutlineDefaultUniformColorInstanced.Replace( "half", "float" ) : OutlineDefaultUniformColorInstanced ); + + if( !dataCollector.UsingCustomOutlineWidth ) + body.Add( precision == PrecisionType.Float ? OutlineDefaultUniformWidthInstanced.Replace( "half", "float" ) : OutlineDefaultUniformWidthInstanced ); + + body.Add( IOUtils.InstancedPropertiesEnd ); + + //Functions + if( customOutline && !isShadowCaster ) + body.Add( Functions ); + + if( tessOpHelper.EnableTesselation && !isShadowCaster ) + { + body.Add( tessOpHelper.Uniforms().TrimStart( '\t' ) ); + body.Add( tessOpHelper.GetCurrentTessellationFunction.Trim( '\t', '\n' ) + "\n" ); + } + + if( tessOpHelper.EnableTesselation ) + { + body.Add( OutlineTessVertexHeader ); + } + else + { + body.Add( OutlineDefaultVertexHeader ); + body.Add( OutlineDefaultVertexOutputDeclaration ); + } + + if( customOutline ) + { + if( !string.IsNullOrEmpty( VertexData ) ) + body.Add( "\t" + VertexData.Trim( '\t', '\n' ) ); + } + + if( (object)billboardInfo != null ) + { + for( int j = 0; j < billboardInfo.Length; j++ ) + { + body.Add( string.Format( BillboardInstructionFormat, billboardInfo[ j ] ) ); + } + } + + switch( outlineMode ) + { + case 0: body.Add( string.Format( OutlineVertexOffsetMode, dataCollector.UsingCustomOutlineWidth ? "outlineVar" : WidthPropertyNameInstanced ) ); break; + case 1: body.Add( string.Format( OutlineVertexScaleMode, dataCollector.UsingCustomOutlineWidth ? "outlineVar" : WidthPropertyNameInstanced ) ); break; + case 2: body.Add( string.Format( OutlineVertexCustomMode, dataCollector.UsingCustomOutlineWidth ? "outlineVar" : WidthPropertyNameInstanced ) ); break; + } + + for( int i = 0; i < OutlineBodyDefaultSurfBegin.Length; i++ ) + { + body.Add( OutlineBodyDefaultSurfBegin[ i ] ); + } + if( dataCollector.UsingCustomOutlineColor || dataCollector.CustomOutlineSelectedAlpha > 0 ) + { + body.Add( "\t" + Instructions.Trim( '\t', '\n' ) ); + } + else + { + for( int i = 0; i < OutlineSurfBodyInstanced.Length; i++ ) + { + body.Add( OutlineSurfBodyInstanced[ i ] ); + } + } + + for( int i = 0; i < OutlineBodyDefaultSurfEnd.Length; i++ ) + { + body.Add( OutlineBodyDefaultSurfEnd[ i ] ); + } + } + else + { + if( customOutline ) + { + if( isShadowCaster ) + { + for( int i = 0; i < UniformList.Count; i++ ) + { + dataCollector.AddToUniforms( UniformList[ i ].NodeId, UniformList[ i ].PropertyName ); + } + + foreach( KeyValuePair kvp in m_localFunctions ) + { + dataCollector.AddFunction( kvp.Key, kvp.Value ); + } + } + else + { + if( !string.IsNullOrEmpty( Uniforms ) ) + body.Add( Uniforms.Trim( '\t', '\n' ) ); + } + } + + if( !dataCollector.UsingCustomOutlineColor ) + body.Add( precision == PrecisionType.Float ? OutlineDefaultUniformColor.Replace( "half", "float" ) : OutlineDefaultUniformColor ); + + if( !dataCollector.UsingCustomOutlineWidth ) + body.Add( precision == PrecisionType.Float ? OutlineDefaultUniformWidth.Replace( "half", "float" ) : OutlineDefaultUniformWidth ); + + //Functions + if( customOutline && !isShadowCaster ) + body.Add( Functions ); + + if( tessOpHelper.EnableTesselation && !isShadowCaster ) + { + body.Add( tessOpHelper.Uniforms().TrimStart( '\t' ) ); + body.Add( tessOpHelper.GetCurrentTessellationFunction.Trim( '\t', '\n' ) + "\n" ); + } + + if( tessOpHelper.EnableTesselation ) + { + body.Add( OutlineTessVertexHeader ); + } + else + { + body.Add( OutlineDefaultVertexHeader ); + body.Add( OutlineDefaultVertexOutputDeclaration ); + } + + if( customOutline ) + { + if( !string.IsNullOrEmpty( VertexData ) ) + body.Add( "\t" + VertexData.Trim( '\t', '\n' ) ); + } + + if( (object)billboardInfo != null ) + { + for( int j = 0; j < billboardInfo.Length; j++ ) + { + body.Add( string.Format( BillboardInstructionFormat, billboardInfo[ j ] ) ); + } + } + + switch( outlineMode ) + { + case 0: body.Add( string.Format( OutlineVertexOffsetMode, dataCollector.UsingCustomOutlineWidth ? "outlineVar" : WidthPropertyName ) ); break; + case 1: body.Add( string.Format( OutlineVertexScaleMode, dataCollector.UsingCustomOutlineWidth ? "outlineVar" : WidthPropertyName ) ); break; + case 2: body.Add( string.Format( OutlineVertexCustomMode, dataCollector.UsingCustomOutlineWidth ? "outlineVar" : WidthPropertyName ) ); break; + } + for( int i = 0; i < OutlineBodyDefaultSurfBegin.Length; i++ ) + { + body.Add( OutlineBodyDefaultSurfBegin[ i ] ); + } + if( dataCollector.UsingCustomOutlineColor || dataCollector.CustomOutlineSelectedAlpha > 0 ) + { + body.Add( "\t" + Instructions.Trim( '\t', '\n' ) ); + } + else + { + for( int i = 0; i < OutlineSurfBody.Length; i++ ) + { + body.Add( OutlineSurfBody[ i ] ); + } + } + + for( int i = 0; i < OutlineBodyDefaultSurfEnd.Length; i++ ) + { + body.Add( OutlineBodyDefaultSurfEnd[ i ] ); + } + } + + string[] bodyArr = body.ToArray(); + body.Clear(); + body = null; + return bodyArr; + } + + + public void Destroy() + { + m_inputList = null; + m_uniformList = null; + m_instancedPropertiesList = null; + m_localFunctions = null; + } + + public bool EnableOutline { get { return m_enabled; } } + + public bool UsingCullMode { get { return m_cullMode != CullMode.Front; } } + public bool UsingZWrite { get { return m_zWriteMode != 0; } } + public bool UsingZTest { get { return m_zTestMode != 0; } } + public int ZWriteMode { get { return m_zWriteMode; } set { m_zWriteMode = value; } } + public int ZTestMode { get { return m_zTestMode; } set { m_zTestMode = value; } } + public CullMode OutlineCullMode { get { return m_cullMode; } set { m_cullMode = value; } } + public string Inputs { get { return m_inputs; } set { m_inputs = value; } } + public string Uniforms { get { return m_uniforms; } set { m_uniforms = value; } } + public string InstancedProperties { get { return m_instancedProperties; } set { m_instancedProperties = value; } } + public string Instructions { get { return m_instructions; } set { m_instructions = value; } } + public string Functions { get { return m_functions; } set { m_functions = value; } } + public string Includes { get { return m_includes; } set { m_includes = value; } } + public string Pragmas { get { return m_pragmas; } set { m_pragmas = value; } } + public string Defines { get { return m_defines; } set { m_defines = value; } } + public string StandardAdditionalDirectives { get { return m_standardAdditionalDirectives; } set { m_standardAdditionalDirectives = value; } } + public string VertexData { get { return m_vertexData; } set { m_vertexData = value; } } + public string GrabPasses { get { return m_grabPasses; } set { m_grabPasses = value; } } + public List InputList { get { return m_inputList; } set { m_inputList = value; } } + public List UniformList { get { return m_uniformList; } set { m_uniformList = value; } } + public List InstancedPropertiesList { get { return m_instancedPropertiesList; } set { m_instancedPropertiesList = value; } } + + public Dictionary LocalFunctions { get { return m_localFunctions; } set { m_localFunctions = value; } } + public bool DirtyInput { get { return m_dirtyInput; } set { m_dirtyInput = value; } } + + //public OutlineMode CustomMode { get { return m_customMode; } set { m_customMode = value; } } + public int OffsetMode { get { return m_offsetMode; } set { m_offsetMode = value; } } + public bool CustomNoFog { get { return m_customNoFog; } set { m_customNoFog = value; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/OutlineOpHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/OutlineOpHelper.cs.meta new file mode 100644 index 0000000..bb79b68 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/OutlineOpHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d0900a4b7d1563e49b6184d7579dcbec +timeCreated: 1487331466 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/OutputNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/OutputNode.cs new file mode 100644 index 0000000..1fffc29 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/OutputNode.cs @@ -0,0 +1,90 @@ +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + public class OutputNode : SignalGeneratorNode + { + public static int LOD_SUBSHADER_VERSION = 17200; + [SerializeField] + protected bool m_isMainOutputNode = false; + + [SerializeField] + protected int m_lodIndex = -1; + + public OutputNode() : base() { } + public OutputNode( int uniqueId, float x, float y, float width, float height ) : base( uniqueId, x, y, width, height ) { } + + public override void ResetNodeData() + { + base.ResetNodeData(); + m_graphDepth = -1; + } + + public virtual void SetupNodeCategories() + { + ContainerGraph.ResetNodesData(); + //int count = m_inputPorts.Count; + //for( int i = 0; i < count; i++ ) + //{ + // if( m_inputPorts[ i ].IsConnected ) + // { + // NodeData nodeData = new NodeData( m_inputPorts[ i ].Category ); + // ParentNode node = m_inputPorts[ i ].GetOutputNode(); + // node.PropagateNodeData( nodeData, ref collector ); + // } + //} + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_isMainOutputNode ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_lodIndex ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_isMainOutputNode = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > LOD_SUBSHADER_VERSION ) + { + m_lodIndex = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + + if( IsLODMainMasterNode && !ContainerGraph.IsDuplicating ) + { + ContainerGraph.AssignMasterNode( this, true ); + } + } + + public override void AfterDuplication() + { + base.AfterDuplication(); + m_isMainOutputNode = false; + } + + public bool IsMainOutputNode + { + get { return m_isMainOutputNode; } + set + { + if( value != m_isMainOutputNode ) + { + m_isMainOutputNode = value; + if( m_isMainOutputNode ) + { + GenerateSignalPropagation(); + } + else + { + GenerateSignalInibitor(); + } + } + } + } + + public int LODIndex { get { return m_lodIndex; } set { m_lodIndex = value; } } + public bool IsLODMainMasterNode { get { return m_isMainOutputNode && m_lodIndex == -1; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/OutputNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/OutputNode.cs.meta new file mode 100644 index 0000000..79cae85 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/OutputNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ed0ee3a73f11f344495d16b54bb3af29 +timeCreated: 1491918470 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/RenderingOptionsOpHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/RenderingOptionsOpHelper.cs new file mode 100644 index 0000000..34c8e54 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/RenderingOptionsOpHelper.cs @@ -0,0 +1,227 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + public enum DisableBatchingTagValues + { + True, + False, + LODFading + } + + [Serializable] + public class RenderingOptionsOpHelper + { + private const string RenderingOptionsStr = " Rendering Options"; + private readonly static GUIContent EmissionGIFlags = new GUIContent( "Emission GI Flag", "Modifies Emission GI flags" ); + private readonly static GUIContent LODCrossfadeContent = new GUIContent( " LOD Group Cross Fade", "Applies a dither crossfade to be used with LOD groups for smoother transitions. Uses one interpolator\nDefault: OFF" ); + private readonly static GUIContent DisableBatchingContent = new GUIContent( "Disable Batching", "\nDisables objects to be batched and used with DrawCallBatching Default: False" ); + private readonly static GUIContent IgnoreProjectorContent = new GUIContent( " Ignore Projector", "\nIf True then an object that uses this shader will not be affected by Projectors Default: False" ); + private readonly static GUIContent UseDefaultCasterContent = new GUIContent( " Use Default Shadow Caster", "\nIf True always use surface default shadow caster Default: False" ); + private readonly static GUIContent ForceNoShadowCastingContent = new GUIContent( " Force No Shadow Casting", "\nIf True then an object that is rendered using this subshader will never cast shadows Default: False" ); + private readonly static GUIContent ForceEnableInstancingContent = new GUIContent( " Force Enable Instancing", "\nIf True forces instancing on shader independent of having instanced properties" ); +#if UNITY_5_6_OR_NEWER + private readonly static GUIContent ForceDisableInstancingContent = new GUIContent( " Force Disable Instancing", "\nIf True forces disable instancing on shader independent of having instanced properties" ); +#endif + private readonly static GUIContent SpecularHightlightsContent = new GUIContent( " Fwd Specular Highlights Toggle", "\nIf True creates a material toggle to set Unity's internal specular highlight rendering keyword" ); + private readonly static GUIContent ReflectionsContent = new GUIContent( " Fwd Reflections Toggle", "\nIf True creates a material toggle to set Unity's internal reflections rendering keyword" ); + + [SerializeField] + private bool m_forceEnableInstancing = false; + + [SerializeField] + private bool m_forceDisableInstancing = false; + + [SerializeField] + private bool m_specularHighlightToggle = false; + + [SerializeField] + private bool m_reflectionsToggle = false; + + [SerializeField] + private bool m_lodCrossfade = false; + + [SerializeField] + private DisableBatchingTagValues m_disableBatching = DisableBatchingTagValues.False; + + [SerializeField] + private bool m_ignoreProjector = false; + + [SerializeField] + private bool m_useDefaultShadowCaster = false; + + [SerializeField] + private bool m_forceNoShadowCasting = false; + + [SerializeField] + private List m_codeGenerationDataList; + + public RenderingOptionsOpHelper() + { + m_codeGenerationDataList = new List(); + m_codeGenerationDataList.Add( new CodeGenerationData( " Exclude Deferred", "exclude_path:deferred" ) ); + m_codeGenerationDataList.Add( new CodeGenerationData( " Exclude Forward", "exclude_path:forward" ) ); + m_codeGenerationDataList.Add( new CodeGenerationData( " Exclude Legacy Deferred", "exclude_path:prepass" ) ); + m_codeGenerationDataList.Add( new CodeGenerationData( " Shadows", "noshadow" ) ); + m_codeGenerationDataList.Add( new CodeGenerationData( " Ambient Light", "noambient" ) ); + m_codeGenerationDataList.Add( new CodeGenerationData( " Per Vertex Light", "novertexlights" ) ); + m_codeGenerationDataList.Add( new CodeGenerationData( " Lightmaps", "nolightmap " ) ); + m_codeGenerationDataList.Add( new CodeGenerationData( " Dynamic Global GI", "nodynlightmap" ) ); + m_codeGenerationDataList.Add( new CodeGenerationData( " Directional lightmaps", "nodirlightmap" ) ); + m_codeGenerationDataList.Add( new CodeGenerationData( " Built-in Fog", "nofog" ) ); + m_codeGenerationDataList.Add( new CodeGenerationData( " Meta Pass", "nometa" ) ); + m_codeGenerationDataList.Add( new CodeGenerationData( " Add Pass", "noforwardadd" ) ); + } + + public bool IsOptionActive( string option ) + { + return !m_codeGenerationDataList.Find( x => x.Name.Equals( option ) ).IsActive; + } + + public void Draw( StandardSurfaceOutputNode owner ) + { + bool value = owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedRenderingOptions; + NodeUtils.DrawPropertyGroup( ref value, RenderingOptionsStr, () => + { + int codeGenCount = m_codeGenerationDataList.Count; + // Starting from index 4 because other options are already contemplated with m_renderPath and add/receive shadows + for( int i = 4; i < codeGenCount; i++ ) + { + m_codeGenerationDataList[ i ].IsActive = !owner.EditorGUILayoutToggleLeft( m_codeGenerationDataList[ i ].Name, !m_codeGenerationDataList[ i ].IsActive ); + } + m_lodCrossfade = owner.EditorGUILayoutToggleLeft( LODCrossfadeContent, m_lodCrossfade ); + m_ignoreProjector = owner.EditorGUILayoutToggleLeft( IgnoreProjectorContent, m_ignoreProjector ); + EditorGUI.BeginDisabledGroup( !owner.CastShadows ); + m_useDefaultShadowCaster = owner.EditorGUILayoutToggleLeft( UseDefaultCasterContent, m_useDefaultShadowCaster ); + EditorGUI.EndDisabledGroup(); + m_forceNoShadowCasting = owner.EditorGUILayoutToggleLeft( ForceNoShadowCastingContent, m_forceNoShadowCasting ); + if( owner.ContainerGraph.IsInstancedShader ) + { + GUI.enabled = false; + owner.EditorGUILayoutToggleLeft( ForceEnableInstancingContent, true ); + GUI.enabled = true; + } + else + { + m_forceEnableInstancing = owner.EditorGUILayoutToggleLeft( ForceEnableInstancingContent, m_forceEnableInstancing ); + } + +#if UNITY_5_6_OR_NEWER + m_forceDisableInstancing = owner.EditorGUILayoutToggleLeft( ForceDisableInstancingContent, m_forceDisableInstancing ); +#endif + m_specularHighlightToggle = owner.EditorGUILayoutToggleLeft( SpecularHightlightsContent, m_specularHighlightToggle ); + m_reflectionsToggle = owner.EditorGUILayoutToggleLeft( ReflectionsContent, m_reflectionsToggle ); + m_disableBatching = (DisableBatchingTagValues)owner.EditorGUILayoutEnumPopup( DisableBatchingContent, m_disableBatching ); + Material mat = owner.ContainerGraph.CurrentMaterial; + if( mat != null ) + { + mat.globalIlluminationFlags = (MaterialGlobalIlluminationFlags)owner.EditorGUILayoutEnumPopup( EmissionGIFlags, mat.globalIlluminationFlags ); + } + } ); + owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedRenderingOptions = value; + } + + public void Build( ref string OptionalParameters ) + { + int codeGenCount = m_codeGenerationDataList.Count; + + for( int i = 0; i < codeGenCount; i++ ) + { + if( m_codeGenerationDataList[ i ].IsActive ) + { + OptionalParameters += m_codeGenerationDataList[ i ].Value + Constants.OptionalParametersSep; + } + } + +#if UNITY_2017_1_OR_NEWER + if( m_lodCrossfade ) + { + OptionalParameters += Constants.LodCrossFadeOption2017 + Constants.OptionalParametersSep; + } +#endif + } + + public void ReadFromString( ref uint index, ref string[] nodeParams ) + { + for( int i = 0; i < m_codeGenerationDataList.Count; i++ ) + { + m_codeGenerationDataList[ i ].IsActive = Convert.ToBoolean( nodeParams[ index++ ] ); + } + + if( UIUtils.CurrentShaderVersion() > 10005 ) + { + m_lodCrossfade = Convert.ToBoolean( nodeParams[ index++ ] ); + } + + if( UIUtils.CurrentShaderVersion() > 10007 ) + { + m_disableBatching = (DisableBatchingTagValues)Enum.Parse( typeof( DisableBatchingTagValues ), nodeParams[ index++ ] ); + m_ignoreProjector = Convert.ToBoolean( nodeParams[ index++ ] ); + m_forceNoShadowCasting = Convert.ToBoolean( nodeParams[ index++ ] ); + } + + if( UIUtils.CurrentShaderVersion() > 11002 ) + { + m_forceEnableInstancing = Convert.ToBoolean( nodeParams[ index++ ] ); + } + + if( UIUtils.CurrentShaderVersion() > 15205 ) + { + m_forceDisableInstancing = Convert.ToBoolean( nodeParams[ index++ ] ); + } + + if( UIUtils.CurrentShaderVersion() > 14403 ) + { + m_specularHighlightToggle = Convert.ToBoolean( nodeParams[ index++ ] ); + m_reflectionsToggle = Convert.ToBoolean( nodeParams[ index++ ] ); + } + + if( UIUtils.CurrentShaderVersion() > 16307 ) + { + m_useDefaultShadowCaster = Convert.ToBoolean( nodeParams[ index++ ] ); + } + } + + public void WriteToString( ref string nodeInfo ) + { + for( int i = 0; i < m_codeGenerationDataList.Count; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_codeGenerationDataList[ i ].IsActive ); + } + + IOUtils.AddFieldValueToString( ref nodeInfo, m_lodCrossfade ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_disableBatching ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_ignoreProjector ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_forceNoShadowCasting ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_forceEnableInstancing ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_forceDisableInstancing ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_specularHighlightToggle ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_reflectionsToggle ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_useDefaultShadowCaster ); + } + + public void Destroy() + { + m_codeGenerationDataList.Clear(); + m_codeGenerationDataList = null; + } + public bool UseDefaultShadowCaster { get { return m_useDefaultShadowCaster; } } + public bool ForceEnableInstancing { get { return m_forceEnableInstancing; } } + public bool ForceDisableInstancing { get { return m_forceDisableInstancing; } } + + public bool LodCrossfade { get { return m_lodCrossfade; } } + public bool IgnoreProjectorValue { get { return m_ignoreProjector; } set { m_ignoreProjector = value; } } + public bool SpecularHighlightToggle { get { return m_specularHighlightToggle; } set { m_specularHighlightToggle = value; } } + public bool ReflectionsToggle { get { return m_reflectionsToggle; } set { m_reflectionsToggle = value; } } + + public string DisableBatchingTag { get { return ( m_disableBatching != DisableBatchingTagValues.False ) ? string.Format( Constants.TagFormat, "DisableBatching", m_disableBatching ) : string.Empty; } } + public string IgnoreProjectorTag { get { return ( m_ignoreProjector ) ? string.Format( Constants.TagFormat, "IgnoreProjector", "True" ) : string.Empty; } } + public string ForceNoShadowCastingTag { get { return ( m_forceNoShadowCasting ) ? string.Format( Constants.TagFormat, "ForceNoShadowCasting", "True" ) : string.Empty; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/RenderingOptionsOpHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/RenderingOptionsOpHelper.cs.meta new file mode 100644 index 0000000..e94a152 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/RenderingOptionsOpHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 26d840af03d4f7b418e9c7bece143648 +timeCreated: 1488906067 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/RenderingPlatformsOpHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/RenderingPlatformsOpHelper.cs new file mode 100644 index 0000000..c049d6d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/RenderingPlatformsOpHelper.cs @@ -0,0 +1,238 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEditor; +using UnityEngine; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class RenderPlatformInfo + { + public string Label; + public RenderPlatforms Value; + } + + [Serializable] + public class RenderingPlatformOpHelper + { + private const string RenderingPlatformsStr = " Rendering Platforms"; + private readonly RenderPlatformInfo[] RenderingPlatformsInfo = + { + new RenderPlatformInfo(){Label = " Direct3D 9", Value = RenderPlatforms.d3d9}, + new RenderPlatformInfo(){Label = " Direct3D 11 9.x", Value = RenderPlatforms.d3d11_9x}, + new RenderPlatformInfo(){Label = " Direct3D 11/12", Value = RenderPlatforms.d3d11}, + new RenderPlatformInfo(){Label = " OpenGL 3.x/4.x", Value = RenderPlatforms.glcore}, + new RenderPlatformInfo(){Label = " OpenGL ES 2.0", Value = RenderPlatforms.gles}, + new RenderPlatformInfo(){Label = " OpenGL ES 3.x", Value = RenderPlatforms.gles3}, + new RenderPlatformInfo(){Label = " iOS/Mac Metal", Value = RenderPlatforms.metal}, + new RenderPlatformInfo(){Label = " Vulkan", Value = RenderPlatforms.vulkan}, + new RenderPlatformInfo(){Label = " Xbox 360", Value = RenderPlatforms.xbox360}, + new RenderPlatformInfo(){Label = " Xbox One", Value = RenderPlatforms.xboxone}, + new RenderPlatformInfo(){Label = " PlayStation 4", Value = RenderPlatforms.ps4}, + new RenderPlatformInfo(){Label = " PlayStation Vita", Value = RenderPlatforms.psp2}, + new RenderPlatformInfo(){Label = " Nintendo 3DS", Value = RenderPlatforms.n3ds}, + new RenderPlatformInfo(){Label = " Nintendo Wii U", Value = RenderPlatforms.wiiu} + }; + + // Values from this dictionary must be the indices corresponding from the list above + private readonly Dictionary PlatformToIndex = new Dictionary() + { + {RenderPlatforms.d3d9, 0}, + {RenderPlatforms.d3d11_9x, 1}, + {RenderPlatforms.d3d11, 2}, + {RenderPlatforms.glcore, 3}, + {RenderPlatforms.gles, 4}, + {RenderPlatforms.gles3, 5}, + {RenderPlatforms.metal, 6}, + {RenderPlatforms.vulkan, 7}, + {RenderPlatforms.xbox360, 8}, + {RenderPlatforms.xboxone, 9}, + {RenderPlatforms.ps4, 10}, + {RenderPlatforms.psp2, 11}, + {RenderPlatforms.n3ds, 12}, + {RenderPlatforms.wiiu, 13} + }; + + + private readonly List LegacyIndexToPlatform = new List() + { + RenderPlatforms.d3d9, + RenderPlatforms.d3d11, + RenderPlatforms.glcore, + RenderPlatforms.gles, + RenderPlatforms.gles3, + RenderPlatforms.metal, + RenderPlatforms.d3d11_9x, + RenderPlatforms.xbox360, + RenderPlatforms.xboxone, + RenderPlatforms.ps4, + RenderPlatforms.psp2, + RenderPlatforms.n3ds, + RenderPlatforms.wiiu + }; + + [SerializeField] + private bool[] m_renderingPlatformValues; + + public RenderingPlatformOpHelper() + { + m_renderingPlatformValues = new bool[ RenderingPlatformsInfo.Length ]; + for( int i = 0; i < m_renderingPlatformValues.Length; i++ ) + { + m_renderingPlatformValues[ i ] = true; + } + } + + + public void Draw( ParentNode owner ) + { + bool value = owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedRenderingPlatforms; + NodeUtils.DrawPropertyGroup( ref value, RenderingPlatformsStr, () => + { + for( int i = 0; i < m_renderingPlatformValues.Length; i++ ) + { + m_renderingPlatformValues[ i ] = owner.EditorGUILayoutToggleLeft( RenderingPlatformsInfo[ i ].Label, m_renderingPlatformValues[ i ] ); + } + } ); + owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedRenderingPlatforms = value; + } + + public void SetRenderingPlatforms( ref string ShaderBody ) + { + int checkedPlatforms = 0; + int uncheckedPlatforms = 0; + + for( int i = 0; i < m_renderingPlatformValues.Length; i++ ) + { + if( m_renderingPlatformValues[ i ] ) + { + checkedPlatforms += 1; + } + else + { + uncheckedPlatforms += 1; + } + } + + if( checkedPlatforms > 0 && checkedPlatforms < m_renderingPlatformValues.Length ) + { + string result = string.Empty; + if( checkedPlatforms < uncheckedPlatforms ) + { + result = "only_renderers "; + for( int i = 0; i < m_renderingPlatformValues.Length; i++ ) + { + if( m_renderingPlatformValues[ i ] ) + { + result += (RenderPlatforms)RenderingPlatformsInfo[i].Value + " "; + } + } + } + else + { + result = "exclude_renderers "; + for( int i = 0; i < m_renderingPlatformValues.Length; i++ ) + { + if( !m_renderingPlatformValues[ i ] ) + { + result += (RenderPlatforms)RenderingPlatformsInfo[ i ].Value + " "; + } + } + } + MasterNode.AddShaderPragma( ref ShaderBody, result ); + } + } + + public void ReadFromString( ref uint index, ref string[] nodeParams ) + { + if( UIUtils.CurrentShaderVersion() < 17006 ) + { + for( int i = 0; i < m_renderingPlatformValues.Length; i++ ) + { + m_renderingPlatformValues[ i ] = false; + } + + int count = LegacyIndexToPlatform.Count; + int activeCount = 0; + for( int i = 0; i < count; i++ ) + { + RenderPlatforms platform = LegacyIndexToPlatform[ i ]; + int newIndex = PlatformToIndex[ platform ]; + bool value = Convert.ToBoolean( nodeParams[ index++ ] ); + if( value ) + { + m_renderingPlatformValues[ newIndex ] = true; + activeCount += 1; + } + else + { + m_renderingPlatformValues[ newIndex ] = false; + } + } + + if( activeCount == count ) + { + m_renderingPlatformValues[ PlatformToIndex[ RenderPlatforms.vulkan ] ] = true; + } + } + else + { + int count = Convert.ToInt32( nodeParams[ index++ ] ); + if( count > 0 ) + { + RenderPlatforms firstPlatform = (RenderPlatforms)Enum.Parse( typeof(RenderPlatforms), nodeParams[ index++ ] ); + if( firstPlatform == RenderPlatforms.all ) + { + for( int i = 0; i < m_renderingPlatformValues.Length; i++ ) + { + m_renderingPlatformValues[ i ] = true; + } + } + else + { + for( int i = 0; i < m_renderingPlatformValues.Length; i++ ) + { + m_renderingPlatformValues[ i ] = false; + } + + m_renderingPlatformValues[ PlatformToIndex[ firstPlatform ]] = true; + for( int i = 1; i < count; i++ ) + { + RenderPlatforms currPlatform = (RenderPlatforms)Enum.Parse( typeof( RenderPlatforms ), nodeParams[ index++ ] ); + m_renderingPlatformValues[ PlatformToIndex[ currPlatform ] ] = true; + } + } + } + } + } + + public void WriteToString( ref string nodeInfo ) + { + int active = 0; + for( int i = 0; i < m_renderingPlatformValues.Length; i++ ) + { + if( m_renderingPlatformValues[ i ] ) + active += 1; + } + IOUtils.AddFieldValueToString( ref nodeInfo, active ); + if( active == m_renderingPlatformValues.Length ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, RenderPlatforms.all ); + } + else + { + for( int i = 0; i < m_renderingPlatformValues.Length; i++ ) + { + if( m_renderingPlatformValues[ i ] ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, RenderingPlatformsInfo[i].Value ); + } + } + } + + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/RenderingPlatformsOpHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/RenderingPlatformsOpHelper.cs.meta new file mode 100644 index 0000000..96f1924 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/RenderingPlatformsOpHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 50a1f03b042823f469cef7d97c73fdc3 +timeCreated: 1488907373 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/StandardSurface.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/StandardSurface.cs new file mode 100644 index 0000000..c042f99 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/StandardSurface.cs @@ -0,0 +1,3333 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using UnityEditorInternal; + +namespace AmplifyShaderEditor +{ + public enum VertexMode + { + Relative, + Absolute + } + + public enum RenderPath + { + All, + ForwardOnly, + DeferredOnly + } + + public enum StandardShaderLightModel + { + Standard, + StandardSpecular, + Lambert, + BlinnPhong, + Unlit, + CustomLighting + } + + public enum CullMode + { + Back, + Front, + Off + } + + public enum AlphaMode + { + Opaque = 0, + Masked = 1, + Transparent = 2, // Transparent (alpha:fade) + Translucent = 3, + Premultiply = 4, // Alpha Premul (alpha:premul) + Custom = 5, + } + + public enum DisableBatching + { + True, + False, + LODFading + } + + public enum RenderType + { + Opaque, + Transparent, + TransparentCutout, + Background, + Overlay, + TreeOpaque, + TreeTransparentCutout, + TreeBillboard, + Grass, + GrassBillboard, + Custom + } + + public enum RenderQueue + { + Background, + Geometry, + AlphaTest, + Transparent, + Overlay + } + + public enum RenderPlatforms + { + d3d9, + d3d11, + glcore, + gles, + gles3, + metal, + d3d11_9x, + xbox360, + xboxone, + ps4, + psp2, + n3ds, + wiiu, + vulkan, + all + } + + [Serializable] + public class NodeCache + { + public int TargetNodeId = -1; + public int TargetPortId = -1; + + public NodeCache( int targetNodeId, int targetPortId ) + { + SetData( targetNodeId, targetPortId ); + } + + public void SetData( int targetNodeId, int targetPortId ) + { + TargetNodeId = targetNodeId; + TargetPortId = targetPortId; + } + + public void Invalidate() + { + TargetNodeId = -1; + TargetPortId = -1; + } + + public bool IsValid + { + get { return ( TargetNodeId >= 0 ); } + } + + public override string ToString() + { + return "TargetNodeId " + TargetNodeId + " TargetPortId " + TargetPortId; + } + } + + [Serializable] + public class CacheNodeConnections + { + public Dictionary> NodeCacheArray; + + public CacheNodeConnections() + { + NodeCacheArray = new Dictionary>(); + } + + public void Add( string key, NodeCache value ) + { + if( NodeCacheArray.ContainsKey( key ) ) + { + NodeCacheArray[ key ].Add( value ); + } + else + { + NodeCacheArray.Add( key, new List() ); + NodeCacheArray[ key ].Add( value ); + } + } + + public NodeCache Get( string key, int idx = 0 ) + { + if( NodeCacheArray.ContainsKey( key ) ) + { + if( idx < NodeCacheArray[ key ].Count ) + return NodeCacheArray[ key ][ idx ]; + } + return null; + } + + public List GetList( string key ) + { + if( NodeCacheArray.ContainsKey( key ) ) + { + return NodeCacheArray[ key ]; + } + return null; + } + + public void Clear() + { + foreach( KeyValuePair> kvp in NodeCacheArray ) + { + kvp.Value.Clear(); + } + NodeCacheArray.Clear(); + } + } + + [Serializable] + [NodeAttributes( "Standard Surface Output", "Master", "Surface shader generator output", null, KeyCode.None, false )] + public sealed class StandardSurfaceOutputNode : MasterNode, ISerializationCallbackReceiver + { + private readonly static string[] VertexLitFunc = { "\t\tinline half4 LightingUnlit( SurfaceOutput s, half3 lightDir, half atten )", + "\t\t{", + "\t\t\treturn half4 ( 0, 0, 0, s.Alpha );", + "\t\t}\n"}; + + private readonly static string[] FadeModeOptions = { "Opaque", "Masked", "Transparent", "Translucent", "Alpha Premultipled", "Custom" }; + private const string VertexModeStr = "Vertex Output"; + private readonly static GUIContent RenderPathContent = new GUIContent( "Render Path", "Selects and generates passes for the supported rendering paths\nDefault: All" ); + private const string ShaderModelStr = "Shader Model"; + private readonly static GUIContent LightModelContent = new GUIContent( "Light Model", "Surface shader lighting model defines how the surface reflects light\nDefault: Standard" ); + private readonly static GUIContent ShaderLODContent = new GUIContent( "Shader LOD", "Shader LOD" ); + private readonly static GUIContent CullModeContent = new GUIContent( "Cull Mode", "Polygon culling mode prevents rendering of either back-facing or front-facing polygons to save performance, turn it off if you want to render both sides\nDefault: Back" ); + + private const string ChromaticAberrationStr = "Chromatic Aberration"; + private const string DiscardStr = "Opacity Mask"; + private const string VertexDisplacementStr = "Local Vertex Offset"; + private const string VertexPositionStr = "Local Vertex Position"; + private const string VertexDataStr = "VertexData"; + private const string VertexNormalStr = "Local Vertex Normal"; + private const string CustomLightingStr = "Custom Lighting"; + private const string AlbedoStr = "Albedo"; + private const string NormalStr = "Normal"; + private const string EmissionStr = "Emission"; + private const string MetallicStr = "Metallic"; + private const string SmoothnessStr = "Smoothness"; + private const string OcclusionDataStr = "Occlusion"; + private const string OcclusionLabelStr = "Ambient Occlusion"; + private const string TransmissionStr = "Transmission"; + private const string TranslucencyStr = "Translucency"; + private const string RefractionStr = "Refraction"; + private const string AlphaStr = "Opacity"; + private const string AlphaDataStr = "Alpha"; + private const string DebugStr = "Debug"; + private const string SpecularStr = "Specular"; + private const string GlossStr = "Gloss"; + private const string CustomRenderTypeStr = "Custom Type"; + private readonly static GUIContent AlphaModeContent = new GUIContent( " Blend Mode", "Defines how the surface blends with the background\nDefault: Opaque" ); + private const string OpacityMaskClipValueStr = "Mask Clip Value"; + private readonly static GUIContent OpacityMaskClipValueContent = new GUIContent( "Mask Clip Value", "Default clip value to be compared with opacity alpha ( 0 = fully Opaque, 1 = fully Masked )\nDefault: 0.5" ); + private readonly static GUIContent CastShadowsContent = new GUIContent( "Cast Shadows", "Generates a shadow caster pass for vertex modifications and point lights in forward rendering\nDefault: ON" ); + private readonly static GUIContent ReceiveShadowsContent = new GUIContent( "Receive Shadows", "Untick it to disable shadow receiving, this includes self-shadowing (only for forward rendering) \nDefault: ON" ); + private readonly static GUIContent QueueIndexContent = new GUIContent( "Queue Index", "Value to offset the render queue, accepts both positive values to render later and negative values to render sooner\nDefault: 0" ); + private readonly static GUIContent RefractionLayerStr = new GUIContent( "Refraction Layer", "Use it to group or ungroup different refraction shaders into the same or different grabpass (only for forward rendering) \nDefault: 0" ); + private readonly static GUIContent AlphaToCoverageStr = new GUIContent( "Alpha To Coverage", "" ); + private readonly static GUIContent RenderQueueContent = new GUIContent( "Render Queue", "Base rendering queue index\n(Background = 1000, Geometry = 2000, AlphaTest = 2450, Transparent = 3000, Overlay = 4000)\nDefault: Geometry" ); + private readonly static GUIContent RenderTypeContent = new GUIContent( "Render Type", "Categorizes shaders into several predefined groups, usually to be used with screen shader effects\nDefault: Opaque" ); + + private const string ShaderInputOrderStr = "Shader Input Order"; + + + [SerializeField] + private BlendOpsHelper m_blendOpsHelper = new BlendOpsHelper(); + + [SerializeField] + private StencilBufferOpHelper m_stencilBufferHelper = new StencilBufferOpHelper(); + + [SerializeField] + private ZBufferOpHelper m_zBufferHelper = new ZBufferOpHelper(); + + [SerializeField] + private OutlineOpHelper m_outlineHelper = new OutlineOpHelper(); + + [SerializeField] + private TessellationOpHelper m_tessOpHelper = new TessellationOpHelper(); + + [SerializeField] + private ColorMaskHelper m_colorMaskHelper = new ColorMaskHelper(); + + [SerializeField] + private RenderingPlatformOpHelper m_renderingPlatformOpHelper = new RenderingPlatformOpHelper(); + + [SerializeField] + private RenderingOptionsOpHelper m_renderingOptionsOpHelper = new RenderingOptionsOpHelper(); + + [SerializeField] + private BillboardOpHelper m_billboardOpHelper = new BillboardOpHelper(); + + [SerializeField] + private FallbackPickerHelper m_fallbackHelper = null; + + [SerializeField] + private TerrainDrawInstancedHelper m_drawInstancedHelper = new TerrainDrawInstancedHelper(); + + //legacy + [SerializeField] + private AdditionalIncludesHelper m_additionalIncludes = new AdditionalIncludesHelper(); + //legacy + [SerializeField] + private AdditionalPragmasHelper m_additionalPragmas = new AdditionalPragmasHelper(); + //legacy + [SerializeField] + private AdditionalDefinesHelper m_additionalDefines = new AdditionalDefinesHelper(); + + [SerializeField] + private TemplateAdditionalDirectivesHelper m_additionalDirectives = new TemplateAdditionalDirectivesHelper( " Additional Directives" ); + + [SerializeField] + private AdditionalSurfaceOptionsHelper m_additionalSurfaceOptions = new AdditionalSurfaceOptionsHelper(); + + [SerializeField] + private UsePassHelper m_usePass; + + [SerializeField] + private CustomTagsHelper m_customTagsHelper = new CustomTagsHelper(); + + [SerializeField] + private DependenciesHelper m_dependenciesHelper = new DependenciesHelper(); + + [SerializeField] + private StandardShaderLightModel m_currentLightModel; + + [SerializeField] + private StandardShaderLightModel m_lastLightModel; + + [SerializeField] + private CullMode m_cullMode = CullMode.Back; + + [SerializeField] + private InlineProperty m_inlineCullMode = new InlineProperty(); + + [SerializeField] + private InlineProperty m_inlineChromaticAberration = new InlineProperty(0.1f); + + [SerializeField] + private AlphaMode m_alphaMode = AlphaMode.Opaque; + + [SerializeField] + private RenderType m_renderType = RenderType.Opaque; + + [SerializeField] + private string m_customRenderType = string.Empty; + + [SerializeField] + private RenderQueue m_renderQueue = RenderQueue.Geometry; + + [SerializeField] + private RenderPath m_renderPath = RenderPath.All; + + [SerializeField] + private VertexMode m_vertexMode = VertexMode.Relative; + + [SerializeField] + private bool m_customBlendMode = false; + + [SerializeField] + private float m_opacityMaskClipValue = 0.5f; + + [SerializeField] + private InlineProperty m_inlineOpacityMaskClipValue = new InlineProperty(); + + [SerializeField] + private InlineProperty m_inlineAlphaToCoverage = new InlineProperty(); + + [SerializeField] + private int m_customLightingPortId = -1; + + [SerializeField] + private int m_emissionPortId = -1; + + [SerializeField] + private int m_discardPortId = -1; + + [SerializeField] + private int m_opacityPortId = -1; + + [SerializeField] + private int m_vertexPortId = -1; + + [SerializeField] + private bool m_keepAlpha = true; + + [SerializeField] + private bool m_castShadows = true; + + //[SerializeField] + private bool m_customShadowCaster = false; + + [SerializeField] + private bool m_receiveShadows = true; + + [SerializeField] + private int m_queueOrder = 0; + + [SerializeField] + private int m_grabOrder = 0; + + [SerializeField] + private bool m_alphaToCoverage = false; + + private InputPort m_transmissionPort; + private InputPort m_translucencyPort; + private InputPort m_tessellationPort; + private bool m_previousTranslucencyOn = false; + private bool m_previousRefractionOn = false; + + [SerializeField] + private CacheNodeConnections m_cacheNodeConnections = new CacheNodeConnections(); + + + private bool m_usingProSkin = false; + private GUIStyle m_inspectorFoldoutStyle; + private GUIStyle m_inspectorToolbarStyle; + private GUIStyle m_inspectorTooldropdownStyle; + + + private bool m_customBlendAvailable = false; + + private Color m_cachedColor = Color.white; + private float m_titleOpacity = 0.5f; + private float m_boxOpacity = 0.5f; + + private InputPort m_refractionPort; + private InputPort m_normalPort; + + + private GUIStyle m_inspectorDefaultStyle; + + [SerializeField] + private ReordenatorNode m_specColorReorder = null; + + [SerializeField] + private int m_specColorOrderIndex = -1; + + [SerializeField] + private ReordenatorNode m_maskClipReorder = null; + + [SerializeField] + private int m_maskClipOrderIndex = -1; + + [SerializeField] + private ReordenatorNode m_translucencyReorder = null; + + [SerializeField] + private int m_translucencyOrderIndex = -1; + + [SerializeField] + private ReordenatorNode m_refractionReorder = null; + + [SerializeField] + private int m_refractionOrderIndex = -1; + + [SerializeField] + private ReordenatorNode m_tessellationReorder = null; + + [SerializeField] + private int m_tessellationOrderIndex = -1; + + private bool m_previousTessellationOn = false; + private bool m_initialize = true; + private bool m_checkChanges = true; + private bool m_lightModelChanged = true; + + private PropertyNode m_dummyProperty = null; + + protected override void CommonInit( int uniqueId ) + { + m_currentLightModel = m_lastLightModel = StandardShaderLightModel.Standard; + m_textLabelWidth = 120; + m_autoDrawInternalPortData = false; + base.CommonInit( uniqueId ); + m_zBufferHelper.ParentSurface = this; + m_tessOpHelper.ParentSurface = this; + m_customPrecision = true; + } + + public override void OnEnable() + { + base.OnEnable(); + if( m_usePass == null ) + { + m_usePass = ScriptableObject.CreateInstance(); + m_usePass.Init( " Additional Use Passes" ); + } + + if( m_fallbackHelper == null ) + { + m_fallbackHelper = ScriptableObject.CreateInstance(); + m_fallbackHelper.Init(); + } + } + + public override void AddMasterPorts() + { + int vertexCorrection = 2; + int index = vertexCorrection + 2; + base.AddMasterPorts(); + switch( m_currentLightModel ) + { + case StandardShaderLightModel.Standard: + { + AddInputPort( WirePortDataType.FLOAT3, false, AlbedoStr, vertexCorrection + 1, MasterNodePortCategory.Fragment, 0 ); + AddInputPort( WirePortDataType.FLOAT3, false, NormalStr, vertexCorrection + 0, MasterNodePortCategory.Fragment, 1 ); + m_normalPort = m_inputPorts[ m_inputPorts.Count - 1 ]; + AddInputPort( WirePortDataType.FLOAT3, false, EmissionStr, index++, MasterNodePortCategory.Fragment, 2 ); + AddInputPort( WirePortDataType.FLOAT, false, MetallicStr, index++, MasterNodePortCategory.Fragment, 3 ); + AddInputPort( WirePortDataType.FLOAT, false, SmoothnessStr, index++, MasterNodePortCategory.Fragment, 4 ); + AddInputPort( WirePortDataType.FLOAT, false, OcclusionLabelStr, OcclusionDataStr, index++, MasterNodePortCategory.Fragment, 5 ); + } + break; + case StandardShaderLightModel.StandardSpecular: + { + AddInputPort( WirePortDataType.FLOAT3, false, AlbedoStr, vertexCorrection + 1, MasterNodePortCategory.Fragment, 0 ); + AddInputPort( WirePortDataType.FLOAT3, false, NormalStr, vertexCorrection + 0, MasterNodePortCategory.Fragment, 1 ); + m_normalPort = m_inputPorts[ m_inputPorts.Count - 1 ]; + AddInputPort( WirePortDataType.FLOAT3, false, EmissionStr, index++, MasterNodePortCategory.Fragment, 2 ); + AddInputPort( WirePortDataType.FLOAT3, false, SpecularStr, index++, MasterNodePortCategory.Fragment, 3 ); + AddInputPort( WirePortDataType.FLOAT, false, SmoothnessStr, index++, MasterNodePortCategory.Fragment, 4 ); + AddInputPort( WirePortDataType.FLOAT, false, OcclusionLabelStr, OcclusionDataStr, index++, MasterNodePortCategory.Fragment, 5 ); + } + break; + case StandardShaderLightModel.CustomLighting: + { + AddInputPort( WirePortDataType.FLOAT3, false, AlbedoStr, vertexCorrection + 1, MasterNodePortCategory.Fragment, 0 ); + AddInputPort( WirePortDataType.FLOAT3, false, NormalStr, vertexCorrection + 0, MasterNodePortCategory.Fragment, 1 ); + m_normalPort = m_inputPorts[ m_inputPorts.Count - 1 ]; + m_inputPorts[ m_inputPorts.Count - 1 ].Locked = true; + AddInputPort( WirePortDataType.FLOAT3, false, EmissionStr, index++, MasterNodePortCategory.Fragment, 2 ); + AddInputPort( WirePortDataType.FLOAT, false, SpecularStr, index++, MasterNodePortCategory.Fragment, 3 ); + m_inputPorts[ m_inputPorts.Count - 1 ].Locked = true; + AddInputPort( WirePortDataType.FLOAT, false, GlossStr, index++, MasterNodePortCategory.Fragment, 4 ); + m_inputPorts[ m_inputPorts.Count - 1 ].Locked = true; + } + break; + case StandardShaderLightModel.Unlit: + { + AddInputPort( WirePortDataType.FLOAT3, false, AlbedoStr, vertexCorrection + 1, MasterNodePortCategory.Fragment, 0 ); + m_inputPorts[ m_inputPorts.Count - 1 ].Locked = true; + AddInputPort( WirePortDataType.FLOAT3, false, NormalStr, vertexCorrection + 0, MasterNodePortCategory.Fragment, 1 ); + m_normalPort = m_inputPorts[ m_inputPorts.Count - 1 ]; + m_inputPorts[ m_inputPorts.Count - 1 ].Locked = true; + AddInputPort( WirePortDataType.FLOAT3, false, EmissionStr, index++, MasterNodePortCategory.Fragment, 2 ); + AddInputPort( WirePortDataType.FLOAT, false, SpecularStr, index++, MasterNodePortCategory.Fragment, 3 ); + m_inputPorts[ m_inputPorts.Count - 1 ].Locked = true; + AddInputPort( WirePortDataType.FLOAT, false, GlossStr, index++, MasterNodePortCategory.Fragment, 4 ); + m_inputPorts[ m_inputPorts.Count - 1 ].Locked = true; + } + break; + case StandardShaderLightModel.Lambert: + { + AddInputPort( WirePortDataType.FLOAT3, false, AlbedoStr, vertexCorrection + 1, MasterNodePortCategory.Fragment, 0 ); + AddInputPort( WirePortDataType.FLOAT3, false, NormalStr, vertexCorrection + 0, MasterNodePortCategory.Fragment, 1 ); + m_normalPort = m_inputPorts[ m_inputPorts.Count - 1 ]; + AddInputPort( WirePortDataType.FLOAT3, false, EmissionStr, index++, MasterNodePortCategory.Fragment, 2 ); + AddInputPort( WirePortDataType.FLOAT, false, SpecularStr, index++, MasterNodePortCategory.Fragment, 3 ); + AddInputPort( WirePortDataType.FLOAT, false, GlossStr, index++, MasterNodePortCategory.Fragment, 4 ); + } + break; + case StandardShaderLightModel.BlinnPhong: + { + AddInputPort( WirePortDataType.FLOAT3, false, AlbedoStr, vertexCorrection + 1, MasterNodePortCategory.Fragment, 0 ); + AddInputPort( WirePortDataType.FLOAT3, false, NormalStr, vertexCorrection + 0, MasterNodePortCategory.Fragment, 1 ); + m_normalPort = m_inputPorts[ m_inputPorts.Count - 1 ]; + AddInputPort( WirePortDataType.FLOAT3, false, EmissionStr, index++, MasterNodePortCategory.Fragment, 2 ); + AddInputPort( WirePortDataType.FLOAT, false, SpecularStr, index++, MasterNodePortCategory.Fragment, 3 ); + AddInputPort( WirePortDataType.FLOAT, false, GlossStr, index++, MasterNodePortCategory.Fragment, 4 ); + } + break; + } + + // instead of setting in the switch emission port is always at position 2; + m_emissionPortId = 2; + + AddInputPort( WirePortDataType.FLOAT3, false, TransmissionStr, index++, MasterNodePortCategory.Fragment, 6 ); + m_transmissionPort = m_inputPorts[ m_inputPorts.Count - 1 ]; + m_inputPorts[ m_inputPorts.Count - 1 ].Locked = ( m_currentLightModel == StandardShaderLightModel.Standard ) || ( m_currentLightModel == StandardShaderLightModel.StandardSpecular ) ? false : true; + + AddInputPort( WirePortDataType.FLOAT3, false, TranslucencyStr, index++, MasterNodePortCategory.Fragment, 7 ); + m_translucencyPort = m_inputPorts[ m_inputPorts.Count - 1 ]; + m_inputPorts[ m_inputPorts.Count - 1 ].Locked = ( m_currentLightModel == StandardShaderLightModel.Standard ) || ( m_currentLightModel == StandardShaderLightModel.StandardSpecular ) ? false : true; + + AddInputPort( WirePortDataType.FLOAT, false, RefractionStr, index + 2, MasterNodePortCategory.Fragment, 8 ); + m_refractionPort = m_inputPorts[ m_inputPorts.Count - 1 ]; + m_inputPorts[ m_inputPorts.Count - 1 ].Locked = ( m_alphaMode == AlphaMode.Opaque || m_alphaMode == AlphaMode.Masked || m_currentLightModel == StandardShaderLightModel.Unlit || m_currentLightModel == StandardShaderLightModel.CustomLighting ); + + AddInputPort( WirePortDataType.FLOAT, false, AlphaStr, index++, MasterNodePortCategory.Fragment, 9 ); + m_inputPorts[ m_inputPorts.Count - 1 ].DataName = AlphaDataStr; + m_opacityPortId = m_inputPorts.Count - 1; + m_inputPorts[ m_inputPorts.Count - 1 ].Locked = ( m_alphaMode == AlphaMode.Opaque || m_alphaMode == AlphaMode.Masked ); + + AddInputPort( WirePortDataType.FLOAT, false, DiscardStr, index++, MasterNodePortCategory.Fragment, 10 ); + m_inputPorts[ m_inputPorts.Count - 1 ].Locked = ( m_alphaMode != AlphaMode.Masked && m_alphaMode != AlphaMode.Custom ); + m_discardPortId = m_inputPorts.Count - 1; + + // This is done to take the index + 2 from refraction port into account and not overlap indexes + index++; + + AddInputPort( WirePortDataType.FLOAT3, false, CustomLightingStr, index++, MasterNodePortCategory.Fragment, 13 ); + m_inputPorts[ m_inputPorts.Count - 1 ].Locked = ( m_currentLightModel != StandardShaderLightModel.CustomLighting ); + m_inputPorts[ m_inputPorts.Count - 1 ].GenType = PortGenType.CustomLighting; + m_customLightingPortId = m_inputPorts.Count - 1; + + //////////////////////////////////////////////////////////////////////////////////////////////// + // Vertex functions - Adding ordex index in order to force these to be the last ones + // Well now they have been moved to be the first ones so operations on vertex are to be taken into account + // by dither, screen position and similar nodes + //////////////////////////////////////////////////////////////////////////////////////////////// + m_vertexPortId = m_inputPorts.Count; + m_tessOpHelper.VertexOffsetIndexPort = m_vertexPortId; + AddInputPort( WirePortDataType.FLOAT3, false, ( m_vertexMode == VertexMode.Relative ? VertexDisplacementStr : VertexPositionStr ), VertexDataStr, 0/*index++*/, MasterNodePortCategory.Vertex, 11 ); + AddInputPort( WirePortDataType.FLOAT3, false, VertexNormalStr, 1/*index++*/, MasterNodePortCategory.Vertex, 12 ); + + //AddInputPort( WirePortDataType.FLOAT3, false, CustomLightModelStr, index++, MasterNodePortCategory.Fragment, 13 ); + //m_inputPorts[ m_inputPorts.Count - 1 ].Locked = true;// !(m_currentLightModel == StandardShaderLightModel.CustomLighting); + + AddInputPort( WirePortDataType.FLOAT4, false, TessellationOpHelper.TessellationPortStr, index++, MasterNodePortCategory.Tessellation, 14 ); + m_tessellationPort = m_inputPorts[ m_inputPorts.Count - 1 ]; + m_tessOpHelper.MasterNodeIndexPort = m_tessellationPort.PortId; + + //////////////////////////////////////////////////////////////////////////////////// + AddInputPort( WirePortDataType.FLOAT3, false, DebugStr, index++, MasterNodePortCategory.Debug, 15 ); + + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + m_inputPorts[ i ].CustomColor = Color.white; + } + m_sizeIsDirty = true; + } + + public override void ForcePortType() + { + int portId = 0; + switch( m_currentLightModel ) + { + case StandardShaderLightModel.Standard: + { + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT3, false ); + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT3, false ); + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT3, false ); + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT, false ); + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT, false ); + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT, false ); + } + break; + case StandardShaderLightModel.StandardSpecular: + { + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT3, false ); + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT3, false ); + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT3, false ); + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT3, false ); + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT, false ); + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT, false ); + } + break; + case StandardShaderLightModel.CustomLighting: + { + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT3, false ); + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT3, false ); + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT3, false ); + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT3, false ); + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT, false ); + } + break; + case StandardShaderLightModel.Unlit: + case StandardShaderLightModel.Lambert: + { + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT3, false ); + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT3, false ); + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT3, false ); + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT, false ); + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT, false ); + } + break; + case StandardShaderLightModel.BlinnPhong: + { + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT3, false ); + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT3, false ); + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT3, false ); + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT, false ); + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT, false ); + } + break; + } + + //Transmission + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT3, false ); + //Translucency + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT3, false ); + //Refraction + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT, false ); + //Alpha + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT, false ); + //Discard + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT, false ); + //Custom Lighting + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT3, false ); + //Vertex Offset + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT3, false ); + //Vertex Normal + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT3, false ); + //Tessellation + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT4, false ); + //Debug + m_inputPorts[ portId++ ].ChangeType( WirePortDataType.FLOAT3, false ); + } + + public override void SetName( string name ) + { + ShaderName = name; + } + + public void DrawInspectorProperty() + { + if( m_inspectorDefaultStyle == null ) + { + m_inspectorDefaultStyle = UIUtils.GetCustomStyle( CustomStyle.ResetToDefaultInspectorButton ); + } + + DrawCustomInspector( false ); + } + + private void RecursiveLog() + { + List nodes = UIUtils.PropertyNodesList(); + nodes.Sort( ( x, y ) => { return x.OrderIndex.CompareTo( y.OrderIndex ); } ); + for( int i = 0; i < nodes.Count; i++ ) + { + if( ( nodes[ i ] is ReordenatorNode ) ) + ( nodes[ i ] as ReordenatorNode ).RecursiveLog(); + else + Debug.Log( nodes[ i ].OrderIndex + " " + nodes[ i ].PropertyName ); + } + } + + public void DrawGeneralOptions() + { + DrawShaderName(); + DrawCurrentShaderType(); + + EditorGUI.BeginChangeCheck(); + m_currentLightModel = (StandardShaderLightModel)EditorGUILayoutEnumPopup( LightModelContent, m_currentLightModel ); + if( EditorGUI.EndChangeCheck() ) + { + ContainerGraph.ChangedLightingModel = true; + if( m_currentLightModel == StandardShaderLightModel.CustomLighting ) + { + ContainerGraph.ParentWindow.CurrentNodeAvailability = NodeAvailability.CustomLighting; + //ContainerGraph.CurrentCanvasMode = NodeAvailability.CustomLighting; + } + else + { + ContainerGraph.ParentWindow.CurrentNodeAvailability = NodeAvailability.SurfaceShader; + //ContainerGraph.CurrentCanvasMode = NodeAvailability.SurfaceShader; + } + } + + m_shaderModelIdx = EditorGUILayoutPopup( ShaderModelStr, m_shaderModelIdx, ShaderModelTypeArr ); + + EditorGUI.BeginChangeCheck(); + DrawPrecisionProperty( false ); + if( EditorGUI.EndChangeCheck() ) + ContainerGraph.CurrentPrecision = m_currentPrecisionType; + //m_cullMode = (CullMode)EditorGUILayoutEnumPopup( CullModeContent, m_cullMode ); + UndoParentNode inst = this; + m_inlineCullMode.CustomDrawer( ref inst, ( x ) => { m_cullMode = (CullMode)EditorGUILayoutEnumPopup( CullModeContent, m_cullMode ); }, CullModeContent.text ); + //m_inlineCullMode.Value = (int)m_cullMode; + //m_inlineCullMode.EnumTypePopup( ref inst, CullModeContent.text, Enum.GetNames( typeof( CullMode ) ) ); + //m_cullMode = (CullMode) m_inlineCullMode.Value; + + m_renderPath = (RenderPath)EditorGUILayoutEnumPopup( RenderPathContent, m_renderPath ); + + m_castShadows = EditorGUILayoutToggle( CastShadowsContent, m_castShadows ); + + m_receiveShadows = EditorGUILayoutToggle( ReceiveShadowsContent, m_receiveShadows ); + + DrawSamplingMacros(); + + m_drawInstancedHelper.Draw( this ); + + m_queueOrder = EditorGUILayoutIntField( QueueIndexContent, m_queueOrder ); + EditorGUI.BeginChangeCheck(); + m_vertexMode = (VertexMode)EditorGUILayoutEnumPopup( VertexModeStr, m_vertexMode ); + if( EditorGUI.EndChangeCheck() ) + { + m_inputPorts[ m_vertexPortId ].Name = m_vertexMode == VertexMode.Relative ? VertexDisplacementStr : VertexPositionStr; + m_sizeIsDirty = true; + } + + ShaderLOD = Mathf.Clamp( EditorGUILayoutIntField( ShaderLODContent, ShaderLOD ), 0, Shader.globalMaximumLOD ); + ////m_lodCrossfade = EditorGUILayoutToggle( LODCrossfadeContent, m_lodCrossfade ); + m_fallbackHelper.Draw( this ); + DrawInspectorProperty(); + + } + + public void ShowOpacityMaskValueUI() + { + EditorGUI.BeginChangeCheck(); + UndoParentNode inst = this; + m_inlineOpacityMaskClipValue.CustomDrawer( ref inst, ( x ) => { m_opacityMaskClipValue = EditorGUILayoutFloatField( OpacityMaskClipValueContent, m_opacityMaskClipValue ); }, OpacityMaskClipValueContent.text ); + if( EditorGUI.EndChangeCheck() ) + { + m_checkChanges = true; + if( m_currentMaterial != null && m_currentMaterial.HasProperty( IOUtils.MaskClipValueName ) ) + { + m_currentMaterial.SetFloat( IOUtils.MaskClipValueName, m_opacityMaskClipValue ); + } + } + } + + public override void DrawProperties() + { + if( m_inspectorFoldoutStyle == null || EditorGUIUtility.isProSkin != m_usingProSkin ) + m_inspectorFoldoutStyle = new GUIStyle( GUI.skin.GetStyle( "foldout" ) ); + + if( m_inspectorToolbarStyle == null || EditorGUIUtility.isProSkin != m_usingProSkin ) + { + m_inspectorToolbarStyle = new GUIStyle( GUI.skin.GetStyle( "toolbarbutton" ) ) + { + fixedHeight = 20 + }; + } + + if( m_inspectorTooldropdownStyle == null || EditorGUIUtility.isProSkin != m_usingProSkin ) + { + m_inspectorTooldropdownStyle = new GUIStyle( GUI.skin.GetStyle( "toolbardropdown" ) ) + { + fixedHeight = 20 + }; + m_inspectorTooldropdownStyle.margin.bottom = 2; + } + + if( EditorGUIUtility.isProSkin != m_usingProSkin ) + m_usingProSkin = EditorGUIUtility.isProSkin; + + base.DrawProperties(); + + EditorGUILayout.BeginVertical(); + { + EditorGUILayout.Separator(); + + m_titleOpacity = 0.5f; + m_boxOpacity = ( EditorGUIUtility.isProSkin ? 0.5f : 0.25f ); + m_cachedColor = GUI.color; + + // General + bool generalIsVisible = ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedGeneralShaderOptions; + NodeUtils.DrawPropertyGroup( ref generalIsVisible, GeneralFoldoutStr, DrawGeneralOptions ); + ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedGeneralShaderOptions = generalIsVisible; + + //Blend Mode + GUI.color = new Color( m_cachedColor.r, m_cachedColor.g, m_cachedColor.b, m_titleOpacity ); + EditorGUILayout.BeginHorizontal( m_inspectorToolbarStyle ); + GUI.color = m_cachedColor; + + bool blendOptionsVisible = GUILayout.Toggle( ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedBlendOptions, AlphaModeContent, UIUtils.MenuItemToggleStyle, GUILayout.ExpandWidth( true ) ); + if( Event.current.button == Constants.FoldoutMouseId ) + { + ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedBlendOptions = blendOptionsVisible; + } + + + if( !EditorGUIUtility.isProSkin ) + GUI.color = new Color( 0.25f, 0.25f, 0.25f, 1f ); + + float boxSize = 60; + switch( m_alphaMode ) + { + case AlphaMode.Transparent: + boxSize = 85; + break; + case AlphaMode.Translucent: + boxSize = 80; + break; + case AlphaMode.Premultiply: + boxSize = 120; + break; + } + EditorGUI.BeginChangeCheck(); + m_alphaMode = (AlphaMode)EditorGUILayoutPopup( string.Empty, (int)m_alphaMode, FadeModeOptions, UIUtils.InspectorPopdropdownStyle, GUILayout.Width( boxSize ), GUILayout.Height( 19 ) ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateFromBlendMode(); + } + + GUI.color = m_cachedColor; + EditorGUILayout.EndHorizontal(); + + m_customBlendAvailable = ( m_alphaMode == AlphaMode.Custom || m_alphaMode == AlphaMode.Opaque ); + + if( ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedBlendOptions ) + { + GUI.color = new Color( m_cachedColor.r, m_cachedColor.g, m_cachedColor.b, m_boxOpacity ); + EditorGUILayout.BeginVertical( UIUtils.MenuItemBackgroundStyle ); + GUI.color = m_cachedColor; + EditorGUI.indentLevel++; + EditorGUILayout.Separator(); + EditorGUI.BeginChangeCheck(); + + + m_renderType = (RenderType)EditorGUILayoutEnumPopup( RenderTypeContent, m_renderType ); + if( m_renderType == RenderType.Custom ) + { + EditorGUI.BeginChangeCheck(); + m_customRenderType = EditorGUILayoutTextField( CustomRenderTypeStr, m_customRenderType ); + if( EditorGUI.EndChangeCheck() ) + { + m_customRenderType = UIUtils.RemoveInvalidCharacters( m_customRenderType ); + } + } + + m_renderQueue = (RenderQueue)EditorGUILayoutEnumPopup( RenderQueueContent, m_renderQueue ); + + if( EditorGUI.EndChangeCheck() ) + { + if( m_renderType == RenderType.Opaque && m_renderQueue == RenderQueue.Geometry ) + m_alphaMode = AlphaMode.Opaque; + else if( m_renderType == RenderType.TransparentCutout && m_renderQueue == RenderQueue.AlphaTest ) + m_alphaMode = AlphaMode.Masked; + else if( m_renderType == RenderType.Transparent && m_renderQueue == RenderQueue.Transparent ) + m_alphaMode = AlphaMode.Transparent; + else if( m_renderType == RenderType.Opaque && m_renderQueue == RenderQueue.Transparent ) + m_alphaMode = AlphaMode.Translucent; + else + m_alphaMode = AlphaMode.Custom; + + + UpdateFromBlendMode(); + } + + bool bufferedEnabled = GUI.enabled; + + GUI.enabled = ( m_alphaMode == AlphaMode.Masked || m_alphaMode == AlphaMode.Custom ); + m_inputPorts[ m_discardPortId ].Locked = !GUI.enabled; + ShowOpacityMaskValueUI(); + + GUI.enabled = bufferedEnabled; + + EditorGUI.BeginDisabledGroup( !( m_alphaMode == AlphaMode.Transparent || m_alphaMode == AlphaMode.Premultiply || m_alphaMode == AlphaMode.Translucent || m_alphaMode == AlphaMode.Custom ) ); + m_grabOrder = EditorGUILayoutIntField( RefractionLayerStr, m_grabOrder ); + float cachedLabelWidth = EditorGUIUtility.labelWidth; + UndoParentNode inst = this; + if( m_refractionPort.IsConnected ) + { + EditorGUIUtility.labelWidth = 145; + EditorGUI.BeginChangeCheck(); + m_inlineChromaticAberration.RangedFloatField( ref inst, ChromaticAberrationStr, 0.0f,0.3f ); + if( EditorGUI.EndChangeCheck() ) + { + if( m_currentMaterial != null && m_currentMaterial.HasProperty( IOUtils.ChromaticAberrationProperty ) ) + { + m_currentMaterial.SetFloat( IOUtils.ChromaticAberrationProperty, m_inlineChromaticAberration.FloatValue ); + } + } + } + + //EditorGUIUtility.labelWidth = 130; + m_inlineAlphaToCoverage.CustomDrawer( ref inst, ( x ) => { m_alphaToCoverage = EditorGUILayoutToggle( AlphaToCoverageStr, m_alphaToCoverage ); }, AlphaToCoverageStr.text ); + //EditorGUIUtility.labelWidth = cachedLabelWidth; + EditorGUI.EndDisabledGroup(); + + EditorGUILayout.Separator(); + + if( !m_customBlendAvailable ) + { + EditorGUILayout.HelpBox( "Advanced options are only available for Custom blend modes", MessageType.Warning ); + } + + EditorGUI.BeginDisabledGroup( !m_customBlendAvailable ); + m_blendOpsHelper.Draw( this, m_customBlendAvailable ); + m_colorMaskHelper.Draw( this ); + + EditorGUI.EndDisabledGroup(); + EditorGUILayout.Separator(); + EditorGUI.indentLevel--; + EditorGUILayout.EndVertical(); + } + + m_stencilBufferHelper.Draw( this ); + m_tessOpHelper.Draw( this, m_inspectorToolbarStyle, m_currentMaterial, m_tessellationPort.IsConnected ); + m_outlineHelper.Draw( this, m_inspectorToolbarStyle, m_currentMaterial ); + m_billboardOpHelper.Draw( this ); + m_zBufferHelper.Draw( this, m_inspectorToolbarStyle, m_customBlendAvailable ); + m_renderingOptionsOpHelper.Draw( this ); + m_renderingPlatformOpHelper.Draw( this ); + //m_additionalDefines.Draw( this ); + //m_additionalIncludes.Draw( this ); + //m_additionalPragmas.Draw( this ); + m_additionalSurfaceOptions.Draw( this ); + m_usePass.Draw( this ); + m_additionalDirectives.Draw( this ); + m_customTagsHelper.Draw( this ); + m_dependenciesHelper.Draw( this ); + DrawMaterialInputs( m_inspectorToolbarStyle ); + } + + EditorGUILayout.EndVertical(); + } + + public override void OnNodeLogicUpdate( DrawInfo drawInfo ) + { + base.OnNodeLogicUpdate( drawInfo ); + + if( m_initialize ) + { + m_initialize = false; + + if( m_dummyProperty == null ) + { + m_dummyProperty = ScriptableObject.CreateInstance(); + m_dummyProperty.ContainerGraph = ContainerGraph; + } + } + + if( m_currentLightModel != m_lastLightModel ) + m_lightModelChanged = true; + + if( m_lightModelChanged ) + { + m_lightModelChanged = false; + if( m_currentLightModel == StandardShaderLightModel.BlinnPhong ) + { + if( m_specColorReorder == null ) + { + m_specColorReorder = ScriptableObject.CreateInstance(); + m_specColorReorder.ContainerGraph = ContainerGraph; + m_specColorReorder.OrderIndex = m_specColorOrderIndex; + m_specColorReorder.Init( "_SpecColor", "Specular Color", null ); + } + + UIUtils.RegisterPropertyNode( m_specColorReorder ); + } + else + { + if( m_specColorReorder != null ) + UIUtils.UnregisterPropertyNode( m_specColorReorder ); + } + + if( m_currentLightModel == StandardShaderLightModel.CustomLighting && m_masterNodeCategory == 0 ) + ContainerGraph.CurrentCanvasMode = NodeAvailability.CustomLighting; + else if( m_masterNodeCategory == 0 ) + ContainerGraph.CurrentCanvasMode = NodeAvailability.SurfaceShader; + CacheCurrentSettings(); + m_lastLightModel = m_currentLightModel; + DeleteAllInputConnections( true, true ); + AddMasterPorts(); + ConnectFromCache(); + } + + if( drawInfo.CurrentEventType != EventType.Layout ) + return; + + if( m_transmissionPort != null && m_transmissionPort.IsConnected && m_renderPath != RenderPath.ForwardOnly ) + { + m_renderPath = RenderPath.ForwardOnly; + UIUtils.ShowMessage( "Render Path changed to Forward Only since transmission only works in forward rendering" ); + } + + if( m_translucencyPort != null && m_translucencyPort.IsConnected && m_renderPath != RenderPath.ForwardOnly ) + { + m_renderPath = RenderPath.ForwardOnly; + UIUtils.ShowMessage( "Render Path changed to Forward Only since translucency only works in forward rendering" ); + } + + if( m_translucencyPort.IsConnected != m_previousTranslucencyOn ) + m_checkChanges = true; + + if( m_refractionPort.IsConnected != m_previousRefractionOn ) + m_checkChanges = true; + + if( ( m_tessOpHelper.EnableTesselation && !m_tessellationPort.IsConnected ) != m_previousTessellationOn ) + m_checkChanges = true; + + m_previousTranslucencyOn = m_translucencyPort.IsConnected; + + m_previousRefractionOn = m_refractionPort.IsConnected; + + m_previousTessellationOn = ( m_tessOpHelper.EnableTesselation && !m_tessellationPort.IsConnected ); + + if( m_checkChanges ) + { + if( m_translucencyPort.IsConnected ) + { + if( m_translucencyReorder == null ) + { + List translucencyList = new List(); + for( int i = 0; i < 7; i++ ) + { + translucencyList.Add( m_dummyProperty ); + } + + m_translucencyReorder = ScriptableObject.CreateInstance(); + m_translucencyReorder.ContainerGraph = ContainerGraph; + m_translucencyReorder.OrderIndex = m_translucencyOrderIndex; + m_translucencyReorder.Init( "_TranslucencyGroup", "Translucency", translucencyList ); + } + + UIUtils.RegisterPropertyNode( m_translucencyReorder ); + } + else + { + if( m_translucencyReorder != null ) + UIUtils.UnregisterPropertyNode( m_translucencyReorder ); + } + + if( m_refractionPort.IsConnected ) + { + if( m_refractionReorder == null ) + { + List refractionList = new List(); + for( int i = 0; i < 2; i++ ) + { + refractionList.Add( m_dummyProperty ); + } + + m_refractionReorder = ScriptableObject.CreateInstance(); + m_refractionReorder.ContainerGraph = ContainerGraph; + m_refractionReorder.OrderIndex = m_refractionOrderIndex; + m_refractionReorder.Init( "_RefractionGroup", "Refraction", refractionList ); + } + + UIUtils.RegisterPropertyNode( m_refractionReorder ); + } + else + { + if( m_refractionReorder != null ) + UIUtils.UnregisterPropertyNode( m_refractionReorder ); + } + + if( m_tessOpHelper.EnableTesselation && !m_tessellationPort.IsConnected ) + { + if( m_tessellationReorder == null ) + { + List tessellationList = new List(); + for( int i = 0; i < 4; i++ ) + { + tessellationList.Add( m_dummyProperty ); + } + + m_tessellationReorder = ScriptableObject.CreateInstance(); + m_tessellationReorder.ContainerGraph = ContainerGraph; + m_tessellationReorder.OrderIndex = m_tessellationOrderIndex; + m_tessellationReorder.Init( "_TessellationGroup", "Tessellation", tessellationList ); + m_tessellationReorder.HeaderTitle = "Tesselation"; + } + + UIUtils.RegisterPropertyNode( m_tessellationReorder ); + } + else + { + if( m_tessellationReorder != null ) + UIUtils.UnregisterPropertyNode( m_tessellationReorder ); + } + + if( m_inputPorts[ m_discardPortId ].Available && !m_inlineOpacityMaskClipValue.IsValid ) + { + if( m_maskClipReorder == null ) + { + // Create dragable clip material property + m_maskClipReorder = ScriptableObject.CreateInstance(); + m_maskClipReorder.ContainerGraph = ContainerGraph; + m_maskClipReorder.OrderIndex = m_maskClipOrderIndex; + m_maskClipReorder.Init( "_Cutoff", "Mask Clip Value", null ); + } + + UIUtils.RegisterPropertyNode( m_maskClipReorder ); + } + else + { + if( m_maskClipReorder != null ) + UIUtils.UnregisterPropertyNode( m_maskClipReorder ); + } + + m_checkChanges = false; + } + } + + public override void OnNodeRepaint( DrawInfo drawInfo ) + { + base.OnNodeRepaint( drawInfo ); + + if( m_containerGraph.IsInstancedShader || m_renderingOptionsOpHelper.ForceEnableInstancing ) + { + DrawInstancedIcon( drawInfo ); + } + } + + private void CacheCurrentSettings() + { + m_cacheNodeConnections.Clear(); + for( int portId = 0; portId < m_inputPorts.Count; portId++ ) + { + if( m_inputPorts[ portId ].IsConnected ) + { + WireReference connection = m_inputPorts[ portId ].GetConnection(); + m_cacheNodeConnections.Add( m_inputPorts[ portId ].Name, new NodeCache( connection.NodeId, connection.PortId ) ); + } + } + } + + private void ConnectFromCache() + { + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + NodeCache cache = m_cacheNodeConnections.Get( m_inputPorts[ i ].Name ); + if( cache != null ) + { + UIUtils.SetConnection( UniqueId, m_inputPorts[ i ].PortId, cache.TargetNodeId, cache.TargetPortId ); + } + } + } + + public override void UpdateMaterial( Material mat ) + { + base.UpdateMaterial( mat ); + if( m_alphaMode == AlphaMode.Masked || m_alphaMode == AlphaMode.Custom ) + { + if( mat.HasProperty( IOUtils.MaskClipValueName ) ) + mat.SetFloat( IOUtils.MaskClipValueName, m_opacityMaskClipValue ); + } + + if( m_refractionPort.IsConnected && !m_inlineChromaticAberration.Active ) + { + if( mat.HasProperty( IOUtils.ChromaticAberrationProperty ) ) + mat.SetFloat( IOUtils.ChromaticAberrationProperty, m_inlineChromaticAberration.FloatValue ); + } + } + + public override void SetMaterialMode( Material mat, bool fetchMaterialValues ) + { + base.SetMaterialMode( mat, fetchMaterialValues ); + if( m_alphaMode == AlphaMode.Masked || m_alphaMode == AlphaMode.Custom ) + { + if( fetchMaterialValues && m_materialMode && mat.HasProperty( IOUtils.MaskClipValueName ) ) + { + m_opacityMaskClipValue = mat.GetFloat( IOUtils.MaskClipValueName ); + } + } + + if( m_refractionPort.IsConnected && !m_inlineChromaticAberration.Active ) + { + if( fetchMaterialValues && m_materialMode && mat.HasProperty( IOUtils.ChromaticAberrationProperty ) ) + m_inlineChromaticAberration.FloatValue = mat.GetFloat( IOUtils.ChromaticAberrationProperty); + } + } + + public override void ForceUpdateFromMaterial( Material material ) + { + m_tessOpHelper.UpdateFromMaterial( material ); + m_outlineHelper.UpdateFromMaterial( material ); + + if( m_alphaMode == AlphaMode.Masked || m_alphaMode == AlphaMode.Custom ) + { + if( material.HasProperty( IOUtils.MaskClipValueName ) ) + m_opacityMaskClipValue = material.GetFloat( IOUtils.MaskClipValueName ); + } + + if( m_refractionPort.IsConnected && !m_inlineChromaticAberration.Active ) + { + if( material.HasProperty( IOUtils.ChromaticAberrationProperty ) ) + m_inlineChromaticAberration.FloatValue = material.GetFloat( IOUtils.ChromaticAberrationProperty ); + } + } + + public override void UpdateMasterNodeMaterial( Material material ) + { + m_currentMaterial = material; + UpdateMaterialEditor(); + } + + void UpdateMaterialEditor() + { + FireMaterialChangedEvt(); + } + + public string CreateInstructionsForVertexPort( InputPort port ) + { + //Vertex displacement and per vertex custom data + WireReference connection = port.GetConnection(); + ParentNode node = UIUtils.GetNode( connection.NodeId ); + + string vertexInstructions = node.GetValueFromOutputStr( connection.PortId, port.DataType, ref m_currentDataCollector, false ); + + if( m_currentDataCollector.DirtySpecialLocalVariables ) + { + m_currentDataCollector.AddVertexInstruction( m_currentDataCollector.SpecialLocalVariables, UniqueId, false ); + m_currentDataCollector.ClearSpecialLocalVariables(); + } + + if( m_currentDataCollector.DirtyVertexVariables ) + { + m_currentDataCollector.AddVertexInstruction( m_currentDataCollector.VertexLocalVariables, UniqueId, false ); + m_currentDataCollector.ClearVertexLocalVariables(); + } + + return vertexInstructions; + } + + public void CreateInstructionsForPort( InputPort port, string portName, bool addCustomDelimiters = false, string customDelimiterIn = null, string customDelimiterOut = null, bool ignoreLocalVar = false, bool normalIsConnected = false , bool isDebugPort = false ) + { + WireReference connection = port.GetConnection(); + ParentNode node = UIUtils.GetNode( connection.NodeId ); + + string newInstruction = node.GetValueFromOutputStr( connection.PortId, port.DataType, ref m_currentDataCollector, ignoreLocalVar ); + + if( m_currentDataCollector.DirtySpecialLocalVariables ) + { + m_currentDataCollector.AddInstructions( m_currentDataCollector.SpecialLocalVariables ); + m_currentDataCollector.ClearSpecialLocalVariables(); + } + + if( m_currentDataCollector.DirtyVertexVariables ) + { + m_currentDataCollector.AddVertexInstruction( m_currentDataCollector.VertexLocalVariables, port.NodeId, false ); + m_currentDataCollector.ClearVertexLocalVariables(); + } + + if( m_currentDataCollector.ForceNormal && !normalIsConnected ) + { + m_currentDataCollector.AddToStartInstructions( "\t\t\t" + Constants.OutputVarStr + ".Normal = float3(0,0,1);\n" ); + m_currentDataCollector.DirtyNormal = true; + m_currentDataCollector.ForceNormal = false; + } + + m_currentDataCollector.AddInstructions( addCustomDelimiters ? customDelimiterIn : ( "\t\t\t" + portName + " = " ) ); + m_currentDataCollector.AddInstructions( newInstruction ); + m_currentDataCollector.AddInstructions( addCustomDelimiters ? customDelimiterOut :((isDebugPort)?" + 1E-5;\n":";\n") ); + } + + public string CreateInstructionStringForPort( InputPort port, bool ignoreLocalVar = false ) + { + WireReference connection = port.GetConnection(); + ParentNode node = UIUtils.GetNode( connection.NodeId ); + + string newInstruction = node.GetValueFromOutputStr( connection.PortId, port.DataType, ref m_currentDataCollector, ignoreLocalVar ); + + if( m_currentDataCollector.DirtySpecialLocalVariables ) + { + m_currentDataCollector.AddInstructions( m_currentDataCollector.SpecialLocalVariables ); + m_currentDataCollector.ClearSpecialLocalVariables(); + } + + if( m_currentDataCollector.DirtyVertexVariables ) + { + m_currentDataCollector.AddVertexInstruction( m_currentDataCollector.VertexLocalVariables, port.NodeId, false ); + m_currentDataCollector.ClearVertexLocalVariables(); + } + + if( m_currentDataCollector.ForceNormal ) + { + m_currentDataCollector.AddToStartInstructions( "\t\t\t" + Constants.OutputVarStr + ".Normal = float3(0,0,1);\n" ); + m_currentDataCollector.DirtyNormal = true; + m_currentDataCollector.ForceNormal = false; + } + + return newInstruction; + } + + public override Shader Execute( string pathname, bool isFullPath ) + { + ForcePortType(); + ForceReordering(); + UpdateFromBlendMode(); + base.Execute( pathname, isFullPath ); + RegisterStandaloneFuntions(); + + bool isInstancedShader = m_renderingOptionsOpHelper.ForceEnableInstancing || UIUtils.IsInstancedShader(); + bool hasVirtualTexture = UIUtils.HasVirtualTexture(); + bool hasTranslucency = false; + bool hasTransmission = false; + bool hasEmission = false; + bool hasOpacity = false; + bool hasOpacityMask = false; + bool hasRefraction = false; + //bool hasVertexOffset = false; + //bool hasCustomLightingAlpha = false; + bool hasCustomLightingMask = false; + + string customLightingCode = string.Empty; + string customLightingAlphaCode = string.Empty; + string customLightingMaskCode = string.Empty; + string customLightingInstructions = string.Empty; + + string refractionCode = string.Empty; + string refractionInstructions = string.Empty; + string refractionFix = string.Empty; + + string aboveUsePasses = string.Empty; + string bellowUsePasses = string.Empty; + + + m_currentDataCollector.TesselationActive = m_tessOpHelper.EnableTesselation; + m_currentDataCollector.CurrentRenderPath = m_renderPath; + + StandardShaderLightModel cachedLightModel = m_currentLightModel; + NodeAvailability cachedAvailability = ContainerGraph.CurrentCanvasMode; + + bool debugIsUsingCustomLighting = false; + bool usingDebugPort = false; + if( m_inputPorts[ m_inputPorts.Count - 1 ].IsConnected ) + { + usingDebugPort = true; + debugIsUsingCustomLighting = m_currentLightModel == StandardShaderLightModel.CustomLighting; + + m_currentDataCollector.GenType = PortGenType.CustomLighting; + m_currentLightModel = StandardShaderLightModel.CustomLighting; + ContainerGraph.CurrentCanvasMode = NodeAvailability.CustomLighting; + } + + if( isInstancedShader ) + { + m_currentDataCollector.AddToPragmas( UniqueId, IOUtils.InstancedPropertiesHeader ); + } + + if( m_renderingOptionsOpHelper.SpecularHighlightToggle || m_renderingOptionsOpHelper.ReflectionsToggle ) + m_currentDataCollector.AddToProperties( UniqueId, "[Header(Forward Rendering Options)]", 10001 ); + if( m_renderingOptionsOpHelper.SpecularHighlightToggle ) + { + m_currentDataCollector.AddToProperties( UniqueId, "[ToggleOff] _SpecularHighlights(\"Specular Highlights\", Float) = 1.0", 10002 ); + m_currentDataCollector.AddToPragmas( UniqueId, "shader_feature _SPECULARHIGHLIGHTS_OFF" ); + } + if( m_renderingOptionsOpHelper.ReflectionsToggle ) + { + m_currentDataCollector.AddToProperties( UniqueId, "[ToggleOff] _GlossyReflections(\"Reflections\", Float) = 1.0", 10003 ); + m_currentDataCollector.AddToPragmas( UniqueId, "shader_feature _GLOSSYREFLECTIONS_OFF" ); + } + + + // See if each node is being used on frag and/or vert ports + SetupNodeCategories(); + m_containerGraph.CheckPropertiesAutoRegister( ref m_currentDataCollector ); + + if( m_refractionPort.IsConnected || m_inputPorts[ m_inputPorts.Count - 1 ].IsConnected ) + { + m_currentDataCollector.DirtyNormal = true; + m_currentDataCollector.ForceNormal = true; + } + //this.PropagateNodeData( nodeData ); + + string tags = "\"RenderType\" = \"{0}\" \"Queue\" = \"{1}\""; + string finalRenderType = ( m_renderType == RenderType.Custom && m_customRenderType.Length > 0 ) ? m_customRenderType : m_renderType.ToString(); + tags = string.Format( tags, finalRenderType, ( m_renderQueue + ( ( m_queueOrder >= 0 ) ? "+" : string.Empty ) + m_queueOrder ) ); + //if ( !m_customBlendMode ) + { + if( m_alphaMode == AlphaMode.Transparent || m_alphaMode == AlphaMode.Premultiply ) + { + //tags += " \"IgnoreProjector\" = \"True\""; + if( !m_renderingOptionsOpHelper.IgnoreProjectorValue ) + { + Debug.Log( string.Format( "Setting Ignore Projector to True since it's requires by Blend Mode {0}.", m_alphaMode ) ); + m_renderingOptionsOpHelper.IgnoreProjectorValue = true; + } + } + } + + tags += m_renderingOptionsOpHelper.IgnoreProjectorTag; + tags += m_renderingOptionsOpHelper.ForceNoShadowCastingTag; + tags += m_renderingOptionsOpHelper.DisableBatchingTag; + + //add virtual texture support + if( hasVirtualTexture ) + { + tags += " \"Amplify\" = \"True\" "; + } + + //tags = "Tags{ " + tags + " }"; + + string outputStruct = ""; + switch( m_currentLightModel ) + { + case StandardShaderLightModel.CustomLighting: outputStruct = "SurfaceOutputCustomLightingCustom"; break; + case StandardShaderLightModel.Standard: outputStruct = "SurfaceOutputStandard"; break; + case StandardShaderLightModel.StandardSpecular: outputStruct = "SurfaceOutputStandardSpecular"; break; + case StandardShaderLightModel.Unlit: + case StandardShaderLightModel.Lambert: + case StandardShaderLightModel.BlinnPhong: outputStruct = "SurfaceOutput"; break; + } + + if( m_currentLightModel == StandardShaderLightModel.CustomLighting ) + { + m_currentDataCollector.AddToIncludes( UniqueId, Constants.UnityPBSLightingLib ); + + m_currentDataCollector.ChangeCustomInputHeader( m_currentLightModel.ToString() + Constants.CustomLightStructStr ); + m_currentDataCollector.AddToCustomInput( UniqueId, "half3 Albedo", true ); + m_currentDataCollector.AddToCustomInput( UniqueId, "half3 Normal", true ); + m_currentDataCollector.AddToCustomInput( UniqueId, "half3 Emission", true ); + m_currentDataCollector.AddToCustomInput( UniqueId, "half Metallic", true ); + m_currentDataCollector.AddToCustomInput( UniqueId, "half Smoothness", true ); + m_currentDataCollector.AddToCustomInput( UniqueId, "half Occlusion", true ); + m_currentDataCollector.AddToCustomInput( UniqueId, "half Alpha", true ); + m_currentDataCollector.AddToCustomInput( UniqueId, "Input SurfInput", true ); + m_currentDataCollector.AddToCustomInput( UniqueId, "UnityGIInput GIData", true ); + } + + //Terrain Draw Instanced + if( m_drawInstancedHelper.Enabled ) + { + if( !m_currentDataCollector.DirtyPerVertexData ) + { + m_currentDataCollector.OpenPerVertexHeader( !m_tessOpHelper.EnableTesselation ); + } + m_drawInstancedHelper.UpdateDataCollectorForStandard( ref m_currentDataCollector ); + } + + // Need to sort before creating local vars so they can inspect the normal port correctly + SortedList sortedPorts = new SortedList(); + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + sortedPorts.Add( m_inputPorts[ i ].OrderId, m_inputPorts[ i ] ); + } + + bool normalIsConnected = m_normalPort.IsConnected; + m_tessOpHelper.Reset(); + if( m_inputPorts[ m_inputPorts.Count - 1 ].IsConnected ) + { + //Debug Port active + InputPort debugPort = m_inputPorts[ m_inputPorts.Count - 1 ]; + m_currentDataCollector.PortCategory = debugPort.Category; + if( debugIsUsingCustomLighting ) + { + m_currentDataCollector.UsingCustomOutput = true; + WireReference connection = m_inputPorts[ m_inputPorts.Count - 1 ].GetConnection(); + ParentNode node = UIUtils.GetNode( connection.NodeId ); + customLightingCode = node.GetValueFromOutputStr( connection.PortId, WirePortDataType.FLOAT3, ref m_currentDataCollector, false ); + customLightingInstructions = m_currentDataCollector.CustomOutput; + + if( m_currentDataCollector.ForceNormal ) + { + m_currentDataCollector.AddToStartInstructions( "\t\t\t" + Constants.OutputVarStr + ".Normal = float3(0,0,1);\n" ); + m_currentDataCollector.DirtyNormal = true; + m_currentDataCollector.ForceNormal = false; + } + + if( m_currentDataCollector.DirtyVertexVariables ) + { + m_currentDataCollector.AddVertexInstruction( m_currentDataCollector.VertexLocalVariables, UniqueId, false ); + m_currentDataCollector.ClearVertexLocalVariables(); + } + m_currentDataCollector.UsingCustomOutput = false; + } + else + { + CreateInstructionsForPort( debugPort, Constants.OutputVarStr + ".Emission", false, null, null, false, false,true ); + } + } + else + { + MasterNodePortCategory currentCategory = sortedPorts[ 0 ].Category; + //Collect data from standard nodes + for( int i = 0; i < sortedPorts.Count; i++ ) + { + // prepare ports for custom lighting + m_currentDataCollector.GenType = sortedPorts[ i ].GenType; + if( m_currentLightModel == StandardShaderLightModel.CustomLighting && sortedPorts[ i ].Name.Equals( AlphaStr ) ) + ContainerGraph.ResetNodesLocalVariablesIfNot( MasterNodePortCategory.Vertex ); + + if( sortedPorts[ i ].IsConnected ) + { + m_currentDataCollector.PortCategory = sortedPorts[ i ].Category; + + if( sortedPorts[ i ].Name.Equals( NormalStr ) )// Normal Map is Connected + { + m_currentDataCollector.DirtyNormal = true; + } + if( sortedPorts[ i ].Name.Equals( TranslucencyStr ) ) + { + hasTranslucency = true; + } + if( sortedPorts[ i ].Name.Equals( TransmissionStr ) ) + { + hasTransmission = true; + } + if( sortedPorts[ i ].Name.Equals( EmissionStr ) ) + { + hasEmission = true; + } + + if( sortedPorts[ i ].Name.Equals( RefractionStr ) ) + { + hasRefraction = true; + } + + if( sortedPorts[ i ].Name.Equals( AlphaStr ) ) + { + hasOpacity = true; + } + + if( sortedPorts[ i ].Name.Equals( DiscardStr ) ) + { + hasOpacityMask = true; + } + + if( hasRefraction ) + { + m_currentDataCollector.AddToInput( UniqueId, SurfaceInputs.SCREEN_POS ); + m_currentDataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_POS ); + + //not necessary, just being safe + m_currentDataCollector.DirtyNormal = true; + m_currentDataCollector.ForceNormal = true; + + if( m_grabOrder != 0 ) + { + m_currentDataCollector.AddGrabPass( "RefractionGrab" + m_grabOrder ); + m_currentDataCollector.AddToUniforms( UniqueId, "uniform sampler2D RefractionGrab" + m_grabOrder + ";" ); + } + else + { + m_currentDataCollector.AddGrabPass( "" ); + m_currentDataCollector.AddToUniforms( UniqueId, "uniform sampler2D _GrabTexture;" ); + } + + if( !m_inlineChromaticAberration.Active ) + { + m_currentDataCollector.AddToUniforms( UniqueId, "uniform float _ChromaticAberration;" ); + + m_currentDataCollector.AddToProperties( UniqueId, "[Header(Refraction)]", m_refractionReorder.OrderIndex ); + m_currentDataCollector.AddToProperties( UniqueId, "_ChromaticAberration(\"Chromatic Aberration\", Range( 0 , 0.3)) = 0.1", m_refractionReorder.OrderIndex + 1 ); + } + + m_currentDataCollector.AddToPragmas( UniqueId, "multi_compile _ALPHAPREMULTIPLY_ON" ); + } + + if( hasTranslucency || hasTransmission ) + { + //Translucency and Transmission Generation + + //Add properties and uniforms + m_currentDataCollector.AddToIncludes( UniqueId, Constants.UnityPBSLightingLib ); + + if( hasTranslucency ) + { + m_currentDataCollector.AddToProperties( UniqueId, "[Header(Translucency)]", m_translucencyReorder.OrderIndex ); + m_currentDataCollector.AddToProperties( UniqueId, "_Translucency(\"Strength\", Range( 0 , 50)) = 1", m_translucencyReorder.OrderIndex + 1 ); + m_currentDataCollector.AddToProperties( UniqueId, "_TransNormalDistortion(\"Normal Distortion\", Range( 0 , 1)) = 0.1", m_translucencyReorder.OrderIndex + 2 ); + m_currentDataCollector.AddToProperties( UniqueId, "_TransScattering(\"Scaterring Falloff\", Range( 1 , 50)) = 2", m_translucencyReorder.OrderIndex + 3 ); + m_currentDataCollector.AddToProperties( UniqueId, "_TransDirect(\"Direct\", Range( 0 , 1)) = 1", m_translucencyReorder.OrderIndex + 4 ); + m_currentDataCollector.AddToProperties( UniqueId, "_TransAmbient(\"Ambient\", Range( 0 , 1)) = 0.2", m_translucencyReorder.OrderIndex + 5 ); + m_currentDataCollector.AddToProperties( UniqueId, "_TransShadow(\"Shadow\", Range( 0 , 1)) = 0.9", m_translucencyReorder.OrderIndex + 6 ); + + m_currentDataCollector.AddToUniforms( UniqueId, "uniform half _Translucency;" ); + m_currentDataCollector.AddToUniforms( UniqueId, "uniform half _TransNormalDistortion;" ); + m_currentDataCollector.AddToUniforms( UniqueId, "uniform half _TransScattering;" ); + m_currentDataCollector.AddToUniforms( UniqueId, "uniform half _TransDirect;" ); + m_currentDataCollector.AddToUniforms( UniqueId, "uniform half _TransAmbient;" ); + m_currentDataCollector.AddToUniforms( UniqueId, "uniform half _TransShadow;" ); + } + + //Add custom struct + switch( m_currentLightModel ) + { + case StandardShaderLightModel.Standard: + case StandardShaderLightModel.StandardSpecular: + outputStruct = "SurfaceOutput" + m_currentLightModel.ToString() + Constants.CustomLightStructStr; break; + } + + m_currentDataCollector.ChangeCustomInputHeader( m_currentLightModel.ToString() + Constants.CustomLightStructStr ); + m_currentDataCollector.AddToCustomInput( UniqueId, "half3 Albedo", true ); + m_currentDataCollector.AddToCustomInput( UniqueId, "half3 Normal", true ); + m_currentDataCollector.AddToCustomInput( UniqueId, "half3 Emission", true ); + switch( m_currentLightModel ) + { + case StandardShaderLightModel.Standard: + m_currentDataCollector.AddToCustomInput( UniqueId, "half Metallic", true ); + break; + case StandardShaderLightModel.StandardSpecular: + m_currentDataCollector.AddToCustomInput( UniqueId, "half3 Specular", true ); + break; + } + m_currentDataCollector.AddToCustomInput( UniqueId, "half Smoothness", true ); + m_currentDataCollector.AddToCustomInput( UniqueId, "half Occlusion", true ); + m_currentDataCollector.AddToCustomInput( UniqueId, "half Alpha", true ); + if( hasTranslucency ) + m_currentDataCollector.AddToCustomInput( UniqueId, "half3 Translucency", true ); + + if( hasTransmission ) + m_currentDataCollector.AddToCustomInput( UniqueId, "half3 Transmission", true ); + } + + if( sortedPorts[ i ].Name.Equals( DiscardStr ) ) + { + //Discard Op Node + if( m_currentLightModel == StandardShaderLightModel.CustomLighting ) + { + hasCustomLightingMask = true; + m_currentDataCollector.UsingCustomOutput = true; + m_currentDataCollector.GenType = PortGenType.CustomLighting; + WireReference connection = sortedPorts[ i ].GetConnection(); + ParentNode node = UIUtils.GetNode( connection.NodeId ); + + customLightingMaskCode = node.GetValueFromOutputStr( connection.PortId, WirePortDataType.FLOAT, ref m_currentDataCollector, false ); + customLightingMaskCode = "clip( " + customLightingMaskCode + " - " + m_inlineOpacityMaskClipValue.GetValueOrProperty( IOUtils.MaskClipValueName, false ) + " )"; + customLightingInstructions = m_currentDataCollector.CustomOutput; + + m_currentDataCollector.GenType = PortGenType.NonCustomLighting; + m_currentDataCollector.UsingCustomOutput = false; + continue; + } + else + { + string clipIn = "\t\t\tclip( "; + string clipOut = " - " + m_inlineOpacityMaskClipValue.GetValueOrProperty( IOUtils.MaskClipValueName, false ) + " );\n"; + //if( ( m_alphaToCoverage || m_inlineAlphaToCoverage.Active ) && m_castShadows ) + //{ + // clipIn = "\t\t\t#if UNITY_PASS_SHADOWCASTER\n" + clipIn; + // clipOut = clipOut + "\t\t\t#endif\n"; + //} + CreateInstructionsForPort( sortedPorts[ i ], Constants.OutputVarStr + "." + sortedPorts[ i ].DataName, true, clipIn, clipOut, false, normalIsConnected ); + } + } + else if( sortedPorts[ i ].DataName.Equals( VertexDataStr ) ) + { + string vertexInstructions = CreateInstructionsForVertexPort( sortedPorts[ i ] ); + m_currentDataCollector.AddToVertexDisplacement( vertexInstructions, m_vertexMode ); + } + else if( sortedPorts[ i ].DataName.Equals( VertexNormalStr ) ) + { + string vertexInstructions = CreateInstructionsForVertexPort( sortedPorts[ i ] ); + m_currentDataCollector.AddToVertexNormal( vertexInstructions ); + } + else if( m_tessOpHelper.IsTessellationPort( sortedPorts[ i ].PortId ) && sortedPorts[ i ].IsConnected /* && m_tessOpHelper.EnableTesselation*/) + { + //Vertex displacement and per vertex custom data + WireReference connection = sortedPorts[ i ].GetConnection(); + ParentNode node = UIUtils.GetNode( connection.NodeId ); + + string vertexInstructions = node.GetValueFromOutputStr( connection.PortId, sortedPorts[ i ].DataType, ref m_currentDataCollector, false ); + + if( m_currentDataCollector.DirtySpecialLocalVariables ) + { + m_tessOpHelper.AddAdditionalData( m_currentDataCollector.SpecialLocalVariables ); + m_currentDataCollector.ClearSpecialLocalVariables(); + } + + if( m_currentDataCollector.DirtyVertexVariables ) + { + m_tessOpHelper.AddAdditionalData( m_currentDataCollector.VertexLocalVariables ); + m_currentDataCollector.ClearVertexLocalVariables(); + } + + m_tessOpHelper.AddCustomFunction( vertexInstructions ); + } + else if( sortedPorts[ i ].Name.Equals( RefractionStr ) ) + { + ContainerGraph.ResetNodesLocalVariables(); + m_currentDataCollector.UsingCustomOutput = true; + + refractionFix = " + 0.00001 * i.screenPos * i.worldPos"; + m_currentDataCollector.AddInstructions( "\t\t\to.Normal = o.Normal" + refractionFix + ";\n" ); + refractionCode = CreateInstructionStringForPort( sortedPorts[ i ], false ); + refractionInstructions = m_currentDataCollector.CustomOutput; + + m_currentDataCollector.UsingCustomOutput = false; + } + else if( sortedPorts[ i ].Name.Equals( CustomLightingStr ) ) + { + m_currentDataCollector.UsingCustomOutput = true; + WireReference connection = sortedPorts[ i ].GetConnection(); + ParentNode node = UIUtils.GetNode( connection.NodeId ); + + customLightingCode = node.GetValueFromOutputStr( connection.PortId, WirePortDataType.FLOAT3, ref m_currentDataCollector, false ); + customLightingInstructions = m_currentDataCollector.CustomOutput; + + if( m_currentDataCollector.ForceNormal ) + { + m_currentDataCollector.AddToStartInstructions( "\t\t\t" + Constants.OutputVarStr + ".Normal = float3(0,0,1);\n" ); + m_currentDataCollector.DirtyNormal = true; + m_currentDataCollector.ForceNormal = false; + } + + if( m_currentDataCollector.DirtyVertexVariables ) + { + m_currentDataCollector.AddVertexInstruction( m_currentDataCollector.VertexLocalVariables, UniqueId, false ); + m_currentDataCollector.ClearVertexLocalVariables(); + } + + m_currentDataCollector.UsingCustomOutput = false; + + } + else if( sortedPorts[ i ].Name.Equals( AlphaStr ) && m_currentLightModel == StandardShaderLightModel.CustomLighting ) + { + m_currentDataCollector.UsingCustomOutput = true; + m_currentDataCollector.GenType = PortGenType.CustomLighting; + + WireReference connection = sortedPorts[ i ].GetConnection(); + ParentNode node = UIUtils.GetNode( connection.NodeId ); + + customLightingAlphaCode = node.GetValueFromOutputStr( connection.PortId, WirePortDataType.FLOAT, ref m_currentDataCollector, false ); + customLightingInstructions = m_currentDataCollector.CustomOutput; + + if( m_currentDataCollector.ForceNormal ) + { + m_currentDataCollector.AddToStartInstructions( "\t\t\t" + Constants.OutputVarStr + ".Normal = float3(0,0,1);\n" ); + m_currentDataCollector.DirtyNormal = true; + m_currentDataCollector.ForceNormal = false; + } + + if( m_currentDataCollector.DirtyVertexVariables ) + { + m_currentDataCollector.AddVertexInstruction( m_currentDataCollector.VertexLocalVariables, UniqueId, false ); + m_currentDataCollector.ClearVertexLocalVariables(); + } + + m_currentDataCollector.GenType = PortGenType.NonCustomLighting; + m_currentDataCollector.UsingCustomOutput = false; + } + else + { + // Surface shader instruccions + // if working on normals and have normal dependent node then ignore local var generation + CreateInstructionsForPort( sortedPorts[ i ], Constants.OutputVarStr + "." + sortedPorts[ i ].DataName, false, null, null, false, normalIsConnected ); + } + } + else if( sortedPorts[ i ].Name.Equals( AlphaStr ) ) + { + if( m_currentLightModel != StandardShaderLightModel.CustomLighting ) + { + m_currentDataCollector.AddInstructions( string.Format( "\t\t\t{0}.{1} = 1;\n", Constants.OutputVarStr, sortedPorts[ i ].DataName ) ); + } + } + } + + m_billboardOpHelper.FillDataCollectorWithInternalData( ref m_currentDataCollector ); + } + + m_customShadowCaster = CustomShadowCaster; + //if( !m_renderingOptionsOpHelper.UseDefaultShadowCaster && + // ( ( m_castShadows && ( m_alphaToCoverage || m_inlineAlphaToCoverage.Active ) ) || + // ( m_castShadows && hasOpacity ) || + // ( m_castShadows && ( m_currentDataCollector.UsingWorldNormal || m_currentDataCollector.UsingWorldReflection || m_currentDataCollector.UsingViewDirection ) ) || + // ( m_castShadows && m_inputPorts[ m_discardPortId ].Available && m_inputPorts[ m_discardPortId ].IsConnected && m_currentLightModel == StandardShaderLightModel.CustomLighting ) )) + // m_customShadowCaster = true; + //else + // m_customShadowCaster = false; + + //m_customShadowCaster = true; + + for( int i = 0; i < 4; i++ ) + { + if( m_currentDataCollector.GetChannelUsage( i ) == TextureChannelUsage.Required ) + { + string channelName = UIUtils.GetChannelName( i ); + m_currentDataCollector.AddToProperties( -1, UIUtils.GetTex2DProperty( channelName, TexturePropertyValues.white ), -1 ); + } + } + + m_currentDataCollector.AddToProperties( -1, IOUtils.DefaultASEDirtyCheckProperty, 10000 ); + if( m_inputPorts[ m_discardPortId ].Available && m_inputPorts[ m_discardPortId ].IsConnected ) + { + if( m_inlineOpacityMaskClipValue.IsValid ) + { + RangedFloatNode fnode = UIUtils.GetNode( m_inlineOpacityMaskClipValue.NodeId ) as RangedFloatNode; + if( fnode != null ) + { + m_currentDataCollector.AddToProperties( fnode.UniqueId, fnode.GetPropertyValue(), fnode.OrderIndex ); + m_currentDataCollector.AddToUniforms( fnode.UniqueId, fnode.GetUniformValue() ); + } + else + { + IntNode inode = UIUtils.GetNode( m_inlineOpacityMaskClipValue.NodeId ) as IntNode; + m_currentDataCollector.AddToProperties( inode.UniqueId, inode.GetPropertyValue(), inode.OrderIndex ); + m_currentDataCollector.AddToUniforms( inode.UniqueId, inode.GetUniformValue() ); + } + } + else + { + m_currentDataCollector.AddToProperties( -1, string.Format( IOUtils.MaskClipValueProperty, OpacityMaskClipValueStr, m_opacityMaskClipValue ), ( m_maskClipReorder != null ) ? m_maskClipReorder.OrderIndex : -1 ); + m_currentDataCollector.AddToUniforms( -1, string.Format( IOUtils.MaskClipValueUniform, m_opacityMaskClipValue ) ); + } + } + + if( !m_currentDataCollector.DirtyInputs ) + m_currentDataCollector.AddToInput( UniqueId, "half filler", true ); + + if( m_currentLightModel == StandardShaderLightModel.BlinnPhong ) + m_currentDataCollector.AddToProperties( -1, "_SpecColor(\"Specular Color\",Color)=(1,1,1,1)", m_specColorReorder.OrderIndex ); + + //Tesselation + if( m_tessOpHelper.EnableTesselation ) + { + m_tessOpHelper.AddToDataCollector( ref m_currentDataCollector, m_tessellationReorder != null ? m_tessellationReorder.OrderIndex : -1 ); + if( !m_currentDataCollector.DirtyPerVertexData ) + { + m_currentDataCollector.OpenPerVertexHeader( false ); + } + } + + + if( m_outlineHelper.EnableOutline || ( m_currentDataCollector.UsingCustomOutlineColor || m_currentDataCollector.CustomOutlineSelectedAlpha > 0 || m_currentDataCollector.UsingCustomOutlineWidth ) ) + { + m_outlineHelper.AddToDataCollector( ref m_currentDataCollector ); + } + +#if !UNITY_2017_1_OR_NEWER + if( m_renderingOptionsOpHelper.LodCrossfade ) + { + m_currentDataCollector.AddToPragmas( UniqueId, "multi_compile _ LOD_FADE_CROSSFADE" ); + m_currentDataCollector.AddToStartInstructions( "\t\t\tUNITY_APPLY_DITHER_CROSSFADE(i);\n" ); + m_currentDataCollector.AddToInput( UniqueId, "UNITY_DITHER_CROSSFADE_COORDS", false ); + m_currentDataCollector.AddVertexInstruction( "UNITY_TRANSFER_DITHER_CROSSFADE( " + Constants.VertexShaderOutputStr + ", " + Constants.VertexShaderInputStr + ".vertex )", UniqueId, true ); + } +#endif + //m_additionalIncludes.AddToDataCollector( ref m_currentDataCollector ); + //m_additionalPragmas.AddToDataCollector( ref m_currentDataCollector ); + //m_additionalDefines.AddToDataCollector( ref m_currentDataCollector ); + m_additionalDirectives.AddAllToDataCollector( ref m_currentDataCollector ); + + //m_currentDataCollector.CloseInputs(); + m_currentDataCollector.CloseCustomInputs(); + m_currentDataCollector.CloseProperties(); + m_currentDataCollector.ClosePerVertexHeader(); + + //build Shader Body + string ShaderBody = string.Empty; + OpenShaderBody( ref ShaderBody, m_shaderName ); + { + //set properties + if( m_currentDataCollector.DirtyProperties ) + { + ShaderBody += m_currentDataCollector.BuildPropertiesString(); + } + //set subshader + OpenSubShaderBody( ref ShaderBody ); + { + + // Add extra depth pass + m_zBufferHelper.DrawExtraDepthPass( ref ShaderBody ); + + // Add optionalPasses + if( m_outlineHelper.EnableOutline || ( m_currentDataCollector.UsingCustomOutlineColor || m_currentDataCollector.CustomOutlineSelectedAlpha > 0 || m_currentDataCollector.UsingCustomOutlineWidth ) ) + { + if( !usingDebugPort ) + AddMultilineBody( ref ShaderBody, m_outlineHelper.OutlineFunctionBody( ref m_currentDataCollector, isInstancedShader, m_customShadowCaster, UIUtils.RemoveInvalidCharacters( ShaderName ), ( m_billboardOpHelper.IsBillboard && !usingDebugPort ? m_billboardOpHelper.GetInternalMultilineInstructions() : null ), ref m_tessOpHelper, ShaderModelTypeArr[ m_shaderModelIdx ], CurrentPrecisionType ) ); + } + + //Add SubShader tags + if( hasEmission ) + { + tags += " \"IsEmissive\" = \"true\" "; + } + + tags += m_customTagsHelper.GenerateCustomTags(); + + tags = "Tags{ " + tags + " }"; + m_usePass.BuildUsePassInfo( m_currentDataCollector, ref aboveUsePasses, ref bellowUsePasses, "\t\t" ); + if( !string.IsNullOrEmpty( aboveUsePasses ) ) + { + ShaderBody += aboveUsePasses; + } + + AddRenderTags( ref ShaderBody, tags ); + AddShaderLOD( ref ShaderBody, ShaderLOD ); + AddRenderState( ref ShaderBody, "Cull", m_inlineCullMode.GetValueOrProperty( m_cullMode.ToString() ) ); + m_customBlendAvailable = ( m_alphaMode == AlphaMode.Custom || m_alphaMode == AlphaMode.Opaque ); + if( ( m_zBufferHelper.IsActive && m_customBlendAvailable ) || m_outlineHelper.UsingZWrite || m_outlineHelper.UsingZTest ) + { + ShaderBody += m_zBufferHelper.CreateDepthInfo( m_outlineHelper.UsingZWrite, m_outlineHelper.UsingZTest ); + } + if( m_stencilBufferHelper.Active ) + { + ShaderBody += m_stencilBufferHelper.CreateStencilOp( this ); + } + + if( m_blendOpsHelper.Active ) + { + ShaderBody += m_blendOpsHelper.CreateBlendOps(); + } + + if( m_alphaToCoverage || m_inlineAlphaToCoverage.Active ) + { + ShaderBody += "\t\tAlphaToMask "+ m_inlineAlphaToCoverage.GetValueOrProperty( "On" )+"\n"; + } + + // Build Color Mask + m_colorMaskHelper.BuildColorMask( ref ShaderBody, m_customBlendAvailable ); + + //ShaderBody += "\t\tZWrite " + _zWriteMode + '\n'; + //ShaderBody += "\t\tZTest " + _zTestMode + '\n'; + + //Add GrabPass + if( m_currentDataCollector.DirtyGrabPass ) + { + ShaderBody += m_currentDataCollector.GrabPass; + } + + // build optional parameters + string OptionalParameters = string.Empty; + + // addword standard to custom lighting to accepts standard lighting models + string standardCustomLighting = string.Empty; + if( m_currentLightModel == StandardShaderLightModel.CustomLighting ) + standardCustomLighting = "Standard"; + + //add cg program + if( m_customShadowCaster ) + OpenCGInclude( ref ShaderBody ); + else + OpenCGProgram( ref ShaderBody ); + { + //Add Defines + if( m_currentDataCollector.DirtyDefines ) + ShaderBody += m_currentDataCollector.Defines; + + //Add Includes + if( m_customShadowCaster ) + { + m_currentDataCollector.AddToIncludes( UniqueId, Constants.UnityPBSLightingLib ); + m_currentDataCollector.AddToIncludes( UniqueId, "Lighting.cginc" ); + } + if( m_currentDataCollector.DirtyIncludes ) + ShaderBody += m_currentDataCollector.Includes; + + //define as surface shader and specify lighting model + if( UIUtils.GetTextureArrayNodeAmount() > 0 && m_shaderModelIdx < 3 ) + { + UIUtils.ShowMessage( "Automatically changing Shader Model to 3.5 since\nit's the minimum required by texture arrays." ); + m_shaderModelIdx = 3; + } + + // if tessellation is active then we need be at least using shader model 4.6 + if( m_tessOpHelper.EnableTesselation && m_shaderModelIdx < 6 ) + { + UIUtils.ShowMessage( "Automatically changing Shader Model to 4.6 since\nit's the minimum required by tessellation." ); + m_shaderModelIdx = 6; + } + + // if translucency is ON change render path + if( hasTranslucency && m_renderPath != RenderPath.ForwardOnly ) + { + UIUtils.ShowMessage( "Automatically changing Render Path to Forward Only since\ntranslucency only works in forward rendering." ); + m_renderPath = RenderPath.ForwardOnly; + } + + // if outline is ON change render path + if( m_outlineHelper.EnableOutline && m_renderPath != RenderPath.ForwardOnly ) + { + UIUtils.ShowMessage( "Automatically changing Render Path to Forward Only since\noutline only works in forward rendering." ); + m_renderPath = RenderPath.ForwardOnly; + } + + // if transmission is ON change render path + if( hasTransmission && m_renderPath != RenderPath.ForwardOnly ) + { + UIUtils.ShowMessage( "Automatically changing Render Path to Forward Only since\ntransmission only works in forward rendering." ); + m_renderPath = RenderPath.ForwardOnly; + } + + // if refraction is ON change render path + if( hasRefraction && m_renderPath != RenderPath.ForwardOnly ) + { + UIUtils.ShowMessage( "Automatically changing Render Path to Forward Only since\nrefraction only works in forward rendering." ); + m_renderPath = RenderPath.ForwardOnly; + } + + ShaderBody += string.Format( IOUtils.PragmaTargetHeader, ShaderModelTypeArr[ m_shaderModelIdx ] ); + + + //Add pragmas (needs check to see if all pragmas work with custom shadow caster) + if( m_currentDataCollector.DirtyPragmas/* && !m_customShadowCaster */) + ShaderBody += m_currentDataCollector.Pragmas; + + CheckSamplingMacrosFlag(); + m_currentDataCollector.AddASEMacros(); + if( m_currentDataCollector.DirtyAdditionalDirectives ) + ShaderBody += m_currentDataCollector.StandardAdditionalDirectives; + + //if ( !m_customBlendMode ) + { + switch( m_alphaMode ) + { + case AlphaMode.Opaque: + case AlphaMode.Masked: break; + case AlphaMode.Transparent: + { + OptionalParameters += "alpha:fade" + Constants.OptionalParametersSep; + } + break; + case AlphaMode.Premultiply: + { + OptionalParameters += "alpha:premul" + Constants.OptionalParametersSep; + } + break; + } + } + + if( m_keepAlpha ) + { + OptionalParameters += "keepalpha" + Constants.OptionalParametersSep; + } + + if( hasRefraction ) + { + OptionalParameters += "finalcolor:RefractionF" + Constants.OptionalParametersSep; + } + + if( !m_customShadowCaster && m_castShadows ) + { + OptionalParameters += "addshadow" + Constants.OptionalParametersSep; + } + + if( m_castShadows ) + { + OptionalParameters += "fullforwardshadows" + Constants.OptionalParametersSep; + } + + if( !m_receiveShadows ) + { + OptionalParameters += "noshadow" + Constants.OptionalParametersSep; + } + + if( m_renderingOptionsOpHelper.IsOptionActive( " Add Pass" ) && usingDebugPort ) + { + OptionalParameters += "noforwardadd" + Constants.OptionalParametersSep; + } + + if( m_renderingOptionsOpHelper.ForceDisableInstancing ) + { + OptionalParameters += "noinstancing" + Constants.OptionalParametersSep; + } + + switch( m_renderPath ) + { + case RenderPath.All: break; + case RenderPath.DeferredOnly: OptionalParameters += "exclude_path:forward" + Constants.OptionalParametersSep; break; + case RenderPath.ForwardOnly: OptionalParameters += "exclude_path:deferred" + Constants.OptionalParametersSep; break; + } + + //Add code generation options + m_renderingOptionsOpHelper.Build( ref OptionalParameters ); + + if( !m_customShadowCaster ) + { + string customLightSurface = string.Empty; + if( hasTranslucency || hasTransmission ) + customLightSurface = "Custom"; + m_renderingPlatformOpHelper.SetRenderingPlatforms( ref ShaderBody ); + + //Check if Custom Vertex is being used and add tag + if( m_currentDataCollector.DirtyPerVertexData ) + OptionalParameters += "vertex:" + Constants.VertexDataFunc + Constants.OptionalParametersSep; + + if( m_tessOpHelper.EnableTesselation && !usingDebugPort ) + { + m_tessOpHelper.WriteToOptionalParams( ref OptionalParameters ); + } + + m_additionalSurfaceOptions.WriteToOptionalSurfaceOptions( ref OptionalParameters ); + + AddShaderPragma( ref ShaderBody, "surface surf " + standardCustomLighting + m_currentLightModel.ToString() + customLightSurface + Constants.OptionalParametersSep + OptionalParameters ); + } + else + { + if( /*m_currentDataCollector.UsingWorldNormal ||*/ m_currentDataCollector.UsingInternalData ) + { + ShaderBody += "\t\t#ifdef UNITY_PASS_SHADOWCASTER\n"; + ShaderBody += "\t\t\t#undef INTERNAL_DATA\n"; + ShaderBody += "\t\t\t#undef WorldReflectionVector\n"; + ShaderBody += "\t\t\t#undef WorldNormalVector\n"; + ShaderBody += "\t\t\t#define INTERNAL_DATA half3 internalSurfaceTtoW0; half3 internalSurfaceTtoW1; half3 internalSurfaceTtoW2;\n"; + ShaderBody += "\t\t\t#define WorldReflectionVector(data,normal) reflect (data.worldRefl, half3(dot(data.internalSurfaceTtoW0,normal), dot(data.internalSurfaceTtoW1,normal), dot(data.internalSurfaceTtoW2,normal)))\n"; + ShaderBody += "\t\t\t#define WorldNormalVector(data,normal) half3(dot(data.internalSurfaceTtoW0,normal), dot(data.internalSurfaceTtoW1,normal), dot(data.internalSurfaceTtoW2,normal))\n"; + ShaderBody += "\t\t#endif\n"; + } + } + + if( m_currentDataCollector.UsingHigherSizeTexcoords ) + { + ShaderBody += "\t\t#undef TRANSFORM_TEX\n"; + ShaderBody += "\t\t#define TRANSFORM_TEX(tex,name) float4(tex.xy * name##_ST.xy + name##_ST.zw, tex.z, tex.w)\n"; + } + + if( m_currentDataCollector.DirtyAppData ) + ShaderBody += m_currentDataCollector.CustomAppData; + + // Add Input struct + if( m_currentDataCollector.DirtyInputs ) + ShaderBody += "\t\t" + m_currentDataCollector.Inputs + "\t\t};" + "\n\n"; + + // Add Custom Lighting struct + if( m_currentDataCollector.DirtyCustomInput ) + ShaderBody += m_currentDataCollector.CustomInput + "\n\n"; + + //Add Uniforms + if( m_currentDataCollector.DirtyUniforms ) + ShaderBody += m_currentDataCollector.Uniforms + "\n"; + + // Add Array Derivatives Macros + //if( m_currentDataCollector.UsingArrayDerivatives ) + //{ + // ShaderBody += "\t\t#if defined(UNITY_COMPILER_HLSL2GLSL) || defined(SHADER_TARGET_SURFACE_ANALYSIS)\n"; + // ShaderBody += "\t\t\t#define ASE_SAMPLE_TEX2DARRAY_GRAD(tex,coord,dx,dy) UNITY_SAMPLE_TEX2DARRAY (tex,coord)\n"; + // ShaderBody += "\t\t#else\n"; + // ShaderBody += "\t\t\t#define ASE_SAMPLE_TEX2DARRAY_GRAD(tex,coord,dx,dy) tex.SampleGrad (sampler##tex,coord,dx,dy)\n"; + // ShaderBody += "\t\t#endif\n\n"; + //} + + //Add Instanced Properties + if( isInstancedShader && m_currentDataCollector.DirtyInstancedProperties ) + { + m_currentDataCollector.SetupInstancePropertiesBlock( UIUtils.RemoveInvalidCharacters( ShaderName ) ); + ShaderBody += m_currentDataCollector.InstancedProperties + "\n"; + } + + if( m_currentDataCollector.DirtyFunctions ) + ShaderBody += m_currentDataCollector.Functions + "\n"; + + + //Tesselation + if( m_tessOpHelper.EnableTesselation && !usingDebugPort ) + { + ShaderBody += m_tessOpHelper.GetCurrentTessellationFunction + "\n"; + } + + //Add Custom Vertex Data + if( m_currentDataCollector.DirtyPerVertexData ) + { + ShaderBody += m_currentDataCollector.VertexData; + } + + if( m_currentLightModel == StandardShaderLightModel.Unlit ) + { + for( int i = 0; i < VertexLitFunc.Length; i++ ) + { + ShaderBody += VertexLitFunc[ i ] + "\n"; + } + } + + //Add custom lighting + if( m_currentLightModel == StandardShaderLightModel.CustomLighting ) + { + ShaderBody += "\t\tinline half4 LightingStandard" + m_currentLightModel.ToString() + "( inout " + outputStruct + " " + Constants.CustomLightOutputVarStr + ", half3 viewDir, UnityGI gi )\n\t\t{\n"; + ShaderBody += "\t\t\tUnityGIInput data = s.GIData;\n"; + ShaderBody += "\t\t\tInput i = s.SurfInput;\n"; + ShaderBody += "\t\t\thalf4 c = 0;\n"; + if( m_currentDataCollector.UsingLightAttenuation ) + { + ShaderBody += "\t\t\t#ifdef UNITY_PASS_FORWARDBASE\n"; + ShaderBody += "\t\t\tfloat ase_lightAtten = data.atten;\n"; + ShaderBody += "\t\t\tif( _LightColor0.a == 0)\n"; + ShaderBody += "\t\t\tase_lightAtten = 0;\n"; + ShaderBody += "\t\t\t#else\n"; + ShaderBody += "\t\t\tfloat3 ase_lightAttenRGB = gi.light.color / ( ( _LightColor0.rgb ) + 0.000001 );\n"; + ShaderBody += "\t\t\tfloat ase_lightAtten = max( max( ase_lightAttenRGB.r, ase_lightAttenRGB.g ), ase_lightAttenRGB.b );\n"; + ShaderBody += "\t\t\t#endif\n"; + + ShaderBody += "\t\t\t#if defined(HANDLE_SHADOWS_BLENDING_IN_GI)\n"; + ShaderBody += "\t\t\thalf bakedAtten = UnitySampleBakedOcclusion(data.lightmapUV.xy, data.worldPos);\n"; + ShaderBody += "\t\t\tfloat zDist = dot(_WorldSpaceCameraPos - data.worldPos, UNITY_MATRIX_V[2].xyz);\n"; + ShaderBody += "\t\t\tfloat fadeDist = UnityComputeShadowFadeDistance(data.worldPos, zDist);\n"; + ShaderBody += "\t\t\tase_lightAtten = UnityMixRealtimeAndBakedShadows(data.atten, bakedAtten, UnityComputeShadowFade(fadeDist));\n"; + ShaderBody += "\t\t\t#endif\n"; + } + + //if( m_currentDataCollector.dirtyc ) + ShaderBody += customLightingInstructions; + ShaderBody += "\t\t\tc.rgb = " + ( !string.IsNullOrEmpty( customLightingCode ) ? customLightingCode : "0" ) + ";\n"; + ShaderBody += "\t\t\tc.a = " + ( !string.IsNullOrEmpty( customLightingAlphaCode ) ? customLightingAlphaCode : "1" ) + ";\n"; + if( m_alphaMode == AlphaMode.Premultiply || ( ( m_alphaMode == AlphaMode.Custom || m_alphaMode == AlphaMode.Opaque ) && m_blendOpsHelper.CurrentBlendRGB.IndexOf( "Premultiplied" ) > -1 ) ) + ShaderBody += "\t\t\tc.rgb *= c.a;\n"; + if( hasCustomLightingMask ) + ShaderBody += "\t\t\t" + customLightingMaskCode + ";\n"; + ShaderBody += "\t\t\treturn c;\n"; + ShaderBody += "\t\t}\n\n"; + + //Add GI function + ShaderBody += "\t\tinline void LightingStandard" + m_currentLightModel.ToString() + "_GI( inout " + outputStruct + " " + Constants.CustomLightOutputVarStr + ", UnityGIInput data, inout UnityGI gi )\n\t\t{\n"; + ShaderBody += "\t\t\ts.GIData = data;\n"; + //ShaderBody += "\t\t\tUNITY_GI(gi, " + Constants.CustomLightOutputVarStr + ", data);\n"; + ShaderBody += "\t\t}\n\n"; + } + + //Add custom lighting function + if( hasTranslucency || hasTransmission ) + { + ShaderBody += "\t\tinline half4 Lighting" + m_currentLightModel.ToString() + Constants.CustomLightStructStr + "(" + outputStruct + " " + Constants.CustomLightOutputVarStr + ", half3 viewDir, UnityGI gi )\n\t\t{\n"; + if( hasTranslucency ) + { + ShaderBody += "\t\t\t#if !DIRECTIONAL\n"; + ShaderBody += "\t\t\tfloat3 lightAtten = gi.light.color;\n"; + ShaderBody += "\t\t\t#else\n"; + ShaderBody += "\t\t\tfloat3 lightAtten = lerp( _LightColor0.rgb, gi.light.color, _TransShadow );\n"; + ShaderBody += "\t\t\t#endif\n"; + ShaderBody += "\t\t\thalf3 lightDir = gi.light.dir + " + Constants.CustomLightOutputVarStr + ".Normal * _TransNormalDistortion;\n"; + ShaderBody += "\t\t\thalf transVdotL = pow( saturate( dot( viewDir, -lightDir ) ), _TransScattering );\n"; + ShaderBody += "\t\t\thalf3 translucency = lightAtten * (transVdotL * _TransDirect + gi.indirect.diffuse * _TransAmbient) * " + Constants.CustomLightOutputVarStr + ".Translucency;\n"; + ShaderBody += "\t\t\thalf4 c = half4( " + Constants.CustomLightOutputVarStr + ".Albedo * translucency * _Translucency, 0 );\n\n"; + } + + if( hasTransmission ) + { + ShaderBody += "\t\t\thalf3 transmission = max(0 , -dot(" + Constants.CustomLightOutputVarStr + ".Normal, gi.light.dir)) * gi.light.color * " + Constants.CustomLightOutputVarStr + ".Transmission;\n"; + ShaderBody += "\t\t\thalf4 d = half4(" + Constants.CustomLightOutputVarStr + ".Albedo * transmission , 0);\n\n"; + } + + ShaderBody += "\t\t\tSurfaceOutput" + m_currentLightModel.ToString() + " r;\n"; + ShaderBody += "\t\t\tr.Albedo = " + Constants.CustomLightOutputVarStr + ".Albedo;\n"; + ShaderBody += "\t\t\tr.Normal = " + Constants.CustomLightOutputVarStr + ".Normal;\n"; + ShaderBody += "\t\t\tr.Emission = " + Constants.CustomLightOutputVarStr + ".Emission;\n"; + switch( m_currentLightModel ) + { + case StandardShaderLightModel.Standard: + ShaderBody += "\t\t\tr.Metallic = " + Constants.CustomLightOutputVarStr + ".Metallic;\n"; + break; + case StandardShaderLightModel.StandardSpecular: + ShaderBody += "\t\t\tr.Specular = " + Constants.CustomLightOutputVarStr + ".Specular;\n"; + break; + } + ShaderBody += "\t\t\tr.Smoothness = " + Constants.CustomLightOutputVarStr + ".Smoothness;\n"; + ShaderBody += "\t\t\tr.Occlusion = " + Constants.CustomLightOutputVarStr + ".Occlusion;\n"; + ShaderBody += "\t\t\tr.Alpha = " + Constants.CustomLightOutputVarStr + ".Alpha;\n"; + ShaderBody += "\t\t\treturn Lighting" + m_currentLightModel.ToString() + " (r, viewDir, gi)" + ( hasTranslucency ? " + c" : "" ) + ( hasTransmission ? " + d" : "" ) + ";\n"; + ShaderBody += "\t\t}\n\n"; + + //Add GI function + ShaderBody += "\t\tinline void Lighting" + m_currentLightModel.ToString() + Constants.CustomLightStructStr + "_GI(" + outputStruct + " " + Constants.CustomLightOutputVarStr + ", UnityGIInput data, inout UnityGI gi )\n\t\t{\n"; + + ShaderBody += "\t\t\t#if defined(UNITY_PASS_DEFERRED) && UNITY_ENABLE_REFLECTION_BUFFERS\n"; + ShaderBody += "\t\t\t\tgi = UnityGlobalIllumination(data, " + Constants.CustomLightOutputVarStr + ".Occlusion, " + Constants.CustomLightOutputVarStr + ".Normal);\n"; + ShaderBody += "\t\t\t#else\n"; + ShaderBody += "\t\t\t\tUNITY_GLOSSY_ENV_FROM_SURFACE( g, " + Constants.CustomLightOutputVarStr + ", data );\n"; + ShaderBody += "\t\t\t\tgi = UnityGlobalIllumination( data, " + Constants.CustomLightOutputVarStr + ".Occlusion, " + Constants.CustomLightOutputVarStr + ".Normal, g );\n"; + ShaderBody += "\t\t\t#endif\n"; + + //ShaderBody += "\t\t\tUNITY_GI(gi, " + Constants.CustomLightOutputVarStr + ", data);\n"; + ShaderBody += "\t\t}\n\n"; + } + + if( hasRefraction ) + { + ShaderBody += "\t\tinline float4 Refraction( Input " + Constants.InputVarStr + ", " + outputStruct + " " + Constants.OutputVarStr + ", float indexOfRefraction, float chomaticAberration ) {\n"; + ShaderBody += "\t\t\tfloat3 worldNormal = " + Constants.OutputVarStr + ".Normal;\n"; + ShaderBody += "\t\t\tfloat4 screenPos = " + Constants.InputVarStr + ".screenPos;\n"; + ShaderBody += "\t\t\t#if UNITY_UV_STARTS_AT_TOP\n"; + ShaderBody += "\t\t\t\tfloat scale = -1.0;\n"; + ShaderBody += "\t\t\t#else\n"; + ShaderBody += "\t\t\t\tfloat scale = 1.0;\n"; + ShaderBody += "\t\t\t#endif\n"; + ShaderBody += "\t\t\tfloat halfPosW = screenPos.w * 0.5;\n"; + ShaderBody += "\t\t\tscreenPos.y = ( screenPos.y - halfPosW ) * _ProjectionParams.x * scale + halfPosW;\n"; + ShaderBody += "\t\t\t#if SHADER_API_D3D9 || SHADER_API_D3D11\n"; + ShaderBody += "\t\t\t\tscreenPos.w += 0.00000000001;\n"; + ShaderBody += "\t\t\t#endif\n"; + ShaderBody += "\t\t\tfloat2 projScreenPos = ( screenPos / screenPos.w ).xy;\n"; + ShaderBody += "\t\t\tfloat3 worldViewDir = normalize( UnityWorldSpaceViewDir( " + Constants.InputVarStr + ".worldPos ) );\n"; + ShaderBody += "\t\t\tfloat3 refractionOffset = ( indexOfRefraction - 1.0 ) * mul( UNITY_MATRIX_V, float4( worldNormal, 0.0 ) ) * ( 1.0 - dot( worldNormal, worldViewDir ) );\n"; + ShaderBody += "\t\t\tfloat2 cameraRefraction = float2( refractionOffset.x, refractionOffset.y );\n"; + + string grabpass = "_GrabTexture"; + if( m_grabOrder != 0 ) + grabpass = "RefractionGrab" + m_grabOrder; + ShaderBody += "\t\t\tfloat4 redAlpha = tex2D( " + grabpass + ", ( projScreenPos + cameraRefraction ) );\n"; + ShaderBody += "\t\t\tfloat green = tex2D( " + grabpass + ", ( projScreenPos + ( cameraRefraction * ( 1.0 - chomaticAberration ) ) ) ).g;\n"; + ShaderBody += "\t\t\tfloat blue = tex2D( " + grabpass + ", ( projScreenPos + ( cameraRefraction * ( 1.0 + chomaticAberration ) ) ) ).b;\n"; + ShaderBody += "\t\t\treturn float4( redAlpha.r, green, blue, redAlpha.a );\n"; + ShaderBody += "\t\t}\n\n"; + + ShaderBody += "\t\tvoid RefractionF( Input " + Constants.InputVarStr + ", " + outputStruct + " " + Constants.OutputVarStr + ", inout half4 color )\n"; + ShaderBody += "\t\t{\n"; + ShaderBody += "\t\t\t#ifdef UNITY_PASS_FORWARDBASE\n"; + ShaderBody += refractionInstructions; + if( m_inlineChromaticAberration.Active ) + { + ShaderBody += "\t\t\tcolor.rgb = color.rgb + Refraction( " + Constants.InputVarStr + ", " + Constants.OutputVarStr + ", " + refractionCode + ", " + m_inlineChromaticAberration.GetValueOrProperty(false) + " ) * ( 1 - color.a );\n"; + } + else + { + ShaderBody += "\t\t\tcolor.rgb = color.rgb + Refraction( " + Constants.InputVarStr + ", " + Constants.OutputVarStr + ", " + refractionCode + ", _ChromaticAberration ) * ( 1 - color.a );\n"; + } + ShaderBody += "\t\t\tcolor.a = 1;\n"; + ShaderBody += "\t\t\t#endif\n"; + ShaderBody += "\t\t}\n\n"; + } + + //Add Surface Shader body + ShaderBody += "\t\tvoid surf( Input " + Constants.InputVarStr + " , inout " + outputStruct + " " + Constants.OutputVarStr + " )\n\t\t{\n"; + { + // Pass input information to custom lighting function + if( m_currentLightModel == StandardShaderLightModel.CustomLighting ) + ShaderBody += "\t\t\t" + Constants.OutputVarStr + ".SurfInput = " + Constants.InputVarStr + ";\n"; + + //add local vars + if( m_currentDataCollector.DirtyLocalVariables ) + ShaderBody += m_currentDataCollector.LocalVariables; + + //add nodes ops + if( m_currentDataCollector.DirtyInstructions ) + ShaderBody += m_currentDataCollector.Instructions; + } + ShaderBody += "\t\t}\n"; + } + CloseCGProgram( ref ShaderBody ); + + + //Add custom Shadow Caster + if( m_customShadowCaster ) + { + OpenCGProgram( ref ShaderBody ); + string customLightSurface = hasTranslucency || hasTransmission ? "Custom" : ""; + m_renderingPlatformOpHelper.SetRenderingPlatforms( ref ShaderBody ); + + //Check if Custom Vertex is being used and add tag + if( m_currentDataCollector.DirtyPerVertexData ) + OptionalParameters += "vertex:" + Constants.VertexDataFunc + Constants.OptionalParametersSep; + + if( m_tessOpHelper.EnableTesselation && !usingDebugPort ) + { + m_tessOpHelper.WriteToOptionalParams( ref OptionalParameters ); + } + //if ( hasRefraction ) + // ShaderBody += "\t\t#pragma multi_compile _ALPHAPREMULTIPLY_ON\n"; + + m_additionalSurfaceOptions.WriteToOptionalSurfaceOptions( ref OptionalParameters ); + + AddShaderPragma( ref ShaderBody, "surface surf " + standardCustomLighting + m_currentLightModel.ToString() + customLightSurface + Constants.OptionalParametersSep + OptionalParameters ); + CloseCGProgram( ref ShaderBody ); + + ShaderBody += "\t\tPass\n"; + ShaderBody += "\t\t{\n"; + ShaderBody += "\t\t\tName \"ShadowCaster\"\n"; + ShaderBody += "\t\t\tTags{ \"LightMode\" = \"ShadowCaster\" }\n"; + ShaderBody += "\t\t\tZWrite On\n"; + if( m_alphaToCoverage || m_inlineAlphaToCoverage.Active ) + ShaderBody += "\t\t\tAlphaToMask Off\n"; + ShaderBody += "\t\t\tCGPROGRAM\n"; + ShaderBody += "\t\t\t#pragma vertex vert\n"; + ShaderBody += "\t\t\t#pragma fragment frag\n"; + ShaderBody += "\t\t\t#pragma target " + ShaderModelTypeArr[ m_shaderModelIdx ] + "\n"; + //ShaderBody += "\t\t\t#pragma multi_compile_instancing\n"; + ShaderBody += "\t\t\t#pragma multi_compile_shadowcaster\n"; + ShaderBody += "\t\t\t#pragma multi_compile UNITY_PASS_SHADOWCASTER\n"; + ShaderBody += "\t\t\t#pragma skip_variants FOG_LINEAR FOG_EXP FOG_EXP2\n"; + ShaderBody += "\t\t\t#include \"HLSLSupport.cginc\"\n"; +#if UNITY_2018_3_OR_NEWER + //Preventing WebGL to throw error Duplicate system value semantic definition: input semantic 'SV_POSITION' and input semantic 'VPOS' + ShaderBody += "\t\t\t#if ( SHADER_API_D3D11 || SHADER_API_GLCORE || SHADER_API_GLES || SHADER_API_GLES3 || SHADER_API_METAL || SHADER_API_VULKAN )\n"; +#else + ShaderBody += "\t\t\t#if ( SHADER_API_D3D11 || SHADER_API_GLCORE || SHADER_API_GLES3 || SHADER_API_METAL || SHADER_API_VULKAN )\n"; +#endif + ShaderBody += "\t\t\t\t#define CAN_SKIP_VPOS\n"; + ShaderBody += "\t\t\t#endif\n"; + ShaderBody += "\t\t\t#include \"UnityCG.cginc\"\n"; + ShaderBody += "\t\t\t#include \"Lighting.cginc\"\n"; + ShaderBody += "\t\t\t#include \"UnityPBSLighting.cginc\"\n"; + + if( !( ( m_alphaToCoverage || m_inlineAlphaToCoverage.Active ) && hasOpacity && hasOpacityMask ) ) + if( hasOpacity ) + ShaderBody += "\t\t\tsampler3D _DitherMaskLOD;\n"; + + //ShaderBody += "\t\t\tsampler3D _DitherMaskLOD;\n"; + + ShaderBody += "\t\t\tstruct v2f\n"; + ShaderBody += "\t\t\t{\n"; + ShaderBody += "\t\t\t\tV2F_SHADOW_CASTER;\n"; + int texcoordIndex = 1; + for( int i = 0; i < m_currentDataCollector.PackSlotsList.Count; i++ ) + { + int size = 4 - m_currentDataCollector.PackSlotsList[ i ]; + if( size > 0 ) + { + ShaderBody += "\t\t\t\tfloat" + size + " customPack" + ( i + 1 ) + " : TEXCOORD" + ( i + 1 ) + ";\n"; + } + texcoordIndex++; + } + + if( !m_currentDataCollector.UsingInternalData ) + ShaderBody += "\t\t\t\tfloat3 worldPos : TEXCOORD" + ( texcoordIndex++ ) + ";\n"; + if( m_currentDataCollector.UsingScreenPos ) + ShaderBody += "\t\t\t\tfloat4 screenPos : TEXCOORD" + ( texcoordIndex++ ) + ";\n"; + if( /*m_currentDataCollector.UsingWorldNormal || m_currentDataCollector.UsingWorldPosition ||*/ m_currentDataCollector.UsingInternalData || m_currentDataCollector.DirtyNormal ) + { + ShaderBody += "\t\t\t\tfloat4 tSpace0 : TEXCOORD" + ( texcoordIndex++ ) + ";\n"; + ShaderBody += "\t\t\t\tfloat4 tSpace1 : TEXCOORD" + ( texcoordIndex++ ) + ";\n"; + ShaderBody += "\t\t\t\tfloat4 tSpace2 : TEXCOORD" + ( texcoordIndex++ ) + ";\n"; + } + else if( !m_currentDataCollector.UsingInternalData && m_currentDataCollector.UsingWorldNormal ) + { + ShaderBody += "\t\t\t\tfloat3 worldNormal : TEXCOORD" + ( texcoordIndex++ ) + ";\n"; + } + + if( m_currentDataCollector.UsingVertexColor ) + ShaderBody += "\t\t\t\thalf4 color : COLOR0;\n"; + ShaderBody += "\t\t\t\tUNITY_VERTEX_INPUT_INSTANCE_ID\n"; + ShaderBody += "\t\t\t\tUNITY_VERTEX_OUTPUT_STEREO\n"; + ShaderBody += "\t\t\t};\n"; + + ShaderBody += "\t\t\tv2f vert( " + m_currentDataCollector.CustomAppDataName + " v )\n"; + ShaderBody += "\t\t\t{\n"; + ShaderBody += "\t\t\t\tv2f o;\n"; + + ShaderBody += "\t\t\t\tUNITY_SETUP_INSTANCE_ID( v );\n"; + ShaderBody += "\t\t\t\tUNITY_INITIALIZE_OUTPUT( v2f, o );\n"; + ShaderBody += "\t\t\t\tUNITY_INITIALIZE_VERTEX_OUTPUT_STEREO( o );\n"; + ShaderBody += "\t\t\t\tUNITY_TRANSFER_INSTANCE_ID( v, o );\n"; + + if( m_currentDataCollector.DirtyPerVertexData || m_currentDataCollector.CustomShadowCoordsList.Count > 0 ) + ShaderBody += "\t\t\t\tInput customInputData;\n"; + if( m_currentDataCollector.DirtyPerVertexData ) + { + ShaderBody += "\t\t\t\tvertexDataFunc( v" + ( m_currentDataCollector.TesselationActive ? "" : ", customInputData" ) + " );\n"; + } + + ShaderBody += "\t\t\t\tfloat3 worldPos = mul( unity_ObjectToWorld, v.vertex ).xyz;\n"; + ShaderBody += "\t\t\t\thalf3 worldNormal = UnityObjectToWorldNormal( v.normal );\n"; + if( m_currentDataCollector.UsingInternalData || m_currentDataCollector.DirtyNormal ) + { + ShaderBody += "\t\t\t\thalf3 worldTangent = UnityObjectToWorldDir( v.tangent.xyz );\n"; + ShaderBody += "\t\t\t\thalf tangentSign = v.tangent.w * unity_WorldTransformParams.w;\n"; + ShaderBody += "\t\t\t\thalf3 worldBinormal = cross( worldNormal, worldTangent ) * tangentSign;\n"; + ShaderBody += "\t\t\t\to.tSpace0 = float4( worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x );\n"; + ShaderBody += "\t\t\t\to.tSpace1 = float4( worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y );\n"; + ShaderBody += "\t\t\t\to.tSpace2 = float4( worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z );\n"; + } + else if( !m_currentDataCollector.UsingInternalData && m_currentDataCollector.UsingWorldNormal ) + { + ShaderBody += "\t\t\t\to.worldNormal = worldNormal;\n"; + } + + for( int i = 0; i < m_currentDataCollector.CustomShadowCoordsList.Count; i++ ) + { + int size = UIUtils.GetChannelsAmount( m_currentDataCollector.CustomShadowCoordsList[ i ].DataType ); + string channels = string.Empty; + for( int j = 0; j < size; j++ ) + { + channels += Convert.ToChar( 120 + m_currentDataCollector.CustomShadowCoordsList[ i ].TextureIndex + j ); + } + channels = channels.Replace( '{', 'w' ); + ShaderBody += "\t\t\t\to.customPack" + ( m_currentDataCollector.CustomShadowCoordsList[ i ].TextureSlot + 1 ) + "." + channels + " = customInputData." + m_currentDataCollector.CustomShadowCoordsList[ i ].CoordName + ";\n"; + + //TODO: TEMPORARY SOLUTION, this needs to go somewhere else, there's no need for these comparisons + if( m_currentDataCollector.CustomShadowCoordsList[ i ].CoordName.StartsWith( "uv_" ) ) + { + ShaderBody += "\t\t\t\to.customPack" + ( m_currentDataCollector.CustomShadowCoordsList[ i ].TextureSlot + 1 ) + "." + channels + " = v.texcoord;\n"; + } + else if( m_currentDataCollector.CustomShadowCoordsList[ i ].CoordName.StartsWith( "uv2_" ) ) + { + ShaderBody += "\t\t\t\to.customPack" + ( m_currentDataCollector.CustomShadowCoordsList[ i ].TextureSlot + 1 ) + "." + channels + " = v.texcoord1;\n"; + } + else if( m_currentDataCollector.CustomShadowCoordsList[ i ].CoordName.StartsWith( "uv3_" ) ) + { + ShaderBody += "\t\t\t\to.customPack" + ( m_currentDataCollector.CustomShadowCoordsList[ i ].TextureSlot + 1 ) + "." + channels + " = v.texcoord2;\n"; + } + else if( m_currentDataCollector.CustomShadowCoordsList[ i ].CoordName.StartsWith( "uv4_" ) ) + { + ShaderBody += "\t\t\t\to.customPack" + ( m_currentDataCollector.CustomShadowCoordsList[ i ].TextureSlot + 1 ) + "." + channels + " = v.texcoord3;\n"; + } + } + + if( !m_currentDataCollector.UsingInternalData ) + ShaderBody += "\t\t\t\to.worldPos = worldPos;\n"; + ShaderBody += "\t\t\t\tTRANSFER_SHADOW_CASTER_NORMALOFFSET( o )\n"; + if( m_currentDataCollector.UsingScreenPos ) + ShaderBody += "\t\t\t\to.screenPos = ComputeScreenPos( o.pos );\n"; + if( m_currentDataCollector.UsingVertexColor ) + ShaderBody += "\t\t\t\to.color = v.color;\n"; + ShaderBody += "\t\t\t\treturn o;\n"; + ShaderBody += "\t\t\t}\n"; + + ShaderBody += "\t\t\thalf4 frag( v2f IN\n"; + ShaderBody += "\t\t\t#if !defined( CAN_SKIP_VPOS )\n"; + ShaderBody += "\t\t\t, UNITY_VPOS_TYPE vpos : VPOS\n"; + ShaderBody += "\t\t\t#endif\n"; + ShaderBody += "\t\t\t) : SV_Target\n"; + ShaderBody += "\t\t\t{\n"; + ShaderBody += "\t\t\t\tUNITY_SETUP_INSTANCE_ID( IN );\n"; + ShaderBody += "\t\t\t\tInput surfIN;\n"; + ShaderBody += "\t\t\t\tUNITY_INITIALIZE_OUTPUT( Input, surfIN );\n"; + + for( int i = 0; i < m_currentDataCollector.CustomShadowCoordsList.Count; i++ ) + { + int size = UIUtils.GetChannelsAmount( m_currentDataCollector.CustomShadowCoordsList[ i ].DataType ); + string channels = string.Empty; + for( int j = 0; j < size; j++ ) + { + channels += Convert.ToChar( 120 + m_currentDataCollector.CustomShadowCoordsList[ i ].TextureIndex + j ); + } + channels = channels.Replace( '{', 'w' ); + ShaderBody += "\t\t\t\tsurfIN." + m_currentDataCollector.CustomShadowCoordsList[ i ].CoordName + " = IN.customPack" + ( m_currentDataCollector.CustomShadowCoordsList[ i ].TextureSlot + 1 ) + "." + channels + ";\n"; + } + + if( m_currentDataCollector.UsingInternalData ) + ShaderBody += "\t\t\t\tfloat3 worldPos = float3( IN.tSpace0.w, IN.tSpace1.w, IN.tSpace2.w );\n"; + else + ShaderBody += "\t\t\t\tfloat3 worldPos = IN.worldPos;\n"; + ShaderBody += "\t\t\t\thalf3 worldViewDir = normalize( UnityWorldSpaceViewDir( worldPos ) );\n"; + + if( m_currentDataCollector.UsingViewDirection && !m_currentDataCollector.DirtyNormal ) + ShaderBody += "\t\t\t\tsurfIN.viewDir = worldViewDir;\n"; + else if( m_currentDataCollector.UsingViewDirection ) + ShaderBody += "\t\t\t\tsurfIN.viewDir = IN.tSpace0.xyz * worldViewDir.x + IN.tSpace1.xyz * worldViewDir.y + IN.tSpace2.xyz * worldViewDir.z;\n"; + + if( m_currentDataCollector.UsingWorldPosition ) + ShaderBody += "\t\t\t\tsurfIN.worldPos = worldPos;\n"; + + if( m_currentDataCollector.UsingWorldNormal && m_currentDataCollector.UsingInternalData ) + ShaderBody += "\t\t\t\tsurfIN.worldNormal = float3( IN.tSpace0.z, IN.tSpace1.z, IN.tSpace2.z );\n"; + else if( !m_currentDataCollector.UsingInternalData && m_currentDataCollector.UsingWorldNormal ) + ShaderBody += "\t\t\t\tsurfIN.worldNormal = IN.worldNormal;\n"; + + if( m_currentDataCollector.UsingWorldReflection ) + ShaderBody += "\t\t\t\tsurfIN.worldRefl = -worldViewDir;\n"; + + if( m_currentDataCollector.UsingInternalData ) + { + ShaderBody += "\t\t\t\tsurfIN.internalSurfaceTtoW0 = IN.tSpace0.xyz;\n"; + ShaderBody += "\t\t\t\tsurfIN.internalSurfaceTtoW1 = IN.tSpace1.xyz;\n"; + ShaderBody += "\t\t\t\tsurfIN.internalSurfaceTtoW2 = IN.tSpace2.xyz;\n"; + } + + if( m_currentDataCollector.UsingScreenPos ) + ShaderBody += "\t\t\t\tsurfIN.screenPos = IN.screenPos;\n"; + + if( m_currentDataCollector.UsingVertexColor ) + ShaderBody += "\t\t\t\tsurfIN.vertexColor = IN.color;\n"; + + ShaderBody += "\t\t\t\t" + outputStruct + " o;\n"; + ShaderBody += "\t\t\t\tUNITY_INITIALIZE_OUTPUT( " + outputStruct + ", o )\n"; + ShaderBody += "\t\t\t\tsurf( surfIN, o );\n"; + if( ( hasOpacity || hasOpacityMask ) && m_currentLightModel == StandardShaderLightModel.CustomLighting ) + { + ShaderBody += "\t\t\t\tUnityGI gi;\n"; + ShaderBody += "\t\t\t\tUNITY_INITIALIZE_OUTPUT( UnityGI, gi );\n"; + ShaderBody += "\t\t\t\to.Alpha = LightingStandardCustomLighting( o, worldViewDir, gi ).a;\n"; + } + ShaderBody += "\t\t\t\t#if defined( CAN_SKIP_VPOS )\n"; + ShaderBody += "\t\t\t\tfloat2 vpos = IN.pos;\n"; + ShaderBody += "\t\t\t\t#endif\n"; + + /*if( ( ( m_alphaToCoverage || m_inlineAlphaToCoverage.Active ) && hasOpacity && m_inputPorts[ m_discardPortId ].IsConnected ) ) + { + + } + else*/ if(!( ( m_alphaToCoverage || m_inlineAlphaToCoverage.Active ) && hasOpacity && m_inputPorts[ m_discardPortId ].IsConnected ) && hasOpacity ) + { + ShaderBody += "\t\t\t\thalf alphaRef = tex3D( _DitherMaskLOD, float3( vpos.xy * 0.25, o.Alpha * 0.9375 ) ).a;\n"; + ShaderBody += "\t\t\t\tclip( alphaRef - 0.01 );\n"; + } + + ShaderBody += "\t\t\t\tSHADOW_CASTER_FRAGMENT( IN )\n"; + ShaderBody += "\t\t\t}\n"; + + ShaderBody += "\t\t\tENDCG\n"; + + ShaderBody += "\t\t}\n"; + } + + } + + if( !string.IsNullOrEmpty( bellowUsePasses ) ) + { + ShaderBody += bellowUsePasses; + } + + CloseSubShaderBody( ref ShaderBody ); + + if( m_dependenciesHelper.HasDependencies ) + { + ShaderBody += m_dependenciesHelper.GenerateDependencies(); + } + + if( m_fallbackHelper.Active ) + { + ShaderBody += m_fallbackHelper.TabbedFallbackShader; + } + else if( m_castShadows || m_receiveShadows ) + { + AddShaderProperty( ref ShaderBody, "Fallback", "Diffuse" ); + } + + if( !string.IsNullOrEmpty( m_customInspectorName ) ) + { + AddShaderProperty( ref ShaderBody, "CustomEditor", m_customInspectorName ); + } + } + CloseShaderBody( ref ShaderBody ); + + if( usingDebugPort ) + { + m_currentLightModel = cachedLightModel; + ContainerGraph.CurrentCanvasMode = cachedAvailability; + } + + // Generate Graph info + ShaderBody += ContainerGraph.ParentWindow.GenerateGraphInfo(); + + //TODO: Remove current SaveDebugShader and uncomment SaveToDisk as soon as pathname is editable + if( !String.IsNullOrEmpty( pathname ) ) + { + IOUtils.StartSaveThread( ShaderBody, ( isFullPath ? pathname : ( IOUtils.dataPath + pathname ) ) ); + } + else + { + IOUtils.StartSaveThread( ShaderBody, Application.dataPath + "/AmplifyShaderEditor/Samples/Shaders/" + m_shaderName + ".shader" ); + } + + // Load new shader into material + + if( CurrentShader == null ) + { + AssetDatabase.Refresh( ImportAssetOptions.ForceUpdate ); + CurrentShader = Shader.Find( ShaderName ); + } + //else + //{ + // // need to always get asset datapath because a user can change and asset location from the project window + // AssetDatabase.ImportAsset( AssetDatabase.GetAssetPath( m_currentShader ) ); + // //ShaderUtil.UpdateShaderAsset( m_currentShader, ShaderBody ); + //} + + if( m_currentShader != null ) + { + m_currentDataCollector.UpdateShaderImporter( ref m_currentShader ); + if( m_currentMaterial != null ) + { + if( m_currentShader != m_currentMaterial.shader ) + m_currentMaterial.shader = m_currentShader; +#if UNITY_5_6_OR_NEWER + if ( isInstancedShader ) + { + m_currentMaterial.enableInstancing = true; + } +#endif + m_currentDataCollector.UpdateMaterialOnPropertyNodes( m_currentMaterial ); + UpdateMaterialEditor(); + // need to always get asset datapath because a user can change and asset location from the project window + //AssetDatabase.ImportAsset( AssetDatabase.GetAssetPath( m_currentMaterial ) ); + } + } + + m_currentDataCollector.Destroy(); + m_currentDataCollector = null; + + return m_currentShader; + } + + public override void UpdateFromShader( Shader newShader ) + { + if( m_currentMaterial != null && m_currentMaterial.shader != newShader ) + { + m_currentMaterial.shader = newShader; + } + CurrentShader = newShader; + } + + public override void Destroy() + { + base.Destroy(); + + if( m_dummyProperty != null ) + { + m_dummyProperty.Destroy(); + GameObject.DestroyImmediate( m_dummyProperty ); + m_dummyProperty = null; + } + + m_drawInstancedHelper = null; + + m_translucencyPort = null; + m_transmissionPort = null; + m_refractionPort = null; + m_normalPort = null; + + m_renderingOptionsOpHelper.Destroy(); + m_renderingOptionsOpHelper = null; + + m_additionalIncludes.Destroy(); + m_additionalIncludes = null; + + m_additionalPragmas.Destroy(); + m_additionalPragmas = null; + + m_additionalDefines.Destroy(); + m_additionalDefines = null; + + m_additionalSurfaceOptions.Destroy(); + m_additionalSurfaceOptions = null; + + m_additionalDirectives.Destroy(); + m_additionalDirectives = null; + + m_customTagsHelper.Destroy(); + m_customTagsHelper = null; + + m_dependenciesHelper.Destroy(); + m_dependenciesHelper = null; + + m_renderingPlatformOpHelper = null; + m_inspectorDefaultStyle = null; + m_inspectorFoldoutStyle = null; + + m_zBufferHelper = null; + m_stencilBufferHelper = null; + m_blendOpsHelper = null; + m_tessOpHelper.Destroy(); + m_tessOpHelper = null; + m_outlineHelper.Destroy(); + m_outlineHelper = null; + m_colorMaskHelper.Destroy(); + m_colorMaskHelper = null; + m_billboardOpHelper = null; + + m_fallbackHelper.Destroy(); + GameObject.DestroyImmediate( m_fallbackHelper ); + m_fallbackHelper = null; + + m_usePass.Destroy(); + GameObject.DestroyImmediate( m_usePass ); + m_usePass = null; + } + + public override int VersionConvertInputPortId( int portId ) + { + int newPort = portId; + + //added translucency input after occlusion + if( UIUtils.CurrentShaderVersion() <= 2404 ) + { + switch( m_currentLightModel ) + { + case StandardShaderLightModel.Standard: + case StandardShaderLightModel.StandardSpecular: + if( portId >= 6 ) + newPort += 1; + break; + case StandardShaderLightModel.CustomLighting: + case StandardShaderLightModel.Unlit: + case StandardShaderLightModel.Lambert: + case StandardShaderLightModel.BlinnPhong: + if( portId >= 5 ) + newPort += 1; + break; + } + } + + portId = newPort; + + //added transmission input after occlusion + if( UIUtils.CurrentShaderVersion() < 2407 ) + { + switch( m_currentLightModel ) + { + case StandardShaderLightModel.Standard: + case StandardShaderLightModel.StandardSpecular: + if( portId >= 6 ) + newPort += 1; + break; + case StandardShaderLightModel.CustomLighting: + case StandardShaderLightModel.Unlit: + case StandardShaderLightModel.Lambert: + case StandardShaderLightModel.BlinnPhong: + if( portId >= 5 ) + newPort += 1; + break; + } + } + + portId = newPort; + + //added tessellation ports + if( UIUtils.CurrentShaderVersion() < 3002 ) + { + switch( m_currentLightModel ) + { + case StandardShaderLightModel.Standard: + case StandardShaderLightModel.StandardSpecular: + if( portId >= 13 ) + newPort += 1; + break; + case StandardShaderLightModel.CustomLighting: + case StandardShaderLightModel.Unlit: + case StandardShaderLightModel.Lambert: + case StandardShaderLightModel.BlinnPhong: + if( portId >= 10 ) + newPort += 1; + break; + } + } + + portId = newPort; + + //added refraction after translucency + if( UIUtils.CurrentShaderVersion() < 3204 ) + { + switch( m_currentLightModel ) + { + case StandardShaderLightModel.Standard: + case StandardShaderLightModel.StandardSpecular: + if( portId >= 8 ) + newPort += 1; + break; + case StandardShaderLightModel.CustomLighting: + case StandardShaderLightModel.Unlit: + case StandardShaderLightModel.Lambert: + case StandardShaderLightModel.BlinnPhong: + if( portId >= 7 ) + newPort += 1; + break; + } + } + + portId = newPort; + + //removed custom lighting port + //if ( UIUtils.CurrentShaderVersion() < 10003 ) //runs everytime because this system is only used after 5000 version + { + switch( m_currentLightModel ) + { + case StandardShaderLightModel.Standard: + case StandardShaderLightModel.StandardSpecular: + if( portId >= 13 ) + newPort -= 1; + break; + case StandardShaderLightModel.CustomLighting: + case StandardShaderLightModel.Unlit: + case StandardShaderLightModel.Lambert: + case StandardShaderLightModel.BlinnPhong: + if( portId >= 12 ) + newPort -= 1; + break; + } + } + + portId = newPort; + + //if( UIUtils.CurrentShaderVersion() < 13802 ) //runs everytime because this system is only used after 5000 version + { + switch( m_currentLightModel ) + { + case StandardShaderLightModel.Standard: + case StandardShaderLightModel.StandardSpecular: + if( portId >= 11 ) + newPort += 1; + break; + case StandardShaderLightModel.CustomLighting: + case StandardShaderLightModel.Unlit: + case StandardShaderLightModel.Lambert: + case StandardShaderLightModel.BlinnPhong: + if( portId >= 10 ) + newPort += 1; + break; + } + } + + portId = newPort; + return newPort; + } + + public override void ReadFromString( ref string[] nodeParams ) + { + try + { + base.ReadFromString( ref nodeParams ); + m_currentLightModel = (StandardShaderLightModel)Enum.Parse( typeof( StandardShaderLightModel ), GetCurrentParam( ref nodeParams ) ); + + if( CurrentMasterNodeCategory == AvailableShaderTypes.SurfaceShader && m_currentLightModel == StandardShaderLightModel.CustomLighting ) + { + ContainerGraph.CurrentCanvasMode = NodeAvailability.CustomLighting; + ContainerGraph.ParentWindow.CurrentNodeAvailability = NodeAvailability.CustomLighting; + } + else if( CurrentMasterNodeCategory == AvailableShaderTypes.SurfaceShader ) + { + ContainerGraph.CurrentCanvasMode = NodeAvailability.SurfaceShader; + ContainerGraph.ParentWindow.CurrentNodeAvailability = NodeAvailability.SurfaceShader; + } + //if ( _shaderCategory.Length > 0 ) + // _shaderCategory = UIUtils.RemoveInvalidCharacters( _shaderCategory ); + ShaderName = GetCurrentParam( ref nodeParams ); + if( m_shaderName.Length > 0 ) + ShaderName = UIUtils.RemoveShaderInvalidCharacters( ShaderName ); + + m_renderingOptionsOpHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + + m_cullMode = (CullMode)Enum.Parse( typeof( CullMode ), GetCurrentParam( ref nodeParams ) ); + m_zBufferHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + + string alphaMode = GetCurrentParam( ref nodeParams ); + + if( UIUtils.CurrentShaderVersion() < 4003 ) + { + if( alphaMode.Equals( "Fade" ) ) + { + alphaMode = "Transparent"; + } + else if( alphaMode.Equals( "Transparent" ) ) + { + alphaMode = "Premultiply"; + } + } + + m_alphaMode = (AlphaMode)Enum.Parse( typeof( AlphaMode ), alphaMode ); + m_opacityMaskClipValue = Convert.ToSingle( GetCurrentParam( ref nodeParams ) ); + m_keepAlpha = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + m_keepAlpha = true; + m_castShadows = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + m_queueOrder = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > 11 ) + { + m_customBlendMode = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + m_renderType = (RenderType)Enum.Parse( typeof( RenderType ), GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > 14305 ) + { + m_customRenderType = GetCurrentParam( ref nodeParams ); + } + m_renderQueue = (RenderQueue)Enum.Parse( typeof( RenderQueue ), GetCurrentParam( ref nodeParams ) ); + } + if( UIUtils.CurrentShaderVersion() > 2402 ) + { + m_renderPath = (RenderPath)Enum.Parse( typeof( RenderPath ), GetCurrentParam( ref nodeParams ) ); + } + if( UIUtils.CurrentShaderVersion() > 2405 ) + { + m_renderingPlatformOpHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( UIUtils.CurrentShaderVersion() > 2500 ) + { + m_colorMaskHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( UIUtils.CurrentShaderVersion() > 2501 ) + { + m_stencilBufferHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( UIUtils.CurrentShaderVersion() > 2504 ) + { + m_tessOpHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( UIUtils.CurrentShaderVersion() > 2505 ) + { + m_receiveShadows = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + + if( UIUtils.CurrentShaderVersion() > 3202 ) + { + m_blendOpsHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( UIUtils.CurrentShaderVersion() > 3203 ) + { + m_grabOrder = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + + if( UIUtils.CurrentShaderVersion() > 5003 ) + { + m_outlineHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( UIUtils.CurrentShaderVersion() > 5110 ) + { + m_billboardOpHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( UIUtils.CurrentShaderVersion() > 6101 ) + { + m_vertexMode = (VertexMode)Enum.Parse( typeof( VertexMode ), GetCurrentParam( ref nodeParams ) ); + } + + if( UIUtils.CurrentShaderVersion() > 6102 ) + { + ShaderLOD = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_fallbackHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( UIUtils.CurrentShaderVersion() > 7102 ) + { + m_maskClipOrderIndex = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_translucencyOrderIndex = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_refractionOrderIndex = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_tessellationOrderIndex = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + + if( UIUtils.CurrentShaderVersion() > 10010 && UIUtils.CurrentShaderVersion() < 15312 ) + { + m_additionalIncludes.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( UIUtils.CurrentShaderVersion() > 11006 ) + { + m_customTagsHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( UIUtils.CurrentShaderVersion() > 13102 && UIUtils.CurrentShaderVersion() < 15312 ) + { + m_additionalPragmas.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( UIUtils.CurrentShaderVersion() > 13205 ) + { + m_alphaToCoverage = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + + if( UIUtils.CurrentShaderVersion() > 13903 ) + { + m_dependenciesHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( UIUtils.CurrentShaderVersion() > 14005 && UIUtils.CurrentShaderVersion() < 15312 ) + { + m_additionalDefines.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( UIUtils.CurrentShaderVersion() > 14501 ) + { + m_inlineCullMode.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( UIUtils.CurrentShaderVersion() > 14502 ) + { + m_specColorOrderIndex = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + + if( UIUtils.CurrentShaderVersion() > 15204 ) + { + m_inlineOpacityMaskClipValue.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( UIUtils.CurrentShaderVersion() > 15311 ) + { + m_additionalDirectives.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + m_additionalSurfaceOptions.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + else + { + m_additionalDirectives.AddItems( AdditionalLineType.Define, m_additionalDefines.DefineList ); + m_additionalDirectives.AddItems( AdditionalLineType.Include, m_additionalIncludes.IncludeList ); + m_additionalDirectives.AddItems( AdditionalLineType.Pragma, m_additionalPragmas.PragmaList ); + } + + if( UIUtils.CurrentShaderVersion() > 15402 ) + { + m_usePass.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( UIUtils.CurrentShaderVersion() > 16203 ) + { + m_drawInstancedHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( UIUtils.CurrentShaderVersion() > 16204 ) + m_inlineChromaticAberration.ReadFromString( ref m_currentReadParamIdx, ref nodeParams , false ); + + if( UIUtils.CurrentShaderVersion() > 16207 ) + m_inlineAlphaToCoverage.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + + if( UIUtils.CurrentShaderVersion() > 18302 ) + SamplingMacros = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + else + SamplingMacros = false; + + m_lightModelChanged = true; + m_lastLightModel = m_currentLightModel; + DeleteAllInputConnections( true ); + AddMasterPorts(); + UpdateFromBlendMode(); + m_customBlendMode = TestCustomBlendMode(); + + ContainerGraph.CurrentPrecision = m_currentPrecisionType; + } + catch( Exception e ) + { + Debug.Log( e ); + } + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + + // change port connection from emission to the new custom lighting port + if( m_currentLightModel == StandardShaderLightModel.CustomLighting && m_inputPorts[ m_emissionPortId ].IsConnected && UIUtils.CurrentShaderVersion() < 13802 ) + { + OutputPort port = m_inputPorts[ m_emissionPortId ].GetOutputConnection( 0 ); + m_inputPorts[ m_emissionPortId ].FullDeleteConnections(); + UIUtils.SetConnection( m_inputPorts[ m_customLightingPortId ].NodeId, m_inputPorts[ m_customLightingPortId ].PortId, port.NodeId, port.PortId ); + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_currentLightModel ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_shaderName ); + m_renderingOptionsOpHelper.WriteToString( ref nodeInfo ); + + IOUtils.AddFieldValueToString( ref nodeInfo, m_cullMode ); + m_zBufferHelper.WriteToString( ref nodeInfo ); + + IOUtils.AddFieldValueToString( ref nodeInfo, m_alphaMode ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_opacityMaskClipValue ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_keepAlpha ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_castShadows ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_queueOrder ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_customBlendMode ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_renderType ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_customRenderType ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_renderQueue ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_renderPath ); + m_renderingPlatformOpHelper.WriteToString( ref nodeInfo ); + m_colorMaskHelper.WriteToString( ref nodeInfo ); + m_stencilBufferHelper.WriteToString( ref nodeInfo ); + m_tessOpHelper.WriteToString( ref nodeInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_receiveShadows ); + m_blendOpsHelper.WriteToString( ref nodeInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_grabOrder ); + m_outlineHelper.WriteToString( ref nodeInfo ); + m_billboardOpHelper.WriteToString( ref nodeInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_vertexMode ); + IOUtils.AddFieldValueToString( ref nodeInfo, ShaderLOD ); + m_fallbackHelper.WriteToString( ref nodeInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, ( m_maskClipReorder != null ) ? m_maskClipReorder.OrderIndex : -1 ); + IOUtils.AddFieldValueToString( ref nodeInfo, ( m_translucencyReorder != null ) ? m_translucencyReorder.OrderIndex : -1 ); + IOUtils.AddFieldValueToString( ref nodeInfo, ( m_refractionReorder != null ) ? m_refractionReorder.OrderIndex : -1 ); + IOUtils.AddFieldValueToString( ref nodeInfo, ( m_tessellationReorder != null ) ? m_tessellationReorder.OrderIndex : -1 ); + //m_additionalIncludes.WriteToString( ref nodeInfo ); + m_customTagsHelper.WriteToString( ref nodeInfo ); + //m_additionalPragmas.WriteToString( ref nodeInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_alphaToCoverage ); + m_dependenciesHelper.WriteToString( ref nodeInfo ); + //m_additionalDefines.WriteToString( ref nodeInfo ); + m_inlineCullMode.WriteToString( ref nodeInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, ( m_specColorReorder != null ) ? m_specColorReorder.OrderIndex : -1 ); + m_inlineOpacityMaskClipValue.WriteToString( ref nodeInfo ); + m_additionalDirectives.WriteToString( ref nodeInfo ); + m_additionalSurfaceOptions.WriteToString( ref nodeInfo ); + m_usePass.WriteToString( ref nodeInfo ); + m_drawInstancedHelper.WriteToString( ref nodeInfo ); + m_inlineChromaticAberration.WriteToString( ref nodeInfo ); + m_inlineAlphaToCoverage.WriteToString( ref nodeInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_samplingMacros ); + } + + private bool TestCustomBlendMode() + { + switch( m_alphaMode ) + { + case AlphaMode.Opaque: + { + if( m_renderType == RenderType.Opaque && m_renderQueue == RenderQueue.Geometry ) + return false; + } + break; + case AlphaMode.Masked: + { + if( m_renderType == RenderType.TransparentCutout && m_renderQueue == RenderQueue.AlphaTest ) + return false; + } + break; + case AlphaMode.Transparent: + case AlphaMode.Premultiply: + { + if( m_renderType == RenderType.Transparent && m_renderQueue == RenderQueue.Transparent ) + return false; + } + break; + case AlphaMode.Translucent: + { + if( m_renderType == RenderType.Opaque && m_renderQueue == RenderQueue.Transparent ) + return false; + } + break; + } + return true; + } + + private void UpdateFromBlendMode() + { + m_checkChanges = true; + bool lockRefractionPort = false; + if( m_currentLightModel == StandardShaderLightModel.Unlit || m_currentLightModel == StandardShaderLightModel.CustomLighting ) + { + lockRefractionPort = true; + } + + switch( m_alphaMode ) + { + case AlphaMode.Opaque: + { + m_renderType = RenderType.Opaque; + m_renderQueue = RenderQueue.Geometry; + m_keepAlpha = true; + m_refractionPort.Locked = true; + m_inputPorts[ m_opacityPortId ].Locked = true; + m_inputPorts[ m_discardPortId ].Locked = true; + } + break; + case AlphaMode.Masked: + { + m_renderType = RenderType.TransparentCutout; + m_renderQueue = RenderQueue.AlphaTest; + m_keepAlpha = true; + m_refractionPort.Locked = true; + m_inputPorts[ m_opacityPortId ].Locked = true; + m_inputPorts[ m_discardPortId ].Locked = false; + } + break; + case AlphaMode.Transparent: + case AlphaMode.Premultiply: + { + m_renderType = RenderType.Transparent; + m_renderQueue = RenderQueue.Transparent; + m_refractionPort.Locked = false || lockRefractionPort; + m_inputPorts[ m_opacityPortId ].Locked = false; + m_inputPorts[ m_discardPortId ].Locked = true; + } + break; + case AlphaMode.Translucent: + { + m_renderType = RenderType.Opaque; + m_renderQueue = RenderQueue.Transparent; + m_refractionPort.Locked = false || lockRefractionPort; + m_inputPorts[ m_opacityPortId ].Locked = false; + m_inputPorts[ m_discardPortId ].Locked = true; + } + break; + case AlphaMode.Custom: + { + m_refractionPort.Locked = false || lockRefractionPort; + m_inputPorts[ m_opacityPortId ].Locked = false; + m_inputPorts[ m_discardPortId ].Locked = false; + } + break; + } + + m_blendOpsHelper.SetBlendOpsFromBlendMode( m_alphaMode, ( m_alphaMode == AlphaMode.Custom || m_alphaMode == AlphaMode.Opaque ) ); + } + + public bool CastShadows { get { return m_castShadows; } } + public StandardShaderLightModel CurrentLightingModel { get { return m_currentLightModel; } } + public CullMode CurrentCullMode { get { return m_cullMode; } } + //public AdditionalIncludesHelper AdditionalIncludes { get { return m_additionalIncludes; } set { m_additionalIncludes = value; } } + //public AdditionalPragmasHelper AdditionalPragmas { get { return m_additionalPragmas; } set { m_additionalPragmas = value; } } + //public AdditionalDefinesHelper AdditionalDefines { get { return m_additionalDefines; } set { m_additionalDefines = value; } } + public TemplateAdditionalDirectivesHelper AdditionalDirectives { get { return m_additionalDirectives; } } + public OutlineOpHelper OutlineHelper { get { return m_outlineHelper; } } + public float OpacityMaskClipValue { get { return m_opacityMaskClipValue; } } + public InlineProperty InlineOpacityMaskClipValue { get { return m_inlineOpacityMaskClipValue; } set { m_inlineOpacityMaskClipValue = value; } } + public bool CustomShadowCaster + { + get + { + bool hasOpacity = m_inputPorts[ m_opacityPortId ].IsConnected; + return + ( !m_renderingOptionsOpHelper.UseDefaultShadowCaster && + ( ( m_castShadows && ( m_alphaToCoverage || m_inlineAlphaToCoverage.Active ) ) || + ( m_castShadows && hasOpacity ) || + ( m_castShadows && ( m_currentDataCollector.UsingWorldNormal || m_currentDataCollector.UsingWorldReflection || m_currentDataCollector.UsingViewDirection ) ) || + ( m_castShadows && m_inputPorts[ m_discardPortId ].Available && m_inputPorts[ m_discardPortId ].IsConnected && m_currentLightModel == StandardShaderLightModel.CustomLighting ) ) ); + } + } + public override AvailableShaderTypes CurrentMasterNodeCategory { get { return AvailableShaderTypes.SurfaceShader; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/StandardSurface.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/StandardSurface.cs.meta new file mode 100644 index 0000000..0515f8c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/StandardSurface.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 59e61f9559385a94a87d4d37dbd556f0 +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/StencilBufferOpHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/StencilBufferOpHelper.cs new file mode 100644 index 0000000..b613f0f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/StencilBufferOpHelper.cs @@ -0,0 +1,304 @@ +using System; +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + + [Serializable] + public class StencilBufferOpHelper + { + public static readonly string[] StencilComparisonValues = + { + "", + "Greater" , + "GEqual" , + "Less" , + "LEqual" , + "Equal" , + "NotEqual" , + "Always" , + "Never" + }; + + public static readonly Dictionary StencilComparisonValuesDict = new Dictionary() + { + {"Greater" , 1}, + {"GEqual" , 2}, + {"Less" , 3}, + {"LEqual" , 4}, + {"Equal" , 5}, + {"NotEqual", 6}, + {"Always" , 7}, + {"Never" , 8}, + }; + + public static readonly string[] StencilComparisonLabels = + { + "", + "Greater" , + "Greater or Equal" , + "Less" , + "Less or Equal" , + "Equal" , + "Not Equal" , + "Always" , + "Never" + }; + + + public static readonly string[] StencilOpsValues = + { + "", + "Keep", + "Zero", + "Replace", + "IncrSat", + "DecrSat", + "Invert", + "IncrWrap", + "DecrWrap" + }; + + public static readonly Dictionary StencilOpsValuesDict = new Dictionary() + { + {"Keep", 1}, + {"Zero", 2}, + {"Replace", 3}, + {"IncrSat", 4}, + {"DecrSat", 5}, + {"Invert", 6}, + {"IncrWrap",7}, + {"DecrWrap",8}, + }; + + public static readonly string[] StencilOpsLabels = + { + "", + "Keep", + "Zero", + "Replace", + "IncrSat", + "DecrSat", + "Invert", + "IncrWrap", + "DecrWrap" + }; + + + private const string FoldoutLabelStr = " Stencil Buffer"; + private GUIContent ReferenceValueContent = new GUIContent( "Reference", "The value to be compared against (if Comparison is anything else than always) and/or the value to be written to the buffer (if either Pass, Fail or ZFail is set to replace)" ); + private GUIContent ReadMaskContent = new GUIContent( "Read Mask", "An 8 bit mask as an 0-255 integer, used when comparing the reference value with the contents of the buffer (referenceValue & readMask) comparisonFunction (stencilBufferValue & readMask)" ); + private GUIContent WriteMaskContent = new GUIContent( "Write Mask", "An 8 bit mask as an 0-255 integer, used when writing to the buffer" ); + private const string ComparisonStr = "Comparison"; + private const string PassStr = "Pass"; + private const string FailStr = "Fail"; + private const string ZFailStr = "ZFail"; + + private const string ComparisonFrontStr = "Comp. Front"; + private const string PassFrontStr = "Pass Front"; + private const string FailFrontStr = "Fail Front"; + private const string ZFailFrontStr = "ZFail Front"; + + private const string ComparisonBackStr = "Comp. Back"; + private const string PassBackStr = "Pass Back"; + private const string FailBackStr = "Fail Back"; + private const string ZFailBackStr = "ZFail Back"; + + private const int ReadMaskDefaultValue = 255; + private const int WriteMaskDefaultValue = 255; + private const int ComparisonDefaultValue = 0; + private const int PassStencilOpDefaultValue = 0; + private const int FailStencilOpDefaultValue = 0; + private const int ZFailStencilOpDefaultValue = 0; + + [SerializeField] + private bool m_active; + + [SerializeField] + private InlineProperty m_refValue = new InlineProperty(); + [SerializeField] + private InlineProperty m_readMask = new InlineProperty( ReadMaskDefaultValue ); + [SerializeField] + private InlineProperty m_writeMask = new InlineProperty( WriteMaskDefaultValue ); + + //Comparison Function + [SerializeField] + private InlineProperty m_comparisonFunctionIdx = new InlineProperty( ComparisonDefaultValue ); + [SerializeField] + private InlineProperty m_comparisonFunctionBackIdx = new InlineProperty( ComparisonDefaultValue ); + + //Pass Stencil Op + [SerializeField] + private InlineProperty m_passStencilOpIdx = new InlineProperty( PassStencilOpDefaultValue ); + [SerializeField] + private InlineProperty m_passStencilOpBackIdx = new InlineProperty( PassStencilOpDefaultValue ); + + //Fail Stencil Op + [SerializeField] + private InlineProperty m_failStencilOpIdx = new InlineProperty( FailStencilOpDefaultValue ); + [SerializeField] + private InlineProperty m_failStencilOpBackIdx = new InlineProperty( FailStencilOpDefaultValue ); + + //ZFail Stencil Op + [SerializeField] + private InlineProperty m_zFailStencilOpIdx = new InlineProperty( ZFailStencilOpDefaultValue ); + [SerializeField] + private InlineProperty m_zFailStencilOpBackIdx = new InlineProperty( ZFailStencilOpDefaultValue ); + + public string CreateStencilOp( UndoParentNode owner ) + { + string result = "\t\tStencil\n\t\t{\n"; + result += string.Format( "\t\t\tRef {0}\n", m_refValue.GetValueOrProperty() ); + if( m_readMask.Active || m_readMask.IntValue != ReadMaskDefaultValue ) + { + result += string.Format( "\t\t\tReadMask {0}\n", m_readMask.GetValueOrProperty() ); + } + + if( m_writeMask.Active || m_writeMask.IntValue != WriteMaskDefaultValue ) + { + result += string.Format( "\t\t\tWriteMask {0}\n", m_writeMask.GetValueOrProperty() ); + } + + if( ( owner as StandardSurfaceOutputNode ).CurrentCullMode == CullMode.Off ) + { + if( m_comparisonFunctionIdx.IntValue != ComparisonDefaultValue || m_comparisonFunctionIdx.Active ) + result += string.Format( "\t\t\tCompFront {0}\n", m_comparisonFunctionIdx.GetValueOrProperty( StencilComparisonValues[ m_comparisonFunctionIdx.IntValue ] ) ); + if( m_passStencilOpIdx.IntValue != PassStencilOpDefaultValue || m_passStencilOpIdx.Active ) + result += string.Format( "\t\t\tPassFront {0}\n", m_passStencilOpIdx.GetValueOrProperty( StencilOpsValues[ m_passStencilOpIdx.IntValue ] ) ); + if( m_failStencilOpIdx.IntValue != FailStencilOpDefaultValue || m_failStencilOpIdx.Active ) + result += string.Format( "\t\t\tFailFront {0}\n", m_failStencilOpIdx.GetValueOrProperty( StencilOpsValues[ m_failStencilOpIdx.IntValue ] ) ); + if( m_zFailStencilOpIdx.IntValue != ZFailStencilOpDefaultValue || m_zFailStencilOpIdx.Active ) + result += string.Format( "\t\t\tZFailFront {0}\n", m_zFailStencilOpIdx.GetValueOrProperty( StencilOpsValues[ m_zFailStencilOpIdx.IntValue ] ) ); + + if( m_comparisonFunctionBackIdx.IntValue != ComparisonDefaultValue || m_comparisonFunctionBackIdx.Active ) + result += string.Format( "\t\t\tCompBack {0}\n", m_comparisonFunctionBackIdx.GetValueOrProperty( StencilComparisonValues[ m_comparisonFunctionBackIdx.IntValue ] ) ); + if( m_passStencilOpBackIdx.IntValue != PassStencilOpDefaultValue || m_passStencilOpBackIdx.Active ) + result += string.Format( "\t\t\tPassBack {0}\n", m_passStencilOpBackIdx.GetValueOrProperty( StencilOpsValues[ m_passStencilOpBackIdx.IntValue ] ) ); + if( m_failStencilOpBackIdx.IntValue != FailStencilOpDefaultValue || m_failStencilOpBackIdx.Active ) + result += string.Format( "\t\t\tFailBack {0}\n", m_failStencilOpBackIdx.GetValueOrProperty( StencilOpsValues[ m_failStencilOpBackIdx.IntValue ] ) ); + if( m_zFailStencilOpBackIdx.IntValue != ZFailStencilOpDefaultValue || m_zFailStencilOpBackIdx.Active ) + result += string.Format( "\t\t\tZFailBack {0}\n", m_zFailStencilOpBackIdx.GetValueOrProperty( StencilOpsValues[ m_zFailStencilOpBackIdx.IntValue ] ) ); + } + else + { + if( m_comparisonFunctionIdx.IntValue != ComparisonDefaultValue || m_comparisonFunctionIdx.Active ) + result += string.Format( "\t\t\tComp {0}\n", m_comparisonFunctionIdx.GetValueOrProperty( StencilComparisonValues[ m_comparisonFunctionIdx.IntValue ] ) ); + if( m_passStencilOpIdx.IntValue != PassStencilOpDefaultValue || m_passStencilOpIdx.Active ) + result += string.Format( "\t\t\tPass {0}\n", m_passStencilOpIdx.GetValueOrProperty( StencilOpsValues[ m_passStencilOpIdx.IntValue ] ) ); + if( m_failStencilOpIdx.IntValue != FailStencilOpDefaultValue || m_failStencilOpIdx.Active ) + result += string.Format( "\t\t\tFail {0}\n", m_failStencilOpIdx.GetValueOrProperty( StencilOpsValues[ m_failStencilOpIdx.IntValue ] ) ); + if( m_zFailStencilOpIdx.IntValue != ZFailStencilOpDefaultValue || m_zFailStencilOpIdx.Active ) + result += string.Format( "\t\t\tZFail {0}\n", m_zFailStencilOpIdx.GetValueOrProperty( StencilOpsValues[ m_zFailStencilOpIdx.IntValue ] ) ); + } + + + result += "\t\t}\n"; + return result; + } + + public void Draw( UndoParentNode owner ) + { + bool foldoutValue = owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedStencilOptions; + NodeUtils.DrawPropertyGroup( owner, ref foldoutValue, ref m_active, FoldoutLabelStr, () => + { + float cache = EditorGUIUtility.labelWidth; + float cache2 = EditorGUIUtility.fieldWidth; + EditorGUIUtility.labelWidth = 110; + EditorGUIUtility.fieldWidth = 30; + m_refValue.IntSlider( ref owner, ReferenceValueContent, 0, 255 ); + m_readMask.IntSlider( ref owner, ReadMaskContent, 0, 255 ); + m_writeMask.IntSlider( ref owner, WriteMaskContent, 0, 255 ); + //EditorGUIUtility.labelWidth = cache; + EditorGUIUtility.fieldWidth = cache2; + if( ( owner as StandardSurfaceOutputNode ).CurrentCullMode == CullMode.Off ) + { + m_comparisonFunctionIdx.EnumTypePopup( ref owner, ComparisonFrontStr, StencilComparisonLabels ); + m_passStencilOpIdx.EnumTypePopup( ref owner, PassFrontStr, StencilOpsLabels ); + m_failStencilOpIdx.EnumTypePopup( ref owner, FailFrontStr, StencilOpsLabels ); + m_zFailStencilOpIdx.EnumTypePopup( ref owner, ZFailFrontStr, StencilOpsLabels ); + EditorGUILayout.Separator(); + m_comparisonFunctionBackIdx.EnumTypePopup( ref owner, ComparisonBackStr, StencilComparisonLabels ); + m_passStencilOpBackIdx.EnumTypePopup( ref owner, PassBackStr, StencilOpsLabels ); + m_failStencilOpBackIdx.EnumTypePopup( ref owner, FailBackStr, StencilOpsLabels ); + m_zFailStencilOpBackIdx.EnumTypePopup( ref owner, ZFailBackStr, StencilOpsLabels ); + } + else + { + m_comparisonFunctionIdx.EnumTypePopup( ref owner, ComparisonStr, StencilComparisonLabels ); + m_passStencilOpIdx.EnumTypePopup( ref owner, PassFrontStr, StencilOpsLabels ); + m_failStencilOpIdx.EnumTypePopup( ref owner, FailFrontStr, StencilOpsLabels ); + m_zFailStencilOpIdx.EnumTypePopup( ref owner, ZFailFrontStr, StencilOpsLabels ); + } + EditorGUIUtility.labelWidth = cache; + } ); + owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedStencilOptions = foldoutValue; + } + + public void ReadFromString( ref uint index, ref string[] nodeParams ) + { + m_active = Convert.ToBoolean( nodeParams[ index++ ] ); + if( UIUtils.CurrentShaderVersion() > 14501 ) + { + m_refValue.ReadFromString( ref index, ref nodeParams ); + m_readMask.ReadFromString( ref index, ref nodeParams ); + m_writeMask.ReadFromString( ref index, ref nodeParams ); + m_comparisonFunctionIdx.ReadFromString( ref index, ref nodeParams ); + m_passStencilOpIdx.ReadFromString( ref index, ref nodeParams ); + m_failStencilOpIdx.ReadFromString( ref index, ref nodeParams ); + m_zFailStencilOpIdx.ReadFromString( ref index, ref nodeParams ); + } + else + { + m_refValue.IntValue = Convert.ToInt32( nodeParams[ index++ ] ); + m_readMask.IntValue = Convert.ToInt32( nodeParams[ index++ ] ); + m_writeMask.IntValue = Convert.ToInt32( nodeParams[ index++ ] ); + m_comparisonFunctionIdx.IntValue = Convert.ToInt32( nodeParams[ index++ ] ); + m_passStencilOpIdx.IntValue = Convert.ToInt32( nodeParams[ index++ ] ); + m_failStencilOpIdx.IntValue = Convert.ToInt32( nodeParams[ index++ ] ); + m_zFailStencilOpIdx.IntValue = Convert.ToInt32( nodeParams[ index++ ] ); + } + + if( UIUtils.CurrentShaderVersion() > 13203 ) + { + if( UIUtils.CurrentShaderVersion() > 14501 ) + { + m_comparisonFunctionBackIdx.ReadFromString( ref index, ref nodeParams ); + m_passStencilOpBackIdx.ReadFromString( ref index, ref nodeParams ); + m_failStencilOpBackIdx.ReadFromString( ref index, ref nodeParams ); + m_zFailStencilOpBackIdx.ReadFromString( ref index, ref nodeParams ); + } + else + { + m_comparisonFunctionBackIdx.IntValue = Convert.ToInt32( nodeParams[ index++ ] ); + m_passStencilOpBackIdx.IntValue = Convert.ToInt32( nodeParams[ index++ ] ); + m_failStencilOpBackIdx.IntValue = Convert.ToInt32( nodeParams[ index++ ] ); + m_zFailStencilOpBackIdx.IntValue = Convert.ToInt32( nodeParams[ index++ ] ); + } + } + } + + public void WriteToString( ref string nodeInfo ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_active ); + m_refValue.WriteToString( ref nodeInfo ); + m_readMask.WriteToString( ref nodeInfo ); + m_writeMask.WriteToString( ref nodeInfo ); + m_comparisonFunctionIdx.WriteToString( ref nodeInfo ); + m_passStencilOpIdx.WriteToString( ref nodeInfo ); + m_failStencilOpIdx.WriteToString( ref nodeInfo ); + m_zFailStencilOpIdx.WriteToString( ref nodeInfo ); + m_comparisonFunctionBackIdx.WriteToString( ref nodeInfo ); + m_passStencilOpBackIdx.WriteToString( ref nodeInfo ); + m_failStencilOpBackIdx.WriteToString( ref nodeInfo ); + m_zFailStencilOpBackIdx.WriteToString( ref nodeInfo ); + } + + public bool Active + { + get { return m_active; } + set { m_active = value; } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/StencilBufferOpHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/StencilBufferOpHelper.cs.meta new file mode 100644 index 0000000..6dc5518 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/StencilBufferOpHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0111d524dc809f14aa95e4e1ab93d37b +timeCreated: 1481126953 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/TerrainDrawInstancedHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/TerrainDrawInstancedHelper.cs new file mode 100644 index 0000000..00713e6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/TerrainDrawInstancedHelper.cs @@ -0,0 +1,375 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; + +using System; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class TerrainDrawInstancedHelper + { +#if UNITY_2018_1_OR_NEWER + private readonly string[] InstancedPragmas = + { + "multi_compile_instancing", + "instancing_options assumeuniformscaling nomatrices nolightprobe nolightmap forwardadd" + }; + + private readonly string[] InstancedGlobalsSRP = + { + "#ifdef UNITY_INSTANCING_ENABLED//ASE Terrain Instancing", + "\tTEXTURE2D(_TerrainHeightmapTexture);//ASE Terrain Instancing", + "\tTEXTURE2D( _TerrainNormalmapTexture);//ASE Terrain Instancing", + "\tSAMPLER(sampler_TerrainNormalmapTexture);//ASE Terrain Instancing", + "#endif//ASE Terrain Instancing", + "UNITY_INSTANCING_BUFFER_START( Terrain )//ASE Terrain Instancing", + "\tUNITY_DEFINE_INSTANCED_PROP( float4, _TerrainPatchInstanceData )//ASE Terrain Instancing", + "UNITY_INSTANCING_BUFFER_END( Terrain)//ASE Terrain Instancing", + "CBUFFER_START( UnityTerrain)//ASE Terrain Instancing", + "\t#ifdef UNITY_INSTANCING_ENABLED//ASE Terrain Instancing", + "\t\tfloat4 _TerrainHeightmapRecipSize;//ASE Terrain Instancing", + "\t\tfloat4 _TerrainHeightmapScale;//ASE Terrain Instancing", + "\t#endif//ASE Terrain Instancing", + "CBUFFER_END//ASE Terrain Instancing" + }; + + private readonly string[] InstancedGlobalsDefault = + { + "#ifdef UNITY_INSTANCING_ENABLED//ASE Terrain Instancing", + "\tsampler2D _TerrainHeightmapTexture;//ASE Terrain Instancing", + "\tsampler2D _TerrainNormalmapTexture;//ASE Terrain Instancing", + "#endif//ASE Terrain Instancing", + "UNITY_INSTANCING_BUFFER_START( Terrain )//ASE Terrain Instancing", + "\tUNITY_DEFINE_INSTANCED_PROP( float4, _TerrainPatchInstanceData )//ASE Terrain Instancing", + "UNITY_INSTANCING_BUFFER_END( Terrain)//ASE Terrain Instancing", + "CBUFFER_START( UnityTerrain)//ASE Terrain Instancing", + "\t#ifdef UNITY_INSTANCING_ENABLED//ASE Terrain Instancing", + "\t\tfloat4 _TerrainHeightmapRecipSize;//ASE Terrain Instancing", + "\t\tfloat4 _TerrainHeightmapScale;//ASE Terrain Instancing", + "\t#endif//ASE Terrain Instancing", + "CBUFFER_END//ASE Terrain Instancing" + }; + + + private readonly string ApplyMeshModificationInstruction = "{0} = ApplyMeshModification({0});"; + + private readonly string[] ApplyMeshModificationFunctionSRP = + { + /*0 - struct name 1 - var name*/"{0} ApplyMeshModification( {0} {1} )\n", + "{\n", + "#ifdef UNITY_INSTANCING_ENABLED\n", + /* 0 vertex position*/"\tfloat2 patchVertex = {0}.xy;\n", + "\tfloat4 instanceData = UNITY_ACCESS_INSTANCED_PROP( Terrain, _TerrainPatchInstanceData );\n", + "\tfloat2 sampleCoords = ( patchVertex.xy + instanceData.xy ) * instanceData.z;\n", + "\tfloat height = UnpackHeightmap( _TerrainHeightmapTexture.Load( int3( sampleCoords, 0 ) ) );\n", + /*0 - vertex position*/"\t{0}.xz = sampleCoords* _TerrainHeightmapScale.xz;\n", + /*0 - vertex position*/"\t{0}.y = height* _TerrainHeightmapScale.y;\n", + "\t#ifdef ENABLE_TERRAIN_PERPIXEL_NORMAL\n", + /* 0 - vertex normal*/"\t\t{0} = float3(0, 1, 0);\n", + "\t#else\n", + /* 0 - vertex normal*/"\t\t{0} = _TerrainNormalmapTexture.Load(int3(sampleCoords, 0)).rgb* 2 - 1;\n", + "\t#endif\n", + "",//"#ifdef ENABLE_TERRAIN_PERPIXEL_NORMAL\n", + "",///* 0 - tex coord*/"\t{0}.xy = sampleCoords;\n", + "",//"#else\n", + /* 0 - tex coord*/"\t{0}.xy = sampleCoords* _TerrainHeightmapRecipSize.zw;\n", + "",//"#endif\n", + "#endif\n", + /* 0 - var name*/"\treturn {0};\n", + "}\n" + }; + //{ + // /*0 - struct name 1 - var name*/"{0} ApplyMeshModification( {0} {1} )\n", + // "{\n", + // "#ifdef UNITY_INSTANCING_ENABLED\n", + // /* 0 vertex position*/"\tfloat2 patchVertex = {0}.xy;\n", + // "\t\tfloat4 instanceData = UNITY_ACCESS_INSTANCED_PROP( Terrain, _TerrainPatchInstanceData );\n", + // "\t\tfloat2 sampleCoords = ( patchVertex.xy + instanceData.xy ) * instanceData.z;\n", + // "\t\tfloat height = UnpackHeightmap( _TerrainHeightmapTexture.Load( int3( sampleCoords, 0 ) ) );\n", + // /*0 - vertex position*/"\t\t{0}.xz = sampleCoords* _TerrainHeightmapScale.xz;\n", + // /*0 - vertex position*/"\t\t{0}.y = height* _TerrainHeightmapScale.y;\n", + // "# ifdef ATTRIBUTES_NEED_NORMAL\n", + // /* 0 - vertex normal*/"\t\t{0} = _TerrainNormalmapTexture.Load(int3(sampleCoords, 0)).rgb* 2 - 1;\n", + // "\t#endif\n", + // "\t#if defined(VARYINGS_NEED_TEXCOORD0) || defined(VARYINGS_DS_NEED_TEXCOORD0)\n", + // "\t\t#ifdef ENABLE_TERRAIN_PERPIXEL_NORMAL\n", + // /* 0 - tex coord*/"\t\t\t{0} = sampleCoords;\n", + // "\t\t#else\n", + // /* 0 - tex coord*/"\t\t\t{0}.xy = sampleCoords* _TerrainHeightmapRecipSize.zw;\n", + // "\t\t#endif\n", + // "\t#endif\n", + // "#endif\n", + // "#ifdef ATTRIBUTES_NEED_TANGENT\n", + // /* 0 - tangent 1 - normal*/"\t\t{0}.xyz = cross( {1}, float3(0, 0, 1));\n", + // /*0 - tangent*/"\t{0}.w = -1;\n", + // "#endif\n", + // /* 0 - var name*/"\treturn {0};\n", + // "}\n" + //}; + + + + private readonly string[] ApplyMeshModificationFunctionDefaultTemplate = + { + /* 0 vertex struct */"{0} ApplyMeshModification( {0} {1} )", + "{\n", + "#ifdef UNITY_INSTANCING_ENABLED\n", + /*0 - vertex pos*/"\tfloat2 patchVertex = {0}.xy;\n", + "\tfloat4 instanceData = UNITY_ACCESS_INSTANCED_PROP( Terrain, _TerrainPatchInstanceData );\n", + "\tfloat2 sampleCoords = ( patchVertex.xy + instanceData.xy ) * instanceData.z;\n", + /* 0 - tex coords*/"\t{0} = float4( sampleCoords.xy * _TerrainHeightmapRecipSize.z, 0, 0 );\n", + /* 0 - tex coords*/"\tfloat height = UnpackHeightmap( tex2Dlod( _TerrainHeightmapTexture, {0} ) );\n", + /* 0 - vertex pos*/"\t{0}.xz = sampleCoords * _TerrainHeightmapScale.xz;\n", + /* 0 - vertex pos*/"\t{0}.y = height * _TerrainHeightmapScale.y;\n", + /* 0 - normal 1 - tex coord*/"\t{0} = tex2Dlod( _TerrainNormalmapTexture, {1} ).rgb * 2 - 1;\n", + "#endif\n", + /* var name*/"return {0};\n", + "}\n" + }; + + private readonly string ApplyMeshModificationInstructionStandard = "ApplyMeshModification({0});"; + private readonly string[] ApplyMeshModificationFunctionStandard = + { + "void ApplyMeshModification( inout {0} v )", + "#if defined(UNITY_INSTANCING_ENABLED) && !defined(SHADER_API_D3D11_9X)", + "\tfloat2 patchVertex = v.vertex.xy;", + "\tfloat4 instanceData = UNITY_ACCESS_INSTANCED_PROP(Terrain, _TerrainPatchInstanceData);", + "\t", + "\tfloat4 uvscale = instanceData.z * _TerrainHeightmapRecipSize;", + "\tfloat4 uvoffset = instanceData.xyxy * uvscale;", + "\tuvoffset.xy += 0.5f * _TerrainHeightmapRecipSize.xy;", + "\tfloat2 sampleCoords = (patchVertex.xy * uvscale.xy + uvoffset.xy);", + "\t", + "\tfloat hm = UnpackHeightmap(tex2Dlod(_TerrainHeightmapTexture, float4(sampleCoords, 0, 0)));", + "\tv.vertex.xz = (patchVertex.xy + instanceData.xy) * _TerrainHeightmapScale.xz * instanceData.z;", + "\tv.vertex.y = hm * _TerrainHeightmapScale.y;", + "\tv.vertex.w = 1.0f;", + "\t", + "\tv.texcoord.xy = (patchVertex.xy * uvscale.zw + uvoffset.zw);", + "\tv.texcoord3 = v.texcoord2 = v.texcoord1 = v.texcoord;", + "\t", + "\t#ifdef TERRAIN_INSTANCED_PERPIXEL_NORMAL", + "\t\tv.normal = float3(0, 1, 0);", + "\t\t//data.tc.zw = sampleCoords;", + "\t#else", + "\t\tfloat3 nor = tex2Dlod(_TerrainNormalmapTexture, float4(sampleCoords, 0, 0)).xyz;", + "\t\tv.normal = 2.0f * nor - 1.0f;", + "\t#endif", + "#endif", + }; + private readonly string[] AdditionalUsePasses = + { + "Hidden/Nature/Terrain/Utilities/PICKING", + "Hidden/Nature/Terrain/Utilities/SELECTION" + }; + private readonly string DrawInstancedLabel = "Instanced Terrain"; +#endif + [SerializeField] + private bool m_enable = false; + + public void Draw( UndoParentNode owner ) + { +#if UNITY_2018_1_OR_NEWER + m_enable = owner.EditorGUILayoutToggle( DrawInstancedLabel, m_enable ); +#endif + } + + public void UpdateDataCollectorForTemplates( ref MasterNodeDataCollector dataCollector, ref List vertexInstructions ) + { +#if UNITY_2018_1_OR_NEWER + if( m_enable ) + { + for( int i = 0; i < AdditionalUsePasses.Length; i++ ) + { + dataCollector.AddUsePass( AdditionalUsePasses[ i ], false ); + } + + for( int i = 0; i < InstancedPragmas.Length; i++ ) + { + dataCollector.AddToPragmas( -1, InstancedPragmas[ i ] ); + } + + if( dataCollector.IsSRP ) + { + + TemplateFunctionData functionData = dataCollector.TemplateDataCollectorInstance.CurrentTemplateData.VertexFunctionData; + string uvCoord = dataCollector.TemplateDataCollectorInstance.GetUV( 0, MasterNodePortCategory.Vertex ); + string vertexNormal = dataCollector.TemplateDataCollectorInstance.GetVertexNormal( PrecisionType.Float, false, MasterNodePortCategory.Vertex ); + //string vertexTangent = dataCollector.TemplateDataCollectorInstance.GetVertexTangent( WirePortDataType.FLOAT4, PrecisionType.Float, false, MasterNodePortCategory.Vertex ); + string vertexPos = dataCollector.TemplateDataCollectorInstance.GetVertexPosition( WirePortDataType.OBJECT, PrecisionType.Float, false, MasterNodePortCategory.Vertex ); + + string functionHeader = string.Format( ApplyMeshModificationFunctionSRP[ 0 ], functionData.InVarType, functionData.InVarName ); + + //string functionBody = functionHeader + + // ApplyMeshModificationFunctionSRP[ 1 ] + + // ApplyMeshModificationFunctionSRP[ 2 ] + + // string.Format( ApplyMeshModificationFunctionSRP[ 3 ], vertexPos ) + + // ApplyMeshModificationFunctionSRP[ 4 ] + + // ApplyMeshModificationFunctionSRP[ 5 ] + + // ApplyMeshModificationFunctionSRP[ 6 ] + + // string.Format( ApplyMeshModificationFunctionSRP[ 7 ], vertexPos ) + + // string.Format( ApplyMeshModificationFunctionSRP[ 8 ], vertexPos ) + + // ApplyMeshModificationFunctionSRP[ 9 ] + + // string.Format( ApplyMeshModificationFunctionSRP[ 10 ], vertexNormal ) + + // ApplyMeshModificationFunctionSRP[ 11 ] + + // ApplyMeshModificationFunctionSRP[ 12 ] + + // ApplyMeshModificationFunctionSRP[ 13 ] + + // string.Format( ApplyMeshModificationFunctionSRP[ 14 ], uvCoord ) + + // ApplyMeshModificationFunctionSRP[ 15 ] + + // string.Format( ApplyMeshModificationFunctionSRP[ 16 ], uvCoord ) + + // ApplyMeshModificationFunctionSRP[ 17 ] + + // ApplyMeshModificationFunctionSRP[ 18 ] + + // ApplyMeshModificationFunctionSRP[ 19 ] + + // ApplyMeshModificationFunctionSRP[ 20 ] + + // string.Format( ApplyMeshModificationFunctionSRP[ 21 ], vertexTangent, vertexNormal ) + + // string.Format( ApplyMeshModificationFunctionSRP[ 22 ], vertexTangent ) + + // ApplyMeshModificationFunctionSRP[ 23 ] + + // string.Format( ApplyMeshModificationFunctionSRP[ 24 ], functionData.InVarName ) + + // ApplyMeshModificationFunctionSRP[ 25 ]; + string functionBody = functionHeader + + ApplyMeshModificationFunctionSRP[ 1 ] + + ApplyMeshModificationFunctionSRP[ 2 ] + + string.Format( ApplyMeshModificationFunctionSRP[ 3 ], vertexPos ) + + ApplyMeshModificationFunctionSRP[ 4 ] + + ApplyMeshModificationFunctionSRP[ 5 ] + + ApplyMeshModificationFunctionSRP[ 6 ] + + string.Format( ApplyMeshModificationFunctionSRP[ 7 ], vertexPos ) + + string.Format( ApplyMeshModificationFunctionSRP[ 8 ], vertexPos ) + + ApplyMeshModificationFunctionSRP[ 9 ] + + string.Format( ApplyMeshModificationFunctionSRP[ 10 ], vertexNormal ) + + ApplyMeshModificationFunctionSRP[ 11 ] + + string.Format( ApplyMeshModificationFunctionSRP[ 12 ], vertexNormal ) + + ApplyMeshModificationFunctionSRP[ 13 ] + + ApplyMeshModificationFunctionSRP[ 14 ] + + string.Format( ApplyMeshModificationFunctionSRP[ 15 ], uvCoord ) + + ApplyMeshModificationFunctionSRP[ 16 ] + + string.Format( ApplyMeshModificationFunctionSRP[ 17 ], uvCoord ) + + ApplyMeshModificationFunctionSRP[ 18 ] + + ApplyMeshModificationFunctionSRP[ 19 ] + + string.Format( ApplyMeshModificationFunctionSRP[ 20 ], functionData.InVarName ) + + ApplyMeshModificationFunctionSRP[ 21 ]; + dataCollector.AddFunction( functionHeader, functionBody ); + + for( int i = 0; i < InstancedGlobalsSRP.Length; i++ ) + { + dataCollector.AddToUniforms( -1, InstancedGlobalsSRP[ i ] ); + } + + + string vertexVarName = dataCollector.TemplateDataCollectorInstance.CurrentTemplateData.VertexFunctionData.InVarName; + vertexInstructions.Insert( 0, string.Format( ApplyMeshModificationInstruction, vertexVarName ) ); + } + else + { + TemplateFunctionData functionData = dataCollector.TemplateDataCollectorInstance.CurrentTemplateData.VertexFunctionData; + + string uvCoord = dataCollector.TemplateDataCollectorInstance.GetUV( 0, MasterNodePortCategory.Vertex ); + string vertexNormal = dataCollector.TemplateDataCollectorInstance.GetVertexNormal( PrecisionType.Float, false, MasterNodePortCategory.Vertex ); + string vertexPos = dataCollector.TemplateDataCollectorInstance.GetVertexPosition( WirePortDataType.OBJECT, PrecisionType.Float, false, MasterNodePortCategory.Vertex ); + + string functionHeader = string.Format( ApplyMeshModificationFunctionDefaultTemplate[ 0 ], functionData.InVarType, functionData.InVarName ); + string functionBody = functionHeader + + ApplyMeshModificationFunctionDefaultTemplate[ 1 ] + + ApplyMeshModificationFunctionDefaultTemplate[ 2 ] + + string.Format( ApplyMeshModificationFunctionDefaultTemplate[ 3 ], vertexPos ) + + ApplyMeshModificationFunctionDefaultTemplate[ 4 ] + + ApplyMeshModificationFunctionDefaultTemplate[ 5 ] + + string.Format( ApplyMeshModificationFunctionDefaultTemplate[ 6 ], uvCoord ) + + string.Format( ApplyMeshModificationFunctionDefaultTemplate[ 7 ], uvCoord ) + + string.Format( ApplyMeshModificationFunctionDefaultTemplate[ 8 ], vertexPos ) + + string.Format( ApplyMeshModificationFunctionDefaultTemplate[ 9 ], vertexPos ) + + string.Format( ApplyMeshModificationFunctionDefaultTemplate[ 10 ], vertexNormal, uvCoord ) + + ApplyMeshModificationFunctionDefaultTemplate[ 11 ] + + string.Format( ApplyMeshModificationFunctionDefaultTemplate[ 12 ], functionData.InVarName ) + + ApplyMeshModificationFunctionDefaultTemplate[ 13 ]; + + + dataCollector.AddFunction( functionHeader, functionBody ); + for( int i = 0; i < InstancedGlobalsDefault.Length; i++ ) + { + dataCollector.AddToUniforms( -1, InstancedGlobalsDefault[ i ] ); + } + + + string vertexVarName = dataCollector.TemplateDataCollectorInstance.CurrentTemplateData.VertexFunctionData.InVarName; + vertexInstructions.Insert( 0, string.Format( ApplyMeshModificationInstruction, vertexVarName ) ); + + } + } +#endif + } + + public void UpdateDataCollectorForStandard( ref MasterNodeDataCollector dataCollector ) + { +#if UNITY_2018_1_OR_NEWER + if( m_enable ) + { + for( int i = 0; i < AdditionalUsePasses.Length; i++ ) + { + dataCollector.AddUsePass( AdditionalUsePasses[ i ], false ); + } + + for( int i = 0; i < InstancedPragmas.Length; i++ ) + { + dataCollector.AddToPragmas( -1, InstancedPragmas[ i ] ); + } + string functionBody = string.Empty; + + string functionHeader = string.Format( ApplyMeshModificationFunctionStandard[ 0 ], dataCollector.SurfaceVertexStructure ); + IOUtils.AddFunctionHeader( ref functionBody, functionHeader ); + for( int i = 1; i < ApplyMeshModificationFunctionStandard.Length; i++ ) + { + IOUtils.AddFunctionLine( ref functionBody, ApplyMeshModificationFunctionStandard[ i ] ); + } + IOUtils.CloseFunctionBody( ref functionBody ); + + //string inputName = "input"; + //string uvCoord = "input.texcoord"; + //string vertexNormal = "input.normal"; + //string vertexPos = "input.vertex"; + + //string functionHeader = string.Format( ApplyMeshModificationFunctionDefaultTemplate[ 0 ], dataCollector.SurfaceVertexStructure, inputName ); + //IOUtils.AddFunctionHeader( ref functionBody, functionHeader ); + //IOUtils.AddFunctionLine( ref functionBody, ApplyMeshModificationFunctionDefaultTemplate[ 1 ] ); + //IOUtils.AddFunctionLine( ref functionBody,ApplyMeshModificationFunctionDefaultTemplate[ 2 ] ); + //IOUtils.AddFunctionLine( ref functionBody,string.Format( ApplyMeshModificationFunctionDefaultTemplate[ 3 ], vertexPos ) ); + //IOUtils.AddFunctionLine( ref functionBody,ApplyMeshModificationFunctionDefaultTemplate[ 4 ] ); + //IOUtils.AddFunctionLine( ref functionBody,ApplyMeshModificationFunctionDefaultTemplate[ 5 ] ); + //IOUtils.AddFunctionLine( ref functionBody,string.Format( ApplyMeshModificationFunctionDefaultTemplate[ 6 ], uvCoord ) ); + //IOUtils.AddFunctionLine( ref functionBody,string.Format( ApplyMeshModificationFunctionDefaultTemplate[ 7 ], uvCoord ) ); + //IOUtils.AddFunctionLine( ref functionBody,string.Format( ApplyMeshModificationFunctionDefaultTemplate[ 8 ], vertexPos ) ); + //IOUtils.AddFunctionLine( ref functionBody,string.Format( ApplyMeshModificationFunctionDefaultTemplate[ 9 ], vertexPos ) ); + //IOUtils.AddFunctionLine( ref functionBody,string.Format( ApplyMeshModificationFunctionDefaultTemplate[ 10 ], vertexNormal, uvCoord ) ); + //IOUtils.AddFunctionLine( ref functionBody,ApplyMeshModificationFunctionDefaultTemplate[ 11 ] ); + //IOUtils.AddFunctionLine( ref functionBody,string.Format( ApplyMeshModificationFunctionDefaultTemplate[ 12 ], inputName ) ); + //IOUtils.AddFunctionLine( ref functionBody, ApplyMeshModificationFunctionDefaultTemplate[ 13 ] ); + //IOUtils.CloseFunctionBody( ref functionBody ); + + dataCollector.AddFunction( functionHeader, functionBody ); + for( int i = 0; i < InstancedGlobalsDefault.Length; i++ ) + { + dataCollector.AddToUniforms( -1, InstancedGlobalsDefault[ i ] ); + } + + dataCollector.AddVertexInstruction( string.Format( ApplyMeshModificationInstructionStandard, "v" ) ); + } +#endif + } + + public void ReadFromString( ref uint index, ref string[] nodeParams ) + { + m_enable = Convert.ToBoolean( nodeParams[ index++ ] ); + } + + public void WriteToString( ref string nodeInfo ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_enable ); + } + + public bool Enabled { get { return m_enable; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/TerrainDrawInstancedHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/TerrainDrawInstancedHelper.cs.meta new file mode 100644 index 0000000..9580ad0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/TerrainDrawInstancedHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 935c69709205e1c4dbd54da410518cc6 +timeCreated: 1548263010 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/TessellationOpHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/TessellationOpHelper.cs new file mode 100644 index 0000000..38d38f0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/TessellationOpHelper.cs @@ -0,0 +1,642 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + public sealed class TessellationOpHelper + { + public const string TessellationPortStr = "Tessellation"; + + + public const string TessSurfParam = "tessellate:tessFunction"; + public const string TessInclude = "Tessellation.cginc"; + //public const string CustomAppData = "\t\tstruct appdata\n" + + // "\t\t{\n" + + // "\t\t\tfloat4 vertex : POSITION;\n" + + // "\t\t\tfloat4 tangent : TANGENT;\n" + + // "\t\t\tfloat3 normal : NORMAL;\n" + + // "\t\t\tfloat4 texcoord : TEXCOORD0;\n" + + // "\t\t\tfloat4 texcoord1 : TEXCOORD1;\n" + + // "\t\t\tfloat4 texcoord2 : TEXCOORD2;\n" + + // "\t\t\tfloat4 texcoord3 : TEXCOORD3;\n" + + // "\t\t\tfixed4 color : COLOR;\n" + + // "\t\t\tUNITY_VERTEX_INPUT_INSTANCE_ID\n" + + // "\t\t};\n\n"; + + + + private const string TessUniformName = "_TessValue"; + private const string TessMinUniformName = "_TessMin"; + private const string TessMaxUniformName = "_TessMax"; + + //private GUIContent EnableTessContent = new GUIContent( "Tessellation", "Activates the use of tessellation which subdivides polygons to increase geometry detail using a set of rules\nDefault: OFF" ); + private GUIContent TessFactorContent = new GUIContent( "Tess", "Tessellation factor\nDefault: 4" ); + private GUIContent TessMinDistanceContent = new GUIContent( "Min", "Minimum tessellation distance\nDefault: 10" ); + private GUIContent TessMaxDistanceContent = new GUIContent( "Max", "Maximum tessellation distance\nDefault: 25" ); + + + private readonly int[] TesselationTypeValues = { 0, 1, 2, 3 }; + private readonly string[] TesselationTypeLabels = { "Distance-based", "Fixed", "Edge Length", "Edge Length Cull" }; + private readonly string TesselationTypeStr = "Type"; + + private const string TessProperty = "_TessValue( \"Max Tessellation\", Range( 1, 32 ) ) = {0}"; + private const string TessMinProperty = "_TessMin( \"Tess Min Distance\", Float ) = {0}"; + private const string TessMaxProperty = "_TessMax( \"Tess Max Distance\", Float ) = {0}"; + + private const string TessFunctionOpen = "\t\tfloat4 tessFunction( appdata_full v0, appdata_full v1, appdata_full v2 )\n\t\t{\n"; + private const string TessFunctionClose = "\t\t}\n"; + + // Custom function + private const string CustomFunctionBody = "\t\t\treturn {0};\n"; + + // Distance based function + private const string DistBasedTessFunctionBody = "\t\t\treturn UnityDistanceBasedTess( v0.vertex, v1.vertex, v2.vertex, _TessMin, _TessMax, _TessValue );\n"; + + // Fixed amount function + private const string FixedAmountTessFunctionOpen = "\t\tfloat4 tessFunction( )\n\t\t{\n"; + private const string FixedAmountTessFunctionBody = "\t\t\treturn _TessValue;\n"; + + // Edge Length + private GUIContent EdgeLengthContent = new GUIContent( "Edge Length", "Tessellation levels ccomputed based on triangle edge length on the screen\nDefault: 4" ); + private const string EdgeLengthTessProperty = "_EdgeLength ( \"Edge length\", Range( 2, 50 ) ) = {0}"; + private const string EdgeLengthTessUniformName = "_EdgeLength"; + + private const string EdgeLengthTessFunctionBody = "\t\t\treturn UnityEdgeLengthBasedTess (v0.vertex, v1.vertex, v2.vertex, _EdgeLength);\n"; + private const string EdgeLengthTessCullFunctionBody = "\t\t\treturn UnityEdgeLengthBasedTessCull (v0.vertex, v1.vertex, v2.vertex, _EdgeLength , _TessMaxDisp );\n"; + + + private const string EdgeLengthTessMaxDispProperty = "_TessMaxDisp( \"Max Displacement\", Float ) = {0}"; + private const string EdgeLengthTessMaxDispUniformName = "_TessMaxDisp"; + private GUIContent EdgeLengthTessMaxDisplacementContent = new GUIContent( "Max Disp.", "Max Displacement" ); + + // Phong + private GUIContent PhongEnableContent = new GUIContent( "Phong", "Modifies positions of the subdivided faces so that the resulting surface follows the mesh normals a bit\nDefault: OFF" ); + private GUIContent PhongStrengthContent = new GUIContent( "Strength", "Strength\nDefault: 0.5" ); + public const string PhongStrengthParam = "tessphong:_TessPhongStrength"; + + private const string PhongStrengthProperty = "_TessPhongStrength( \"Phong Tess Strength\", Range( 0, 1 ) ) = {0}"; + private const string PhongStrengthUniformName = "_TessPhongStrength"; + + [SerializeField] + private bool m_enabled = false; + + //private bool m_expanded = false; + + [SerializeField] + private int m_tessType = 2; + + [SerializeField] + private float m_tessMinDistance = 10f; + + [SerializeField] + private float m_tessMaxDistance = 25f; + + [SerializeField] + private float m_tessFactor = 15f; + + [SerializeField] + private float m_phongStrength = 0.5f; + + [SerializeField] + private bool m_phongEnabled = false; + + [SerializeField] + private string[] m_customData = { string.Empty, string.Empty, string.Empty }; + + [SerializeField] + private bool m_hasCustomFunction = false; + + [SerializeField] + private string m_customFunction = String.Empty; + + [SerializeField] + private string m_additionalData = string.Empty; + + [SerializeField] + private StandardSurfaceOutputNode m_parentSurface; + + private Dictionary m_additionalDataDict = new Dictionary(); + + private int m_masterNodeIndexPort = 0; + private int m_vertexOffsetIndexPort = 0; + //private int m_orderIndex = 1000; + + public void Draw( UndoParentNode owner, GUIStyle toolbarstyle, Material mat, bool connectedInput ) + { + Color cachedColor = GUI.color; + GUI.color = new Color( cachedColor.r, cachedColor.g, cachedColor.b, 0.5f ); + EditorGUILayout.BeginHorizontal( toolbarstyle ); + GUI.color = cachedColor; + EditorGUI.BeginChangeCheck(); + m_parentSurface.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedTesselation = GUILayout.Toggle( m_parentSurface.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedTesselation, " Tessellation", UIUtils.MenuItemToggleStyle, GUILayout.ExpandWidth( true ) ); + if ( EditorGUI.EndChangeCheck() ) + { + EditorPrefs.SetBool( "ExpandedTesselation", m_parentSurface.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedTesselation ); + } + + EditorGUI.BeginChangeCheck(); + m_enabled = owner.EditorGUILayoutToggle( string.Empty, m_enabled, UIUtils.MenuItemEnableStyle, GUILayout.Width( 16 ) ); + if ( EditorGUI.EndChangeCheck() ) + { + if ( m_enabled ) + UpdateToMaterial( mat, !connectedInput ); + + UIUtils.RequestSave(); + } + + EditorGUILayout.EndHorizontal(); + + m_enabled = m_enabled || connectedInput; + + if ( m_parentSurface.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedTesselation ) + { + cachedColor = GUI.color; + GUI.color = new Color( cachedColor.r, cachedColor.g, cachedColor.b, ( EditorGUIUtility.isProSkin ? 0.5f : 0.25f ) ); + EditorGUILayout.BeginVertical( UIUtils.MenuItemBackgroundStyle ); + GUI.color = cachedColor; + + EditorGUILayout.Separator(); + EditorGUI.BeginDisabledGroup( !m_enabled ); + + EditorGUI.indentLevel += 1; + + m_phongEnabled = owner.EditorGUILayoutToggle( PhongEnableContent, m_phongEnabled ); + if ( m_phongEnabled ) + { + EditorGUI.indentLevel += 1; + EditorGUI.BeginChangeCheck(); + m_phongStrength = owner.EditorGUILayoutSlider( PhongStrengthContent, m_phongStrength, 0.0f, 1.0f ); + if ( EditorGUI.EndChangeCheck() && mat != null ) + { + if ( mat.HasProperty( PhongStrengthUniformName ) ) + mat.SetFloat( PhongStrengthUniformName, m_phongStrength ); + } + + EditorGUI.indentLevel -= 1; + } + + bool guiEnabled = GUI.enabled; + GUI.enabled = !connectedInput && m_enabled; + + m_tessType = owner.EditorGUILayoutIntPopup( TesselationTypeStr, m_tessType, TesselationTypeLabels, TesselationTypeValues ); + + switch ( m_tessType ) + { + case 0: + { + EditorGUI.BeginChangeCheck(); + m_tessFactor = owner.EditorGUILayoutSlider( TessFactorContent, m_tessFactor, 1, 32 ); + if ( EditorGUI.EndChangeCheck() && mat != null ) + { + if ( mat.HasProperty( TessUniformName ) ) + mat.SetFloat( TessUniformName, m_tessFactor ); + } + + EditorGUI.BeginChangeCheck(); + m_tessMinDistance = owner.EditorGUILayoutFloatField( TessMinDistanceContent, m_tessMinDistance ); + if ( EditorGUI.EndChangeCheck() && mat != null ) + { + if ( mat.HasProperty( TessMinUniformName ) ) + mat.SetFloat( TessMinUniformName, m_tessMinDistance ); + } + + EditorGUI.BeginChangeCheck(); + m_tessMaxDistance = owner.EditorGUILayoutFloatField( TessMaxDistanceContent, m_tessMaxDistance ); + if ( EditorGUI.EndChangeCheck() && mat != null ) + { + if ( mat.HasProperty( TessMaxUniformName ) ) + mat.SetFloat( TessMaxUniformName, m_tessMaxDistance ); + } + } + break; + case 1: + { + EditorGUI.BeginChangeCheck(); + m_tessFactor = owner.EditorGUILayoutSlider( TessFactorContent, m_tessFactor, 1, 32 ); + if ( EditorGUI.EndChangeCheck() && mat != null ) + { + if ( mat.HasProperty( TessUniformName ) ) + mat.SetFloat( TessUniformName, m_tessFactor ); + } + } + break; + case 2: + { + EditorGUI.BeginChangeCheck(); + m_tessFactor = owner.EditorGUILayoutSlider( EdgeLengthContent, m_tessFactor, 2, 50 ); + if ( EditorGUI.EndChangeCheck() && mat != null ) + { + if ( mat.HasProperty( EdgeLengthTessUniformName ) ) + mat.SetFloat( EdgeLengthTessUniformName, m_tessFactor ); + } + } + break; + case 3: + { + EditorGUI.BeginChangeCheck(); + m_tessFactor = owner.EditorGUILayoutSlider( EdgeLengthContent, m_tessFactor, 2, 50 ); + if ( EditorGUI.EndChangeCheck() && mat != null ) + { + if ( mat.HasProperty( EdgeLengthTessUniformName ) ) + mat.SetFloat( EdgeLengthTessUniformName, m_tessFactor ); + } + + EditorGUI.BeginChangeCheck(); + m_tessMaxDistance = owner.EditorGUILayoutFloatField( EdgeLengthTessMaxDisplacementContent, m_tessMaxDistance ); + if ( EditorGUI.EndChangeCheck() && mat != null ) + { + if ( mat.HasProperty( TessMinUniformName ) ) + mat.SetFloat( TessMinUniformName, m_tessMaxDistance ); + } + } + break; + } + GUI.enabled = guiEnabled; + EditorGUI.indentLevel -= 1; + EditorGUI.EndDisabledGroup(); + EditorGUILayout.Separator(); + EditorGUILayout.EndVertical(); + } + } + + public void UpdateToMaterial( Material mat, bool updateInternals ) + { + if ( mat == null ) + return; + + if ( m_phongEnabled ) + { + if ( mat.HasProperty( PhongStrengthUniformName ) ) + mat.SetFloat( PhongStrengthUniformName, m_phongStrength ); + } + + if ( updateInternals ) + { + switch ( m_tessType ) + { + case 0: + { + if ( mat.HasProperty( TessUniformName ) ) + mat.SetFloat( TessUniformName, m_tessFactor ); + + if ( mat.HasProperty( TessMinUniformName ) ) + mat.SetFloat( TessMinUniformName, m_tessMinDistance ); + + if ( mat.HasProperty( TessMaxUniformName ) ) + mat.SetFloat( TessMaxUniformName, m_tessMaxDistance ); + } + break; + case 1: + { + if ( mat.HasProperty( TessUniformName ) ) + mat.SetFloat( TessUniformName, m_tessFactor ); + } + break; + case 2: + { + + if ( mat.HasProperty( EdgeLengthTessUniformName ) ) + mat.SetFloat( EdgeLengthTessUniformName, m_tessFactor ); + } + break; + case 3: + { + if ( mat.HasProperty( EdgeLengthTessUniformName ) ) + mat.SetFloat( EdgeLengthTessUniformName, m_tessFactor ); + + if ( mat.HasProperty( TessMinUniformName ) ) + mat.SetFloat( TessMinUniformName, m_tessMaxDistance ); + } + break; + } + } + } + public void ReadFromString( ref uint index, ref string[] nodeParams ) + { + m_enabled = Convert.ToBoolean( nodeParams[ index++ ] ); + m_tessType = Convert.ToInt32( nodeParams[ index++ ] ); + m_tessFactor = Convert.ToSingle( nodeParams[ index++ ] ); + m_tessMinDistance = Convert.ToSingle( nodeParams[ index++ ] ); + m_tessMaxDistance = Convert.ToSingle( nodeParams[ index++ ] ); + if ( UIUtils.CurrentShaderVersion() > 3001 ) + { + m_phongEnabled = Convert.ToBoolean( nodeParams[ index++ ] ); + m_phongStrength = Convert.ToSingle( nodeParams[ index++ ] ); + } + } + + public void WriteToString( ref string nodeInfo ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_enabled ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_tessType ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_tessFactor ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_tessMinDistance ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_tessMaxDistance ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_phongEnabled ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_phongStrength ); + } + + public string Uniforms() + { + string uniforms = string.Empty; + switch( m_tessType ) + { + case 0: + { + if( !m_hasCustomFunction ) + { + + //Tess + uniforms += "\t\tuniform " + UIUtils.PrecisionWirePortToCgType( PrecisionType.Float, WirePortDataType.FLOAT ) + " " + TessUniformName + ";\n"; + + //Min + uniforms += "\t\tuniform " + UIUtils.PrecisionWirePortToCgType( PrecisionType.Float, WirePortDataType.FLOAT ) + " " + TessMinUniformName + ";\n"; + + //Max + uniforms += "\t\tuniform " + UIUtils.PrecisionWirePortToCgType( PrecisionType.Float, WirePortDataType.FLOAT ) + " " + TessMaxUniformName + ";\n"; + } + } + break; + case 1: + //Tess + if( !m_hasCustomFunction ) + { + uniforms += "\t\tuniform " + UIUtils.PrecisionWirePortToCgType( PrecisionType.Float, WirePortDataType.FLOAT ) + " " + TessUniformName + ";\n"; + } + break; + } + + if( m_phongEnabled ) + { + uniforms += "\t\tuniform " + UIUtils.PrecisionWirePortToCgType( PrecisionType.Float, WirePortDataType.FLOAT ) + " " + PhongStrengthUniformName + ";\n" ; + } + + return uniforms; + } + + public void AddToDataCollector( ref MasterNodeDataCollector dataCollector, int reorder ) + { + int orderIndex = reorder; + switch ( m_tessType ) + { + case 0: + { + dataCollector.AddToIncludes( -1, TessellationOpHelper.TessInclude ); + if ( !m_hasCustomFunction ) + { + //Tess + dataCollector.AddToProperties( -1, string.Format( TessProperty, m_tessFactor ), orderIndex++ ); + dataCollector.AddToUniforms( -1, "uniform " + UIUtils.PrecisionWirePortToCgType( PrecisionType.Float, WirePortDataType.FLOAT ) + " " + TessUniformName + ";" ); + + //Min + dataCollector.AddToProperties( -1, string.Format( TessMinProperty, m_tessMinDistance ), orderIndex++ ); + dataCollector.AddToUniforms( -1, "uniform " + UIUtils.PrecisionWirePortToCgType( PrecisionType.Float, WirePortDataType.FLOAT ) + " " + TessMinUniformName + ";" ); + + //Max + dataCollector.AddToProperties( -1, string.Format( TessMaxProperty, m_tessMaxDistance ), orderIndex++ ); + dataCollector.AddToUniforms( -1, "uniform " + UIUtils.PrecisionWirePortToCgType( PrecisionType.Float, WirePortDataType.FLOAT ) + " " + TessMaxUniformName + ";" ); + } + } + break; + case 1: + { + //Tess + if ( !m_hasCustomFunction ) + { + dataCollector.AddToProperties( -1, string.Format( TessProperty, m_tessFactor ), orderIndex++ ); + dataCollector.AddToUniforms( -1, "uniform " + UIUtils.PrecisionWirePortToCgType( PrecisionType.Float, WirePortDataType.FLOAT ) + " " + TessUniformName + ";" ); + } + } + break; + case 2: + { + dataCollector.AddToIncludes( -1, TessellationOpHelper.TessInclude ); + + //Tess + if ( !m_hasCustomFunction ) + { + dataCollector.AddToProperties( -1, string.Format( EdgeLengthTessProperty, m_tessFactor ), orderIndex++ ); + dataCollector.AddToUniforms( -1, "uniform " + UIUtils.PrecisionWirePortToCgType( PrecisionType.Float, WirePortDataType.FLOAT ) + " " + EdgeLengthTessUniformName + ";" ); + } + } + break; + case 3: + { + dataCollector.AddToIncludes( -1, TessellationOpHelper.TessInclude ); + + if ( !m_hasCustomFunction ) + { + //Tess + dataCollector.AddToProperties( -1, string.Format( EdgeLengthTessProperty, m_tessFactor ), orderIndex++ ); + dataCollector.AddToUniforms( -1, "uniform " + UIUtils.PrecisionWirePortToCgType( PrecisionType.Float, WirePortDataType.FLOAT ) + " " + EdgeLengthTessUniformName + ";" ); + + //Max Displacement + dataCollector.AddToProperties( -1, string.Format( EdgeLengthTessMaxDispProperty, m_tessMaxDistance ), orderIndex++ ); + dataCollector.AddToUniforms( -1, "uniform " + UIUtils.PrecisionWirePortToCgType( PrecisionType.Float, WirePortDataType.FLOAT ) + " " + EdgeLengthTessMaxDispUniformName + ";" ); + } + } + break; + } + + if ( m_phongEnabled ) + { + dataCollector.AddToProperties( -1, string.Format( PhongStrengthProperty, m_phongStrength ), orderIndex++ ); + dataCollector.AddToUniforms( -1, "uniform " + UIUtils.PrecisionWirePortToCgType( PrecisionType.Float, WirePortDataType.FLOAT ) + " " + PhongStrengthUniformName + ";" ); + } + } + + //ToDo: Optimize material property fetches to use Id instead of string + public void UpdateFromMaterial( Material mat ) + { + if ( m_enabled ) + { + if ( m_phongEnabled ) + { + if ( mat.HasProperty( PhongStrengthUniformName ) ) + m_phongStrength = mat.GetFloat( PhongStrengthUniformName ); + } + + switch ( m_tessType ) + { + case 0: + { + if ( mat.HasProperty( TessUniformName ) ) + m_tessFactor = mat.GetFloat( TessUniformName ); + + if ( mat.HasProperty( TessMinUniformName ) ) + m_tessMinDistance = mat.GetFloat( TessMinUniformName ); + + if ( mat.HasProperty( TessMaxUniformName ) ) + m_tessMaxDistance = mat.GetFloat( TessMaxUniformName ); + } + break; + case 1: + { + if ( mat.HasProperty( TessUniformName ) ) + m_tessFactor = mat.GetFloat( TessUniformName ); + } + break; + case 2: + { + if ( mat.HasProperty( EdgeLengthTessUniformName ) ) + m_tessFactor = mat.GetFloat( EdgeLengthTessUniformName ); + } + break; + case 3: + { + if ( mat.HasProperty( EdgeLengthTessUniformName ) ) + m_tessFactor = mat.GetFloat( EdgeLengthTessUniformName ); + + if ( mat.HasProperty( EdgeLengthTessMaxDispUniformName ) ) + m_tessMaxDistance = mat.GetFloat( EdgeLengthTessMaxDispUniformName ); + } + break; + } + } + } + + public void WriteToOptionalParams( ref string optionalParams ) + { + optionalParams += TessellationOpHelper.TessSurfParam + Constants.OptionalParametersSep; + if ( m_phongEnabled ) + { + optionalParams += TessellationOpHelper.PhongStrengthParam + Constants.OptionalParametersSep; + } + } + + public void Reset() + { + m_hasCustomFunction = false; + m_customFunction = string.Empty; + + m_additionalData = string.Empty; + m_additionalDataDict.Clear(); + switch ( m_tessType ) + { + case 0: + { + m_customData[ 0 ] = TessUniformName; + m_customData[ 1 ] = TessMinUniformName; + m_customData[ 2 ] = TessMaxUniformName; + } + break; + case 1: + { + m_customData[ 0 ] = TessUniformName; + m_customData[ 1 ] = string.Empty; + m_customData[ 2 ] = string.Empty; + } + break; + case 2: + { + m_customData[ 0 ] = EdgeLengthTessUniformName; + m_customData[ 1 ] = string.Empty; + m_customData[ 2 ] = string.Empty; + } + break; + case 3: + { + m_customData[ 0 ] = EdgeLengthTessUniformName; + m_customData[ 1 ] = EdgeLengthTessMaxDispUniformName; + m_customData[ 2 ] = string.Empty; + } + break; + } + } + + public string GetCurrentTessellationFunction + { + get + { + if ( m_hasCustomFunction ) + { + return TessFunctionOpen + + m_customFunction + + TessFunctionClose; + } + + string tessFunction = string.Empty; + switch ( m_tessType ) + { + case 0: + { + tessFunction = TessFunctionOpen + + DistBasedTessFunctionBody + + TessFunctionClose; + } + break; + case 1: + { + tessFunction = FixedAmountTessFunctionOpen + + FixedAmountTessFunctionBody + + TessFunctionClose; + } + break; + case 2: + { + tessFunction = TessFunctionOpen + + EdgeLengthTessFunctionBody + + TessFunctionClose; + } + break; + case 3: + { + tessFunction = TessFunctionOpen + + EdgeLengthTessCullFunctionBody + + TessFunctionClose; + } + break; + } + return tessFunction; + } + } + + public void AddAdditionalData( string data ) + { + if ( !m_additionalDataDict.ContainsKey( data ) ) + { + m_additionalDataDict.Add( data, true ); + m_additionalData += data; + } + } + + public void AddCustomFunction( string returnData ) + { + m_hasCustomFunction = true; + m_customFunction = m_additionalData + string.Format( CustomFunctionBody, returnData ); + } + + public void Destroy() + { + m_additionalDataDict.Clear(); + m_additionalDataDict = null; + } + + public bool IsTessellationPort( int index ) + { + return index == m_masterNodeIndexPort; + } + + public bool EnableTesselation { get { return m_enabled; } } + + public int TessType { get { return m_tessType; } } + public int MasterNodeIndexPort + { + get { return m_masterNodeIndexPort; } + set { m_masterNodeIndexPort = value; } + } + public int VertexOffsetIndexPort + { + get { return m_vertexOffsetIndexPort; } + set { m_vertexOffsetIndexPort = value; } + } + + public StandardSurfaceOutputNode ParentSurface { get { return m_parentSurface; } set { m_parentSurface = value; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/TessellationOpHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/TessellationOpHelper.cs.meta new file mode 100644 index 0000000..c4400a8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/TessellationOpHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c6fbad94b0fc6b948be3a3dc61232c05 +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/UsePassHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/UsePassHelper.cs new file mode 100644 index 0000000..d6e34ad --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/UsePassHelper.cs @@ -0,0 +1,360 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using UnityEditorInternal; + +namespace AmplifyShaderEditor +{ + public enum UsePassLocation + { + Above, + Below + } + + [Serializable] + public class UsePassItem : ScriptableObject + { + public UsePassLocation Location; + public string Value; + public UsePassItem() + { + Location = UsePassLocation.Above; + Value = string.Empty; + } + + public UsePassItem( UsePassLocation location, string name ) + { + Location = location; + Value = name; + } + + } + + [Serializable] + public class UsePassHelper : ScriptableObject + { + private const string UseGrabFormatNewLine = "UsePass \"{0}\"\n"; + private const string UseGrabFormat = "UsePass \"{0}\""; + private const float ShaderKeywordButtonLayoutWidth = 15; + private const string ShaderPoputContext = "CONTEXT/ShaderPopup"; + + [SerializeField] + private List m_items = new List(); + + [SerializeField] + private UndoParentNode m_owner = null; + + [SerializeField] + protected bool m_isDirty = false; + + [SerializeField] + protected string m_moduleName = string.Empty; + + private ReorderableList m_reordableList = null; + private ReordableAction m_actionType = ReordableAction.None; + private int m_actionIndex = 0; + private GUIStyle m_propertyAdjustment; + + private Material m_dummyMaterial; + private MenuCommand m_dummyCommand; + private int m_currentUsePassIdx = 0; + + public void Init( string moduleName ) + { + hideFlags = HideFlags.HideAndDontSave; + m_moduleName = moduleName; + } + + void DrawButtons() + { + EditorGUILayout.Separator(); + + // Add keyword + if( GUILayout.Button( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + UsePassItem newItem = ScriptableObject.CreateInstance(); + newItem.hideFlags = HideFlags.HideAndDontSave; + m_items.Add( newItem ); + EditorGUI.FocusTextInControl( null ); + m_isDirty = true; + } + + //Remove keyword + if( GUILayout.Button( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + if( m_items.Count > 0 ) + { + UsePassItem itemToDelete = m_items[ m_items.Count - 1 ]; + m_items.RemoveAt( m_items.Count - 1 ); + ScriptableObject.DestroyImmediate( itemToDelete ); + EditorGUI.FocusTextInControl( null ); + } + m_isDirty = true; + } + } + + public void Draw( UndoParentNode owner, bool style = true ) + { + if( m_owner == null ) + m_owner = owner; + + if( m_reordableList == null ) + { + m_reordableList = new ReorderableList( m_items, typeof( UsePassItem ), true, false, false, false ) + { + headerHeight = 0, + footerHeight = 0, + showDefaultBackground = false, + drawElementCallback = ( Rect rect, int index, bool isActive, bool isFocused ) => + { + if( m_items[ index ] != null ) + { + float labelWidthMultiplier; + float popUpWidth; + float shaderSelectorMultiplier; + float buttonPlusPosMultiplier; + if( style ) + { + rect.x -= 10; + labelWidthMultiplier = 0.9f; + popUpWidth = 0.31f; + shaderSelectorMultiplier = 1.01f; + buttonPlusPosMultiplier = 0.78f; + } + else + { + rect.x -= 1; + labelWidthMultiplier = 1.01f; + popUpWidth = 0.25f; + shaderSelectorMultiplier = 1.0f; + buttonPlusPosMultiplier = 0.55f; + } + + Rect popupPos = new Rect( rect.x, rect.y + 2, popUpWidth * rect.width, rect.height ); + Rect labelPos = new Rect( rect.x + popupPos.width * labelWidthMultiplier, rect.y, 0.59f * rect.width, rect.height ); + + Rect shaderSelectorPos = new Rect( labelPos.x + labelPos.width* shaderSelectorMultiplier, rect.y, 15, rect.height ); + + Rect buttonPlusPos = new Rect( shaderSelectorPos.x + shaderSelectorPos.width * buttonPlusPosMultiplier, rect.y, ShaderKeywordButtonLayoutWidth, rect.height ); + Rect buttonMinusPos = new Rect( buttonPlusPos.x + buttonPlusPos.width, rect.y, ShaderKeywordButtonLayoutWidth, rect.height ); + + EditorGUI.BeginChangeCheck(); + m_items[ index ].Location = (UsePassLocation)owner.EditorGUIEnumPopup( popupPos, m_items[ index ].Location ); + + if( EditorGUI.EndChangeCheck() && m_items[ index ].Location == UsePassLocation.Below && m_owner != null && m_owner.ContainerGraph.CurrentCanvasMode == NodeAvailability.TemplateShader ) + { + m_items[ index ].Location = UsePassLocation.Above; + UIUtils.ShowMessage( "Below option still not available on templates" ); + } + m_items[ index ].Value = owner.EditorGUITextField( labelPos, string.Empty, m_items[ index ].Value ); + + if( GUI.Button( shaderSelectorPos, string.Empty, UIUtils.InspectorPopdropdownFallback ) ) + { + EditorGUI.FocusTextInControl( null ); + GUI.FocusControl( null ); + m_currentUsePassIdx = index; + DisplayShaderContext( owner, GUILayoutUtility.GetRect( GUIContent.none, EditorStyles.popup ) ); + } + + if( GUI.Button( buttonPlusPos, string.Empty, UIUtils.PlusStyle ) ) + { + m_actionType = ReordableAction.Add; + m_actionIndex = index; + } + + if( GUI.Button( buttonMinusPos, string.Empty, UIUtils.MinusStyle ) ) + { + m_actionType = ReordableAction.Remove; + m_actionIndex = index; + } + } + } + }; + } + + if( m_actionType != ReordableAction.None ) + { + switch( m_actionType ) + { + case ReordableAction.Add: + UsePassItem newItem = ScriptableObject.CreateInstance(); + newItem.hideFlags = HideFlags.HideAndDontSave; + m_items.Insert( m_actionIndex + 1, newItem ); + break; + case ReordableAction.Remove: + UsePassItem itemToDelete = m_items[ m_actionIndex ]; + m_items.RemoveAt( m_actionIndex ); + ScriptableObject.DestroyImmediate( itemToDelete ); + break; + } + m_isDirty = true; + m_actionType = ReordableAction.None; + EditorGUI.FocusTextInControl( null ); + } + bool foldoutValue = owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedUsePass; + if( style ) + { + NodeUtils.DrawPropertyGroup( ref foldoutValue, m_moduleName, DrawReordableList, DrawButtons ); + } + else + { + NodeUtils.DrawNestedPropertyGroup( ref foldoutValue, m_moduleName, DrawReordableList, DrawButtons ); + } + owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedUsePass = foldoutValue; + } + + private void DisplayShaderContext( UndoParentNode node, Rect r ) + { + if( m_dummyCommand == null ) + m_dummyCommand = new MenuCommand( this, 0 ); + + if( m_dummyMaterial == null ) + m_dummyMaterial = new Material( Shader.Find( "Hidden/ASESShaderSelectorUnlit" ) ); + +#pragma warning disable 0618 + UnityEditorInternal.InternalEditorUtility.SetupShaderMenu( m_dummyMaterial ); +#pragma warning restore 0618 + EditorUtility.DisplayPopupMenu( r, ShaderPoputContext, m_dummyCommand ); + } + + private void OnSelectedShaderPopup( string command, Shader shader ) + { + if( shader != null ) + { + UIUtils.MarkUndoAction(); + Undo.RecordObject( m_owner, "Selected Use Pass shader" ); + m_items[ m_currentUsePassIdx ].Value = shader.name; + } + } + + void DrawReordableList() + { + if( m_reordableList != null ) + { + if( m_propertyAdjustment == null ) + { + m_propertyAdjustment = new GUIStyle(); + m_propertyAdjustment.padding.left = 17; + } + EditorGUILayout.Space(); + + if( m_items.Count == 0 ) + { + EditorGUILayout.HelpBox( "Your list is Empty!\nUse the plus button to add one.", MessageType.Info ); + } + else + { + m_reordableList.DoLayoutList(); + } + EditorGUILayout.Space(); + } + } + + public void ReadFromString( ref uint index, ref string[] nodeParams ) + { + try + { + int count = Convert.ToInt32( nodeParams[ index++ ] ); + for( int i = 0; i < count; i++ ) + { + string locationValue = nodeParams[ index++ ]; + // REMOVE THIS TEST AFTER A COUPLE OF VERSIONS (curr v1.5.6 r02) + if( locationValue.Equals( "Bellow" ) ) locationValue = "Below"; + + UsePassLocation location = (UsePassLocation)Enum.Parse( typeof( UsePassLocation ), locationValue ); + string name = nodeParams[ index++ ]; + UsePassItem newItem = ScriptableObject.CreateInstance(); + newItem.hideFlags = HideFlags.HideAndDontSave; + newItem.Location = location; + newItem.Value = name; + m_items.Add( newItem ); + } + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + + public void WriteToString( ref string nodeInfo ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_items.Count ); + for( int i = 0; i < m_items.Count; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_items[ i ].Location ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_items[ i ].Value ); + } + } + + public void BuildUsePassInfo( MasterNodeDataCollector dataCollector, ref string aboveItems, ref string bellowItems, string tabs) + { + int count = 0; + count = dataCollector.AboveUsePassesList.Count; + for( int i = 0; i < count; i++ ) + { + aboveItems += tabs + string.Format( UseGrabFormatNewLine, dataCollector.AboveUsePassesList[ i ].PropertyName ); + } + + count = dataCollector.BelowUsePassesList.Count; + for( int i = 0; i < count; i++ ) + { + bellowItems += tabs + string.Format( UseGrabFormatNewLine, dataCollector.BelowUsePassesList[ i ].PropertyName ); + } + + count = m_items.Count; + for( int i = 0; i < count; i++ ) + { + if( m_items[ i ].Location == UsePassLocation.Above ) + { + aboveItems += tabs + string.Format( UseGrabFormatNewLine, m_items[ i ].Value ); + } + else + { + bellowItems += tabs + string.Format( UseGrabFormatNewLine, m_items[ i ].Value ); + } + } + } + + public void BuildUsePassInfo( MasterNodeDataCollector dataCollector, ref List aboveItems, ref List bellowItems ) + { + int count = 0; + count = dataCollector.AboveUsePassesList.Count; + for( int i = 0; i < count; i++ ) + { + aboveItems.Add( new PropertyDataCollector( -1, string.Format( UseGrabFormat, dataCollector.AboveUsePassesList[ i ].PropertyName ) ) ); + } + + count = dataCollector.BelowUsePassesList.Count; + for( int i = 0; i < count; i++ ) + { + bellowItems.Add( new PropertyDataCollector( -1, string.Format( UseGrabFormat, dataCollector.BelowUsePassesList[ i ].PropertyName ) ) ); + } + + + count = m_items.Count; + for( int i = 0; i < count; i++ ) + { + if( m_items[ i ].Location == UsePassLocation.Above ) + { + aboveItems.Add( new PropertyDataCollector(-1,string.Format( UseGrabFormat, m_items[ i ].Value ))); + } + else + { + bellowItems.Add( new PropertyDataCollector( -1, string.Format( UseGrabFormat, m_items[ i ].Value ) ) ); + } + } + } + + //public string ModuleName { set { m_moduleName = value; } } + public void Destroy() + { + m_owner = null; + m_items.Clear(); + m_items = null; + m_reordableList = null; + m_dummyMaterial = null; + m_dummyCommand = null; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/UsePassHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/UsePassHelper.cs.meta new file mode 100644 index 0000000..ddf906c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/UsePassHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d818a147712609646b8d6f0f7c2ae731 +timeCreated: 1530179906 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/ZBufferOpHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/ZBufferOpHelper.cs new file mode 100644 index 0000000..73d3599 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/ZBufferOpHelper.cs @@ -0,0 +1,272 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + public enum ZWriteMode + { + On, + Off + } + + public enum ZTestMode + { + Less, + Greater, + LEqual, + GEqual, + Equal, + NotEqual, + Always + } + + [Serializable] + class ZBufferOpHelper + { + public static readonly string DepthParametersStr = " Depth"; + public static readonly string ZWriteModeStr = "ZWrite Mode"; + public static readonly string ZTestModeStr = "ZTest Mode"; + public static readonly string OffsetStr = "Offset"; + public static readonly string OffsetFactorStr = "Factor"; + public static readonly string OffsetUnitsStr = "Units"; + private const string ExtraDepthPassStr = "Extra Depth Pass"; + private const string DepthZTestStr = "Depth ZTest"; + + public static readonly string[] ZTestModeLabels = + { + "", + "Less", + "Greater", + "Less or Equal", + "Greater or Equal", + "Equal", + "Not Equal", + "Always" + }; + + public static readonly string[] ZTestModeValues = + { + "", + "Less", + "Greater", + "LEqual", + "GEqual", + "Equal", + "NotEqual", + "Always" + }; + + public static readonly string[] ZWriteModeValues = + { + "", + "On", + "Off" + }; + + public static readonly Dictionary ZTestModeDict = new Dictionary + { + {ZTestMode.Less,1 }, + {ZTestMode.Greater,2}, + {ZTestMode.LEqual,3}, + {ZTestMode.GEqual,4}, + {ZTestMode.Equal,5}, + {ZTestMode.NotEqual,6}, + {ZTestMode.Always,7} + }; + + public static readonly Dictionary ZWriteModeDict = new Dictionary + { + { ZWriteMode.On,1}, + { ZWriteMode.Off,2} + }; + + + [SerializeField] + private InlineProperty m_zTestMode = new InlineProperty(); + + [SerializeField] + private InlineProperty m_zWriteMode = new InlineProperty(); + [SerializeField] + private InlineProperty m_offsetFactor = new InlineProperty(); + + [SerializeField] + private InlineProperty m_offsetUnits = new InlineProperty(); + + [SerializeField] + private bool m_offsetEnabled; + + [SerializeField] + private bool m_extraDepthPass; + + [SerializeField] + private int m_extrazTestMode = 0; + + [SerializeField] + private StandardSurfaceOutputNode m_parentSurface; + + public string CreateDepthInfo( bool outlineZWrite, bool outlineZTest ) + { + string result = string.Empty; + if( m_zWriteMode.IntValue != 0 || m_zWriteMode.Active ) + { + MasterNode.AddRenderState( ref result, "ZWrite", m_zWriteMode.GetValueOrProperty( ZWriteModeValues[ m_zWriteMode.IntValue ] ) ); + } + else if( outlineZWrite ) + { + MasterNode.AddRenderState( ref result, "ZWrite", ZWriteModeValues[ 1 ] ); + } + + if( m_zTestMode.IntValue != 0 || m_zTestMode.Active ) + { + MasterNode.AddRenderState( ref result, "ZTest", m_zTestMode.GetValueOrProperty( ZTestModeValues[ m_zTestMode.IntValue ] ) ); + } + else if( outlineZTest ) + { + MasterNode.AddRenderState( ref result, "ZTest", ZTestModeValues[ 3 ] ); + } + + if( m_offsetEnabled ) + { + MasterNode.AddRenderState( ref result, "Offset ", m_offsetFactor.GetValueOrProperty() + " , " + m_offsetUnits.GetValueOrProperty() ); + } + + return result; + } + + public void Draw( UndoParentNode owner, GUIStyle toolbarstyle, bool customBlendAvailable ) + { + Color cachedColor = GUI.color; + GUI.color = new Color( cachedColor.r, cachedColor.g, cachedColor.b, 0.5f ); + EditorGUILayout.BeginHorizontal( toolbarstyle ); + GUI.color = cachedColor; + EditorGUI.BeginChangeCheck(); + m_parentSurface.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedDepth = owner.GUILayoutToggle( m_parentSurface.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedDepth, DepthParametersStr, UIUtils.MenuItemToggleStyle ); + if( EditorGUI.EndChangeCheck() ) + { + EditorPrefs.SetBool( "ExpandedDepth", m_parentSurface.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedDepth ); + } + EditorGUILayout.EndHorizontal(); + + if( m_parentSurface.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedDepth ) + { + cachedColor = GUI.color; + GUI.color = new Color( cachedColor.r, cachedColor.g, cachedColor.b, ( EditorGUIUtility.isProSkin ? 0.5f : 0.25f ) ); + EditorGUILayout.BeginVertical( UIUtils.MenuItemBackgroundStyle ); + GUI.color = cachedColor; + + EditorGUI.indentLevel++; + if( !customBlendAvailable ) + EditorGUILayout.HelpBox( "Depth Writing is only available for Opaque or Custom blend modes", MessageType.Warning ); + + EditorGUILayout.Separator(); + EditorGUI.BeginDisabledGroup( !customBlendAvailable ); + + m_zWriteMode.EnumTypePopup( ref owner, ZWriteModeStr, ZWriteModeValues ); + m_zTestMode.EnumTypePopup( ref owner, ZTestModeStr, ZTestModeLabels ); + //m_zWriteMode = owner.EditorGUILayoutPopup( ZWriteModeStr, m_zWriteMode, ZWriteModeValues ); + //m_zTestMode = owner.EditorGUILayoutPopup( ZTestModeStr, m_zTestMode, ZTestModeLabels ); + m_offsetEnabled = owner.EditorGUILayoutToggle( OffsetStr, m_offsetEnabled ); + if( m_offsetEnabled ) + { + EditorGUI.indentLevel++; + m_offsetFactor.FloatField( ref owner , OffsetFactorStr ); + m_offsetUnits.FloatField( ref owner , OffsetUnitsStr ); + EditorGUI.indentLevel--; + } + + m_extraDepthPass = owner.EditorGUILayoutToggle( ExtraDepthPassStr, m_extraDepthPass ); + if( m_extraDepthPass ) + { + EditorGUI.indentLevel++; + m_extrazTestMode = owner.EditorGUILayoutPopup( DepthZTestStr, m_extrazTestMode, ZTestModeLabels ); + EditorGUI.indentLevel--; + } + EditorGUILayout.Separator(); + EditorGUI.indentLevel--; + EditorGUI.EndDisabledGroup(); + EditorGUILayout.EndVertical(); + } + + EditorGUI.EndDisabledGroup(); + } + + public void DrawExtraDepthPass( ref string shaderBody ) + { + if( m_extraDepthPass ) + { + shaderBody += "\t\tPass\n"; + shaderBody += "\t\t{\n"; + shaderBody += "\t\t\tColorMask 0\n"; + if( m_extrazTestMode != 0 ) + shaderBody += "\t\t\tZTest " + ZTestModeValues[ m_extrazTestMode ] + "\n"; + shaderBody += "\t\t\tZWrite On\n"; + shaderBody += "\t\t}\n\n"; + } + } + + public void ReadFromString( ref uint index, ref string[] nodeParams ) + { + if( UIUtils.CurrentShaderVersion() < 2502 ) + { + string zWriteMode = nodeParams[ index++ ]; + m_zWriteMode.IntValue = zWriteMode.Equals( "Off" ) ? 2 : 0; + + string zTestMode = nodeParams[ index++ ]; + for( int i = 0; i < ZTestModeValues.Length; i++ ) + { + if( zTestMode.Equals( ZTestModeValues[ i ] ) ) + { + m_zTestMode.IntValue = i; + break; + } + } + } + else + { + if( UIUtils.CurrentShaderVersion() > 14501 ) + { + m_zWriteMode.ReadFromString( ref index, ref nodeParams ); + m_zTestMode.ReadFromString( ref index, ref nodeParams ); + } + else + { + m_zWriteMode.IntValue = Convert.ToInt32( nodeParams[ index++ ] ); + m_zTestMode.IntValue = Convert.ToInt32( nodeParams[ index++ ] ); + } + m_offsetEnabled = Convert.ToBoolean( nodeParams[ index++ ] ); + + if( UIUtils.CurrentShaderVersion() > 15303 ) + { + m_offsetFactor.ReadFromString( ref index , ref nodeParams , false ); + m_offsetUnits.ReadFromString( ref index, ref nodeParams , false ); + } + else + { + m_offsetFactor.FloatValue = Convert.ToSingle( nodeParams[ index++ ] ); + m_offsetUnits.FloatValue = Convert.ToSingle( nodeParams[ index++ ] ); + } + + if( UIUtils.CurrentShaderVersion() > 14202 ) + { + m_extraDepthPass = Convert.ToBoolean( nodeParams[ index++ ] ); + m_extrazTestMode = Convert.ToInt32( nodeParams[ index++ ] ); + } + } + } + + public void WriteToString( ref string nodeInfo ) + { + m_zWriteMode.WriteToString( ref nodeInfo ); + m_zTestMode.WriteToString( ref nodeInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_offsetEnabled ); + m_offsetFactor.WriteToString( ref nodeInfo ); + m_offsetUnits.WriteToString( ref nodeInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_extraDepthPass ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_extrazTestMode ); + } + public bool IsActive { get { return m_zTestMode.IntValue != 0 || m_zWriteMode.IntValue != 0 || m_offsetEnabled || m_zTestMode.Active || m_zWriteMode.Active; } } + public StandardSurfaceOutputNode ParentSurface { get { return m_parentSurface; } set { m_parentSurface = value; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/ZBufferOpHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/ZBufferOpHelper.cs.meta new file mode 100644 index 0000000..edee7bf --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Master/ZBufferOpHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f35a3e26a28596b4f9b54a1f2689db06 +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc.meta new file mode 100644 index 0000000..ae40b7c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6371d71bb076e1d47a3854adc59fdb93 +folderAsset: yes +timeCreated: 1481126945 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/AppendNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/AppendNode.cs new file mode 100644 index 0000000..6318614 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/AppendNode.cs @@ -0,0 +1,254 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "[Old]Append", "Vector Operators", "Append channels to create a new component",null,KeyCode.V,true,true,"Append",typeof(DynamicAppendNode))] + public sealed class AppendNode : ParentNode + { + private const string OutputTypeStr = "Output type"; + + [SerializeField] + private WirePortDataType m_selectedOutputType = WirePortDataType.FLOAT4; + + [SerializeField] + private int m_selectedOutputTypeInt = 2; + + [SerializeField] + private float[] m_defaultValues = { 0, 0, 0, 0 }; + private string[] m_defaultValuesStr = { "[0]", "[1]", "[2]", "[3]" }; + + private readonly string[] m_outputValueTypes ={ "Vector2", + "Vector3", + "Vector4", + "Color"}; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, "[0]" ); + AddInputPort( WirePortDataType.FLOAT, false, "[1]" ); + AddInputPort( WirePortDataType.FLOAT, false, "[2]" ); + AddInputPort( WirePortDataType.FLOAT, false, "[3]" ); + AddOutputPort( m_selectedOutputType, Constants.EmptyPortValue ); + m_textLabelWidth = 90; + m_autoWrapProperties = true; + m_previewShaderGUID = "d80ac81aabf643848a4eaa76f2f88d65"; + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + if ( m_dropdownEditing ) + { + EditorGUI.BeginChangeCheck(); + m_selectedOutputTypeInt = EditorGUIPopup( m_dropdownRect, m_selectedOutputTypeInt, m_outputValueTypes, UIUtils.PropertyPopUp ); + if ( EditorGUI.EndChangeCheck() ) + { + SetupPorts(); + DropdownEditing = false; + } + } + } + + void SetupPorts() + { + switch ( m_selectedOutputTypeInt ) + { + case 0: m_selectedOutputType = WirePortDataType.FLOAT2; break; + case 1: m_selectedOutputType = WirePortDataType.FLOAT3; break; + case 2: m_selectedOutputType = WirePortDataType.FLOAT4; break; + case 3: m_selectedOutputType = WirePortDataType.COLOR; break; + } + + UpdatePorts(); + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUILayout.BeginVertical(); + + EditorGUI.BeginChangeCheck(); + m_selectedOutputTypeInt = EditorGUILayoutPopup( OutputTypeStr, m_selectedOutputTypeInt, m_outputValueTypes ); + if ( EditorGUI.EndChangeCheck() ) + { + SetupPorts(); + } + + int count = 0; + switch ( m_selectedOutputType ) + { + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: + { + count = 4; + } + break; + case WirePortDataType.FLOAT3: + { + count = 3; + } + break; + case WirePortDataType.FLOAT2: + { + count = 2; + } + break; + case WirePortDataType.OBJECT: + case WirePortDataType.FLOAT: + case WirePortDataType.INT: + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + { } + break; + } + + for ( int i = 0; i < count; i++ ) + { + if ( !m_inputPorts[ i ].IsConnected ) + m_defaultValues[ i ] = EditorGUILayoutFloatField( m_defaultValuesStr[ i ], m_defaultValues[ i ] ); + } + + EditorGUILayout.EndVertical(); + } + void UpdatePorts() + { + m_sizeIsDirty = true; + ChangeOutputType( m_selectedOutputType, false ); + switch ( m_selectedOutputType ) + { + case WirePortDataType.FLOAT4: + case WirePortDataType.OBJECT: + case WirePortDataType.COLOR: + { + m_inputPorts[ 0 ].Visible = true; + m_inputPorts[ 1 ].Visible = true; + m_inputPorts[ 2 ].Visible = true; + m_inputPorts[ 3 ].Visible = true; + } + break; + case WirePortDataType.FLOAT3: + { + m_inputPorts[ 0 ].Visible = true; + m_inputPorts[ 1 ].Visible = true; + m_inputPorts[ 2 ].Visible = true; + m_inputPorts[ 3 ].Visible = false; + if ( m_inputPorts[ 3 ].IsConnected ) + UIUtils.DeleteConnection( true, UniqueId, 3, false, true ); + } + break; + case WirePortDataType.FLOAT2: + { + m_inputPorts[ 0 ].Visible = true; + m_inputPorts[ 1 ].Visible = true; + m_inputPorts[ 2 ].Visible = false; + if ( m_inputPorts[ 2 ].IsConnected ) + UIUtils.DeleteConnection( true, UniqueId, 2, false, true ); + + m_inputPorts[ 3 ].Visible = false; + if ( m_inputPorts[ 3 ].IsConnected ) + UIUtils.DeleteConnection( true, UniqueId, 3, false, true ); + } + break; + case WirePortDataType.FLOAT: + case WirePortDataType.INT: + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + { } + break; + } + } + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string value = string.Empty; + switch ( m_selectedOutputType ) + { + case WirePortDataType.FLOAT4: + case WirePortDataType.OBJECT: + case WirePortDataType.COLOR: + { + value = "float4( "; + for ( int i = 0; i < 4; i++ ) + { + value += m_inputPorts[ i ].IsConnected ? InputPorts[ i ].GenerateShaderForOutput( ref dataCollector, WirePortDataType.FLOAT, ignoreLocalVar, true ) : m_defaultValues[ i ].ToString(); + if ( i != 3 ) + value += " , "; + } + value += " )"; + } + break; + case WirePortDataType.FLOAT3: + { + value = "float3( "; + for ( int i = 0; i < 3; i++ ) + { + value += m_inputPorts[ i ].IsConnected ? InputPorts[ i ].GenerateShaderForOutput( ref dataCollector, WirePortDataType.FLOAT, ignoreLocalVar, true ) : m_defaultValues[ i ].ToString(); + if ( i != 2 ) + value += " , "; + } + value += " )"; + } + break; + case WirePortDataType.FLOAT2: + { + value = "float2( "; + for ( int i = 0; i < 2; i++ ) + { + value += m_inputPorts[ i ].IsConnected ? InputPorts[ i ].GenerateShaderForOutput( ref dataCollector, WirePortDataType.FLOAT, ignoreLocalVar, true ) : m_defaultValues[ i ].ToString(); + if ( i != 1 ) + value += " , "; + } + value += " )"; + } + break; + case WirePortDataType.FLOAT: + case WirePortDataType.INT: + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + { } + break; + } + + RegisterLocalVariable( 0, value, ref dataCollector, "appendResult" + OutputId ); + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_selectedOutputType = ( WirePortDataType ) Enum.Parse( typeof( WirePortDataType ), GetCurrentParam( ref nodeParams ) ); + switch ( m_selectedOutputType ) + { + case WirePortDataType.FLOAT2: m_selectedOutputTypeInt = 0; break; + case WirePortDataType.FLOAT3: m_selectedOutputTypeInt = 1; break; + case WirePortDataType.FLOAT4: m_selectedOutputTypeInt = 2; break; + case WirePortDataType.COLOR: m_selectedOutputTypeInt = 3; break; + } + for ( int i = 0; i < m_defaultValues.Length; i++ ) + { + m_defaultValues[ i ] = Convert.ToSingle( GetCurrentParam( ref nodeParams ) ); + } + UpdatePorts(); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_selectedOutputType ); + for ( int i = 0; i < m_defaultValues.Length; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_defaultValues[ i ] ); + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/AppendNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/AppendNode.cs.meta new file mode 100644 index 0000000..bd51352 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/AppendNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 688412c534df41444ad49759fa2b6a62 +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/BreakToComponentsNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/BreakToComponentsNode.cs new file mode 100644 index 0000000..e9cfbdb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/BreakToComponentsNode.cs @@ -0,0 +1,289 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Split", "Vector Operators", "Formerly known as Break To Components. Breaks the input data into its individual components", null, KeyCode.B, tags: "split Break To Components" )] + public sealed class BreakToComponentsNode : ParentNode + { + private const string RenameInfo = "This node was formerly known as Break To Components and was renamed to Split to decrease its canvas size."; + private WirePortDataType m_currentType = WirePortDataType.FLOAT; + private readonly string[] ColorPortNames = { "R", "G", "B", "A" }; + private readonly string[] VectorPortNames = { "X", "Y", "Z", "W" }; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, Constants.EmptyPortValue ); + for( int i = 0; i < 16; i++ ) + { + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + m_outputPorts[ i ].IndexPreviewOffset = 1; + if( i != 0 ) + { + m_outputPorts[ i ].Visible = false; + } + } + m_previewShaderGUID = "5f58f74a202ba804daddec838b75207d"; + } + + public override void RenderNodePreview() + { + //Runs at least one time + if( !m_initialized ) + { + // nodes with no preview don't update at all + PreviewIsDirty = false; + return; + } + + if( !PreviewIsDirty ) + return; + + SetPreviewInputs(); + + int count = m_outputPorts.Count; + for( int i = 0; i < count; i++ ) + { + RenderTexture temp = RenderTexture.active; + RenderTexture.active = m_outputPorts[ i ].OutputPreviewTexture; + Graphics.Blit( null, m_outputPorts[ i ].OutputPreviewTexture, PreviewMaterial, Mathf.Min( i, 3 ) ); + RenderTexture.active = temp; + } + + PreviewIsDirty = m_continuousPreviewRefresh; + } + + public override RenderTexture PreviewTexture + { + get + { + return m_inputPorts[ 0 ].InputPreviewTexture( ContainerGraph ); + } + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUILayout.HelpBox( RenameInfo, MessageType.Warning ); + } + + void UpdateOutputs( WirePortDataType newType ) + { + //this only happens when on initial load + if( newType == WirePortDataType.OBJECT ) + return; + + m_currentType = newType; + switch( newType ) + { + case WirePortDataType.OBJECT: + { + m_outputPorts[ 0 ].ChangeProperties( Constants.EmptyPortValue, WirePortDataType.OBJECT, false ); + m_outputPorts[ 0 ].Visible = true; + for( int i = 1; i < m_outputPorts.Count; i++ ) + { + m_outputPorts[ i ].Visible = false; + } + } + break; + case WirePortDataType.FLOAT: + { + m_outputPorts[ 0 ].ChangeProperties( Constants.EmptyPortValue, WirePortDataType.FLOAT, false ); + m_outputPorts[ 0 ].Visible = true; + for( int i = 1; i < m_outputPorts.Count; i++ ) + { + m_outputPorts[ i ].Visible = false; + } + } + break; + case WirePortDataType.FLOAT2: + { + for( int i = 0; i < 2; i++ ) + { + m_outputPorts[ i ].ChangeProperties( VectorPortNames[ i ], WirePortDataType.FLOAT, false ); + m_outputPorts[ i ].Visible = true; + } + for( int i = 2; i < m_outputPorts.Count; i++ ) + { + m_outputPorts[ i ].Visible = false; + } + } + break; + case WirePortDataType.FLOAT3: + { + for( int i = 0; i < 3; i++ ) + { + m_outputPorts[ i ].ChangeProperties( VectorPortNames[ i ], WirePortDataType.FLOAT, false ); + m_outputPorts[ i ].Visible = true; + } + for( int i = 3; i < m_outputPorts.Count; i++ ) + { + m_outputPorts[ i ].Visible = false; + } + } + break; + case WirePortDataType.FLOAT4: + { + for( int i = 0; i < 4; i++ ) + { + m_outputPorts[ i ].ChangeProperties( VectorPortNames[ i ], WirePortDataType.FLOAT, false ); + m_outputPorts[ i ].Visible = true; + } + for( int i = 4; i < m_outputPorts.Count; i++ ) + { + m_outputPorts[ i ].Visible = false; + } + } + break; + case WirePortDataType.FLOAT3x3: + { + for( int i = 0; i < 9; i++ ) + { + m_outputPorts[ i ].ChangeProperties( "[" + (int)( i / 3 ) + "][" + i % 3 + "]", WirePortDataType.FLOAT, false ); + m_outputPorts[ i ].Visible = true; + } + for( int i = 9; i < m_outputPorts.Count; i++ ) + { + m_outputPorts[ i ].Visible = false; + } + } + break; + case WirePortDataType.FLOAT4x4: + { + for( int i = 0; i < 16; i++ ) + { + m_outputPorts[ i ].ChangeProperties( "[" + (int)( i / 4 ) + "][" + i % 4 + "]", WirePortDataType.FLOAT, false ); + m_outputPorts[ i ].Visible = true; + } + } + break; + case WirePortDataType.COLOR: + { + for( int i = 0; i < 4; i++ ) + { + m_outputPorts[ i ].ChangeProperties( ColorPortNames[ i ], WirePortDataType.FLOAT, false ); + m_outputPorts[ i ].Visible = true; + } + for( int i = 4; i < m_outputPorts.Count; i++ ) + { + m_outputPorts[ i ].Visible = false; + } + } + break; + case WirePortDataType.INT: + { + m_outputPorts[ 0 ].Visible = true; + m_outputPorts[ 0 ].ChangeProperties( Constants.EmptyPortValue, WirePortDataType.INT, false ); + for( int i = 1; i < m_outputPorts.Count; i++ ) + { + m_outputPorts[ i ].Visible = false; + } + } + break; + } + m_sizeIsDirty = true; + } + + public override void OnConnectedOutputNodeChanges( int outputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( outputPortId, otherNodeId, otherPortId, name, type ); + + if( UIUtils.IsLoading || m_isNodeBeingCopied ) + return; + + m_inputPorts[ 0 ].MatchPortToConnection(); + UpdateOutputs( m_inputPorts[ 0 ].DataType ); + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + + if( UIUtils.IsLoading || m_isNodeBeingCopied ) + return; + + m_inputPorts[ 0 ].MatchPortToConnection(); + UpdateOutputs( m_inputPorts[ 0 ].DataType ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_currentType ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + UpdateOutputs( (WirePortDataType)Enum.Parse( typeof( WirePortDataType ), GetCurrentParam( ref nodeParams ) ) ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + { + return ReturnByType( m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ), outputId ); + } + + string value = string.Empty; + value = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + + int channelsUsed = 0; + for( int i = 0; i < m_outputPorts.Count; i++ ) + { + if( m_outputPorts[ i ].IsConnected ) + channelsUsed++; + } + string varName = "break" + OutputId; + if( channelsUsed > 1 ) + { + //RegisterLocalVariable( 0, value, ref dataCollector, varName ); + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, m_inputPorts[ 0 ].DataType, varName, value ); + m_outputPorts[ 0 ].SetLocalValue( varName, dataCollector.PortCategory ); + + + value = varName; + } + + return ReturnByType( value, outputId ); + } + + private string ReturnByType( string value, int outputId ) + { + switch( m_inputPorts[ 0 ].DataType ) + { + case WirePortDataType.OBJECT: + case WirePortDataType.FLOAT: + case WirePortDataType.INT: + { + return value; + } + case WirePortDataType.FLOAT2: + case WirePortDataType.FLOAT3: + case WirePortDataType.FLOAT4: + { + return GetOutputVectorItem( 0, outputId + 1, value ); + } + case WirePortDataType.COLOR: + { + return GetOutputColorItem( 0, outputId + 1, value ); + } + case WirePortDataType.FLOAT3x3: + { + return value + "[ " + ( (int)( outputId / 3 ) ) + " ][ " + ( outputId % 3 ) + " ]"; + } + case WirePortDataType.FLOAT4x4: + { + return value + "[ " + ( (int)( outputId / 4 ) ) + " ][ " + ( outputId % 4 ) + " ]"; + } + } + return value; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/BreakToComponentsNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/BreakToComponentsNode.cs.meta new file mode 100644 index 0000000..34381d1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/BreakToComponentsNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a74e2c0a9306c0048bfcc733cb7d154d +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/CustomExpressionNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/CustomExpressionNode.cs new file mode 100644 index 0000000..1807898 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/CustomExpressionNode.cs @@ -0,0 +1,1674 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using UnityEditorInternal; +using System.Text.RegularExpressions; + +namespace AmplifyShaderEditor +{ + public enum CustomExpressionMode + { + Create, + Call + } + + [Serializable] + public class CustomExpressionInputItem + { + public PrecisionType Precision; + public VariableQualifiers Qualifier; + public WirePortDataType Type; + public bool IsSamplerState; + public bool IsTexture2DArray; + public string CustomType; + public bool IsVariable; + public bool FoldoutFlag; + public string FoldoutLabel; + + public CustomExpressionInputItem( PrecisionType precision, VariableQualifiers qualifier, string customType, bool isVariable, bool foldoutFlag, string foldoutLabel ) + { + Precision = precision; + Qualifier = qualifier; + CustomType = customType; + FoldoutFlag = foldoutFlag; + FoldoutLabel = foldoutLabel; + IsVariable = isVariable; + } + } + + [Serializable] + public class CustomExpressionDependency + { + public int DependencyArrayIdx; + public int DependencyNodeId; + public CustomExpressionDependency() { DependencyArrayIdx = DependencyNodeId = -1; } + public CustomExpressionDependency( string id ) { DependencyNodeId = Convert.ToInt32( id ); DependencyArrayIdx = -1; } + public void Reset() + { + DependencyArrayIdx = -1; + DependencyNodeId = -1; + } + } + + [Serializable] + [NodeAttributes( "Custom Expression", "Miscellaneous", "Creates a custom expression or function if return is detected in the written code." )] + public sealed class CustomExpressionNode : ParentNode + { + private const string WarningText = "Characters $ and @ are NOT allowed inside code since they are internally used as delimiters over the node meta.\nThey will be automatically removed when saving the shader."; + private const float AddRemoveButtonLayoutWidth = 15; + private const float LineAdjust = 1.15f; + private const float IdentationAdjust = 5f; + private const string CustomExpressionInfo = "Creates a custom expression or function according to how code is written on text area.\n\n" + + "- If a return function is detected on Code text area then a function will be created.\n" + + "Also in function mode a ; is expected on the end of each instruction line.\n\n" + + "- If no return function is detected then an expression will be generated and used directly on the vertex/frag body.\n" + + "On Expression mode a ; is not required on the end of an instruction line.\n\n" + + "- You can also call a function from an external file, just make sure to add the include file via the 'Additional Directives' group " + + "in the main property panel. Also works with shader functions."; + + private const string ReturnHelper = "return"; + private const double MaxTimestamp = 1; + private const string DefaultExpressionNameStr = "My Custom Expression"; + private const string DefaultInputNameStr = "In"; + private const string CodeTitleStr = "Code"; + private const string OutputTypeStr = "Output Type"; + private const string CustomTypeStr = " "; + private const string IsVariableStr = "Is Variable"; + private const string InputsStr = "Inputs"; + private const string InputNameStr = "Name"; + private const string InputTypeStr = "Type"; + private const string InputValueStr = "Value"; + private const string InputQualifierStr = "Qualifier"; + private const string ExpressionNameLabelStr = "Name"; + private const string FunctionCallModeStr = "Mode"; + private const string GenerateUniqueNameStr = "Set Unique"; + private const string AutoRegisterStr = "Auto-Register"; + private const string DependenciesStr = "Dependencies"; + + private const string VarRegexReplacer = @"\b{0}\b"; + private readonly string[] PrecisionLabelsExtraLocal = { "Float", "Half", "Inherit Local" }; + + private readonly string[] AvailableWireTypesStr = + { + "int", + "float", + "float2", + "float3", + "float4", + "float3x3", + "float4x4", + "sampler1D", + "sampler2D", + "sampler3D", + "samplerCUBE", + "sampler2Darray", + "samplerState", + "custom"}; + + private readonly string[] AvailableOutputWireTypesStr = + { + "int", + "float", + "float2", + "float3", + "float4", + "float3x3", + "float4x4", + "void", + }; + + private readonly string[] QualifiersStr = + { + "In", + "Out", + "InOut" + }; + + private readonly WirePortDataType[] AvailableWireTypes = + { + WirePortDataType.INT, + WirePortDataType.FLOAT, + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.FLOAT3x3, + WirePortDataType.FLOAT4x4, + WirePortDataType.SAMPLER1D, + WirePortDataType.SAMPLER2D, + WirePortDataType.SAMPLER3D, + WirePortDataType.SAMPLERCUBE, + WirePortDataType.SAMPLER2DARRAY, + WirePortDataType.SAMPLERSTATE, + WirePortDataType.OBJECT + }; + + private readonly WirePortDataType[] AvailableOutputWireTypes = + { + WirePortDataType.INT, + WirePortDataType.FLOAT, + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.FLOAT3x3, + WirePortDataType.FLOAT4x4, + WirePortDataType.OBJECT, + }; + + + private readonly Dictionary WireToIdx = new Dictionary + { + { WirePortDataType.INT, 0}, + { WirePortDataType.FLOAT, 1}, + { WirePortDataType.FLOAT2, 2}, + { WirePortDataType.FLOAT3, 3}, + { WirePortDataType.FLOAT4, 4}, + { WirePortDataType.FLOAT3x3, 5}, + { WirePortDataType.FLOAT4x4, 6}, + { WirePortDataType.SAMPLER1D, 7}, + { WirePortDataType.SAMPLER2D, 8}, + { WirePortDataType.SAMPLER3D, 9}, + { WirePortDataType.SAMPLERCUBE, 10}, + { WirePortDataType.SAMPLER2DARRAY, 11}, + { WirePortDataType.SAMPLERSTATE, 12}, + { WirePortDataType.OBJECT, 13} + }; + + [SerializeField] + private string m_customExpressionName = DefaultExpressionNameStr; + + [SerializeField] + private List m_items = new List(); + + [SerializeField] + private string m_code = " "; + + [SerializeField] + private int m_outputTypeIdx = 1; + + [SerializeField] + private bool m_visibleInputsFoldout = true; + + [SerializeField] + private CustomExpressionMode m_mode = CustomExpressionMode.Create; + + [SerializeField] + private bool m_voidMode = false; + + [SerializeField] + private bool m_autoRegisterMode = false; + + [SerializeField] + private bool m_functionMode = false; + + [SerializeField] + private int m_firstAvailablePort = 0; + + [SerializeField] + private string m_uniqueName; + + [SerializeField] + private bool m_generateUniqueName = true; + + [SerializeField] + private bool m_dependenciesFoldout = false; + + [SerializeField] + private List m_dependencies = new List(); + + private const float ButtonLayoutWidth = 15; + + private bool m_repopulateNameDictionary = true; + private Dictionary m_usedNames = new Dictionary(); + + private double m_lastTimeNameModified = 0; + private bool m_nameModified = false; + + private double m_lastTimeCodeModified = 0; + private bool m_codeModified = false; + + //Title editing + private bool m_isEditing; + private bool m_stopEditing; + private bool m_startEditing; + private double m_clickTime; + private double m_doubleClickTime = 0.3; + private Rect m_titleClickArea; + + //Item Reordable List + private ReordableAction m_actionType = ReordableAction.None; + private int m_actionIndex = 0; + private int m_lastIndex = 0; + + private ReorderableList m_itemReordableList = null; + private ReorderableList m_dependenciesReordableList = null; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, "In0" ); + m_items.Add( new CustomExpressionInputItem( PrecisionType.Inherit, VariableQualifiers.In, string.Empty, false, true, string.Empty/*"[0]"*/ ) ); + AddOutputPort( WirePortDataType.FLOAT, "Out" ); + m_textLabelWidth = 97; + m_customPrecision = true; + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + + if( m_mode == CustomExpressionMode.Create ) + UIUtils.CurrentWindow.OutsideGraph.CustomExpressionOnFunctionMode.AddNode( this ); + + SetTitleText( m_customExpressionName ); + + if( m_nodeAttribs != null ) + m_uniqueName = m_nodeAttribs.Name + OutputId; + else + m_uniqueName = "CustomExpression" + OutputId; + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + CheckPortConnection( portId ); + } + + public override void OnConnectedOutputNodeChanges( int portId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( portId, otherNodeId, otherPortId, name, type ); + CheckPortConnection( portId ); + } + + void CheckPortConnection( int portId ) + { + if( portId == 0 && ( m_mode == CustomExpressionMode.Call || m_voidMode ) ) + { + m_inputPorts[ 0 ].MatchPortToConnection(); + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + } + } + + public override void OnNodeLogicUpdate( DrawInfo drawInfo ) + { + base.OnNodeLogicUpdate( drawInfo ); + if( m_nameModified ) + { + if( ( EditorApplication.timeSinceStartup - m_lastTimeNameModified ) > MaxTimestamp ) + { + m_nameModified = false; + m_sizeIsDirty = true; + m_repopulateNameDictionary = true; + } + } + + if( m_repopulateNameDictionary ) + { + m_repopulateNameDictionary = false; + m_usedNames.Clear(); + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + m_usedNames.Add( m_inputPorts[ i ].Name, i ); + } + } + + if( m_codeModified ) + { + if( ( EditorApplication.timeSinceStartup - m_lastTimeCodeModified ) > MaxTimestamp ) + { + m_codeModified = false; + bool functionMode = m_code.Contains( ReturnHelper ); + if( functionMode != m_functionMode ) + { + m_functionMode = functionMode; + CheckCallMode(); + } + } + } + } + + bool CheckCallMode() + { + if( m_functionMode && m_mode == CustomExpressionMode.Call ) + { + Mode = CustomExpressionMode.Create; + m_outputTypeIdx = ( AvailableOutputWireTypesStr.Length - 1 ); + //m_outputPorts[ 0 ].ChangeType( AvailableOutputWireTypes[ m_outputTypeIdx ], false ); + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + m_voidMode = true; + return true; + } + return false; + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + if( ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD3 ) + { + if( !m_isEditing && ( ( !ContainerGraph.ParentWindow.MouseInteracted && drawInfo.CurrentEventType == EventType.MouseDown && m_titleClickArea.Contains( drawInfo.MousePosition ) ) ) ) + { + if( ( EditorApplication.timeSinceStartup - m_clickTime ) < m_doubleClickTime ) + m_startEditing = true; + else + GUI.FocusControl( null ); + m_clickTime = EditorApplication.timeSinceStartup; + } + else if( m_isEditing && ( ( drawInfo.CurrentEventType == EventType.MouseDown && !m_titleClickArea.Contains( drawInfo.MousePosition ) ) || !EditorGUIUtility.editingTextField ) ) + { + m_stopEditing = true; + } + + if( m_isEditing || m_startEditing ) + { + EditorGUI.BeginChangeCheck(); + GUI.SetNextControlName( m_uniqueName ); + m_customExpressionName = EditorGUITextField( m_titleClickArea, string.Empty, m_customExpressionName, UIUtils.GetCustomStyle( CustomStyle.NodeTitle ) ); + if( EditorGUI.EndChangeCheck() ) + { + SetTimedUpdate( 2 ); + SetTitleText( m_customExpressionName ); + m_sizeIsDirty = true; + m_isDirty = true; + } + + if( m_startEditing ) + EditorGUI.FocusTextInControl( m_uniqueName ); + } + + if( drawInfo.CurrentEventType == EventType.Repaint ) + { + if( m_startEditing ) + { + m_startEditing = false; + m_isEditing = true; + } + + if( m_stopEditing ) + { + m_stopEditing = false; + m_isEditing = false; + GUI.FocusControl( null ); + } + } + } + } + + public override void OnNodeLayout( DrawInfo drawInfo ) + { + base.OnNodeLayout( drawInfo ); + m_titleClickArea = m_titlePos; + m_titleClickArea.height = Constants.NODE_HEADER_HEIGHT; + } + + public override void OnNodeRepaint( DrawInfo drawInfo ) + { + base.OnNodeRepaint( drawInfo ); + if( !m_isVisible ) + return; + + // Fixed Title ( only renders when not editing ) + if( !m_isEditing && !m_startEditing && ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD3 ) + { + GUI.Label( m_titleClickArea, m_content, UIUtils.GetCustomStyle( CustomStyle.NodeTitle ) ); + } + } + + public string GetFirstAvailableName() + { + string name = string.Empty; + for( int i = 0; i < m_inputPorts.Count + 1; i++ ) + { + name = DefaultInputNameStr + i; + if( !m_usedNames.ContainsKey( name ) ) + { + return name; + } + } + Debug.LogWarning( "Could not find valid name" ); + return string.Empty; + } + + public override void DrawProperties() + { + base.DrawProperties(); + NodeUtils.DrawPropertyGroup( ref m_propertiesFoldout, Constants.ParameterLabelStr, DrawBaseProperties ); + //NodeUtils.DrawPropertyGroup( ref m_visibleInputsFoldout, InputsStr, DrawInputs, DrawAddRemoveInputs ); + NodeUtils.DrawPropertyGroup( ref m_visibleInputsFoldout, InputsStr, DrawReordableInputs, DrawItemsAddRemoveInputs ); + + EditorGUILayout.HelpBox( CustomExpressionInfo, MessageType.Info ); + EditorGUILayout.HelpBox( WarningText, MessageType.Warning ); + } + + string WrapCodeInFunction( bool isTemplate, string functionName, bool expressionMode ) + { + //Hack to be used util indent is properly used + int currIndent = UIUtils.ShaderIndentLevel; + UIUtils.ShaderIndentLevel = isTemplate ? 0 : 1; + + if( !isTemplate ) UIUtils.ShaderIndentLevel++; + + //string functionName = UIUtils.RemoveInvalidCharacters( m_customExpressionName ); + string returnType = ( m_mode == CustomExpressionMode.Call || m_voidMode ) ? "void" : UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, m_outputPorts[ 0 ].DataType ); + if( expressionMode ) + returnType = "inline " + returnType; + + string functionBody = UIUtils.ShaderIndentTabs + returnType + " " + functionName + "( "; + int count = m_inputPorts.Count - m_firstAvailablePort; + for( int i = 0; i < count; i++ ) + { + int portIdx = i + m_firstAvailablePort; + string qualifier = m_items[ i ].Qualifier == VariableQualifiers.In ? string.Empty : UIUtils.QualifierToCg( m_items[ i ].Qualifier ) + " "; + PrecisionType precision = m_items[ i ].Precision; + if( precision == PrecisionType.Inherit ) + precision = CurrentPrecisionType; + //string dataType = ( m_inputPorts[ portIdx ].DataType == WirePortDataType.OBJECT ) ? m_items[ i ].CustomType : UIUtils.PrecisionWirePortToCgType( precision, m_inputPorts[ portIdx ].DataType ); + string declaration = string.Empty; + if( m_inputPorts[ portIdx ].DataType == WirePortDataType.OBJECT ) + declaration = m_items[ i ].CustomType + " " + m_inputPorts[ portIdx ].Name; + else + declaration = UIUtils.PrecisionWirePortToTypeValue( precision, m_inputPorts[ portIdx ].DataType, m_inputPorts[ portIdx ].Name ); + functionBody += qualifier + declaration; + //functionBody += qualifier + dataType + " " + m_inputPorts[ portIdx ].Name; + if( i < ( count - 1 ) ) + { + functionBody += ", "; + } + } + functionBody += " )\n" + UIUtils.ShaderIndentTabs + "{\n"; + UIUtils.ShaderIndentLevel++; + { + if( expressionMode ) + functionBody += UIUtils.ShaderIndentTabs + "return "; + + string[] codeLines = m_code.Split( IOUtils.LINE_TERMINATOR ); + for( int i = 0; i < codeLines.Length; i++ ) + { + if( codeLines[ i ].Length > 0 ) + { + functionBody += ( ( i == 0 && expressionMode ) ? string.Empty : UIUtils.ShaderIndentTabs ) + codeLines[ i ] + ( ( ( i == codeLines.Length - 1 ) && expressionMode ) ? string.Empty : "\n" ); + } + } + if( expressionMode ) + functionBody += ";\n"; + } + UIUtils.ShaderIndentLevel--; + + functionBody += UIUtils.ShaderIndentTabs + "}\n"; + UIUtils.ShaderIndentLevel = currIndent; + return functionBody; + } + + void DrawBaseProperties() + { + EditorGUI.BeginChangeCheck(); + m_customExpressionName = EditorGUILayoutTextField( ExpressionNameLabelStr, m_customExpressionName ); + if( EditorGUI.EndChangeCheck() ) + { + SetTimedUpdate( 2 ); + SetTitleText( m_customExpressionName ); + } + + EditorGUI.BeginChangeCheck(); + Mode = (CustomExpressionMode)EditorGUILayoutEnumPopup( FunctionCallModeStr, m_mode ); + if( EditorGUI.EndChangeCheck() ) + { + if( CheckCallMode() ) + UIUtils.ShowMessage( UniqueId, "Call Mode cannot have return over is code.\nFalling back to Create Mode" ); + SetupCallMode(); + RecalculateInOutOutputPorts(); + } + + EditorGUILayout.LabelField( CodeTitleStr ); + EditorGUI.BeginChangeCheck(); + { + m_code = EditorGUILayoutTextArea( m_code, UIUtils.MainSkin.textArea ); + } + if( EditorGUI.EndChangeCheck() ) + { + m_codeModified = true; + m_lastTimeCodeModified = EditorApplication.timeSinceStartup; + } + + if( m_mode == CustomExpressionMode.Create ) + { + DrawPrecisionProperty(); + + bool guiEnabled = GUI.enabled; + + GUI.enabled = !AutoRegisterMode; + m_generateUniqueName = EditorGUILayoutToggle( GenerateUniqueNameStr, m_generateUniqueName ) && !AutoRegisterMode; + + GUI.enabled = !m_generateUniqueName; + AutoRegisterMode = EditorGUILayoutToggle( AutoRegisterStr, AutoRegisterMode ) && !m_generateUniqueName; + + GUI.enabled = guiEnabled; + + EditorGUI.BeginChangeCheck(); + m_outputTypeIdx = EditorGUILayoutPopup( OutputTypeStr, m_outputTypeIdx, AvailableOutputWireTypesStr ); + if( EditorGUI.EndChangeCheck() ) + { + bool oldVoidValue = m_voidMode; + UpdateVoidMode(); + if( oldVoidValue != m_voidMode ) + { + SetupCallMode(); + RecalculateInOutOutputPorts(); + } + else + { + m_outputPorts[ 0 ].ChangeType( AvailableOutputWireTypes[ m_outputTypeIdx ], false ); + } + } + } + NodeUtils.DrawNestedPropertyGroup( ref m_dependenciesFoldout, "Dependencies", DrawDependencies, DrawDependenciesAddRemoveInputs ); + } + + void UpdateVoidMode() + { + m_voidMode = ( m_outputTypeIdx == ( AvailableOutputWireTypesStr.Length - 1 ) ); + } + + void SetupCallMode() + { + if( m_mode == CustomExpressionMode.Call || m_voidMode ) + { + if( m_firstAvailablePort != 1 ) + { + m_firstAvailablePort = 1; + AddInputPortAt( 0, WirePortDataType.FLOAT, false, DefaultInputNameStr ); + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT, false ); + } + } + else + { + if( m_firstAvailablePort != 0 ) + { + m_firstAvailablePort = 0; + if( m_inputPorts[ 0 ].IsConnected ) + { + m_containerGraph.DeleteConnection( true, UniqueId, m_inputPorts[ 0 ].PortId, false, true ); + } + DeleteInputPortByArrayIdx( 0 ); + m_outputPorts[ 0 ].ChangeType( AvailableOutputWireTypes[ m_outputTypeIdx ], false ); + } + } + } + + void DrawItemsAddRemoveInputs() + { + if( m_inputPorts.Count == m_firstAvailablePort ) + m_visibleInputsFoldout = false; + + // Add new port + if( GUILayoutButton( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ButtonLayoutWidth ) ) ) + { + AddPortAt( m_inputPorts.Count ); + m_visibleInputsFoldout = true; + EditorGUI.FocusTextInControl( null ); + } + + //Remove port + if( GUILayoutButton( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ButtonLayoutWidth ) ) ) + { + RemovePortAt( m_inputPorts.Count - 1 ); + EditorGUI.FocusTextInControl( null ); + } + } + + void DrawDependenciesAddRemoveInputs() + { + // Add new port + if( GUILayoutButton( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ButtonLayoutWidth ) ) ) + { + m_dependencies.Add( new CustomExpressionDependency() ); + EditorGUI.FocusTextInControl( null ); + } + + //Remove port + if( GUILayoutButton( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ButtonLayoutWidth ) ) ) + { + m_dependencies.RemoveAt( m_dependencies.Count - 1 ); + } + } + + void DrawDependencies() + { + if( m_dependenciesReordableList == null ) + { + m_dependenciesReordableList = new ReorderableList( m_dependencies, typeof( CustomExpressionDependency ), true, false, false, false ) + { + headerHeight = 0, + footerHeight = 0, + showDefaultBackground = false, + drawElementCallback = ( Rect rect, int index, bool isActive, bool isFocused ) => + { + if( m_dependencies[ index ] != null ) + { + rect.xMin -= 1; + + Rect popupPos = new Rect( rect.x, rect.y, rect.width - 2 * Constants.PlusMinusButtonLayoutWidth, EditorGUIUtility.singleLineHeight ); + Rect buttonPlusPos = new Rect( rect.x + rect.width - 2 * Constants.PlusMinusButtonLayoutWidth, rect.y - 2, Constants.PlusMinusButtonLayoutWidth, Constants.PlusMinusButtonLayoutWidth ); + Rect buttonMinusPos = new Rect( rect.x + rect.width - Constants.PlusMinusButtonLayoutWidth, rect.y - 2, Constants.PlusMinusButtonLayoutWidth, Constants.PlusMinusButtonLayoutWidth ); + EditorGUI.BeginChangeCheck(); + m_dependencies[ index ].DependencyArrayIdx = EditorGUIPopup( popupPos, string.Empty, m_dependencies[ index ].DependencyArrayIdx, UIUtils.CurrentWindow.OutsideGraph.CustomExpressionOnFunctionMode.NodesArr ); + if( EditorGUI.EndChangeCheck() ) + { + m_dependencies[ index ].DependencyNodeId = UIUtils.CurrentWindow.OutsideGraph.CustomExpressionOnFunctionMode.GetNode( m_dependencies[ index ].DependencyArrayIdx ).UniqueId; + if( m_dependencies[ index ].DependencyNodeId == UniqueId ) + { + m_dependencies[ index ].Reset(); + } + } + + if( GUI.Button( buttonPlusPos, string.Empty, UIUtils.PlusStyle ) ) + { + m_actionType = ReordableAction.Add; + m_actionIndex = index; + } + + if( GUI.Button( buttonMinusPos, string.Empty, UIUtils.MinusStyle ) ) + { + m_actionType = ReordableAction.Remove; + m_actionIndex = index; + } + } + } + }; + } + + if( m_dependenciesReordableList != null ) + { + EditorGUILayout.Space(); + if( m_dependencies.Count == 0 ) + { + EditorGUILayout.HelpBox( "Your list is Empty!\nUse the plus button to add one.", MessageType.Info ); + } + else + { + m_dependenciesReordableList.DoLayoutList(); + } + EditorGUILayout.Space(); + } + + if( m_actionType != ReordableAction.None ) + { + switch( m_actionType ) + { + case ReordableAction.Add: + m_dependencies.Insert( m_actionIndex + 1, new CustomExpressionDependency() ); + break; + case ReordableAction.Remove: + m_dependencies.RemoveAt( m_actionIndex ); + break; + } + m_isDirty = true; + m_actionType = ReordableAction.None; + EditorGUI.FocusTextInControl( null ); + } + } + + void DrawReordableInputs() + { + if( m_itemReordableList == null ) + { + m_itemReordableList = new ReorderableList( m_items, typeof( CustomExpressionInputItem ), true, false, false, false ) + { + headerHeight = 0, + footerHeight = 0, + showDefaultBackground = false, + elementHeightCallback = ( int index ) => + { + float lineHeight = EditorGUIUtility.singleLineHeight * LineAdjust; + if( m_items[ index ].FoldoutFlag ) + { + float size = 7 * lineHeight; + + // Take Is Variable toggle into account + if( m_mode == CustomExpressionMode.Call ) + size += lineHeight; + + if( m_inputPorts[ m_firstAvailablePort + index ].DataType == WirePortDataType.OBJECT ) + size += lineHeight; + + if( !m_inputPorts[ m_firstAvailablePort + index ].IsConnected ) + { + switch( m_inputPorts[ m_firstAvailablePort + index ].DataType ) + { + case WirePortDataType.INT: + case WirePortDataType.FLOAT: + size += 0;// lineHeight; + break; + case WirePortDataType.FLOAT2: + case WirePortDataType.FLOAT3: + case WirePortDataType.FLOAT4: + size += lineHeight;//2 * lineHeight; + break; + case WirePortDataType.FLOAT3x3: + size += 5 * lineHeight;//6 * lineHeight; + break; + case WirePortDataType.FLOAT4x4: + size += 6 * lineHeight;//8 * lineHeight; + break; + + } + } + + return size; + } + else + { + return lineHeight; + } + }, + + onReorderCallback = ( ReorderableList list ) => + { + int realLastIndex = m_firstAvailablePort + m_lastIndex; + int realCurrIndex = m_firstAvailablePort + list.index; + + InputPort portA = m_inputPorts[ realLastIndex ]; + int originalOutputPortId = CreateOutputId( portA.PortId ); + + SwapInputPorts( realLastIndex, realCurrIndex ); + + if( m_outputPorts.Count > 1 ) + { + if( list.index > m_lastIndex ) + { + for( int i = m_lastIndex; i <= list.index; i++ ) + { + if( m_items[ i ].Qualifier != VariableQualifiers.In ) + { + int portIdx = i + m_firstAvailablePort; + int oldOutputPortId; + if( i < list.index ) + { + int oldinputPortId = m_inputPorts[ portIdx ].PortId + 1; + oldOutputPortId = CreateOutputId( oldinputPortId ); + } + else + { + oldOutputPortId = originalOutputPortId; + } + + m_outputPortsDict[ oldOutputPortId ].ChangePortId( CreateOutputId( m_inputPorts[ portIdx ].PortId ) ); + } + } + } + else + { + for( int i = list.index; i <= m_lastIndex; i++ ) + { + if( m_items[ i ].Qualifier != VariableQualifiers.In ) + { + int portIdx = i + m_firstAvailablePort; + int oldOutputPortId; + if( i > list.index ) + { + int oldinputPortId = m_inputPorts[ portIdx ].PortId - 1; + oldOutputPortId = CreateOutputId( oldinputPortId ); + } + else + { + oldOutputPortId = originalOutputPortId; + } + + m_outputPortsDict[ oldOutputPortId ].ChangePortId( CreateOutputId( m_inputPorts[ portIdx ].PortId ) ); + } + } + } + } + + + m_outputPorts.Sort( ( A, B ) => + { + return A.PortId.CompareTo( B.PortId ); + } ); + + m_outputPortsDict.Clear(); + for( int i = 0; i < m_outputPorts.Count; i++ ) + { + m_outputPortsDict.Add( m_outputPorts[ i ].PortId, m_outputPorts[ i ] ); + } + + }, + onSelectCallback = ( ReorderableList list ) => + { + m_lastIndex = list.index; + }, + drawElementCallback = ( Rect rect, int index, bool isActive, bool isFocused ) => + { + if( m_items[ index ] != null ) + { + float lineHeight = EditorGUIUtility.singleLineHeight; + float lineSpacing = lineHeight * LineAdjust; + + rect.x -= IdentationAdjust; + rect.height = lineHeight; + int portIdx = index + m_firstAvailablePort; + Rect foldoutRect = rect; + if( !m_items[ index ].FoldoutFlag ) + { + foldoutRect.width -= 2 * AddRemoveButtonLayoutWidth; + } + m_items[ index ].FoldoutFlag = EditorGUIFoldout( foldoutRect, m_items[ index ].FoldoutFlag, /*m_items[ index ].FoldoutLabel + " - " +*/ m_inputPorts[ portIdx ].Name ); + if( m_items[ index ].FoldoutFlag ) + { + rect.x += IdentationAdjust; + + //Qualifier + rect.y += lineSpacing; + VariableQualifiers newQualifier = (VariableQualifiers)EditorGUIPopup( rect, InputQualifierStr, (int)m_items[ index ].Qualifier, QualifiersStr ); + if( newQualifier != m_items[ index ].Qualifier ) + { + VariableQualifiers oldQualifier = m_items[ index ].Qualifier; + m_items[ index ].Qualifier = newQualifier; + if( newQualifier == VariableQualifiers.In ) + { + RemoveOutputPort( CreateOutputId( m_inputPorts[ portIdx ].PortId ), false ); + } + else if( oldQualifier == VariableQualifiers.In ) + { + int outputId = CreateOutputId( m_inputPorts[ portIdx ].PortId ); + AddOutputPort( m_inputPorts[ portIdx ].DataType, m_inputPorts[ portIdx ].Name, outputId ); + } + m_inputPorts[ portIdx ].Visible = newQualifier != VariableQualifiers.Out; + m_sizeIsDirty = true; + RecalculateInOutOutputPorts(); + } + + // Precision + rect.y += lineSpacing; + m_items[ index ].Precision = (PrecisionType)EditorGUIPopup( rect, PrecisionContent.text, (int)m_items[ index ].Precision, PrecisionLabelsExtraLocal ); + // Type + rect.y += lineSpacing; + int typeIdx = WireToIdx[ m_inputPorts[ portIdx ].DataType ]; + EditorGUI.BeginChangeCheck(); + typeIdx = EditorGUIPopup( rect, InputTypeStr, typeIdx, AvailableWireTypesStr ); + if( EditorGUI.EndChangeCheck() ) + { + // actual type is need in order for texture array and sampler state to fallback correctly + m_inputPorts[ portIdx ].ChangeType( AvailableWireTypes[ typeIdx ], false ); + if( typeIdx == 5 || typeIdx == 6 ) + { + m_inputPorts[ portIdx ].Matrix4x4InternalData = Matrix4x4.identity; + } + + if( m_items[ index ].Qualifier != VariableQualifiers.In ) + { + OutputPort currOutPort = GetOutputPortByUniqueId( CreateOutputId( m_inputPorts[ portIdx ].PortId ) ); + currOutPort.ChangeType( AvailableWireTypes[ typeIdx ], false ); + } + } + + if( AvailableWireTypes[ typeIdx ] == WirePortDataType.OBJECT ) + { + rect.y += lineSpacing; + m_items[ index ].CustomType = EditorGUITextField( rect, CustomTypeStr, m_items[ index ].CustomType ); + } + + //Name + rect.y += lineSpacing; + EditorGUI.BeginChangeCheck(); + { + m_inputPorts[ portIdx ].Name = EditorGUITextField( rect, InputNameStr, m_inputPorts[ portIdx ].Name ); + } + if( EditorGUI.EndChangeCheck() ) + { + m_nameModified = true; + m_lastTimeNameModified = EditorApplication.timeSinceStartup; + m_inputPorts[ portIdx ].Name = UIUtils.RemoveInvalidCharacters( m_inputPorts[ portIdx ].Name ); + if( string.IsNullOrEmpty( m_inputPorts[ portIdx ].Name ) ) + { + m_inputPorts[ portIdx ].Name = DefaultInputNameStr + index; + } + + if( m_items[ index ].Qualifier != VariableQualifiers.In ) + { + OutputPort currOutPort = GetOutputPortByUniqueId( CreateOutputId( m_inputPorts[ portIdx ].PortId ) ); + currOutPort.Name = m_inputPorts[ portIdx ].Name; + } + } + + if( m_mode == CustomExpressionMode.Call ) + { + //Is Unique + rect.y += lineSpacing; + m_items[ index ].IsVariable = EditorGUIToggle( rect, IsVariableStr, m_items[ index ].IsVariable ); + } + // Port Data + if( !m_inputPorts[ portIdx ].IsConnected ) + { + rect.y += lineSpacing; + m_inputPorts[ portIdx ].ShowInternalData( rect, this, true, InputValueStr ); + } + + //Buttons + rect.x += rect.width - 2 * AddRemoveButtonLayoutWidth; + rect.y += lineSpacing; + if( !m_inputPorts[ m_firstAvailablePort + index ].IsConnected ) + { + switch( m_inputPorts[ m_firstAvailablePort + index ].DataType ) + { + case WirePortDataType.INT: + case WirePortDataType.FLOAT: + rect.y += 0;// lineSpacing; + break; + case WirePortDataType.FLOAT2: + case WirePortDataType.FLOAT3: + case WirePortDataType.FLOAT4: + rect.y += lineSpacing;//2 * lineSpacing; + break; + case WirePortDataType.FLOAT3x3: + rect.y += 5 * lineSpacing;//6 * lineSpacing; + break; + case WirePortDataType.FLOAT4x4: + rect.y += 6 * lineSpacing;//8 * lineSpacing; + break; + + } + } + rect.width = AddRemoveButtonLayoutWidth; + if( GUI.Button( rect, string.Empty, UIUtils.PlusStyle ) ) + { + m_actionType = ReordableAction.Add; + m_actionIndex = index; + } + rect.x += AddRemoveButtonLayoutWidth; + if( GUI.Button( rect, string.Empty, UIUtils.MinusStyle ) ) + { + m_actionType = ReordableAction.Remove; + m_actionIndex = index; + } + + } + else + { + //Buttons + rect.x += IdentationAdjust + rect.width - 2 * AddRemoveButtonLayoutWidth; + rect.width = AddRemoveButtonLayoutWidth; + if( GUI.Button( rect, string.Empty, UIUtils.PlusStyle ) ) + { + m_actionType = ReordableAction.Add; + m_actionIndex = index; + } + rect.x += AddRemoveButtonLayoutWidth; + if( GUI.Button( rect, string.Empty, UIUtils.MinusStyle ) ) + { + m_actionType = ReordableAction.Remove; + m_actionIndex = index; + } + } + } + } + }; + } + + if( m_itemReordableList != null ) + { + EditorGUILayout.Space(); + if( m_items.Count == 0 ) + { + EditorGUILayout.HelpBox( "Your list is Empty!\nUse the plus button to add one.", MessageType.Info ); + } + else + { + m_itemReordableList.DoLayoutList(); + } + EditorGUILayout.Space(); + } + + if( m_actionType != ReordableAction.None ) + { + switch( m_actionType ) + { + case ReordableAction.Add: + AddPortAt( m_firstAvailablePort + m_actionIndex + 1 ); + break; + case ReordableAction.Remove: + RemovePortAt( m_firstAvailablePort + m_actionIndex ); + break; + } + m_isDirty = true; + m_actionType = ReordableAction.None; + EditorGUI.FocusTextInControl( null ); + } + } + + void RecalculateInOutOutputPorts() + { + m_outputPorts.Sort( ( x, y ) => x.PortId.CompareTo( y.PortId ) ); + + m_outputPortsDict.Clear(); + int count = m_inputPorts.Count - m_firstAvailablePort; + int outputId = 1; + for( int i = 0; i < count; i++ ) + { + int idx = i + m_firstAvailablePort; + if( m_items[ i ].Qualifier != VariableQualifiers.In ) + { + m_outputPorts[ outputId ].ChangeProperties( m_inputPorts[ idx ].Name, m_inputPorts[ idx ].DataType, false ); + m_outputPorts[ outputId ].ChangePortId( CreateOutputId( m_inputPorts[ idx ].PortId ) ); + outputId++; + } + } + + int outCount = m_outputPorts.Count; + for( int i = 0; i < outCount; i++ ) + { + m_outputPortsDict.Add( m_outputPorts[ i ].PortId, m_outputPorts[ i ] ); + } + } + + void AddPortAt( int idx ) + { + AddInputPortAt( idx, WirePortDataType.FLOAT, false, GetFirstAvailableName() ); + m_items.Insert( idx - m_firstAvailablePort, new CustomExpressionInputItem( PrecisionType.Inherit, VariableQualifiers.In, string.Empty, false, true, string.Empty/* "[" + idx + "]"*/ ) ); + m_repopulateNameDictionary = true; + RecalculateInOutOutputPorts(); + } + + void RemovePortAt( int idx ) + { + if( m_inputPorts.Count > m_firstAvailablePort ) + { + int varIdx = idx - m_firstAvailablePort; + if( m_items[ varIdx ].Qualifier != VariableQualifiers.In ) + { + int id = CreateOutputId( m_inputPorts[ idx ].PortId ); + RemoveOutputPort( id, false ); + } + + DeleteInputPortByArrayIdx( idx ); + m_items.RemoveAt( varIdx ); + + m_repopulateNameDictionary = true; + + RecalculateInOutOutputPorts(); + } + } + + public override void OnAfterDeserialize() + { + base.OnAfterDeserialize(); + m_repopulateNameDictionary = true; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( string.IsNullOrEmpty( m_code ) ) + { + UIUtils.ShowMessage( UniqueId, string.Format( "Custom Expression \"{0}\" need to have code associated", m_customExpressionName ), MessageSeverity.Warning ); + return "0"; + } + + m_code = UIUtils.ForceLFLineEnding( m_code ); + + bool codeContainsReturn = m_code.Contains( ReturnHelper ); + + bool expressionMode = false; + if( !codeContainsReturn ) + { + string[] codeLines = m_code.Split( IOUtils.LINE_TERMINATOR ); + expressionMode = codeLines.Length == 1 && !m_voidMode; + } + + if( !expressionMode && + !codeContainsReturn && + m_mode == CustomExpressionMode.Create && !m_voidMode ) + { + UIUtils.ShowMessage( UniqueId, string.Format( "Custom Expression \"{0}\" has a non-void return type but no return instruction was detected", m_customExpressionName ), MessageSeverity.Error ); + + if( outputId != 0 ) + UIUtils.ShowMessage( UniqueId, string.Format( "Attempting to get value on Custom Expression \"{0}\" from inexisting \"{1}\" inout/out variable", m_customExpressionName, m_outputPorts[ outputId ].Name ), MessageSeverity.Error ); + + return "0"; + } + + int dependenciesCount = m_dependencies.Count; + Dictionary examinedNodes = new Dictionary(); + for( int i = 0; i < dependenciesCount; i++ ) + { + CustomExpressionNode node = m_containerGraph.GetNode( m_dependencies[ i ].DependencyNodeId ) as CustomExpressionNode; + if( node == null ) + { + node = UIUtils.CurrentWindow.OutsideGraph.GetNode( m_dependencies[ i ].DependencyNodeId ) as CustomExpressionNode; + } + + if( node != null ) + { + node.CheckDependencies( ref dataCollector, ref examinedNodes ); + } + } + examinedNodes.Clear(); + examinedNodes = null; + + + OutputPort outputPort = GetOutputPortByUniqueId( outputId ); + if( outputPort.IsLocalValue( dataCollector.PortCategory ) ) + return outputPort.LocalValue( dataCollector.PortCategory ); + + string expressionName = UIUtils.RemoveInvalidCharacters( m_customExpressionName ); + string localVarName = "local" + expressionName; + + if( m_generateUniqueName ) + { + expressionName += OutputId; + } + localVarName += OutputId; + + int count = m_inputPorts.Count; + if( count > 0 ) + { + if( m_mode == CustomExpressionMode.Call || m_voidMode ) + { + string mainData = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + RegisterLocalVariable( 0, string.Format( Constants.CodeWrapper, mainData ), ref dataCollector, localVarName ); + } + + if( codeContainsReturn ) + { + string function = WrapCodeInFunction( dataCollector.IsTemplate, expressionName, false ); + string functionCall = expressionName + "( "; + for( int i = m_firstAvailablePort; i < count; i++ ) + { + if( UIUtils.CurrentWindow.OutsideGraph.SamplingMacros && !UIUtils.CurrentWindow.OutsideGraph.IsSRP ) + { + // we don't know what kind of sampling the user will do so we add all of them + GeneratorUtils.AddCustomStandardSamplingMacros( ref dataCollector, m_inputPorts[ i ].DataType, MipType.Auto ); + GeneratorUtils.AddCustomStandardSamplingMacros( ref dataCollector, m_inputPorts[ i ].DataType, MipType.MipLevel ); + GeneratorUtils.AddCustomStandardSamplingMacros( ref dataCollector, m_inputPorts[ i ].DataType, MipType.MipBias ); + GeneratorUtils.AddCustomStandardSamplingMacros( ref dataCollector, m_inputPorts[ i ].DataType, MipType.Derivative ); + } + + string inputPortLocalVar = m_inputPorts[ i ].Name + OutputId; + int idx = i - m_firstAvailablePort; + if( m_inputPorts[ i ].DataType != WirePortDataType.OBJECT ) + { + string result = m_inputPorts[ i ].GeneratePortInstructions( ref dataCollector ); + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, m_inputPorts[ i ].DataType, inputPortLocalVar, result ); + } + else + { + string result =( m_inputPorts[ i ].IsConnected )? m_inputPorts[ i ].GeneratePortInstructions( ref dataCollector) : m_inputPorts[ i ].InternalData.ToString(); + string inputLocalVar = string.Format( Constants.CustomTypeLocalValueDecWithoutIdent, m_items[ idx ].CustomType, inputPortLocalVar, result ); + dataCollector.AddLocalVariable( UniqueId, inputLocalVar ); + } + + if( m_items[ idx ].Qualifier != VariableQualifiers.In ) + { + OutputPort currOutputPort = GetOutputPortByUniqueId( CreateOutputId( m_inputPorts[ i ].PortId ) ); + currOutputPort.SetLocalValue( inputPortLocalVar, dataCollector.PortCategory ); + } + functionCall += inputPortLocalVar; + if( i < ( count - 1 ) ) + { + functionCall += " , "; + } + } + functionCall += " )"; + + if( m_mode == CustomExpressionMode.Call || m_voidMode ) + { + dataCollector.AddLocalVariable( 0, functionCall + ";", true ); + } + else + { + RegisterLocalVariable( 0, functionCall, ref dataCollector, localVarName ); + } + + dataCollector.AddFunction( expressionName, function ); + } + else + { + + string localCode = m_code; + if( m_mode == CustomExpressionMode.Call || m_voidMode ) + { + for( int i = m_firstAvailablePort; i < count; i++ ) + { + int idx = i - m_firstAvailablePort; + if( !m_items[ idx ].IsVariable || + m_items[ idx ].Qualifier != VariableQualifiers.In || + !m_inputPorts[ i ].IsConnected + ) + { + string inputPortLocalVar = m_inputPorts[ i ].Name + OutputId; + string nameToReplaceRegex = string.Format( VarRegexReplacer, m_inputPorts[ i ].Name ); + localCode = Regex.Replace( localCode, nameToReplaceRegex, inputPortLocalVar, RegexOptions.Multiline ); + //localCode = localCode.Replace( m_inputPorts[ i ].Name, inputPortLocalVar ); + + if( m_inputPorts[ i ].IsConnected ) + { + string result = m_inputPorts[ i ].GenerateShaderForOutput( ref dataCollector, m_inputPorts[ i ].DataType, true, true ); + if( m_inputPorts[ i ].DataType == WirePortDataType.OBJECT ) + { + dataCollector.AddLocalVariable( UniqueId, m_items[ idx ].CustomType + " " + inputPortLocalVar, result + ";" ); + } + else + { + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, m_inputPorts[ i ].DataType, inputPortLocalVar, result ); + } + } + else + { + if( m_inputPorts[ i ].DataType == WirePortDataType.OBJECT ) + { + dataCollector.AddLocalVariable( UniqueId, m_items[ idx ].CustomType + " " + inputPortLocalVar, m_inputPorts[ i ].WrappedInternalData + ";" ); + } + else + { + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, m_inputPorts[ i ].DataType, inputPortLocalVar, m_inputPorts[ i ].WrappedInternalData ); + } + } + + if( m_items[ idx ].Qualifier != VariableQualifiers.In ) + { + OutputPort currOutputPort = GetOutputPortByUniqueId( CreateOutputId( m_inputPorts[ i ].PortId ) ); + currOutputPort.SetLocalValue( inputPortLocalVar, dataCollector.PortCategory ); + } + } + else + { + // Not Unique + string result = m_inputPorts[ i ].GenerateShaderForOutput( ref dataCollector, m_inputPorts[ i ].DataType, true, true ); + string nameToReplaceRegex = string.Format( VarRegexReplacer, m_inputPorts[ i ].Name ); + localCode = Regex.Replace( localCode, nameToReplaceRegex, result, RegexOptions.Multiline ); + //localCode = localCode.Replace( m_inputPorts[ i ].Name, result ); + } + } + localCode = string.Format( Constants.InlineCodeWrapper,localCode ); + string[] codeLines = localCode.Split( '\n' ); + for( int codeIdx = 0; codeIdx < codeLines.Length; codeIdx++ ) + { + dataCollector.AddLocalVariable( 0, codeLines[ codeIdx ], true ); + } + } + else + { + string function = WrapCodeInFunction( dataCollector.IsTemplate, expressionName, true ); + + string functionCall = expressionName + "( "; + for( int i = m_firstAvailablePort; i < count; i++ ) + { + if( UIUtils.CurrentWindow.OutsideGraph.SamplingMacros && !UIUtils.CurrentWindow.OutsideGraph.IsSRP ) + { + // we don't know what kind of sampling the user will do so we add all of them + GeneratorUtils.AddCustomStandardSamplingMacros( ref dataCollector, m_inputPorts[ i ].DataType, MipType.Auto ); + GeneratorUtils.AddCustomStandardSamplingMacros( ref dataCollector, m_inputPorts[ i ].DataType, MipType.MipLevel ); + GeneratorUtils.AddCustomStandardSamplingMacros( ref dataCollector, m_inputPorts[ i ].DataType, MipType.MipBias ); + GeneratorUtils.AddCustomStandardSamplingMacros( ref dataCollector, m_inputPorts[ i ].DataType, MipType.Derivative ); + } + + string inputPortLocalVar = m_inputPorts[ i ].Name + OutputId; + int idx = i - m_firstAvailablePort; + if( m_inputPorts[ i ].DataType != WirePortDataType.OBJECT ) + { + string result = m_inputPorts[ i ].GeneratePortInstructions( ref dataCollector ); + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, m_inputPorts[ i ].DataType, inputPortLocalVar, result ); + } + else + { + string result = ( m_inputPorts[ i ].IsConnected ) ? m_inputPorts[ i ].GeneratePortInstructions( ref dataCollector ) : m_inputPorts[ i ].InternalData.ToString(); + string inputLocalVar = string.Format( Constants.CustomTypeLocalValueDecWithoutIdent, m_items[ idx ].CustomType, inputPortLocalVar, result ); + dataCollector.AddLocalVariable( UniqueId, inputLocalVar ); + } + + if( m_items[ idx ].Qualifier != VariableQualifiers.In ) + { + OutputPort currOutputPort = GetOutputPortByUniqueId( CreateOutputId( m_inputPorts[ i ].PortId ) ); + currOutputPort.SetLocalValue( inputPortLocalVar, dataCollector.PortCategory ); + } + functionCall += inputPortLocalVar; + if( i < ( count - 1 ) ) + { + functionCall += " , "; + } + } + functionCall += " )"; + RegisterLocalVariable( 0, functionCall, ref dataCollector, localVarName ); + dataCollector.AddFunction( expressionName, function ); + } + } + + return outputPort.LocalValue( dataCollector.PortCategory ); + } + else + { + if( m_code.Contains( ReturnHelper ) ) + { + string function = WrapCodeInFunction( dataCollector.IsTemplate, expressionName, false ); + dataCollector.AddFunction( expressionName, function ); + string functionCall = expressionName + "()"; + RegisterLocalVariable( 0, functionCall, ref dataCollector, localVarName ); + } + else + { + RegisterLocalVariable( 0, string.Format( Constants.CodeWrapper, m_code ), ref dataCollector, localVarName ); + } + + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + } + + int CreateOutputId( int inputId ) + { + return ( inputId + 1 ); + } + + int CreateInputId( int outputId ) + { + return outputId - 1; + } + + void UpdateOutputPorts() + { + int count = m_inputPorts.Count - m_firstAvailablePort; + for( int i = 0; i < count; i++ ) + { + if( m_items[ i ].Qualifier != VariableQualifiers.In ) + { + int portIdx = i + m_firstAvailablePort; + int outputPortId = CreateOutputId( m_inputPorts[ portIdx ].PortId ); + AddOutputPort( m_inputPorts[ portIdx ].DataType, m_inputPorts[ portIdx ].Name, outputPortId ); + } + } + } + + public override void ReadFromString( ref string[] nodeParams ) + { + // This node is, by default, created with one input port + base.ReadFromString( ref nodeParams ); + m_code = GetCurrentParam( ref nodeParams ); + m_code = m_code.Replace( Constants.LineFeedSeparator, '\n' ); + m_code = m_code.Replace( Constants.SemiColonSeparator, ';' ); + m_outputTypeIdx = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + if( m_outputTypeIdx >= AvailableWireTypes.Length ) + { + UIUtils.ShowMessage( UniqueId, "Sampler types were removed as a valid output custom expression type" ); + m_outputTypeIdx = 1; + } + UpdateVoidMode(); + m_outputPorts[ 0 ].ChangeType( AvailableWireTypes[ m_outputTypeIdx ], false ); + + if( UIUtils.CurrentShaderVersion() > 12001 ) + { + bool mode = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + m_mode = mode ? CustomExpressionMode.Call : CustomExpressionMode.Create; + if( m_mode == CustomExpressionMode.Call || m_voidMode ) + { + m_firstAvailablePort = 1; + AddInputPortAt( 0, WirePortDataType.FLOAT, false, DefaultInputNameStr ); + } + } + + if( m_mode == CustomExpressionMode.Call ) + UIUtils.CurrentWindow.OutsideGraph.CustomExpressionOnFunctionMode.RemoveNode( this ); + + int count = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + if( count == 0 ) + { + DeleteInputPortByArrayIdx( m_firstAvailablePort ); + m_items.Clear(); + } + else + { + for( int i = 0; i < count; i++ ) + { + bool foldoutValue = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + string name = GetCurrentParam( ref nodeParams ); + WirePortDataType type = (WirePortDataType)Enum.Parse( typeof( WirePortDataType ), GetCurrentParam( ref nodeParams ) ); + string internalData = GetCurrentParam( ref nodeParams ); + VariableQualifiers qualifier = VariableQualifiers.In; + if( UIUtils.CurrentShaderVersion() > 12001 ) + { + qualifier = (VariableQualifiers)Enum.Parse( typeof( VariableQualifiers ), GetCurrentParam( ref nodeParams ) ); + } + string customType = string.Empty; + if( UIUtils.CurrentShaderVersion() > 15311 ) + { + customType = GetCurrentParam( ref nodeParams ); + } + PrecisionType precision = PrecisionType.Float; + if( UIUtils.CurrentShaderVersion() > 15607 ) + { + precision = (PrecisionType)Enum.Parse( typeof( PrecisionType ), GetCurrentParam( ref nodeParams ) ); + } + bool isVariable = false; + if( UIUtils.CurrentShaderVersion() > 16600 ) + { + isVariable = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + int portIdx = i + m_firstAvailablePort; + if( i == 0 ) + { + m_inputPorts[ portIdx ].ChangeProperties( name, type, false ); + m_inputPorts[ portIdx ].Visible = qualifier != VariableQualifiers.Out; + m_items[ 0 ].Qualifier = qualifier; + m_items[ 0 ].FoldoutFlag = foldoutValue; + m_items[ 0 ].CustomType = customType; + m_items[ 0 ].Precision = precision; + m_items[ 0 ].IsVariable = isVariable; + } + else + { + m_items.Add( new CustomExpressionInputItem( precision, qualifier, customType, isVariable, foldoutValue, string.Empty/*"[" + i + "]"*/ ) ); + AddInputPort( type, false, name ); + m_inputPorts[ m_inputPorts.Count - 1 ].Visible = qualifier != VariableQualifiers.Out; + } + m_inputPorts[ i ].InternalData = internalData; + } + } + + if( UIUtils.CurrentShaderVersion() > 7205 ) + { + m_customExpressionName = GetCurrentParam( ref nodeParams ); + SetTitleText( m_customExpressionName ); + } + + if( UIUtils.CurrentShaderVersion() > 14401 ) + { + m_generateUniqueName = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + + if( UIUtils.CurrentShaderVersion() > 15102 ) + { + m_autoRegisterMode = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + + if( UIUtils.CurrentShaderVersion() > 15403 ) + { + int dependencyCount = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + for( int i = 0; i < dependencyCount; i++ ) + { + m_dependencies.Add( new CustomExpressionDependency( GetCurrentParam( ref nodeParams ) ) ); + } + } + + if( m_mode == CustomExpressionMode.Create ) + { + UIUtils.CurrentWindow.OutsideGraph.CustomExpressionOnFunctionMode.AddNode( this ); + } + UpdateOutputPorts(); + + m_repopulateNameDictionary = true; + m_functionMode = m_code.Contains( ReturnHelper ); + CheckCallMode(); + + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + + m_code = m_code.Replace( Constants.LineFeedSeparator.ToString(), string.Empty ); + m_code = m_code.Replace( Constants.SemiColonSeparator.ToString(), string.Empty ); + m_code = UIUtils.ForceLFLineEnding( m_code ); + + string parsedCode = m_code.Replace( '\n', Constants.LineFeedSeparator ); + parsedCode = parsedCode.Replace( ';', Constants.SemiColonSeparator ); + + IOUtils.AddFieldValueToString( ref nodeInfo, parsedCode ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_outputTypeIdx ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_mode == CustomExpressionMode.Call ); + + int count = m_inputPorts.Count - m_firstAvailablePort; + IOUtils.AddFieldValueToString( ref nodeInfo, count ); + for( int i = 0; i < count; i++ ) + { + int portIdx = m_firstAvailablePort + i; + IOUtils.AddFieldValueToString( ref nodeInfo, m_items[ i ].FoldoutFlag ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_inputPorts[ portIdx ].Name ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_inputPorts[ portIdx ].DataType ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_inputPorts[ portIdx ].InternalData ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_items[ i ].Qualifier ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_items[ i ].CustomType ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_items[ i ].Precision ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_items[ i ].IsVariable ); + } + IOUtils.AddFieldValueToString( ref nodeInfo, m_customExpressionName ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_generateUniqueName ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_autoRegisterMode ); + count = m_dependencies.Count; + IOUtils.AddFieldValueToString( ref nodeInfo, count ); + for( int i = 0; i < count; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_dependencies[ i ].DependencyNodeId ); + } + } + + public override void Destroy() + { + base.Destroy(); + if( m_mode == CustomExpressionMode.Create ) + { + UIUtils.CurrentWindow.OutsideGraph.CustomExpressionOnFunctionMode.RemoveNode( this ); + } + m_items.Clear(); + m_items = null; + m_dependencies.Clear(); + m_dependencies = null; + m_itemReordableList = null; + } + + public void CheckDependencies( ref MasterNodeDataCollector dataCollector, ref Dictionary examinedNodes ) + { + if( !examinedNodes.ContainsKey( UniqueId ) && m_mode == CustomExpressionMode.Create && !m_generateUniqueName ) + { + int dependencyCount = m_dependencies.Count; + for( int d = 0; d < dependencyCount; d++ ) + { + if( !examinedNodes.ContainsKey( m_dependencies[ d ].DependencyNodeId ) ) + { + CustomExpressionNode dNode = m_containerGraph.GetNode( m_dependencies[ d ].DependencyNodeId ) as CustomExpressionNode; + + if( dNode == null ) + { + dNode = UIUtils.CurrentWindow.OutsideGraph.GetNode( m_dependencies[ d ].DependencyNodeId ) as CustomExpressionNode; + } + + if( dNode != null ) + { + dNode.CheckDependencies( ref dataCollector, ref examinedNodes ); + } + } + } + dataCollector.AddFunction( ExpressionName, EncapsulatedCode( dataCollector.IsTemplate ) ); + examinedNodes.Add( UniqueId, this ); + } + } + + public string EncapsulatedCode( bool isTemplate ) + { + string functionName = UIUtils.RemoveInvalidCharacters( m_customExpressionName ); + if( m_generateUniqueName ) + { + functionName += OutputId; + } + return WrapCodeInFunction( isTemplate, functionName, false ); + } + + public CustomExpressionMode Mode + { + get { return m_mode; } + set + { + if( m_mode != value ) + { + m_mode = value; + if( m_mode == CustomExpressionMode.Call ) + { + AutoRegisterMode = false; + m_generateUniqueName = false; + UIUtils.CurrentWindow.OutsideGraph.CustomExpressionOnFunctionMode.RemoveNode( this ); + } + else + { + UIUtils.CurrentWindow.OutsideGraph.CustomExpressionOnFunctionMode.AddNode( this ); + } + } + } + } + + public string ExpressionName + { + get + { + string expressionName = UIUtils.RemoveInvalidCharacters( m_customExpressionName ); + + if( m_generateUniqueName ) + { + expressionName += OutputId; + } + return expressionName; + } + } + public override string DataToArray { get { return m_customExpressionName; } } + public bool AutoRegisterMode + { + get { return m_autoRegisterMode; } + set + { + if( value != m_autoRegisterMode ) + { + m_autoRegisterMode = value; + } + } + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + int portCount = m_inputPorts.Count; + for( int i = 0; i < portCount; i++ ) + { + if( m_inputPorts[ i ].DataType == WirePortDataType.COLOR ) + { + m_inputPorts[ i ].ChangeType( WirePortDataType.FLOAT4, false ); ; + } + } + + int dependencyCount = m_dependencies.Count; + for( int i = 0; i < dependencyCount; i++ ) + { + m_dependencies[ i ].DependencyArrayIdx = UIUtils.CurrentWindow.OutsideGraph.CustomExpressionOnFunctionMode.GetNodeRegisterIdx( m_dependencies[ i ].DependencyNodeId ); + } + //Fixing bug where user could set main output port as OBJECT + if( m_outputPorts[ 0 ].DataType == WirePortDataType.OBJECT && ( m_voidMode || m_mode == CustomExpressionMode.Call ) ) + { + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + } + } + + public override void FireTimedUpdate() + { + UIUtils.CurrentWindow.OutsideGraph.CustomExpressionOnFunctionMode.UpdateDataOnNode( UniqueId, m_customExpressionName ); + } + + public List Dependencies { get { return m_dependencies; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/CustomExpressionNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/CustomExpressionNode.cs.meta new file mode 100644 index 0000000..bf37718 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/CustomExpressionNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f2507a764c07082458e350211d671334 +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/DynamicAppendNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/DynamicAppendNode.cs new file mode 100644 index 0000000..64cc8eb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/DynamicAppendNode.cs @@ -0,0 +1,475 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +using UnityEngine; +using UnityEditor; +using System; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + + public struct AppendData + { + public WirePortDataType PortType; + public int OldPortId; + public int NewPortId; + public AppendData( WirePortDataType portType, int oldPortId, int newPortId ) + { + PortType = portType; + OldPortId = oldPortId; + NewPortId = newPortId; + } + } + + [Serializable] + [NodeAttributes( "Append", "Vector Operators", "Append channels to create a new component", null, KeyCode.V, tags: "combine" )] + public sealed class DynamicAppendNode : ParentNode + { + private const string OutputTypeStr = "Output type"; + private const string OutputFormatStr = "({0}({1}))"; + + [SerializeField] + private WirePortDataType m_selectedOutputType = WirePortDataType.FLOAT4; + + [SerializeField] + private int m_selectedOutputTypeInt = 2; + + private readonly string[] m_outputValueTypes ={ "Vector2", + "Vector3", + "Vector4", + "Color"}; + + [SerializeField] + private int[] m_occupiedChannels = { -1, -1, -1, -1 }; + + [SerializeField] + private int m_maskId; + + [SerializeField] + private Vector4 m_maskValue = Vector4.one; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, Constants.ChannelNamesVector[ 0 ] ); + AddInputPort( WirePortDataType.FLOAT, false, Constants.ChannelNamesVector[ 1 ] ); + AddInputPort( WirePortDataType.FLOAT, false, Constants.ChannelNamesVector[ 2 ] ); + AddInputPort( WirePortDataType.FLOAT, false, Constants.ChannelNamesVector[ 3 ] ); + AddOutputPort( m_selectedOutputType, Constants.EmptyPortValue ); + m_textLabelWidth = 90; + m_autoWrapProperties = true; + m_useInternalPortData = true; + m_hasLeftDropdown = true; + m_previewShaderGUID = "bfcd2919fe75bbf428fbbe583f463a9e"; + } + + public override void OnEnable() + { + base.OnEnable(); + m_maskId = Shader.PropertyToID( "_Mask" ); + } + + void NewUpdateBehaviorConn( int portId, bool onLoading ) + { + InputPort inputPort = GetInputPortByUniqueId( portId ); + int channelsRequired = UIUtils.GetChannelsAmount( onLoading ? inputPort.DataType : inputPort.ConnectionType( 0 ) ); + int availableChannels = UIUtils.GetChannelsAmount( m_selectedOutputType ); + + // Invalidate previously used channels + for( int i = 0; i < availableChannels; i++ ) + { + if( m_occupiedChannels[ i ] == portId ) + { + m_occupiedChannels[ i ] = -1; + m_inputPorts[ i ].Visible = true; + } + } + // Lock available channels to port + int len = Mathf.Min( portId + channelsRequired, availableChannels ); + + int channelsUsed = 0; + for( int i = portId; i < len; i++ ) + { + if( m_occupiedChannels[ i ] == -1 ) + { + m_occupiedChannels[ i ] = portId; + channelsUsed += 1; + } + else + { + break; + } + } + + if( !onLoading ) + inputPort.ChangeType( UIUtils.GetWireTypeForChannelAmount( channelsUsed ), false ); + + if( channelsUsed > 1 && portId < availableChannels - 1 ) + { + channelsUsed -= 1; + int i = portId + 1; + for( ; channelsUsed > 0; i++, --channelsUsed ) + { + m_inputPorts[ i ].Visible = false; + } + + } + m_sizeIsDirty = true; + } + + void NewUpdateBehaviorDisconn( int portId ) + { + int availableChannels = UIUtils.GetChannelsAmount( m_selectedOutputType ); + // Invalidate previously used channels + for( int i = 0; i < availableChannels; i++ ) + { + if( m_occupiedChannels[ i ] == portId ) + { + m_occupiedChannels[ i ] = -1; + m_inputPorts[ i ].Visible = true; + m_inputPorts[ i ].ChangeType( WirePortDataType.FLOAT, false ); + } + } + m_sizeIsDirty = true; + } + + void RenamePorts() + { + int channel = 0; + for( int i = 0; i < 4; i++ ) + { + if( m_inputPorts[ i ].Visible ) + { + string name = string.Empty; + int usedChannels = UIUtils.GetChannelsAmount( m_inputPorts[ i ].DataType ); + bool isColor = ( m_selectedOutputType == WirePortDataType.COLOR ); + for( int j = 0; j < usedChannels; j++ ) + { + if( channel < Constants.ChannelNamesVector.Length ) + name += isColor ? Constants.ChannelNamesColor[ channel++ ] : Constants.ChannelNamesVector[ channel++ ]; + } + m_inputPorts[ i ].Name = name; + } + } + + CalculatePreviewData(); + } + + void UpdatePortTypes() + { + ChangeOutputType( m_selectedOutputType, false ); + int availableChannels = UIUtils.GetChannelsAmount( m_selectedOutputType ); + int usedChannels = 0; + while( usedChannels < availableChannels ) + { + int channelsRequired = m_inputPorts[ usedChannels ].IsConnected ? UIUtils.GetChannelsAmount( m_inputPorts[ usedChannels ].DataType ) : 0; + if( channelsRequired > 0 ) + { + + if( ( usedChannels + channelsRequired ) < availableChannels ) + { + usedChannels += channelsRequired; + } + else + { + m_inputPorts[ usedChannels ].Visible = true; + WirePortDataType newType = UIUtils.GetWireTypeForChannelAmount( availableChannels - usedChannels ); + m_inputPorts[ usedChannels ].ChangeType( newType, false ); + usedChannels = availableChannels; + break; + } + } + else + { + m_occupiedChannels[ usedChannels ] = -1; + m_inputPorts[ usedChannels ].Visible = true; + m_inputPorts[ usedChannels ].ChangeType( WirePortDataType.FLOAT, false ); + usedChannels += 1; + } + } + + for( int i = usedChannels; i < availableChannels; i++ ) + { + m_occupiedChannels[ i ] = -1; + m_inputPorts[ i ].Visible = true; + m_inputPorts[ i ].ChangeType( WirePortDataType.FLOAT, false ); + } + + for( int i = availableChannels; i < 4; i++ ) + { + m_occupiedChannels[ i ] = -1; + m_inputPorts[ i ].Visible = false; + m_inputPorts[ i ].ChangeType( WirePortDataType.FLOAT, false ); + } + m_sizeIsDirty = true; + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + + if( ( m_containerGraph.IsLoading || m_isNodeBeingCopied ) && UIUtils.CurrentShaderVersion() < 13206 ) + return; + + NewUpdateBehaviorConn( portId, ( UIUtils.IsLoading|| m_isNodeBeingCopied ) ); + RenamePorts(); + + } + + public override void OnInputPortDisconnected( int portId ) + { + base.OnInputPortDisconnected( portId ); + + if( ( UIUtils.IsLoading || m_isNodeBeingCopied ) && UIUtils.CurrentShaderVersion() < 13206 ) + return; + + NewUpdateBehaviorDisconn( portId ); + RenamePorts(); + } + + public override void OnConnectedOutputNodeChanges( int portId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( portId, otherNodeId, otherPortId, name, type ); + + if( ( UIUtils.IsLoading || m_isNodeBeingCopied ) && UIUtils.CurrentShaderVersion() < 13206 ) + return; + + NewUpdateBehaviorConn( portId, ( UIUtils.IsLoading || m_isNodeBeingCopied ) ); + RenamePorts(); + } + + void SetupPorts() + { + switch( m_selectedOutputTypeInt ) + { + case 0: m_selectedOutputType = WirePortDataType.FLOAT2; break; + case 1: m_selectedOutputType = WirePortDataType.FLOAT3; break; + case 2: m_selectedOutputType = WirePortDataType.FLOAT4; break; + case 3: m_selectedOutputType = WirePortDataType.COLOR; break; + } + UpdatePortTypes(); + RenamePorts(); + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + if( m_dropdownEditing ) + { + EditorGUI.BeginChangeCheck(); + m_selectedOutputTypeInt = EditorGUIPopup( m_dropdownRect, m_selectedOutputTypeInt, m_outputValueTypes, UIUtils.PropertyPopUp ); + if( EditorGUI.EndChangeCheck() ) + { + SetupPorts(); + DropdownEditing = false; + } + } + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUILayout.BeginVertical(); + + EditorGUI.BeginChangeCheck(); + m_selectedOutputTypeInt = EditorGUILayoutPopup( OutputTypeStr, m_selectedOutputTypeInt, m_outputValueTypes ); + if( EditorGUI.EndChangeCheck() ) + { + SetupPorts(); + } + + EditorGUILayout.EndVertical(); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + string result = string.Empty; + for( int i = 0; i < 4; i++ ) + { + if( m_inputPorts[ i ].Visible ) + { + if( i > 0 ) + { + result += " , "; + } + result += m_inputPorts[ i ].GeneratePortInstructions( ref dataCollector ); + } + } + + result = string.Format( OutputFormatStr, + UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, m_selectedOutputType ), + result ); + + RegisterLocalVariable( 0, result, ref dataCollector, "appendResult" + OutputId ); + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_selectedOutputType = (WirePortDataType)Enum.Parse( typeof( WirePortDataType ), GetCurrentParam( ref nodeParams ) ); + switch( m_selectedOutputType ) + { + case WirePortDataType.FLOAT2: m_selectedOutputTypeInt = 0; break; + case WirePortDataType.FLOAT3: m_selectedOutputTypeInt = 1; break; + case WirePortDataType.FLOAT4: m_selectedOutputTypeInt = 2; break; + case WirePortDataType.COLOR: m_selectedOutputTypeInt = 3; break; + } + } + + public override void ReadFromDeprecated( ref string[] nodeParams, Type oldType = null ) + { + m_selectedOutputType = (WirePortDataType)Enum.Parse( typeof( WirePortDataType ), GetCurrentParam( ref nodeParams ) ); + switch( m_selectedOutputType ) + { + case WirePortDataType.FLOAT2: m_selectedOutputTypeInt = 0; break; + case WirePortDataType.FLOAT3: m_selectedOutputTypeInt = 1; break; + case WirePortDataType.FLOAT4: m_selectedOutputTypeInt = 2; break; + case WirePortDataType.COLOR: m_selectedOutputTypeInt = 3; break; + } + for( int i = 0; i < 4; i++ ) + { + m_inputPorts[i].FloatInternalData = Convert.ToSingle( GetCurrentParam( ref nodeParams ) ); + } + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + + if( UIUtils.CurrentShaderVersion() < 13206 ) + { + //TODO: MAKE THIS LESS BRUTE FORCE + List reroutes = new List(); + int availableChannel = 0; + for( int i = 0; i < 4 && availableChannel < 4; i++ ) + { + int channelsAmount = UIUtils.GetChannelsAmount( m_inputPorts[ i ].DataType ); + if( m_inputPorts[ i ].IsConnected /*&& availableChannel != i*/ ) + { + reroutes.Add( new AppendData( m_inputPorts[ i ].DataType, i, availableChannel ) ); + } + + availableChannel += channelsAmount; + } + + if( reroutes.Count > 0 ) + { + for( int i = reroutes.Count - 1; i > -1; i-- ) + { + int nodeId = m_inputPorts[ reroutes[ i ].OldPortId ].ExternalReferences[ 0 ].NodeId; + int portId = m_inputPorts[ reroutes[ i ].OldPortId ].ExternalReferences[ 0 ].PortId; + + m_containerGraph.DeleteConnection( true, UniqueId, reroutes[ i ].OldPortId, false, false, false ); + m_containerGraph.CreateConnection( UniqueId, reroutes[ i ].NewPortId, nodeId, portId, false ); + NewUpdateBehaviorConn( reroutes[ i ].NewPortId, true ); + } + } + + availableChannel = UIUtils.GetChannelsAmount( m_selectedOutputType ); + int currChannelIdx = 0; + for( ; currChannelIdx < availableChannel; currChannelIdx++ ) + { + if( m_inputPorts[ currChannelIdx ].Visible ) + { + int channelsAmount = UIUtils.GetChannelsAmount( m_inputPorts[ currChannelIdx ].DataType ); + for( int j = currChannelIdx + 1; j < currChannelIdx + channelsAmount; j++ ) + { + m_inputPorts[ j ].Visible = false; + } + } + } + + for( ; currChannelIdx < 4; currChannelIdx++ ) + { + m_inputPorts[ currChannelIdx ].Visible = false; + } + } + SetupPorts(); + m_sizeIsDirty = true; + } + + + void CalculatePreviewData() + { + switch( m_outputPorts[ 0 ].DataType ) + { + default: m_maskValue = Vector4.zero; break; + case WirePortDataType.INT: + case WirePortDataType.FLOAT: m_maskValue = new Vector4( 1, 0, 0, 0 ); break; + case WirePortDataType.FLOAT2: m_maskValue = new Vector4( 1, 1, 0, 0 ); break; + case WirePortDataType.FLOAT3: m_maskValue = new Vector4( 1, 1, 1, 0 ); break; + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: m_maskValue = Vector4.one; break; + } + + m_previewMaterialPassId = -1; + switch( m_inputPorts[ 0 ].DataType ) + { + case WirePortDataType.INT: + case WirePortDataType.FLOAT: + { + switch( m_inputPorts[ 1 ].DataType ) + { + case WirePortDataType.FLOAT: + case WirePortDataType.INT: + { + if( m_inputPorts[ 2 ].DataType == WirePortDataType.FLOAT || + m_inputPorts[ 2 ].DataType == WirePortDataType.INT ) + { + m_previewMaterialPassId = 0; + } + else if( m_inputPorts[ 2 ].DataType == WirePortDataType.FLOAT2 ) + { + m_previewMaterialPassId = 1; + } + } + break; + case WirePortDataType.FLOAT2: m_previewMaterialPassId = 2; break; + case WirePortDataType.FLOAT3: m_previewMaterialPassId = 3; break; + } + + }; break; + case WirePortDataType.FLOAT2: + { + if( m_inputPorts[ 2 ].DataType == WirePortDataType.FLOAT || + m_inputPorts[ 2 ].DataType == WirePortDataType.INT ) + { + m_previewMaterialPassId = 4; + } + else if( m_inputPorts[ 2 ].DataType == WirePortDataType.FLOAT2 ) + { + m_previewMaterialPassId = 5; + } + }; break; + case WirePortDataType.FLOAT3: m_previewMaterialPassId = 6; break; + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: m_previewMaterialPassId = 7; break; + } + + if( m_previewMaterialPassId == -1 ) + { + m_previewMaterialPassId = 0; + if( DebugConsoleWindow.DeveloperMode ) + { + UIUtils.ShowMessage( UniqueId, "Could not find pass ID for append" , MessageSeverity.Error ); + } + } + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + PreviewMaterial.SetVector( m_maskId, m_maskValue ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_selectedOutputType ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/DynamicAppendNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/DynamicAppendNode.cs.meta new file mode 100644 index 0000000..c442e36 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/DynamicAppendNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: bc524cd13743b6f49a2e331767646448 +timeCreated: 1500632879 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/FresnelNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/FresnelNode.cs new file mode 100644 index 0000000..7cb2a32 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/FresnelNode.cs @@ -0,0 +1,393 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +// http://kylehalladay.com/blog/tutorial/2014/02/18/Fresnel-Shaders-From-The-Ground-Up.html +// http://http.developer.nvidia.com/CgTutorial/cg_tutorial_chapter07.html + +using System; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Fresnel", "Surface Data", "Simple Fresnel effect" )] + public sealed class FresnelNode : ParentNode + { + private const string FresnedFinalVar = "fresnelNode"; + + [SerializeField] + private ViewSpace m_normalSpace = ViewSpace.Tangent; + + enum FresnelType + { + Standard = 0, + Schlick, + SchlickIOR, + } + + enum NormalType + { + WorldNormal = 0, + TangentNormal, + HalfVector, + } + + enum ViewType + { + ViewDir = 0, + LightDir, + } + + [SerializeField] + private FresnelType m_fresnelType = FresnelType.Standard; + + [SerializeField] + private NormalType m_normalType = NormalType.WorldNormal; + + [SerializeField] + private ViewType m_viewType = ViewType.ViewDir; + + [SerializeField] + private bool m_normalizeVectors = false; + + [SerializeField] + private bool m_safePower = false; + + private InputPort m_normalVecPort; + private InputPort m_viewVecPort; + private InputPort m_biasPort; + private InputPort m_scalePort; + private InputPort m_powerPort; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT3, false, "World Normal", -1, MasterNodePortCategory.Fragment, 0 ); + AddInputPort( WirePortDataType.FLOAT3, false, "View Dir", -1, MasterNodePortCategory.Fragment, 4 ); + AddInputPort( WirePortDataType.FLOAT, false, "Bias", -1, MasterNodePortCategory.Fragment, 1 ); + AddInputPort( WirePortDataType.FLOAT, false, "Scale", -1, MasterNodePortCategory.Fragment, 2 ); + AddInputPort( WirePortDataType.FLOAT, false, "Power", -1, MasterNodePortCategory.Fragment, 3 ); + AddOutputPort( WirePortDataType.FLOAT, "Out" ); + + m_normalVecPort = m_inputPorts[ 0 ]; + m_viewVecPort = m_inputPorts[ 1 ]; + m_biasPort = m_inputPorts[ 2 ]; + m_scalePort = m_inputPorts[ 3 ]; + m_powerPort = m_inputPorts[ 4 ]; + + m_biasPort.AutoDrawInternalData = true; + m_scalePort.AutoDrawInternalData = true; + m_powerPort.AutoDrawInternalData = true; + m_autoWrapProperties = true; + m_drawPreviewAsSphere = true; + m_normalVecPort.Vector3InternalData = Vector3.forward; + m_scalePort.FloatInternalData = 1; + m_powerPort.FloatInternalData = 5; + m_previewShaderGUID = "240145eb70cf79f428015012559f4e7d"; + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + //m_mate + PreviewMaterial.SetInt( "_FresnelType", (int)m_fresnelType ); + + if( m_normalType == NormalType.TangentNormal && m_normalVecPort.IsConnected ) + m_previewMaterialPassId = 2; + else if( (m_normalType == NormalType.WorldNormal || m_normalType == NormalType.HalfVector ) && m_normalVecPort.IsConnected && !m_viewVecPort.IsConnected ) + m_previewMaterialPassId = 1; + else if( m_normalType == NormalType.HalfVector && !m_normalVecPort.IsConnected && !m_viewVecPort.IsConnected ) + m_previewMaterialPassId = 3; + else if( m_normalVecPort.IsConnected && m_viewVecPort.IsConnected ) + m_previewMaterialPassId = 4; + else if( !m_normalVecPort.IsConnected && !m_viewVecPort.IsConnected && m_viewType == ViewType.LightDir ) + m_previewMaterialPassId = 5; + else if( !m_normalVecPort.IsConnected && m_viewVecPort.IsConnected && m_normalType == NormalType.HalfVector ) + m_previewMaterialPassId = 7; + else if( !m_normalVecPort.IsConnected && m_viewVecPort.IsConnected ) + m_previewMaterialPassId = 6; + else + m_previewMaterialPassId = 0; + } + + public override void DrawProperties() + { + base.DrawProperties(); + + EditorGUI.BeginChangeCheck(); + m_fresnelType = (FresnelType)EditorGUILayoutEnumPopup( "Type", m_fresnelType ); + m_normalType = (NormalType)EditorGUILayoutEnumPopup( "Normal Vector", m_normalType ); + m_viewType = (ViewType)EditorGUILayoutEnumPopup( "View Vector", m_viewType ); + if( EditorGUI.EndChangeCheck() ) + { + UpdatePort(); + } + + if( !m_biasPort.IsConnected && m_biasPort.Visible ) + m_biasPort.FloatInternalData = EditorGUILayoutFloatField( m_biasPort.Name, m_biasPort.FloatInternalData ); + if( !m_scalePort.IsConnected && m_scalePort.Visible ) + m_scalePort.FloatInternalData = EditorGUILayoutFloatField( m_scalePort.Name, m_scalePort.FloatInternalData ); + if( !m_powerPort.IsConnected && m_powerPort.Visible ) + m_powerPort.FloatInternalData = EditorGUILayoutFloatField( m_powerPort.Name, m_powerPort.FloatInternalData ); + + m_normalizeVectors = EditorGUILayoutToggle( "Normalize Vectors", m_normalizeVectors ); + m_safePower = EditorGUILayoutToggle( PowerNode.SafePowerLabel, m_safePower ); + } + + private void UpdatePort() + { + switch( m_normalType ) + { + default: + case NormalType.WorldNormal: + m_normalVecPort.Name = "World Normal"; + break; + case NormalType.TangentNormal: + m_normalVecPort.Name = "Normal"; + break; + case NormalType.HalfVector: + m_normalVecPort.Name = "Half Vector"; + break; + } + + switch( m_viewType ) + { + default: + case ViewType.ViewDir: + m_viewVecPort.Name = "View Dir"; + break; + case ViewType.LightDir: + m_viewVecPort.Name = "Light Dir"; + break; + } + + switch( m_fresnelType ) + { + default: + case FresnelType.Standard: + m_biasPort.Visible = true; + m_biasPort.Name = "Bias"; + m_scalePort.Name = "Scale"; + m_scalePort.Visible = true; + m_powerPort.Visible = true; + break; + case FresnelType.Schlick: + m_biasPort.Visible = true; + m_biasPort.Name = "F0"; + m_scalePort.Visible = false; + m_powerPort.Visible = false; + break; + case FresnelType.SchlickIOR: + m_biasPort.Visible = false; + m_scalePort.Name = "IOR"; + m_scalePort.Visible = true; + m_powerPort.Visible = false; + break; + } + + m_sizeIsDirty = true; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + if( dataCollector.IsFragmentCategory ) + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_POS ); + + string viewdir = string.Empty; + if( m_viewType == ViewType.ViewDir ) + { + if( m_viewVecPort.IsConnected ) + viewdir = m_viewVecPort.GeneratePortInstructions( ref dataCollector ); + else + viewdir = GeneratorUtils.GenerateViewDirection( ref dataCollector, UniqueId, ViewSpace.World ); + } + else + { + if( m_viewVecPort.IsConnected ) + viewdir = m_viewVecPort.GeneratePortInstructions( ref dataCollector ); + else + viewdir = GeneratorUtils.GenerateWorldLightDirection( ref dataCollector, UniqueId, CurrentPrecisionType ); + } + + string normal = string.Empty; + if( m_normalType == NormalType.WorldNormal || m_normalType == NormalType.TangentNormal ) + { + if( m_normalVecPort.IsConnected ) + { + normal = m_normalVecPort.GeneratePortInstructions( ref dataCollector ); + + if( dataCollector.IsFragmentCategory ) + { + dataCollector.AddToInput( UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + + if( m_normalType == NormalType.TangentNormal ) + { + if( dataCollector.IsTemplate ) + { + normal = dataCollector.TemplateDataCollectorInstance.GetWorldNormal( UniqueId, CurrentPrecisionType, normal, OutputId ); + } + else + { + normal = GeneratorUtils.GenerateWorldNormal( ref dataCollector, UniqueId, CurrentPrecisionType, normal, OutputId ); + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_NORMAL, CurrentPrecisionType ); + dataCollector.ForceNormal = true; + } + } + else + { + if( m_normalizeVectors ) + normal = string.Format( "normalize( {0} )", normal ); + } + } + else + { + if( m_normalType == NormalType.TangentNormal ) + { + string wtMatrix = GeneratorUtils.GenerateWorldToTangentMatrix( ref dataCollector, UniqueId, CurrentPrecisionType ); + normal = "mul( " + normal + "," + wtMatrix + " )"; + } + } + } + else + { + if( dataCollector.IsFragmentCategory ) + { + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_NORMAL, CurrentPrecisionType ); + if( dataCollector.DirtyNormal ) + dataCollector.AddToInput( UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + } + + if( dataCollector.IsTemplate ) + normal = dataCollector.TemplateDataCollectorInstance.GetWorldNormal( CurrentPrecisionType, normalize: ( dataCollector.DirtyNormal && m_normalizeVectors ) ); + else + normal = GeneratorUtils.GenerateWorldNormal( ref dataCollector, UniqueId, ( dataCollector.DirtyNormal && m_normalizeVectors ) ); + + if( dataCollector.DirtyNormal ) + { + dataCollector.ForceNormal = true; + } + } + } + else + { + // generate HV + if( !m_normalVecPort.IsConnected ) + { + string halfView = GeneratorUtils.GenerateViewDirection( ref dataCollector, UniqueId, ViewSpace.World ); + string halfLight = GeneratorUtils.GenerateWorldLightDirection( ref dataCollector, UniqueId, CurrentPrecisionType ); + normal = "halfVector" + OutputId; + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT3, normal, "normalize( " + halfView + " + " + halfLight + " )" ); + } + else + { + normal = m_normalVecPort.GeneratePortInstructions( ref dataCollector ); + if( m_normalizeVectors ) + normal = string.Format( "normalize( {0} )", normal ); + } + } + + string bias = m_biasPort.GeneratePortInstructions( ref dataCollector ); + string scale = m_scalePort.GeneratePortInstructions( ref dataCollector ); + string power = m_powerPort.GeneratePortInstructions( ref dataCollector ); + + string fresnelNDotVLocalValue = "dot( " + normal + ", " + viewdir + " )"; + string fresnelNDotVLocalVar = "fresnelNdotV" + OutputId; + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT, fresnelNDotVLocalVar, fresnelNDotVLocalValue ); + + string fresnelFinalVar = FresnedFinalVar + OutputId; + + string result = string.Empty; + switch( m_fresnelType ) + { + default: + case FresnelType.Standard: + { + string powOp = m_safePower? string.Format( "pow( max( 1.0 - {0} , 0.0001 ), {1} )", fresnelNDotVLocalVar, power ): + string.Format( "pow( 1.0 - {0}, {1} )", fresnelNDotVLocalVar, power ); + result = string.Format( "( {0} + {1} * {2} )", bias, scale, powOp ); + } + break; + case FresnelType.Schlick: + { + string f0VarName = "f0" + OutputId; + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT, f0VarName, bias ); + string powOp = m_safePower? string.Format( "pow( max( 1.0 - {0} , 0.0001 ), 5 )", fresnelNDotVLocalVar ) : + string.Format( "pow( 1.0 - {0}, 5 )", fresnelNDotVLocalVar ); + result = string.Format( "( {0} + ( 1.0 - {0} ) * {1} )", f0VarName, powOp ); + } + break; + case FresnelType.SchlickIOR: + { + string iorVarName = "ior" + OutputId; + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT, iorVarName, scale ); + string iorPowOp = m_safePower? string.Format( "pow( max( ( 1 - {0} ) / ( 1 + {0} ) , 0.0001 ), 2 )", iorVarName ): + string.Format( "pow( ( 1 - {0} ) / ( 1 + {0} ), 2 )", iorVarName ); + + dataCollector.AddLocalVariable( UniqueId, iorVarName +" = "+ iorPowOp + ";"); + + string fresnelPowOp = m_safePower? string.Format( "pow( max( 1.0 - {0} , 0.0001 ), 5 )", fresnelNDotVLocalVar ): + string.Format( "pow( 1.0 - {0}, 5 )", fresnelNDotVLocalVar ); + result = string.Format( "( {0} + ( 1.0 - {0} ) * {1} )", iorVarName, fresnelPowOp ); + } + break; + } + + RegisterLocalVariable( 0, result, ref dataCollector, fresnelFinalVar ); + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + base.PropagateNodeData( nodeData, ref dataCollector ); + if( m_normalType == NormalType.TangentNormal && m_normalVecPort.IsConnected ) + dataCollector.DirtyNormal = true; + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + + if( UIUtils.CurrentShaderVersion() > 15305 ) + { + m_fresnelType = (FresnelType)Enum.Parse( typeof( FresnelType ), GetCurrentParam( ref nodeParams ) ); + m_normalType = (NormalType)Enum.Parse( typeof( NormalType ), GetCurrentParam( ref nodeParams ) ); + m_viewType = (ViewType)Enum.Parse( typeof( ViewType ), GetCurrentParam( ref nodeParams ) ); + m_normalizeVectors = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > 17502 ) + m_safePower = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + else + { + if( UIUtils.CurrentShaderVersion() >= 13202 ) + { + m_normalSpace = (ViewSpace)Enum.Parse( typeof( ViewSpace ), GetCurrentParam( ref nodeParams ) ); + } + else + { + m_normalSpace = ViewSpace.World; + } + + if( m_normalSpace == ViewSpace.World ) + m_normalType = NormalType.WorldNormal; + else + m_normalType = NormalType.TangentNormal; + } + UpdatePort(); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + + IOUtils.AddFieldValueToString( ref nodeInfo, m_fresnelType ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_normalType ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_viewType ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_normalizeVectors ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_safePower ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/FresnelNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/FresnelNode.cs.meta new file mode 100644 index 0000000..54876f8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/FresnelNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 91955bc593b0dc14d90b10cb3eb25355 +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/GetLocalVarNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/GetLocalVarNode.cs new file mode 100644 index 0000000..42fb540 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/GetLocalVarNode.cs @@ -0,0 +1,430 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Get Local Var", "Miscellaneous", "Use a registered local variable", null, KeyCode.G )] + public class GetLocalVarNode : ParentNode + { + [SerializeField] + private int m_referenceId = -1; + + [SerializeField] + private float m_referenceWidth = -1; + + [SerializeField] + private int m_nodeId = -1; + + [SerializeField] + private RegisterLocalVarNode m_currentSelected = null; + + [SerializeField] + private string m_registerLocalVarName = string.Empty; + + private int m_cachedPropertyId = -1; + + private string m_previousLabel = string.Empty; + + private bool m_refSelect = false; + private int m_prevReferenceId = -1; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddOutputPort( WirePortDataType.OBJECT, Constants.EmptyPortValue ); + + // This is needed for infinite loop detection + AddInputPort( WirePortDataType.OBJECT, false, Constants.EmptyPortValue ); + m_inputPorts[ 0 ].Visible = false; + + m_outputPorts[ 0 ].Locked = true; + m_textLabelWidth = 80; + m_autoWrapProperties = true; + m_hasLeftDropdown = true; + m_previewShaderGUID = "f21a6e44c7d7b8543afacd19751d24c6"; + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + + if( UniqueId > -1 ) + m_containerGraph.LocalVarNodes.OnReorderEventComplete += OnReorderEventComplete; + } + + private void OnReorderEventComplete() + { + if( m_currentSelected != null ) + { + m_referenceId = m_containerGraph.LocalVarNodes.GetNodeRegisterIdx( m_currentSelected.UniqueId ); + } + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + if( m_currentSelected != null ) + { + if( m_drawPreviewAsSphere != m_currentSelected.SpherePreview ) + { + m_drawPreviewAsSphere = m_currentSelected.SpherePreview; + OnNodeChange(); + } + //CheckSpherePreview(); + + if( m_cachedPropertyId == -1 ) + m_cachedPropertyId = Shader.PropertyToID( "_A" ); + + PreviewMaterial.SetTexture( m_cachedPropertyId, m_currentSelected.OutputPorts[ 0 ].OutputPreviewTexture ); + } + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUILayout.BeginHorizontal(); + EditorGUI.BeginChangeCheck(); + m_referenceId = EditorGUILayoutPopup( Constants.AvailableReferenceStr, m_referenceId, UIUtils.LocalVarNodeArr() ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateFromSelected(); + } + + if( GUILayout.Button( "\u25C4", "minibutton", GUILayout.Width( 17 ) ) && m_currentSelected ) + { + UIUtils.FocusOnNode( m_currentSelected, 0, false ); + } + EditorGUILayout.EndHorizontal(); + //EditorGUILayout.LabelField( ConnStatus.ToString() + " " + m_activeConnections ); + } + + public override void Destroy() + { + base.Destroy(); + CurrentSelected = null; + if( UniqueId > -1 ) + m_containerGraph.LocalVarNodes.OnReorderEventComplete -= OnReorderEventComplete; + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + if( m_dropdownEditing ) + { + EditorGUI.BeginChangeCheck(); + m_referenceId = EditorGUIPopup( m_dropdownRect, m_referenceId, UIUtils.LocalVarNodeArr(), UIUtils.PropertyPopUp ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateFromSelected(); + DropdownEditing = false; + } + } + } + + public override void OnNodeLogicUpdate( DrawInfo drawInfo ) + { + base.OnNodeLogicUpdate( drawInfo ); + UpdateLocalVar(); + } + + public override void OnNodeRepaint( DrawInfo drawInfo ) + { + base.OnNodeRepaint( drawInfo ); + + if( m_isVisible && m_refSelect && !m_selected ) + { + GUI.color = Constants.SpecialGetLocalVarSelectionColor; + GUI.Label( m_globalPosition, string.Empty, UIUtils.GetCustomStyle( CustomStyle.NodeWindowOn ) ); + GUI.color = m_colorBuffer; + } + } + + void CheckForLoops() + { + if( CurrentSelected != null && UIUtils.DetectNodeLoopsFrom( CurrentSelected, new Dictionary() ) ) + { + CurrentSelected = UIUtils.GetLocalVarNode( m_prevReferenceId ); + if( CurrentSelected == null || UIUtils.DetectNodeLoopsFrom( CurrentSelected, new Dictionary() ) ) + { + m_referenceId = -1; + m_prevReferenceId = -1; + CurrentSelected = null; + m_outputPorts[ 0 ].Locked = true; + SetAdditonalTitleText( "" ); + UIUtils.ShowMessage( "Infinite Loop detected, disabled selection" ); + } + else + { + m_referenceId = m_prevReferenceId; + UIUtils.ShowMessage( "Infinite Loop detected, reverted to previous selection" ); + } + } + } + + void UpdateFromSelected() + { + CurrentSelected = UIUtils.GetLocalVarNode( m_referenceId ); + CheckForLoops(); + + if( m_currentSelected != null ) + { + m_nodeId = m_currentSelected.UniqueId; + m_outputPorts[ 0 ].Locked = false; + m_outputPorts[ 0 ].ChangeType( m_currentSelected.OutputPorts[ 0 ].DataType, false ); + m_drawPreviewAsSphere = m_currentSelected.SpherePreview; + CheckSpherePreview(); + + m_previousLabel = m_currentSelected.DataToArray; + SetAdditonalTitleText( string.Format( Constants.SubTitleVarNameFormatStr, m_currentSelected.DataToArray ) ); + m_referenceWidth = m_currentSelected.Position.width; + } + + m_sizeIsDirty = true; + m_isDirty = true; + m_prevReferenceId = m_referenceId; + } + + public void UpdateLocalVar() + { + m_refSelect = false; + if( m_referenceId > -1 ) + { + ParentNode newNode = UIUtils.GetLocalVarNode( m_referenceId ); + if( newNode != null ) + { + if( newNode.UniqueId != m_nodeId ) + { + CurrentSelected = null; + int count = UIUtils.LocalVarNodeAmount(); + for( int i = 0; i < count; i++ ) + { + ParentNode node = UIUtils.GetLocalVarNode( i ); + if( node.UniqueId == m_nodeId ) + { + CurrentSelected = node as RegisterLocalVarNode; + m_referenceId = i; + break; + } + } + } + } + + if( m_currentSelected != null ) + { + if( m_currentSelected.OutputPorts[ 0 ].DataType != m_outputPorts[ 0 ].DataType ) + { + m_outputPorts[ 0 ].Locked = false; + m_outputPorts[ 0 ].ChangeType( m_currentSelected.OutputPorts[ 0 ].DataType, false ); + } + + if( !m_previousLabel.Equals( m_currentSelected.DataToArray ) ) + { + m_previousLabel = m_currentSelected.DataToArray; + SetAdditonalTitleText( string.Format( Constants.SubTitleVarNameFormatStr, m_currentSelected.DataToArray ) ); + } + + if( m_referenceWidth != m_currentSelected.Position.width ) + { + m_referenceWidth = m_currentSelected.Position.width; + m_sizeIsDirty = true; + } + + if( m_currentSelected.Selected ) + m_refSelect = true; + } + else + { + ResetReference(); + } + } + } + + public void ResetReference() + { + m_outputPorts[ 0 ].Locked = true; + m_currentSelected = null; + m_inputPorts[ 0 ].DummyClear(); + m_nodeId = -1; + m_referenceId = -1; + m_referenceWidth = -1; + SetAdditonalTitleText( string.Empty ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_currentSelected != null ) + { + return m_currentSelected.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + } + else + { + UIUtils.ShowMessage( UniqueId, "Get Local Var node without reference. Attempting to access inexistant local variable.", MessageSeverity.Error ); + + return m_outputPorts[ 0 ].ErrorValue; + } + } + + + //public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + //{ + // base.PropagateNodeData( nodeData, ref dataCollector ); + // if( m_currentSelected != null ) + // { + // m_currentSelected.PropagateNodeData( nodeData, ref dataCollector ); + // } + //} + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > 15 ) + { + m_nodeId = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_outputPorts[ 0 ].Locked = ( m_nodeId < 0 ); + if( UIUtils.CurrentShaderVersion() > 15500 ) + { + m_registerLocalVarName = GetCurrentParam( ref nodeParams ); + } + } + else + { + m_referenceId = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_outputPorts[ 0 ].Locked = ( m_referenceId < 0 ); + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + if( m_currentSelected != null ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_currentSelected.UniqueId ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_currentSelected.DataToArray ); + } + else + { + IOUtils.AddFieldValueToString( ref nodeInfo, -1 ); + IOUtils.AddFieldValueToString( ref nodeInfo, string.Empty ); + } + + } + + public override void OnNodeDoubleClicked( Vector2 currentMousePos2D ) + { + if( m_currentSelected != null ) + { + UIUtils.FocusOnNode( m_currentSelected, 0, true ); + } + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + if( UIUtils.CurrentShaderVersion() > 15 ) + { + CurrentSelected = UIUtils.GetNode( m_nodeId ) as RegisterLocalVarNode; + m_referenceId = UIUtils.GetLocalVarNodeRegisterId( m_nodeId ); + if( CurrentSelected == null && UIUtils.CurrentShaderVersion() > 15500 && !string.IsNullOrEmpty( m_registerLocalVarName ) ) + { + CurrentSelected = m_containerGraph.LocalVarNodes.GetNodeByDataToArray( m_registerLocalVarName ); + if( CurrentSelected != null ) + { + m_nodeId = CurrentSelected.UniqueId; + m_referenceId = UIUtils.GetLocalVarNodeRegisterId( m_nodeId ); + } + } + } + else + { + CurrentSelected = UIUtils.GetLocalVarNode( m_referenceId ); + if( m_currentSelected != null ) + { + m_nodeId = m_currentSelected.UniqueId; + } + } + + CheckForLoops(); + + if( m_currentSelected != null ) + { + m_outputPorts[ 0 ].Locked = false; + m_outputPorts[ 0 ].ChangeType( m_currentSelected.OutputPorts[ 0 ].DataType, false ); + } + else + { + m_outputPorts[ 0 ].Locked = true; + } + } + + public override void ActivateNode( int signalGenNodeId, int signalGenPortId, System.Type signalGenNodeType ) + { + base.ActivateNode( signalGenNodeId, signalGenPortId, signalGenNodeType ); + if( m_activeConnections == 1 ) + { + if( m_currentSelected != null ) + { + m_currentSelected.ActivateNode( signalGenNodeId, signalGenPortId, signalGenNodeType ); + } + } + } + + public override void DeactivateNode( int deactivatedPort, bool forceComplete ) + { + forceComplete = forceComplete || ( m_activeConnections == 1 ); + base.DeactivateNode( deactivatedPort, forceComplete ); + if( forceComplete && m_currentSelected != null ) + { + m_currentSelected.DeactivateNode( deactivatedPort, false ); + } + } + + public override void OnNodeSelected( bool value ) + { + base.OnNodeSelected( value ); + if( m_currentSelected != null ) + { + m_currentSelected.CheckReferenceSelection(); + } + } + + public RegisterLocalVarNode CurrentSelected + { + get { return m_currentSelected; } + set + { + // This is needed for infinite loop detection + if( m_inputPorts != null ) + m_inputPorts[ 0 ].DummyClear(); + + if( m_currentSelected != null ) + { + m_currentSelected.UnregisterGetLocalVar( this ); + + //if( m_currentSelected != value ) + m_currentSelected.DeactivateNode( 0, false ); + } + + if( value != null ) + { + value.RegisterGetLocalVar( this ); + if( IsConnected && value != m_currentSelected ) + value.ActivateNode( UniqueId, 0, m_activeType ); + + // This is needed for infinite loop detection + m_inputPorts[ 0 ].DummyAdd( value.UniqueId, 0 ); ; + } + + m_currentSelected = value; + + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/GetLocalVarNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/GetLocalVarNode.cs.meta new file mode 100644 index 0000000..9b80add --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/GetLocalVarNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: efce529ed3c74854b9d0cece836991c3 +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/LayeredBlendNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/LayeredBlendNode.cs new file mode 100644 index 0000000..21589b0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/LayeredBlendNode.cs @@ -0,0 +1,61 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using System; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Layered Blend", "Miscellaneous", "Mix all channels through interpolation factors", null, KeyCode.None, true )] + public sealed class LayeredBlendNode : WeightedAvgNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_inputPorts[ 1 ].Name = "Layer Base"; + AddInputPort( WirePortDataType.FLOAT, false, string.Empty ); + for ( int i = 2; i < m_inputPorts.Count; i++ ) + { + m_inputPorts[ i ].Name = AmountsStr[ i - 2 ]; + } + m_inputData = new string[ 6 ]; + m_minimumSize = 2; + UpdateConnection( 0 ); + m_previewShaderGUID = "48faca2f6506fc44c97adb1e2b79c37d"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + GetInputData( ref dataCollector, ignoreLocalvar ); + + string result = string.Empty; + string localVarName = "layeredBlendVar" + OutputId; + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, m_inputPorts[ 0 ].DataType, localVarName, m_inputData[ 0 ] ); + + if ( m_activeCount == 1 ) + { + result = m_inputData[ 0 ]; + } + else if ( m_activeCount == 2 ) + { + result += "lerp( " + m_inputData[ 1 ] + "," + m_inputData[ 2 ] + " , " + localVarName + " )"; + } + else + { + result = m_inputData[ 1 ]; + for ( int i = 1; i < m_activeCount; i++ ) + { + result = "lerp( " + result + " , " + m_inputData[ i + 1 ] + " , " + localVarName + Constants.VectorSuffixes[ i - 1 ] + " )"; + } + } + result = UIUtils.AddBrackets( result ); + RegisterLocalVariable( 0, result, ref dataCollector, "layeredBlend" + OutputId ); + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/LayeredBlendNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/LayeredBlendNode.cs.meta new file mode 100644 index 0000000..bcfcd29 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/LayeredBlendNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 90801da82a0b4f74cae2f9387bd5ad92 +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/LinearDepthNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/LinearDepthNode.cs new file mode 100644 index 0000000..5e84c3a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/LinearDepthNode.cs @@ -0,0 +1,109 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Linear Depth", "Miscellaneous", "Converts depth values given on logarithmic space to linear" )] + public sealed class LinearDepthNode : ParentNode + { + private readonly string[] LinearModeLabels = { "Eye Space", "0-1 Space" }; + + private const string LinearEyeFuncFormat = "LinearEyeDepth({0})"; + private const string Linear01FuncFormat = "Linear01Depth({0})"; + + private const string LinearEyeFuncSRPFormat = "LinearEyeDepth({0},_ZBufferParams)"; + private const string Linear01FuncSRPFormat = "Linear01Depth({0},_ZBufferParams)"; + + private const string LinerValName = "depthToLinear"; + private const string ViewSpaceLabel = "View Space"; + + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + + [SerializeField] + private int m_currentOption = 0; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, Constants.EmptyPortValue ); + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + m_autoWrapProperties = true; + m_hasLeftDropdown = true; + m_previewShaderGUID = "2b0785cc8b854974ab4e45419072705a"; + UpdateFromOption(); + } + + public override void Destroy() + { + base.Destroy(); + m_upperLeftWidget = null; + } + + void UpdateFromOption() + { + m_previewMaterialPassId = m_currentOption; + SetAdditonalTitleText( string.Format( Constants.SubTitleSpaceFormatStr, LinearModeLabels[ m_currentOption ] ) ); + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + EditorGUI.BeginChangeCheck(); + m_currentOption = m_upperLeftWidget.DrawWidget( this, m_currentOption, LinearModeLabels ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateFromOption(); + } + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUI.BeginChangeCheck(); + m_currentOption = EditorGUILayoutPopup( ViewSpaceLabel, m_currentOption, LinearModeLabels ); + if( EditorGUI.EndChangeCheck() ) + { + SetAdditonalTitleText( string.Format( Constants.SubTitleSpaceFormatStr, LinearModeLabels[ m_currentOption ] ) ); + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + + string value = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + if( dataCollector.IsSRP ) + { + value = string.Format( ( ( m_currentOption == 0 ) ? LinearEyeFuncSRPFormat : Linear01FuncSRPFormat ), value ); + } + else + { + value = string.Format( ( ( m_currentOption == 0 ) ? LinearEyeFuncFormat : Linear01FuncFormat ), value ); + } + RegisterLocalVariable( 0, value, ref dataCollector, LinerValName + OutputId ); + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_currentOption ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + int.TryParse( GetCurrentParam( ref nodeParams ), out m_currentOption ); + UpdateFromOption(); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/LinearDepthNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/LinearDepthNode.cs.meta new file mode 100644 index 0000000..490856d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/LinearDepthNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8b8af65130c9ed64f95976ec67ac1adf +timeCreated: 1546438982 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/MatrixFromVectors.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/MatrixFromVectors.cs new file mode 100644 index 0000000..af6325b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/MatrixFromVectors.cs @@ -0,0 +1,215 @@ +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Matrix From Vectors", "Matrix Operators", "Matrix From Vectors" )] + public sealed class MatrixFromVectors : ParentNode + { + private const string RowFromVector = "Input to Row"; + [SerializeField] + private WirePortDataType m_selectedOutputType = WirePortDataType.FLOAT3x3; + + [SerializeField] + private int m_selectedOutputTypeInt = 0; + + [SerializeField] + private Vector3[] m_defaultValuesV3 = { Vector3.zero, Vector3.zero, Vector3.zero }; + + [SerializeField] + private Vector4[] m_defaultValuesV4 = { Vector4.zero, Vector4.zero, Vector4.zero, Vector4.zero }; + + [SerializeField] + private bool m_rowsFromVector = true; + + private string[] m_defaultValuesStr = { "[0]", "[1]", "[2]", "[3]" }; + + private readonly string[] _outputValueTypes ={ "Matrix3X3", + "Matrix4X4"}; + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT4, false, "[0]" ); + AddInputPort( WirePortDataType.FLOAT4, false, "[1]" ); + AddInputPort( WirePortDataType.FLOAT4, false, "[2]" ); + AddInputPort( WirePortDataType.FLOAT4, false, "[3]" ); + AddOutputPort( m_selectedOutputType, Constants.EmptyPortValue ); + m_textLabelWidth = 90; + m_autoWrapProperties = true; + m_hasLeftDropdown = true; + UpdatePorts(); + } + + public override void AfterCommonInit() + { + base.AfterCommonInit(); + if( PaddingTitleLeft == 0 ) + { + PaddingTitleLeft = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + if( PaddingTitleRight == 0 ) + PaddingTitleRight = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + } + } + + public override void Destroy() + { + base.Destroy(); + m_upperLeftWidget = null; + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + EditorGUI.BeginChangeCheck(); + m_selectedOutputTypeInt = m_upperLeftWidget.DrawWidget( this, m_selectedOutputTypeInt, _outputValueTypes ); + if( EditorGUI.EndChangeCheck() ) + { + switch( m_selectedOutputTypeInt ) + { + case 0: m_selectedOutputType = WirePortDataType.FLOAT3x3; break; + case 1: m_selectedOutputType = WirePortDataType.FLOAT4x4; break; + } + + UpdatePorts(); + } + } + + public override void DrawProperties() + { + base.DrawProperties(); + + EditorGUI.BeginChangeCheck(); + m_selectedOutputTypeInt = EditorGUILayoutPopup( "Output type", m_selectedOutputTypeInt, _outputValueTypes ); + if( EditorGUI.EndChangeCheck() ) + { + switch( m_selectedOutputTypeInt ) + { + case 0: m_selectedOutputType = WirePortDataType.FLOAT3x3; break; + case 1: m_selectedOutputType = WirePortDataType.FLOAT4x4; break; + } + + UpdatePorts(); + } + + int count = 0; + switch( m_selectedOutputType ) + { + case WirePortDataType.FLOAT3x3: + count = 3; + for( int i = 0; i < count; i++ ) + { + if( !m_inputPorts[ i ].IsConnected ) + m_defaultValuesV3[ i ] = EditorGUILayoutVector3Field( m_defaultValuesStr[ i ], m_defaultValuesV3[ i ] ); + } + break; + case WirePortDataType.FLOAT4x4: + count = 4; + for( int i = 0; i < count; i++ ) + { + if( !m_inputPorts[ i ].IsConnected ) + m_defaultValuesV4[ i ] = EditorGUILayoutVector4Field( m_defaultValuesStr[ i ], m_defaultValuesV4[ i ] ); + } + break; + } + m_rowsFromVector = EditorGUILayoutToggle( RowFromVector, m_rowsFromVector ); + } + + void UpdatePorts() + { + m_sizeIsDirty = true; + ChangeOutputType( m_selectedOutputType, false ); + switch( m_selectedOutputType ) + { + case WirePortDataType.FLOAT3x3: + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT3, false ); + m_inputPorts[ 1 ].ChangeType( WirePortDataType.FLOAT3, false ); + m_inputPorts[ 2 ].ChangeType( WirePortDataType.FLOAT3, false ); + m_inputPorts[ 3 ].ChangeType( WirePortDataType.FLOAT3, false ); + m_inputPorts[ 3 ].Visible = false; + break; + case WirePortDataType.FLOAT4x4: + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT4, false ); + m_inputPorts[ 1 ].ChangeType( WirePortDataType.FLOAT4, false ); + m_inputPorts[ 2 ].ChangeType( WirePortDataType.FLOAT4, false ); + m_inputPorts[ 3 ].ChangeType( WirePortDataType.FLOAT4, false ); + m_inputPorts[ 3 ].Visible = true; + break; + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + string result = ""; + switch( m_selectedOutputType ) + { + case WirePortDataType.FLOAT3x3: + if( m_rowsFromVector ) + { + result = "float3x3(" + m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ) + ", " + + m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ) + ", " + + m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector ) + ")"; + } + else + { + string vec0 = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string vec1 = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + string vec2 = m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector ); + result = string.Format( "float3x3({0}.x,{1}.x,{2}.x,{0}.y,{1}.y,{2}.y,{0}.z,{1}.z,{2}.z )", vec0, vec1, vec2 ); + } + break; + case WirePortDataType.FLOAT4x4: + if( m_rowsFromVector ) + { + result = "float4x4(" + m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ) + ", " + + m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ) + ", " + + m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector ) + ", " + + m_inputPorts[ 3 ].GeneratePortInstructions( ref dataCollector ) + ")"; + } + else + { + string vec0 = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string vec1 = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + string vec2 = m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector ); + string vec3 = m_inputPorts[ 3 ].GeneratePortInstructions( ref dataCollector ); + result = string.Format( "float4x4( {0}.x,{1}.x,{2}.x,{3}.x,{0}.y,{1}.y,{2}.y,{3}.y,{0}.z,{1}.z,{2}.z,{3}.z,{0}.w,{1}.w,{2}.w,{3}.w )", vec0, vec1, vec2, vec3 ); + } + break; + } + + return result; + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_selectedOutputType = (WirePortDataType)Enum.Parse( typeof( WirePortDataType ), GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > 15310 ) + { + m_rowsFromVector = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + switch( m_selectedOutputType ) + { + case WirePortDataType.FLOAT3x3: + m_selectedOutputTypeInt = 0; + break; + case WirePortDataType.FLOAT4x4: + m_selectedOutputTypeInt = 1; + break; + } + UpdatePorts(); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_selectedOutputType ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_rowsFromVector ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/MatrixFromVectors.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/MatrixFromVectors.cs.meta new file mode 100644 index 0000000..2523184 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/MatrixFromVectors.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a313774cf0e4d1e4289d7395e8e49067 +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/PosFromTransformMatrix.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/PosFromTransformMatrix.cs new file mode 100644 index 0000000..41a1478 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/PosFromTransformMatrix.cs @@ -0,0 +1,34 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Position From Transform", "Matrix Operators", "Gets the position vector from a transformation matrix" )] + public sealed class PosFromTransformMatrix : ParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT4x4, true, Constants.EmptyPortValue ); + AddOutputPort( WirePortDataType.FLOAT4, "XYZW" ); + AddOutputPort( WirePortDataType.FLOAT, "X" ); + AddOutputPort( WirePortDataType.FLOAT, "Y" ); + AddOutputPort( WirePortDataType.FLOAT, "Z" ); + AddOutputPort( WirePortDataType.FLOAT, "W" ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + + string value = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string result = string.Format( "float4( {0},{1},{2},{3})", value + "[3][0]", value + "[3][1]", value + "[3][2]", value + "[3][3]" ); + RegisterLocalVariable( 0, result, ref dataCollector, "matrixToPos" + OutputId ); + + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/PosFromTransformMatrix.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/PosFromTransformMatrix.cs.meta new file mode 100644 index 0000000..568be07 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/PosFromTransformMatrix.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7c7321a370f1f1b499d4655cc25f457b +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/RegisterLocalVarNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/RegisterLocalVarNode.cs new file mode 100644 index 0000000..6a7ab5e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/RegisterLocalVarNode.cs @@ -0,0 +1,352 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Register Local Var", "Miscellaneous", "Forces a local variable to be written with the given name. Can then be fetched at any place with a Get Local Var node.", null, KeyCode.R )] + public sealed class RegisterLocalVarNode : ParentNode + { + private const double MaxEditingTimestamp = 1; + + private const string LocalDefaultNameStr = "myVarName"; + private const string LocalVarNameStr = "Var Name"; + private const string OrderIndexStr = "Order Index"; + private const string AutoOrderIndexStr = "Auto Order"; + private const string ReferencesStr = "References"; + + private const string GetLocalVarLabel = "( {0} ) Get Local Var"; + private string m_oldName = string.Empty; + private bool m_reRegisterName = false; + private int m_autoOrderIndex = int.MaxValue; + private bool m_forceUpdate = true; + private bool m_refSelect = false; + + private bool m_referencesVisible = false; + + [SerializeField] + private string m_variableName = LocalDefaultNameStr; + + [SerializeField] + private int m_orderIndex = -1; + + [SerializeField] + private bool m_autoIndexActive = true; + + [SerializeField] + private List m_registeredGetLocalVars = new List(); + + [NonSerialized] + private double m_editingTimestamp; + + [NonSerialized] + private bool m_editingTimestampFlag; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, Constants.EmptyPortValue ); + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + m_inputPorts[ 0 ].SetFreeForAll(); + m_textLabelWidth = 85; + m_customPrecision = true; + + if( m_containerGraph != null ) + m_variableName += m_containerGraph.LocalVarNodes.NodesList.Count; + + m_oldName = m_variableName; + UpdateTitle(); + m_previewShaderGUID = "5aaa1d3ea9e1fa64781647e035a82334"; + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + m_containerGraph.LocalVarNodes.AddNode( this ); + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + m_inputPorts[ 0 ].MatchPortToConnection(); + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + } + + public override void OnConnectedOutputNodeChanges( int outputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( outputPortId, otherNodeId, otherPortId, name, type ); + m_inputPorts[ 0 ].MatchPortToConnection(); + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + + for( int i = 0 ; i < m_registeredGetLocalVars.Count ; i++ ) + { + m_registeredGetLocalVars[ i ].UpdateLocalVar(); + } + } + + void UpdateTitle() + { + SetAdditonalTitleText( string.Format( Constants.SubTitleVarNameFormatStr, m_variableName ) ); + } + + public override void OnNodeLogicUpdate( DrawInfo drawInfo ) + { + base.OnNodeLogicUpdate( drawInfo ); + if( m_editingTimestampFlag && ( EditorApplication.timeSinceStartup - m_editingTimestamp ) > MaxEditingTimestamp ) + { + m_editingTimestampFlag = false; + CheckAndChangeName(); + } + } + + void DrawMainProperties() + { + EditorGUI.BeginChangeCheck(); + m_variableName = EditorGUILayoutTextField( LocalVarNameStr, m_variableName ); + if( EditorGUI.EndChangeCheck() ) + { + m_editingTimestampFlag = true; + m_editingTimestamp = EditorApplication.timeSinceStartup; + //CheckAndChangeName(); + } + + DrawPrecisionProperty(); + } + + public override void AfterDuplication() + { + base.AfterDuplication(); + CheckAndChangeName(); + } + + void CheckAndChangeName() + { + m_variableName = UIUtils.RemoveInvalidCharacters( m_variableName ); + if( string.IsNullOrEmpty( m_variableName ) ) + { + m_variableName = LocalDefaultNameStr + OutputId; + } + bool isNumericName = UIUtils.IsNumericName( m_variableName ); + bool isLocalVarNameAvailable = m_containerGraph.ParentWindow.DuplicatePrevBufferInstance.IsLocalvariableNameAvailable( m_variableName ); + if( !isNumericName && isLocalVarNameAvailable ) + { + m_containerGraph.ParentWindow.DuplicatePrevBufferInstance.ReleaseLocalVariableName( UniqueId, m_oldName ); + m_containerGraph.ParentWindow.DuplicatePrevBufferInstance.RegisterLocalVariableName( UniqueId, m_variableName ); + m_oldName = m_variableName; + m_containerGraph.LocalVarNodes.UpdateDataOnNode( UniqueId, m_variableName ); + UpdateTitle(); + m_forceUpdate = true; + } + else + { + if( isNumericName ) + { + UIUtils.ShowMessage( UniqueId, string.Format( "Local variable name '{0}' cannot start or be numerical values. Reverting back to '{1}'.", m_variableName, m_oldName ), MessageSeverity.Warning ); + } + else if( !isLocalVarNameAvailable ) + { + UIUtils.ShowMessage( UniqueId, string.Format( "Local variable name '{0}' already being used. Reverting back to '{1}'.", m_variableName, m_oldName ), MessageSeverity.Warning ); + } + + m_variableName = m_oldName; + m_containerGraph.LocalVarNodes.UpdateDataOnNode( UniqueId, m_variableName ); + } + } + + void DrawReferences() + { + int count = m_registeredGetLocalVars.Count; + if( m_registeredGetLocalVars.Count > 0 ) + { + for( int i = 0; i < count; i++ ) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField( string.Format( GetLocalVarLabel, m_registeredGetLocalVars[ i ].UniqueId ) ); + if( GUILayout.Button( "\u25BA", "minibutton", GUILayout.Width( 17 ) ) ) + { + m_containerGraph.ParentWindow.FocusOnNode( m_registeredGetLocalVars[ i ], 0, false ); + } + EditorGUILayout.EndHorizontal(); + } + + if( GUILayout.Button( "Back" ) ) + { + m_containerGraph.ParentWindow.FocusOnNode( this, 0, false ); + } + } + else + { + EditorGUILayout.HelpBox( "This node is not being referenced by any Get Local Var.", MessageType.Info ); + } + } + + public override void DrawProperties() + { + NodeUtils.DrawPropertyGroup( ref m_propertiesFoldout, Constants.ParameterLabelStr, DrawMainProperties ); + NodeUtils.DrawPropertyGroup( ref m_referencesVisible, ReferencesStr, DrawReferences ); + //EditorGUILayout.LabelField(ConnStatus.ToString()+" "+m_activeConnections); + } + + public override void OnEnable() + { + base.OnEnable(); + m_reRegisterName = true; + } + + public void CheckReferenceSelection() + { + m_refSelect = false; + int count = m_registeredGetLocalVars.Count; + for( int i = 0; i < count; i++ ) + { + if( m_registeredGetLocalVars[ i ].Selected ) + m_refSelect = true; + } + } + + public override void OnNodeRepaint( DrawInfo drawInfo ) + { + base.OnNodeRepaint( drawInfo ); + if( m_isVisible && m_refSelect && !m_selected ) + { + GUI.color = Constants.SpecialRegisterLocalVarSelectionColor; + GUI.Label( m_globalPosition, string.Empty, UIUtils.GetCustomStyle( CustomStyle.NodeWindowOn ) ); + GUI.color = m_colorBuffer; + } + } + + public override void Draw( DrawInfo drawInfo ) + { + + base.Draw( drawInfo ); + if( m_reRegisterName ) + { + m_reRegisterName = false; + m_containerGraph.ParentWindow.DuplicatePrevBufferInstance.RegisterLocalVariableName( UniqueId, m_variableName ); + } + + if( m_forceUpdate ) + { + m_forceUpdate = false; + UpdateTitle(); + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + { + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + string result = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + if( m_inputPorts[ 0 ].DataType == WirePortDataType.OBJECT ) + m_outputPorts[ 0 ].SetLocalValue( result, dataCollector.PortCategory ); + else + RegisterLocalVariable( 0, result, ref dataCollector, m_variableName + OutputId ); + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_variableName = GetCurrentParam( ref nodeParams ); + m_oldName = m_variableName; + if( UIUtils.CurrentShaderVersion() > 14 ) + m_orderIndex = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + + if( UIUtils.CurrentShaderVersion() > 3106 ) + { + m_autoIndexActive = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + else + { + m_autoIndexActive = false; + } + if( !m_isNodeBeingCopied ) + { + m_containerGraph.LocalVarNodes.UpdateDataOnNode( UniqueId, m_variableName ); + m_containerGraph.ParentWindow.DuplicatePrevBufferInstance.ReleaseLocalVariableName( UniqueId, m_oldName ); + m_containerGraph.ParentWindow.DuplicatePrevBufferInstance.RegisterLocalVariableName( UniqueId, m_variableName ); + } + m_forceUpdate = true; + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_variableName ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_orderIndex ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_autoIndexActive ); + } + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + if( m_autoOrderIndex < nodeData.OrderIndex ) + { + nodeData.OrderIndex = m_autoOrderIndex - 1; + } + else + { + m_autoOrderIndex = nodeData.OrderIndex; + nodeData.OrderIndex -= 1; + } + + base.PropagateNodeData( nodeData, ref dataCollector ); + } + + public override void ResetNodeData() + { + base.ResetNodeData(); + m_autoOrderIndex = int.MaxValue; + } + + public void RegisterGetLocalVar( GetLocalVarNode node ) + { + if( !m_registeredGetLocalVars.Contains( node ) ) + { + m_registeredGetLocalVars.Add( node ); + CheckReferenceSelection(); + } + } + + public void UnregisterGetLocalVar( GetLocalVarNode node ) + { + if( m_registeredGetLocalVars.Contains( node ) ) + { + m_registeredGetLocalVars.Remove( node ); + CheckReferenceSelection(); + } + } + + public override void Destroy() + { + base.Destroy(); + m_containerGraph.LocalVarNodes.RemoveNode( this ); + m_containerGraph.ParentWindow.DuplicatePrevBufferInstance.ReleaseLocalVariableName( UniqueId, m_variableName ); + + int count = m_registeredGetLocalVars.Count; + for( int i = 0; i < count; i++ ) + { + //GetLocalVarNode node = m_containerGraph.GetNode( m_registeredGetLocalVars[ i ] ) as GetLocalVarNode; + if( m_registeredGetLocalVars[ i ] != null ) + m_registeredGetLocalVars[ i ].ResetReference(); + } + m_registeredGetLocalVars.Clear(); + m_registeredGetLocalVars = null; + + m_containerGraph.LocalVarNodes.RemoveNode( this ); + } + + public override void ActivateNode( int signalGenNodeId, int signalGenPortId, Type signalGenNodeType ) + { + base.ActivateNode( signalGenNodeId, signalGenPortId, signalGenNodeType ); + } + public override string DataToArray { get { return m_variableName; } } + public List NodeReferences { get { return m_registeredGetLocalVars; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/RegisterLocalVarNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/RegisterLocalVarNode.cs.meta new file mode 100644 index 0000000..9cda9e5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/RegisterLocalVarNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ebd1a3b3014ccdd40b8fa805b4281c6f +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/RelayNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/RelayNode.cs new file mode 100644 index 0000000..ab6df69 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/RelayNode.cs @@ -0,0 +1,38 @@ +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Relay", "Miscellaneous", "Relay" )] + public sealed class RelayNode : ParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.OBJECT, false, Constants.EmptyPortValue ); + AddOutputPort( WirePortDataType.OBJECT, Constants.EmptyPortValue ); + m_previewShaderGUID = "74e4d859fbdb2c0468de3612145f4929"; + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + m_inputPorts[ 0 ].MatchPortToConnection(); + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + } + + public override void OnConnectedOutputNodeChanges( int outputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( outputPortId, otherNodeId, otherPortId, name, type ); + m_inputPorts[ 0 ].MatchPortToConnection(); + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + return m_inputPorts[ 0 ].GenerateShaderForOutput( ref dataCollector, m_inputPorts[ 0 ].DataType, ignoreLocalvar ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/RelayNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/RelayNode.cs.meta new file mode 100644 index 0000000..378c204 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/RelayNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ef679ba7cdeda594aa3e5c02b25e66df +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/RotateAboutAxisNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/RotateAboutAxisNode.cs new file mode 100644 index 0000000..b9b0a6c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/RotateAboutAxisNode.cs @@ -0,0 +1,95 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Rotate About Axis", "Vector Operators", "Rotates a vector around a normalized axis" )] + public class RotateAboutAxisNode : ParentNode + { + private const string FunctionHeader = "float3 RotateAroundAxis( float3 center, float3 original, float3 u, float angle )"; + private const string FunctionCall = "RotateAroundAxis( {0}, {1}, {2}, {3} )"; + private readonly string[] FunctionBody = + { + "float3 RotateAroundAxis( float3 center, float3 original, float3 u, float angle )\n", + "{\n", + "\toriginal -= center;\n", + "\tfloat C = cos( angle );\n", + "\tfloat S = sin( angle );\n", + "\tfloat t = 1 - C;\n", + "\tfloat m00 = t * u.x * u.x + C;\n", + "\tfloat m01 = t * u.x * u.y - S * u.z;\n", + "\tfloat m02 = t * u.x * u.z + S * u.y;\n", + "\tfloat m10 = t * u.x * u.y + S * u.z;\n", + "\tfloat m11 = t * u.y * u.y + C;\n", + "\tfloat m12 = t * u.y * u.z - S * u.x;\n", + "\tfloat m20 = t * u.x * u.z - S * u.y;\n", + "\tfloat m21 = t * u.y * u.z + S * u.x;\n", + "\tfloat m22 = t * u.z * u.z + C;\n", + "\tfloat3x3 finalMatrix = float3x3( m00, m01, m02, m10, m11, m12, m20, m21, m22 );\n", + "\treturn mul( finalMatrix, original ) + center;\n", + "}\n" + }; + + private const string NormalizeAxisLabel = "Rotation Axis"; + private const string NonNormalizeAxisLabel = "Normalized Rotation Axis"; + private const string NormalizeAxisStr = "Normalize Axis"; + + [UnityEngine.SerializeField] + private bool m_normalizeAxis = false; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT3, false, m_normalizeAxis? NormalizeAxisLabel: NonNormalizeAxisLabel ); + AddInputPort( WirePortDataType.FLOAT, false, "Rotation Angle" ); + AddInputPort( WirePortDataType.FLOAT3, false, "Pivot Point" ); + AddInputPort( WirePortDataType.FLOAT3, false, "Position" ); + AddOutputPort( WirePortDataType.FLOAT3, Constants.EmptyPortValue ); + m_useInternalPortData = true; + m_autoWrapProperties = true; + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUI.BeginChangeCheck(); + m_normalizeAxis = EditorGUILayoutToggle( NormalizeAxisStr, m_normalizeAxis ); + if( EditorGUI.EndChangeCheck() ) + { + m_inputPorts[ 0 ].Name = (m_normalizeAxis ? NormalizeAxisLabel : NonNormalizeAxisLabel); + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string normalizeRotAxis = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + if( m_normalizeAxis ) + { + normalizeRotAxis = string.Format( "normalize( {0} )", normalizeRotAxis ); + } + string rotationAngle = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + string pivotPoint = m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector ); + string position = m_inputPorts[ 3 ].GeneratePortInstructions( ref dataCollector ); + dataCollector.AddFunction( FunctionHeader, FunctionBody, false ); + RegisterLocalVariable( 0, string.Format( FunctionCall, pivotPoint, position, normalizeRotAxis, rotationAngle ), ref dataCollector, "rotatedValue" + OutputId ); + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_normalizeAxis = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_normalizeAxis ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/RotateAboutAxisNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/RotateAboutAxisNode.cs.meta new file mode 100644 index 0000000..f5af5b8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/RotateAboutAxisNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6190b6c1a4cd29b48bfd36ff9b2ea773 +timeCreated: 1513184612 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/SummedBlendNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/SummedBlendNode.cs new file mode 100644 index 0000000..735bcd9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/SummedBlendNode.cs @@ -0,0 +1,56 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Summed Blend", "Miscellaneous", "Mix all channels through weighted sum", null, KeyCode.None, true )] + public sealed class SummedBlendNode : WeightedAvgNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_inputData = new string[ 6 ]; + m_previewShaderGUID = "eda18b96e13f78b49bbdaa4da3fead19"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + GetInputData( ref dataCollector, ignoreLocalvar ); + + string result = string.Empty; + string localVarName = "weightedBlendVar" + OutputId; + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, m_inputPorts[ 0 ].DataType, localVarName, m_inputData[ 0 ] ); + + if ( m_activeCount == 0 ) + { + result = m_inputData[ 0 ]; + } + else if ( m_activeCount == 1 ) + { + result += localVarName + "*" + m_inputData[ 1 ]; + } + else + { + for ( int i = 0; i < m_activeCount; i++ ) + { + result += localVarName + Constants.VectorSuffixes[ i ] + "*" + m_inputData[ i + 1 ]; + if ( i != ( m_activeCount - 1 ) ) + { + result += " + "; + } + } + } + + result = UIUtils.AddBrackets( result ); + RegisterLocalVariable( 0, result, ref dataCollector, "weightedBlend" + OutputId ); + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/SummedBlendNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/SummedBlendNode.cs.meta new file mode 100644 index 0000000..102a6f1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/SummedBlendNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: da71cf021d98a7f468319e56eaefe6f1 +timeCreated: 1484229430 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/SwitchNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/SwitchNode.cs new file mode 100644 index 0000000..ae3d410 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/SwitchNode.cs @@ -0,0 +1,230 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Debug Switch", "Logical Operators", "Hard Switch between any of its input ports" )] + public class SwitchNode : ParentNode + { + private const string Info = "This is a Debug node which only generates the source for the selected port. This means that no properties are generated for other ports and information might be lost."; + private const string InputPortName = "In "; + + private const string CurrSelectedStr = "Current"; + private const string MaxAmountStr = "Max Amount"; + private const int MaxAllowedAmount = 8; + + [SerializeField] + private string[] m_availableInputsLabels = { "In 0", "In 1" }; + + [SerializeField] + private int[] m_availableInputsValues = { 0, 1 }; + + [SerializeField] + private int m_currentSelectedInput = 0; + + [SerializeField] + private int m_maxAmountInputs = 2; + + private int m_cachedPropertyId = -1; + + private GUIContent m_popContent; + + private Rect m_varRect; + private Rect m_imgRect; + private bool m_editing; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + for( int i = 0; i < MaxAllowedAmount; i++ ) + { + AddInputPort( WirePortDataType.FLOAT, false, InputPortName + i ); + m_inputPorts[ i ].Visible = ( i < 2 ); + } + AddOutputPort( WirePortDataType.FLOAT, " " ); + + m_popContent = new GUIContent(); + m_popContent.image = UIUtils.PopupIcon; + + m_insideSize.Set( 50, 25 ); + m_textLabelWidth = 100; + m_autoWrapProperties = false; + m_previewShaderGUID = "a58e46feaa5e3d14383bfeac24d008bc"; + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + if( m_cachedPropertyId == -1 ) + m_cachedPropertyId = Shader.PropertyToID( "_Current" ); + + PreviewMaterial.SetInt( m_cachedPropertyId, m_currentSelectedInput ); + } + + public override void OnConnectedOutputNodeChanges( int inputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + m_inputPorts[ inputPortId ].MatchPortToConnection(); + if( inputPortId == m_currentSelectedInput ) + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ inputPortId ].DataType, false ); + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + m_inputPorts[ portId ].MatchPortToConnection(); + if( portId == m_currentSelectedInput ) + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ portId ].DataType, false ); + } + + public void UpdateLabels() + { + m_availableInputsLabels = new string[ m_maxAmountInputs ]; + m_availableInputsValues = new int[ m_maxAmountInputs ]; + + for( int i = 0; i < m_maxAmountInputs; i++ ) + { + m_availableInputsLabels[ i ] = InputPortName + i; + m_availableInputsValues[ i ] = i; + } + } + + //void UpdateOutput() + //{ + // m_outputPorts[ 0 ].ChangeProperties( m_inputPorts[ m_currentSelectedInput ].Name, m_inputPorts[ m_currentSelectedInput ].DataType, false ); + // m_sizeIsDirty = true; + //} + + public override void OnNodeLayout( DrawInfo drawInfo ) + { + base.OnNodeLayout( drawInfo ); + + m_varRect = m_remainingBox; + m_varRect.width = 50 * drawInfo.InvertedZoom; + m_varRect.height = 16 * drawInfo.InvertedZoom; + m_varRect.x = m_remainingBox.xMax - m_varRect.width; + //m_varRect.x += m_remainingBox.width * 0.5f - m_varRect.width * 0.5f; + m_varRect.y += 1 * drawInfo.InvertedZoom; + + m_imgRect = m_varRect; + m_imgRect.x = m_varRect.xMax - 16 * drawInfo.InvertedZoom; + m_imgRect.width = 16 * drawInfo.InvertedZoom; + m_imgRect.height = m_imgRect.width; + } + + public override void DrawGUIControls( DrawInfo drawInfo ) + { + base.DrawGUIControls( drawInfo ); + + if( drawInfo.CurrentEventType != EventType.MouseDown ) + return; + + if( m_varRect.Contains( drawInfo.MousePosition ) ) + { + m_editing = true; + } + else if( m_editing ) + { + m_editing = false; + } + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + if( m_editing ) + { + EditorGUI.BeginChangeCheck(); + m_currentSelectedInput = EditorGUIIntPopup( m_varRect, m_currentSelectedInput, m_availableInputsLabels, m_availableInputsValues, UIUtils.GraphDropDown ); + if( EditorGUI.EndChangeCheck() ) + { + PreviewIsDirty = true; + m_editing = false; + } + } + } + + public override void OnNodeRepaint( DrawInfo drawInfo ) + { + base.OnNodeRepaint( drawInfo ); + + if( !m_isVisible ) + return; + + if( !m_editing && ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD4 ) + { + GUI.Label( m_varRect, m_availableInputsLabels[ m_currentSelectedInput ], UIUtils.GraphDropDown ); + GUI.Label( m_imgRect, m_popContent, UIUtils.GraphButtonIcon ); + } + } + + public override void DrawProperties() + { + base.DrawProperties(); + NodeUtils.DrawPropertyGroup( ref m_propertiesFoldout, Constants.ParameterLabelStr, DrawDebugOptions ); + + EditorGUILayout.HelpBox( Info, MessageType.Warning ); + } + + void DrawDebugOptions() + { + EditorGUI.BeginChangeCheck(); + m_maxAmountInputs = EditorGUILayoutIntSlider( MaxAmountStr, m_maxAmountInputs, 2, MaxAllowedAmount ); + if( EditorGUI.EndChangeCheck() ) + { + for( int i = 0; i < MaxAllowedAmount; i++ ) + { + m_inputPorts[ i ].Visible = ( i < m_maxAmountInputs ); + } + + if( m_currentSelectedInput >= m_maxAmountInputs ) + { + m_currentSelectedInput = m_maxAmountInputs - 1; + } + + UpdateLabels(); + m_sizeIsDirty = true; + } + + m_currentSelectedInput = EditorGUILayoutIntPopup( CurrSelectedStr, m_currentSelectedInput, m_availableInputsLabels, m_availableInputsValues ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + return m_inputPorts[ m_currentSelectedInput ].GeneratePortInstructions( ref dataCollector ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_currentSelectedInput = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_maxAmountInputs = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + + for( int i = 0; i < MaxAllowedAmount; i++ ) + { + m_inputPorts[ i ].Visible = ( i < m_maxAmountInputs ); + } + + if( m_currentSelectedInput >= m_maxAmountInputs ) + { + m_currentSelectedInput = m_maxAmountInputs - 1; + } + + UpdateLabels(); + m_sizeIsDirty = true; + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_currentSelectedInput ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_maxAmountInputs ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/SwitchNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/SwitchNode.cs.meta new file mode 100644 index 0000000..246aa75 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/SwitchNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ad88ed9f1b6010a4bb17685dec17a585 +timeCreated: 1483956795 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/SwizzleNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/SwizzleNode.cs new file mode 100644 index 0000000..ec83951 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/SwizzleNode.cs @@ -0,0 +1,441 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +// +// Custom Node Swizzle +// Donated by Tobias Pott - @ Tobias Pott +// www.tobiaspott.de + +using System; +using UnityEditor; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Swizzle", "Vector Operators", "Swizzle components of vector types", null, KeyCode.Z, true, false, null, null, "Tobias Pott - @TobiasPott" )] + public sealed class SwizzleNode : SingleInputOp + { + + private const string OutputTypeStr = "Output type"; + + [SerializeField] + private WirePortDataType m_selectedOutputType = WirePortDataType.FLOAT4; + + [SerializeField] + private int m_selectedOutputTypeInt = 3; + + [SerializeField] + private int[] m_selectedOutputSwizzleTypes = new int[] { 0, 1, 2, 3 }; + + [SerializeField] + private int m_maskId; + + [SerializeField] + private Vector4 m_maskValue = Vector4.one; + + private readonly string[] SwizzleVectorChannels = { "x", "y", "z", "w" }; + private readonly string[] SwizzleColorChannels = { "r", "g", "b", "a" }; + private readonly string[] SwizzleChannelLabels = { "Channel 0", "Channel 1", "Channel 2", "Channel 3" }; + + private readonly string[] m_outputValueTypes ={ "Float", + "Vector 2", + "Vector 3", + "Vector 4"}; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.FLOAT, + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR, + WirePortDataType.INT ); + + + m_inputPorts[ 0 ].DataType = WirePortDataType.FLOAT4; + m_outputPorts[ 0 ].DataType = m_selectedOutputType; + m_textLabelWidth = 90; + m_autoWrapProperties = true; + m_autoUpdateOutputPort = false; + m_hasLeftDropdown = true; + m_previewShaderGUID = "d20531704ce28b14bafb296f291f6608"; + SetAdditonalTitleText( "Value( XYZW )" ); + CalculatePreviewData(); + } + + public override void OnEnable() + { + base.OnEnable(); + m_maskId = Shader.PropertyToID( "_Mask" ); + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + PreviewMaterial.SetVector( m_maskId, m_maskValue ); + } + + void CalculatePreviewData() + { + switch( m_outputPorts[ 0 ].DataType ) + { + default: m_maskValue = Vector4.zero; break; + case WirePortDataType.INT: + case WirePortDataType.FLOAT: m_maskValue = new Vector4( 1, 0, 0, 0 ); break; + case WirePortDataType.FLOAT2: m_maskValue = new Vector4( 1, 1, 0, 0 ); break; + case WirePortDataType.FLOAT3: m_maskValue = new Vector4( 1, 1, 1, 0 ); break; + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: m_maskValue = Vector4.one; break; + } + + int inputMaxChannelId = 0; + switch( m_inputPorts[ 0 ].DataType ) + { + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: + inputMaxChannelId = 3; + break; + case WirePortDataType.FLOAT3: + inputMaxChannelId = 2; + break; + case WirePortDataType.FLOAT2: + inputMaxChannelId = 1; + break; + case WirePortDataType.INT: + case WirePortDataType.FLOAT: + inputMaxChannelId = 0; + break; + case WirePortDataType.OBJECT: + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + break; + } + + m_previewMaterialPassId = -1; + float passValue = 0; + for( int i = 3; i > -1; i-- ) + { + int currentSwizzle = Mathf.Min( inputMaxChannelId, m_selectedOutputSwizzleTypes[ i ] ); + if( currentSwizzle > 0 ) + { + passValue += Mathf.Pow( 4, 3 - i ) * currentSwizzle; + } + } + + m_previewMaterialPassId = (int)passValue; + + if( m_previewMaterialPassId == -1 ) + { + m_previewMaterialPassId = 0; + if( DebugConsoleWindow.DeveloperMode ) + { + UIUtils.ShowMessage( UniqueId, "Could not find pass ID for swizzle", MessageSeverity.Error ); + } + } + } + + public override void AfterCommonInit() + { + base.AfterCommonInit(); + + if ( PaddingTitleLeft == 0 ) + { + PaddingTitleLeft = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + if ( PaddingTitleRight == 0 ) + PaddingTitleRight = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + } + } + + public override void OnConnectedOutputNodeChanges( int outputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( outputPortId, otherNodeId, otherPortId, name, type ); + UpdatePorts(); + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + UpdatePorts(); + } + + public override void OnInputPortDisconnected( int portId ) + { + base.OnInputPortDisconnected( portId ); + UpdatePorts(); + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + if ( m_dropdownEditing ) + { + EditorGUI.BeginChangeCheck(); + m_selectedOutputTypeInt = EditorGUIPopup( m_dropdownRect, m_selectedOutputTypeInt, m_outputValueTypes, UIUtils.PropertyPopUp ); + if ( EditorGUI.EndChangeCheck() ) + { + switch ( m_selectedOutputTypeInt ) + { + case 0: m_selectedOutputType = WirePortDataType.FLOAT; break; + case 1: m_selectedOutputType = WirePortDataType.FLOAT2; break; + case 2: m_selectedOutputType = WirePortDataType.FLOAT3; break; + case 3: m_selectedOutputType = WirePortDataType.FLOAT4; break; + } + + UpdatePorts(); + DropdownEditing = false; + } + } + } + + public override void DrawProperties() + { + + EditorGUILayout.BeginVertical(); + EditorGUI.BeginChangeCheck(); + m_selectedOutputTypeInt = EditorGUILayoutPopup( OutputTypeStr, m_selectedOutputTypeInt, m_outputValueTypes ); + if ( EditorGUI.EndChangeCheck() ) + { + switch ( m_selectedOutputTypeInt ) + { + case 0: m_selectedOutputType = WirePortDataType.FLOAT; break; + case 1: m_selectedOutputType = WirePortDataType.FLOAT2; break; + case 2: m_selectedOutputType = WirePortDataType.FLOAT3; break; + case 3: m_selectedOutputType = WirePortDataType.FLOAT4; break; + } + + UpdatePorts(); + } + EditorGUILayout.EndVertical(); + + // Draw base properties + base.DrawProperties(); + + EditorGUILayout.BeginVertical(); + + int count = 0; + + switch ( m_selectedOutputType ) + { + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: + count = 4; + break; + case WirePortDataType.FLOAT3: + count = 3; + break; + case WirePortDataType.FLOAT2: + count = 2; + break; + case WirePortDataType.INT: + case WirePortDataType.FLOAT: + count = 1; + break; + case WirePortDataType.OBJECT: + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + break; + } + + EditorGUI.BeginChangeCheck(); + if ( m_inputPorts[ 0 ].DataType == WirePortDataType.COLOR ) + { + for ( int i = 0; i < count; i++ ) + { + m_selectedOutputSwizzleTypes[ i ] = EditorGUILayoutPopup( SwizzleChannelLabels[ i ], m_selectedOutputSwizzleTypes[ i ], SwizzleColorChannels ); + } + } + else + { + for ( int i = 0; i < count; i++ ) + { + m_selectedOutputSwizzleTypes[ i ] = EditorGUILayoutPopup( SwizzleChannelLabels[ i ], m_selectedOutputSwizzleTypes[ i ], SwizzleVectorChannels ); + } + } + if ( EditorGUI.EndChangeCheck() ) + { + UpdatePorts(); + } + + EditorGUILayout.EndVertical(); + + } + + void UpdatePorts() + { + ChangeOutputType( m_selectedOutputType, false ); + + int count = 0; + switch ( m_selectedOutputType ) + { + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: + count = 4; + break; + case WirePortDataType.FLOAT3: + count = 3; + break; + case WirePortDataType.FLOAT2: + count = 2; + break; + case WirePortDataType.INT: + case WirePortDataType.FLOAT: + count = 1; + break; + case WirePortDataType.OBJECT: + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + break; + } + + int inputMaxChannelId = 0; + switch ( m_inputPorts[ 0 ].DataType ) + { + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: + inputMaxChannelId = 3; + break; + case WirePortDataType.FLOAT3: + inputMaxChannelId = 2; + break; + case WirePortDataType.FLOAT2: + inputMaxChannelId = 1; + break; + case WirePortDataType.INT: + case WirePortDataType.FLOAT: + inputMaxChannelId = 0; + break; + case WirePortDataType.OBJECT: + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + break; + } + + //for ( int i = 0; i < count; i++ ) + //{ + //m_selectedOutputSwizzleTypes[ i ] = Mathf.Clamp( m_selectedOutputSwizzleTypes[ i ], 0, inputMaxChannelId ); + //} + + // Update Title + string additionalText = string.Empty; + for ( int i = 0; i < count; i++ ) + { + int currentSwizzle = Mathf.Min( inputMaxChannelId, m_selectedOutputSwizzleTypes[ i ] ); + additionalText += GetSwizzleComponentForChannel( currentSwizzle ).ToUpper(); + } + + if ( additionalText.Length > 0 ) + SetAdditonalTitleText( "Value( " + additionalText + " )" ); + else + SetAdditonalTitleText( string.Empty ); + + CalculatePreviewData(); + m_sizeIsDirty = true; + } + + public string GetSwizzleComponentForChannel( int channel ) + { + if ( m_inputPorts[ 0 ].DataType == WirePortDataType.COLOR ) + { + return SwizzleColorChannels[ channel ]; + } + else + { + return SwizzleVectorChannels[ channel ]; + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string value = string.Format( "({0}).", m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ) ); + + int inputMaxChannelId = 0; + switch( m_inputPorts[ 0 ].DataType ) + { + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: + inputMaxChannelId = 3; + break; + case WirePortDataType.FLOAT3: + inputMaxChannelId = 2; + break; + case WirePortDataType.FLOAT2: + inputMaxChannelId = 1; + break; + case WirePortDataType.INT: + case WirePortDataType.FLOAT: + inputMaxChannelId = 0; + break; + case WirePortDataType.OBJECT: + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + break; + } + + int count = 0; + switch ( m_selectedOutputType ) + { + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: + count = 4; + break; + case WirePortDataType.FLOAT3: + count = 3; + break; + case WirePortDataType.FLOAT2: + count = 2; + break; + case WirePortDataType.INT: + case WirePortDataType.FLOAT: + count = 1; + break; + case WirePortDataType.OBJECT: + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + break; + } + + for ( int i = 0; i < count; i++ ) + { + int currentSwizzle = Mathf.Min( inputMaxChannelId, m_selectedOutputSwizzleTypes[ i ] ); + value += GetSwizzleComponentForChannel( currentSwizzle ); + } + + return CreateOutputLocalVariable( 0, value, ref dataCollector ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_selectedOutputType = ( WirePortDataType ) Enum.Parse( typeof( WirePortDataType ), GetCurrentParam( ref nodeParams ) ); + switch ( m_selectedOutputType ) + { + case WirePortDataType.FLOAT: m_selectedOutputTypeInt = 0; break; + case WirePortDataType.FLOAT2: m_selectedOutputTypeInt = 1; break; + case WirePortDataType.FLOAT3: m_selectedOutputTypeInt = 2; break; + case WirePortDataType.COLOR: + case WirePortDataType.FLOAT4: m_selectedOutputTypeInt = 3; break; + } + for ( int i = 0; i < m_selectedOutputSwizzleTypes.Length; i++ ) + { + m_selectedOutputSwizzleTypes[ i ] = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + + UpdatePorts(); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_selectedOutputType ); + for ( int i = 0; i < m_selectedOutputSwizzleTypes.Length; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_selectedOutputSwizzleTypes[ i ] ); + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/SwizzleNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/SwizzleNode.cs.meta new file mode 100644 index 0000000..5049f92 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/SwizzleNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3bb41488b4b3e034d838c73c2eb471f5 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/ToggleSwitchNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/ToggleSwitchNode.cs new file mode 100644 index 0000000..fddc5b6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/ToggleSwitchNode.cs @@ -0,0 +1,311 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEditor; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Toggle Switch", "Logical Operators", "Switch between any of its input ports" )] + public class ToggleSwitchNode : PropertyNode + { + private const string InputPortName = "In "; + private const string CurrSelectedStr = "Toggle Value"; + private const string GenerateKeywordStr = "Generate Keyword"; + //private const string LerpOp = "lerp({0},{1},{2})"; + private const string LerpOp = "(( {2} )?( {1} ):( {0} ))"; + + [SerializeField] + private string[] AvailableInputsLabels = { "In 0", "In 1" }; + + [SerializeField] + private int[] AvailableInputsValues = { 0, 1 }; + + [SerializeField] + private int m_currentSelectedInput = 0; + + [SerializeField] + private WirePortDataType m_mainDataType = WirePortDataType.FLOAT; + + [SerializeField] + private bool m_generateKeyword = true; + + private int m_cachedPropertyId = -1; + + private GUIContent m_popContent; + + private Rect m_varRect; + private Rect m_imgRect; + private bool m_editing; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( m_mainDataType, false, InputPortName + "0" ); + AddInputPort( m_mainDataType, false, InputPortName + "1" ); + + AddOutputPort( m_mainDataType, " " ); + m_insideSize.Set( 80, 25 ); + m_currentParameterType = PropertyType.Property; + m_customPrefix = "Toggle Switch"; + + m_popContent = new GUIContent(); + m_popContent.image = UIUtils.PopupIcon; + + m_availableAttribs.Clear(); + //Need to maintain this because of retrocompatibility reasons + m_availableAttribs.Add( new PropertyAttributes( "Toggle", "[Toggle]" ) ); + + m_drawAttributes = false; + m_freeType = false; + m_useVarSubtitle = true; + m_useInternalPortData = true; + m_previewShaderGUID = "beeb138daeb592a4887454f81dba2b3f"; + + m_allowPropertyDuplicates = true; + m_showAutoRegisterUI = false; + + m_srpBatcherCompatible = true; + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + UIUtils.RegisterPropertyNode( this ); + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + if ( m_cachedPropertyId == -1 ) + m_cachedPropertyId = Shader.PropertyToID( "_Current" ); + + PreviewMaterial.SetInt( m_cachedPropertyId, m_currentSelectedInput ); + } + + public override void OnConnectedOutputNodeChanges( int portId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( portId, otherNodeId, otherPortId, name, type ); + UpdateConnection(); + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + UpdateConnection(); + } + + public override void OnInputPortDisconnected( int portId ) + { + base.OnInputPortDisconnected( portId ); + UpdateConnection(); + } + + void UpdateConnection() + { + WirePortDataType type1 = WirePortDataType.FLOAT; + if( m_inputPorts[ 0 ].IsConnected ) + type1 = m_inputPorts[ 0 ].GetOutputConnection( 0 ).DataType; + + WirePortDataType type2 = WirePortDataType.FLOAT; + if( m_inputPorts[ 1 ].IsConnected ) + type2 = m_inputPorts[ 1 ].GetOutputConnection( 0 ).DataType; + + m_mainDataType = UIUtils.GetPriority( type1 ) > UIUtils.GetPriority( type2 ) ? type1 : type2; + + m_inputPorts[ 0 ].ChangeType( m_mainDataType, false ); + m_inputPorts[ 1 ].ChangeType( m_mainDataType, false ); + + + //m_outputPorts[ 0 ].ChangeProperties( m_out, m_mainDataType, false ); + m_outputPorts[ 0 ].ChangeType( m_mainDataType, false ); + } + + public override void OnNodeLayout( DrawInfo drawInfo ) + { + base.OnNodeLayout( drawInfo ); + + m_varRect = m_remainingBox; + m_varRect.width = 50 * drawInfo.InvertedZoom; + m_varRect.height = 16 * drawInfo.InvertedZoom; + m_varRect.x = m_remainingBox.xMax - m_varRect.width; + m_varRect.y += 1 * drawInfo.InvertedZoom; + + m_imgRect = m_varRect; + m_imgRect.x = m_varRect.xMax - 16 * drawInfo.InvertedZoom; + m_imgRect.width = 16 * drawInfo.InvertedZoom; + m_imgRect.height = m_imgRect.width; + } + + public override void DrawGUIControls( DrawInfo drawInfo ) + { + base.DrawGUIControls( drawInfo ); + + if ( drawInfo.CurrentEventType != EventType.MouseDown ) + return; + + if ( m_varRect.Contains( drawInfo.MousePosition ) ) + { + m_editing = true; + } + else if ( m_editing ) + { + m_editing = false; + } + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + if( m_editing ) + { + EditorGUI.BeginChangeCheck(); + m_currentSelectedInput = EditorGUIIntPopup( m_varRect, m_currentSelectedInput, AvailableInputsLabels, AvailableInputsValues, UIUtils.SwitchNodePopUp ); + if ( EditorGUI.EndChangeCheck() ) + { + PreviewIsDirty = true; + UpdateConnection(); + m_requireMaterialUpdate = true; + m_editing = false; + } + } + } + + public override void OnNodeRepaint( DrawInfo drawInfo ) + { + base.OnNodeRepaint( drawInfo ); + + if ( !m_isVisible ) + return; + + if ( !m_editing && ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD4 ) + { + GUI.Label( m_varRect, AvailableInputsLabels[ m_currentSelectedInput ], UIUtils.GraphDropDown ); + GUI.Label( m_imgRect, m_popContent, UIUtils.GraphButtonIcon ); + } + } + + public override void DrawMainPropertyBlock() + { + EditorGUILayout.BeginVertical(); + { + ShowPropertyInspectorNameGUI(); + ShowPropertyNameGUI( true ); + ShowVariableMode(); + ShowHybridInstanced(); + ShowAutoRegister(); + ShowPrecision(); + m_generateKeyword = EditorGUILayoutToggle( GenerateKeywordStr, m_generateKeyword ); + ShowToolbar(); + } + EditorGUILayout.EndVertical(); + + EditorGUILayout.Separator(); + EditorGUI.BeginChangeCheck(); + m_currentSelectedInput = EditorGUILayoutIntPopup( CurrSelectedStr, m_currentSelectedInput, AvailableInputsLabels, AvailableInputsValues ); + if ( EditorGUI.EndChangeCheck() ) + { + UpdateConnection(); + m_requireMaterialUpdate = true; + } + } + + public override void DrawProperties() + { + base.DrawProperties(); + NodeUtils.DrawPropertyGroup( ref m_visibleCustomAttrFoldout, CustomAttrStr, DrawCustomAttributes, DrawCustomAttrAddRemoveButtons ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + m_precisionString = UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, m_outputPorts[ 0 ].DataType ); + + string resultA = m_inputPorts[ 0 ].GenerateShaderForOutput( ref dataCollector, m_mainDataType, ignoreLocalvar, true ); + string resultB = m_inputPorts[ 1 ].GenerateShaderForOutput( ref dataCollector, m_mainDataType, ignoreLocalvar, true ); + return string.Format( LerpOp, resultA, resultB, m_propertyName ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_currentSelectedInput = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > 18806 ) + { + m_generateKeyword = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_currentSelectedInput ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_generateKeyword ); + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + m_selectedAttribs.Clear(); + UpdateConnection(); + } + public override string GetPropertyValue() + { +#if UNITY_2018_1_OR_NEWER + string toggleAttribute = ( m_generateKeyword ) ? "[Toggle]":"[ToggleUI]"; +#else + string toggleAttribute = ( m_generateKeyword ) ? "[Toggle]": "[NoKeywordToggle]"; +#endif + return PropertyAttributes + toggleAttribute + m_propertyName + "(\"" + m_propertyInspectorName + "\", Float) = " + m_currentSelectedInput; + } + + public override string GetUniformValue() + { + int index = m_containerGraph.IsSRP ? 1 : 0; + return string.Format( Constants.UniformDec[ index ], UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, WirePortDataType.FLOAT ), m_propertyName ); + } + + public override bool GetUniformData( out string dataType, out string dataName, ref bool fullValue ) + { + dataType = UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, WirePortDataType.FLOAT ); + dataName = m_propertyName; + return true; + } + + public override void UpdateMaterial( Material mat ) + { + base.UpdateMaterial( mat ); + if ( UIUtils.IsProperty( m_currentParameterType ) && !InsideShaderFunction ) + { + mat.SetFloat( m_propertyName, ( float ) m_currentSelectedInput ); + } + } + + public override void SetMaterialMode( Material mat , bool fetchMaterialValues ) + { + base.SetMaterialMode( mat , fetchMaterialValues ); + if ( fetchMaterialValues && m_materialMode && UIUtils.IsProperty( m_currentParameterType ) && mat.HasProperty( m_propertyName ) ) + { + m_currentSelectedInput = ( int ) mat.GetFloat( m_propertyName ); + } + } + + public override void ForceUpdateFromMaterial( Material material ) + { + if( UIUtils.IsProperty( m_currentParameterType ) && material.HasProperty( m_propertyName ) ) + { + m_currentSelectedInput = (int)material.GetFloat( m_propertyName ); + PreviewIsDirty = true; + } + } + + public override string GetPropertyValStr() + { + return PropertyName; //return m_currentSelectedInput.ToString(); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/ToggleSwitchNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/ToggleSwitchNode.cs.meta new file mode 100644 index 0000000..54b2075 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/ToggleSwitchNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c7f6ffd9a8c958e449321777764784de +timeCreated: 1484213504 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/Transformation.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/Transformation.meta new file mode 100644 index 0000000..3dcf03f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/Transformation.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2505ed67ae6a9d647a25755a065e350e +folderAsset: yes +timeCreated: 1488205900 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/Transformation/ObjectToWorldTransfNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/Transformation/ObjectToWorldTransfNode.cs new file mode 100644 index 0000000..48de5fb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/Transformation/ObjectToWorldTransfNode.cs @@ -0,0 +1,30 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Object To World", "Object Transform", "Transforms input to World Space" )] + public sealed class ObjectToWorldTransfNode : ParentTransfNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_matrixName = "unity_ObjectToWorld"; + m_matrixHDName = "GetObjectToWorldMatrix()"; + m_matrixLWName = "GetObjectToWorldMatrix()"; + m_previewShaderGUID = "a4044ee165813654486d0cecd0de478c"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + string result = base.GenerateShaderForOutput( 0, ref dataCollector, ignoreLocalvar ); + if( dataCollector.IsTemplate && dataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.HD && !string.IsNullOrEmpty( m_matrixHDName ) ) + { + dataCollector.AddLocalVariable( UniqueId, string.Format( "{0}.xyz", result ), string.Format( "GetAbsolutePositionWS(({0}).xyz);", result ) ); + } + + return GetOutputVectorItem( 0, outputId, result ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/Transformation/ObjectToWorldTransfNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/Transformation/ObjectToWorldTransfNode.cs.meta new file mode 100644 index 0000000..40b45c8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/Transformation/ObjectToWorldTransfNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 545417ad304cea84b9f625a3b6ad4e56 +timeCreated: 1488205951 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/Transformation/ParentTransfNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/Transformation/ParentTransfNode.cs new file mode 100644 index 0000000..5781e11 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/Transformation/ParentTransfNode.cs @@ -0,0 +1,53 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + public class ParentTransfNode : ParentNode + { + protected string m_matrixName; + protected string m_matrixHDName; + protected string m_matrixLWName; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT4, false, string.Empty ); + AddOutputVectorPorts( WirePortDataType.FLOAT4, "XYZW" ); + m_useInternalPortData = true; + m_inputPorts[ 0 ].Vector4InternalData = new UnityEngine.Vector4( 0, 0, 0, 1 ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + + string value = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string matrixName = string.Empty; + if( dataCollector.IsTemplate ) + { + if( dataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.HD && !string.IsNullOrEmpty( m_matrixHDName ) ) + { + matrixName = m_matrixHDName; + } + else if( dataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.Lightweight && !string.IsNullOrEmpty( m_matrixLWName ) ) + { + matrixName = m_matrixLWName; + } + else + { + matrixName = m_matrixName; + } + } + else + { + matrixName = m_matrixName; + } + + RegisterLocalVariable( 0, string.Format( "mul({0},{1})", matrixName, value ),ref dataCollector,"transform"+ OutputId ); + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/Transformation/ParentTransfNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/Transformation/ParentTransfNode.cs.meta new file mode 100644 index 0000000..5a714ba --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/Transformation/ParentTransfNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 11f04432b7f1ffb43b584adb226614c6 +timeCreated: 1488206086 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/Transformation/WorldToObjectTransfNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/Transformation/WorldToObjectTransfNode.cs new file mode 100644 index 0000000..ccc5781 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/Transformation/WorldToObjectTransfNode.cs @@ -0,0 +1,54 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "World To Object", "Object Transform", "Transforms input to Object Space" )] + public sealed class WorldToObjectTransfNode : ParentTransfNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_matrixName = "unity_WorldToObject"; + m_matrixHDName = "GetWorldToObjectMatrix()"; + m_matrixLWName = "GetWorldToObjectMatrix()"; + m_previewShaderGUID = "79a5efd1e3309f54d8ba3e7fdf5e459b"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + + string value = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string matrixName = string.Empty; + if( dataCollector.IsTemplate ) + { + if( dataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.HD && !string.IsNullOrEmpty( m_matrixHDName ) ) + { + string varName = "localWorldVar" + OutputId; + dataCollector.AddLocalVariable( UniqueId, PrecisionType.Float, WirePortDataType.FLOAT4, varName, value ); + dataCollector.AddLocalVariable( UniqueId, string.Format( "({0}).xyz", varName ), string.Format( "GetCameraRelativePositionWS(({0}).xyz);", varName ) ); + value = varName; + matrixName = m_matrixHDName; + } + else if( dataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.Lightweight && !string.IsNullOrEmpty( m_matrixLWName ) ) + { + matrixName = m_matrixLWName; + } + else + { + matrixName = m_matrixName; + } + } + else + { + matrixName = m_matrixName; + } + + RegisterLocalVariable( 0, string.Format( "mul({0},{1})", matrixName, value ), ref dataCollector, "transform" + OutputId ); + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/Transformation/WorldToObjectTransfNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/Transformation/WorldToObjectTransfNode.cs.meta new file mode 100644 index 0000000..8ad85ca --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/Transformation/WorldToObjectTransfNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8a25ccf8973bfae46ae3df2823f58229 +timeCreated: 1488205986 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/VectorFromMatrixNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/VectorFromMatrixNode.cs new file mode 100644 index 0000000..1095df4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/VectorFromMatrixNode.cs @@ -0,0 +1,131 @@ +using System; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + public enum eVectorFromMatrixMode + { + Row, + Column + } + + [Serializable] + [NodeAttributes( "Vector From Matrix", "Matrix Operators", "Retrieve vector data from a matrix" )] + public sealed class VectorFromMatrixNode : ParentNode + { + private const string IndexStr = "Index"; + private const string ModeStr = "Mode"; + + [SerializeField] + private eVectorFromMatrixMode m_mode = eVectorFromMatrixMode.Row; + + [SerializeField] + private int m_index = 0; + + [SerializeField] + private int m_maxIndex = 3; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT4x4, false, Constants.EmptyPortValue ); + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.FLOAT3x3, WirePortDataType.FLOAT4x4 ); + AddOutputVectorPorts( WirePortDataType.FLOAT4, "XYZW" ); + m_useInternalPortData = true; + m_autoWrapProperties = true; + } + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + UpdatePorts(); + } + + public override void OnConnectedOutputNodeChanges( int inputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( inputPortId, otherNodeId, otherPortId, name, type ); + UpdatePorts(); + } + + void UpdatePorts() + { + m_inputPorts[ 0 ].MatchPortToConnection(); + + if ( m_inputPorts[ 0 ].DataType == WirePortDataType.FLOAT3x3 ) + { + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT3, false ); + m_outputPorts[ 0 ].Name = "XYZ"; + m_maxIndex = 2; + m_outputPorts[ 4 ].Visible = false; + } + else + { + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT4, false ); + m_outputPorts[ 0 ].Name = "XYZW"; + m_maxIndex = 3; + m_outputPorts[ 4 ].Visible = true; + } + m_sizeIsDirty = true; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + string value = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + if ( m_inputPorts[ 0 ].DataType != WirePortDataType.FLOAT4x4 && + m_inputPorts[ 0 ].DataType != WirePortDataType.FLOAT3x3 ) + { + value = UIUtils.CastPortType( ref dataCollector, CurrentPrecisionType, new NodeCastInfo( UniqueId, outputId ), value, m_inputPorts[ 0 ].DataType, WirePortDataType.FLOAT4x4, value ); + } + if ( m_mode == eVectorFromMatrixMode.Row ) + { + value += "[" + m_index + "]"; + } + else + { + string formatStr = value + "[{0}]" + "[" + m_index + "]"; + int count = 4; + if ( m_inputPorts[ 0 ].DataType != WirePortDataType.FLOAT3x3 ) + { + value = "float4( "; + } + else + { + count = 3; + value = "float3( "; + } + + for ( int i = 0; i < count; i++ ) + { + value += string.Format( formatStr, i ); + if ( i != ( count - 1 ) ) + { + value += ","; + } + } + value += " )"; + } + return GetOutputVectorItem( 0, outputId, value ); + } + + public override void DrawProperties() + { + m_mode = (eVectorFromMatrixMode)EditorGUILayoutEnumPopup( ModeStr, m_mode ); + m_index = EditorGUILayoutIntSlider( IndexStr, m_index, 0, m_maxIndex ); + base.DrawProperties(); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_mode ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_index ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_mode = ( eVectorFromMatrixMode ) Enum.Parse( typeof( eVectorFromMatrixMode ), GetCurrentParam( ref nodeParams ) ); + m_index = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/VectorFromMatrixNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/VectorFromMatrixNode.cs.meta new file mode 100644 index 0000000..c2e6a9f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/VectorFromMatrixNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 31c07015a5f2aa44297aa7cfb80ffdd5 +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/WeightedAvgNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/WeightedAvgNode.cs new file mode 100644 index 0000000..c9329ff --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/WeightedAvgNode.cs @@ -0,0 +1,182 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using System; +using UnityEditor; +namespace AmplifyShaderEditor +{ + [Serializable] + + public class WeightedAvgNode : ParentNode + { + protected string[] AmountsStr = { "Layer 1", "Layer 2", "Layer 3", "Layer 4" }; + + [SerializeField] + protected int m_minimumSize = 1; + + [SerializeField] + protected WirePortDataType m_mainDataType = WirePortDataType.FLOAT; + + [SerializeField] + protected string[] m_inputData; + [SerializeField] + protected int m_activeCount = 0; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, "Weights" ); + AddInputPort( WirePortDataType.FLOAT, false, AmountsStr[ 0 ] ); + AddInputPort( WirePortDataType.FLOAT, false, AmountsStr[ 1 ] ); + AddInputPort( WirePortDataType.FLOAT, false, AmountsStr[ 2 ] ); + AddInputPort( WirePortDataType.FLOAT, false, AmountsStr[ 3 ] ); + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + m_inputPorts[ i ].AddPortForbiddenTypes( WirePortDataType.FLOAT3x3, + WirePortDataType.FLOAT4x4, + WirePortDataType.SAMPLER1D, + WirePortDataType.SAMPLER2D, + WirePortDataType.SAMPLER3D, + WirePortDataType.SAMPLERCUBE, + WirePortDataType.SAMPLER2DARRAY, + WirePortDataType.SAMPLERSTATE ); + } + UpdateConnection( 0 ); + m_useInternalPortData = true; + } + + public override void OnConnectedOutputNodeChanges( int inputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( inputPortId, otherNodeId, otherPortId, name, type ); + UpdateConnection( inputPortId ); + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + UpdateConnection( portId ); + } + + void UpdateInputPorts( int activePorts ) + { + int idx = 1; + for ( ; idx < m_minimumSize + activePorts; idx++ ) + { + m_inputPorts[ idx ].Visible = true; + } + + m_activeCount = idx - 1; + + for ( ; idx < m_inputPorts.Count; idx++ ) + { + m_inputPorts[ idx ].Visible = false; + } + } + + protected void UpdateConnection( int portId ) + { + if ( portId == 0 ) + { + if( m_inputPorts[ portId ].IsConnected ) + m_inputPorts[ portId ].MatchPortToConnection(); + + switch ( m_inputPorts[ 0 ].DataType ) + { + case WirePortDataType.INT: + case WirePortDataType.FLOAT: + { + UpdateInputPorts( 1 ); + m_previewMaterialPassId = 0; + } + break; + case WirePortDataType.FLOAT2: + { + UpdateInputPorts( 2 ); + m_previewMaterialPassId = 1; + } + break; + case WirePortDataType.FLOAT3: + { + UpdateInputPorts( 3 ); + m_previewMaterialPassId = 2; + } + break; + case WirePortDataType.COLOR: + case WirePortDataType.FLOAT4: + { + UpdateInputPorts( 4 ); + m_previewMaterialPassId = 3; + } + break; + case WirePortDataType.OBJECT: + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + { + for ( int i = 1; i < m_inputPorts.Count; i++ ) + { + m_inputPorts[ i ].Visible = false; + } + m_activeCount = 0; + } + break; + } + } + //else + //{ + // SetMainOutputType(); + //} + + SetMainOutputType(); + m_sizeIsDirty = true; + } + + protected void SetMainOutputType() + { + m_mainDataType = WirePortDataType.OBJECT; + int count = m_inputPorts.Count; + for ( int i = 1; i < count; i++ ) + { + if ( m_inputPorts[ i ].Visible ) + { + WirePortDataType portType = m_inputPorts[ i ].IsConnected ? m_inputPorts[ i ].ConnectionType() : WirePortDataType.FLOAT; + if ( m_mainDataType != portType && + UIUtils.GetPriority( portType ) > UIUtils.GetPriority( m_mainDataType ) ) + { + m_mainDataType = portType; + } + } + } + + for( int i = 1; i < count; i++ ) + { + if( m_inputPorts[ i ].Visible ) + { + m_inputPorts[ i ].ChangeType( m_mainDataType, false ); + } + } + + m_outputPorts[ 0 ].ChangeType( m_mainDataType, false ); + } + + protected void GetInputData( ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + m_inputData[ 0 ] = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + for ( int i = 1; i < m_inputPorts.Count; i++ ) + { + if ( m_inputPorts[ i ].Visible ) + { + m_inputData[ i ] = m_inputPorts[ i ].GeneratePortInstructions( ref dataCollector ); + } + } + } + + public override void ReadInputDataFromString( ref string[] nodeParams ) + { + base.ReadInputDataFromString( ref nodeParams ); + UpdateConnection( 0 ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/WeightedAvgNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/WeightedAvgNode.cs.meta new file mode 100644 index 0000000..1faefae --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/WeightedAvgNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 35c70c67524c86049a25b7ebd0de6ae3 +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/WeightedBlendNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/WeightedBlendNode.cs new file mode 100644 index 0000000..dc5fc1b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/WeightedBlendNode.cs @@ -0,0 +1,58 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using System; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Weighted Blend", "Miscellaneous", "Mix all channels through weighted average sum", null, KeyCode.None, true )] + public sealed class WeightedBlendNode : WeightedAvgNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_inputData = new string[ 6 ]; + m_previewShaderGUID = "6076cbeaa41ebb14c85ff81b58df7d88"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + GetInputData( ref dataCollector, ignoreLocalvar ); + + string result = string.Empty; + string avgSum = string.Empty; + + string localVarName = "weightedBlendVar" + OutputId; + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, m_inputPorts[ 0 ].DataType, localVarName, m_inputData[ 0 ] ); + + if ( m_activeCount < 2 ) + { + return CreateOutputLocalVariable( 0, m_inputData[ 1 ], ref dataCollector ); + } + else + { + for ( int i = 0; i < m_activeCount; i++ ) + { + result += localVarName + Constants.VectorSuffixes[ i ] + "*" + m_inputData[ i + 1 ]; + avgSum += localVarName + Constants.VectorSuffixes[ i ]; + if ( i != ( m_activeCount - 1 ) ) + { + result += " + "; + avgSum += " + "; + } + } + } + + result = UIUtils.AddBrackets( result ) + "/" + UIUtils.AddBrackets( avgSum ); + result = UIUtils.AddBrackets( result ); + RegisterLocalVariable( 0, result, ref dataCollector, "weightedAvg" + OutputId ); + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/WeightedBlendNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/WeightedBlendNode.cs.meta new file mode 100644 index 0000000..744bfd0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/WeightedBlendNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b91b2aefbfad5b444b25320e9ed53cac +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/WireNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/WireNode.cs new file mode 100644 index 0000000..4bcc500 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/WireNode.cs @@ -0,0 +1,484 @@ +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Wire Node", "Miscellaneous", "Wire Node", null, KeyCode.None, false )] + public sealed class WireNode : ParentNode + { + private bool m_markedToDelete = false; + + [SerializeField] + private WirePortDataType m_visualDataType = WirePortDataType.FLOAT; + + bool m_forceVisualDataUpdate = false; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.OBJECT, false, string.Empty ); + AddOutputPort( WirePortDataType.OBJECT, Constants.EmptyPortValue ); + m_tooltipText = string.Empty; + m_drawPreview = false; + m_drawPreviewExpander = false; + m_canExpand = false; + m_previewShaderGUID = "fa1e3e404e6b3c243b5527b82739d682"; + } + + public WirePortDataType GetLastInputDataTypeRecursively() + { + if( m_outputPorts[ 0 ].ExternalReferences.Count > 0 ) + { + WireNode rightWire = m_outputPorts[ 0 ].GetInputNode( 0 ) as WireNode; + if( rightWire != null ) + return rightWire.GetLastInputDataTypeRecursively(); + else + { + return m_outputPorts[ 0 ].GetInputConnection( 0 ).DataType; + } + } + + if( m_containerGraph.ParentWindow.WireReferenceUtils.OutputPortReference.IsValid ) + return m_containerGraph.ParentWindow.WireReferenceUtils.OutputPortReference.DataType; + else + return m_visualDataType; + } + + public override WirePortDataType GetInputPortVisualDataTypeByArrayIdx( int portArrayIdx ) + { + return m_visualDataType; + } + + public override WirePortDataType GetOutputPortVisualDataTypeById( int portId ) + { + return m_visualDataType; + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + m_inputPorts[ 0 ].MatchPortToConnection(); + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + + m_forceVisualDataUpdate = true; + } + + public override void OnOutputPortConnected( int portId, int otherNodeId, int otherPortId ) + { + base.OnOutputPortConnected( portId, otherNodeId, otherPortId ); + + if( m_outputPorts[ portId ].ConnectionCount > 1 ) + { + for( int i = 0; i < m_outputPorts[ portId ].ExternalReferences.Count; i++ ) + { + if( m_outputPorts[ portId ].ExternalReferences[ i ].PortId != otherPortId ) + { + UIUtils.DeleteConnection( true, m_outputPorts[ portId ].ExternalReferences[ i ].NodeId, m_outputPorts[ portId ].ExternalReferences[ i ].PortId, false, true ); + } + } + } + + m_inputPorts[ 0 ].NotifyExternalRefencesOnChange(); + m_forceVisualDataUpdate = true; + } + + public override void OnConnectedInputNodeChanges( int portId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedInputNodeChanges( portId, otherNodeId, otherPortId, name, type ); + + m_inputPorts[ 0 ].NotifyExternalRefencesOnChange(); + m_forceVisualDataUpdate = true; + } + + public override void OnConnectedOutputNodeChanges( int outputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( outputPortId, otherNodeId, otherPortId, name, type ); + m_inputPorts[ 0 ].MatchPortToConnection(); + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + + m_forceVisualDataUpdate = true; + } + + public override void OnInputPortDisconnected( int portId ) + { + base.OnInputPortDisconnected( portId ); + TestIfValid(); + + m_forceVisualDataUpdate = true; + m_outputPorts[ 0 ].NotifyExternalRefencesOnChange(); + } + + public override void OnOutputPortDisconnected( int portId ) + { + base.OnOutputPortDisconnected( portId ); + TestIfValid(); + + m_forceVisualDataUpdate = true; + m_inputPorts[ 0 ].NotifyExternalRefencesOnChange(); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + return m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + } + + public override void DrawProperties() + { + if( m_markedToDelete ) + return; + + base.DrawProperties(); + } + + public override void OnNodeLayout( DrawInfo drawInfo ) + { + if( m_firstDraw ) + { + m_firstDraw = false; + AfterCommonInit(); + OnNodeChange(); + } + + if( m_forceVisualDataUpdate ) + { + m_forceVisualDataUpdate = false; + m_visualDataType = GetLastInputDataTypeRecursively(); + } + + if( m_repopulateDictionaries ) + { + m_repopulateDictionaries = false; + + m_inputPortsDict.Clear(); + int inputCount = m_inputPorts.Count; + for( int i = 0; i < inputCount; i++ ) + { + m_inputPortsDict.Add( m_inputPorts[ i ].PortId, m_inputPorts[ i ] ); + } + + m_outputPortsDict.Clear(); + int outputCount = m_outputPorts.Count; + for( int i = 0; i < outputCount; i++ ) + { + m_outputPortsDict.Add( m_outputPorts[ i ].PortId, m_outputPorts[ i ] ); + } + } + + if( m_sizeIsDirty ) + { + m_sizeIsDirty = false; + m_extraSize.Set( 20f, 20f ); + m_position.width = m_extraSize.x + UIUtils.PortsSize.x; + m_position.height = m_extraSize.y + UIUtils.PortsSize.y; + + Vec2Position -= Position.size * 0.5f; + if( OnNodeChangeSizeEvent != null ) + { + OnNodeChangeSizeEvent( this ); + } + + ChangeSizeFinished(); + //ChangeSize(); + } + + CalculatePositionAndVisibility( drawInfo ); + + // Input Ports + { + m_currInputPortPos = m_globalPosition; + m_currInputPortPos.width = drawInfo.InvertedZoom * UIUtils.PortsSize.x; + m_currInputPortPos.height = drawInfo.InvertedZoom * UIUtils.PortsSize.y; + m_currInputPortPos.position = m_globalPosition.center - m_currInputPortPos.size * 0.5f; + int inputCount = m_inputPorts.Count; + + for( int i = 0; i < inputCount; i++ ) + { + if( m_inputPorts[ i ].Visible ) + { + // Button + m_inputPorts[ i ].Position = m_currInputPortPos; + + if( !m_inputPorts[ i ].Locked ) + { + float overflow = 2; + float scaledOverflow = 3 * drawInfo.InvertedZoom; + m_auxRect = m_currInputPortPos; + m_auxRect.yMin -= scaledOverflow + overflow; + m_auxRect.yMax += scaledOverflow + overflow; + m_auxRect.xMin -= Constants.PORT_INITIAL_X * drawInfo.InvertedZoom + scaledOverflow + overflow; + m_auxRect.xMax += m_inputPorts[ i ].LabelSize.x + Constants.PORT_TO_LABEL_SPACE_X * drawInfo.InvertedZoom + scaledOverflow + overflow; + m_inputPorts[ i ].ActivePortArea = m_auxRect; + } + m_currInputPortPos.y += drawInfo.InvertedZoom * ( m_fontHeight + Constants.INPUT_PORT_DELTA_Y ); + } + } + } + + // Output Ports + { + m_currOutputPortPos = m_globalPosition; + m_currOutputPortPos.width = drawInfo.InvertedZoom * UIUtils.PortsSize.x; + m_currOutputPortPos.height = drawInfo.InvertedZoom * UIUtils.PortsSize.y; + m_currOutputPortPos.position = m_globalPosition.center - m_currOutputPortPos.size * 0.5f; + //m_currOutputPortPos.x += ( m_globalPosition.width - drawInfo.InvertedZoom * ( Constants.PORT_INITIAL_X + m_anchorAdjust ) ); + //m_currOutputPortPos.y += drawInfo.InvertedZoom * Constants.PORT_INITIAL_Y;// + m_extraHeaderHeight * drawInfo.InvertedZoom; + int outputCount = m_outputPorts.Count; + + for( int i = 0; i < outputCount; i++ ) + { + if( m_outputPorts[ i ].Visible ) + { + //Button + m_outputPorts[ i ].Position = m_currOutputPortPos; + + if( !m_outputPorts[ i ].Locked ) + { + float overflow = 2; + float scaledOverflow = 3 * drawInfo.InvertedZoom; + m_auxRect = m_currOutputPortPos; + m_auxRect.yMin -= scaledOverflow + overflow; + m_auxRect.yMax += scaledOverflow + overflow; + m_auxRect.xMin -= m_outputPorts[ i ].LabelSize.x + Constants.PORT_TO_LABEL_SPACE_X * drawInfo.InvertedZoom + scaledOverflow + overflow; + m_auxRect.xMax += Constants.PORT_INITIAL_X * drawInfo.InvertedZoom + scaledOverflow + overflow; + m_outputPorts[ i ].ActivePortArea = m_auxRect; + } + m_currOutputPortPos.y += drawInfo.InvertedZoom * ( m_fontHeight + Constants.INPUT_PORT_DELTA_Y ); + } + } + } + } + + public override void OnNodeRepaint( DrawInfo drawInfo ) + { + //base.OnRepaint( drawInfo ); + //return; + if( !m_isVisible ) + return; + + m_colorBuffer = GUI.color; + + // Output Ports + int outputCount = m_outputPorts.Count; + for( int i = 0; i < outputCount; i++ ) + { + if( m_outputPorts[ i ].Visible ) + { + // Output Port Icon + if( ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD4 ) + { + if( m_outputPorts[ i ].Locked ) + GUI.color = Constants.LockedPortColor; + else if( ContainerGraph.ParentWindow.Options.ColoredPorts ) + GUI.color = UIUtils.GetColorForDataType( m_visualDataType, false, false ); + else + GUI.color = m_outputPorts[ i ].HasCustomColor ? m_outputPorts[ i ].CustomColor : UIUtils.GetColorForDataType( m_visualDataType, true, false ); + + GUIStyle style = m_outputPorts[ i ].IsConnected ? UIUtils.GetCustomStyle( CustomStyle.PortFullIcon ) : UIUtils.GetCustomStyle( CustomStyle.PortEmptyIcon ); + GUI.Label( m_outputPorts[ i ].Position, string.Empty, style ); + + GUI.color = m_colorBuffer; + } + + // Output Port Label + if( ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD3 ) + { + if( m_outputPorts[ i ].Locked ) + { + GUI.color = Constants.PortLockedTextColor; + GUI.Label( m_outputPorts[ i ].LabelPosition, m_outputPorts[ i ].Name, UIUtils.OutputPortLabel ); + GUI.color = m_colorBuffer; + } + else + { + GUI.Label( m_outputPorts[ i ].LabelPosition, m_outputPorts[ i ].Name, UIUtils.OutputPortLabel ); + } + } + } + } + + // Selection Box + if( m_selected ) + { + Rect selectionBox = m_globalPosition; + selectionBox.size = Vector2.one * 16 * drawInfo.InvertedZoom + Vector2.one * 4; + selectionBox.center = m_globalPosition.center; + GUI.DrawTexture( selectionBox, UIUtils.WireNodeSelection ); + GUI.color = m_colorBuffer; + } + } + + public override void DrawGUIControls( DrawInfo drawInfo ) + { + //base.DrawGUIControls( drawInfo ); + } + + public override void Draw( DrawInfo drawInfo ) + { + if( m_markedToDelete ) + return; + + if( drawInfo.CurrentEventType == EventType.Repaint ) + OnNodeRepaint( drawInfo ); + //base.Draw( drawInfo ); + + if( drawInfo.CurrentEventType == EventType.Repaint ) + TestIfValid(); + } + + bool TestIfValid() + { + if( !Alive ) + return false; + + bool result = true; + if( !m_inputPorts[ 0 ].IsConnected ) + { + if( !m_containerGraph.ParentWindow.WireReferenceUtils.InputPortReference.IsValid || m_containerGraph.ParentWindow.WireReferenceUtils.InputPortReference.IsValid && m_containerGraph.ParentWindow.WireReferenceUtils.InputPortReference.NodeId != UniqueId ) + { + ContainerGraph.MarkWireNodeSequence( this, true ); + result = false; + } + } + + if( !m_outputPorts[ 0 ].IsConnected ) + { + if( !m_containerGraph.ParentWindow.WireReferenceUtils.OutputPortReference.IsValid || m_containerGraph.ParentWindow.WireReferenceUtils.OutputPortReference.IsValid && m_containerGraph.ParentWindow.WireReferenceUtils.OutputPortReference.NodeId != UniqueId ) + { + ContainerGraph.MarkWireNodeSequence( this, false ); + result = false; + } + } + return result; + } + + public Vector3 TangentDirection + { + get + { + ParentNode otherInputNode = null; + ParentNode otherOutputNode = null; + + //defaults to itself so it can still calculate tangents + WirePort otherInputPort = m_outputPorts[ 0 ]; + WirePort otherOutputPort = m_inputPorts[ 0 ]; + + if( m_outputPorts[ 0 ].ConnectionCount > 0 ) + { + otherInputNode = m_containerGraph.GetNode( m_outputPorts[ 0 ].ExternalReferences[ 0 ].NodeId ); + otherInputPort = otherInputNode.GetInputPortByUniqueId( m_outputPorts[ 0 ].ExternalReferences[ 0 ].PortId ); + } + + if( m_inputPorts[ 0 ].ConnectionCount > 0 ) + { + otherOutputNode = m_containerGraph.GetNode( m_inputPorts[ 0 ].ExternalReferences[ 0 ].NodeId ); + otherOutputPort = otherOutputNode.GetOutputPortByUniqueId( m_inputPorts[ 0 ].ExternalReferences[ 0 ].PortId ); + } + + //TODO: it still generates crooked lines if wire nodes get too close to non-wire nodes (the fix would be to calculate the non-wire nodes magnitude properly) + float mag = Constants.HORIZONTAL_TANGENT_SIZE * ContainerGraph.ParentWindow.CameraDrawInfo.InvertedZoom; + + Vector2 outPos; + if( otherOutputNode != null && otherOutputNode.GetType() != typeof( WireNode ) ) + outPos = otherOutputPort.Position.position + Vector2.right * mag * 0.66f; + else + outPos = otherOutputPort.Position.position; + + Vector2 inPos; + if( otherInputNode != null && otherInputNode.GetType() != typeof( WireNode ) ) + inPos = otherInputPort.Position.position - Vector2.right * mag * 0.66f; + else + inPos = otherInputPort.Position.position; + + Vector2 tangent = ( outPos - inPos ).normalized; + return new Vector3( tangent.x, tangent.y ); + } + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + + m_extraSize.Set( 20f, 20f ); + m_position.width = m_extraSize.x + UIUtils.PortsSize.x; + m_position.height = m_extraSize.y + UIUtils.PortsSize.y; + + Vec2Position += Position.size * 0.5f; + } + + public override void OnAfterDeserialize() + { + base.OnAfterDeserialize(); + m_sizeIsDirty = false; + } + + public WireReference FindNewValidInputNode( WireNode current ) + { + if( current.InputPorts[ 0 ].IsConnected ) + { + ParentNode node = m_containerGraph.GetNode( current.InputPorts[ 0 ].ExternalReferences[ 0 ].NodeId ); + if( node != null ) + { + WireNode wireNode = node as WireNode; + if( wireNode != null && wireNode.MarkToDelete ) + { + return FindNewValidInputNode( wireNode ); + } + else + { + return current.InputPorts[ 0 ].ExternalReferences[ 0 ]; + } + } + } + return null; + } + + public WireReference FindNewValidOutputNode( WireNode current ) + { + if( current.OutputPorts[ 0 ].IsConnected ) + { + ParentNode node = m_containerGraph.GetNode( current.OutputPorts[ 0 ].ExternalReferences[ 0 ].NodeId ); + + if( node != null ) + { + WireNode wireNode = node as WireNode; + if( wireNode != null && wireNode.MarkToDelete ) + { + return FindNewValidOutputNode( wireNode ); + } + else + { + return current.OutputPorts[ 0 ].ExternalReferences[ 0 ]; + } + } + } + return null; + } + + public override void Rewire() + { + //if ( m_inputPorts[ 0 ].ExternalReferences != null && m_inputPorts[ 0 ].ExternalReferences.Count > 0 ) + //{ + //WireReference backPort = m_inputPorts[ 0 ].ExternalReferences[ 0 ]; + //for ( int i = 0; i < m_outputPorts[ 0 ].ExternalReferences.Count; i++ ) + //{ + // UIUtils.CurrentWindow.ConnectInputToOutput( m_outputPorts[ 0 ].ExternalReferences[ i ].NodeId, m_outputPorts[ 0 ].ExternalReferences[ i ].PortId, backPort.NodeId, backPort.PortId ); + //} + //} + MarkToDelete = true; + WireReference outputReference = FindNewValidInputNode( this ); + WireReference inputReference = FindNewValidOutputNode( this ); + if( outputReference != null && inputReference != null ) + { + ContainerGraph.ParentWindow.ConnectInputToOutput( inputReference.NodeId, inputReference.PortId, outputReference.NodeId, outputReference.PortId ); + } + } + + public bool MarkToDelete + { + get { return m_markedToDelete; } + set { m_markedToDelete = value; } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/WireNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/WireNode.cs.meta new file mode 100644 index 0000000..ab597cb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Misc/WireNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7a566d6bf220cd74b8385a91f690b683 +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/NodeAttributes.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/NodeAttributes.cs new file mode 100644 index 0000000..91e441e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/NodeAttributes.cs @@ -0,0 +1,97 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + public enum NodeAvailability + { + SurfaceShader = 1 << 0, + ShaderFunction = 1 << 1, + CustomLighting = 1 << 2, + TemplateShader = 1 << 3 + } + + + [AttributeUsage( AttributeTargets.Class )] + public class NodeAttributes : Attribute + { + + public string Name; + public string Description; + public string Category; + public KeyCode ShortcutKey; + public bool Available; + public System.Type[] CastType; // Type that will be converted to AttribType if dropped on the canvas ... p.e. dropping a texture2d on the canvas will generate a sampler2d node + public bool Deprecated; + public string DeprecatedAlternative; + public System.Type DeprecatedAlternativeType; + public bool FromCommunity; + public string CustomCategoryColor; // Color created via a string containing its hexadecimal representation + public int SortOrderPriority; // to be used when name comparing on sorting + public int NodeAvailabilityFlags;// used to define where this node can be used + private string m_nodeUrl; + public string Community; + public string Tags; + public NodeAttributes( string name, string category, string description, System.Type castType = null, KeyCode shortcutKey = KeyCode.None, bool available = true, bool deprecated = false, string deprecatedAlternative = null, System.Type deprecatedAlternativeType = null, string community = null, string customCategoryColor = null, int sortOrderPriority = -1, int nodeAvailabilityFlags = int.MaxValue, string tags = null ) + { + Name = name; + Description = description; + Category = category; + if( castType != null ) + CastType = new System.Type[] { castType }; + + ShortcutKey = shortcutKey; + Available = available; + Deprecated = deprecated; + DeprecatedAlternative = deprecatedAlternative; + Community = community; + if( string.IsNullOrEmpty( Community ) ) + Community = string.Empty; + else + FromCommunity = true; + + if( !string.IsNullOrEmpty( customCategoryColor ) ) + CustomCategoryColor = customCategoryColor; + + DeprecatedAlternativeType = deprecatedAlternativeType; + SortOrderPriority = sortOrderPriority; + NodeAvailabilityFlags = nodeAvailabilityFlags; + Tags = tags; + if( string.IsNullOrEmpty( tags ) ) + Tags = string.Empty; + //m_nodeUrl = ( FromCommunity ? Constants.CommunityNodeCommonUrl : Constants.NodeCommonUrl ) + UIUtils.UrlReplaceInvalidStrings( Name ); + } + + public NodeAttributes( string name, string category, string description, KeyCode shortcutKey, bool available, int sortOrderPriority, int nodeAvailabilityFlags, params System.Type[] castTypes ) + { + Name = name; + Description = description; + Category = category; + if( castTypes != null && castTypes.Length > 0 ) + { + CastType = castTypes; + } + + ShortcutKey = shortcutKey; + Available = available; + SortOrderPriority = sortOrderPriority; + NodeAvailabilityFlags = nodeAvailabilityFlags; + //m_nodeUrl = ( FromCommunity ? Constants.CommunityNodeCommonUrl : Constants.NodeCommonUrl ) + UIUtils.UrlReplaceInvalidStrings( Name ); + } + + public string NodeUrl + { + get + { + if( string.IsNullOrEmpty( m_nodeUrl ) ) + { + m_nodeUrl = ( FromCommunity ? Constants.CommunityNodeCommonUrl : Constants.NodeCommonUrl ) + UIUtils.UrlReplaceInvalidStrings( Name ); + } + return m_nodeUrl; + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/NodeAttributes.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/NodeAttributes.cs.meta new file mode 100644 index 0000000..c7a076f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/NodeAttributes.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ec3cfdc3a4d1a7a4cb24c1c079e1750a +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/NodeRestrictions.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/NodeRestrictions.cs new file mode 100644 index 0000000..d68d8eb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/NodeRestrictions.cs @@ -0,0 +1,119 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Collections.Generic; +namespace AmplifyShaderEditor +{ + public class NodeRestrictionsData + { + private bool m_allPorts; + private Dictionary m_portRestrictions; + public NodeRestrictionsData() + { + m_portRestrictions = new Dictionary(); + } + + public NodeRestrictionsData( int port ) + { + m_portRestrictions = new Dictionary(); + m_portRestrictions.Add( port, true ); + } + + public void SetAllPortRestiction( bool value ) + { + m_allPorts = value; + } + + public void AddRestriction( int port ) + { + if ( !m_portRestrictions.ContainsKey( port ) ) + m_portRestrictions.Add( port, true ); + else + m_portRestrictions[ port ] = true; + } + + public void RemoveRestriction( int port ) + { + if ( m_portRestrictions.ContainsKey( port ) ) + m_portRestrictions[ port ] = true; + } + + public bool IsPortRestricted( int port ) + { + if ( m_portRestrictions.ContainsKey( port ) ) + return m_portRestrictions[ port ]; + return false; + } + + public void Destroy() + { + m_portRestrictions.Clear(); + m_portRestrictions = null; + } + + public bool AllPortsRestricted + { + get + { + return m_allPorts; + } + } + } + + public class NodeRestrictions + { + private Dictionary m_restrictions; + + public NodeRestrictions() + { + m_restrictions = new Dictionary(); + } + + public void AddTypeRestriction( System.Type type ) + { + if ( !m_restrictions.ContainsKey( type ) ) + m_restrictions.Add( type, new NodeRestrictionsData() ); + + m_restrictions[ type ].SetAllPortRestiction( true ); + + } + + public void AddPortRestriction( System.Type type, int port ) + { + if ( !m_restrictions.ContainsKey( type ) ) + m_restrictions.Add( type, new NodeRestrictionsData( port ) ); + else + { + m_restrictions[ type ].AddRestriction( port ); + } + } + + public bool GetRestiction( System.Type type, int port ) + { + if ( m_restrictions.Count == 0 || type == null ) + return false; + + if ( m_restrictions.ContainsKey( type ) ) + { + if ( m_restrictions[ type ].AllPortsRestricted ) + return true; + + return m_restrictions[ type ].IsPortRestricted( port ); + } + + return false; + } + + public void Destroy() + { + foreach ( KeyValuePair pair in m_restrictions ) + { + pair.Value.Destroy(); + } + + m_restrictions.Clear(); + m_restrictions = null; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/NodeRestrictions.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/NodeRestrictions.cs.meta new file mode 100644 index 0000000..dccb7b3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/NodeRestrictions.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: bd1aff8475f370d4380918491184aef5 +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/NodeUsageRegister.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/NodeUsageRegister.cs new file mode 100644 index 0000000..944ce81 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/NodeUsageRegister.cs @@ -0,0 +1,203 @@ +using System; +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + [Serializable] public class UsageListSamplerNodes : NodeUsageRegister { } + [Serializable] public class UsageListFloatIntNodes : NodeUsageRegister { } + [Serializable] public class UsageListTexturePropertyNodes : NodeUsageRegister { } + [Serializable] public class UsageListTextureArrayNodes : NodeUsageRegister { } + [Serializable] public class UsageListPropertyNodes : NodeUsageRegister { } + [Serializable] public class UsageListScreenColorNodes : NodeUsageRegister { } + [Serializable] public class UsageListRegisterLocalVarNodes : NodeUsageRegister { } + [Serializable] public class UsageListFunctionInputNodes : NodeUsageRegister { } + [Serializable] public class UsageListFunctionNodes : NodeUsageRegister { } + [Serializable] public class UsageListFunctionOutputNodes : NodeUsageRegister { } + [Serializable] public class UsageListFunctionSwitchNodes : NodeUsageRegister { } + [Serializable] public class UsageListFunctionSwitchCopyNodes : NodeUsageRegister { } + [Serializable] public class UsageListTemplateMultiPassMasterNodes : NodeUsageRegister { } + [Serializable] public class UsageListCustomExpressionsOnFunctionMode : NodeUsageRegister { } + [Serializable] public class UsageListGlobalArrayNodes : NodeUsageRegister { } + [Serializable] public class UsageListStaticSwitchNodes : NodeUsageRegister { } + + [Serializable] + public class NodeUsageRegister where T : ParentNode + { + public delegate void ReorderEvent(); + public event ReorderEvent OnReorderEventComplete; + + [SerializeField] + public bool ReorderOnChange = false; + + // Sampler Nodes registry + [SerializeField] + private List m_nodes; + + [SerializeField] + private string[] m_nodesArr; + + [SerializeField] + private int[] m_nodeIDs; + + [SerializeField] + ParentGraph m_containerGraph; + + public NodeUsageRegister() + { + m_nodesArr = new string[ 0 ]; + m_nodeIDs = new int[ 0 ]; + m_nodes = new List(); + } + + public void Destroy() + { + m_nodes.Clear(); + m_nodes = null; + m_nodesArr = null; + m_nodeIDs = null; + } + + public void Clear() + { + m_nodes.Clear(); + } + + public int AddNode( T node ) + { + if( node == null ) + return -1; + + if( !m_nodes.Contains( node ) ) + { + if( m_containerGraph != null ) + { + Undo.RegisterCompleteObjectUndo( m_containerGraph.ParentWindow, Constants.UndoRegisterNodeId ); + Undo.RegisterCompleteObjectUndo( m_containerGraph, Constants.UndoRegisterNodeId ); + } + m_nodes.Add( node ); + ReorderNodes(); + UpdateNodeArr(); + return m_nodes.Count - 1; + } + else if( node.UniqueId > -1 ) + { + UpdateNodeArr(); + } + + return -1; + } + + public bool HasNode( int uniqueId ) + { + return m_nodes.FindIndex( x => x.UniqueId == uniqueId ) > -1 ? true : false; + } + + public void RemoveNode( T node ) + { + if( node == null ) + return; + + if( m_nodes.Contains( node ) ) + { + if( m_containerGraph != null ) + { + Undo.RegisterCompleteObjectUndo( m_containerGraph.ParentWindow, Constants.UndoUnregisterNodeId ); + Undo.RegisterCompleteObjectUndo( m_containerGraph, Constants.UndoUnregisterNodeId ); + } + + m_nodes.Remove( node ); + ReorderNodes(); + UpdateNodeArr(); + } + } + + public void ReorderNodes() + { + if( ReorderOnChange ) + { + m_nodes.Sort( ( x, y ) => ( x.DataToArray.CompareTo( y.DataToArray ) ) ); + if( OnReorderEventComplete != null ) + { + OnReorderEventComplete(); + } + } + } + + public void UpdateNodeArr() + { + int nodeCount = m_nodes.Count; + if( nodeCount != m_nodesArr.Length ) + { + m_nodesArr = new string[ nodeCount ]; + m_nodeIDs = new int[ nodeCount ]; + } + + for( int i = 0; i < nodeCount; i++ ) + { + m_nodesArr[ i ] = m_nodes[ i ].DataToArray; + m_nodeIDs[ i ] = m_nodes[ i ].UniqueId; + } + } + + public T GetNode( int idx ) + { + if( idx > -1 && idx < m_nodes.Count ) + { + return m_nodes[ idx ]; + } + return null; + } + + public T GetNodeByUniqueId( int uniqueId ) + { + return m_nodes.Find( x => x.UniqueId == uniqueId ); + } + + public T GetNodeByDataToArray( string data ) + { + return m_nodes.Find( x => x.DataToArray.Equals( data )); + } + + public int GetNodeRegisterIdx( int uniqueId ) + { + return m_nodes.FindIndex( x => x.UniqueId == uniqueId ); + } + + public void UpdateDataOnNode( int uniqueId, string data ) + { + if( ReorderOnChange ) + { + ReorderNodes(); + UpdateNodeArr(); + } + else + { + int index = m_nodes.FindIndex( x => x.UniqueId == uniqueId ); + if( index > -1 ) + { + m_nodesArr[ index ] = data; + m_nodeIDs[ index ] = uniqueId; + } + } + } + + public void Dump() + { + string data = string.Empty; + + for( int i = 0; i < m_nodesArr.Length; i++ ) + { + data += m_nodesArr[ i ] + " " + m_nodeIDs[ i ] + '\n'; + } + Debug.Log( data ); + } + + public string[] NodesArr { get { return m_nodesArr; } } + public int[] NodeIds { get { return m_nodeIDs; } } + public List NodesList { get { return m_nodes; } } + public int Count { get { return m_nodes.Count; } } + public ParentGraph ContainerGraph { get { return m_containerGraph; } set { m_containerGraph = value; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/NodeUsageRegister.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/NodeUsageRegister.cs.meta new file mode 100644 index 0000000..9f7511e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/NodeUsageRegister.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2aa06a21e7f64094c91da5dd60ef35cf +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/NodeUtils.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/NodeUtils.cs new file mode 100644 index 0000000..81219dd --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/NodeUtils.cs @@ -0,0 +1,293 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + public class NodeUtils + { + + public delegate void DrawPropertySection(); + + public static void DrawPropertyGroup( string sectionName, DrawPropertySection DrawSection ) + { + Color cachedColor = GUI.color; + GUI.color = new Color( cachedColor.r, cachedColor.g, cachedColor.b, 0.5f ); + EditorGUILayout.BeginHorizontal( UIUtils.MenuItemToolbarStyle ); + GUI.color = cachedColor; + + GUILayout.Label( sectionName, UIUtils.MenuItemToggleStyle ); + + EditorGUILayout.EndHorizontal(); + + + cachedColor = GUI.color; + GUI.color = new Color( cachedColor.r, cachedColor.g, cachedColor.b, ( EditorGUIUtility.isProSkin ? 0.5f : 0.25f ) ); + EditorGUILayout.BeginVertical( UIUtils.MenuItemBackgroundStyle ); + GUI.color = cachedColor; + DrawSection(); + EditorGUILayout.Separator(); + EditorGUILayout.EndVertical(); + } + + + public static void DrawNestedPropertyGroup( ref bool foldoutValue, string sectionName, DrawPropertySection DrawSection, int horizontalSpacing = 15 ) + { + GUILayout.BeginHorizontal(); + { + GUILayout.Space( horizontalSpacing ); + EditorGUILayout.BeginVertical( EditorStyles.helpBox ); + { + Color cachedColor = GUI.color; + GUI.color = new Color( cachedColor.r, cachedColor.g, cachedColor.b, 0.5f ); + EditorGUILayout.BeginHorizontal(); + { + GUI.color = cachedColor; + bool value = GUILayout.Toggle( foldoutValue, sectionName, UIUtils.MenuItemToggleStyle ); + if( Event.current.button == Constants.FoldoutMouseId ) + { + foldoutValue = value; + } + } + EditorGUILayout.EndHorizontal(); + EditorGUI.indentLevel--; + if( foldoutValue ) + { + cachedColor = GUI.color; + GUI.color = new Color( cachedColor.r, cachedColor.g, cachedColor.b, ( EditorGUIUtility.isProSkin ? 0.5f : 0.25f ) ); + { + EditorGUILayout.BeginVertical( UIUtils.MenuItemBackgroundStyle ); + { + GUI.color = cachedColor; + DrawSection(); + } + EditorGUILayout.EndVertical(); + EditorGUILayout.Separator(); + } + } + EditorGUI.indentLevel++; + } + EditorGUILayout.EndVertical(); + } + GUILayout.EndHorizontal(); + } + + public static void DrawNestedPropertyGroup( ref bool foldoutValue, Rect rect, string sectionName, DrawPropertySection DrawSection, int horizontalSpacing = 15 ) + { + var box = rect; + box.height -= 2; + GUI.Label( box, string.Empty, EditorStyles.helpBox ); + + var tog = rect; +#if UNITY_2019_3_OR_NEWER + tog.y -= ( tog.height - ( EditorGUIUtility.singleLineHeight + 5 ) ) * 0.5f; +#endif + tog.xMin += 2; + tog.xMax -= 2; + tog.yMin += 2; + bool value = GUI.Toggle( tog, foldoutValue, sectionName, UIUtils.MenuItemToggleStyle ); + if( Event.current.button == Constants.FoldoutMouseId ) + { + foldoutValue = value; + } + + if( foldoutValue ) + { + DrawSection(); + } + } + + + public static void DrawNestedPropertyGroup( ref bool foldoutValue, string sectionName, DrawPropertySection DrawSection, DrawPropertySection HeaderSection ) + { + GUILayout.BeginHorizontal(); + { + GUILayout.Space( 15 ); + EditorGUILayout.BeginVertical( EditorStyles.helpBox ); + Color cachedColor = GUI.color; + GUI.color = new Color( cachedColor.r, cachedColor.g, cachedColor.b, 0.5f ); + EditorGUILayout.BeginHorizontal(); + GUI.color = cachedColor; + + bool value = GUILayout.Toggle( foldoutValue, sectionName, UIUtils.MenuItemToggleStyle ); + if( Event.current.button == Constants.FoldoutMouseId ) + { + foldoutValue = value; + } + HeaderSection(); + EditorGUILayout.EndHorizontal(); + EditorGUI.indentLevel--; + if( foldoutValue ) + { + cachedColor = GUI.color; + GUI.color = new Color( cachedColor.r, cachedColor.g, cachedColor.b, ( EditorGUIUtility.isProSkin ? 0.5f : 0.25f ) ); + EditorGUILayout.BeginVertical( UIUtils.MenuItemBackgroundStyle ); + GUI.color = cachedColor; + DrawSection(); + EditorGUILayout.EndVertical(); + EditorGUILayout.Separator(); + } + EditorGUI.indentLevel++; + EditorGUILayout.EndVertical(); + } + GUILayout.EndHorizontal(); + } + + public static void DrawNestedPropertyGroup( UndoParentNode owner, ref bool foldoutValue, ref bool enabledValue, string sectionName, DrawPropertySection DrawSection ) + { + GUILayout.BeginHorizontal(); + { + GUILayout.Space( 15 ); + EditorGUILayout.BeginVertical( EditorStyles.helpBox ); + Color cachedColor = GUI.color; + GUI.color = new Color( cachedColor.r, cachedColor.g, cachedColor.b, 0.5f ); + EditorGUILayout.BeginHorizontal(); + GUI.color = cachedColor; + + bool value = GUILayout.Toggle( foldoutValue, sectionName, UIUtils.MenuItemToggleStyle ); + if( Event.current.button == Constants.FoldoutMouseId ) + { + foldoutValue = value; + } + + value = ( (object)owner != null ) ? owner.GUILayoutToggle( enabledValue, string.Empty,UIUtils.MenuItemEnableStyle, GUILayout.Width( 16 ) ) : + GUILayout.Toggle( enabledValue, string.Empty, UIUtils.MenuItemEnableStyle, GUILayout.Width( 16 ) ); + if( Event.current.button == Constants.FoldoutMouseId ) + { + enabledValue = value; + } + + + EditorGUILayout.EndHorizontal(); + EditorGUI.indentLevel--; + if( foldoutValue ) + { + cachedColor = GUI.color; + GUI.color = new Color( cachedColor.r, cachedColor.g, cachedColor.b, ( EditorGUIUtility.isProSkin ? 0.5f : 0.25f ) ); + EditorGUILayout.BeginVertical( UIUtils.MenuItemBackgroundStyle ); + GUI.color = cachedColor; + DrawSection(); + EditorGUILayout.EndVertical(); + EditorGUILayout.Separator(); + } + EditorGUI.indentLevel++; + EditorGUILayout.EndVertical(); + } + GUILayout.EndHorizontal(); + } + + + public static void DrawPropertyGroup( ref bool foldoutValue, string sectionName, DrawPropertySection DrawSection ) + { + Color cachedColor = GUI.color; + GUI.color = new Color( cachedColor.r, cachedColor.g, cachedColor.b, 0.5f ); + EditorGUILayout.BeginHorizontal( UIUtils.MenuItemToolbarStyle ); + GUI.color = cachedColor; + + bool value = GUILayout.Toggle( foldoutValue, sectionName, UIUtils.MenuItemToggleStyle ); + if( Event.current.button == Constants.FoldoutMouseId ) + { + foldoutValue = value; + } + EditorGUILayout.EndHorizontal(); + + if( foldoutValue ) + { + cachedColor = GUI.color; + GUI.color = new Color( cachedColor.r, cachedColor.g, cachedColor.b, ( EditorGUIUtility.isProSkin ? 0.5f : 0.25f ) ); + EditorGUILayout.BeginVertical( UIUtils.MenuItemBackgroundStyle ); + { + GUI.color = cachedColor; + EditorGUI.indentLevel++; + DrawSection(); + EditorGUI.indentLevel--; + EditorGUILayout.Separator(); + } + EditorGUILayout.EndVertical(); + } + } + + public static void DrawPropertyGroup( ref bool foldoutValue, string sectionName, DrawPropertySection DrawSection, DrawPropertySection HeaderSection ) + { + Color cachedColor = GUI.color; + GUI.color = new Color( cachedColor.r, cachedColor.g, cachedColor.b, 0.5f ); + EditorGUILayout.BeginHorizontal( UIUtils.MenuItemToolbarStyle ); + GUI.color = cachedColor; + + bool value = GUILayout.Toggle( foldoutValue, sectionName, UIUtils.MenuItemToggleStyle ); + if( Event.current.button == Constants.FoldoutMouseId ) + { + foldoutValue = value; + } + HeaderSection(); + EditorGUILayout.EndHorizontal(); + + if( foldoutValue ) + { + cachedColor = GUI.color; + GUI.color = new Color( cachedColor.r, cachedColor.g, cachedColor.b, ( EditorGUIUtility.isProSkin ? 0.5f : 0.25f ) ); + EditorGUILayout.BeginVertical( UIUtils.MenuItemBackgroundStyle ); + { + GUI.color = cachedColor; + EditorGUI.indentLevel++; + DrawSection(); + EditorGUI.indentLevel--; + EditorGUILayout.Separator(); + } + EditorGUILayout.EndVertical(); + } + } + + + public static bool DrawPropertyGroup( UndoParentNode owner, ref bool foldoutValue, ref bool enabledValue, string sectionName, DrawPropertySection DrawSection ) + { + bool enableChanged = false; + Color cachedColor = GUI.color; + GUI.color = new Color( cachedColor.r, cachedColor.g, cachedColor.b, 0.5f ); + EditorGUILayout.BeginHorizontal( UIUtils.MenuItemToolbarStyle ); + GUI.color = cachedColor; + bool value = GUILayout.Toggle( foldoutValue, sectionName, UIUtils.MenuItemToggleStyle, GUILayout.ExpandWidth( true ) ); + if( Event.current.button == Constants.FoldoutMouseId ) + { + foldoutValue = value; + } + EditorGUI.BeginChangeCheck(); + value = ( (object)owner != null ) ? owner.EditorGUILayoutToggle( string.Empty, enabledValue, UIUtils.MenuItemEnableStyle, GUILayout.Width( 16 ) ) : + EditorGUILayout.Toggle( string.Empty, enabledValue, UIUtils.MenuItemEnableStyle, GUILayout.Width( 16 ) ); + if( Event.current.button == Constants.FoldoutMouseId ) + { + enabledValue = value; + } + if( EditorGUI.EndChangeCheck() ) + { + enableChanged = true; + } + + EditorGUILayout.EndHorizontal(); + + if( foldoutValue ) + { + cachedColor = GUI.color; + GUI.color = new Color( cachedColor.r, cachedColor.g, cachedColor.b, ( EditorGUIUtility.isProSkin ? 0.5f : 0.25f ) ); + EditorGUILayout.BeginVertical( UIUtils.MenuItemBackgroundStyle ); + GUI.color = cachedColor; + + EditorGUILayout.Separator(); + EditorGUI.BeginDisabledGroup( !enabledValue ); + + EditorGUI.indentLevel += 1; + + DrawSection(); + + EditorGUI.indentLevel -= 1; + EditorGUI.EndDisabledGroup(); + EditorGUILayout.Separator(); + EditorGUILayout.EndVertical(); + } + + return enableChanged; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/NodeUtils.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/NodeUtils.cs.meta new file mode 100644 index 0000000..f60220a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/NodeUtils.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9eb57a68790e6e343affe131e8a0f860 +timeCreated: 1487688956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators.meta new file mode 100644 index 0000000..6d6fbea --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f2a66c410f1e56b418ec994b6f57c2eb +folderAsset: yes +timeCreated: 1481126946 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ACosOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ACosOpNode.cs new file mode 100644 index 0000000..32fff2c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ACosOpNode.cs @@ -0,0 +1,26 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "ACos", "Trigonometry Operators", "Arccosine of scalars and vectors" )] + public sealed class ACosOpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "acos"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT , + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR, + WirePortDataType.INT ); + m_previewShaderGUID = "710f3c0bbd7ba0c4aada6d7dfadd49c2"; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ACosOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ACosOpNode.cs.meta new file mode 100644 index 0000000..74fdc7a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ACosOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8238f389c28938544b56035531b3f1be +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ASinOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ASinOpNode.cs new file mode 100644 index 0000000..936e1d1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ASinOpNode.cs @@ -0,0 +1,26 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "ASin", "Trigonometry Operators", "Arcsine of scalars and vectors" )] + public sealed class ASinOpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "asin"; + m_previewShaderGUID = "2b016c135284add4cb3364d4a0bd0638"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT, + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR, + WirePortDataType.INT ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ASinOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ASinOpNode.cs.meta new file mode 100644 index 0000000..0e1aa0a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ASinOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 268ebf76d03c2e84f8c80a375773b46c +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ATan2OpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ATan2OpNode.cs new file mode 100644 index 0000000..70f9fb7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ATan2OpNode.cs @@ -0,0 +1,28 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "ATan2", "Trigonometry Operators", "Arctangent of y/x" )] + public sealed class ATan2OpNode : DynamicTypeNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_dynamicOutputType = true; + m_useInternalPortData = true; + m_previewShaderGUID = "02e3ff61784e38840af6313936b6a730"; + } + + public override string BuildResults( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + base.BuildResults( outputId, ref dataCollector, ignoreLocalvar ); + string result = "atan2( " + m_inputA + " , " + m_inputB + " )"; + return CreateOutputLocalVariable( 0, result, ref dataCollector ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ATan2OpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ATan2OpNode.cs.meta new file mode 100644 index 0000000..9109fe7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ATan2OpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f5957d9ac2cc12146bc862cd0c92815a +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ATanOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ATanOpNode.cs new file mode 100644 index 0000000..c36c599 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ATanOpNode.cs @@ -0,0 +1,26 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "ATan", "Trigonometry Operators", "Arctangent of scalars and vectors" )] + public sealed class ATanOpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "atan"; + m_previewShaderGUID = "7d7f3331a98831241b017364e80625ea"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT, + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR, + WirePortDataType.INT ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ATanOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ATanOpNode.cs.meta new file mode 100644 index 0000000..a382707 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ATanOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d84f7e90e793aaa4891b4c1fe400dc4c +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/AbsOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/AbsOpNode.cs new file mode 100644 index 0000000..18adcbd --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/AbsOpNode.cs @@ -0,0 +1,26 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Abs", "Math Operators", "Absolute value of scalars and vectors" )] + public sealed class AbsOpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "abs"; + m_previewShaderGUID = "cd6d6dfa3df214a479f68a490e177db6"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT, + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR, + WirePortDataType.INT); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/AbsOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/AbsOpNode.cs.meta new file mode 100644 index 0000000..50ca8f5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/AbsOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 46aea6c13d71ec74da7f23abba3704d6 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/CeilOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/CeilOpNode.cs new file mode 100644 index 0000000..6767231 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/CeilOpNode.cs @@ -0,0 +1,26 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Ceil", "Math Operators", "Smallest integer not less than a scalar or each vector component" )] + public sealed class CeilOpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "ceil"; + m_previewShaderGUID = "ce0588227a766a245a85291977c1f222"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT , + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR , + WirePortDataType.INT); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/CeilOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/CeilOpNode.cs.meta new file mode 100644 index 0000000..aba3589 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/CeilOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 555db3754f84db947846519630ea303b +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ClampOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ClampOpNode.cs new file mode 100644 index 0000000..fe15a01 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ClampOpNode.cs @@ -0,0 +1,103 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Clamp", "Math Operators", "Value clamped to the range [min,max]" )] + public sealed class ClampOpNode : ParentNode + { + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, Constants.EmptyPortValue ); + AddInputPort( WirePortDataType.FLOAT, false, "Min" ); + AddInputPort( WirePortDataType.FLOAT, false, "Max" ); + m_inputPorts[ m_inputPorts.Count - 1 ].FloatInternalData = 1; + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + m_useInternalPortData = true; + m_textLabelWidth = 55; + m_previewShaderGUID = "ab6163c4b10bfc84da8e3c486520490a"; + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + if ( portId == 0 ) + { + m_inputPorts[ 0 ].MatchPortToConnection(); + m_inputPorts[ 1 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + m_inputPorts[ 2 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + } + //else + //{ + // _inputPorts[ portId ].MatchPortToConnection(); + //} + } + + public override void OnConnectedOutputNodeChanges( int outputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( outputPortId, otherNodeId, otherPortId, name, type ); + if ( outputPortId == 0 ) + { + m_inputPorts[ 0 ].MatchPortToConnection(); + m_inputPorts[ 1 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + m_inputPorts[ 2 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + WirePortDataType valueType = m_inputPorts[ 0 ].ConnectionType(); + WirePortDataType minType = m_inputPorts[ 1 ].ConnectionType(); + WirePortDataType maxType = m_inputPorts[ 2 ].ConnectionType(); + + string value = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string min = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + if ( minType != valueType ) + { + min = UIUtils.CastPortType( ref dataCollector, CurrentPrecisionType, new NodeCastInfo( UniqueId, outputId ), null, m_inputPorts[ 1 ].DataType, m_inputPorts[ 0 ].DataType, min ); + } + + string max = m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector ); + if ( maxType != valueType ) + { + max = UIUtils.CastPortType( ref dataCollector, CurrentPrecisionType, new NodeCastInfo( UniqueId, outputId ), null, m_inputPorts[ 2 ].DataType, m_inputPorts[ 0 ].DataType, max ); + } + + string result = string.Empty; + switch ( valueType ) + { + case WirePortDataType.FLOAT: + case WirePortDataType.FLOAT2: + case WirePortDataType.FLOAT3: + case WirePortDataType.FLOAT4: + case WirePortDataType.INT: + case WirePortDataType.COLOR: + case WirePortDataType.OBJECT: + { + result = "clamp( " + value + " , " + min + " , " + max + " )"; + } + break; + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + { + return UIUtils.InvalidParameter( this ); + } + } + + RegisterLocalVariable( 0, result, ref dataCollector, "clampResult" + OutputId ); + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ClampOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ClampOpNode.cs.meta new file mode 100644 index 0000000..dd3c8f7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ClampOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5d7101830aa0c524f9519fef95c90dc3 +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ClipNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ClipNode.cs new file mode 100644 index 0000000..606cb82 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ClipNode.cs @@ -0,0 +1,123 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Clip", "Miscellaneous", "Conditionally kill a pixel before output" )] + public sealed class ClipNode : ParentNode + { + private const string ClipOpFormat = "clip( {0} );"; + private const string ClipSubOpFormat = "clip( {0} - {1});"; + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, Constants.EmptyPortValue ); + AddInputPort( WirePortDataType.FLOAT, false, "Alpha" ); + AddInputPort( WirePortDataType.FLOAT, false, "Threshold" ); + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + m_useInternalPortData = true; + + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT , + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR , + WirePortDataType.INT); + + m_previewShaderGUID = "1fca7774f364aee4d8c64e8634ef4be4"; + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + m_inputPorts[ portId ].MatchPortToConnection(); + UpdatePortConnection( portId ); + } + + public override void OnConnectedOutputNodeChanges( int outputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( outputPortId, otherNodeId, otherPortId, name, type ); + m_inputPorts[ outputPortId ].MatchPortToConnection(); + UpdatePortConnection( outputPortId ); + } + + void UpdatePortConnection( int portId ) + { + if( portId == 0 ) + { + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + } + else + { + int otherPortId = portId == 1 ? 2 : 1; + if( m_inputPorts[ otherPortId ].IsConnected ) + { + WirePortDataType type1 = m_inputPorts[ portId ].DataType; + WirePortDataType type2 = m_inputPorts[ otherPortId ].DataType; + + WirePortDataType mainType = UIUtils.GetPriority( type1 ) > UIUtils.GetPriority( type2 ) ? type1 : type2; + + m_inputPorts[ portId ].ChangeType( mainType, false ); + m_inputPorts[ otherPortId ].ChangeType( mainType , false ); + } + else + { + m_inputPorts[ otherPortId ].ChangeType( m_inputPorts[ portId ].DataType,false ); + } + } + } + + public override void OnInputPortDisconnected( int portId ) + { + base.OnInputPortDisconnected( portId ); + if( portId == 0 ) + return; + int otherPortId = portId == 1 ? 2 : 1; + if( m_inputPorts[ otherPortId ].IsConnected ) + { + m_inputPorts[ portId ].ChangeType( m_inputPorts[ otherPortId ].DataType, false ); + } + else + { + m_inputPorts[ portId ].ChangeType( WirePortDataType.FLOAT, false ); + m_inputPorts[ otherPortId ].ChangeType( WirePortDataType.FLOAT, false ); + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.PortCategory == MasterNodePortCategory.Vertex || + dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + { + UIUtils.ShowMessage( UniqueId, "Clip can only be used in fragment functions", MessageSeverity.Warning ); + return GenerateErrorValue(); + } + + string value = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string alpha = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + if( m_inputPorts[ 2 ].IsConnected ) + { + string threshold = m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector ); + dataCollector.AddLocalVariable( UniqueId, string.Format( ClipSubOpFormat, alpha , threshold) ); + } + else + { + if( m_inputPorts[ 2 ].IsZeroInternalData ) + { + dataCollector.AddLocalVariable( UniqueId, string.Format( ClipOpFormat, alpha ) ); + } + else + { + string threshold = m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector ); + dataCollector.AddLocalVariable( UniqueId, string.Format( ClipSubOpFormat, alpha, threshold ) ); + } + } + + return value; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ClipNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ClipNode.cs.meta new file mode 100644 index 0000000..0d24e6e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ClipNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 78e9954f4d587b74fa38ae1dd9922d77 +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ComponentMaskNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ComponentMaskNode.cs new file mode 100644 index 0000000..3ed727c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ComponentMaskNode.cs @@ -0,0 +1,382 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Component Mask", "Vector Operators", "Mask certain channels from vectors/color components", null, KeyCode.K )] + public sealed class ComponentMaskNode : ParentNode + { + private const string OutputLocalVarName = "componentMask"; + [SerializeField] + private bool[] m_selection = { true, true, true, true }; + + [SerializeField] + private int m_outputPortCount = 4; + + [SerializeField] + private string[] m_labels; + + private int m_cachedOrderId = -1; + private int m_cachedSingularId = -1; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT4, false, Constants.EmptyPortValue ); + AddOutputPort( WirePortDataType.FLOAT4, Constants.EmptyPortValue ); + m_useInternalPortData = true; + m_autoWrapProperties = true; + m_selectedLocation = PreviewLocation.TopCenter; + m_labels = new string[] { "X", "Y", "Z", "W" }; + m_previewShaderGUID = "b78e2b295c265cd439c80d218fb3e88e"; + SetAdditonalTitleText( "Value( XYZW )" ); + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + Vector4 order = new Vector4(-1,-1,-1,-1); + int lastIndex = 0; + int singularId = -1; + var datatype = m_inputPorts[ 0 ].DataType; + + if( m_selection[ 0 ] ) + { + order.Set( lastIndex, order.y, order.z, order.w ); + lastIndex++; + singularId = 0; + } + if( m_selection[ 1 ] && datatype >= WirePortDataType.FLOAT2 ) + { + order.Set( order.x, lastIndex, order.z, order.w ); + lastIndex++; + singularId = 1; + } + if( m_selection[ 2 ] && datatype >= WirePortDataType.FLOAT3 ) + { + order.Set( order.x, order.y, lastIndex, order.w ); + lastIndex++; + singularId = 2; + } + if( m_selection[ 3 ] && ( datatype == WirePortDataType.FLOAT4 || datatype == WirePortDataType.COLOR ) ) + { + order.Set( order.x, order.y, order.z, lastIndex ); + lastIndex++; + singularId = 3; + } + + if ( lastIndex != 1 ) + singularId = -1; + + if ( m_cachedOrderId == -1 ) + m_cachedOrderId = Shader.PropertyToID( "_Order" ); + + if ( m_cachedSingularId == -1 ) + m_cachedSingularId = Shader.PropertyToID( "_Singular" ); + + PreviewMaterial.SetVector( m_cachedOrderId, order ); + PreviewMaterial.SetFloat( m_cachedSingularId, singularId ); + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + UpdatePorts(); + UpdateTitle(); + } + + public override void OnConnectedOutputNodeChanges( int outputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( outputPortId, otherNodeId, otherPortId, name, type ); + UpdatePorts(); + UpdateTitle(); + } + + public override void OnInputPortDisconnected( int portId ) + { + base.OnInputPortDisconnected( portId ); + UpdateTitle(); + } + + void UpdatePorts() + { + m_inputPorts[ 0 ].MatchPortToConnection(); + int count = 0; + switch ( m_inputPorts[ 0 ].DataType ) + { + case WirePortDataType.FLOAT4: + case WirePortDataType.OBJECT: + case WirePortDataType.COLOR: + { + count = 4; + } + break; + case WirePortDataType.FLOAT3: + { + count = 3; + } + break; + case WirePortDataType.FLOAT2: + { + count = 2; + } + break; + case WirePortDataType.FLOAT: + case WirePortDataType.INT: + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + { } + break; + } + + int activeCount = 0; + if ( count > 0 ) + { + for ( int i = 0; i < count; i++ ) + { + if ( m_selection[ i ] ) + activeCount += 1; + } + } + + m_outputPortCount = activeCount; + switch ( activeCount ) + { + case 0: ChangeOutputType( m_inputPorts[ 0 ].DataType, false ); break; + case 1: ChangeOutputType( WirePortDataType.FLOAT, false ); break; + case 2: ChangeOutputType( WirePortDataType.FLOAT2, false ); break; + case 3: ChangeOutputType( WirePortDataType.FLOAT3, false ); break; + case 4: ChangeOutputType( m_inputPorts[ 0 ].DataType, false ); break; + } + + } + + private void UpdateTitle() + { + int count = 0; + string additionalText = string.Empty; + switch ( m_inputPorts[ 0 ].DataType ) + { + case WirePortDataType.FLOAT4: + case WirePortDataType.OBJECT: + case WirePortDataType.COLOR: + { + count = 4; + } + break; + case WirePortDataType.FLOAT3: + { + count = 3; + } + break; + case WirePortDataType.FLOAT2: + { + count = 2; + } + break; + case WirePortDataType.FLOAT: + case WirePortDataType.INT: + { + count = 0; + } + break; + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + { } + break; + } + + if ( count > 0 ) + { + for ( int i = 0; i < count; i++ ) + { + if ( m_selection[ i ] ) + { + additionalText += UIUtils.GetComponentForPosition( i, m_inputPorts[ 0 ].DataType ).ToUpper(); + } + } + } + + if ( additionalText.Length > 0 ) + SetAdditonalTitleText( "Value( " + additionalText + " )" ); + else + SetAdditonalTitleText( string.Empty ); + } + + public override void DrawProperties() + { + base.DrawProperties(); + + EditorGUILayout.BeginVertical(); + + int count = 0; + switch ( m_inputPorts[ 0 ].DataType ) + { + case WirePortDataType.FLOAT4: + case WirePortDataType.OBJECT: + case WirePortDataType.COLOR: + { + count = 4; + } + break; + case WirePortDataType.FLOAT3: + { + count = 3; + } + break; + case WirePortDataType.FLOAT2: + { + count = 2; + } + break; + case WirePortDataType.FLOAT: + case WirePortDataType.INT: + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + { } + break; + } + + int activeCount = 0; + if ( count > 0 ) + { + for ( int i = 0; i < count; i++ ) + { + m_selection[ i ] = EditorGUILayoutToggleLeft( m_labels[i], m_selection[ i ] ); + m_labels[ i ] = UIUtils.GetComponentForPosition( i, m_inputPorts[ 0 ].DataType ).ToUpper(); + if ( m_selection[ i ] ) + { + activeCount += 1; + } + } + } + + if ( activeCount != m_outputPortCount ) + { + m_outputPortCount = activeCount; + switch ( activeCount ) + { + case 0: ChangeOutputType( m_inputPorts[ 0 ].DataType, false ); break; + case 1: ChangeOutputType( WirePortDataType.FLOAT, false ); break; + case 2: ChangeOutputType( WirePortDataType.FLOAT2, false ); break; + case 3: ChangeOutputType( WirePortDataType.FLOAT3, false ); break; + case 4: ChangeOutputType( m_inputPorts[ 0 ].DataType, false ); break; + } + UpdateTitle(); + SetSaveIsDirty(); + } + + EditorGUILayout.EndVertical(); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string value = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + + int count = 0; + switch ( m_inputPorts[ 0 ].DataType ) + { + case WirePortDataType.FLOAT4: + case WirePortDataType.OBJECT: + case WirePortDataType.COLOR: + { + count = 4; + } + break; + case WirePortDataType.FLOAT3: + { + count = 3; + } + break; + case WirePortDataType.FLOAT2: + { + count = 2; + } + break; + case WirePortDataType.FLOAT: + case WirePortDataType.INT: + { + count = 0; + } + break; + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + { } + break; + } + + if ( count > 0 ) + { + bool firstElement = true; + value = string.Format("({0})",value); + for ( int i = 0; i < count; i++ ) + { + if ( m_selection[ i ] ) + { + if( firstElement ) + { + firstElement = false; + value += "."; + } + value += UIUtils.GetComponentForPosition( i, m_inputPorts[ 0 ].DataType ); + } + } + } + + return CreateOutputLocalVariable( 0, value, ref dataCollector ); + } + + public string GetComponentForPosition( int i ) + { + switch ( i ) + { + case 0: + { + return ( ( m_outputPorts[ 0 ].DataType == WirePortDataType.COLOR ) ? "r" : "x" ); + } + case 1: + { + return ( ( m_outputPorts[ 0 ].DataType == WirePortDataType.COLOR ) ? "g" : "y" ); + } + case 2: + { + return ( ( m_outputPorts[ 0 ].DataType == WirePortDataType.COLOR ) ? "b" : "z" ); + } + case 3: + { + return ( ( m_outputPorts[ 0 ].DataType == WirePortDataType.COLOR ) ? "a" : "w" ); + } + } + return string.Empty; + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + for ( int i = 0; i < 4; i++ ) + { + m_selection[ i ] = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + UpdateTitle(); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + for ( int i = 0; i < 4; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_selection[ i ] ); + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ComponentMaskNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ComponentMaskNode.cs.meta new file mode 100644 index 0000000..fd1be0b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ComponentMaskNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 85082b6932d1c9a4f8b64605534ef118 +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/CosOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/CosOpNode.cs new file mode 100644 index 0000000..a7f799f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/CosOpNode.cs @@ -0,0 +1,26 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Cos", "Trigonometry Operators", "Cosine of scalars and vectors" )] + public sealed class CosOpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "cos"; + m_previewShaderGUID = "3dde9e80389196f459eb94137268de4a"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT , + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR , + WirePortDataType.INT); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/CosOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/CosOpNode.cs.meta new file mode 100644 index 0000000..132f1bf --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/CosOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ee9c446e7e41d524f8b4c93e6a8886c5 +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/CoshOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/CoshOpNode.cs new file mode 100644 index 0000000..24b6205 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/CoshOpNode.cs @@ -0,0 +1,26 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Cosh", "Trigonometry Operators", "Hyperbolic cosine of scalars and vectors" )] + public sealed class CoshOpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "cosh"; + m_previewShaderGUID = "154a4c85fe88657489a54a02416402c0"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT, + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR, + WirePortDataType.INT ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/CoshOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/CoshOpNode.cs.meta new file mode 100644 index 0000000..46ec817 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/CoshOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2b50a187f488a004aaa2dabbe558ab3a +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/CrossProductOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/CrossProductOpNode.cs new file mode 100644 index 0000000..354db0d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/CrossProductOpNode.cs @@ -0,0 +1,35 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Cross", "Vector Operators", "Cross product of two three-component vectors ( A x B )", null, KeyCode.X )] + public sealed class CrossProductOpNode : ParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT3, false, "Lhs" ); + AddInputPort( WirePortDataType.FLOAT3, false, "Rhs" ); + AddOutputPort( WirePortDataType.FLOAT3, "Out" ); + m_useInternalPortData = true; + m_previewShaderGUID = "65a9be5cc7037654db8e148d669f03ee"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + string lhsStr = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string rhsStr = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + + string result = "cross( " + lhsStr + " , " + rhsStr + " )"; + return CreateOutputLocalVariable( 0, result, ref dataCollector ); + } + + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/CrossProductOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/CrossProductOpNode.cs.meta new file mode 100644 index 0000000..61758de --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/CrossProductOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 283bc0645ce925346b33c024ff5a7dad +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DdxOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DdxOpNode.cs new file mode 100644 index 0000000..53b8821 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DdxOpNode.cs @@ -0,0 +1,32 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "DDX", "Math Operators", "Approximate partial derivative with respect to window-space X" )] + public sealed class DdxOpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "ddx"; + m_previewShaderGUID = "b54ea73d5568b3540977557813eb9c3c"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT, + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR, + WirePortDataType.INT ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.IsFragmentCategory ) + return base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + else + return m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DdxOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DdxOpNode.cs.meta new file mode 100644 index 0000000..d83171e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DdxOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2e14c4a7c0be9f146ac912130c280b15 +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DdyOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DdyOpNode.cs new file mode 100644 index 0000000..604a341 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DdyOpNode.cs @@ -0,0 +1,32 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "DDY", "Math Operators", "Approximate partial derivative with respect to window-space Y" )] + public sealed class DdyOpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "ddy"; + m_previewShaderGUID = "197dcc7f05339da47b6b0e681c475c5e"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT, + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR, + WirePortDataType.INT ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.IsFragmentCategory ) + return base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + else + return m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DdyOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DdyOpNode.cs.meta new file mode 100644 index 0000000..d32275f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DdyOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 722a2ad531fefdc4d8782d5c7cdfd012 +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DegreesOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DegreesOpNode.cs new file mode 100644 index 0000000..97afc8b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DegreesOpNode.cs @@ -0,0 +1,26 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Degrees", "Trigonometry Operators", "Converts values of scalars and vectors from radians to degrees" )] + public sealed class DegreesOpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "degrees"; + m_previewShaderGUID = "2a8eebb5566830c4a9d7c4b9021bb743"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT , + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR , + WirePortDataType.INT); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DegreesOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DegreesOpNode.cs.meta new file mode 100644 index 0000000..93e8abe --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DegreesOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3d88a21f3ece742408c7748897a21c79 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DeterminantOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DeterminantOpNode.cs new file mode 100644 index 0000000..d48f775 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DeterminantOpNode.cs @@ -0,0 +1,25 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Determinant", "Matrix Operators", "Scalar determinant of a square matrix" )] + public sealed class DeterminantOpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "determinant"; + m_drawPreview = false; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.FLOAT3x3, + WirePortDataType.FLOAT4x4 ); + + m_autoUpdateOutputPort = false; + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT4x4, false ); + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT, false ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DeterminantOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DeterminantOpNode.cs.meta new file mode 100644 index 0000000..16d62ce --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DeterminantOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e5cded78687f09442895bc96cc5b683d +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DistanceOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DistanceOpNode.cs new file mode 100644 index 0000000..8e3a6db --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DistanceOpNode.cs @@ -0,0 +1,32 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Distance", "Vector Operators", "Euclidean distance between two points" )] + public sealed class DistanceOpNode : DynamicTypeNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT4, false ); + m_inputPorts[ 1 ].ChangeType( WirePortDataType.FLOAT4, false ); + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT, false ); + m_dynamicOutputType = false; + m_useInternalPortData = true; + m_previewShaderGUID = "3be9a95031c0cb740ae982e465dfc242"; + } + + public override string BuildResults( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + base.BuildResults( outputId, ref dataCollector, ignoreLocalvar ); + string result = "distance( " + m_inputA + " , " + m_inputB + " )"; + return CreateOutputLocalVariable( 0, result, ref dataCollector ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DistanceOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DistanceOpNode.cs.meta new file mode 100644 index 0000000..3d28c02 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DistanceOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4b8bd7fecbc728f4b89d398cef86ada8 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DotProductOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DotProductOpNode.cs new file mode 100644 index 0000000..892ae53 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DotProductOpNode.cs @@ -0,0 +1,34 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Dot", "Vector Operators", "Scalar dot product of two vectors ( A . B )", null, KeyCode.Period )] + public sealed class DotProductOpNode : DynamicTypeNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT4, false ); + m_inputPorts[ 1 ].ChangeType( WirePortDataType.FLOAT4, false ); + m_dynamicOutputType = false; + m_useInternalPortData = true; + m_allowMatrixCheck = true; + m_previewShaderGUID = "85f11fd5cb9bb954c8615a45c57a3784"; + } + + public override string BuildResults( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + base.BuildResults( outputId, ref dataCollector, ignoreLocalvar ); + string result = "dot( " + m_inputA + " , " + m_inputB + " )"; + RegisterLocalVariable( 0, result, ref dataCollector, "dotResult" + OutputId ); + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DotProductOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DotProductOpNode.cs.meta new file mode 100644 index 0000000..a84594f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/DotProductOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c2bf0375fb75ce245b2f30857a111972 +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/Exp2OpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/Exp2OpNode.cs new file mode 100644 index 0000000..b94d561 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/Exp2OpNode.cs @@ -0,0 +1,26 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Exp2", "Math Operators", "Base-2 exponential of scalars and vectors" )] + public sealed class Exp2OpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "exp2"; + m_previewShaderGUID = "ceb70ed5423a36647a504a41de7dbfe6"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT, + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR, + WirePortDataType.INT ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/Exp2OpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/Exp2OpNode.cs.meta new file mode 100644 index 0000000..edea0de --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/Exp2OpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a9881734e0217bc45bb422dc83f6ee1a +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ExpOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ExpOpNode.cs new file mode 100644 index 0000000..29bded7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ExpOpNode.cs @@ -0,0 +1,26 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Exp", "Math Operators", "Base-e exponential of scalars and vectors" )] + public sealed class ExpOpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "exp"; + m_previewShaderGUID = "6416ff506137d97479a7ebde790b45e5"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT , + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR , + WirePortDataType.INT); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ExpOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ExpOpNode.cs.meta new file mode 100644 index 0000000..f598976 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ExpOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 81ef96bc69f897d4e8bc21e2731e065f +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/FWidthOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/FWidthOpNode.cs new file mode 100644 index 0000000..75ee9f4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/FWidthOpNode.cs @@ -0,0 +1,38 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "FWidth", "Math Operators", "Sum of approximate window-space partial derivatives magnitudes (Only valid on Fragment type ports)" )] + public sealed class FWidthOpNode : SingleInputOp + { + private const string FWidthErrorMsg = "Attempting to connect an FWidth to a {0} type port. It is only valid on Fragment type ports"; + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "fwidth"; + m_previewShaderGUID = "81ea481faaef9c8459a555479ba64df7"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT , + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR , + WirePortDataType.INT); + //m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT4, false ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.PortCategory == MasterNodePortCategory.Vertex || + dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + { + UIUtils.ShowMessage( UniqueId, string.Format( FWidthErrorMsg, dataCollector.PortCategory ), MessageSeverity.Error ); + return GenerateErrorValue(); + } + + return base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/FWidthOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/FWidthOpNode.cs.meta new file mode 100644 index 0000000..f97901e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/FWidthOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2e17448829221b04bb3185bef727b19f +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/FloorOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/FloorOpNode.cs new file mode 100644 index 0000000..5fe190e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/FloorOpNode.cs @@ -0,0 +1,24 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Floor", "Math Operators", "Largest integer not greater than a scalar or each vector component" )] + public sealed class FloorOpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "floor"; + m_previewShaderGUID = "46ae4a72a9a38de40a2d8f20cfccc67d"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT , + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR , + WirePortDataType.INT); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/FloorOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/FloorOpNode.cs.meta new file mode 100644 index 0000000..bd8bbdb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/FloorOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 176154e86c6c3544fab0d67e098c645d +timeCreated: 1481126953 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/FmodOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/FmodOpNode.cs new file mode 100644 index 0000000..698e370 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/FmodOpNode.cs @@ -0,0 +1,36 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Fmod", "Math Operators", "Floating point remainder of x/y with the same sign as x" )] + public sealed class FmodOpNode : DynamicTypeNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_previewShaderGUID = "65083930f9d7812479fd6ff203ad2992"; + } + + public override string BuildResults( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + base.BuildResults( outputId, ref dataCollector, ignoreLocalvar ); + if( m_inputPorts[ 0 ].DataType == WirePortDataType.INT ) + m_inputA = "(float)" + m_inputA; + + + if( m_inputPorts[ 1 ].DataType == WirePortDataType.INT ) + m_inputB = "(float)" + m_inputB; + + + string result = "fmod( " + m_inputA + " , " + m_inputB + " )"; + return CreateOutputLocalVariable( 0, result, ref dataCollector ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/FmodOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/FmodOpNode.cs.meta new file mode 100644 index 0000000..c4d07b8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/FmodOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 599ae67e52ac45f46acc0efd9285b97c +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/FractNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/FractNode.cs new file mode 100644 index 0000000..62c54dc --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/FractNode.cs @@ -0,0 +1,26 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Fract", "Math Operators", "Fractional portion of a scalar or each vector component" )] + public sealed class FractNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "frac"; + m_previewShaderGUID = "53a335f8f18d4694b8d94e8aee21fdca"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT, + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR, + WirePortDataType.INT ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/FractNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/FractNode.cs.meta new file mode 100644 index 0000000..004f9c6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/FractNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: fd6da00dbcdf3d04cb35a61cda01ae77 +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/GradientSampleNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/GradientSampleNode.cs new file mode 100644 index 0000000..258dae3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/GradientSampleNode.cs @@ -0,0 +1,207 @@ +using System; +using UnityEngine; +using UnityEditor; +using System.Collections; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Gradient Sample", "Miscellaneous", "Samples a gradient" )] + public sealed class GradientSampleNode : ParentNode + { + private string m_functionHeader = "SampleGradient( {0}, {1} )"; + private string m_functionBody = string.Empty; + + private GradientNode m_gradientNode = null; + private InputPort m_gradPort; + + private Gradient m_blankGrandient = new Gradient(); + + private int m_cachedTimeId = -1; + private int m_cachedTypeId = -1; + private int m_cachedColorNumId = -1; + private int m_cachedAlphaNumId = -1; + + private Vector4 m_auxVec4 = Vector4.zero; + + private string m_functionHeaderStruct = "Gradient( {0} )"; + private string m_functionBodyStruct = string.Empty; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.OBJECT, true, Constants.EmptyPortValue ); + AddInputPort( WirePortDataType.FLOAT, false, "Time" ); + AddOutputColorPorts( "RGBA", true ); + m_gradPort = m_inputPorts[ 0 ]; + m_useInternalPortData = true; + m_autoDrawInternalPortData = true; + m_drawPreviewExpander = false; + m_drawPreview = true; + m_showPreview = true; + m_selectedLocation = PreviewLocation.TopCenter; + m_previewShaderGUID = "8a09124cd6e4aa54a996e7487ec16b90"; + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + if( m_cachedTypeId == -1 ) + m_cachedTypeId = Shader.PropertyToID( "_GType" ); + + if( m_cachedTimeId == -1 ) + m_cachedTimeId = Shader.PropertyToID( "_GTime" ); + + if( m_cachedColorNumId == -1 ) + m_cachedColorNumId = Shader.PropertyToID( "_GColorNum" ); + + if( m_cachedAlphaNumId == -1 ) + m_cachedAlphaNumId = Shader.PropertyToID( "_GAlphaNum" ); + + PreviewMaterial.SetTexture( m_cachedTimeId, m_inputPorts[ 1 ].InputPreviewTexture( ContainerGraph ) ); + + Gradient curGrad = m_blankGrandient; + if( m_gradientNode != null ) + curGrad = m_gradientNode.Gradient; + + PreviewMaterial.SetInt( m_cachedTypeId, (int)curGrad.mode ); + PreviewMaterial.SetInt( m_cachedColorNumId, curGrad.colorKeys.Length ); + PreviewMaterial.SetInt( m_cachedAlphaNumId, curGrad.alphaKeys.Length ); + + for( int i = 0; i < 8; i++ ) + { + if( i < curGrad.colorKeys.Length ) + { + m_auxVec4.x = curGrad.colorKeys[ i ].color.r; + m_auxVec4.y = curGrad.colorKeys[ i ].color.g; + m_auxVec4.z = curGrad.colorKeys[ i ].color.b; + m_auxVec4.w = curGrad.colorKeys[ i ].time; + PreviewMaterial.SetVector( "_Col" + i, m_auxVec4 ); + } + else + { + PreviewMaterial.SetVector( "_Col" + i, Vector4.zero ); + } + } + + for( int i = 0; i < 8; i++ ) + { + if( i < curGrad.alphaKeys.Length ) + { + m_auxVec4.x = curGrad.alphaKeys[ i ].alpha; + m_auxVec4.y = curGrad.alphaKeys[ i ].time; + PreviewMaterial.SetVector( "_Alp" + i, m_auxVec4 ); + } + else + { + PreviewMaterial.SetVector( "_Alp" + i, Vector4.zero ); + } + } + } + + public override void OnNodeLogicUpdate( DrawInfo drawInfo ) + { + base.OnNodeLogicUpdate( drawInfo ); + + if( m_gradPort.IsConnected ) + { + m_gradientNode = RecursiveBackCheck( m_gradPort.GetOutputNode( 0 ) ); + } + else + { + m_gradientNode = null; + } + } + + GradientNode RecursiveBackCheck( ParentNode node ) + { + if( node is GradientNode ) + { + return node as GradientNode; + } + else + { + if( node is RelayNode || node is WireNode || node is RegisterLocalVarNode ) + { + return RecursiveBackCheck( node.InputPorts[ 0 ].GetOutputNode( 0 ) ); + } + else if( node is GetLocalVarNode) + { + var gnode = node as GetLocalVarNode; + if( gnode.CurrentSelected != null ) + return RecursiveBackCheck( gnode.CurrentSelected ); + else + return null; + } + else + { + return null; + } + } + + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + m_functionBodyStruct = string.Empty; + if( !dataCollector.IsSRP ) + { + GradientNode.GenerateGradientStruct( ref m_functionBodyStruct ); + dataCollector.AddFunctions( m_functionHeaderStruct, m_functionBodyStruct, "0" ); + } + else + { + dataCollector.AddToIncludes( UniqueId, "Packages/com.unity.shadergraph/ShaderGraphLibrary/Functions.hlsl" ); + } + + GenerateGradientSampler( dataCollector.IsSRP ); + + string gradient = "(Gradient)0"; + if( m_inputPorts[ 0 ].IsConnected && m_gradientNode != null ) + gradient = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string time = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + + string functionResult = dataCollector.AddFunctions( m_functionHeader, m_functionBody, gradient, time ); + return GetOutputVectorItem( 0, outputId, functionResult ); + } + + void GenerateGradientSampler( bool isSrp ) + { + m_functionBody = string.Empty; + IOUtils.AddFunctionHeader( ref m_functionBody, "float4 SampleGradient( Gradient gradient, float time )" ); + IOUtils.AddFunctionLine( ref m_functionBody, "float3 color = gradient.colors[0].rgb;" ); + IOUtils.AddFunctionLine( ref m_functionBody, "UNITY_UNROLL" ); + IOUtils.AddFunctionLine( ref m_functionBody, "for (int c = 1; c < 8; c++)" ); + IOUtils.AddFunctionLine( ref m_functionBody, "{" ); + if( isSrp ) + IOUtils.AddFunctionLine( ref m_functionBody, "float colorPos = saturate((time - gradient.colors[c-1].w) / ( 0.00001 + (gradient.colors[c].w - gradient.colors[c-1].w)) * step(c, gradient.colorsLength-1));" ); + else + IOUtils.AddFunctionLine( ref m_functionBody, "float colorPos = saturate((time - gradient.colors[c-1].w) / ( 0.00001 + (gradient.colors[c].w - gradient.colors[c-1].w)) * step(c, (float)gradient.colorsLength-1));" ); + IOUtils.AddFunctionLine( ref m_functionBody, "color = lerp(color, gradient.colors[c].rgb, lerp(colorPos, step(0.01, colorPos), gradient.type));" ); + IOUtils.AddFunctionLine( ref m_functionBody, "}" ); + + IOUtils.AddFunctionLine( ref m_functionBody, "#ifndef UNITY_COLORSPACE_GAMMA" ); + if( isSrp ) + IOUtils.AddFunctionLine( ref m_functionBody, "color = SRGBToLinear(color);" ); + else + IOUtils.AddFunctionLine( ref m_functionBody, "color = half3(GammaToLinearSpaceExact(color.r), GammaToLinearSpaceExact(color.g), GammaToLinearSpaceExact(color.b));" ); + IOUtils.AddFunctionLine( ref m_functionBody, "#endif" ); + + IOUtils.AddFunctionLine( ref m_functionBody, "float alpha = gradient.alphas[0].x;" ); + IOUtils.AddFunctionLine( ref m_functionBody, "UNITY_UNROLL" ); + IOUtils.AddFunctionLine( ref m_functionBody, "for (int a = 1; a < 8; a++)" ); + IOUtils.AddFunctionLine( ref m_functionBody, "{" ); + if( isSrp ) + IOUtils.AddFunctionLine( ref m_functionBody, "float alphaPos = saturate((time - gradient.alphas[a-1].y) / ( 0.00001 + (gradient.alphas[a].y - gradient.alphas[a-1].y)) * step(a, gradient.alphasLength-1));" ); + else + IOUtils.AddFunctionLine( ref m_functionBody, "float alphaPos = saturate((time - gradient.alphas[a-1].y) / ( 0.00001 + (gradient.alphas[a].y - gradient.alphas[a-1].y)) * step(a, (float)gradient.alphasLength-1));" ); + IOUtils.AddFunctionLine( ref m_functionBody, "alpha = lerp(alpha, gradient.alphas[a].x, lerp(alphaPos, step(0.01, alphaPos), gradient.type));" ); + IOUtils.AddFunctionLine( ref m_functionBody, "}" ); + IOUtils.AddFunctionLine( ref m_functionBody, "return float4(color, alpha);" ); + IOUtils.CloseFunctionBody( ref m_functionBody ); + } + + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/GradientSampleNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/GradientSampleNode.cs.meta new file mode 100644 index 0000000..51d0b9e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/GradientSampleNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b90e416e2fa93a249952fabc78f659c8 +timeCreated: 1562847602 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/InverseOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/InverseOpNode.cs new file mode 100644 index 0000000..178fc54 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/InverseOpNode.cs @@ -0,0 +1,138 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +// 4x4 Invert by DBN in +// http://answers.unity3d.com/questions/218333/shader-inversefloat4x4-function.html?childToView=641391#answer-641391 + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Inverse", "Matrix Operators", "Inverse matrix of a matrix" )] + public sealed class InverseOpNode : SingleInputOp + { + private string Inverse4x4Header = "Inverse4x4( {0} )"; + + //4x4 + private string[] Inverse4x4Function = + { + "{0}4x4 Inverse4x4({0}4x4 input)\n", + "{\n", + "\t#define minor(a,b,c) determinant({0}3x3(input.a, input.b, input.c))\n", + "\t{0}4x4 cofactors = {0}4x4(\n", + "\tminor( _22_23_24, _32_33_34, _42_43_44 ),\n", + "\t-minor( _21_23_24, _31_33_34, _41_43_44 ),\n", + "\tminor( _21_22_24, _31_32_34, _41_42_44 ),\n", + "\t-minor( _21_22_23, _31_32_33, _41_42_43 ),\n", + "\n", + "\t-minor( _12_13_14, _32_33_34, _42_43_44 ),\n", + "\tminor( _11_13_14, _31_33_34, _41_43_44 ),\n", + "\t-minor( _11_12_14, _31_32_34, _41_42_44 ),\n", + "\tminor( _11_12_13, _31_32_33, _41_42_43 ),\n", + "\n", + "\tminor( _12_13_14, _22_23_24, _42_43_44 ),\n", + "\t-minor( _11_13_14, _21_23_24, _41_43_44 ),\n", + "\tminor( _11_12_14, _21_22_24, _41_42_44 ),\n", + "\t-minor( _11_12_13, _21_22_23, _41_42_43 ),\n", + "\n", + "\t-minor( _12_13_14, _22_23_24, _32_33_34 ),\n", + "\tminor( _11_13_14, _21_23_24, _31_33_34 ),\n", + "\t-minor( _11_12_14, _21_22_24, _31_32_34 ),\n", + "\tminor( _11_12_13, _21_22_23, _31_32_33 ));\n", + "\t#undef minor\n", + "\treturn transpose( cofactors ) / determinant( input );\n", + "}\n" + }; + + private bool[] Inverse4x4FunctionFlags = + { + true, + false, + true, + true, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + }; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "inverse"; + m_drawPreview = false; + + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.FLOAT3x3, + WirePortDataType.FLOAT4x4 ); + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT4x4, false ); + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT4x4, false ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string precisionString = UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, WirePortDataType.FLOAT ); + string value = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + + if ( m_outputPorts[ 0 ].DataType == WirePortDataType.FLOAT3x3 ) + { + GeneratorUtils.Add3x3InverseFunction( ref dataCollector, precisionString ); + RegisterLocalVariable( 0, string.Format( GeneratorUtils.Inverse3x3Header, value ), ref dataCollector, "invertVal" + OutputId ); + } + else + { + if ( !dataCollector.HasFunction( Inverse4x4Header ) ) + { + //Hack to be used util indent is properly used + int currIndent = UIUtils.ShaderIndentLevel; + + if ( dataCollector.IsTemplate ) + { + UIUtils.ShaderIndentLevel = 0; + } + else + { + UIUtils.ShaderIndentLevel = 1; + UIUtils.ShaderIndentLevel++; + } + + string finalFunction = string.Empty; + for ( int i = 0; i < Inverse4x4Function.Length; i++ ) + { + finalFunction += UIUtils.ShaderIndentTabs + ( Inverse4x4FunctionFlags[ i ] ? string.Format( Inverse4x4Function[ i ], precisionString ) : Inverse4x4Function[ i ] ); + } + + + UIUtils.ShaderIndentLevel = currIndent; + + dataCollector.AddFunction( Inverse4x4Header, finalFunction ); + } + + RegisterLocalVariable( 0, string.Format( Inverse4x4Header, value ), ref dataCollector, "invertVal" + OutputId ); + } + + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/InverseOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/InverseOpNode.cs.meta new file mode 100644 index 0000000..bc47ad0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/InverseOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 785830160e033d24280df9c5b4cec368 +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/LengthOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/LengthOpNode.cs new file mode 100644 index 0000000..c67f26b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/LengthOpNode.cs @@ -0,0 +1,41 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Length", "Vector Operators", "Scalar Euclidean length of a vector" )] + public sealed class LengthOpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "length"; + m_previewShaderGUID = "1c1f6d6512b758942a8b9dd1bea12f34"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT , + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR , + WirePortDataType.INT); + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT4, false ); + m_autoUpdateOutputPort = false; + } + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + switch( m_inputPorts[0].DataType ) + { + case WirePortDataType.OBJECT: + case WirePortDataType.INT: + case WirePortDataType.FLOAT: + case WirePortDataType.UINT:m_previewMaterialPassId = 0;break; + case WirePortDataType.FLOAT2:m_previewMaterialPassId = 1;break; + case WirePortDataType.FLOAT3:m_previewMaterialPassId = 2;break; + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR:m_previewMaterialPassId = 3;break; + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/LengthOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/LengthOpNode.cs.meta new file mode 100644 index 0000000..c13dd4f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/LengthOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: bb3fd570e41cfa24d93b53e80eac02d5 +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/LerpOp.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/LerpOp.cs new file mode 100644 index 0000000..1ec7199 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/LerpOp.cs @@ -0,0 +1,116 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Lerp", "Math Operators", "Linear interpolation of two scalars or vectors based on a weight", null, KeyCode.L )] + public sealed class LerpOp : ParentNode + { + private const string LertOpFormat = "lerp( {0} , {1} , {2})"; + + [UnityEngine.SerializeField] + private WirePortDataType m_mainDataType = WirePortDataType.FLOAT; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_textLabelWidth = 55; + AddInputPort( WirePortDataType.FLOAT, false, "A" ); + AddInputPort( WirePortDataType.FLOAT, false, "B" ); + AddInputPort( WirePortDataType.FLOAT, false, "Alpha" ); + AddOutputPort( WirePortDataType.FLOAT,Constants.EmptyPortValue); + m_useInternalPortData = true; + m_previewShaderGUID = "34d9c4cdcf1fadb49af2de3f90bbc57d"; + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + UpdateConnection( portId ); + } + + public override void OnConnectedOutputNodeChanges( int inputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( inputPortId, otherNodeId, otherPortId, name, type ); + UpdateConnection( inputPortId ); + } + + public override void OnInputPortDisconnected( int portId ) + { + base.OnInputPortDisconnected( portId ); + UpdateConnection( portId ); + } + + void UpdateConnection( int portId ) + { + WirePortDataType type1 = WirePortDataType.FLOAT; + if( m_inputPorts[ 0 ].IsConnected ) + type1 = m_inputPorts[ 0 ].GetOutputConnection( 0 ).DataType; + + WirePortDataType type2 = WirePortDataType.FLOAT; + if( m_inputPorts[ 1 ].IsConnected ) + type2 = m_inputPorts[ 1 ].GetOutputConnection( 0 ).DataType; + + WirePortDataType typealpha = WirePortDataType.FLOAT; + if( m_inputPorts[ 2 ].IsConnected ) + typealpha = m_inputPorts[ 2 ].GetOutputConnection( 0 ).DataType; + + m_mainDataType = UIUtils.GetPriority( type1 ) > UIUtils.GetPriority( type2 ) ? type1 : type2; + + if( !m_inputPorts[ 0 ].IsConnected && !m_inputPorts[ 1 ].IsConnected && m_inputPorts[ 2 ].IsConnected ) + m_mainDataType = m_inputPorts[ 2 ].GetOutputConnection( 0 ).DataType; + + m_inputPorts[ 0 ].ChangeType( m_mainDataType, false ); + + m_inputPorts[ 1 ].ChangeType( m_mainDataType, false ); + if( m_inputPorts[ 2 ].IsConnected && ( typealpha == WirePortDataType.FLOAT || typealpha == WirePortDataType.INT ) ) + m_inputPorts[ 2 ].ChangeType( WirePortDataType.FLOAT, false ); + else + m_inputPorts[ 2 ].ChangeType( m_mainDataType, false ); + + m_outputPorts[ 0 ].ChangeType( m_mainDataType, false ); + } + + //void UpdateDisconnection( int portId ) + //{ + // int otherPortId = ( portId + 1 ) % 2; + // if ( m_inputPorts[ otherPortId ].IsConnected ) + // { + // m_mainDataType = m_inputPorts[ otherPortId ].DataType; + // m_inputPorts[ portId ].ChangeType( m_mainDataType, false ); + // m_outputPorts[ 0 ].ChangeType( m_mainDataType, false ); + // } + //} + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string aValue = m_inputPorts[ 0 ].GenerateShaderForOutput( ref dataCollector, m_mainDataType, ignoreLocalVar, true ); + string bValue = m_inputPorts[ 1 ].GenerateShaderForOutput( ref dataCollector, m_mainDataType, ignoreLocalVar, true ); + string interp = string.Empty; + if( m_inputPorts[ 2 ].DataType == WirePortDataType.FLOAT ) + interp = m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector ); + else + interp = m_inputPorts[ 2 ].GenerateShaderForOutput( ref dataCollector, m_mainDataType, ignoreLocalVar,true ); + string result = string.Format( LertOpFormat, aValue,bValue,interp); + + RegisterLocalVariable( 0, result, ref dataCollector, "lerpResult"+OutputId ); + + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + + //public override void RefreshExternalReferences() + //{ + // if ( m_inputPorts[ 2 ].DataType != WirePortDataType.FLOAT ) + // { + // m_inputPorts[ 2 ].ChangeType( WirePortDataType.FLOAT, false ); + // } + //} + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/LerpOp.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/LerpOp.cs.meta new file mode 100644 index 0000000..22b8eec --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/LerpOp.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1e38abf6e3c7dfa409a5fe40d2ce8a19 +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/Log10OpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/Log10OpNode.cs new file mode 100644 index 0000000..35914c3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/Log10OpNode.cs @@ -0,0 +1,26 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Log10", "Math Operators", "Base-10 logarithm of scalars and vectors" )] + public sealed class Log10OpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "log10"; + m_previewShaderGUID = "9e7cfa357dd261f499d0ba8637ff2614"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT , + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR , + WirePortDataType.INT); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/Log10OpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/Log10OpNode.cs.meta new file mode 100644 index 0000000..e9ae3c3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/Log10OpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: be47a76f1f42fbe47bf2568584c31196 +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/Log2OpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/Log2OpNode.cs new file mode 100644 index 0000000..614a82a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/Log2OpNode.cs @@ -0,0 +1,26 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Log2", "Math Operators", "Base-2 logarithm of scalars and vectors" )] + public sealed class Log2OpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "log2"; + m_previewShaderGUID = "5975a154432d4c64cacd78d015ed08ba"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT , + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR , + WirePortDataType.INT); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/Log2OpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/Log2OpNode.cs.meta new file mode 100644 index 0000000..9511991 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/Log2OpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b9489308aad1f794982afc1faf646013 +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/LogOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/LogOpNode.cs new file mode 100644 index 0000000..ff7d786 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/LogOpNode.cs @@ -0,0 +1,26 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Log", "Math Operators", "Natural logarithm of scalars and vectors" )] + public sealed class LogOpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "log"; + m_previewShaderGUID = "a3293e0a73834b24682775f5d8ee1e7c"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT, + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR, + WirePortDataType.INT ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/LogOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/LogOpNode.cs.meta new file mode 100644 index 0000000..7aab4f7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/LogOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1ed2c12cea61a8c4fa67eebdc10d2a2a +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/MultipleInputOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/MultipleInputOpNode.cs new file mode 100644 index 0000000..9cb64e9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/MultipleInputOpNode.cs @@ -0,0 +1,3 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +// Deprecated file diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/MultipleInputOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/MultipleInputOpNode.cs.meta new file mode 100644 index 0000000..597824c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/MultipleInputOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8804c7e5888738547b5a704f788fc18b +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/NegateNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/NegateNode.cs new file mode 100644 index 0000000..00c174d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/NegateNode.cs @@ -0,0 +1,46 @@ +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Negate", "Math Operators", "Negate or invert an input value" )] + public sealed class NegateNode : ParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, Constants.EmptyPortValue ); + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + m_useInternalPortData = true; + m_previewShaderGUID = "b035bc40da1ac7c4eafad4116382ec79"; + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + m_inputPorts[ 0 ].MatchPortToConnection(); + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + } + + public override void OnConnectedOutputNodeChanges( int outputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( outputPortId, otherNodeId, otherPortId, name, type ); + m_inputPorts[ 0 ].MatchPortToConnection(); + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + string result = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + + if ( result.StartsWith( "-" ) ) + { + return result.Remove( 0, 1 ); + } + else + { + return "-" + result; + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/NegateNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/NegateNode.cs.meta new file mode 100644 index 0000000..83f5922 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/NegateNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 01c91005470f6b94eba168a127cecd6c +timeCreated: 1481126953 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/NormalizeNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/NormalizeNode.cs new file mode 100644 index 0000000..7faddb4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/NormalizeNode.cs @@ -0,0 +1,87 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Normalize", "Vector Operators", "Normalizes a vector", null, KeyCode.N )] + public sealed class NormalizeNode : SingleInputOp + { + [SerializeField] + private bool m_safeNormalize = false; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_selectedLocation = PreviewLocation.TopCenter; + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT4, false ); + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.FLOAT, WirePortDataType.FLOAT2, WirePortDataType.FLOAT3, WirePortDataType.FLOAT4, WirePortDataType.COLOR, WirePortDataType.OBJECT, WirePortDataType.INT ); + + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT4 , false ); + + m_previewShaderGUID = "a51b11dfb6b32884e930595e5f9defa8"; + m_autoWrapProperties = true; + } + + public override void DrawProperties() + { + base.DrawProperties(); + m_safeNormalize = EditorGUILayoutToggle( "Safe Normalize" , m_safeNormalize ); + EditorGUILayout.HelpBox( Constants.SafeNormalizeInfoStr , MessageType.Info ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string result = string.Empty; + switch ( m_inputPorts[ 0 ].DataType ) + { + case WirePortDataType.FLOAT: + case WirePortDataType.FLOAT2: + case WirePortDataType.FLOAT3: + case WirePortDataType.FLOAT4: + case WirePortDataType.OBJECT: + case WirePortDataType.COLOR: + { + string value = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + result = GeneratorUtils.NormalizeValue( ref dataCollector , m_safeNormalize , m_inputPorts[ 0 ].DataType, value ); + } + break; + case WirePortDataType.INT: + { + return m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + } + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + { + result = UIUtils.InvalidParameter( this ); + } + break; + } + RegisterLocalVariable( 0, result, ref dataCollector, "normalizeResult" + OutputId ); + + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > 18814 ) + { + m_safeNormalize = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + } + + public override void WriteToString( ref string nodeInfo , ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo , ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo , m_safeNormalize ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/NormalizeNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/NormalizeNode.cs.meta new file mode 100644 index 0000000..8bec377 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/NormalizeNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: fa6682c371754094f88b3c2a7e96ae26 +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/OneMinusNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/OneMinusNode.cs new file mode 100644 index 0000000..1079211 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/OneMinusNode.cs @@ -0,0 +1,45 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "One Minus", "Math Operators", "1 - input value", null, KeyCode.O )] + public sealed class OneMinusNode : ParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, Constants.EmptyPortValue ); + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + m_useInternalPortData = true; + m_previewShaderGUID = "bed5300b92e7bb0419d0f4accb853312"; + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + m_inputPorts[ 0 ].MatchPortToConnection(); + m_outputPorts[ 0 ].ChangeType( InputPorts[ 0 ].DataType, false ); + } + + public override void OnConnectedOutputNodeChanges( int outputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( outputPortId, otherNodeId, otherPortId, name, type ); + m_inputPorts[ 0 ].MatchPortToConnection(); + m_outputPorts[ 0 ].ChangeType( InputPorts[ 0 ].DataType, false ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string result = "( 1.0 - " + m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ) + " )"; + return CreateOutputLocalVariable( 0, result, ref dataCollector ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/OneMinusNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/OneMinusNode.cs.meta new file mode 100644 index 0000000..ff94c53 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/OneMinusNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 727743b66e17d7b4f9c2fbe7dde98bd9 +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/PowerNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/PowerNode.cs new file mode 100644 index 0000000..82357b6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/PowerNode.cs @@ -0,0 +1,93 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Power", "Math Operators", "Base to the Exp-th power of scalars and vectors", null, KeyCode.E )] + public sealed class PowerNode : ParentNode + { + public const string SafePowerStr = "max( {0} , 0.0001 )"; + public const string SafePowerLabel = "Safe Power"; + + [SerializeField] + private bool m_safePower = false; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, "Base" ); + AddInputPort( WirePortDataType.FLOAT, false, "Exp" ); + m_inputPorts[ 1 ].FloatInternalData = 1; + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + m_useInternalPortData = true; + m_autoWrapProperties = true; + m_textLabelWidth = 85; + m_previewShaderGUID = "758cc2f8b537b4e4b93d9833075d138c"; + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + UpdateConnections( portId ); + } + + public override void OnConnectedOutputNodeChanges( int inputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( inputPortId, otherNodeId, otherPortId, name, type ); + UpdateConnections( inputPortId ); + } + + void UpdateConnections( int inputPort ) + { + m_inputPorts[ inputPort ].MatchPortToConnection(); + if ( inputPort == 0 ) + { + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + } + } + + public override void DrawProperties() + { + base.DrawProperties(); + m_safePower = EditorGUILayoutToggle( SafePowerLabel, m_safePower ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string x = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + if( m_safePower ) + { + string safePowerName = "saferPower" + OutputId; + string safePowerValue = string.Format( SafePowerStr, x ); + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, m_inputPorts[ 0 ].DataType, safePowerName, safePowerValue ); + x = safePowerName; + } + + string y = m_inputPorts[ 1 ].GenerateShaderForOutput( ref dataCollector, m_inputPorts[ 0 ].DataType, ignoreLocalvar, true ); + string result = "pow( " + x + " , " + y + " )"; + + return CreateOutputLocalVariable( 0, result, ref dataCollector ); + } + + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > 17502 ) + m_safePower = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_safePower ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/PowerNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/PowerNode.cs.meta new file mode 100644 index 0000000..bedc464 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/PowerNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 520a55839e863ce47b3558be612f4691 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/RSqrtOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/RSqrtOpNode.cs new file mode 100644 index 0000000..659c86c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/RSqrtOpNode.cs @@ -0,0 +1,26 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Rsqrt", "Math Operators", "Reciprocal square root of scalars and vectors" )] + public sealed class RSqrtOpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "rsqrt"; + m_previewShaderGUID = "c58c17cb1f7f6e6429a2c7a6cdaef87d"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT , + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR , + WirePortDataType.INT); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/RSqrtOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/RSqrtOpNode.cs.meta new file mode 100644 index 0000000..e124e47 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/RSqrtOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 513de50bd4766d0448bb471ca272608f +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/RadiansOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/RadiansOpNode.cs new file mode 100644 index 0000000..19f478f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/RadiansOpNode.cs @@ -0,0 +1,26 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Radians", "Trigonometry Operators", "Converts values of scalars and vectors from degrees to radians" )] + public sealed class RadiansOpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "radians"; + m_previewShaderGUID = "d27d189eaf6eeb04fae9913d9617ece5"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT, + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR, + WirePortDataType.INT ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/RadiansOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/RadiansOpNode.cs.meta new file mode 100644 index 0000000..f90ec87 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/RadiansOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b6ca01d5c16f73c42996318c140eddb7 +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ReflectOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ReflectOpNode.cs new file mode 100644 index 0000000..1488cb1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ReflectOpNode.cs @@ -0,0 +1,33 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Reflect", "Vector Operators", "Reflection vector given an incidence vector and a normal vector" )] + public sealed class ReflectOpNode : DynamicTypeNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_inputPorts[ 0 ].ChangeProperties( "Incident", WirePortDataType.FLOAT4, false ); + m_inputPorts[ 1 ].ChangeProperties( "Normal", WirePortDataType.FLOAT4, false ); + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT4, false ); + + m_textLabelWidth = 67; + m_previewShaderGUID = "fb520f2145c0fa0409320a9e6d720758"; + } + + public override string BuildResults( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + base.BuildResults( outputId, ref dataCollector, ignoreLocalvar ); + string result = "reflect( " + m_inputA + " , " + m_inputB + " )"; + return CreateOutputLocalVariable( 0, result, ref dataCollector ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ReflectOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ReflectOpNode.cs.meta new file mode 100644 index 0000000..2b7f085 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ReflectOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: bcd77715f8db1564abc96d502312d476 +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/RefractOpVec.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/RefractOpVec.cs new file mode 100644 index 0000000..ba59e2c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/RefractOpVec.cs @@ -0,0 +1,92 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Refract", "Vector Operators", "Computes a refraction vector" )] + public sealed class RefractOpVec : ParentNode + { + [UnityEngine.SerializeField] + private WirePortDataType m_mainDataType = WirePortDataType.FLOAT; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT4, false , "Incident" ); + AddInputPort( WirePortDataType.FLOAT4, false , "Normal" ); + AddInputPort( WirePortDataType.FLOAT, false, "Eta" ); + AddOutputPort( WirePortDataType.FLOAT4, Constants.EmptyPortValue ); + m_textLabelWidth = 67; + m_previewShaderGUID = "5ab44ca484bed8b4884b03b1c00fdc3d"; + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + UpdateConnection( portId ); + } + + public override void OnConnectedOutputNodeChanges( int inputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( inputPortId, otherNodeId, otherPortId, name, type ); + UpdateConnection( inputPortId ); + } + + public override void OnInputPortDisconnected( int portId ) + { + base.OnInputPortDisconnected( portId ); + UpdateConnection( portId ); + } + + void UpdateConnection( int portId ) + { + if( portId == 2 ) + return; + + bool hasConnection = false; + + WirePortDataType type1 = WirePortDataType.FLOAT; + if( m_inputPorts[ 0 ].IsConnected ) + { + type1 = m_inputPorts[ 0 ].GetOutputConnection( 0 ).DataType; + hasConnection = true; + } + WirePortDataType type2 = WirePortDataType.FLOAT; + if( m_inputPorts[ 1 ].IsConnected ) + { + type2 = m_inputPorts[ 1 ].GetOutputConnection( 0 ).DataType; + hasConnection = true; + } + + if( hasConnection ) + { + m_mainDataType = UIUtils.GetPriority( type1 ) > UIUtils.GetPriority( type2 ) ? type1 : type2; + } + else + { + m_mainDataType = WirePortDataType.FLOAT4; + } + + m_inputPorts[ 0 ].ChangeType( m_mainDataType, false ); + m_inputPorts[ 1 ].ChangeType( m_mainDataType, false ); + m_outputPorts[ 0 ].ChangeType( m_mainDataType, false ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string incident = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string normal = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + string interp = m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector ); + string result = "refract( " + incident + " , " + normal + " , " + interp + " )"; + + return CreateOutputLocalVariable( 0, result, ref dataCollector ); + } + + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/RefractOpVec.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/RefractOpVec.cs.meta new file mode 100644 index 0000000..58b705a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/RefractOpVec.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c5bb608b83cdc894cab572c72baa5f84 +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/RoundOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/RoundOpNode.cs new file mode 100644 index 0000000..95b1dd8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/RoundOpNode.cs @@ -0,0 +1,26 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Round", "Math Operators", "Rounded value of scalars or vectors" )] + public sealed class RoundOpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "round"; + m_previewShaderGUID = "554d561417b207c4bb3cd4a0c86b6907"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT , + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR , + WirePortDataType.INT); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/RoundOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/RoundOpNode.cs.meta new file mode 100644 index 0000000..9b3740d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/RoundOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f7b5f29bc7f6bb844ae4ea698404adc3 +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SaturateNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SaturateNode.cs new file mode 100644 index 0000000..ed91f4d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SaturateNode.cs @@ -0,0 +1,26 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Saturate", "Math Operators", "Saturate clamps the input values into the [0,1] range" )] + public sealed class SaturateNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "saturate"; + m_previewShaderGUID = "d9e53418dc8b9d34fb395e3ea3c75985"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT , + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR , + WirePortDataType.INT); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SaturateNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SaturateNode.cs.meta new file mode 100644 index 0000000..e199e9c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SaturateNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9d56f68d94c889443af651140ef86948 +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ScaleAndOffsetNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ScaleAndOffsetNode.cs new file mode 100644 index 0000000..0d79fe8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ScaleAndOffsetNode.cs @@ -0,0 +1,78 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Scale And Offset", "Math Operators", "Scales and offsets an input value\n( ( Value * Scale ) + Offset )" )] + public sealed class ScaleAndOffsetNode : ParentNode + { + private const string ScaleOffsetOpStr = "({0}*{1} + {2})"; + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, Constants.EmptyPortValue ); + AddInputPort( WirePortDataType.FLOAT, false, "Scale" ); + m_inputPorts[ 1 ].FloatInternalData = 1; + AddInputPort( WirePortDataType.FLOAT, false, "Offset" ); + AddOutputPort( WirePortDataType.FLOAT, " " ); + m_useInternalPortData = true; + m_previewShaderGUID = "a1f1053d4d9c3be439e0382038b74771"; + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + UpdateConnection( portId ); + } + + public override void OnConnectedOutputNodeChanges( int inputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( inputPortId, otherNodeId, otherPortId, name, type ); + UpdateConnection( inputPortId ); + } + + public override void OnInputPortDisconnected( int portId ) + { + base.OnInputPortDisconnected( portId ); + m_inputPorts[ portId ].ChangeType( WirePortDataType.FLOAT, false ); + if( portId == 0 ) + { + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT, false ); + } + } + + void UpdateConnection( int portId ) + { + if( portId == 0 ) + { + m_inputPorts[ 0 ].MatchPortToConnection(); + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + } + else + { + WirePortDataType newDataType = m_inputPorts[ portId ].ConnectionType() == WirePortDataType.FLOAT ? WirePortDataType.FLOAT : m_outputPorts[ 0 ].DataType; + m_inputPorts[ portId ].ChangeType( newDataType, false ); + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string value = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + + // If scale or offset ports are floats then there's no need to cast them to any other type since they can be multiplied with everything + WirePortDataType scaleType = ( m_inputPorts[ 1 ].ConnectionType() == WirePortDataType.FLOAT ) ? WirePortDataType.FLOAT : m_outputPorts[ 0 ].DataType; + string scale = m_inputPorts[ 1 ].GenerateShaderForOutput( ref dataCollector, scaleType, ignoreLocalvar , true ); + + WirePortDataType offsetType = ( m_inputPorts[ 2 ].ConnectionType() == WirePortDataType.FLOAT ) ? WirePortDataType.FLOAT : m_outputPorts[ 0 ].DataType; + string offset = m_inputPorts[ 2 ].GenerateShaderForOutput( ref dataCollector, offsetType, ignoreLocalvar, true ); + + string result = string.Format( ScaleOffsetOpStr, value, scale, offset ); + return CreateOutputLocalVariable( 0, result, ref dataCollector ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ScaleAndOffsetNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ScaleAndOffsetNode.cs.meta new file mode 100644 index 0000000..4a508a8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ScaleAndOffsetNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b594feaa69ad03449b563f834fe0c18e +timeCreated: 1484582091 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ScaleNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ScaleNode.cs new file mode 100644 index 0000000..7445a10 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ScaleNode.cs @@ -0,0 +1,152 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Scale", "Math Operators", "Scales input value by a float factor" )] + public sealed class ScaleNode : ParentNode + { + private const string ScaleFactorStr = "Scale"; + + [SerializeField] + private float m_scaleFactor = 1; + + private int m_cachedPropertyId = -1; + + private const float LabelWidth = 8; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, " " ); + AddOutputPort( WirePortDataType.FLOAT, " " ); + m_insideSize.Set( 50, 10 ); + m_autoWrapProperties = true; + m_previewShaderGUID = "6d8ec9d9dab62c44aa2dcc0e3987760d"; + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + if ( m_cachedPropertyId == -1 ) + m_cachedPropertyId = Shader.PropertyToID( "_ScaleFloat" ); + + PreviewMaterial.SetFloat( m_cachedPropertyId, m_scaleFactor ); + } + + public override void DrawProperties() + { + base.DrawProperties(); + m_scaleFactor = EditorGUILayoutFloatField( ScaleFactorStr, m_scaleFactor ); + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + m_inputPorts[ 0 ].MatchPortToConnection(); + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + } + + public override void OnConnectedOutputNodeChanges( int outputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( outputPortId, otherNodeId, otherPortId, name, type ); + m_inputPorts[ 0 ].MatchPortToConnection(); + m_outputPorts[ 0 ].ChangeType( InputPorts[ 0 ].DataType, false ); + } + + public override void OnNodeLayout( DrawInfo drawInfo ) + { + base.OnNodeLayout( drawInfo ); + + m_propertyDrawPos.x = m_remainingBox.x + Constants.FLOAT_WIDTH_SPACING * drawInfo.InvertedZoom * 0.5f; + m_propertyDrawPos.y = m_remainingBox.y + Constants.INPUT_PORT_DELTA_Y * drawInfo.InvertedZoom * 0.5f; + m_propertyDrawPos.width = drawInfo.InvertedZoom * Constants.FLOAT_DRAW_WIDTH_FIELD_SIZE; + m_propertyDrawPos.height = drawInfo.InvertedZoom * Constants.FLOAT_DRAW_HEIGHT_FIELD_SIZE; + } + + public override void DrawGUIControls( DrawInfo drawInfo ) + { + base.DrawGUIControls( drawInfo ); + + if ( drawInfo.CurrentEventType != EventType.MouseDown ) + return; + + Rect hitBox = m_remainingBox; + hitBox.xMin -= LabelWidth * drawInfo.InvertedZoom; + bool insideBox = hitBox.Contains( drawInfo.MousePosition ); + + if ( insideBox ) + { + GUI.FocusControl( null ); + m_isEditingFields = true; + } + else if ( m_isEditingFields && !insideBox ) + { + GUI.FocusControl( null ); + m_isEditingFields = false; + } + } + + private bool m_isEditingFields; + private float m_previousValue; + private string m_fieldText = "0"; + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + if ( !m_isVisible ) + return; + + if ( m_isEditingFields ) + { + UIUtils.DrawFloat( this, ref m_propertyDrawPos, ref m_scaleFactor, LabelWidth ); + } + else if ( drawInfo.CurrentEventType == EventType.Repaint ) + { + Rect fakeField = m_propertyDrawPos; + fakeField.xMin += LabelWidth * drawInfo.InvertedZoom; + Rect fakeLabel = m_propertyDrawPos; + fakeLabel.xMax = fakeField.xMin; + EditorGUIUtility.AddCursorRect( fakeLabel, MouseCursor.SlideArrow ); + EditorGUIUtility.AddCursorRect( fakeField, MouseCursor.Text ); + + if ( m_previousValue != m_scaleFactor ) + { + m_previousValue = m_scaleFactor; + m_fieldText = m_scaleFactor.ToString(); + } + + GUI.Label( fakeField, m_fieldText, UIUtils.MainSkin.textField ); + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string portResult = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string result = "( " + portResult + " * " + m_scaleFactor + " )"; + return CreateOutputLocalVariable( 0, result, ref dataCollector ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_scaleFactor ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_scaleFactor = Convert.ToSingle( GetCurrentParam( ref nodeParams ) ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ScaleNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ScaleNode.cs.meta new file mode 100644 index 0000000..49bd4b8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/ScaleNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ec926b11f9c698c458f746e4e55fd7df +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SignOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SignOpNode.cs new file mode 100644 index 0000000..90f83dc --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SignOpNode.cs @@ -0,0 +1,26 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Sign", "Math Operators", "Sign of scalar or each vector component" )] + public sealed class SignOpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "sign"; + m_previewShaderGUID = "3aca80b49aadf5046b7133730818e18f"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT , + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR , + WirePortDataType.INT); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SignOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SignOpNode.cs.meta new file mode 100644 index 0000000..1a1d0ff --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SignOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 429f407c2b590df45b215f0edfa49b97 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SimplifiedFModOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SimplifiedFModOpNode.cs new file mode 100644 index 0000000..4726b84 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SimplifiedFModOpNode.cs @@ -0,0 +1,32 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Simplified Fmod", "Math Operators", "Floating point remainder of x/y" )] + public sealed class SimplifiedFModOpNode : DynamicTypeNode + { + private const string FmodCustomOp = "frac({0}/{1})*{1}"; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_previewShaderGUID = "2688236fb4f37ce47b81cc818c53321d"; + } + + public override string BuildResults( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + { + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + + base.BuildResults( outputId, ref dataCollector, ignoreLocalvar ); + RegisterLocalVariable( 0, string.Format( FmodCustomOp, m_inputA, m_inputB ), ref dataCollector, ( "fmodResult" + OutputId ) ); + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SimplifiedFModOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SimplifiedFModOpNode.cs.meta new file mode 100644 index 0000000..77efda8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SimplifiedFModOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f186e1b03a8ee2b4b9e45918576e8cf6 +timeCreated: 1484731588 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SinOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SinOpNode.cs new file mode 100644 index 0000000..6d0d363 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SinOpNode.cs @@ -0,0 +1,26 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Sin", "Trigonometry Operators", "Sine of scalars and vectors" )] + public sealed class SinOpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "sin"; + m_previewShaderGUID = "bcd9f8749ddd3ac4f94f4c2071c1d0d4"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT, + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR, + WirePortDataType.INT ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SinOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SinOpNode.cs.meta new file mode 100644 index 0000000..24e23e6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SinOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: be2a11b08ee8cbb458dbcc4c1a61ad1b +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SingleInputOp.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SingleInputOp.cs new file mode 100644 index 0000000..4af0cba --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SingleInputOp.cs @@ -0,0 +1,67 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using System; + + +namespace AmplifyShaderEditor +{ + [Serializable] + public class SingleInputOp : ParentNode + { + + [SerializeField] + protected string m_opName; + //[SerializeField] + //protected int m_validTypes; + + protected bool m_autoUpdateOutputPort = true; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, Constants.EmptyPortValue ); + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + //m_validTypes = 0; + m_useInternalPortData = true; + + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + m_inputPorts[ 0 ].MatchPortToConnection(); + if ( m_autoUpdateOutputPort ) + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + } + + public override void OnConnectedOutputNodeChanges( int outputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( outputPortId, otherNodeId, otherPortId, name, type ); + m_inputPorts[ 0 ].MatchPortToConnection(); + if ( m_autoUpdateOutputPort ) + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string result = "0"; + if ( m_inputPorts[ 0 ].IsConnected ) + { + ParentNode node = m_inputPorts[ 0 ].GetOutputNode(); + int localOutputId = m_inputPorts[ 0 ].ExternalReferences[ 0 ].PortId; + result = m_opName + "( " + node.GenerateShaderForOutput( localOutputId, ref dataCollector, ignoreLocalvar ) + " )"; + } + else + { + result = m_opName + "( " + m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ) + " )"; + } + + return CreateOutputLocalVariable( 0, result, ref dataCollector ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SingleInputOp.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SingleInputOp.cs.meta new file mode 100644 index 0000000..751db40 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SingleInputOp.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ed03e964ff9aa274cbf392769b61170b +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SinhOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SinhOpNode.cs new file mode 100644 index 0000000..f38a192 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SinhOpNode.cs @@ -0,0 +1,26 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Sinh", "Trigonometry Operators", "Hyperbolic sine of scalars and vectors" )] + public sealed class SinhOpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "sinh"; + m_previewShaderGUID = "4e9c00e6dceb4024f80d4e3d7786abad"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT, + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR, + WirePortDataType.INT ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SinhOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SinhOpNode.cs.meta new file mode 100644 index 0000000..292ae67 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SinhOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 52092e3985c556943895f86c585bcd25 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SmoothstepOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SmoothstepOpNode.cs new file mode 100644 index 0000000..09d86cb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SmoothstepOpNode.cs @@ -0,0 +1,122 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Smoothstep", "Math Operators", "Returns a smooth Hermite interpolation between 0 and 1, if input is in the range [min, max]." )] + public sealed class SmoothstepOpNode : ParentNode + { + //[UnityEngine.SerializeField] + //private WirePortDataType m_mainDataType = WirePortDataType.FLOAT; + + private int m_alphaPortId = 0; + private int m_minPortId = 0; + private int m_maxPortId = 0; + private const string SmoothstepOpFormat = "smoothstep( {0} , {1} , {2})";//min max alpha + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, Constants.EmptyPortValue, -1, MasterNodePortCategory.Fragment, 0 ); + m_alphaPortId = m_inputPorts.Count - 1; + AddInputPort( WirePortDataType.FLOAT, false, "Min", -1, MasterNodePortCategory.Fragment, 1 ); + m_minPortId = m_inputPorts.Count - 1; + AddInputPort( WirePortDataType.FLOAT, false, "Max", -1, MasterNodePortCategory.Fragment, 2 ); + m_maxPortId = m_inputPorts.Count - 1; + + GetInputPortByUniqueId( m_maxPortId ).FloatInternalData = 1; + + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + m_useInternalPortData = true; + m_textLabelWidth = 55; + m_previewShaderGUID = "954cdd40a7a528344a0a4d3ff1db5176"; + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + if( portId == 0 ) + { + m_inputPorts[ 0 ].MatchPortToConnection(); + m_inputPorts[ 1 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + m_inputPorts[ 2 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + } + } + + public override void OnConnectedOutputNodeChanges( int outputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( outputPortId, otherNodeId, otherPortId, name, type ); + if( outputPortId == 0 ) + { + m_inputPorts[ 0 ].MatchPortToConnection(); + m_inputPorts[ 1 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + m_inputPorts[ 2 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + } + } + + //public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + //{ + // base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + // UpdateConnection( portId ); + //} + + //public override void OnConnectedOutputNodeChanges( int inputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + //{ + // base.OnConnectedOutputNodeChanges( inputPortId, otherNodeId, otherPortId, name, type ); + // UpdateConnection( inputPortId ); + //} + + //public override void OnInputPortDisconnected( int portId ) + //{ + // base.OnInputPortDisconnected( portId ); + // UpdateConnection( portId ); + //} + + //void UpdateConnection( int portId ) + //{ + // WirePortDataType type1 = WirePortDataType.FLOAT; + // if( m_inputPorts[ m_minPortId ].IsConnected ) + // type1 = m_inputPorts[ m_minPortId ].GetOutputConnection( 0 ).DataType; + + // WirePortDataType type2 = WirePortDataType.FLOAT; + // if( m_inputPorts[ m_maxPortId ].IsConnected ) + // type2 = m_inputPorts[ m_maxPortId ].GetOutputConnection( 0 ).DataType; + + // m_mainDataType = UIUtils.GetPriority( type1 ) > UIUtils.GetPriority( type2 ) ? type1 : type2; + + // if( !m_inputPorts[ m_minPortId ].IsConnected && !m_inputPorts[ m_maxPortId ].IsConnected && m_inputPorts[ m_alphaPortId ].IsConnected ) + // m_mainDataType = m_inputPorts[ m_alphaPortId ].GetOutputConnection( 0 ).DataType; + + // m_inputPorts[ m_minPortId ].ChangeType( m_mainDataType, false ); + + // m_inputPorts[ m_maxPortId ].ChangeType( m_mainDataType, false ); + // if( m_inputPorts[ m_alphaPortId ].IsConnected && m_inputPorts[ m_alphaPortId ].GetOutputConnection( 0 ).DataType == WirePortDataType.FLOAT ) + // m_inputPorts[ m_alphaPortId ].ChangeType( WirePortDataType.FLOAT, false ); + // else + // m_inputPorts[ m_alphaPortId ].ChangeType( m_mainDataType, false ); + + // m_outputPorts[ 0 ].ChangeType( m_mainDataType, false ); + //} + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string aValue = m_inputPorts[ m_minPortId ].GeneratePortInstructions( ref dataCollector ); + string bValue = m_inputPorts[ m_maxPortId ].GeneratePortInstructions( ref dataCollector ); + string interp = m_inputPorts[ m_alphaPortId ].GeneratePortInstructions( ref dataCollector ); + + string result = string.Format( SmoothstepOpFormat, aValue, bValue, interp ); + + RegisterLocalVariable( 0, result, ref dataCollector, "smoothstepResult" + OutputId ); + + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SmoothstepOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SmoothstepOpNode.cs.meta new file mode 100644 index 0000000..98387eb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SmoothstepOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0f64eb769f843a349a0d249beacc6fc3 +timeCreated: 1481126953 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SqrtOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SqrtOpNode.cs new file mode 100644 index 0000000..e35c1b2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SqrtOpNode.cs @@ -0,0 +1,26 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Sqrt", "Math Operators", "Square root of scalars and vectors" )] + public sealed class SqrtOpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "sqrt"; + m_previewShaderGUID = "1791e2fbf36af084da7ecfc289e89b6e"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT, + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR, + WirePortDataType.INT ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SqrtOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SqrtOpNode.cs.meta new file mode 100644 index 0000000..164b7c5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/SqrtOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4820b591b73a7fe4ab13261deebf76f7 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/StepOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/StepOpNode.cs new file mode 100644 index 0000000..ab1a1b8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/StepOpNode.cs @@ -0,0 +1,24 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Step", "Math Operators", "Step function returning either zero or one" )] + public sealed class StepOpNode : DynamicTypeNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_previewShaderGUID = "2c757add7f97ecd4abd9ce6ec4659697"; + } + + public override string BuildResults( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.BuildResults( outputId, ref dataCollector, ignoreLocalvar ); + return "step( " + m_inputA + " , " + m_inputB + " )"; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/StepOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/StepOpNode.cs.meta new file mode 100644 index 0000000..5215554 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/StepOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c4305e64271097249a198b2e8aed3046 +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TFHCRemapNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TFHCRemapNode.cs new file mode 100644 index 0000000..dc010aa --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TFHCRemapNode.cs @@ -0,0 +1,74 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +// +// Custom Node Remap +// Donated by The Four Headed Cat - @fourheadedcat +using UnityEngine; +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Remap", "Math Operators", "Remap value from old min - max range to new min - max range", null, KeyCode.None, true, false, null, null, "The Four Headed Cat - @fourheadedcat" )] + public sealed class TFHCRemapNode : DynamicTypeNode + { + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_inputPorts[ 0 ].Name = Constants.EmptyPortValue; + m_inputPorts[ 1 ].Name = "Min Old"; + AddInputPort( WirePortDataType.FLOAT, false, "Max Old" ); + m_inputPorts[ 2 ].FloatInternalData = 1; + m_inputPorts[ 2 ].Vector2InternalData = Vector2.one; + m_inputPorts[ 2 ].Vector3InternalData = Vector3.one; + m_inputPorts[ 2 ].Vector4InternalData = Vector4.one; + m_inputPorts[ 2 ].ColorInternalData = Color.white; + + AddInputPort( WirePortDataType.FLOAT, false, "Min New" ); + AddInputPort( WirePortDataType.FLOAT, false, "Max New" ); + m_inputPorts[ 4 ].FloatInternalData = 1; + m_inputPorts[ 4 ].Vector2InternalData = Vector2.one; + m_inputPorts[ 4 ].Vector3InternalData = Vector3.one; + m_inputPorts[ 4 ].Vector4InternalData = Vector4.one; + m_inputPorts[ 4 ].ColorInternalData = Color.white; + + m_textLabelWidth = 100; + m_useInternalPortData = true; + m_previewShaderGUID = "72dd1cbea889fa047b929d5191e360c0"; + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + UpdateConnections(); + } + + public override void OnConnectedOutputNodeChanges( int outputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( outputPortId, otherNodeId, otherPortId, name, type ); + UpdateConnections(); + } + + void UpdateConnections() + { + m_inputPorts[ 0 ].MatchPortToConnection(); + m_inputPorts[ 1 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + m_inputPorts[ 2 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + m_inputPorts[ 3 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + m_inputPorts[ 4 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + m_outputPorts[ 0 ].ChangeType( m_inputPorts[ 0 ].DataType, false ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + string value = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string oldMin = m_inputPorts[ 1 ].GenerateShaderForOutput( ref dataCollector, m_inputPorts[ 0 ].DataType, ignoreLocalvar, true ); + string oldMax = m_inputPorts[ 2 ].GenerateShaderForOutput( ref dataCollector, m_inputPorts[ 0 ].DataType, ignoreLocalvar, true ); + string newMin = m_inputPorts[ 3 ].GenerateShaderForOutput( ref dataCollector, m_inputPorts[ 0 ].DataType, ignoreLocalvar, true ); + string newMax = m_inputPorts[ 4 ].GenerateShaderForOutput( ref dataCollector, m_inputPorts[ 0 ].DataType, ignoreLocalvar, true ); + string strout = "(" + newMin + " + (" + value + " - " + oldMin + ") * (" + newMax + " - " + newMin + ") / (" + oldMax + " - " + oldMin + "))"; + + return CreateOutputLocalVariable( 0, strout, ref dataCollector ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TFHCRemapNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TFHCRemapNode.cs.meta new file mode 100644 index 0000000..e255ee6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TFHCRemapNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 637508d44a97b5449a3d7223c461e58c +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TanOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TanOpNode.cs new file mode 100644 index 0000000..409937e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TanOpNode.cs @@ -0,0 +1,26 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Tan", "Trigonometry Operators", "Tangent of scalars and vectors" )] + public sealed class TanOpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "tan"; + m_previewShaderGUID = "312e291832cac5749a3626547dfc8607"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT, + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR, + WirePortDataType.INT ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TanOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TanOpNode.cs.meta new file mode 100644 index 0000000..e78333f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TanOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 535b4367719ca2146bb7ddac217dad94 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TanhOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TanhOpNode.cs new file mode 100644 index 0000000..e9f88fa --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TanhOpNode.cs @@ -0,0 +1,26 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Tanh", "Trigonometry Operators", "Hyperbolic tangent of scalars and vectors" )] + public sealed class TanhOpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "tanh"; + m_previewShaderGUID = "52f78d3a1c66d1c489cd63b0a9300b38"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT, + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR, + WirePortDataType.INT ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TanhOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TanhOpNode.cs.meta new file mode 100644 index 0000000..e2a2ef7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TanhOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 792e48b83a6387a4d826d6445417372f +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TransformVectorOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TransformVectorOpNode.cs new file mode 100644 index 0000000..c4c7e32 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TransformVectorOpNode.cs @@ -0,0 +1,160 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + public enum CoordinateSpaces + { + Tangent, + Local, + World, + View, + Clip, + Screen + } + + [Serializable] + [NodeAttributes( "Transform Vector", "Math Operators", "Transforma a vector into another", null, KeyCode.None, false )] + public sealed class TransformVectorOpNode : ParentNode + { + [SerializeField] + private CoordinateSpaces m_source = CoordinateSpaces.Tangent; + [SerializeField] + private CoordinateSpaces m_destination = CoordinateSpaces.World; + + private const string InputTangentrStr = "float4 tangent: TANGENT"; + private const string ColorValueStr = ".tangent"; + + private const string InputNormalStr = "float3 normal : NORMAL"; + private const string NormalValueStr = ".normal"; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT4, false, Constants.EmptyPortValue ); + AddOutputPort( WirePortDataType.FLOAT4, Constants.EmptyPortValue ); + m_useInternalPortData = true; + } + + void AddTangentInfo( ref MasterNodeDataCollector dataCollector ) + { + dataCollector.AddToInput( UniqueId, InputTangentrStr, true ); + dataCollector.AddToInput( UniqueId, InputTangentrStr, true ); + dataCollector.AddToInput( UniqueId, InputNormalStr, true ); + dataCollector.AddToLocalVariables( UniqueId, "float3 binormal = cross( normalize( v.normal ), normalize( v.tangent.xyz ) ) * v.tangent.w;" ); + dataCollector.AddToLocalVariables( UniqueId, "float3x3 rotation = float3x3( v.tangent.xyz, binormal, v.normal );" ); + + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + + //if ( !InputPorts[ 0 ].IsConnected ) + //{ + // return UIUtils.NoConnection( this ); + //} + + string value = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + + dataCollector.AddToIncludes( UniqueId, Constants.UnityShaderVariables ); + + + + switch ( m_source ) + { + case CoordinateSpaces.Tangent: + { + AddTangentInfo( ref dataCollector ); + switch ( m_destination ) + { + case CoordinateSpaces.Tangent: + { + return value; + } + //case eCoordinateSpaces.Local: + //{ + //} + //case eCoordinateSpaces.World: + //{ + //} + //case eCoordinateSpaces.View: + //{ + //} + } + } + break; + case CoordinateSpaces.Local: + { + switch ( m_destination ) + { + case CoordinateSpaces.Tangent: + { + AddTangentInfo( ref dataCollector ); + return "float4(mul( rotation , " + value + ".xyz ),1)"; + } + case CoordinateSpaces.Local: + { + return value; + } + case CoordinateSpaces.World: + { + return "mul( _Object2World , " + value + " )"; + } + case CoordinateSpaces.View: + { + return "mul( UNITY_MATRIX_MV , " + value + " )"; + } + } + } + break; + case CoordinateSpaces.World: + { + switch ( m_destination ) + { + //case eCoordinateSpaces.Tangent: + //{ + //} + case CoordinateSpaces.Local: + { + return "mul( _World2Object , " + value + " )"; + } + case CoordinateSpaces.World: + { + return value; + } + case CoordinateSpaces.View: + { + return "mul( UNITY_MATRIX_V , " + value + " )"; + } + } + } + break; + case CoordinateSpaces.View: + { + UIUtils.ShowMessage( UniqueId, "View as Source is not supported", MessageSeverity.Warning ); + return value; + } + } + + return UIUtils.UnknownError( this ); + } + + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_source = ( CoordinateSpaces ) Enum.Parse( typeof( CoordinateSpaces ), GetCurrentParam( ref nodeParams ) ); + m_destination = ( CoordinateSpaces ) Enum.Parse( typeof( CoordinateSpaces ), GetCurrentParam( ref nodeParams ) ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_source ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_destination ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TransformVectorOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TransformVectorOpNode.cs.meta new file mode 100644 index 0000000..3169b4e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TransformVectorOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 928c21155a9c1a74b953da2d24269035 +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TransposeOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TransposeOpNode.cs new file mode 100644 index 0000000..6e83e51 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TransposeOpNode.cs @@ -0,0 +1,23 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Transpose", "Matrix Operators", "Transpose matrix of a matrix" )] + public sealed class TransposeOpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "transpose"; + m_drawPreview = false; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.FLOAT3x3, + WirePortDataType.FLOAT4x4 ); + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT4x4, false ); + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT4x4, false ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TransposeOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TransposeOpNode.cs.meta new file mode 100644 index 0000000..1df556e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TransposeOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ba1613dad4af0da4b9f4619b90916cbf +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TruncOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TruncOpNode.cs new file mode 100644 index 0000000..f190b0c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TruncOpNode.cs @@ -0,0 +1,26 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Trunc", "Math Operators", "Largest integer not greater than a scalar or each vector component" )] + public sealed class TruncOpNode : SingleInputOp + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_opName = "trunc"; + m_previewShaderGUID = "c717aaa68f4ac9e469b15763e82933e1"; + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.OBJECT, + WirePortDataType.FLOAT, + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR, + WirePortDataType.INT ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TruncOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TruncOpNode.cs.meta new file mode 100644 index 0000000..9b87310 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/TruncOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5f78e9a796a94d54482caa15d4971feb +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/VariablePortTypeOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/VariablePortTypeOpNode.cs new file mode 100644 index 0000000..f561089 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/VariablePortTypeOpNode.cs @@ -0,0 +1,76 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + public class VariablePortTypeOpNode : ParentNode + { + private const string InputTypeStr = "Input type"; + + [SerializeField] + protected WirePortDataType m_selectedType = WirePortDataType.FLOAT; + + [SerializeField] + protected WirePortDataType m_lastSelectedType = WirePortDataType.FLOAT; + + [SerializeField] + protected int _inputAmount = 1; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddPorts(); + } + + void AddPorts() + { + for ( int i = 0; i < _inputAmount; i++ ) + { + AddInputPort( m_selectedType, true, i.ToString() ); + } + AddOutputPort( m_selectedType, Constants.EmptyPortValue ); + m_sizeIsDirty = true; + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUILayout.BeginVertical(); + { + EditorGUILayout.LabelField( InputTypeStr ); + m_selectedType = ( WirePortDataType ) EditorGUILayoutEnumPopup( m_selectedType ); + } + EditorGUILayout.EndVertical(); + if ( m_selectedType != m_lastSelectedType ) + { + m_lastSelectedType = m_selectedType; + + DeleteAllInputConnections( true ); + DeleteAllOutputConnections( true ); + + AddPorts(); + + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_selectedType ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_selectedType = ( WirePortDataType ) Enum.Parse( typeof( WirePortDataType ), GetCurrentParam( ref nodeParams ) ); + m_lastSelectedType = m_selectedType; + DeleteAllInputConnections( true ); + DeleteAllOutputConnections( true ); + AddPorts(); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/VariablePortTypeOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/VariablePortTypeOpNode.cs.meta new file mode 100644 index 0000000..f0328b0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Operators/VariablePortTypeOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 97be7adea7b8ae44c9bebb753277e0c2 +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ParentNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ParentNode.cs new file mode 100644 index 0000000..66794ff --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ParentNode.cs @@ -0,0 +1,3788 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + public enum PreviewLocation + { + Auto, + TopCenter, + BottomCenter, + Left, + Right + } + + public enum NodeMessageType + { + Error, + Warning, + Info + } + + [Serializable] + public class ParentNode : UndoParentNode, ISerializationCallbackReceiver + { + public const int PreviewWidth = 128; + public const int PreviewHeight = 128; + + protected readonly string[] PrecisionLabels = { "Float", "Half" }; + protected readonly string[] PrecisionLabelsExtra = { "Float", "Half", "Inherit" }; + + private const double NodeClickTime = 0.2; + protected GUIContent PrecisionContent = new GUIContent( "Precision", "Changes the precision of internal calculations, using lower types saves some performance\nDefault: Float" ); + private const int MoveCountBuffer = 3;// When testing for stopped movement we need to take Layout and Repaint into account for them not to interfere with tests + private const float MinInsideBoxWidth = 20; + private const float MinInsideBoxHeight = 10; + + private const string WikiLinkStr = "online reference"; + + public delegate void OnNodeEvent( ParentNode node, bool testOnlySelected, InteractionMode interactionMode ); + public delegate void OnNodeGenericEvent( ParentNode node ); + public delegate void OnNodeReOrder( ParentNode node, int index ); + public delegate void DrawPropertySection(); + public delegate void OnSRPAction( int outputId, ref MasterNodeDataCollector dataCollector ); + + [SerializeField] + protected PrecisionType m_currentPrecisionType = PrecisionType.Inherit; + + [SerializeField] + protected bool m_customPrecision = false; + + [SerializeField] + protected InteractionMode m_defaultInteractionMode = InteractionMode.Other; + + public event OnNodeEvent OnNodeStoppedMovingEvent; + public OnNodeGenericEvent OnNodeChangeSizeEvent; + public OnNodeGenericEvent OnNodeDestroyedEvent; + public event OnNodeReOrder OnNodeReOrderEvent; + public OnSRPAction OnLightweightAction; + public OnSRPAction OnHDAction; + + [SerializeField] + private int m_uniqueId; + + [SerializeField] + protected Rect m_position; + + [SerializeField] + protected Rect m_unpreviewedPosition; + + [SerializeField] + protected GUIContent m_content; + + [SerializeField] + protected GUIContent m_additionalContent; + + [SerializeField] + protected bool m_initialized; + + [SerializeField] + protected NodeConnectionStatus m_connStatus; + protected bool m_selfPowered = false; + + [SerializeField] + protected int m_activeConnections; + + [SerializeField] + protected System.Type m_activeType; + + [SerializeField] + protected int m_activePort; + + [SerializeField] + protected int m_activeNode; + + protected NodeRestrictions m_restrictions; + + [SerializeField] + protected Color m_statusColor; + + [SerializeField] + protected Rect m_propertyDrawPos; + + // Ports + [SerializeField] + protected List m_inputPorts = new List(); + + protected Dictionary m_inputPortsDict = new Dictionary(); + + [SerializeField] + protected List m_outputPorts = new List(); + + protected Dictionary m_outputPortsDict = new Dictionary(); + + [SerializeField] + protected Rect m_globalPosition; + + [SerializeField] + protected Rect m_headerPosition; + + //private Vector2 m_tooltipOffset; + + [SerializeField] + protected bool m_sizeIsDirty = false; + + [SerializeField] + protected Vector2 m_extraSize; + + [SerializeField] + protected Vector2 m_insideSize; + + [SerializeField] + protected float m_fontHeight; + + // Editor State save on Play Button + [SerializeField] + protected bool m_isDirty; + + [SerializeField] + private int m_isMoving = 0; + [SerializeField] + private Rect m_lastPosition; + + // Live Shader Gen + [SerializeField] + private bool m_saveIsDirty; + + [SerializeField] + protected bool m_requireMaterialUpdate = false; + + [SerializeField] + protected int m_commentaryParent = -1; + + [SerializeField] + protected int m_depth = -1; + + [SerializeField] + protected bool m_materialMode = false; + + [SerializeField] + protected bool m_showPreview = false; + + [SerializeField] + protected int m_previewMaterialPassId = -1; + + protected bool m_useSquareNodeTitle = false; + + [SerializeField] + protected bool m_continuousPreviewRefresh = false; + private bool m_previewIsDirty = true; + + // Error Box Messages + private Rect m_errorBox; + private bool m_previousErrorMessage = false; + protected bool m_showErrorMessage = false; + protected NodeMessageType m_errorMessageTypeIsError = NodeMessageType.Error; + protected string m_errorMessageTooltip = string.Empty; + + private GUIContent m_errorIcon = new GUIContent(); + private GUIContent m_errorMessage = new GUIContent(); + private GUIStyle m_errorCurrentStyle; + + private const string ErrorTitle = "ERROR"; + private const string WarningTitle = "WARNING"; + private const string InfoTitle = "INFO"; + + // Drawing Node + protected PreviewLocation m_selectedLocation = PreviewLocation.Auto; + private int m_extraHeaderHeight = 0; + protected bool m_isVisible; + protected bool m_selected = false; + protected bool m_rmbIgnore; + protected GUIContent m_sizeContentAux; + + protected uint m_currentReadParamIdx = 1; + protected bool m_reorderLocked = false; + + protected Rect m_cachedPos; + protected Vector2 m_accumDelta = Vector2.zero; + + private bool m_isOnGrid = false; + protected bool m_useInternalPortData = false; + protected bool m_autoDrawInternalPortData = true; + protected DrawOrder m_drawOrder = DrawOrder.Default; + + protected bool m_movingInFrame = false; + protected float m_anchorAdjust = -1; + + protected Color m_headerColor; + + [SerializeField] // needs to be serialized because of Undo + protected Color m_headerColorModifier = Color.white; + + protected bool m_infiniteLoopDetected = false; + protected int m_textLabelWidth = -1; + + private bool m_linkVisibility = false; + [SerializeField] + protected bool m_hasTooltipLink = true; + + protected int m_category = 0; + + protected double m_lastTimeSelected; + private double m_tooltipTimestamp; + protected string m_tooltipText; + + protected Rect m_unscaledRemainingBox; + protected Rect m_remainingBox; + + private int m_visibleInputs = 0; + private int m_visibleOutputs = 0; + + private double m_doubleClickTimestamp; + private const double DoubleClickTime = 0.25; + + protected bool m_canExpand = true; + + protected bool m_firstDraw = true; + + protected int m_matrixId = -1; + + private float m_paddingTitleLeft = 0; + private float m_paddingTitleRight = 0; + + // Preview Fields + private Material m_previewMaterial = null; + private Shader m_previewShader = null; + protected string m_previewShaderGUID = string.Empty; + protected float m_marginPreviewLeft = 0; + protected bool m_globalShowPreview = false; + protected Rect m_unscaledPreviewRect; + protected Rect m_previewRect; + protected bool m_drawPreviewMaskButtons = true; + private int m_channelNumber = 0; + protected bool m_firstPreviewDraw = true; + [SerializeField] + protected bool m_drawPreview = true; + protected bool m_drawPreviewExpander = true; + private bool m_spherePreview = false; + protected bool m_drawPreviewAsSphere = false; + protected bool m_forceDrawPreviewAsPlane = false; + private bool m_finishPreviewRender = false; + + private int m_cachedMainTexId = -1; + private int m_cachedMaskTexId = -1; + private int m_cachedPortsId = -1; + private int m_cachedPortId = -1; + + private int m_cachedDrawSphereId = -1; + private int m_cachedInvertedZoomId = -1; + //private int m_cachedIsLinearId = -1; + + private bool[] m_previewChannels = { true, true, true, false }; + + // Others + protected bool m_hasSubtitle = false; + protected bool m_showSubtitle = true; + protected bool m_hasLeftDropdown = false; + protected bool m_autoWrapProperties = false; + protected bool m_internalDataFoldout = true; + protected bool m_propertiesFoldout = true; + protected bool m_repopulateDictionaries = true; + + protected Vector2 m_lastInputBottomRight = Vector2.zero; + protected Vector2 m_lastOutputBottomLeft = Vector2.zero; + + private Vector4 m_portMask = Vector4.zero; + + private Vector2 m_auxVector2 = Vector4.zero; + protected Rect m_auxRect; + + protected PreviewLocation m_autoLocation; + protected Rect m_titlePos; + protected Rect m_addTitlePos; + protected Rect m_expandRect; + protected Rect m_dropdownRect; + protected Rect m_currInputPortPos; + protected Rect m_currOutputPortPos; + protected Color m_colorBuffer; + + [SerializeField] + protected bool m_docking = false; + + [SerializeField] + protected int m_visiblePorts = 0; + + protected int m_graphDepth = 0; + + protected int m_oldInputCount = -1; + + protected bool m_dropdownEditing = false; + + protected bool m_isNodeBeingCopied = false; + + protected string m_previousTitle = string.Empty; + + protected string m_previousAdditonalTitle = string.Empty; + + private bool m_alive = true; + + private bool m_wasDeprecated = false; + + private double m_timedUpdateInitialValue; + private double m_timedUpdateInterval; + private bool m_fireTimedUpdateRequest = false; + + public ParentNode() + { + m_position = new Rect( 0, 0, 0, 0 ); + m_content = new GUIContent( GUIContent.none ); + m_additionalContent = new GUIContent( GUIContent.none ); + CommonInit( -1 ); + } + + public ParentNode( int uniqueId, float x, float y, float width, float height ) + { + m_position = new Rect( x, y, width, height ); + m_content = new GUIContent( GUIContent.none ); + m_additionalContent = new GUIContent( GUIContent.none ); + CommonInit( uniqueId ); + } + + public virtual void OnEnable() + { + hideFlags = HideFlags.HideAndDontSave; + if( m_nodeAttribs != null ) + { + if( UIUtils.HasColorCategory( m_nodeAttribs.Category ) ) + { + m_headerColor = UIUtils.GetColorFromCategory( m_nodeAttribs.Category ); + } + else + { + if( !string.IsNullOrEmpty( m_nodeAttribs.CustomCategoryColor ) ) + { + m_headerColor = UIUtils.AddColorCategory( m_nodeAttribs.Category, m_nodeAttribs.CustomCategoryColor ); + } + } + } + + m_tooltipTimestamp = Time.realtimeSinceStartup; + hideFlags = HideFlags.DontSave; + } + + protected virtual void CommonInit( int uniqueId ) + { + m_uniqueId = uniqueId; + + m_isOnGrid = false; + ConnStatus = NodeConnectionStatus.Not_Connected; + m_inputPorts = new List(); + m_inputPortsDict = new Dictionary(); + + m_outputPorts = new List(); + m_outputPortsDict = new Dictionary(); + + System.Reflection.MemberInfo info = this.GetType(); + m_nodeAttribs = info.GetCustomAttributes( true )[ 0 ] as NodeAttributes; + if( m_nodeAttribs != null ) + { + m_content.text = m_nodeAttribs.Name; + //m_content.tooltip = m_nodeAttribs.Description; + m_tooltipText = m_nodeAttribs.Description; + m_selected = false; + } + + m_sizeContentAux = new GUIContent(); + m_extraSize = new Vector2( 0, 0 ); + m_insideSize = new Vector2( 0, 0 ); + m_sizeIsDirty = true; + m_initialized = true; + m_restrictions = new NodeRestrictions(); + + m_propertyDrawPos = new Rect(); + } + + public virtual void AfterCommonInit() + { + if( PreviewShader && !HasPreviewShader ) + { + m_drawPreview = false; + m_drawPreviewExpander = false; + m_canExpand = false; + } + + if( m_drawPreviewExpander || m_hasLeftDropdown ) + { + m_paddingTitleRight += Constants.PreviewExpanderWidth + Constants.IconsLeftRightMargin; + m_paddingTitleLeft = Constants.PreviewExpanderWidth + Constants.IconsLeftRightMargin; + } + } + + public virtual void Destroy() + { + m_alive = false; + if( OnNodeDestroyedEvent != null ) + { + OnNodeDestroyedEvent( this ); + OnNodeDestroyedEvent = null; + } + + OnLightweightAction = null; + OnHDAction = null; + + OnNodeStoppedMovingEvent = null; + OnNodeChangeSizeEvent = null; + OnNodeReOrderEvent = null; + if( m_restrictions != null ) + m_restrictions.Destroy(); + m_restrictions = null; + + if( m_inputPorts != null ) + { + int inputCount = m_inputPorts.Count; + for( int i = 0; i < inputCount; i++ ) + { + m_inputPorts[ i ].Destroy(); + } + m_inputPorts.Clear(); + m_inputPorts = null; + } + + if( m_outputPorts != null ) + { + int outputCount = m_outputPorts.Count; + for( int i = 0; i < outputCount; i++ ) + { + m_outputPorts[ i ].Destroy(); + } + m_outputPorts.Clear(); + m_outputPorts = null; + } + + if( m_inputPortsDict != null ) + m_inputPortsDict.Clear(); + + m_inputPortsDict = null; + + if( m_outputPortsDict != null ) + m_outputPortsDict.Clear(); + + m_outputPortsDict = null; + + if( m_previewMaterial != null ) + DestroyImmediate( m_previewMaterial ); + m_previewMaterial = null; + + m_previewShader = null; + //m_containerGraph = null; + } + + public virtual void Move( Vector2 delta ) + { + if( m_docking ) + return; + + Move( delta, false ); + } + + public virtual void Move( Vector2 delta, bool snap ) + { + if( m_docking ) + return; + + if( m_isMoving == 0 ) + { + m_cachedPos = m_position; + m_accumDelta = Vector2.zero; + } + + m_isMoving = MoveCountBuffer; + m_accumDelta += delta; + + if( snap ) + { + m_position.x = Mathf.Round( ( m_cachedPos.x + m_accumDelta.x ) / 16 ) * 16; + m_position.y = Mathf.Round( ( m_cachedPos.y + m_accumDelta.y ) / 16 ) * 16; + } + else + { + m_position.x += delta.x; + m_position.y += delta.y; + } + //if(Event.current.type == EventType.Layout) + m_movingInFrame = true; + } + + public virtual void UpdateMaterial( Material mat ) + { + m_requireMaterialUpdate = false; + } + + public virtual void SetMaterialMode( Material mat, bool fetchMaterialValues ) + { + m_materialMode = ( mat != null ); + } + + public virtual bool UpdateShaderDefaults( ref Shader shader, ref TextureDefaultsDataColector defaultCol ) { return false; } + public virtual void ForceUpdateFromMaterial( Material material ) { } + public void SetSaveIsDirty() + { + if( m_connStatus == NodeConnectionStatus.Connected ) + { + SaveIsDirty = true; + } + } + + public void ActivateNodeReordering( int index ) + { + if( OnNodeReOrderEvent != null ) + OnNodeReOrderEvent( this, index ); + } + + void RecalculateInputPortIdx() + { + m_inputPortsDict.Clear(); + int count = m_inputPorts.Count; + for( int i = 0; i < count; i++ ) + { + if( m_inputPorts[ i ].IsConnected ) + { + int nodeId = m_inputPorts[ i ].ExternalReferences[ 0 ].NodeId; + int portId = m_inputPorts[ i ].ExternalReferences[ 0 ].PortId; + ParentNode node = UIUtils.GetNode( nodeId ); + if( node != null ) + { + OutputPort outputPort = node.GetOutputPortByUniqueId( portId ); + int outputCount = outputPort.ExternalReferences.Count; + for( int j = 0; j < outputCount; j++ ) + { + if( outputPort.ExternalReferences[ j ].NodeId == m_uniqueId && + outputPort.ExternalReferences[ j ].PortId == m_inputPorts[ i ].PortId ) + { + outputPort.ExternalReferences[ j ].PortId = i; + } + } + } + } + m_inputPorts[ i ].PortId = i; + m_inputPortsDict.Add( i, m_inputPorts[ i ] ); + } + } + + public void SwapInputPorts( int fromIdx, int toIdx ) + { + InputPort port = m_inputPorts[ fromIdx ]; + //if( toIdx > fromIdx ) + // toIdx--; + m_inputPorts.Remove( port ); + m_inputPorts.Insert( toIdx, port ); + RecalculateInputPortIdx(); + SetSaveIsDirty(); + } + + public void RemoveInputPort( int idx ) + { + if( idx < m_inputPorts.Count ) + { + m_inputPortsDict.Remove( m_inputPorts[ idx ].PortId ); + m_inputPorts.RemoveAt( idx ); + SetSaveIsDirty(); + m_sizeIsDirty = true; + } + } + + public void RemoveOutputPort( string name ) + { + int count = m_outputPorts.Count; + for( int i = 0; i < count; i++ ) + { + if( m_outputPorts[ i ].Name.Equals( name ) ) + { + if( m_outputPorts[ i ].IsConnected ) + { + m_containerGraph.DeleteConnection( false, m_uniqueId, m_outputPorts[ i ].PortId, false, true ); + m_outputPortsDict.Remove( m_outputPorts[ i ].PortId ); + m_outputPorts.RemoveAt( i ); + SetSaveIsDirty(); + m_sizeIsDirty = true; + } + } + } + } + + public void RemoveOutputPort( int idx, bool isArrayIndex = true ) + { + if( isArrayIndex ) + { + // idx represents a position on the output port array + if( idx < m_outputPorts.Count ) + { + if( m_outputPorts[ idx ].IsConnected ) + { + m_containerGraph.DeleteConnection( false, m_uniqueId, m_outputPorts[ idx ].PortId, false, true ); + } + + m_outputPortsDict.Remove( m_outputPorts[ idx ].PortId ); + m_outputPorts.RemoveAt( idx ); + SetSaveIsDirty(); + m_sizeIsDirty = true; + } + } + else + { + // idx represents a port unique id + int count = m_outputPorts.Count; + int arrIdx = -1; + for( int i = 0; i < count; i++ ) + { + if( m_outputPorts[ i ].PortId == idx ) + { + arrIdx = i; + break; + } + } + + if( arrIdx >= 0 ) + { + if( m_outputPorts[ arrIdx ].IsConnected ) + { + m_containerGraph.DeleteConnection( false, m_uniqueId, idx, false, true ); + } + + m_outputPortsDict.Remove( idx ); + m_outputPorts.RemoveAt( arrIdx ); + SetSaveIsDirty(); + m_sizeIsDirty = true; + } + } + } + + // Manually add Ports + public InputPort AddInputPort( WirePortDataType type, bool typeLocked, string name, int orderId = -1, MasterNodePortCategory category = MasterNodePortCategory.Fragment, int uniquePortId = -1 ) + { + InputPort port = new InputPort( m_uniqueId, ( uniquePortId < 0 ? m_inputPorts.Count : uniquePortId ), type, name, typeLocked, ( orderId >= 0 ? orderId : m_inputPorts.Count ), category ); + m_inputPorts.Add( port ); + m_inputPortsDict.Add( port.PortId, port ); + SetSaveIsDirty(); + m_sizeIsDirty = true; + return port; + } + + public InputPort AddInputPort( WirePortDataType type, bool typeLocked, string name, string dataName, int orderId = -1, MasterNodePortCategory category = MasterNodePortCategory.Fragment, int uniquePortId = -1 ) + { + InputPort port = new InputPort( m_uniqueId, ( uniquePortId < 0 ? m_inputPorts.Count : uniquePortId ), type, name, dataName, typeLocked, ( orderId >= 0 ? orderId : m_inputPorts.Count ), category ); + m_inputPorts.Add( port ); + m_inputPortsDict.Add( port.PortId, port ); + SetSaveIsDirty(); + m_sizeIsDirty = true; + return port; + } + + public InputPort AddInputPortAt( int idx, WirePortDataType type, bool typeLocked, string name, int orderId = -1, MasterNodePortCategory category = MasterNodePortCategory.Fragment, int uniquePortId = -1 ) + { + InputPort port = new InputPort( m_uniqueId, ( uniquePortId < 0 ? m_inputPorts.Count : uniquePortId ), type, name, typeLocked, ( orderId >= 0 ? orderId : m_inputPorts.Count ), category ); + m_inputPorts.Insert( idx, port ); + m_inputPortsDict.Add( port.PortId, port ); + SetSaveIsDirty(); + m_sizeIsDirty = true; + RecalculateInputPortIdx(); + return port; + } + + public void AddOutputPort( WirePortDataType type, string name, int uniquePortId = -1 ) + { + m_outputPorts.Add( new OutputPort( this, m_uniqueId, ( uniquePortId < 0 ? m_outputPorts.Count : uniquePortId ), type, name ) ); + m_outputPortsDict.Add( m_outputPorts[ m_outputPorts.Count - 1 ].PortId, m_outputPorts[ m_outputPorts.Count - 1 ] ); + SetSaveIsDirty(); + m_sizeIsDirty = true; + } + + public void AddOutputPortAt( int idx, WirePortDataType type, string name, int uniquePortId = -1 ) + { + OutputPort port = new OutputPort( this, m_uniqueId, ( uniquePortId < 0 ? m_outputPorts.Count : uniquePortId ), type, name ); + m_outputPorts.Insert( idx, port ); + m_outputPortsDict.Add( port.PortId, port ); + SetSaveIsDirty(); + m_sizeIsDirty = true; + } + + public void AddOutputVectorPorts( WirePortDataType type, string name ) + { + m_sizeIsDirty = true; + m_outputPorts.Add( new OutputPort( this, m_uniqueId, m_outputPorts.Count, type, name ) ); + m_outputPortsDict.Add( m_outputPorts[ m_outputPorts.Count - 1 ].PortId, m_outputPorts[ m_outputPorts.Count - 1 ] ); + + switch( type ) + { + case WirePortDataType.FLOAT2: + { + m_outputPorts.Add( new OutputPort( this, m_uniqueId, m_outputPorts.Count, WirePortDataType.FLOAT, "X" ) ); + m_outputPortsDict.Add( m_outputPorts[ m_outputPorts.Count - 1 ].PortId, m_outputPorts[ m_outputPorts.Count - 1 ] ); + m_outputPorts.Add( new OutputPort( this, m_uniqueId, m_outputPorts.Count, WirePortDataType.FLOAT, "Y" ) ); + m_outputPortsDict.Add( m_outputPorts[ m_outputPorts.Count - 1 ].PortId, m_outputPorts[ m_outputPorts.Count - 1 ] ); + } + break; + case WirePortDataType.FLOAT3: + { + m_outputPorts.Add( new OutputPort( this, m_uniqueId, m_outputPorts.Count, WirePortDataType.FLOAT, "X" ) ); + m_outputPortsDict.Add( m_outputPorts[ m_outputPorts.Count - 1 ].PortId, m_outputPorts[ m_outputPorts.Count - 1 ] ); + m_outputPorts.Add( new OutputPort( this, m_uniqueId, m_outputPorts.Count, WirePortDataType.FLOAT, "Y" ) ); + m_outputPortsDict.Add( m_outputPorts[ m_outputPorts.Count - 1 ].PortId, m_outputPorts[ m_outputPorts.Count - 1 ] ); + m_outputPorts.Add( new OutputPort( this, m_uniqueId, m_outputPorts.Count, WirePortDataType.FLOAT, "Z" ) ); + m_outputPortsDict.Add( m_outputPorts[ m_outputPorts.Count - 1 ].PortId, m_outputPorts[ m_outputPorts.Count - 1 ] ); + } + break; + case WirePortDataType.FLOAT4: + { + m_outputPorts.Add( new OutputPort( this, m_uniqueId, m_outputPorts.Count, WirePortDataType.FLOAT, "X" ) ); + m_outputPortsDict.Add( m_outputPorts[ m_outputPorts.Count - 1 ].PortId, m_outputPorts[ m_outputPorts.Count - 1 ] ); + m_outputPorts.Add( new OutputPort( this, m_uniqueId, m_outputPorts.Count, WirePortDataType.FLOAT, "Y" ) ); + m_outputPortsDict.Add( m_outputPorts[ m_outputPorts.Count - 1 ].PortId, m_outputPorts[ m_outputPorts.Count - 1 ] ); + m_outputPorts.Add( new OutputPort( this, m_uniqueId, m_outputPorts.Count, WirePortDataType.FLOAT, "Z" ) ); + m_outputPortsDict.Add( m_outputPorts[ m_outputPorts.Count - 1 ].PortId, m_outputPorts[ m_outputPorts.Count - 1 ] ); + m_outputPorts.Add( new OutputPort( this, m_uniqueId, m_outputPorts.Count, WirePortDataType.FLOAT, "W" ) ); + m_outputPortsDict.Add( m_outputPorts[ m_outputPorts.Count - 1 ].PortId, m_outputPorts[ m_outputPorts.Count - 1 ] ); + } + break; + } + SetSaveIsDirty(); + } + + public void SetPreviewDirtyFromOutputs() + { + PreviewIsDirty = true; + } + + public string GetOutputVectorItem( int vectorPortId, int currentPortId, string result ) + { + if( m_outputPorts[ 0 ].DataType == WirePortDataType.COLOR ) + { + switch( currentPortId - vectorPortId ) + { + case 1: result += ".r"; break; + case 2: result += ".g"; break; + case 3: result += ".b"; break; + case 4: result += ".a"; break; + } + } + else + { + switch( currentPortId - vectorPortId ) + { + case 1: result += ".x"; break; + case 2: result += ".y"; break; + case 3: result += ".z"; break; + case 4: result += ".w"; break; + } + } + return result; + } + + public void AddOutputColorPorts( string name, bool addAlpha = true ) + { + m_sizeIsDirty = true; + //Main port + m_outputPorts.Add( new OutputPort( this, m_uniqueId, m_outputPorts.Count, addAlpha ? WirePortDataType.COLOR : WirePortDataType.FLOAT3, name ) ); + m_outputPortsDict.Add( m_outputPorts[ m_outputPorts.Count - 1 ].PortId, m_outputPorts[ m_outputPorts.Count - 1 ] ); + + //Color components port + m_outputPorts.Add( new OutputPort( this, m_uniqueId, m_outputPorts.Count, WirePortDataType.FLOAT, "R" ) ); + m_outputPortsDict.Add( m_outputPorts[ m_outputPorts.Count - 1 ].PortId, m_outputPorts[ m_outputPorts.Count - 1 ] ); + m_outputPorts[ m_outputPorts.Count - 1 ].CustomColor = Color.red; + + m_outputPorts.Add( new OutputPort( this, m_uniqueId, m_outputPorts.Count, WirePortDataType.FLOAT, "G" ) ); + m_outputPortsDict.Add( m_outputPorts[ m_outputPorts.Count - 1 ].PortId, m_outputPorts[ m_outputPorts.Count - 1 ] ); + m_outputPorts[ m_outputPorts.Count - 1 ].CustomColor = Color.green; + + m_outputPorts.Add( new OutputPort( this, m_uniqueId, m_outputPorts.Count, WirePortDataType.FLOAT, "B" ) ); + m_outputPortsDict.Add( m_outputPorts[ m_outputPorts.Count - 1 ].PortId, m_outputPorts[ m_outputPorts.Count - 1 ] ); + m_outputPorts[ m_outputPorts.Count - 1 ].CustomColor = Color.blue; + + if( addAlpha ) + { + m_outputPorts.Add( new OutputPort( this, m_uniqueId, m_outputPorts.Count, WirePortDataType.FLOAT, "A" ) ); + m_outputPortsDict.Add( m_outputPorts[ m_outputPorts.Count - 1 ].PortId, m_outputPorts[ m_outputPorts.Count - 1 ] ); + m_outputPorts[ m_outputPorts.Count - 1 ].CustomColor = Color.white; + } + } + + public void ConvertFromVectorToColorPorts() + { + m_outputPorts[ 0 ].ChangeType( WirePortDataType.COLOR, false ); + + m_outputPorts[ 1 ].Name = "R"; + m_outputPorts[ 1 ].CustomColor = Color.red; + + m_outputPorts[ 2 ].Name = "G"; + m_outputPorts[ 2 ].CustomColor = Color.green; + + m_outputPorts[ 3 ].Name = "B"; + m_outputPorts[ 3 ].CustomColor = Color.blue; + + m_outputPorts[ 4 ].Name = "A"; + m_outputPorts[ 4 ].CustomColor = Color.white; + } + + + public string GetOutputColorItem( int vectorPortId, int currentPortId, string result ) + { + switch( currentPortId - vectorPortId ) + { + case 1: result += ".r"; break; + case 2: result += ".g"; break; + case 3: result += ".b"; break; + case 4: result += ".a"; break; + } + return result; + } + + public void ChangeOutputType( WirePortDataType type, bool invalidateConnections ) + { + int outputCount = m_outputPorts.Count; + for( int i = 0; i < outputCount; i++ ) + { + m_outputPorts[ i ].ChangeType( type, invalidateConnections ); + } + } + + public void ChangeInputType( WirePortDataType type, bool invalidateConnections ) + { + int inputCount = m_inputPorts.Count; + for( int i = 0; i < inputCount; i++ ) + { + m_inputPorts[ i ].ChangeType( type, invalidateConnections ); + } + } + + public void ChangeOutputProperties( int outputID, string newName, WirePortDataType newType, bool invalidateConnections = true ) + { + if( outputID < m_outputPorts.Count ) + { + m_outputPorts[ outputID ].ChangeProperties( newName, newType, invalidateConnections ); + IsDirty = true; + m_sizeIsDirty = true; + SetSaveIsDirty(); + } + } + + public void ChangeOutputName( int outputArrayIdx, string newName ) + { + if( outputArrayIdx < m_outputPorts.Count ) + { + m_outputPorts[ outputArrayIdx ].Name = newName; + IsDirty = true; + m_sizeIsDirty = true; + } + } + + public InputPort CheckInputPortAt( Vector3 pos ) + { + int count = m_inputPorts.Count; + for( int i = 0; i < count; i++ ) + { + if( m_inputPorts[ i ].InsideActiveArea( pos ) ) + return m_inputPorts[ i ]; + } + return null; + } + + public InputPort GetFirstInputPortOfType( WirePortDataType dataType, bool countObjectTypeAsValid ) + { + int count = m_inputPorts.Count; + for( int i = 0; i < count; i++ ) + { + if( ( m_inputPorts[ i ].CheckValidType( dataType ) ) || ( countObjectTypeAsValid && m_inputPorts[ i ].DataType == WirePortDataType.OBJECT ) ) + return m_inputPorts[ i ]; + } + return null; + } + + public OutputPort CheckOutputPortAt( Vector3 pos ) + { + int count = m_outputPorts.Count; + for( int i = 0; i < count; i++ ) + { + if( m_outputPorts[ i ].InsideActiveArea( pos ) ) + return m_outputPorts[ i ]; + } + return null; + } + + public OutputPort GetFirstOutputPortOfType( WirePortDataType dataType, bool checkForCasts ) + { + int count = m_outputPorts.Count; + for( int i = 0; i < count; i++ ) + { + if( ( m_outputPorts[ i ].CheckValidType( dataType ) ) || ( checkForCasts && UIUtils.CanCast( dataType, m_outputPorts[ i ].DataType ) ) ) + return m_outputPorts[ i ]; + } + return null; + } + + virtual protected void ChangeSizeFinished() { m_firstPreviewDraw = true; /*MarkForPreviewUpdate();*/ } + protected void ChangeSize() + { + m_cachedPos = m_position; + //UIUtils.ResetMainSkin(); + + Vector2 inSize = Vector2.zero; + int inputCount = 0; + int inputSize = m_inputPorts.Count; + for( int i = 0; i < inputSize; i++ ) + { + if( m_inputPorts[ i ].Visible ) + { + if( m_inputPorts[ i ].DirtyLabelSize || m_inputPorts[ i ].LabelSize == Vector2.zero ) + { + m_inputPorts[ i ].DirtyLabelSize = false; + m_sizeContentAux.text = m_inputPorts[ i ].Name; + m_inputPorts[ i ].UnscaledLabelSize = UIUtils.UnZoomedInputPortStyle.CalcSize( m_sizeContentAux ); + } + + inSize.x = Mathf.Max( inSize.x, m_inputPorts[ i ].UnscaledLabelSize.x ); + inSize.y = Mathf.Max( inSize.y, m_inputPorts[ i ].UnscaledLabelSize.y ); + inputCount += 1; + } + } + if( inSize.x > 0 ) + inSize.x += UIUtils.PortsSize.x + Constants.PORT_TO_LABEL_SPACE_X * 2; + inSize.x += m_marginPreviewLeft; + inSize.y = Mathf.Max( inSize.y, UIUtils.PortsSize.y ); + + + Vector2 outSize = Vector2.zero; + int outputCount = 0; + int outputSize = m_outputPorts.Count; + for( int i = 0; i < outputSize; i++ ) + { + if( m_outputPorts[ i ].Visible ) + { + if( m_outputPorts[ i ].DirtyLabelSize || m_outputPorts[ i ].LabelSize == Vector2.zero ) + { + m_outputPorts[ i ].DirtyLabelSize = false; + m_sizeContentAux.text = m_outputPorts[ i ].Name; + m_outputPorts[ i ].UnscaledLabelSize = UIUtils.UnZoomedOutputPortPortStyle.CalcSize( m_sizeContentAux ); + } + + outSize.x = Mathf.Max( outSize.x, m_outputPorts[ i ].UnscaledLabelSize.x ); + outSize.y = Mathf.Max( outSize.y, m_outputPorts[ i ].UnscaledLabelSize.y ); + outputCount += 1; + } + } + if( outSize.x > 0 ) + outSize.x += UIUtils.PortsSize.x + Constants.PORT_TO_LABEL_SPACE_X * 2; + outSize.y = Mathf.Max( outSize.y, UIUtils.PortsSize.y ); + + if( m_additionalContent.text.Length > 0 ) + { + m_extraHeaderHeight = (int)Constants.NODE_HEADER_EXTRA_HEIGHT; + m_hasSubtitle = true && m_showSubtitle; + } + else + { + m_extraHeaderHeight = 0; + m_hasSubtitle = false; + } + + float headerWidth = Mathf.Max( UIUtils.UnZoomedNodeTitleStyle.CalcSize( m_content ).x + m_paddingTitleLeft + m_paddingTitleRight, UIUtils.UnZoomedPropertyValuesTitleStyle.CalcSize( m_additionalContent ).x + m_paddingTitleLeft + m_paddingTitleRight ); + m_position.width = Mathf.Max( headerWidth, Mathf.Max( MinInsideBoxWidth, m_insideSize.x ) + inSize.x + outSize.x ) + Constants.NODE_HEADER_LEFTRIGHT_MARGIN * 2; + //m_position.width += m_extraSize.x; + + m_fontHeight = Mathf.Max( inSize.y, outSize.y ); + + m_position.height = Mathf.Max( inputCount, outputCount ) * ( m_fontHeight + Constants.INPUT_PORT_DELTA_Y );// + Constants.INPUT_PORT_DELTA_Y; + m_position.height = Mathf.Max( m_position.height, Mathf.Max( MinInsideBoxHeight, m_insideSize.y ) ); + m_position.height += UIUtils.HeaderMaxHeight + m_extraHeaderHeight + Constants.INPUT_PORT_DELTA_Y;// + m_extraSize.y; + if( m_showErrorMessage ) + m_position.height += 24; + + m_unpreviewedPosition = m_position; + //UIUtils.CurrentWindow.CameraDrawInfo.InvertedZoom = cachedZoom; + if( OnNodeChangeSizeEvent != null ) + { + OnNodeChangeSizeEvent( this ); + } + ChangeSizeFinished(); + } + + public virtual void Reset() { } + public virtual void OnOutputPortConnected( int portId, int otherNodeId, int otherPortId ) { } + + public virtual void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + InputPort port = GetInputPortByUniqueId( portId ); + if( activateNode && m_connStatus == NodeConnectionStatus.Connected ) + { + port.GetOutputNode().ActivateNode( m_activeNode, m_activePort, m_activeType ); + } + + PreviewIsDirty = true; + OnNodeChange(); + SetSaveIsDirty(); + } + + public virtual void OnInputPortDisconnected( int portId ) { PreviewIsDirty = true; OnNodeChange(); } + public virtual void OnOutputPortDisconnected( int portId ) { } + + public virtual void OnNodeChange() + { + CheckSpherePreview(); + int count = m_outputPorts.Count; + for( int i = 0; i < count; i++ ) + { + if( m_outputPorts[ i ].IsConnected ) + { + for( int f = 0; f < m_outputPorts[ i ].ExternalReferences.Count; f++ ) + { + ContainerGraph.GetNode( m_outputPorts[ i ].ExternalReferences[ f ].NodeId ).OnNodeChange(); + } + } + } + } + + public virtual void ActivateNode( int signalGenNodeId, int signalGenPortId, System.Type signalGenNodeType ) + { + if( m_selfPowered ) + return; + + ConnStatus = m_restrictions.GetRestiction( signalGenNodeType, signalGenPortId ) ? NodeConnectionStatus.Error : NodeConnectionStatus.Connected; + m_activeConnections += 1; + + if( m_activeConnections == 1 ) + { + m_activeType = signalGenNodeType; + m_activeNode = signalGenNodeId; + m_activePort = signalGenPortId; + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + if( m_inputPorts[ i ].IsConnected ) + { + m_inputPorts[ i ].GetOutputNode().ActivateNode( signalGenNodeId, signalGenPortId, signalGenNodeType ); + } + } + } + // saveisdirty might be needed, gonna leave this here for now + // SetSaveIsDirty(); + } + + public virtual void DeactivateInputPortNode( int deactivatedPort, bool forceComplete ) + { + GetInputPortByUniqueId( deactivatedPort ).GetOutputNode().DeactivateNode( deactivatedPort, false ); + } + + public virtual void DeactivateNode( int deactivatedPort, bool forceComplete ) + { + if( m_selfPowered ) + return; + + // saveisdirty might be needed, gonna leave this here for now + // SetSaveIsDirty(); + m_activeConnections -= 1; + if( forceComplete || m_activeConnections <= 0 ) + { + m_activeConnections = 0; + ConnStatus = NodeConnectionStatus.Not_Connected; + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + if( m_inputPorts[ i ].IsConnected ) + { + ParentNode node = m_inputPorts[ i ].GetOutputNode(); + if( node != null ) + node.DeactivateNode( deactivatedPort == -1 ? m_inputPorts[ i ].PortId : deactivatedPort, false ); + } + } + } + } + + public Rect GlobalToLocalPosition( DrawInfo drawInfo ) + { + float width = m_globalPosition.width / drawInfo.InvertedZoom; + float height = m_globalPosition.height / drawInfo.InvertedZoom; + + float x = m_globalPosition.x / drawInfo.InvertedZoom - drawInfo.CameraOffset.x; + float y = m_globalPosition.y / drawInfo.InvertedZoom - drawInfo.CameraOffset.y; + return new Rect( x, y, width, height ); + } + + protected void CalculatePositionAndVisibility( DrawInfo drawInfo ) + { + //m_movingInFrame = false; + m_globalPosition = m_position; + m_globalPosition.x = drawInfo.InvertedZoom * ( m_globalPosition.x + drawInfo.CameraOffset.x ); + m_globalPosition.y = drawInfo.InvertedZoom * ( m_globalPosition.y + drawInfo.CameraOffset.y ); + m_globalPosition.width *= drawInfo.InvertedZoom; + m_globalPosition.height *= drawInfo.InvertedZoom; + + m_isVisible = ( m_globalPosition.x + m_globalPosition.width > 0 ) && + ( m_globalPosition.x < drawInfo.CameraArea.width ) && + ( m_globalPosition.y + m_globalPosition.height > 0 ) && + ( m_globalPosition.y < drawInfo.CameraArea.height ); + + if( m_isMoving > 0 && drawInfo.CurrentEventType != EventType.MouseDrag ) + { + float deltaX = Mathf.Abs( m_lastPosition.x - m_position.x ); + float deltaY = Mathf.Abs( m_lastPosition.y - m_position.y ); + if( deltaX < 0.01f && deltaY < 0.01f ) + { + m_isMoving -= 1; + if( m_isMoving == 0 ) + { + OnSelfStoppedMovingEvent(); + } + } + else + { + m_isMoving = MoveCountBuffer; + } + m_lastPosition = m_position; + } + } + + public void FireStoppedMovingEvent( bool testOnlySelected, InteractionMode interactionMode ) + { + if( OnNodeStoppedMovingEvent != null ) + OnNodeStoppedMovingEvent( this, testOnlySelected, interactionMode ); + } + + public virtual void OnSelfStoppedMovingEvent() + { + FireStoppedMovingEvent( true, m_defaultInteractionMode ); + } + + protected void DrawPrecisionProperty( bool withInherit = true ) + { + if( withInherit ) + m_currentPrecisionType = (PrecisionType)EditorGUILayoutPopup( PrecisionContent.text, (int)m_currentPrecisionType, PrecisionLabelsExtra ); + else + m_currentPrecisionType = (PrecisionType)EditorGUILayoutPopup( PrecisionContent.text, (int)m_currentPrecisionType, PrecisionLabels ); + } + + public virtual void DrawTitle( Rect titlePos ) + { + if( ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD3 ) + { + GUI.Label( titlePos, m_content, UIUtils.GetCustomStyle( CustomStyle.NodeTitle ) ); + } + } + + public virtual void DrawPreview( DrawInfo drawInfo, Rect rect ) + { + //if ( !m_drawPreview ) + // return; + + if( m_cachedDrawSphereId == -1 ) + m_cachedDrawSphereId = Shader.PropertyToID( "_DrawSphere" ); + + if( m_cachedInvertedZoomId == -1 ) + m_cachedInvertedZoomId = Shader.PropertyToID( "_InvertedZoom" ); + + m_channelNumber = 0; + Vector4 mask = Vector4.one; + if( m_outputPorts.Count > 0 ) + { + switch( m_outputPorts[ 0 ].DataType ) + { + case WirePortDataType.FLOAT: + m_channelNumber = 1; + mask.Set( 1, 1, 1, 0 ); + break; + case WirePortDataType.FLOAT2: + m_channelNumber = 2; + mask.Set( m_previewChannels[ 0 ] ? 1 : 0, m_previewChannels[ 1 ] ? 1 : 0, 1, 0 ); + break; + case WirePortDataType.COLOR: + case WirePortDataType.FLOAT4: + case WirePortDataType.SAMPLER1D: + case WirePortDataType.SAMPLER2D: + case WirePortDataType.SAMPLER3D: + case WirePortDataType.SAMPLERCUBE: + case WirePortDataType.SAMPLER2DARRAY: + m_channelNumber = 4; + mask.Set( m_previewChannels[ 0 ] ? 1 : 0, m_previewChannels[ 1 ] ? 1 : 0, m_previewChannels[ 2 ] ? 1 : 0, m_previewChannels[ 3 ] ? 1 : 0 ); + break; + default: + m_channelNumber = 3; + mask.Set( m_previewChannels[ 0 ] ? 1 : 0, m_previewChannels[ 1 ] ? 1 : 0, m_previewChannels[ 2 ] ? 1 : 0, 0 ); + break; + } + } + + UIUtils.LinearMaterial.SetFloat( m_cachedDrawSphereId, ( SpherePreview ? 1 : 0 ) ); + UIUtils.LinearMaterial.SetFloat( m_cachedInvertedZoomId, drawInfo.InvertedZoom ); + UIUtils.LinearMaterial.SetVector( "_Mask", mask ); + + bool cached = GL.sRGBWrite; + GL.sRGBWrite = true; + //EditorGUI.DrawPreviewTexture( rect, PreviewTexture, UIUtils.LinearMaterial ); + int pass = 0; + if( SpherePreview ) + { + if( mask.w == 1 ) + pass = 3; + else + pass = 1; + } + else if( mask.w == 1 ) + pass = 2; + + Graphics.DrawTexture( rect, PreviewTexture, UIUtils.LinearMaterial, pass ); + GL.sRGBWrite = cached; + //Preview buttons + if( m_drawPreviewMaskButtons ) + DrawPreviewMaskButtonsRepaint( drawInfo, rect ); + } + + protected void DrawPreviewMaskButtonsLayout( DrawInfo drawInfo, Rect rect ) + { + if( rect.Contains( drawInfo.MousePosition ) && m_channelNumber > 1 && ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD2 ) + { + Rect buttonRect = rect; + buttonRect.height = 14 * drawInfo.InvertedZoom; + buttonRect.y = rect.yMax - buttonRect.height; + buttonRect.width = 14 * drawInfo.InvertedZoom; + + if( m_channelNumber == 2 ) + { + m_previewChannels[ 0 ] = GUI.Toggle( buttonRect, m_previewChannels[ 0 ], string.Empty, GUIStyle.none ); + buttonRect.x += 14 * drawInfo.InvertedZoom; + m_previewChannels[ 1 ] = GUI.Toggle( buttonRect, m_previewChannels[ 1 ], string.Empty, GUIStyle.none ); + } + else if( m_channelNumber == 3 ) + { + m_previewChannels[ 0 ] = GUI.Toggle( buttonRect, m_previewChannels[ 0 ], string.Empty, GUIStyle.none ); + buttonRect.x += 14 * drawInfo.InvertedZoom; + m_previewChannels[ 1 ] = GUI.Toggle( buttonRect, m_previewChannels[ 1 ], string.Empty, GUIStyle.none ); + buttonRect.x += 14 * drawInfo.InvertedZoom; + m_previewChannels[ 2 ] = GUI.Toggle( buttonRect, m_previewChannels[ 2 ], string.Empty, GUIStyle.none ); + } + else if( m_channelNumber == 4 ) + { + m_previewChannels[ 0 ] = GUI.Toggle( buttonRect, m_previewChannels[ 0 ], string.Empty, GUIStyle.none ); + buttonRect.x += 14 * drawInfo.InvertedZoom; + m_previewChannels[ 1 ] = GUI.Toggle( buttonRect, m_previewChannels[ 1 ], string.Empty, GUIStyle.none ); + buttonRect.x += 14 * drawInfo.InvertedZoom; + m_previewChannels[ 2 ] = GUI.Toggle( buttonRect, m_previewChannels[ 2 ], string.Empty, GUIStyle.none ); + buttonRect.x += 14 * drawInfo.InvertedZoom; + m_previewChannels[ 3 ] = GUI.Toggle( buttonRect, m_previewChannels[ 3 ], string.Empty, GUIStyle.none ); + } + } + } + + protected void DrawPreviewMaskButtonsRepaint( DrawInfo drawInfo, Rect rect ) + { + if( drawInfo.CurrentEventType == EventType.Repaint && ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD2 && rect.Contains( drawInfo.MousePosition ) && m_channelNumber > 1 ) + { + Rect buttonRect = rect; + buttonRect.height = 14 * drawInfo.InvertedZoom; + buttonRect.y = rect.yMax - buttonRect.height; + buttonRect.width = 14 * drawInfo.InvertedZoom; + + if( m_channelNumber == 2 ) + { + UIUtils.MiniButtonTopMid.Draw( buttonRect, "R", false, false, m_previewChannels[ 0 ], false ); + buttonRect.x += 14 * drawInfo.InvertedZoom; + UIUtils.MiniButtonTopRight.Draw( buttonRect, "G", false, false, m_previewChannels[ 1 ], false ); + } + else if( m_channelNumber == 3 ) + { + UIUtils.MiniButtonTopMid.Draw( buttonRect, "R", false, false, m_previewChannels[ 0 ], false ); + buttonRect.x += 14 * drawInfo.InvertedZoom; + UIUtils.MiniButtonTopMid.Draw( buttonRect, "G", false, false, m_previewChannels[ 1 ], false ); + buttonRect.x += 14 * drawInfo.InvertedZoom; + UIUtils.MiniButtonTopRight.Draw( buttonRect, "B", false, false, m_previewChannels[ 2 ], false ); + } + else if( m_channelNumber == 4 ) + { + UIUtils.MiniButtonTopMid.Draw( buttonRect, "R", false, false, m_previewChannels[ 0 ], false ); + buttonRect.x += 14 * drawInfo.InvertedZoom; + UIUtils.MiniButtonTopMid.Draw( buttonRect, "G", false, false, m_previewChannels[ 1 ], false ); + buttonRect.x += 14 * drawInfo.InvertedZoom; + UIUtils.MiniButtonTopMid.Draw( buttonRect, "B", false, false, m_previewChannels[ 2 ], false ); + buttonRect.x += 14 * drawInfo.InvertedZoom; + UIUtils.MiniButtonTopRight.Draw( buttonRect, "A", false, false, m_previewChannels[ 3 ], false ); + } + } + } + + public void SetTimedUpdate( double timerInterval ) + { + m_timedUpdateInitialValue = EditorApplication.timeSinceStartup; + m_timedUpdateInterval = timerInterval; + m_fireTimedUpdateRequest = true; + } + + public virtual void FireTimedUpdate() { } + /// + /// + /// + /// + public virtual void OnNodeLogicUpdate( DrawInfo drawInfo ) + { + if( m_fireTimedUpdateRequest && ( EditorApplication.timeSinceStartup - m_timedUpdateInitialValue ) > m_timedUpdateInterval ) + { + m_fireTimedUpdateRequest = false; + FireTimedUpdate(); + } + + if( m_repopulateDictionaries ) + { + m_repopulateDictionaries = false; + + m_inputPortsDict.Clear(); + int inputCount = m_inputPorts.Count; + for( int i = 0; i < inputCount; i++ ) + { + m_inputPortsDict.Add( m_inputPorts[ i ].PortId, m_inputPorts[ i ] ); + } + + m_outputPortsDict.Clear(); + int outputCount = m_outputPorts.Count; + for( int i = 0; i < outputCount; i++ ) + { + m_outputPortsDict.Add( m_outputPorts[ i ].PortId, m_outputPorts[ i ] ); + } + } + } + + /// + /// This method should only be called to calculate layouts of elements to be draw later, only runs once per frame and before wires are drawn + /// + /// + public virtual void OnNodeLayout( DrawInfo drawInfo ) + { + + if( ContainerGraph.ChangedLightingModel ) + { + m_sizeIsDirty = true; + m_firstPreviewDraw = true; + } + + if( m_firstDraw ) + { + m_firstDraw = false; + AfterCommonInit(); + OnNodeChange(); + } + + if( m_previousErrorMessage != m_showErrorMessage ) + { + m_sizeIsDirty = true; + } + + if( m_sizeIsDirty ) + { + m_sizeIsDirty = false; + ChangeSize(); + } + + CalculatePositionAndVisibility( drawInfo ); + + m_unscaledRemainingBox = m_position; + m_remainingBox = m_globalPosition; + + m_lastInputBottomRight = m_position.position; + m_lastOutputBottomLeft = m_position.position; + m_lastOutputBottomLeft.x += m_position.width; + + m_visibleInputs = 0; + m_visibleOutputs = 0; + + if( m_hasSubtitle ) + m_extraHeaderHeight = (int)Constants.NODE_HEADER_EXTRA_HEIGHT; + else + m_extraHeaderHeight = 0; + + m_lastInputBottomRight.y += UIUtils.HeaderMaxHeight + m_extraHeaderHeight; + m_lastOutputBottomLeft.y += UIUtils.HeaderMaxHeight + m_extraHeaderHeight; + m_unscaledRemainingBox.y += UIUtils.HeaderMaxHeight + m_extraHeaderHeight; + + if( m_isVisible ) + { + // Header + m_headerPosition = m_globalPosition; + m_headerPosition.height = UIUtils.CurrentHeaderHeight + m_extraHeaderHeight * drawInfo.InvertedZoom; + + // Title + m_titlePos = m_globalPosition; + m_titlePos.height = m_headerPosition.height; + if( m_hasSubtitle ) + m_titlePos.yMin += ( 4 * drawInfo.InvertedZoom ); + else + m_titlePos.yMin += ( 7 * drawInfo.InvertedZoom ); + m_titlePos.width -= ( m_paddingTitleLeft + m_paddingTitleRight ) * drawInfo.InvertedZoom; + m_titlePos.x += m_paddingTitleLeft * drawInfo.InvertedZoom; + + // Additional Title + if( m_hasSubtitle ) + { + m_addTitlePos = m_titlePos; + m_addTitlePos.y = m_globalPosition.y; + m_addTitlePos.yMin += ( 19 * drawInfo.InvertedZoom ); + } + + // Left Dropdown + if( m_hasLeftDropdown && ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD4 ) + { + m_dropdownRect = m_headerPosition; + m_dropdownRect.width = Constants.NodeButtonSizeX * drawInfo.InvertedZoom; + m_dropdownRect.x = m_globalPosition.x + ( Constants.IconsLeftRightMargin + 1 ) * drawInfo.InvertedZoom; + m_dropdownRect.height = Constants.NodeButtonSizeY * drawInfo.InvertedZoom; + m_dropdownRect.y = m_globalPosition.y + m_headerPosition.height * 0.5f - 14 * drawInfo.InvertedZoom * 0.5f; + } + + // Expander + if( m_drawPreviewExpander && ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD4 ) + { + m_expandRect = m_globalPosition; + m_expandRect.width = Constants.PreviewExpanderWidth * drawInfo.InvertedZoom; + m_expandRect.x = m_globalPosition.x + m_globalPosition.width - ( Constants.IconsLeftRightMargin + Constants.PreviewExpanderWidth ) * drawInfo.InvertedZoom; //titlePos.x + titlePos.width; + m_expandRect.height = Constants.PreviewExpanderHeight * drawInfo.InvertedZoom; + m_expandRect.y = m_globalPosition.y + m_headerPosition.height * 0.5f - Constants.PreviewExpanderHeight * drawInfo.InvertedZoom * 0.5f; + } + } + + if( m_anchorAdjust < 0 ) + { + m_anchorAdjust = UIUtils.GetCustomStyle( CustomStyle.PortEmptyIcon ).normal.background.width; + } + + m_unscaledRemainingBox.y += Constants.INPUT_PORT_DELTA_Y; + m_lastOutputBottomLeft.y += Constants.INPUT_PORT_DELTA_Y; + m_lastInputBottomRight.y += Constants.INPUT_PORT_DELTA_Y; + + // Input Ports + { + m_currInputPortPos = m_globalPosition; + m_currInputPortPos.width = drawInfo.InvertedZoom * UIUtils.PortsSize.x; + m_currInputPortPos.height = drawInfo.InvertedZoom * UIUtils.PortsSize.y; + + m_currInputPortPos.x += drawInfo.InvertedZoom * Constants.PORT_INITIAL_X; + m_currInputPortPos.y += drawInfo.InvertedZoom * Constants.PORT_INITIAL_Y + m_extraHeaderHeight * drawInfo.InvertedZoom; + int inputCount = m_inputPorts.Count; + + float initialX = m_lastInputBottomRight.x; + + for( int i = 0; i < inputCount; i++ ) + { + if( m_inputPorts[ i ].Visible ) + { + m_visibleInputs++; + // Button + m_inputPorts[ i ].Position = m_currInputPortPos; + + // Label + m_inputPorts[ i ].LabelPosition = m_currInputPortPos; + float deltaX = 1f * drawInfo.InvertedZoom * ( UIUtils.PortsSize.x + Constants.PORT_TO_LABEL_SPACE_X ); + m_auxRect = m_inputPorts[ i ].LabelPosition; + m_auxRect.x += deltaX; + m_inputPorts[ i ].LabelPosition = m_auxRect; + + //if( m_inputPorts[ i ].DirtyLabelSize || m_inputPorts[ i ].LabelSize == Vector2.zero ) + //{ + // m_inputPorts[ i ].DirtyLabelSize = false; + // m_sizeContentAux.text = m_inputPorts[ i ].Name; + // m_inputPorts[ i ].UnscaledLabelSize = UIUtils.UnZoomedInputPortStyle.CalcSize( m_sizeContentAux ); + //} + + m_inputPorts[ i ].LabelSize = m_inputPorts[ i ].UnscaledLabelSize * drawInfo.InvertedZoom; + + m_lastInputBottomRight.x = Mathf.Max( m_lastInputBottomRight.x, initialX + m_inputPorts[ i ].UnscaledLabelSize.x + Constants.PORT_INITIAL_X + Constants.PORT_TO_LABEL_SPACE_X + UIUtils.PortsSize.x ); + + if( !m_inputPorts[ i ].Locked ) + { + float overflow = 2; + float scaledOverflow = 4 * drawInfo.InvertedZoom; + m_auxRect = m_currInputPortPos; + m_auxRect.yMin -= scaledOverflow + overflow; + m_auxRect.yMax += scaledOverflow + overflow; + m_auxRect.xMin -= Constants.PORT_INITIAL_X * drawInfo.InvertedZoom + scaledOverflow + overflow; + if( m_containerGraph.ParentWindow.WireReferenceUtils.OutputPortReference.IsValid ) + m_auxRect.xMax += m_inputPorts[ i ].LabelSize.x + Constants.PORT_TO_LABEL_SPACE_X * drawInfo.InvertedZoom + scaledOverflow + overflow; + else + m_auxRect.xMax += Constants.PORT_TO_LABEL_SPACE_X * drawInfo.InvertedZoom + scaledOverflow + overflow; + m_inputPorts[ i ].ActivePortArea = m_auxRect; + } + m_currInputPortPos.y += drawInfo.InvertedZoom * ( m_fontHeight + Constants.INPUT_PORT_DELTA_Y ); + //GUI.Label( m_inputPorts[ i ].ActivePortArea, string.Empty, UIUtils.Box ); + } + } + if( m_visibleInputs > 0 ) + m_lastInputBottomRight.y += m_fontHeight * m_visibleInputs + Constants.INPUT_PORT_DELTA_Y * ( m_visibleInputs - 1 ); + } + + // Output Ports + { + m_currOutputPortPos = m_globalPosition; + m_currOutputPortPos.width = drawInfo.InvertedZoom * UIUtils.PortsSize.x; + m_currOutputPortPos.height = drawInfo.InvertedZoom * UIUtils.PortsSize.y; + + m_currOutputPortPos.x += ( m_globalPosition.width - drawInfo.InvertedZoom * ( Constants.PORT_INITIAL_X + m_anchorAdjust ) ); + m_currOutputPortPos.y += drawInfo.InvertedZoom * Constants.PORT_INITIAL_Y + m_extraHeaderHeight * drawInfo.InvertedZoom; + int outputCount = m_outputPorts.Count; + + float initialX = m_lastOutputBottomLeft.x; + + for( int i = 0; i < outputCount; i++ ) + { + if( m_outputPorts[ i ].Visible ) + { + m_visibleOutputs++; + //Button + m_outputPorts[ i ].Position = m_currOutputPortPos; + + // Label + m_outputPorts[ i ].LabelPosition = m_currOutputPortPos; + float deltaX = 1f * drawInfo.InvertedZoom * ( UIUtils.PortsSize.x + Constants.PORT_TO_LABEL_SPACE_X ); + m_auxRect = m_outputPorts[ i ].LabelPosition; + m_auxRect.x -= deltaX; + m_outputPorts[ i ].LabelPosition = m_auxRect; + + m_outputPorts[ i ].LabelSize = m_outputPorts[ i ].UnscaledLabelSize * drawInfo.InvertedZoom; + + m_lastOutputBottomLeft.x = Mathf.Min( m_lastOutputBottomLeft.x, initialX - m_outputPorts[ i ].UnscaledLabelSize.x - Constants.PORT_INITIAL_X - Constants.PORT_TO_LABEL_SPACE_X - UIUtils.PortsSize.x ); + + if( !m_outputPorts[ i ].Locked ) + { + float overflow = 2; + float scaledOverflow = 4 * drawInfo.InvertedZoom; + m_auxRect = m_currOutputPortPos; + m_auxRect.yMin -= scaledOverflow + overflow; + m_auxRect.yMax += scaledOverflow + overflow; + if( m_containerGraph.ParentWindow.WireReferenceUtils.InputPortReference.IsValid ) + m_auxRect.xMin -= m_outputPorts[ i ].LabelSize.x + Constants.PORT_TO_LABEL_SPACE_X * drawInfo.InvertedZoom + scaledOverflow + overflow; + else + m_auxRect.xMin -= Constants.PORT_TO_LABEL_SPACE_X * drawInfo.InvertedZoom + scaledOverflow + overflow; + m_auxRect.xMax += Constants.PORT_INITIAL_X * drawInfo.InvertedZoom + scaledOverflow + overflow; + m_outputPorts[ i ].ActivePortArea = m_auxRect; + } + m_currOutputPortPos.y += drawInfo.InvertedZoom * ( m_fontHeight + Constants.INPUT_PORT_DELTA_Y ); + //GUI.Label( m_outputPorts[ i ].ActivePortArea, string.Empty, UIUtils.Box ); + } + } + if( m_visibleOutputs > 0 ) + m_lastOutputBottomLeft.y += m_fontHeight * m_visibleOutputs + Constants.INPUT_PORT_DELTA_Y * ( m_visibleOutputs - 1 ); + } + + m_lastInputBottomRight.x += m_marginPreviewLeft; + + //Vector2 scaledLastOutputBottomLeft = ( m_lastOutputBottomLeft + drawInfo.CameraOffset ) * drawInfo.InvertedZoom; + //GUI.Label( new Rect( scaledLastOutputBottomLeft, Vector2.one * 2 ), string.Empty, UIUtils.CurrentWindow.CustomStylesInstance.Box ); + + m_unscaledRemainingBox.xMin = m_lastInputBottomRight.x; + //m_unscaledRemainingBox.yMin = m_lastInputBottomRight.y; + m_unscaledRemainingBox.xMax = m_lastOutputBottomLeft.x; + m_unscaledRemainingBox.yMax = Mathf.Max( m_lastOutputBottomLeft.y, m_lastInputBottomRight.y ); + + m_remainingBox.position = ( m_unscaledRemainingBox.position + drawInfo.CameraOffset ) * drawInfo.InvertedZoom; + m_remainingBox.size = m_unscaledRemainingBox.size * drawInfo.InvertedZoom; + + //GUI.Label( m_remainingBox, string.Empty, UIUtils.Box ); + + if( m_visibleInputs == 0 ) + { + m_remainingBox.x += Constants.PORT_INITIAL_X * drawInfo.InvertedZoom; + m_remainingBox.width -= Constants.PORT_INITIAL_X * drawInfo.InvertedZoom; + } + + if( m_visibleOutputs == 0 ) + { + m_remainingBox.width -= Constants.PORT_INITIAL_X * drawInfo.InvertedZoom; + } + + if( ContainerGraph.ParentWindow.GlobalPreview != m_globalShowPreview ) + { + m_globalShowPreview = ContainerGraph.ParentWindow.GlobalPreview; + m_sizeIsDirty = true; + ContainerGraph.ParentWindow.RequestRepaint(); + } + + // Generate Proper Preview Rect + float marginAround = 10; + float scaledMarginAround = marginAround * drawInfo.InvertedZoom; + float previewSize = 128; + PreviewLocation m_autoLocation = m_selectedLocation; + if( m_selectedLocation == PreviewLocation.Auto ) + { + if( m_visibleOutputs > m_visibleInputs ) + { + m_autoLocation = PreviewLocation.Left; + } + else if( m_visibleOutputs < m_visibleInputs ) + { + m_autoLocation = PreviewLocation.Right; + } + else if( m_unscaledRemainingBox.width > previewSize ) + { + m_autoLocation = PreviewLocation.TopCenter; + } + else + { + m_autoLocation = PreviewLocation.BottomCenter; + } + } + + if( m_canExpand && ( m_showPreview || m_globalShowPreview ) ) + { + if( m_autoLocation == PreviewLocation.TopCenter ) + { + m_unscaledPreviewRect.y = m_unscaledRemainingBox.y; + m_unscaledPreviewRect.x = m_unscaledRemainingBox.center.x - 0.5f * ( previewSize + 2 * marginAround ); + } + else if( m_autoLocation == PreviewLocation.BottomCenter ) + { + m_unscaledPreviewRect.y = Mathf.Max( m_lastOutputBottomLeft.y, m_lastInputBottomRight.y ); + m_unscaledPreviewRect.x = m_position.x + 0.5f * m_position.width - 0.5f * ( previewSize + 2 * marginAround ); + } + else if( m_autoLocation == PreviewLocation.Left ) + { + m_unscaledPreviewRect.y = m_lastInputBottomRight.y; + m_unscaledPreviewRect.x = m_position.x; + } + else if( m_autoLocation == PreviewLocation.Right ) + { + m_unscaledPreviewRect.y = m_lastOutputBottomLeft.y; + m_unscaledPreviewRect.x = m_lastInputBottomRight.x; + } + if( m_autoLocation == PreviewLocation.BottomCenter ) + m_unscaledPreviewRect.height = previewSize + 2 * marginAround; + else if( m_autoLocation == PreviewLocation.TopCenter ) + m_unscaledPreviewRect.height = previewSize + marginAround; + else + m_unscaledPreviewRect.height = previewSize + ( m_visibleInputs > 0 && m_visibleOutputs > 0 ? 2 * marginAround : marginAround ); + m_unscaledPreviewRect.width = previewSize + 2 * marginAround; + + m_previewRect = m_unscaledPreviewRect; + m_previewRect.position = ( m_previewRect.position + drawInfo.CameraOffset ) * drawInfo.InvertedZoom; + m_auxVector2.Set( previewSize * drawInfo.InvertedZoom, previewSize * drawInfo.InvertedZoom ); + m_previewRect.size = m_auxVector2; + + if( m_autoLocation == PreviewLocation.BottomCenter ) + { + m_auxVector2.Set( m_previewRect.position.x + scaledMarginAround, m_previewRect.position.y + scaledMarginAround ); + m_previewRect.position = m_auxVector2; + } + else if( m_autoLocation == PreviewLocation.TopCenter ) + { + m_auxVector2.Set( m_previewRect.position.x + scaledMarginAround, m_previewRect.position.y ); + m_previewRect.position = m_auxVector2; + } + else + { + m_previewRect.position += new Vector2( scaledMarginAround, ( m_visibleInputs > 0 && m_visibleOutputs > 0 ? scaledMarginAround : 0 ) ); + } + } + + // Adjust node rect after preview + if( m_firstPreviewDraw ) + { + m_firstPreviewDraw = false; + ContainerGraph.ParentWindow.RequestRepaint(); + if( m_canExpand && ( m_showPreview || m_globalShowPreview ) ) + { + if( m_autoLocation == PreviewLocation.TopCenter ) + { + float fillWidth = m_unscaledRemainingBox.width - m_unscaledPreviewRect.width; + m_extraSize.x = Mathf.Max( -fillWidth, 0 ); + float fillHeight = m_position.yMax - m_unscaledPreviewRect.yMax; + m_extraSize.y = Mathf.Max( -fillHeight, 0 ); + } + if( m_autoLocation == PreviewLocation.BottomCenter ) + { + float fillWidth = m_position.width - m_unscaledPreviewRect.width; + m_extraSize.x = Mathf.Max( -fillWidth, 0 ); + float fillHeight = m_position.yMax - m_unscaledPreviewRect.yMax; + m_extraSize.y = Mathf.Max( -fillHeight, 0 ); + } + else if( m_autoLocation == PreviewLocation.Left ) + { + float fillWidth = m_lastOutputBottomLeft.x - m_unscaledPreviewRect.xMax; + m_extraSize.x = Mathf.Max( -fillWidth, 0 ); + float fillHeight = m_position.yMax - m_unscaledPreviewRect.yMax; + m_extraSize.y = Mathf.Max( -fillHeight, 0 ); + } + else if( m_autoLocation == PreviewLocation.Right ) + { + float fillWidth = m_position.xMax - m_unscaledPreviewRect.xMax; + m_extraSize.x = Mathf.Max( -fillWidth, 0 ); + float fillHeight = m_position.yMax - m_unscaledPreviewRect.yMax; + m_extraSize.y = Mathf.Max( -fillHeight, 0 ); + } + + if( m_showErrorMessage ) + m_extraSize.y += 24; + } + else if( m_canExpand ) + { + m_extraSize.y = 0; + m_extraSize.x = 0; + } + + m_position.width = m_unpreviewedPosition.width + m_extraSize.x; + m_position.height = m_unpreviewedPosition.height + m_extraSize.y; + } + + + if( m_showErrorMessage ) + { + m_errorBox = m_globalPosition; + m_errorBox.y = ( m_globalPosition.yMax - 28 * drawInfo.InvertedZoom ) + 3 * drawInfo.InvertedZoom; + m_errorBox.height = 25 * drawInfo.InvertedZoom; + } + + m_previousErrorMessage = m_showErrorMessage; + } + + /// + /// This method should only be called to draw elements, runs once per frame and after wires are drawn + /// + /// + public virtual void OnNodeRepaint( DrawInfo drawInfo ) + { + if( !m_isVisible ) + return; + + m_colorBuffer = GUI.color; + // Background + GUI.color = m_infiniteLoopDetected ? Constants.InfiniteLoopColor : Constants.NodeBodyColor; + if( m_useSquareNodeTitle || ContainerGraph.LodLevel >= ParentGraph.NodeLOD.LOD2 ) + GUI.Label( m_globalPosition, string.Empty, UIUtils.NodeWindowOffSquare ); + else + GUI.Label( m_globalPosition, string.Empty, UIUtils.GetCustomStyle( CustomStyle.NodeWindowOff ) ); + + // Header + //GUI + GUI.color = m_headerColor * m_headerColorModifier; + if( m_useSquareNodeTitle || ContainerGraph.LodLevel >= ParentGraph.NodeLOD.LOD2 ) + GUI.Label( m_headerPosition, string.Empty, UIUtils.NodeHeaderSquare ); + else + GUI.Label( m_headerPosition, string.Empty, UIUtils.GetCustomStyle( CustomStyle.NodeHeader ) ); + GUI.color = m_colorBuffer; + + // Title + DrawTitle( m_titlePos ); + + // Additional Tile + if( m_hasSubtitle && ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD3 ) + GUI.Label( m_addTitlePos, m_additionalContent, UIUtils.GetCustomStyle( CustomStyle.PropertyValuesTitle ) ); + + // Dropdown + if( m_hasLeftDropdown && !m_dropdownEditing && ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD4 ) + GUI.Label( m_dropdownRect, string.Empty, UIUtils.PropertyPopUp ); + + // Expander + if( m_drawPreviewExpander && ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD4 ) + GUI.Label( m_expandRect, string.Empty, ( m_showPreview ? UIUtils.PreviewCollapser : UIUtils.PreviewExpander ) ); + + // Input Ports + int inputCount = m_inputPorts.Count; + + for( int i = 0; i < inputCount; i++ ) + { + if( m_inputPorts[ i ].Visible ) + { + // Input Port Icon + if( ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD4 ) + { + if( m_inputPorts[ i ].Locked ) + GUI.color = Constants.LockedPortColor; + else if( ContainerGraph.ParentWindow.Options.ColoredPorts ) + GUI.color = UIUtils.GetColorForDataType( m_inputPorts[ i ].DataType, false, true ); + else + GUI.color = m_inputPorts[ i ].HasCustomColor ? m_inputPorts[ i ].CustomColor : UIUtils.GetColorForDataType( m_inputPorts[ i ].DataType, true, true ); + + GUIStyle style = m_inputPorts[ i ].IsConnected ? UIUtils.GetCustomStyle( CustomStyle.PortFullIcon ) : UIUtils.GetCustomStyle( CustomStyle.PortEmptyIcon ); + GUI.Label( m_inputPorts[ i ].Position, string.Empty, style ); + + GUI.color = m_colorBuffer; + } + + // Input Port Label + if( ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD3 ) + { + if( m_inputPorts[ i ].Locked ) + { + GUI.color = Constants.PortLockedTextColor; + GUI.Label( m_inputPorts[ i ].LabelPosition, m_inputPorts[ i ].Name, UIUtils.InputPortLabel ); + GUI.color = m_colorBuffer; + } + else + { + if( m_containerGraph.ParentWindow.GlobalShowInternalData && !m_inputPorts[ i ].IsConnected && UIUtils.InternalDataOnPort.fontSize > 1f && ( m_inputPorts[ i ].AutoDrawInternalData || ( m_autoDrawInternalPortData && m_useInternalPortData ) ) && m_inputPorts[ i ].DisplayInternalData.Length > 4 && ( ( m_inputPorts[ i ].DataType >= WirePortDataType.FLOAT && m_inputPorts[ i ].DataType <= WirePortDataType.INT ) || m_inputPorts[ i ].DataType == WirePortDataType.UINT ) ) + { + GUI.color = Constants.NodeBodyColor/* * new Color( 1f, 1f, 1f, 0.75f )*/; + Rect internalBox = m_inputPorts[ i ].LabelPosition; + m_sizeContentAux.text = m_inputPorts[ i ].DisplayInternalData; + Vector2 portText = UIUtils.InternalDataOnPort.CalcSize( m_sizeContentAux ); + internalBox.width = portText.x; + internalBox.height = portText.y; + internalBox.y = m_inputPorts[ i ].LabelPosition.center.y - internalBox.height * 0.5f; + internalBox.x = GlobalPosition.x - internalBox.width - 4 * drawInfo.InvertedZoom - 1; + Rect backBox = new Rect( internalBox ); + backBox.xMin -= 4 * drawInfo.InvertedZoom; + backBox.xMax += 4 * drawInfo.InvertedZoom; + backBox.yMin -= 2 * drawInfo.InvertedZoom; + backBox.yMax += 2 * drawInfo.InvertedZoom; + GUI.Label( backBox, string.Empty, UIUtils.InternalDataBackground ); + GUI.color *= new Color( 1f, 1f, 1f, 0.5f ); + GUI.Label( internalBox, m_sizeContentAux, UIUtils.InternalDataOnPort ); + GUI.color = m_colorBuffer; + } + GUI.Label( m_inputPorts[ i ].LabelPosition, m_inputPorts[ i ].Name, UIUtils.InputPortLabel ); + } + } + } + } + + // Output Ports + int outputCount = m_outputPorts.Count; + for( int i = 0; i < outputCount; i++ ) + { + if( m_outputPorts[ i ].Visible ) + { + // Output Port Icon + if( ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD4 ) + { + if( m_outputPorts[ i ].Locked ) + GUI.color = Constants.LockedPortColor; + else if( ContainerGraph.ParentWindow.Options.ColoredPorts ) + GUI.color = UIUtils.GetColorForDataType( m_outputPorts[ i ].DataType, false, false ); + else + GUI.color = m_outputPorts[ i ].HasCustomColor ? m_outputPorts[ i ].CustomColor : UIUtils.GetColorForDataType( m_outputPorts[ i ].DataType, true, false ); + + GUIStyle style = m_outputPorts[ i ].IsConnected ? UIUtils.GetCustomStyle( CustomStyle.PortFullIcon ) : UIUtils.GetCustomStyle( CustomStyle.PortEmptyIcon ); + GUI.Label( m_outputPorts[ i ].Position, string.Empty, style ); + + GUI.color = m_colorBuffer; + } + + // Output Port Label + if( ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD3 ) + { + if( m_outputPorts[ i ].Locked ) + { + GUI.color = Constants.PortLockedTextColor; + GUI.Label( m_outputPorts[ i ].LabelPosition, m_outputPorts[ i ].Name, UIUtils.OutputPortLabel ); + GUI.color = m_colorBuffer; + } + else + { + GUI.Label( m_outputPorts[ i ].LabelPosition, m_outputPorts[ i ].Name, UIUtils.OutputPortLabel ); + } + } + } + } + + // Preview + if( ( m_showPreview || m_globalShowPreview ) && m_drawPreview ) + DrawPreview( drawInfo, m_previewRect ); + + // Error and Warning bottom message + if( m_showErrorMessage ) + { + GUI.color = new Color( 0.0f, 0.0f, 0.0f, 0.5f ); + GUI.Label( m_errorBox, string.Empty, UIUtils.Separator ); + GUI.color = m_colorBuffer; + + switch( m_errorMessageTypeIsError ) + { + default: + case NodeMessageType.Error: + { + m_errorMessage.text = ErrorTitle; + m_errorIcon.image = UIUtils.SmallErrorIcon; + m_errorCurrentStyle = UIUtils.BoldErrorStyle; + } + break; + case NodeMessageType.Warning: + { + m_errorMessage.text = WarningTitle; + m_errorIcon.image = UIUtils.SmallWarningIcon; + m_errorCurrentStyle = UIUtils.BoldWarningStyle; + } + break; + case NodeMessageType.Info: + { + m_errorMessage.text = InfoTitle; + m_errorIcon.image = UIUtils.SmallInfoIcon; + m_errorCurrentStyle = UIUtils.BoldInfoStyle; + } + break; + } + + Rect textBox = m_errorBox; + textBox.y += 1 * drawInfo.InvertedZoom; + textBox.height = 24 * drawInfo.InvertedZoom; + + float textWidth = m_errorCurrentStyle.CalcSize( m_errorMessage ).x; + + GUI.Label( textBox, m_errorMessage, m_errorCurrentStyle ); + textBox.x -= textWidth * 0.5f + 12 * drawInfo.InvertedZoom; + GUI.Label( textBox, m_errorIcon, m_errorCurrentStyle ); + textBox.x += textWidth + 24 * drawInfo.InvertedZoom; + GUI.Label( textBox, m_errorIcon, m_errorCurrentStyle ); + } + + // Selection Box + if( m_selected ) + { + GUI.color = Constants.NodeSelectedColor; + if( m_useSquareNodeTitle || ContainerGraph.LodLevel >= ParentGraph.NodeLOD.LOD2 ) + GUI.Label( m_globalPosition, string.Empty, UIUtils.NodeWindowOnSquare ); + else + GUI.Label( m_globalPosition, string.Empty, UIUtils.GetCustomStyle( CustomStyle.NodeWindowOn ) ); + GUI.color = m_colorBuffer; + } + + // Debug Visualizers + //if( FinishPreviewRender || m_continuousPreviewRefresh ) + //{ + // GUI.color = new Color( 0, 1, 0.5f, 1f ); + // Rect r = m_globalPosition; + // r.width = 8; + // r.height = 8; + // r.x -= 5 * drawInfo.InvertedZoom; + // r.y -= 5 * drawInfo.InvertedZoom; + // GUI.Label( r, string.Empty, UIUtils.GetCustomStyle( CustomStyle.PortFullIcon ) ); + // GUI.color = m_colorBuffer; + // FinishPreviewRender = false; + //} + //GUI.Label( m_remainingBox, string.Empty, UIUtils.Box ); + } + + public bool DropdownEditing { get { return m_dropdownEditing; } set { m_dropdownEditing = value; PreviewIsDirty = true; } } + /// + /// Handles gui controls, runs before node layout + /// + /// + public virtual void DrawGUIControls( DrawInfo drawInfo ) + { + if( !m_initialized ) + return; + + if( !m_isVisible ) + return; + + if( drawInfo.CurrentEventType == EventType.MouseDown && drawInfo.LeftMouseButtonPressed ) + { + if( m_expandRect.Contains( drawInfo.MousePosition ) ) + { + m_showPreview = !m_showPreview; + m_sizeIsDirty = true; + ContainerGraph.ParentWindow.MouseInteracted = true; + } + + if( m_hasLeftDropdown && m_dropdownRect.Contains( drawInfo.MousePosition ) ) + { + m_dropdownEditing = true; + } + else if( m_dropdownEditing ) + { + DropdownEditing = false; + } + } + + DrawGuiPorts( drawInfo ); + } + + //public static bool MyRepeatButton( DrawInfo drawInfo, Rect position, string text, GUIStyle style ) + //{ + // if(/* drawInfo.CurrentEventType == EventType.MouseDown &&*/ position.Contains( drawInfo.MousePosition ) ) + // { + // UIUtils.CurrentWindow.MouseInteracted = true; + // return true; + // } + // return false; + //} + + public void DrawGuiPorts( DrawInfo drawInfo ) + { + if( !m_initialized ) + return; + + if( !m_isVisible ) + return; + + if( drawInfo.CurrentEventType == EventType.MouseDown ) + { + int inputCount = m_inputPorts.Count; + int outputCount = m_outputPorts.Count; + + for( int i = 0; i < inputCount; i++ ) + { + if( m_inputPorts[ i ].Visible && !m_inputPorts[ i ].Locked && m_isVisible && m_inputPorts[ i ].ActivePortArea.Contains( drawInfo.MousePosition ) && drawInfo.LeftMouseButtonPressed ) + { + UIUtils.CurrentWindow.MouseInteracted = true; + m_inputPorts[ i ].Click(); + // need to put the mouse button on a hot state so it will detect the Mouse Up event correctly on the Editor Window + int controlID = GUIUtility.GetControlID( FocusType.Passive ); + //int controlID = GUIUtility.GetControlID( "repeatButton".GetHashCode(), FocusType.Passive, m_inputPorts[ i ].ActivePortArea ); + GUIUtility.hotControl = controlID; + + bool saveReference = true; + if( m_inputPorts[ i ].IsConnected ) + { + double doubleTapTime = EditorApplication.timeSinceStartup; + bool doubleTap = ( doubleTapTime - m_doubleClickTimestamp ) < DoubleClickTime; + m_doubleClickTimestamp = doubleTapTime; + + if( doubleTap ) + { + m_containerGraph.DeleteConnection( true, UniqueId, m_inputPorts[ i ].PortId, true, true ); + Event.current.Use(); + } + else + //if ( AppyModifierToPort( _inputPorts[ i ], true ) ) + //{ + //saveReference = false; + //} + if( !ApplyModifierToPort( m_inputPorts[ i ], true ) ) + { + UIUtils.ShowContextOnPick = false; + PickInput( m_inputPorts[ i ] ); + } + saveReference = false; + } + + if( saveReference && !m_containerGraph.ParentWindow.WireReferenceUtils.InputPortReference.IsValid ) + //if ( !modifierApplied && !UIUtils.InputPortReference.IsValid ) + { + m_containerGraph.ParentWindow.WireReferenceUtils.SetInputReference( m_uniqueId, m_inputPorts[ i ].PortId, m_inputPorts[ i ].DataType, m_inputPorts[ i ].TypeLocked ); + } + + IsDirty = true; + inputCount = m_inputPorts.Count; + } + } + + for( int i = 0; i < outputCount; i++ ) + { + if( m_outputPorts[ i ].Visible && m_outputPorts[ i ].ActivePortArea.Contains( drawInfo.MousePosition ) && drawInfo.LeftMouseButtonPressed ) + { + UIUtils.CurrentWindow.MouseInteracted = true; + m_outputPorts[ i ].Click(); + // need to put the mouse button on a hot state so it will detect the Mouse Up event correctly on the Editor Window + int controlID = GUIUtility.GetControlID( FocusType.Passive ); + //int controlID = GUIUtility.GetControlID( "aseRepeatButton".GetHashCode(), FocusType.Passive, m_outputPorts[ i ].ActivePortArea ); + GUIUtility.hotControl = controlID; + + bool saveReference = true; + if( m_outputPorts[ i ].IsConnected ) + { + if( ApplyModifierToPort( m_outputPorts[ i ], false ) ) + { + saveReference = false; + } + } + + if( saveReference && !m_containerGraph.ParentWindow.WireReferenceUtils.OutputPortReference.IsValid ) + { + m_containerGraph.ParentWindow.WireReferenceUtils.SetOutputReference( m_uniqueId, m_outputPorts[ i ].PortId, m_outputPorts[ i ].DataType, false ); + } + + IsDirty = true; + outputCount = m_outputPorts.Count; + } + } + } + + //Preview buttons + if( m_drawPreviewMaskButtons && ( drawInfo.CurrentEventType == EventType.MouseDown || drawInfo.CurrentEventType == EventType.MouseUp ) ) + DrawPreviewMaskButtonsLayout( drawInfo, m_previewRect ); + } + + /// + /// Can be used to draw an entire node, runs after wires + /// + /// + public virtual void Draw( DrawInfo drawInfo ) + { + if( !m_initialized ) + return; + + if( drawInfo.CurrentEventType == EventType.Repaint ) + OnNodeRepaint( drawInfo ); + } + + public virtual void SetPreviewInputs() + { + if( !HasPreviewShader || !m_initialized ) + return; + + int count = m_inputPorts.Count; + for( int i = 0; i < count; i++ ) + { + if( m_inputPorts[ i ].IsConnected && m_inputPorts[ i ].InputNodeHasPreview( ContainerGraph ) ) + { + m_inputPorts[ i ].SetPreviewInputTexture( ContainerGraph ); + } + else + { + m_inputPorts[ i ].SetPreviewInputValue( ContainerGraph ); + } + } + } + + + public bool SafeDraw( DrawInfo drawInfo ) + { + EditorGUI.BeginChangeCheck(); + Draw( drawInfo ); + if( EditorGUI.EndChangeCheck() ) + { + SaveIsDirty = true; + return true; + } + return false; + } + + public bool ShowTooltip( DrawInfo drawInfo ) + { + if( string.IsNullOrEmpty( m_tooltipText ) ) + return false; + + if( m_globalPosition.Contains( drawInfo.MousePosition ) || m_linkVisibility ) + { + if( m_tooltipTimestamp + 0.6f < Time.realtimeSinceStartup || m_linkVisibility ) + { + bool errorTooltip = false; + if( m_showErrorMessage && m_errorBox.Contains( drawInfo.MousePosition ) && !string.IsNullOrEmpty( m_errorMessageTooltip ) ) + errorTooltip = true; + + Rect globalTooltipPos = m_globalPosition; + GUIContent temp = new GUIContent( errorTooltip ? m_errorMessageTooltip : m_tooltipText ); + UIUtils.TooltipBox.wordWrap = false; + Vector2 optimal = UIUtils.TooltipBox.CalcSize( temp ); + if( optimal.x > 300f ) + { + UIUtils.TooltipBox.wordWrap = true; + optimal.x = 300f; + optimal.y = UIUtils.TooltipBox.CalcHeight( temp, 300f ); + } + + globalTooltipPos.width = Mathf.Max( 120, optimal.x ); + globalTooltipPos.height = optimal.y; + globalTooltipPos.center = m_globalPosition.center; + + if( !errorTooltip && m_hasTooltipLink ) + globalTooltipPos.height += 16; + + if( errorTooltip ) + globalTooltipPos.y = 10 + m_globalPosition.yMax; + else + globalTooltipPos.y = m_globalPosition.yMin - 10 - globalTooltipPos.height; + + if ( globalTooltipPos.x < 10 ) + globalTooltipPos.x = 10; + + if( globalTooltipPos.x + globalTooltipPos.width > Screen.width - 10 ) + globalTooltipPos.x = Screen.width - globalTooltipPos.width - 10; + + //UNCOMMENT this for auto adjust tooltip to the top window box + //if( globalTooltipPos.y < 40 ) + // globalTooltipPos.y = 40; + + if( errorTooltip && globalTooltipPos.y + globalTooltipPos.height > Screen.height - 32 ) + globalTooltipPos.y = Screen.height - 32 - globalTooltipPos.height; + + GUI.Label( globalTooltipPos, temp, UIUtils.TooltipBox ); + + if( !errorTooltip && m_hasTooltipLink ) + { + Rect link = globalTooltipPos; + link.y = globalTooltipPos.yMax - 16; + link.height = 16; + link.width = 86; + link.x = globalTooltipPos.center.x - 43; + Rect hover = globalTooltipPos; + hover.yMax += 15;// m_globalPosition.yMax; + m_linkVisibility = hover.Contains( drawInfo.MousePosition ); + if( link.Contains( drawInfo.MousePosition ) ) + { + if( drawInfo.CurrentEventType == EventType.MouseDown ) + { + if( m_tooltipTimestamp + 1.25f < Time.realtimeSinceStartup ) + { + Application.OpenURL( Attributes.NodeUrl ); + } + } + else + { + UIUtils.MainSkin.customStyles[ 52 ].Draw( link, WikiLinkStr, true, false, false, false ); + } + } + else + { + GUI.Label( link, WikiLinkStr, UIUtils.MainSkin.customStyles[ 52 ] ); + } + } + ContainerGraph.ParentWindow.RequestRepaint(); + return true; + } + } + else + { + if( !m_linkVisibility ) + m_tooltipTimestamp = Time.realtimeSinceStartup; + } + + return false; + } + + public virtual bool SafeDrawProperties() + { + EditorGUI.BeginChangeCheck(); + PreDrawProperties(); + if( m_autoWrapProperties ) + { + NodeUtils.DrawPropertyGroup( ref m_propertiesFoldout, Constants.ParameterLabelStr, DrawProperties ); + } + else + { + DrawProperties(); + } + if( EditorGUI.EndChangeCheck() ) + { + PreviewIsDirty = true; + //UIUtils.RecordObject(this); + //MarkForPreviewUpdate(); + return true; + } + return false; + } + + + public void PreDrawProperties() + { + if( m_useInternalPortData && m_autoDrawInternalPortData ) + { + DrawInternalDataGroup(); + } + } + + virtual public void DrawProperties() { } + + protected void DrawInternalDataGroup() + { + bool drawInternalDataUI = false; + int inputCount = m_inputPorts.Count; + if( inputCount > 0 ) + { + for( int i = 0; i < inputCount; i++ ) + { + if( m_inputPorts[ i ].Available && m_inputPorts[ i ].ValidInternalData && !m_inputPorts[ i ].IsConnected /*&& ( m_inputPorts[ i ].AutoDrawInternalData || ( m_autoDrawInternalPortData && m_useInternalPortData ) )*/ /*&& m_inputPorts[ i ].AutoDrawInternalData*/ ) + { + drawInternalDataUI = true; + break; + } + } + } + + if( drawInternalDataUI ) + NodeUtils.DrawPropertyGroup( ref m_internalDataFoldout, Constants.InternalDataLabelStr, () => + { + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + if( m_inputPorts[ i ].ValidInternalData && !m_inputPorts[ i ].IsConnected && m_inputPorts[ i ].Visible /*&& m_inputPorts[ i ].AutoDrawInternalData*/ ) + { + m_inputPorts[ i ].ShowInternalData( this ); + } + } + } ); + } + + protected void PickInput( InputPort port ) + { + WireReference connection = port.GetConnection( 0 ); + OutputPort from = port.GetOutputConnection( 0 ); + + m_containerGraph.ParentWindow.WireReferenceUtils.OutputPortReference.SetReference( from.NodeId, from.PortId, from.DataType, connection.TypeLocked ); + m_containerGraph.DeleteConnection( true, UniqueId, port.PortId, true, true ); + //TODO: check if not necessary + Event.current.Use(); + IsDirty = true; + SetSaveIsDirty(); + } + + protected bool ApplyModifierToPort( WirePort port, bool isInput ) + { + bool modifierApplied = false; + switch( Event.current.modifiers ) + { + case EventModifiers.Alt: + { + m_containerGraph.DeleteConnection( isInput, UniqueId, port.PortId, true, true ); + modifierApplied = true; + m_containerGraph.ParentWindow.InvalidateAlt(); + } + break; + case EventModifiers.Control: + { + //WireReference connection = port.GetConnection( 0 ); + //if ( isInput ) + //{ + // UIUtils.OutputPortReference.SetReference( connection.NodeId, connection.PortId, connection.DataType, connection.TypeLocked ); + //} + //else + //{ + // UIUtils.InputPortReference.SetReference( connection.NodeId, connection.PortId, connection.DataType, connection.TypeLocked ); + //} + + //UIUtils.DeleteConnection( isInput, UniqueId, port.PortId, true ); + //modifierApplied = true; + + if( !isInput ) + { + WireReference connection = port.GetConnection( 0 ); + m_containerGraph.ParentWindow.WireReferenceUtils.InputPortReference.SetReference( connection.NodeId, connection.PortId, connection.DataType, connection.TypeLocked ); + m_containerGraph.DeleteConnection( isInput, UniqueId, port.PortId, true, true ); + modifierApplied = true; + } + } + break; + } + + if( isInput ) + m_containerGraph.ParentWindow.WireReferenceUtils.SwitchPortReference.SetReference( port.NodeId, port.PortId, port.DataType, false ); //always save last connection + else + m_containerGraph.ParentWindow.WireReferenceUtils.SwitchPortReference.SetReference( -1, -1, WirePortDataType.OBJECT, false ); //invalidate connection + + if( modifierApplied ) + { + Event.current.Use(); + IsDirty = true; + SetSaveIsDirty(); + } + return modifierApplied; + } + + public void DeleteAllInputConnections( bool alsoDeletePorts , bool inhibitWireNodeAutoDel = false ) + { + int count = m_inputPorts.Count; + for( int i = 0; i < count; i++ ) + { + if( m_inputPorts[ i ].IsConnected ) + { + ParentNode connNode = null; + if( inhibitWireNodeAutoDel ) + { + connNode = m_inputPorts[ i ].GetOutputNode(); + connNode.Alive = false; + } + m_containerGraph.DeleteConnection( true, UniqueId, m_inputPorts[ i ].PortId, false, true ); + if( inhibitWireNodeAutoDel ) + { + connNode.Alive = true; + } + } + + } + if( alsoDeletePorts ) + { + m_inputPorts.Clear(); + m_inputPortsDict.Clear(); + } + SetSaveIsDirty(); + } + + public void DeleteAllOutputConnections( bool alsoDeletePorts ) + { + int count = m_outputPorts.Count; + for( int i = 0; i < count; i++ ) + { + if( m_outputPorts[ i ].IsConnected ) + m_containerGraph.DeleteConnection( false, UniqueId, m_outputPorts[ i ].PortId, false, true ); + } + + if( alsoDeletePorts ) + { + m_outputPorts.Clear(); + m_outputPortsDict.Clear(); + } + SetSaveIsDirty(); + } + + public void DeleteInputPortByArrayIdx( int arrayIdx ) + { + if( arrayIdx >= m_inputPorts.Count ) + return; + + m_containerGraph.DeleteConnection( true, UniqueId, m_inputPorts[ arrayIdx ].PortId, false, true ); + m_inputPortsDict.Remove( m_inputPorts[ arrayIdx ].PortId ); + m_inputPorts.RemoveAt( arrayIdx ); + + m_sizeIsDirty = true; + SetSaveIsDirty(); + RecalculateInputPortIdx(); + } + + public void DeleteOutputPortByArrayIdx( int portIdx ) + { + if( portIdx >= m_outputPorts.Count ) + return; + + m_containerGraph.DeleteConnection( false, UniqueId, m_outputPorts[ portIdx ].PortId, false, true ); + m_outputPortsDict.Remove( m_outputPorts[ portIdx ].PortId ); + m_outputPorts.RemoveAt( portIdx ); + m_sizeIsDirty = true; + } + + public InputPort GetInputPortByArrayId( int id ) + { + if( id < m_inputPorts.Count ) + return m_inputPorts[ id ]; + + return null; + } + + public OutputPort GetOutputPortByArrayId( int id ) + { + if( id < m_outputPorts.Count ) + return m_outputPorts[ id ]; + + return null; + } + + public InputPort GetInputPortByUniqueId( int id ) + { + if( m_inputPortsDict.ContainsKey( id ) ) + return m_inputPortsDict[ id ]; + + if( m_inputPortsDict.Count != m_inputPorts.Count ) + m_repopulateDictionaries = true; + + int inputCount = m_inputPorts.Count; + for( int i = 0; i < inputCount; i++ ) + { + if( m_inputPorts[ i ].PortId == id ) + { + return m_inputPorts[ i ]; + } + } + return null; + } + + public OutputPort GetOutputPortByUniqueId( int id ) + { + if( m_outputPortsDict.ContainsKey( id ) ) + return m_outputPortsDict[ id ]; + + if( m_outputPortsDict.Count != m_outputPorts.Count ) + m_repopulateDictionaries = true; + + int outputCount = m_outputPorts.Count; + for( int i = 0; i < outputCount; i++ ) + { + if( m_outputPorts[ i ].PortId == id ) + return m_outputPorts[ i ]; + } + return null; + } + + public virtual void AfterDuplication(){} + + public override string ToString() + { + string dump = ""; + dump += ( "Type: " + GetType() ); + dump += ( " Unique Id: " + UniqueId + "\n" ); + dump += ( " Inputs: \n" ); + + int inputCount = m_inputPorts.Count; + int outputCount = m_outputPorts.Count; + + for( int inputIdx = 0; inputIdx < inputCount; inputIdx++ ) + { + dump += ( m_inputPorts[ inputIdx ] + "\n" ); + } + dump += ( "Outputs: \n" ); + for( int outputIdx = 0; outputIdx < outputCount; outputIdx++ ) + { + dump += ( m_outputPorts[ outputIdx ] + "\n" ); + } + return dump; + } + + public string GetValueFromOutputStr( int outputId, WirePortDataType inputPortType, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( ignoreLocalvar ) + { + return GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + } + OutputPort outPort = GetOutputPortByUniqueId( outputId ); + if( outPort.IsLocalValue( dataCollector.PortCategory ) ) + { + if( outPort.DataType != WirePortDataType.OBJECT && outPort.DataType != inputPortType ) + { + return UIUtils.CastPortType( ref dataCollector, CurrentPrecisionType, new NodeCastInfo( m_uniqueId, outputId ), null, outPort.DataType, inputPortType, outPort.LocalValue( dataCollector.PortCategory ) ); + } + else + { + return outPort.LocalValue( dataCollector.PortCategory ); + } + } + + string result = GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + result = CreateOutputLocalVariable( outputId, result, ref dataCollector ); + + if( outPort.DataType != WirePortDataType.OBJECT && outPort.DataType != inputPortType ) + { + result = UIUtils.CastPortType( ref dataCollector, CurrentPrecisionType, new NodeCastInfo( m_uniqueId, outputId ), null, outPort.DataType, inputPortType, result ); + } + return result; + } + + public virtual string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.IsSRP ) + { + switch( dataCollector.CurrentSRPType ) + { + case TemplateSRPType.HD: if(OnHDAction!=null) OnHDAction( outputId, ref dataCollector ); break; + case TemplateSRPType.Lightweight:if(OnLightweightAction != null) OnLightweightAction( outputId, ref dataCollector ); break; + } + } + return string.Empty; + } + + public string GenerateValueInVertex( ref MasterNodeDataCollector dataCollector, WirePortDataType dataType, string dataValue, string dataName, bool createInterpolator ) + { + + if( !dataCollector.IsFragmentCategory ) + return dataValue; + + //TEMPLATES + if( dataCollector.IsTemplate ) + { + if( createInterpolator && dataCollector.TemplateDataCollectorInstance.HasCustomInterpolatedData( dataName ) ) + return dataName; + + MasterNodePortCategory category = dataCollector.PortCategory; + dataCollector.PortCategory = MasterNodePortCategory.Vertex; + + dataCollector.PortCategory = category; + + if( createInterpolator ) + { + dataCollector.TemplateDataCollectorInstance.RegisterCustomInterpolatedData( dataName, dataType, CurrentPrecisionType, dataValue ); + } + else + { + dataCollector.AddToVertexLocalVariables( -1, CurrentPrecisionType, dataType, dataName, dataValue ); + } + + return dataName; + } + + //SURFACE + { + if( dataCollector.TesselationActive ) + { + UIUtils.ShowMessage( UniqueId, "Unable to use Vertex to Frag when Tessellation is active" ); + return m_outputPorts[ 0 ].ErrorValue; + } + + if( createInterpolator ) + dataCollector.AddToInput( UniqueId, dataName, dataType, CurrentPrecisionType ); + + MasterNodePortCategory portCategory = dataCollector.PortCategory; + dataCollector.PortCategory = MasterNodePortCategory.Vertex; + if( createInterpolator ) + { + dataCollector.AddLocalVariable( UniqueId, Constants.VertexShaderOutputStr + "." + dataName, dataValue + ";" ); + } + else + { + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, dataType, dataName, dataValue ); + } + dataCollector.PortCategory = portCategory; + return createInterpolator ? Constants.InputVarStr + "." + dataName : dataName; + } + } + + public string GenerateInputInVertex( ref MasterNodeDataCollector dataCollector , int inputPortUniqueId , string varName , bool createInterpolator , bool noInterpolationFlag = false , bool sampleFlag = false ) + { + InputPort inputPort = GetInputPortByUniqueId( inputPortUniqueId ); + if( !dataCollector.IsFragmentCategory) + return inputPort.GeneratePortInstructions( ref dataCollector ); + + //TEMPLATES + if( dataCollector.IsTemplate ) + { + if( createInterpolator && dataCollector.TemplateDataCollectorInstance.HasCustomInterpolatedData( varName ) ) + return varName; + + MasterNodePortCategory category = dataCollector.PortCategory; + dataCollector.PortCategory = MasterNodePortCategory.Vertex; + //bool dirtyVertexVarsBefore = dataCollector.DirtyVertexVariables; + //ContainerGraph.ResetNodesLocalVariablesIfNot( this, MasterNodePortCategory.Vertex ); + + string data = inputPort.GeneratePortInstructions( ref dataCollector ); + + dataCollector.PortCategory = category; + //if( !dirtyVertexVarsBefore && dataCollector.DirtyVertexVariables ) + //{ + // dataCollector.AddVertexInstruction( dataCollector.VertexLocalVariablesFromList, UniqueId, false ); + // dataCollector.ClearVertexLocalVariables(); + // ContainerGraph.ResetNodesLocalVariablesIfNot( this, MasterNodePortCategory.Vertex ); + //} + + //ContainerGraph.ResetNodesLocalVariablesIfNot( this, MasterNodePortCategory.Fragment ); + + if( createInterpolator ) + { + dataCollector.TemplateDataCollectorInstance.RegisterCustomInterpolatedData( varName, inputPort.DataType, CurrentPrecisionType, data,true,MasterNodePortCategory.Fragment,noInterpolationFlag,sampleFlag ); + } + else + { + dataCollector.AddToVertexLocalVariables( -1, CurrentPrecisionType, inputPort.DataType, varName, data ); + } + + return varName; + } + + //SURFACE + { + if( dataCollector.TesselationActive ) + { + UIUtils.ShowMessage( UniqueId, "Unable to use Vertex to Frag when Tessellation is active" ); + return m_outputPorts[ 0 ].ErrorValue; + } + + if( createInterpolator ) + dataCollector.AddToInput( UniqueId, varName, inputPort.DataType, CurrentPrecisionType ); + + MasterNodePortCategory portCategory = dataCollector.PortCategory; + dataCollector.PortCategory = MasterNodePortCategory.Vertex; + + //bool dirtyVertexVarsBefore = dataCollector.DirtyVertexVariables; + + //ContainerGraph.ResetNodesLocalVariablesIfNot( this, MasterNodePortCategory.Vertex ); + + string vertexVarValue = inputPort.GeneratePortInstructions( ref dataCollector ); + if( createInterpolator ) + { + dataCollector.AddLocalVariable( UniqueId, Constants.VertexShaderOutputStr + "." + varName, vertexVarValue + ";" ); + } + else + { + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, inputPort.DataType, varName, vertexVarValue ); + } + + dataCollector.PortCategory = portCategory; + + //if( !dirtyVertexVarsBefore && dataCollector.DirtyVertexVariables ) + //{ + // dataCollector.AddVertexInstruction( dataCollector.VertexLocalVariables, UniqueId, false ); + // dataCollector.ClearVertexLocalVariables(); + // ContainerGraph.ResetNodesLocalVariablesIfNot( this, MasterNodePortCategory.Vertex ); + //} + + //ContainerGraph.ResetNodesLocalVariablesIfNot( this, MasterNodePortCategory.Fragment ); + + return createInterpolator ? Constants.InputVarStr + "." + varName : varName; + } + } + + + protected virtual void OnUniqueIDAssigned() { } + + public string CreateOutputLocalVariable( int outputArrayId, string value, ref MasterNodeDataCollector dataCollector ) + { + OutputPort port = GetOutputPortByUniqueId( outputArrayId ); + + if( port.IsLocalValue( dataCollector.PortCategory ) ) + return port.LocalValue( dataCollector.PortCategory ); + + if( port.ConnectionCount > 1 ) + { + RegisterLocalVariable( outputArrayId, value, ref dataCollector ); + return port.LocalValue( dataCollector.PortCategory ); + } + else + { + // revisit later (break to components case) + port.SetLocalValue( value, dataCollector.PortCategory ); + } + + return value; + } + + public void RegisterLocalVariable( int outputArrayId, string value, ref MasterNodeDataCollector dataCollector, string customName = null ) + { + OutputPort port = GetOutputPortByUniqueId( outputArrayId ); + if( (int)port.DataType >= (int)( 1 << 10 ) || port.DataType == WirePortDataType.OBJECT ) //10 is the flag start of sampler types + { + port.SetLocalValue( value, dataCollector.PortCategory ); + return; + } + + bool vertexMode = dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation; + string localVar = port.ConfigOutputLocalValue( CurrentPrecisionType, value, customName, dataCollector.PortCategory ); + + if( vertexMode ) + { + dataCollector.AddToVertexLocalVariables( m_uniqueId, localVar ); + } + else + { + dataCollector.AddToLocalVariables( m_uniqueId, localVar ); + } + } + + public void InvalidateConnections() + { + int inputCount = m_inputPorts.Count; + int outputCount = m_outputPorts.Count; + + for( int i = 0; i < inputCount; i++ ) + { + m_inputPorts[ i ].InvalidateAllConnections(); + } + + for( int i = 0; i < outputCount; i++ ) + { + m_outputPorts[ i ].InvalidateAllConnections(); + } + } + + public virtual bool OnClick( Vector2 currentMousePos2D ) + { + bool singleClick = true; + if( ( EditorApplication.timeSinceStartup - m_lastTimeSelected ) < NodeClickTime ) + { + OnNodeDoubleClicked( currentMousePos2D ); + singleClick = false; + } + + m_lastTimeSelected = EditorApplication.timeSinceStartup; + return singleClick; + } + + public virtual void OnNodeDoubleClicked( Vector2 currentMousePos2D ) + { + ContainerGraph.ParentWindow.ParametersWindow.IsMaximized = !ContainerGraph.ParentWindow.ParametersWindow.IsMaximized; + } + + public virtual void OnNodeSelected( bool value ) + { + if( !value ) + { + if( m_inputPorts != null ) + { + int count = m_inputPorts.Count; + for( int i = 0; i < count; i++ ) + { + m_inputPorts[ i ].ResetEditing(); + } + } + + if( m_outputPorts != null ) + { + int count = m_outputPorts.Count; + for( int i = 0; i < count; i++ ) + { + m_outputPorts[ i ].ResetEditing(); + } + } + } + } + + public void ResetOutputLocals() + { + int outputCount = m_outputPorts.Count; + for( int i = 0; i < outputCount; i++ ) + { + m_outputPorts[ i ].ResetLocalValue(); + } + } + + + public void ResetOutputLocalsIfNot( MasterNodePortCategory category ) + { + int outputCount = m_outputPorts.Count; + for( int i = 0; i < outputCount; i++ ) + { + //if( !m_outputPorts[ i ].IsLocalOnCategory( category ) ) + // m_outputPorts[ i ].ResetLocalValue(); + m_outputPorts[ i ].ResetLocalValueIfNot( category ); + } + } + + public virtual void Rewire() { } + + //public virtual List NodeReferences { get { return null; } } + + public int UniqueId + { + get { return m_uniqueId; } + + set + { + m_uniqueId = value; + + int inputCount = m_inputPorts.Count; + int outputCount = m_outputPorts.Count; + + for( int inputIdx = 0; inputIdx < inputCount; inputIdx++ ) + { + m_inputPorts[ inputIdx ].NodeId = value; + } + + for( int outputIdx = 0; outputIdx < outputCount; outputIdx++ ) + { + m_outputPorts[ outputIdx ].NodeId = value; + } + OnUniqueIDAssigned(); + } + } + public void SetBaseUniqueId( int uniqueId, bool setOnPorts = false ) + { + m_uniqueId = uniqueId; + if( setOnPorts ) + { + int inputCount = m_inputPorts.Count; + int outputCount = m_outputPorts.Count; + + for( int inputIdx = 0; inputIdx < inputCount; inputIdx++ ) + { + m_inputPorts[ inputIdx ].NodeId = uniqueId; + } + + for( int outputIdx = 0; outputIdx < outputCount; outputIdx++ ) + { + m_outputPorts[ outputIdx ].NodeId = uniqueId; + } + } + } + + public string OutputId + { + get + { + if( ContainerGraph.GraphId > 0 ) + return UniqueId + "_g" + ContainerGraph.GraphId; + else + return UniqueId.ToString(); + } + } + + + public virtual Rect Position { get { return m_position; } } + public Rect TruePosition { get { return m_position; } } + + public Vector2 CenterPosition { get { return new Vector2( m_position.x + m_position.width * 0.5f, m_position.y + m_position.height * 0.5f ); ; } } + + public Rect GlobalPosition { get { return m_globalPosition; } } + + public Vector2 Corner { get { return new Vector2( m_position.x + m_position.width, m_position.y + m_position.height ); } } + public Vector2 Vec2Position + { + get { return new Vector2( m_position.x, m_position.y ); } + + set + { + m_position.x = value.x; + m_position.y = value.y; + } + } + + public Vector3 Vec3Position + { + get { return new Vector3( m_position.x, m_position.y, 0f ); } + + set + { + m_position.x = value.x; + m_position.y = value.y; + } + } + + + public bool Selected + { + get { return m_selected; } + set + { + m_infiniteLoopDetected = false; + m_selected = value; + OnNodeSelected( value ); + } + } + + public List InputPorts { get { return m_inputPorts; } } + + public List OutputPorts + { + get { return m_outputPorts; } + } + + public bool IsConnected { get { return m_connStatus == NodeConnectionStatus.Connected; } } + public NodeConnectionStatus ConnStatus + { + get { return m_connStatus; } + set + { + if( m_selfPowered ) + { + m_connStatus = NodeConnectionStatus.Connected; + } + else + { + m_connStatus = value; + } + + switch( m_connStatus ) + { + case NodeConnectionStatus.Island: + case NodeConnectionStatus.Not_Connected: m_statusColor = Constants.NodeDefaultColor; break; + case NodeConnectionStatus.Connected: m_statusColor = Constants.NodeConnectedColor; break; + case NodeConnectionStatus.Error: m_statusColor = Constants.NodeErrorColor; break; + } + + } + } + + public bool SelfPowered + { + set + { + m_selfPowered = value; + if( value ) + { + ConnStatus = NodeConnectionStatus.Connected; + } + } + } + + // This is also called when recording on Undo + public virtual void OnBeforeSerialize() { } + public virtual void OnAfterDeserialize() + { + m_selected = false; + m_isOnGrid = false; + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + m_inputPorts[ i ].ResetWireReferenceStatus(); + } + m_repopulateDictionaries = true; + m_sizeIsDirty = true; + } + + public virtual int InputIdFromDeprecated( int oldInputId ) { return oldInputId; } + + public virtual int OutputIdFromDeprecated( int oldOutputId ) { return oldOutputId; } + + public virtual void ReadFromDeprecated( ref string[] nodeParams, Type oldType = null ) { } + + //Inherited classes must call this base method in order to setup id and position + public virtual void ReadFromString( ref string[] nodeParams ) + { + ParentReadFromString( ref nodeParams ); + } + + public void ParentReadFromString( ref string[] nodeParams ) + { + m_currentReadParamIdx = IOUtils.NodeTypeId + 1; + + UniqueId = Convert.ToInt32( nodeParams[ m_currentReadParamIdx++ ] ); + + string[] posCoordinates = nodeParams[ m_currentReadParamIdx++ ].Split( IOUtils.VECTOR_SEPARATOR ); + + m_position.x = Convert.ToSingle( posCoordinates[ 0 ] ); + m_position.y = Convert.ToSingle( posCoordinates[ 1 ] ); + + if( UIUtils.CurrentShaderVersion() > 22 ) + { + string val = GetCurrentParam( ref nodeParams ); + if( m_customPrecision ) + { + if( val.Equals("Fixed") ) + m_currentPrecisionType = PrecisionType.Half; + else + m_currentPrecisionType = (PrecisionType)Enum.Parse( typeof( PrecisionType ), val ); + } + else + { + m_currentPrecisionType = PrecisionType.Inherit; + } + } + + if( UIUtils.CurrentShaderVersion() > 5004 ) + m_showPreview = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + + } + + //should be called after ReadFromString + public virtual void ReadInputDataFromString( ref string[] nodeParams ) + { + int count = 0; + if( UIUtils.CurrentShaderVersion() > 7003 ) + { + try + { + count = Convert.ToInt32( nodeParams[ m_currentReadParamIdx++ ] ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + else + { + count = ( m_oldInputCount < 0 ) ? m_inputPorts.Count : m_oldInputCount; + } + + for( int i = 0; i < count && i < nodeParams.Length && m_currentReadParamIdx < nodeParams.Length; i++ ) + { + if( UIUtils.CurrentShaderVersion() < 5003 ) + { + int newId = VersionConvertInputPortId( i ); + if( UIUtils.CurrentShaderVersion() > 23 ) + { + m_inputPorts[ newId ].DataType = (WirePortDataType)Enum.Parse( typeof( WirePortDataType ), nodeParams[ m_currentReadParamIdx++ ] ); + } + + m_inputPorts[ newId ].InternalData = nodeParams[ m_currentReadParamIdx++ ]; + if( m_inputPorts[ newId ].IsEditable && UIUtils.CurrentShaderVersion() >= 3100 && m_currentReadParamIdx < nodeParams.Length ) + { + m_inputPorts[ newId ].Name = nodeParams[ m_currentReadParamIdx++ ]; + } + m_inputPorts[ newId ].UpdatePreviewInternalData(); + } + else + { + string portIdStr = nodeParams[ m_currentReadParamIdx++ ]; + int portId = -1; + try + { + portId = Convert.ToInt32( portIdStr ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + + WirePortDataType DataType = (WirePortDataType)Enum.Parse( typeof( WirePortDataType ), nodeParams[ m_currentReadParamIdx++ ] ); + string InternalData = nodeParams[ m_currentReadParamIdx++ ]; + bool isEditable = Convert.ToBoolean( nodeParams[ m_currentReadParamIdx++ ] ); + string Name = string.Empty; + if( isEditable && m_currentReadParamIdx < nodeParams.Length ) + { + Name = nodeParams[ m_currentReadParamIdx++ ]; + } + + InputPort inputPort = GetInputPortByUniqueId( portId ); + if( inputPort != null ) + { + if( UIUtils.IsValidType( DataType ) ) + inputPort.DataType = DataType; + + inputPort.InternalData = InternalData; + if( !string.IsNullOrEmpty( Name ) ) + { + inputPort.Name = Name; + } + inputPort.UpdatePreviewInternalData(); + } + } + } + } + + public virtual void ReadOutputDataFromString( ref string[] nodeParams ) + { + int count = 0; + if( UIUtils.CurrentShaderVersion() > 7003 ) + { + count = Convert.ToInt32( nodeParams[ m_currentReadParamIdx++ ] ); + } + else + { + count = m_outputPorts.Count; + } + + for( int i = 0; i < count && i < nodeParams.Length && m_currentReadParamIdx < nodeParams.Length; i++ ) + { + try + { + WirePortDataType dataType = (WirePortDataType)Enum.Parse( typeof( WirePortDataType ), nodeParams[ m_currentReadParamIdx++ ] ); + int portId = -1; + if( UIUtils.CurrentShaderVersion() > 13903 ) + { + portId = Convert.ToInt32( nodeParams[ m_currentReadParamIdx++ ] ); ; + } + else + { + portId = i; + } + + OutputPort port = GetOutputPortByUniqueId( portId ); + if( port != null && UIUtils.IsValidType( dataType ) ) + { + port.DataType = dataType; + } + + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + } + + public virtual void ReadAdditionalClipboardData( ref string[] nodeParams ) { } + + protected string GetCurrentParam( ref string[] nodeParams ) + { + if( m_currentReadParamIdx < nodeParams.Length ) + { + return nodeParams[ m_currentReadParamIdx++ ]; + } + + UIUtils.ShowMessage( UniqueId, "Invalid params number in node " + m_uniqueId + " of type " + GetType(), MessageSeverity.Error ); + return string.Empty; + } + + protected string GetCurrentParam( int index, ref string[] nodeParams ) + { + if( m_currentReadParamIdx < nodeParams.Length ) + { + return nodeParams[ index ]; + } + + UIUtils.ShowMessage( UniqueId, "Invalid params number in node " + m_uniqueId + " of type " + GetType(), MessageSeverity.Error ); + return string.Empty; + } + + + public virtual void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + IOUtils.AddTypeToString( ref nodeInfo, IOUtils.NodeParam ); + IOUtils.AddFieldValueToString( ref nodeInfo, GetType() ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_uniqueId ); + IOUtils.AddFieldValueToString( ref nodeInfo, ( m_position.x.ToString() + IOUtils.VECTOR_SEPARATOR + m_position.y.ToString() ) ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_currentPrecisionType ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_showPreview ); + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + m_inputPorts[ i ].WriteToString( ref connectionsInfo ); + } + } + + public virtual void WriteInputDataToString( ref string nodeInfo ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_inputPorts.Count ); + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_inputPorts[ i ].PortId ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_inputPorts[ i ].DataType ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_inputPorts[ i ].InternalData ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_inputPorts[ i ].IsEditable ); + if( m_inputPorts[ i ].IsEditable ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_inputPorts[ i ].Name ); + } + } + } + + public void WriteOutputDataToString( ref string nodeInfo ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_outputPorts.Count ); + for( int i = 0; i < m_outputPorts.Count; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_outputPorts[ i ].DataType ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_outputPorts[ i ].PortId ); + } + } + + public virtual void WriteAdditionalClipboardData( ref string nodeInfo ) { } + + public virtual string GetIncludes() { return string.Empty; } + public virtual void OnObjectDropped( UnityEngine.Object obj ) { } + public virtual void SetupFromCastObject( UnityEngine.Object obj ) { } + public virtual bool OnNodeInteraction( ParentNode node ) { return false; } + public virtual void OnConnectedOutputNodeChanges( int portId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) { } + public virtual void OnConnectedInputNodeChanges( int portId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) { } + + public Rect CachedPos { get { return m_cachedPos; } } + + public bool IsOnGrid + { + set { m_isOnGrid = value; } + get { return m_isOnGrid; } + } + + public uint CurrentReadParamIdx + { + get { return m_currentReadParamIdx++; } + set { m_currentReadParamIdx = value; } + } + + public Dictionary InputPortsDict + { + get + { + Dictionary dict = new Dictionary(); + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + dict.Add( m_inputPorts[ i ].Name, m_inputPorts[ i ] ); + } + return dict; + } + } + + public bool IsDirty + { + set { m_isDirty = value && UIUtils.DirtyMask; } + get + { + bool value = m_isDirty; + m_isDirty = false; + return value; + } + } + + public virtual void ResetNodeData() + { + m_category = 0; + m_graphDepth = 0; + } + + public virtual void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + UIUtils.SetCategoryInBitArray( ref m_category, nodeData.Category ); + nodeData.GraphDepth += 1; + if( nodeData.GraphDepth > m_graphDepth ) + { + m_graphDepth = nodeData.GraphDepth; + } + int count = m_inputPorts.Count; + for( int i = 0; i < count; i++ ) + { + if( m_inputPorts[ i ].IsConnected ) + { + m_inputPorts[ i ].GetOutputNode().PropagateNodeData( nodeData, ref dataCollector ); + } + } + } + + public void SetTitleTextOnCallback( string compareTitle, Action callback ) + { + if( !m_previousTitle.Equals( compareTitle ) ) + { + m_previousTitle = compareTitle; + m_sizeIsDirty = true; + callback( this, compareTitle ); + } + } + + public void SetAdditonalTitleTextOnCallback( string compareTitle, Action callback ) + { + if( !m_previousAdditonalTitle.Equals( compareTitle ) ) + { + m_previousAdditonalTitle = compareTitle; + m_sizeIsDirty = true; + callback( this, compareTitle ); + } + } + + public virtual void SetClippedTitle( string newText, int maxSize = 170, string endString = "..." ) + { + m_content.text = GenerateClippedTitle( newText,maxSize,endString ); + m_sizeIsDirty = true; + } + + public virtual void SetClippedAdditionalTitle( string newText, int maxSize = 170, string endString = "..." ) + { + m_additionalContent.text = GenerateClippedTitle( newText, maxSize, endString ); + m_sizeIsDirty = true; + } + + + public void SetTitleText( string newText ) + { + if( !newText.Equals( m_content.text ) ) + { + m_content.text = newText; + m_sizeIsDirty = true; + } + } + + public void SetAdditonalTitleText( string newText ) + { + if( !newText.Equals( m_additionalContent.text ) ) + { + m_additionalContent.text = newText; + m_sizeIsDirty = true; + } + } + + public string GenerateErrorValue( int outputIdx = 0 ) + { + switch( m_outputPorts[ outputIdx ].DataType ) + { + case WirePortDataType.FLOAT2: + { + return "(0).xx"; + } + case WirePortDataType.FLOAT3: + { + return "(0).xxx"; + } + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: + { + return "(0).xxxx"; + } + } + return "0"; + } + + //Methods created to take into account new ports added on nodes newer versions + //This way we can convert connections from previous versions to newer ones and not brake shader graph + public virtual int VersionConvertInputPortId( int portId ) { return portId; } + public virtual int VersionConvertOutputPortId( int portId ) { return portId; } + + public virtual string DataToArray { get { return string.Empty; } } + + public bool SaveIsDirty + { + set { m_saveIsDirty = value && UIUtils.DirtyMask; } + get + { + bool value = m_saveIsDirty; + m_saveIsDirty = false; + return value; + } + } + + public GUIContent TitleContent { get { return m_content; } } + public GUIContent AdditonalTitleContent { get { return m_additionalContent; } } + public bool IsVisible { get { return m_isVisible; } } + public NodeAttributes Attributes { get { return m_nodeAttribs; } } + public bool ReorderLocked { get { return m_reorderLocked; } } + public bool RequireMaterialUpdate { get { return m_requireMaterialUpdate; } } + public bool RMBIgnore { get { return m_rmbIgnore; } } + public float TextLabelWidth { get { return m_textLabelWidth; } } + public bool IsMoving { get { return m_isMoving > 0; } } + public bool MovingInFrame { get { return m_movingInFrame; } set { m_movingInFrame = value; } } + public bool SizeIsDirty { get { return m_sizeIsDirty; } set { m_sizeIsDirty = value; } } + public int Category { get { return m_category; } } + public int CommentaryParent + { + get { return m_commentaryParent; } + set { m_commentaryParent = value; } + } + + public int Depth + { + get { return m_depth; } + set { m_depth = value; } + } + + public int MatrixId + { + get { return m_matrixId; } + set { m_matrixId = value; } + } + + public float PaddingTitleRight + { + get { return m_paddingTitleRight; } + set { m_paddingTitleRight += value; } + } + + public float PaddingTitleLeft + { + get { return m_paddingTitleLeft; } + set { m_paddingTitleLeft += value; } + } + + public int CachedPortsId + { + get + { + return m_cachedPortsId; + } + } + + public virtual bool RecursivePreviewUpdate( Dictionary duplicatesDict = null ) + { + if( duplicatesDict == null ) + { + duplicatesDict = ContainerGraph.ParentWindow.VisitedChanged; + } + + for( int i = 0; i < InputPorts.Count; i++ ) + { + ParentNode outNode = null; + if( InputPorts[ i ].ExternalReferences.Count > 0 ) + { + outNode = ContainerGraph.GetNode( InputPorts[ i ].ExternalReferences[ 0 ].NodeId ); + } + if( outNode != null ) + { + if( !duplicatesDict.ContainsKey( outNode.OutputId ) ) + { + bool result = outNode.RecursivePreviewUpdate(); + if( result ) + PreviewIsDirty = true; + } else if( duplicatesDict[ outNode.OutputId ] ) + { + PreviewIsDirty = true; + } + } + } + + bool needsUpdate = PreviewIsDirty; + RenderNodePreview(); + if( !duplicatesDict.ContainsKey( OutputId ) ) + duplicatesDict.Add( OutputId, needsUpdate ); + return needsUpdate; + } + + public virtual void RenderNodePreview() + { + //Runs at least one time + if( !HasPreviewShader || !m_initialized ) + { + // nodes with no preview don't update at all + PreviewIsDirty = false; + return; + } + + if( !PreviewIsDirty && !m_continuousPreviewRefresh ) + return; + + //Debug.Log( "PREVIEW " + this ); + + SetPreviewInputs(); + + if( m_cachedMainTexId == -1 ) + m_cachedMainTexId = Shader.PropertyToID( "_MainTex" ); + + if( m_cachedMaskTexId == -1 ) + m_cachedMaskTexId = Shader.PropertyToID( "_MaskTex" ); + + if( m_cachedPortsId == -1 ) + m_cachedPortsId = Shader.PropertyToID( "_Ports" ); + + if( m_cachedPortId == -1 ) + m_cachedPortId = Shader.PropertyToID( "_Port" ); + + int count = m_outputPorts.Count; + for( int i = 0; i < count; i++ ) + { + if( i == 0 ) + { + RenderTexture temp = RenderTexture.active; + RenderTexture beforeMask = RenderTexture.GetTemporary( PreviewWidth, PreviewHeight, 0, RenderTextureFormat.ARGBFloat, RenderTextureReadWrite.Linear ); + RenderTexture.active = beforeMask; + Graphics.Blit( null, beforeMask, PreviewMaterial, m_previewMaterialPassId ); + + m_portMask.Set( 0, 0, 0, 0 ); + + switch( m_outputPorts[ i ].DataType ) + { + case WirePortDataType.INT: + case WirePortDataType.FLOAT: + m_portMask.Set( 1, 1, 1, 1 ); + break; + case WirePortDataType.FLOAT2: + m_portMask.Set( 1, 1, 0, 0 ); + break; + case WirePortDataType.FLOAT3: + m_portMask.Set( 1, 1, 1, 0 ); + break; + case WirePortDataType.COLOR: + case WirePortDataType.FLOAT4: + m_portMask.Set( 1, 1, 1, 1 ); + break; + default: + m_portMask.Set( 1, 1, 1, 1 ); + break; + } + + if( m_outputPorts[ i ].DataType == WirePortDataType.FLOAT3x3 || m_outputPorts[ i ].DataType == WirePortDataType.FLOAT4x4 ) + { + m_outputPorts[ i ].MaskingMaterial.SetTexture( m_cachedMainTexId, EditorGUIUtility.whiteTexture ); + } + else + { + m_outputPorts[ i ].MaskingMaterial.SetTexture( m_cachedMainTexId, beforeMask ); + } + m_outputPorts[ i ].MaskingMaterial.SetVector( m_cachedPortsId, m_portMask ); + RenderTexture.active = m_outputPorts[ i ].OutputPreviewTexture; + Graphics.Blit( null, m_outputPorts[ i ].OutputPreviewTexture, m_outputPorts[ i ].MaskingMaterial, 0 ); + + RenderTexture.ReleaseTemporary( beforeMask ); + RenderTexture.active = temp; + } + else + { + RenderTexture temp = RenderTexture.active; + m_outputPorts[ i ].MaskingMaterial.SetTexture( m_cachedMaskTexId, PreviewTexture ); + m_outputPorts[ i ].MaskingMaterial.SetFloat( m_cachedPortId, i ); + + RenderTexture.active = m_outputPorts[ i ].OutputPreviewTexture; + Graphics.Blit( null, m_outputPorts[ i ].OutputPreviewTexture, m_outputPorts[ i ].MaskingMaterial, 1 ); + RenderTexture.active = temp; + } + } + + PreviewIsDirty = m_continuousPreviewRefresh; + + FinishPreviewRender = true; + } + + protected void ShowTab( NodeMessageType type, string tooltip ) + { + m_showErrorMessage = true; + m_errorMessageTypeIsError = type; + m_errorMessageTooltip = tooltip; + } + + protected void ShowTab() + { + m_showErrorMessage = true; + } + + protected void HideTab() + { + m_showErrorMessage = false; + } + + public virtual RenderTexture PreviewTexture + { + get + { + if( m_outputPorts.Count > 0 ) + return m_outputPorts[ 0 ].OutputPreviewTexture; + else + return null; + } + } + + public void FullWriteToString( ref string nodesInfo, ref string connectionsInfo ) + { + WriteToString( ref nodesInfo, ref connectionsInfo ); + WriteInputDataToString( ref nodesInfo ); + WriteOutputDataToString( ref nodesInfo ); + } + + public void ClipboardFullWriteToString( ref string nodesInfo, ref string connectionsInfo ) + { + FullWriteToString( ref nodesInfo, ref connectionsInfo ); + WriteAdditionalClipboardData( ref nodesInfo ); + } + + public void FullReadFromString( ref string[] parameters ) + { + try + { + ReadFromString( ref parameters ); + ReadInputDataFromString( ref parameters ); + ReadOutputDataFromString( ref parameters ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + + public void ClipboardFullReadFromString( ref string[] parameters ) + { + try + { + FullReadFromString( ref parameters ); + ReadAdditionalClipboardData( ref parameters ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + + public string GenerateClippedTitle( string original , int maxSize = 170, string endString = "..." ) + { + if( UIUtils.UnZoomedNodeTitleStyle == null ) + return original; + + GUIContent content = new GUIContent( original ); + + string finalTitle = string.Empty; + bool addEllipsis = false; + for( int i = 1; i <= original.Length; i++ ) + { + content.text = original.Substring( 0, i ); + Vector2 titleSize = UIUtils.UnZoomedNodeTitleStyle.CalcSize( content ); + if( titleSize.x > maxSize ) + { + addEllipsis = true; + break; + } + else + { + finalTitle = content.text; + } + } + if( addEllipsis ) + finalTitle += endString; + + return finalTitle; + } + + public virtual void RefreshOnUndo() { } + public virtual void CalculateCustomGraphDepth() { } + public int GraphDepth { get { return m_graphDepth; } } + + public PrecisionType CurrentPrecisionType { get { return m_currentPrecisionType == PrecisionType.Inherit ? ContainerGraph.CurrentPrecision : m_currentPrecisionType; } } + + + public Material PreviewMaterial + { + get + { + if( m_previewMaterial == null ) + { + m_previewMaterial = new Material( PreviewShader ); + } + return m_previewMaterial; + } + } + + public Shader PreviewShader + { + get + { + if( m_previewShader == null ) + { + m_previewShader = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( m_previewShaderGUID ) ); + } + + if( m_previewShader == null ) + { + m_previewShader = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "d9ca47581ac157145bff6f72ac5dd73e" ) ); //ranged float guid + } + + if( m_previewShader == null ) + m_previewShader = Shader.Find( "Unlit/Colored Transparent" ); + + return m_previewShader; + } + } + + public bool HasPreviewShader + { + get { return !string.IsNullOrEmpty( m_previewShaderGUID ); } + } + + public void CheckSpherePreview() + { + bool oneIsSphere = false; + + if( m_drawPreviewAsSphere ) + oneIsSphere = true; + int count = m_inputPorts.Count; + for( int i = 0; i < count; i++ ) + { + ParentNode node = null; + if( m_inputPorts[ i ].ExternalReferences.Count > 0) + { + node = ContainerGraph.GetNode( m_inputPorts[ i ].ExternalReferences[ 0 ].NodeId ); + } + if( node != null && node.SpherePreview ) + oneIsSphere = true; + } + + if( m_forceDrawPreviewAsPlane ) + oneIsSphere = false; + + SpherePreview = oneIsSphere; + } + + public bool SpherePreview + { + get { return m_spherePreview; } + set { m_spherePreview = value; } + } + + public bool ShowPreview + { + get { return m_showPreview; } + set { m_showPreview = value; } + } + + public int VisiblePorts + { + get { return m_visiblePorts; } + set { m_visiblePorts = value; } + } + + public bool Docking + { + get { return m_docking; } + set { m_docking = value; } + } + + public bool UseSquareNodeTitle + { + get { return m_useSquareNodeTitle; } + set { m_useSquareNodeTitle = value; } + } + + public bool InsideShaderFunction + { + get { return ContainerGraph != ContainerGraph.ParentWindow.CurrentGraph; } + } + + public virtual void SetContainerGraph( ParentGraph newgraph ) + { + m_containerGraph = newgraph; + } + public virtual void OnMasterNodeReplaced( MasterNode newMasterNode ) { } + public virtual void RefreshExternalReferences() { } + + public Rect DropdownRect { get { return m_dropdownRect; } } + + public virtual bool Contains( Vector2 pos ) { return m_globalPosition.Contains( pos ); } + public virtual bool Contains( Vector3 pos ) { return m_globalPosition.Contains( pos ); } + public bool IsNodeBeingCopied { get { return m_isNodeBeingCopied; } set { m_isNodeBeingCopied = value; } } + + public virtual WirePortDataType GetInputPortVisualDataTypeByArrayIdx( int portArrayIdx ) + { + return m_inputPorts[ portArrayIdx ].DataType; + } + + public virtual WirePortDataType GetOutputPortVisualDataTypeById( int portId ) + { + return GetOutputPortByUniqueId( portId ).DataType; + } + + + public virtual bool CheckFindText( string text ) + { + return TitleContent.text.IndexOf( text, StringComparison.CurrentCultureIgnoreCase ) >= 0; + } + + public virtual ParentNode ExecuteStubCode(){ return this; } + public virtual float HeightEstimate + { + get + { + float heightEstimate = 0; + heightEstimate = 32 + Constants.INPUT_PORT_DELTA_Y; + for( int i = 0; i < InputPorts.Count; i++ ) + { + if( InputPorts[ i ].Visible ) + heightEstimate += 18 + Constants.INPUT_PORT_DELTA_Y; + } + + return heightEstimate; + // Magic number 18 represents m_fontHeight that might not be set yet + //return Constants.NODE_HEADER_EXTRA_HEIGHT + Mathf.Max( 18 + m_inputPorts.Count, m_outputPorts.Count ) * Constants.INPUT_PORT_DELTA_Y; + } + } + public bool WasDeprecated { get { return m_wasDeprecated; } set { m_wasDeprecated = value; } } + public bool Alive { get { return m_alive;} set { m_alive = value; } } + public string TypeName { get { if( m_nodeAttribs != null ) return m_nodeAttribs.Name;return GetType().ToString(); } } + public bool PreviewIsDirty { set { m_previewIsDirty = value; } get { return m_previewIsDirty; } } + protected bool FinishPreviewRender { get { return m_finishPreviewRender; } set { m_finishPreviewRender = value; } } + public virtual bool IsStubNode { get { return false; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ParentNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ParentNode.cs.meta new file mode 100644 index 0000000..c3a66c8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ParentNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 33e0374f361d5c642a257b9957e4cfa0 +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ReordenatorNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ReordenatorNode.cs new file mode 100644 index 0000000..8bd85dc --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ReordenatorNode.cs @@ -0,0 +1,170 @@ +using UnityEngine; +using System; +using System.Collections; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class ReordenatorNode : PropertyNode + { + [SerializeField] + private List m_propertyList; + + [SerializeField] + private string m_headerTitle = string.Empty; + + [SerializeField] + private bool m_isInside; + + public ReordenatorNode() : base() + { + + } + + public void Init( string entryName, string entryInspectorName, List list, bool register = true ) + { + m_propertyName = entryName; + m_propertyInspectorName = entryInspectorName; + + m_propertyList = list; + + if( register ) + UIUtils.RegisterPropertyNode( this ); + } + + public override void Destroy() + { + base.Destroy(); + + m_propertyList.Clear(); + m_propertyList = null; + + UIUtils.UnregisterPropertyNode( this ); + } + + //public List PropertyList + //{ + // get { return m_propertyList; } + //} + + public int PropertyListCount + { + get { if ( m_propertyList != null ) return m_propertyList.Count; else return -1; } + } + + public string HeaderTitle { get { return m_headerTitle; } set { m_headerTitle = value; } } + + public bool HasTitle { get { return !string.IsNullOrEmpty( m_headerTitle ); } } + + public bool IsInside { get { return m_isInside; } set { m_isInside = value; } } + + public int RecursiveSetOrderOffset( int offset, bool lockit, int order = -1 ) + { + //Debug.Log( Locked + " " + PropertyName ); + + if ( Locked ) + return offset; + + if( order > -1 ) + OrderIndex = order; + + int currentOffset = offset; + + if( m_propertyList != null ) + m_propertyList.Sort( ( x, y ) => { return ( x as PropertyNode ).OrderIndex.CompareTo( ( y as PropertyNode ).OrderIndex ); } ); + + OrderIndexOffset = currentOffset - RawOrderIndex; + currentOffset++; + + if ( m_propertyList != null ) + for ( int i = 0; i < m_propertyList.Count; i++ ) + { + ReordenatorNode rnode = m_propertyList[ i ] as ReordenatorNode; + if ( rnode != null ) + { + currentOffset = rnode.RecursiveSetOrderOffset( currentOffset, false ); + } + else + { + PropertyNode pnode = m_propertyList[ i ] as PropertyNode; + { + pnode.OrderIndexOffset = currentOffset - pnode.RawOrderIndex;// + ( HasTitle ? 1 : 0 ); + } + currentOffset++; + } + } + + if ( lockit ) + Locked = true; + + return currentOffset; + } + + public int RecursiveCount() + { + int amount = 0; + if ( HasTitle ) + amount += 1; + for ( int i = 0; i < m_propertyList.Count; i++ ) + { + if ( ( m_propertyList[ i ] is ReordenatorNode ) ) + amount += ( m_propertyList[ i ] as ReordenatorNode ).RecursiveCount(); + else + amount +=1; + } + return amount; + } + + public void RecursiveLog() + { + Debug.LogWarning( OrderIndex+" HEADER "+ PropertyName ); + for( int i = 0; i < m_propertyList.Count; i++ ) + { + if( ( m_propertyList[ i ] is ReordenatorNode ) ) + ( m_propertyList[ i ] as ReordenatorNode ).RecursiveLog(); + else + Debug.Log( ( m_propertyList[ i ] as PropertyNode ).OrderIndex+" "+( m_propertyList[ i ] as PropertyNode).PropertyName ); + } + } + + public bool Locked = false; + + public void RecursiveClear() + { + Locked = false; + if( m_propertyList != null) + for ( int i = 0; i < m_propertyList.Count; i++ ) + { + ReordenatorNode renode = ( m_propertyList[ i ] as ReordenatorNode ); + if ( renode != null ) + { + renode.RecursiveClear(); + } + } + } + + public bool RecursiveConnectedProperties() + { + bool connected = false; + if ( m_propertyList != null ) + { + for ( int i = 0; i < m_propertyList.Count; i++ ) + { + ReordenatorNode renode = ( m_propertyList[ i ] as ReordenatorNode ); + if ( renode != null ) + { + bool temp = renode.RecursiveConnectedProperties(); + if( temp ) + connected = true; + } else + { + if ( ( m_propertyList[ i ] as PropertyNode ).IsConnected ) + connected = true; + } + } + } + return connected; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ReordenatorNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ReordenatorNode.cs.meta new file mode 100644 index 0000000..8dc5037 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/ReordenatorNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 91aad2b9cfaf3954c8c450c32d218981 +timeCreated: 1493053838 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SRP.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SRP.meta new file mode 100644 index 0000000..11d8b84 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SRP.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 7283c593c3b4be64e957cb2b91abe1af +folderAsset: yes +timeCreated: 1556618802 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SRP/BakedGINode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SRP/BakedGINode.cs new file mode 100644 index 0000000..7a67f48 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SRP/BakedGINode.cs @@ -0,0 +1,107 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +#if UNITY_2018_3_OR_NEWER +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "SRP Baked GI", "Miscellaneous", "Gets Baked GI info." )] + public sealed class BakedGINode : ParentNode + { + private const string HDBakedGIHeader = "ASEBakedGI( {0}, {1}, {2}, {3} )"; + private readonly string[] HDBakedGIBody = + { + "float3 ASEBakedGI( float3 positionWS, float3 normalWS, float2 uvStaticLightmap, float2 uvDynamicLightmap )\n", + "{\n", + "\tfloat3 positionRWS = GetCameraRelativePositionWS( positionWS );\n", + "\treturn SampleBakedGI( positionRWS, normalWS, uvStaticLightmap, uvDynamicLightmap );\n", + "}\n" + }; + + private readonly string LWBakedGIHeader = "ASEBakedGI( {0}, {1}, {2})"; + private readonly string[] LWBakedGIBody = + { + "float3 ASEBakedGI( float3 normalWS, float2 uvStaticLightmap, bool applyScaling )\n", + "{\n", + "#ifdef LIGHTMAP_ON\n", + "\tif( applyScaling )\n", + "\t\tuvStaticLightmap = uvStaticLightmap * unity_LightmapST.xy + unity_LightmapST.zw;\n", + "\treturn SampleLightmap( uvStaticLightmap, normalWS );\n", + "#else\n", + "\treturn SampleSH(normalWS);\n", + "#endif\n", + "}\n" + }; + + private const string ApplyScalingStr = "Apply Scaling"; + + [SerializeField] + private bool m_applyScaling = true; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT3, false, "World Position" ); + AddInputPort( WirePortDataType.FLOAT3, false, "World Normal" ); + AddInputPort( WirePortDataType.FLOAT2, false, "Static UV" ); + AddInputPort( WirePortDataType.FLOAT2, false, "Dynamic UV" ); + AddOutputPort( WirePortDataType.FLOAT3, Constants.EmptyPortValue ); + m_textLabelWidth = 95; + m_autoWrapProperties = true; + } + + public override void DrawProperties() + { + base.DrawProperties(); + m_applyScaling = EditorGUILayoutToggle( ApplyScalingStr, m_applyScaling ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( !dataCollector.IsSRP ) + { + UIUtils.ShowMessage( "Node only intended to use on HD and Lightweight rendering pipelines" ); + return GenerateErrorValue(); + } + + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string positionWS = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string normalWS = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + string uvStaticLightmap = m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector ); + string uvDynamicLightmap = m_inputPorts[ 3 ].GeneratePortInstructions( ref dataCollector ); + string localVarName = "bakedGI" + OutputId; + + if( dataCollector.TemplateDataCollectorInstance.IsHDRP ) + { + dataCollector.AddFunction( HDBakedGIBody[ 0 ], HDBakedGIBody, false ); + RegisterLocalVariable( 0, string.Format( HDBakedGIHeader, positionWS, normalWS, uvStaticLightmap, uvDynamicLightmap ), ref dataCollector, localVarName ); + } + else + { + dataCollector.AddFunction( LWBakedGIBody[ 0 ], LWBakedGIBody, false ); + RegisterLocalVariable( 0, string.Format( LWBakedGIHeader, normalWS, uvStaticLightmap, m_applyScaling?"true":"false" ), ref dataCollector, localVarName ); + } + return localVarName; + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_applyScaling = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_applyScaling ); + } + + + } +} +#endif diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SRP/BakedGINode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SRP/BakedGINode.cs.meta new file mode 100644 index 0000000..e988a13 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SRP/BakedGINode.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6aacdecbe4e41f44988580058f7e0000 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SRP/MaterialQualityNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SRP/MaterialQualityNode.cs new file mode 100644 index 0000000..b172193 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SRP/MaterialQualityNode.cs @@ -0,0 +1,85 @@ +// Amplify Shader Editor - Visual Shader vEditing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [NodeAttributes( "Material Quality", "Logical Operators", "Choose between separate branches according to currently selected Quality (SRP only) ", Available = true )] + public class MaterialQualityNode : ParentNode + { + private const string SRPError = "Node intended to be used only on SRP templates as it makes use of keywords defined over that environment."; + + private const string MaxKeyword = "MATERIAL_QUALITY_HIGH"; + private const string MedKeyword = "MATERIAL_QUALITY_MEDIUM"; + private const string MinKeyword = "MATERIAL_QUALITY_LOW"; + private const string MaterialPragmas = "#pragma shader_feature " + MaxKeyword + " " + MedKeyword + " " + MinKeyword; + private readonly string[] MaterialCode = + { + "#if defined("+MaxKeyword+")", + "#elif defined("+MedKeyword+")", + "#else", + "#endif" + }; + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, "High" ); + AddInputPort( WirePortDataType.FLOAT, false, "Medium" ); + AddInputPort( WirePortDataType.FLOAT, false, "Low" ); + AddOutputPort( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + m_errorMessageTypeIsError = NodeMessageType.Error; + m_errorMessageTooltip = SRPError; + } + + public override void OnNodeLogicUpdate( DrawInfo drawInfo ) + { + base.OnNodeLogicUpdate( drawInfo ); + if( !ContainerGraph.IsSRP ) + { + if( !m_showErrorMessage ) + { + m_showErrorMessage = true; + } + } + else + { + if( m_showErrorMessage ) + { + m_showErrorMessage = false; + } + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + dataCollector.AddToDirectives( MaterialPragmas ); + string maxQualityValue = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string medQualityValue = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + string minQualityValue = m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector ); + string localVarName = "currQuality" + OutputId; + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, m_outputPorts[ 0 ].DataType, localVarName, "0" ); + + //High + dataCollector.AddLocalVariable( UniqueId, MaterialCode[ 0 ], true ); + dataCollector.AddLocalVariable( UniqueId, localVarName, maxQualityValue, false, true ); + + //Medium + dataCollector.AddLocalVariable( UniqueId, MaterialCode[ 1 ], true ); + dataCollector.AddLocalVariable( UniqueId, localVarName, medQualityValue, false, true ); + + //Low + dataCollector.AddLocalVariable( UniqueId, MaterialCode[ 2 ], true ); + dataCollector.AddLocalVariable( UniqueId, localVarName, minQualityValue,false,true ); + m_outputPorts[ 0 ].SetLocalValue( localVarName, dataCollector.PortCategory ); + + dataCollector.AddLocalVariable( UniqueId, MaterialCode[ 3 ], true ); + return localVarName; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SRP/MaterialQualityNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SRP/MaterialQualityNode.cs.meta new file mode 100644 index 0000000..a322f3b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SRP/MaterialQualityNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8245233e0833c884b8a176943d80514b +timeCreated: 1570027418 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SignalGeneratorNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SignalGeneratorNode.cs new file mode 100644 index 0000000..1e8c6d4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SignalGeneratorNode.cs @@ -0,0 +1,41 @@ +using System; + +namespace AmplifyShaderEditor +{ + public class SignalGeneratorNode : ParentNode, ISignalGenerator + { + public SignalGeneratorNode() : base() { } + public SignalGeneratorNode( int uniqueId, float x, float y, float width, float height ) : base( uniqueId, x, y, width, height ) { } + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + SelfPowered = true; + } + + public void GenerateSignalPropagation() + { + System.Type myType = GetType(); + for ( int i = 0; i < m_inputPorts.Count; i++ ) + { + if ( m_inputPorts[ i ].IsConnected ) + { + m_inputPorts[ i ].GetOutputNode().ActivateNode( UniqueId, i, myType ); + } + } + } + + public void GenerateSignalInibitor() + { + for ( int i = 0; i < m_inputPorts.Count; i++ ) + { + if( m_inputPorts[ i ].IsConnected ) + { + ParentNode node = m_inputPorts[ i ].GetOutputNode(); + if( node != null ) + node.DeactivateNode( i, false ); + } + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SignalGeneratorNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SignalGeneratorNode.cs.meta new file mode 100644 index 0000000..9214603 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SignalGeneratorNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2f92560b009046f4a86504e682834405 +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes.meta new file mode 100644 index 0000000..4f6f807 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 899b55cb557ca594f926ad64dfa4ad8f +folderAsset: yes +timeCreated: 1481126946 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleAddOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleAddOpNode.cs new file mode 100644 index 0000000..463528f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleAddOpNode.cs @@ -0,0 +1,58 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Add", "Math Operators", "Addition of two or more values ( A + B + .. )", null, KeyCode.A )] + public sealed class SimpleAddOpNode : DynamicTypeNode + { + private int m_cachedPropertyId = -1; + + protected override void CommonInit( int uniqueId ) + { + m_dynamicRestrictions = new WirePortDataType[] + { + WirePortDataType.OBJECT, + WirePortDataType.FLOAT, + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR, + WirePortDataType.FLOAT3x3, + WirePortDataType.FLOAT4x4, + WirePortDataType.INT + }; + + base.CommonInit( uniqueId ); + m_extensibleInputPorts = true; + m_previewShaderGUID = "9eb150cbc752cbc458a0a37984b9934a"; + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + if ( m_cachedPropertyId == -1 ) + m_cachedPropertyId = Shader.PropertyToID( "_Count" ); + + PreviewMaterial.SetInt( m_cachedPropertyId, m_inputPorts.Count); + } + + public override string BuildResults( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.BuildResults( outputId, ref dataCollector, ignoreLocalvar ); + string result = "( " + m_extensibleInputResults[ 0 ]; + for ( int i = 1; i < m_extensibleInputResults.Count; i++ ) + { + result += " + " + m_extensibleInputResults[ i ]; + } + result += " )"; + return result; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleAddOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleAddOpNode.cs.meta new file mode 100644 index 0000000..c366095 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleAddOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6ca9162ab6c708f40bbc21f0c22909fa +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleDivideOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleDivideOpNode.cs new file mode 100644 index 0000000..0cafeb3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleDivideOpNode.cs @@ -0,0 +1,45 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Divide", "Math Operators", "Division of two values ( A / B )", null, KeyCode.D )] + public sealed class SimpleDivideOpNode : DynamicTypeNode + { + protected override void CommonInit( int uniqueId ) + { + m_dynamicRestrictions = new WirePortDataType[] + { + WirePortDataType.OBJECT, + WirePortDataType.FLOAT, + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR, + WirePortDataType.FLOAT3x3, + WirePortDataType.FLOAT4x4, + WirePortDataType.INT + }; + + base.CommonInit( uniqueId ); + m_allowMatrixCheck = true; + m_previewShaderGUID = "409f06d00d1094849b0834c52791fa72"; + } + + public override string BuildResults( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + SetExtensibleInputData( outputId, ref dataCollector, ignoreLocalvar ); + string result = "( " + m_extensibleInputResults[ 0 ]; + for ( int i = 1; i < m_extensibleInputResults.Count; i++ ) + { + result += " / " + m_extensibleInputResults[ i ]; + } + result += " )"; + return result; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleDivideOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleDivideOpNode.cs.meta new file mode 100644 index 0000000..98e759a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleDivideOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e80e305761a1e6c4898e401a64b17f84 +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleMaxOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleMaxOpNode.cs new file mode 100644 index 0000000..fdb3c8c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleMaxOpNode.cs @@ -0,0 +1,24 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Max", "Math Operators", "Maximum of two scalars or each respective component of two vectors" )] + public sealed class SimpleMaxOpNode : DynamicTypeNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_previewShaderGUID = "79d7f2a11092ac84a95ef6823b34adf2"; + } + + public override string BuildResults( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.BuildResults( outputId, ref dataCollector, ignoreLocalvar ); + return "max( " + m_inputA + " , " + m_inputB + " )"; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleMaxOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleMaxOpNode.cs.meta new file mode 100644 index 0000000..fe8023a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleMaxOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4ea5a2904ca58164086eeb8ef3084ed2 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleMinOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleMinOpNode.cs new file mode 100644 index 0000000..4b24eb3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleMinOpNode.cs @@ -0,0 +1,24 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Min", "Math Operators", "Minimum of two scalars or each respective component of two vectors" )] + public sealed class SimpleMinOpNode : DynamicTypeNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_previewShaderGUID = "d6033298044f0f14aa9932ca46e58ce6"; + } + + public override string BuildResults( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.BuildResults( outputId, ref dataCollector, ignoreLocalvar ); + return "min( " + m_inputA + " , " + m_inputB + " )"; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleMinOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleMinOpNode.cs.meta new file mode 100644 index 0000000..a92e3e5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleMinOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1b19c8479d7a7a9458a6f556bf6545d5 +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleMultiplyOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleMultiplyOpNode.cs new file mode 100644 index 0000000..4a41a77 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleMultiplyOpNode.cs @@ -0,0 +1,175 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Multiply", "Math Operators", "Multiplication of two or more values ( A * B * .. )\nIt also handles Matrices multiplication", null, KeyCode.M )] + public sealed class SimpleMultiplyOpNode : DynamicTypeNode + { + protected override void CommonInit( int uniqueId ) + { + m_dynamicRestrictions = new WirePortDataType[] + { + WirePortDataType.OBJECT, + WirePortDataType.FLOAT, + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR, + WirePortDataType.FLOAT3x3, + WirePortDataType.FLOAT4x4, + WirePortDataType.INT + }; + + base.CommonInit( uniqueId ); + m_extensibleInputPorts = true; + m_vectorMatrixOps = true; + m_previewShaderGUID = "1ba1e43e86415ff4bbdf4d81dfcf035b"; + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + int count = 0; + int inputCount = m_inputPorts.Count; + for( int i = 2; i < inputCount; i++ ) + { + count++; + if( !m_inputPorts[ i ].IsConnected ) + PreviewMaterial.SetTexture( ( "_" + Convert.ToChar( i + 65 ) ), UnityEditor.EditorGUIUtility.whiteTexture ); + } + + m_previewMaterialPassId = count; + } + + public override string BuildResults( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_inputPorts[ 0 ].DataType == WirePortDataType.FLOAT3x3 || + m_inputPorts[ 0 ].DataType == WirePortDataType.FLOAT4x4 || + m_inputPorts[ 1 ].DataType == WirePortDataType.FLOAT3x3 || + m_inputPorts[ 1 ].DataType == WirePortDataType.FLOAT4x4 ) + { + m_inputA = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + m_inputB = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + + + WirePortDataType autoCast = WirePortDataType.OBJECT; + // Check matrix on first input + if( m_inputPorts[ 0 ].DataType == WirePortDataType.FLOAT3x3 ) + { + switch( m_inputPorts[ 1 ].DataType ) + { + case WirePortDataType.OBJECT: + case WirePortDataType.FLOAT: + case WirePortDataType.INT: + case WirePortDataType.FLOAT2: + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: + { + m_inputB = UIUtils.CastPortType( ref dataCollector, CurrentPrecisionType, new NodeCastInfo( UniqueId, outputId ), m_inputB, m_inputPorts[ 1 ].DataType, WirePortDataType.FLOAT3, m_inputB ); + autoCast = WirePortDataType.FLOAT3; + } + break; + case WirePortDataType.FLOAT4x4: + { + m_inputA = UIUtils.CastPortType( ref dataCollector, CurrentPrecisionType, new NodeCastInfo( UniqueId, outputId ), m_inputA, m_inputPorts[ 0 ].DataType, WirePortDataType.FLOAT4x4, m_inputA ); + } + break; + case WirePortDataType.FLOAT3: + case WirePortDataType.FLOAT3x3: break; + } + } + + if( m_inputPorts[ 0 ].DataType == WirePortDataType.FLOAT4x4 ) + { + switch( m_inputPorts[ 1 ].DataType ) + { + case WirePortDataType.OBJECT: + case WirePortDataType.FLOAT: + case WirePortDataType.INT: + case WirePortDataType.FLOAT2: + case WirePortDataType.FLOAT3: + { + m_inputB = UIUtils.CastPortType( ref dataCollector, CurrentPrecisionType, new NodeCastInfo( UniqueId, outputId ), m_inputB, m_inputPorts[ 1 ].DataType, WirePortDataType.FLOAT4, m_inputB ); + autoCast = WirePortDataType.FLOAT4; + } + break; + case WirePortDataType.FLOAT3x3: + { + m_inputB = UIUtils.CastPortType( ref dataCollector, CurrentPrecisionType, new NodeCastInfo( UniqueId, outputId ), m_inputB, m_inputPorts[ 1 ].DataType, WirePortDataType.FLOAT4x4, m_inputB ); + } + break; + case WirePortDataType.FLOAT4x4: + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: break; + } + } + + // Check matrix on second input + if( m_inputPorts[ 1 ].DataType == WirePortDataType.FLOAT3x3 ) + { + switch( m_inputPorts[ 0 ].DataType ) + { + case WirePortDataType.OBJECT: + case WirePortDataType.FLOAT: + case WirePortDataType.INT: + case WirePortDataType.FLOAT2: + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: + { + m_inputA = UIUtils.CastPortType( ref dataCollector, CurrentPrecisionType, new NodeCastInfo( UniqueId, outputId ), m_inputA, m_inputPorts[ 0 ].DataType, WirePortDataType.FLOAT3, m_inputA ); + autoCast = WirePortDataType.FLOAT3; + } + break; + case WirePortDataType.FLOAT4x4: + case WirePortDataType.FLOAT3: + case WirePortDataType.FLOAT3x3: break; + } + } + + if( m_inputPorts[ 1 ].DataType == WirePortDataType.FLOAT4x4 ) + { + switch( m_inputPorts[ 0 ].DataType ) + { + case WirePortDataType.OBJECT: + case WirePortDataType.FLOAT: + case WirePortDataType.INT: + case WirePortDataType.FLOAT2: + case WirePortDataType.FLOAT3: + { + m_inputA = UIUtils.CastPortType( ref dataCollector, CurrentPrecisionType, new NodeCastInfo( UniqueId, outputId ), m_inputA, m_inputPorts[ 0 ].DataType, WirePortDataType.FLOAT4, m_inputA ); + autoCast = WirePortDataType.FLOAT4; + } + break; + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: break; + } + } + string result = "mul( " + m_inputA + ", " + m_inputB + " )"; + if( autoCast != WirePortDataType.OBJECT && autoCast != m_outputPorts[ 0 ].DataType ) + { + result = UIUtils.CastPortType( ref dataCollector, CurrentPrecisionType, new NodeCastInfo( UniqueId, outputId ), result, autoCast, m_outputPorts[ 0 ].DataType, result ); + } + return result; + } + else + { + base.BuildResults( outputId, ref dataCollector, ignoreLocalvar ); + string result = "( " + m_extensibleInputResults[ 0 ]; + for( int i = 1; i < m_extensibleInputResults.Count; i++ ) + { + result += " * " + m_extensibleInputResults[ i ]; + } + result += " )"; + return result; + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleMultiplyOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleMultiplyOpNode.cs.meta new file mode 100644 index 0000000..0283ca7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleMultiplyOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 647081578ac7f014d98090d36b5b1bc8 +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleRemainderNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleRemainderNode.cs new file mode 100644 index 0000000..af20ce2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleRemainderNode.cs @@ -0,0 +1,66 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Remainder", "Math Operators", "Remainder between two int variables",tags:"modulo fmod" )] + public sealed class SimpleRemainderNode : DynamicTypeNode + { + private const string VertexFragRemainder = "( {0} % {1} )"; + //private const string SurfaceRemainder = "fmod( {0} , {1} )"; + private const string RemainderCalculationInt = "( {0} - {1} * ({0}/{1}))"; + private const string RemainderCalculationFloat = "( {0} - {1} * floor({0}/{1}))"; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_useInternalPortData = true; + m_textLabelWidth = 35; + ChangeInputType( WirePortDataType.INT, false ); + ChangeOutputType( WirePortDataType.INT, false ); + m_useInternalPortData = true; + m_previewShaderGUID = "8fdfc429d6b191c4985c9531364c1a95"; + } + + public override string BuildResults( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + base.BuildResults( outputId, ref dataCollector, ignoreLocalvar ); +#if UNITY_2018_1_OR_NEWER + string opMode = VertexFragRemainder; +#else + string opMode = dataCollector.IsTemplate ? + VertexFragRemainder : + ( ( m_outputPorts[ 0 ].DataType == WirePortDataType.INT ) ? RemainderCalculationInt: RemainderCalculationFloat ); +#endif + string result = string.Empty; + switch( m_outputPorts[ 0 ].DataType ) + { + case WirePortDataType.FLOAT: + case WirePortDataType.FLOAT2: + case WirePortDataType.FLOAT3: + case WirePortDataType.FLOAT4: + case WirePortDataType.INT: + case WirePortDataType.COLOR: + case WirePortDataType.OBJECT: + { + result = string.Format( opMode, m_inputA, m_inputB ); + } + break; + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + { + result = UIUtils.InvalidParameter( this ); + } + break; + } + + return CreateOutputLocalVariable( 0, result, ref dataCollector ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleRemainderNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleRemainderNode.cs.meta new file mode 100644 index 0000000..528ea33 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleRemainderNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5785c326a26d2ba4ab642fc2bdd41e9a +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleSubtractOpNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleSubtractOpNode.cs new file mode 100644 index 0000000..eaabab2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleSubtractOpNode.cs @@ -0,0 +1,39 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Subtract", "Math Operators", "Subtraction of two values ( A - B )", null, UnityEngine.KeyCode.S )] + public sealed class SimpleSubtractOpNode : DynamicTypeNode + { + protected override void CommonInit( int uniqueId ) + { + m_dynamicRestrictions = new WirePortDataType[] + { + WirePortDataType.OBJECT, + WirePortDataType.FLOAT, + WirePortDataType.FLOAT2, + WirePortDataType.FLOAT3, + WirePortDataType.FLOAT4, + WirePortDataType.COLOR, + WirePortDataType.FLOAT3x3, + WirePortDataType.FLOAT4x4, + WirePortDataType.INT + }; + + base.CommonInit( uniqueId ); + m_allowMatrixCheck = true; + m_previewShaderGUID = "5725e8300be208449973f771ab6682f2"; + } + + public override string BuildResults( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.BuildResults( outputId, ref dataCollector, ignoreLocalvar ); + return "( " + m_inputA + " - " + m_inputB + " )"; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleSubtractOpNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleSubtractOpNode.cs.meta new file mode 100644 index 0000000..a550f19 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SimpleNodes/SimpleSubtractOpNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 204f935dafd0a984297e242583de1da5 +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/StickyNoteNode .cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/StickyNoteNode .cs new file mode 100644 index 0000000..f9a91e6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/StickyNoteNode .cs @@ -0,0 +1,502 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Sticky Note", "Miscellaneous", "Allows adding notes into canvas" )] + public sealed class StickyNoteNode : ParentNode, ISerializationCallbackReceiver + { + private const string WarningText = "Characters $ and @ are NOT allowed inside notes since they are internally used as delimiters over the node meta.\nThey will be automatically removed when saving the shader."; + + private const string CommentaryTitle = "Comment"; + private const string NoteTitle = "Note Title"; + private const float BORDER_SIZE_X = 50; + private const float BORDER_SIZE_Y = 50; + private const float MIN_SIZE_X = 100; + private const float MIN_SIZE_Y = 100; + private const float COMMENTARY_BOX_HEIGHT = 30; + private const float NOTE_AREA_ADJUST = 5; + + private readonly Vector2 ResizeButtonPos = new Vector2( 1, 1 ); + + [SerializeField] + private string m_innerTitleText = "New Note"; + + [SerializeField] + private string m_titleText = string.Empty; + + [SerializeField] + private string m_noteText = string.Empty; + + [SerializeField] + private eResizeAxis m_resizeAxis = eResizeAxis.ALL; + + + [SerializeField] + private Rect m_resizeLeftIconCoords; + + [SerializeField] + private Rect m_resizeRightIconCoords; + + [SerializeField] + private Rect m_auxHeaderPos; + + [SerializeField] + private Rect m_innerTitleArea; + + [SerializeField] + private Rect m_noteTextArea; + + + private Texture2D m_resizeIconTex; + + private bool m_isResizingRight = false; + private bool m_isResizingLeft = false; + + private Vector2 m_resizeStartPoint = Vector2.zero; + + private string m_focusTitleName = "StickyNoteTitleText"; + private string m_focusNoteName = "StickyNoteInnerText"; + private bool m_focusOnTitle = false; + + private bool m_checkCommentText = true; + private bool m_checkTitleText = true; + + public Color m_frameColor = Color.white; + + + private bool m_isEditingInnerTitle; + private bool m_stopEditingInnerTitle; + private bool m_startEditingInnerTitle; + + private bool m_isEditingNoteText; + private bool m_stopEditingNoteText; + private bool m_startEditingNoteText; + + private double m_clickTimeTitle; + private double m_doubleClickTimeTitle = 0.3; + + private double m_clickTimeNote; + private double m_doubleClickTimeNote = 0.3; + + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_reorderLocked = true; + m_rmbIgnore = true; + m_defaultInteractionMode = InteractionMode.Both; + m_connStatus = NodeConnectionStatus.Island; + m_textLabelWidth = 90; + m_position.width = 150; + m_position.height = 100; + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + m_focusTitleName = CommentaryTitle + OutputId; + m_focusNoteName = NoteTitle + OutputId; + } + + public override void DrawProperties() + { + base.DrawProperties(); + NodeUtils.DrawPropertyGroup( ref m_propertiesFoldout, Constants.ParameterLabelStr,()=> + { + EditorGUI.BeginChangeCheck(); + m_titleText = EditorGUILayoutTextField( "Frame Title", m_titleText ); + if ( EditorGUI.EndChangeCheck() ) + { + m_checkTitleText = true; + } + EditorGUI.BeginChangeCheck(); + m_innerTitleText = EditorGUILayoutTextField( NoteTitle, m_innerTitleText ); + if ( EditorGUI.EndChangeCheck() ) + { + m_checkCommentText = true; + } + + m_noteText = EditorGUILayoutTextArea( m_noteText , UIUtils.MainSkin.textArea ); + + m_frameColor = EditorGUILayoutColorField( "Frame Color", m_frameColor ); + } ); + EditorGUILayout.HelpBox( WarningText, MessageType.Warning ); + } + + public override void OnNodeLayout( DrawInfo drawInfo ) + { + //base.OnLayout( drawInfo ); + CalculatePositionAndVisibility( drawInfo ); + + m_headerPosition = m_globalPosition; + m_headerPosition.height = UIUtils.CurrentHeaderHeight; + + m_auxHeaderPos = m_position; + m_auxHeaderPos.height = UIUtils.HeaderMaxHeight; + + m_innerTitleArea = m_globalPosition; + m_innerTitleArea.height = COMMENTARY_BOX_HEIGHT * drawInfo.InvertedZoom; + m_innerTitleArea.xMin += 10 * drawInfo.InvertedZoom; + m_innerTitleArea.xMax -= 10 * drawInfo.InvertedZoom; + + + m_noteTextArea = m_globalPosition; + m_noteTextArea.height -= m_innerTitleArea.height; + m_noteTextArea.yMin += m_innerTitleArea.height + NOTE_AREA_ADJUST * drawInfo.InvertedZoom; + m_noteTextArea.yMax += 4*NOTE_AREA_ADJUST * drawInfo.InvertedZoom; + m_noteTextArea.xMin += 10 * drawInfo.InvertedZoom; + m_noteTextArea.xMax -= 10 * drawInfo.InvertedZoom; + + if ( m_resizeIconTex == null ) + { + m_resizeIconTex = UIUtils.GetCustomStyle( CustomStyle.CommentaryResizeButton ).normal.background; + } + + // LEFT RESIZE BUTTON + m_resizeLeftIconCoords = m_globalPosition; + m_resizeLeftIconCoords.x = m_globalPosition.x + 2; + m_resizeLeftIconCoords.y = m_globalPosition.y + m_globalPosition.height - 2 - ( m_resizeIconTex.height + ResizeButtonPos.y ) * drawInfo.InvertedZoom; + m_resizeLeftIconCoords.width = m_resizeIconTex.width * drawInfo.InvertedZoom; + m_resizeLeftIconCoords.height = m_resizeIconTex.height * drawInfo.InvertedZoom; + + // RIGHT RESIZE BUTTON + m_resizeRightIconCoords = m_globalPosition; + m_resizeRightIconCoords.x = m_globalPosition.x + m_globalPosition.width - 1 - ( m_resizeIconTex.width + ResizeButtonPos.x ) * drawInfo.InvertedZoom; + m_resizeRightIconCoords.y = m_globalPosition.y + m_globalPosition.height - 2 - ( m_resizeIconTex.height + ResizeButtonPos.y ) * drawInfo.InvertedZoom; + m_resizeRightIconCoords.width = m_resizeIconTex.width * drawInfo.InvertedZoom; + m_resizeRightIconCoords.height = m_resizeIconTex.height * drawInfo.InvertedZoom; + } + + public override void OnNodeRepaint( DrawInfo drawInfo ) + { + if ( !m_isVisible ) + return; + + m_colorBuffer = GUI.color; + // Background + GUI.color = Constants.NodeBodyColor * m_frameColor; + GUI.Label( m_globalPosition, string.Empty, UIUtils.GetCustomStyle( CustomStyle.CommentaryBackground ) ); + + // Header + GUI.color = m_headerColor * m_headerColorModifier * m_frameColor; + GUI.Label( m_headerPosition, string.Empty, UIUtils.GetCustomStyle( CustomStyle.NodeHeader ) ); + GUI.color = m_colorBuffer; + + // Fixed Title ( only renders when not editing ) + if ( !m_isEditingInnerTitle && !m_startEditingInnerTitle && ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD3 ) + { + GUI.Label( m_innerTitleArea, m_innerTitleText, UIUtils.CommentaryTitle ); + } + + + // Note Text ( only renders when not editing ) + if( !m_isEditingNoteText && !m_startEditingNoteText && ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD3 ) + { + GUI.Label( m_noteTextArea, m_noteText, UIUtils.StickyNoteText ); + } + + // Buttons + GUI.Label( m_resizeLeftIconCoords, string.Empty, UIUtils.GetCustomStyle( CustomStyle.CommentaryResizeButtonInv ) ); + GUI.Label( m_resizeRightIconCoords, string.Empty, UIUtils.GetCustomStyle( CustomStyle.CommentaryResizeButton ) ); + + // Selection Box + if ( m_selected ) + { + GUI.color = Constants.NodeSelectedColor; + RectOffset cache = UIUtils.GetCustomStyle( CustomStyle.NodeWindowOn ).border; + UIUtils.GetCustomStyle( CustomStyle.NodeWindowOn ).border = UIUtils.RectOffsetSix; + GUI.Label( m_globalPosition, string.Empty, UIUtils.GetCustomStyle( CustomStyle.NodeWindowOn ) ); + UIUtils.GetCustomStyle( CustomStyle.NodeWindowOn ).border = cache; + GUI.color = m_colorBuffer; + } + + if ( !string.IsNullOrEmpty( m_titleText ) ) + { + Rect titleRect = m_globalPosition; + titleRect.y -= 24; + titleRect.height = 24; + GUI.Label( titleRect, m_titleText, UIUtils.GetCustomStyle( CustomStyle.CommentarySuperTitle ) ); + } + } + + public override void Move( Vector2 delta, bool snap ) + { + if( m_isResizingRight || m_isResizingLeft ) + return; + + base.Move( delta, snap ); + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + // Custom Editable Title + if ( ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD3 ) + { + if( !m_startEditingNoteText && !m_isEditingNoteText ) + { + if( !m_isEditingInnerTitle && ( ( !ContainerGraph.ParentWindow.MouseInteracted && drawInfo.CurrentEventType == EventType.MouseDown && m_innerTitleArea.Contains( drawInfo.MousePosition ) ) ) ) + { + if( ( EditorApplication.timeSinceStartup - m_clickTimeTitle ) < m_doubleClickTimeTitle ) + m_startEditingInnerTitle = true; + else + GUI.FocusControl( null ); + m_clickTimeTitle = EditorApplication.timeSinceStartup; + } + else if( m_isEditingInnerTitle && ( ( drawInfo.CurrentEventType == EventType.MouseDown && !m_innerTitleArea.Contains( drawInfo.MousePosition ) ) || !EditorGUIUtility.editingTextField ) ) + { + m_stopEditingInnerTitle = true; + } + + if( m_isEditingInnerTitle || m_startEditingInnerTitle ) + { + EditorGUI.BeginChangeCheck(); + GUI.SetNextControlName( m_focusTitleName ); + m_innerTitleText = EditorGUITextField( m_innerTitleArea, string.Empty, m_innerTitleText, UIUtils.CommentaryTitle ); + if( EditorGUI.EndChangeCheck() ) + { + m_checkCommentText = true; + } + + if( m_startEditingInnerTitle ) + EditorGUI.FocusTextInControl( m_focusTitleName ); + } + + if( drawInfo.CurrentEventType == EventType.Repaint ) + { + if( m_startEditingInnerTitle ) + { + m_startEditingInnerTitle = false; + m_isEditingInnerTitle = true; + } + + if( m_stopEditingInnerTitle ) + { + m_stopEditingInnerTitle = false; + m_isEditingInnerTitle = false; + GUI.FocusControl( null ); + } + } + } + + //////////////////////// + if( !m_startEditingInnerTitle && !m_isEditingInnerTitle ) + { + if( !m_isEditingNoteText && ( ( !ContainerGraph.ParentWindow.MouseInteracted && drawInfo.CurrentEventType == EventType.MouseDown && m_noteTextArea.Contains( drawInfo.MousePosition ) ) ) ) + { + if( ( EditorApplication.timeSinceStartup - m_clickTimeNote ) < m_doubleClickTimeNote ) + m_startEditingNoteText = true; + else + GUI.FocusControl( null ); + m_clickTimeNote = EditorApplication.timeSinceStartup; + } + else if( m_isEditingNoteText && ( ( drawInfo.CurrentEventType == EventType.MouseDown && !m_noteTextArea.Contains( drawInfo.MousePosition ) ) || !EditorGUIUtility.editingTextField ) ) + { + m_stopEditingInnerTitle = true; + } + + if( m_isEditingNoteText || m_startEditingNoteText ) + { + GUI.SetNextControlName( m_focusNoteName ); + m_noteText = EditorGUITextArea( m_noteTextArea, m_noteText, UIUtils.StickyNoteText ); + if( m_startEditingNoteText ) + EditorGUI.FocusTextInControl( m_focusNoteName ); + } + + if( drawInfo.CurrentEventType == EventType.Repaint ) + { + if( m_startEditingNoteText ) + { + m_startEditingNoteText = false; + m_isEditingNoteText = true; + } + + if( m_stopEditingInnerTitle ) + { + m_stopEditingInnerTitle = false; + m_isEditingNoteText = false; + GUI.FocusControl( null ); + } + } + } + //////////////////////// + } + + if ( drawInfo.CurrentEventType == EventType.MouseDown && drawInfo.LeftMouseButtonPressed ) + { + // Left Button + if( m_resizeLeftIconCoords.Contains( drawInfo.MousePosition ) && ContainerGraph.ParentWindow.CurrentEvent.modifiers != EventModifiers.Shift ) + { + if ( !m_isResizingLeft ) + { + m_isResizingLeft = true; + ContainerGraph.ParentWindow.ForceAutoPanDir = true; + m_resizeStartPoint = drawInfo.TransformedMousePos; + } + } + + // Right Button + if ( m_resizeRightIconCoords.Contains( drawInfo.MousePosition ) && ContainerGraph.ParentWindow.CurrentEvent.modifiers != EventModifiers.Shift ) + { + if ( !m_isResizingRight ) + { + m_isResizingRight = true; + ContainerGraph.ParentWindow.ForceAutoPanDir = true; + m_resizeStartPoint = drawInfo.TransformedMousePos; + } + } + } + + if ( drawInfo.CurrentEventType == EventType.Repaint || drawInfo.CurrentEventType == EventType.MouseUp ) + { + // Left Button + EditorGUIUtility.AddCursorRect( m_resizeLeftIconCoords, MouseCursor.ResizeUpRight ); + if ( m_isResizingLeft ) + { + if ( drawInfo.CurrentEventType == EventType.MouseUp ) + { + m_isResizingLeft = false; + ContainerGraph.ParentWindow.ForceAutoPanDir = false; + FireStoppedMovingEvent( false, InteractionMode.Target ); + } + else + { + Vector2 currSize = ( drawInfo.TransformedMousePos - m_resizeStartPoint ) /*/ drawInfo.InvertedZoom*/; + m_resizeStartPoint = drawInfo.TransformedMousePos; + if ( m_resizeAxis != eResizeAxis.Y_AXIS ) + { + m_position.x += currSize.x; + m_position.width -= currSize.x; + if ( m_position.width < MIN_SIZE_X ) + { + m_position.x -= ( MIN_SIZE_X - m_position.width ); + m_position.width = MIN_SIZE_X; + } + } + + if ( m_resizeAxis != eResizeAxis.X_AXIS ) + { + m_position.height += currSize.y; + if ( m_position.height < MIN_SIZE_Y ) + { + m_position.height = MIN_SIZE_Y; + } + } + } + } + + // Right Button + EditorGUIUtility.AddCursorRect( m_resizeRightIconCoords, MouseCursor.ResizeUpLeft ); + if ( m_isResizingRight ) + { + if ( drawInfo.CurrentEventType == EventType.MouseUp ) + { + m_isResizingRight = false; + ContainerGraph.ParentWindow.ForceAutoPanDir = false; + FireStoppedMovingEvent( false, InteractionMode.Target ); + } + else + { + Vector2 currSize = ( drawInfo.TransformedMousePos - m_resizeStartPoint ) /*/ drawInfo.InvertedZoom*/; + m_resizeStartPoint = drawInfo.TransformedMousePos; + if ( m_resizeAxis != eResizeAxis.Y_AXIS ) + { + m_position.width += currSize.x; + if ( m_position.width < MIN_SIZE_X ) + { + m_position.width = MIN_SIZE_X; + } + } + + if ( m_resizeAxis != eResizeAxis.X_AXIS ) + { + m_position.height += currSize.y; + if ( m_position.height < MIN_SIZE_Y ) + { + m_position.height = MIN_SIZE_Y; + } + } + } + } + } + + if ( m_checkCommentText ) + { + m_checkCommentText = false; + m_innerTitleText = m_innerTitleText.Replace( IOUtils.FIELD_SEPARATOR, ' ' ); + } + + if ( m_checkTitleText ) + { + m_checkTitleText = false; + m_titleText = m_titleText.Replace( IOUtils.FIELD_SEPARATOR, ' ' ); + } + + if ( m_focusOnTitle && drawInfo.CurrentEventType == EventType.KeyUp ) + { + m_focusOnTitle = false; + m_startEditingInnerTitle = true; + } + } + + public void Focus() + { + m_focusOnTitle = true; + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_position.width = Convert.ToSingle( GetCurrentParam( ref nodeParams ) ); + m_position.height = Convert.ToSingle( GetCurrentParam( ref nodeParams ) ); + m_innerTitleText = GetCurrentParam( ref nodeParams ); + m_titleText = GetCurrentParam( ref nodeParams ); + string[] colorChannels = GetCurrentParam( ref nodeParams ).Split( IOUtils.VECTOR_SEPARATOR ); + if ( colorChannels.Length == 4 ) + { + m_frameColor.r = Convert.ToSingle( colorChannels[ 0 ] ); + m_frameColor.g = Convert.ToSingle( colorChannels[ 1 ] ); + m_frameColor.b = Convert.ToSingle( colorChannels[ 2 ] ); + m_frameColor.a = Convert.ToSingle( colorChannels[ 3 ] ); + } + else + { + UIUtils.ShowMessage( UniqueId, "Incorrect number of color values", MessageSeverity.Error ); + } + m_noteText = GetCurrentParam( ref nodeParams ); + m_noteText = m_noteText.Replace( Constants.LineFeedSeparator, '\n' ); + m_noteText = m_noteText.Replace( Constants.SemiColonSeparator, ';' ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_position.width ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_position.height ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_innerTitleText ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_titleText ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_frameColor.r.ToString() + IOUtils.VECTOR_SEPARATOR + m_frameColor.g.ToString() + IOUtils.VECTOR_SEPARATOR + m_frameColor.b.ToString() + IOUtils.VECTOR_SEPARATOR + m_frameColor.a.ToString() ); + + m_noteText = m_noteText.Replace( Constants.LineFeedSeparator.ToString(), string.Empty); + m_noteText = m_noteText.Replace( Constants.SemiColonSeparator.ToString(), string.Empty ); + m_noteText = UIUtils.ForceLFLineEnding( m_noteText ); + + string parsedText = m_noteText.Replace( '\n', Constants.LineFeedSeparator ); + parsedText = parsedText.Replace( ';', Constants.SemiColonSeparator ); + IOUtils.AddFieldValueToString( ref nodeInfo, parsedText ); + } + + public override Rect Position { get { return Event.current.alt ? m_position : m_auxHeaderPos; } } + public override bool Contains( Vector3 pos ) + { + return Event.current.alt ? m_globalPosition.Contains( pos ) : ( m_headerPosition.Contains( pos ) || m_resizeRightIconCoords.Contains( pos ) || m_resizeLeftIconCoords.Contains( pos ) ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/StickyNoteNode .cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/StickyNoteNode .cs.meta new file mode 100644 index 0000000..085bd13 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/StickyNoteNode .cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6d517b63dc9604043985eb4a82d2d135 +timeCreated: 1607962893 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs.meta new file mode 100644 index 0000000..4487ca3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ddb697d654917eb4aada5b2caeef2db8 +folderAsset: yes +timeCreated: 1481126946 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ColorInputsNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ColorInputsNode.cs new file mode 100644 index 0000000..e4223e1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ColorInputsNode.cs @@ -0,0 +1,17 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Color", "Surface Data", "Interpolated per-vertex color", null, UnityEngine.KeyCode.None, true, true, "Vertex Color", typeof( VertexColorNode ) )] + public sealed class ColorInputsNode : SurfaceShaderINParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_currentInput = SurfaceInputs.COLOR; + InitialSetup(); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ColorInputsNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ColorInputsNode.cs.meta new file mode 100644 index 0000000..8f36faf --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ColorInputsNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ee44f086d7aa7804ea035860c5735cfb +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/GrabScreenPosition.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/GrabScreenPosition.cs new file mode 100644 index 0000000..3e2a511 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/GrabScreenPosition.cs @@ -0,0 +1,118 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEditor; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Grab Screen Position", "Camera And Screen", "Screen position correctly transformed to be used with Grab Screen Color" )] + public sealed class GrabScreenPosition : ParentNode + { + private readonly string[] m_outputTypeStr = { "Normalized", "Screen" }; + + [SerializeField] + private int m_outputTypeInt = 0; + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddOutputVectorPorts( WirePortDataType.FLOAT4, "XYZW" ); + m_autoWrapProperties = true; + m_hasLeftDropdown = true; + m_textLabelWidth = 65; + ConfigureHeader(); + } + + public override void AfterCommonInit() + { + base.AfterCommonInit(); + + if( PaddingTitleLeft == 0 ) + { + PaddingTitleLeft = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + if( PaddingTitleRight == 0 ) + PaddingTitleRight = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + } + } + + public override void Destroy() + { + base.Destroy(); + m_upperLeftWidget = null; + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + EditorGUI.BeginChangeCheck(); + m_outputTypeInt = m_upperLeftWidget.DrawWidget( this, m_outputTypeInt, m_outputTypeStr ); + if( EditorGUI.EndChangeCheck() ) + { + ConfigureHeader(); + } + } + + public override void DrawProperties() + { + base.DrawProperties(); + + EditorGUI.BeginChangeCheck(); + m_outputTypeInt = EditorGUILayoutPopup( "Type", m_outputTypeInt, m_outputTypeStr ); + if( EditorGUI.EndChangeCheck() ) + { + ConfigureHeader(); + } + } + + void ConfigureHeader() + { + SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, m_outputTypeStr[ m_outputTypeInt ] ) ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return GetOutputColorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + + string localVarName = string.Empty; + + if( m_outputTypeInt == 0 ) + localVarName = GeneratorUtils.GenerateGrabScreenPositionNormalized( ref dataCollector, UniqueId, CurrentPrecisionType, !dataCollector.UsingCustomScreenPos ); + else + localVarName = GeneratorUtils.GenerateGrabScreenPosition( ref dataCollector, UniqueId, CurrentPrecisionType, !dataCollector.UsingCustomScreenPos ); + + m_outputPorts[ 0 ].SetLocalValue( localVarName, dataCollector.PortCategory ); + return GetOutputColorItem( 0, outputId, localVarName ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > 3108 ) + { + if( UIUtils.CurrentShaderVersion() < 6102 ) + { + bool project = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + m_outputTypeInt = project ? 0 : 1; + } + else + { + m_outputTypeInt = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + } + + ConfigureHeader(); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_outputTypeInt ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/GrabScreenPosition.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/GrabScreenPosition.cs.meta new file mode 100644 index 0000000..5a57543 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/GrabScreenPosition.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 47af62ad6a29d1b409d526d352b5e677 +timeCreated: 1485198163 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/LocalVertexPosNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/LocalVertexPosNode.cs new file mode 100644 index 0000000..785e39f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/LocalVertexPosNode.cs @@ -0,0 +1,50 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "[Deprecated] Local Position", "Surface Data", "Interpolated Vertex Position in Local Space", null, KeyCode.None, true, true, "Vertex Position", typeof( PosVertexDataNode ) )] + public sealed class LocalVertexPosNode : ParentNode + { + private const string VertexVarName = "localVertexPos"; + private readonly string VertexOnFrag = Constants.InputVarStr + "." + VertexVarName; + private readonly string VertexOnVert = Constants.VertexShaderInputStr + ".vertex"; + + + [SerializeField] + private bool m_addInstruction = false; + + public override void Reset() + { + base.Reset(); + m_addInstruction = true; + } + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddOutputVectorPorts( WirePortDataType.FLOAT3, "XYZ" ); + } + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + { + return GetOutputVectorItem( 0, outputId, VertexOnVert ); + } + else + { + if ( m_addInstruction ) + { + dataCollector.AddToInput( UniqueId, VertexVarName, WirePortDataType.FLOAT3 ); + dataCollector.AddVertexInstruction( Constants.VertexShaderOutputStr + "." + VertexVarName + " = " + Constants.VertexShaderInputStr + ".vertex.xyz ", UniqueId ); + m_addInstruction = false; + } + + return GetOutputVectorItem( 0, outputId, VertexOnFrag ); + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/LocalVertexPosNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/LocalVertexPosNode.cs.meta new file mode 100644 index 0000000..91b6b54 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/LocalVertexPosNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2528fbf85b5823a4499871c2a6eecc0a +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ScreenColorNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ScreenColorNode.cs new file mode 100644 index 0000000..9d977e1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ScreenColorNode.cs @@ -0,0 +1,716 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + + [Serializable] + [NodeAttributes( "Grab Screen Color", "Camera And Screen", "Grabed pixel color value from screen" )] + public sealed class ScreenColorNode : PropertyNode + { +#if UNITY_5_6_OR_NEWER + private readonly string[] ASEDeclareMacro = + { + "#if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED)", + "#define ASE_DECLARE_SCREENSPACE_TEXTURE(tex) UNITY_DECLARE_SCREENSPACE_TEXTURE(tex);", + "#else", + "#define ASE_DECLARE_SCREENSPACE_TEXTURE(tex) UNITY_DECLARE_SCREENSPACE_TEXTURE(tex)", + "#endif" + }; +#endif + private readonly Color ReferenceHeaderColor = new Color( 0.6f, 3.0f, 1.25f, 1.0f ); + + private const string SamplerType = "tex2D"; + private const string GrabTextureDefault = "_GrabTexture"; + private const string ScreenColorStr = "screenColor"; + + [SerializeField] + private TexReferenceType m_referenceType = TexReferenceType.Object; + + [SerializeField] + private int m_referenceArrayId = -1; + + [SerializeField] + private int m_referenceNodeId = -1; + + [SerializeField] + private GUIStyle m_referenceIconStyle = null; + + private ScreenColorNode m_referenceNode = null; + + [SerializeField] + private bool m_normalize = false; + + [SerializeField] + private bool m_useCustomGrab = false; + + [SerializeField] + private float m_referenceWidth = -1; + + [SerializeField] + private bool m_exposure = false; + + //SRP specific code + private const string OpaqueTextureDefine = "REQUIRE_OPAQUE_TEXTURE 1"; + private const string FetchVarName = "fetchOpaqueVal"; + + //private string LWFetchOpaqueTexture = "SAMPLE_TEXTURE2D( _CameraOpaqueTexture, sampler_CameraOpaqueTexture, {0})"; + private string LWFetchOpaqueTexture = "float4( SHADERGRAPH_SAMPLE_SCENE_COLOR( {0} ), 1.0 )"; +#if UNITY_2018_3_OR_NEWER + private const string HDSampleSceneColorHeader5 = "ASEHDSampleSceneColor({0}, {1}, {2})"; + private readonly string[] HDSampleSceneColorFunc5 = + { + "float4 ASEHDSampleSceneColor(float2 uv, float lod, float exposureMultiplier)\n", + "{\n", + "\t#if defined(REQUIRE_OPAQUE_TEXTURE) && defined(_SURFACE_TYPE_TRANSPARENT) && defined(SHADERPASS) && (SHADERPASS != SHADERPASS_LIGHT_TRANSPORT)\n", + "\treturn float4( SampleCameraColor(uv, lod) * exposureMultiplier, 1.0 );\n", + "\t#endif\n", + "\treturn float4(0.0, 0.0, 0.0, 1.0);\n", + "}\n", + }; + + private const string HDSampleSceneColorHeader4 = "ASEHDSampleSceneColor({0})"; + private readonly string[] HDSampleSceneColorFunc4 = + { + "float4 ASEHDSampleSceneColor( float2 uv )\n", + "{\n", + "\t#if defined(REQUIRE_OPAQUE_TEXTURE) && defined(_SURFACE_TYPE_TRANSPARENT) && defined(SHADERPASS) && (SHADERPASS != SHADERPASS_LIGHT_TRANSPORT)\n", + "\treturn float4( SampleCameraColor(uv), 1.0 );\n", + "\t#endif\n", + "\treturn float4(0.0, 0.0, 0.0, 1.0);\n", + "}\n", + }; +#endif + +#if !UNITY_2018_3_OR_NEWER + // Legacy SRP code + private const string DeclareOpaqueTextureObject = "TEXTURE2D( _CameraOpaqueTexture);"; + private const string DeclareOpaqueTextureSampler = "SAMPLER( sampler_CameraOpaqueTexture);"; +#endif + public ScreenColorNode() : base() { } + public ScreenColorNode( int uniqueId, float x, float y, float width, float height ) : base( uniqueId, x, y, width, height ) { } + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + + AddInputPort( WirePortDataType.FLOAT2, false, "UV" ); + AddInputPort( WirePortDataType.FLOAT, false, "LOD" ); + m_inputPorts[ 1 ].FloatInternalData = 0; + + AddOutputColorPorts( "RGBA" ); + + m_currentParameterType = PropertyType.Global; + m_underscoredGlobal = true; + m_useVarSubtitle = true; + m_customPrefix = "Grab Screen "; + m_freeType = false; + m_drawAttributes = false; + m_showTitleWhenNotEditing = false; + m_textLabelWidth = 125; + m_showAutoRegisterUI = true; + m_globalDefaultBehavior = false; + m_showVariableMode = true; + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + if( m_referenceType == TexReferenceType.Object ) + UIUtils.RegisterScreenColorNode( this ); + + if( UniqueId > -1 ) + ContainerGraph.ScreenColorNodes.OnReorderEventComplete += OnReorderEventComplete; + + } + + private void OnReorderEventComplete() + { + if( m_referenceType == TexReferenceType.Instance && m_referenceNode != null ) + { + m_referenceArrayId = ContainerGraph.ScreenColorNodes.GetNodeRegisterIdx( m_referenceNode.UniqueId ); + } + } + + void UpdateHeaderColor() + { + m_headerColorModifier = ( m_referenceType == TexReferenceType.Object ) ? Color.white : ReferenceHeaderColor; + } + + public override void OnNodeLogicUpdate( DrawInfo drawInfo ) + { + base.OnNodeLogicUpdate( drawInfo ); + if( m_referenceNodeId > -1 && m_referenceNode == null ) + { + m_referenceNode = UIUtils.GetScreenColorNode( m_referenceNodeId ) as ScreenColorNode; + if( m_referenceNode == null ) + { + m_referenceNodeId = -1; + m_referenceArrayId = -1; + m_sizeIsDirty = true; + } + } + + if( m_showSubtitle == m_containerGraph.IsSRP ) + { + m_showSubtitle = !m_containerGraph.IsSRP; + m_sizeIsDirty = true; + } + +#if UNITY_2018_3_OR_NEWER + if( ( ContainerGraph.IsHDRP || ContainerGraph.ParentWindow.IsShaderFunctionWindow ) && ASEPackageManagerHelper.CurrentHDVersion >= ASESRPVersions.ASE_SRP_5_13_0 ) + { + m_inputPorts[ 1 ].Visible = true; + } + else + { + m_inputPorts[ 1 ].Visible = false; + } +#else + m_inputPorts[ 1 ].Visible = false; +#endif + } + + protected override void ChangeSizeFinished() + { + if( m_referenceType == TexReferenceType.Instance ) + { + m_position.width += 20; + } + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + CheckReference(); + + if( SoftValidReference ) + { + m_content.text = m_referenceNode.TitleContent.text + Constants.InstancePostfixStr; + SetAdditonalTitleText( m_referenceNode.AdditonalTitleContent.text ); + + if( m_referenceIconStyle == null ) + { + m_referenceIconStyle = UIUtils.GetCustomStyle( CustomStyle.SamplerTextureIcon ); + } + + Rect iconPos = m_globalPosition; + iconPos.width = 19 * drawInfo.InvertedZoom; + iconPos.height = 19 * drawInfo.InvertedZoom; + + iconPos.y += 6 * drawInfo.InvertedZoom; + iconPos.x += m_globalPosition.width - iconPos.width - 7 * drawInfo.InvertedZoom; + + if( GUI.Button( iconPos, string.Empty, m_referenceIconStyle ) ) + { + UIUtils.FocusOnNode( m_referenceNode, 1, true ); + } + } + } + + void CheckReference() + { + if( m_referenceType != TexReferenceType.Instance ) + { + return; + } + + if( m_referenceArrayId > -1 ) + { + ParentNode newNode = UIUtils.GetScreenColorNode( m_referenceArrayId ); + if( newNode == null || newNode.UniqueId != m_referenceNodeId ) + { + m_referenceNode = null; + int count = UIUtils.GetScreenColorNodeAmount(); + for( int i = 0; i < count; i++ ) + { + ParentNode node = UIUtils.GetScreenColorNode( i ); + if( node.UniqueId == m_referenceNodeId ) + { + m_referenceNode = node as ScreenColorNode; + m_referenceArrayId = i; + break; + } + } + } + } + + if( m_referenceNode == null && m_referenceNodeId > -1 ) + { + m_referenceNodeId = -1; + m_referenceArrayId = -1; + } + } + + public override void DrawMainPropertyBlock() + { + EditorGUI.BeginChangeCheck(); + m_referenceType = (TexReferenceType)EditorGUILayoutPopup( Constants.ReferenceTypeStr, (int)m_referenceType, Constants.ReferenceArrayLabels ); + if( EditorGUI.EndChangeCheck() ) + { + m_sizeIsDirty = true; + if( m_referenceType == TexReferenceType.Object ) + { + UIUtils.RegisterScreenColorNode( this ); + m_content.text = m_propertyInspectorName; + } + else + { + UIUtils.UnregisterScreenColorNode( this ); + if( SoftValidReference ) + { + m_content.text = m_referenceNode.TitleContent.text + Constants.InstancePostfixStr; + } + } + UpdateHeaderColor(); + } + + if( m_referenceType == TexReferenceType.Object ) + { + EditorGUI.BeginDisabledGroup( m_containerGraph.IsSRP ); + { + EditorGUI.BeginChangeCheck(); + m_useCustomGrab = EditorGUILayoutToggle( "Custom Grab Pass", m_useCustomGrab ); + EditorGUI.BeginDisabledGroup( !m_useCustomGrab ); + DrawMainPropertyBlockNoPrecision(); + EditorGUI.EndDisabledGroup(); + + m_normalize = EditorGUILayoutToggle( "Normalize", m_normalize ); + if( EditorGUI.EndChangeCheck() ) + { + UpdatePort(); + if( m_useCustomGrab ) + { + BeginPropertyFromInspectorCheck(); + } + } + } + EditorGUI.EndDisabledGroup(); + } + else + { + string[] arr = UIUtils.ScreenColorNodeArr(); + bool guiEnabledBuffer = GUI.enabled; + if( arr != null && arr.Length > 0 ) + { + GUI.enabled = true; + } + else + { + m_referenceArrayId = -1; + GUI.enabled = false; + } + + m_referenceArrayId = EditorGUILayoutPopup( Constants.AvailableReferenceStr, m_referenceArrayId, arr ); + GUI.enabled = guiEnabledBuffer; + EditorGUI.BeginDisabledGroup( m_containerGraph.IsSRP ); + { + EditorGUI.BeginChangeCheck(); + m_normalize = EditorGUILayoutToggle( "Normalize", m_normalize ); + if( EditorGUI.EndChangeCheck() ) + { + UpdatePort(); + } + } + EditorGUI.EndDisabledGroup(); + } + ShowVariableMode(); + ShowAutoRegister(); +#if UNITY_2018_3_OR_NEWER + if( ( ContainerGraph.IsHDRP || ContainerGraph.ParentWindow.IsShaderFunctionWindow ) && ASEPackageManagerHelper.CurrentHDVersion >= ASESRPVersions.ASE_SRP_5_13_0 ) + { + m_exposure = EditorGUILayoutToggle( "Exposure", m_exposure ); + } +#endif + } + + private void UpdatePort() + { + if( m_normalize ) + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT4, false ); + else + m_inputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT2, false ); + } + + public override void DrawTitle( Rect titlePos ) + { + if( !m_isEditing && ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD3 ) + { + GUI.Label( titlePos, "Grab Screen Color", UIUtils.GetCustomStyle( CustomStyle.NodeTitle ) ); + } + + if( m_useCustomGrab || SoftValidReference ) + { + base.DrawTitle( titlePos ); + m_previousAdditonalTitle = m_additionalContent.text; + } + else + if( ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD3 ) + { + SetAdditonalTitleTextOnCallback( GrabTextureDefault, ( instance, newSubTitle ) => instance.AdditonalTitleContent.text = string.Format( Constants.SubTitleVarNameFormatStr, newSubTitle ) ); + //GUI.Label( titlePos, PropertyInspectorName, UIUtils.GetCustomStyle( CustomStyle.NodeTitle ) ); + } + } + + public void SetMacros( ref MasterNodeDataCollector dataCollector ) + { +#if UNITY_5_6_OR_NEWER + if( !dataCollector.IsTemplate || dataCollector.CurrentSRPType == TemplateSRPType.BuiltIn ) + { + for( int i = 0; i < ASEDeclareMacro.Length; i++ ) + { + dataCollector.AddToDirectives( ASEDeclareMacro[ i ] ); + } + } +#endif + } + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + SetMacros( ref dataCollector ); + +#if !UNITY_2018_3_OR_NEWER + if( dataCollector.IsTemplate && dataCollector.CurrentSRPType == TemplateSRPType.HD ) + { + UIUtils.ShowMessage( UniqueId, "GrabPasses are not supported on Unity HD Scriptable Rendering Pipeline old versions." ); + return GetOutputColorItem( 0, outputId, "(0).xxxx" ); + } +#endif + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return GetOutputColorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + + string valueName = string.Empty; + if( dataCollector.IsSRP ) + { +#if !UNITY_2018_3_OR_NEWER + dataCollector.AddToUniforms( UniqueId, DeclareOpaqueTextureObject ); + dataCollector.AddToUniforms( UniqueId, DeclareOpaqueTextureSampler ); +#endif + valueName = FetchVarName + OutputId; + dataCollector.AddToDirectives( OpaqueTextureDefine, -1 , AdditionalLineType.Define); + string uvCoords = GetUVCoords( ref dataCollector, ignoreLocalVar, false ); + if( dataCollector.TemplateDataCollectorInstance.IsLWRP ) + { + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT4, valueName, string.Format( LWFetchOpaqueTexture, uvCoords ) ); + } + else + { +#if UNITY_2018_3_OR_NEWER + if( ASEPackageManagerHelper.CurrentHDVersion >= ASESRPVersions.ASE_SRP_5_13_0 ) + { + string lod = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + dataCollector.AddFunction( HDSampleSceneColorFunc5[ 0 ], HDSampleSceneColorFunc5, false ); + string exposureValue = m_exposure ? "1.0" : "GetInverseCurrentExposureMultiplier()"; + dataCollector.AddLocalVariable( UniqueId, m_currentPrecisionType, WirePortDataType.FLOAT4, valueName, string.Format( HDSampleSceneColorHeader5, uvCoords, lod, exposureValue ) ); + } + else + { + dataCollector.AddFunction( HDSampleSceneColorFunc4[ 0 ], HDSampleSceneColorFunc4, false ); + dataCollector.AddLocalVariable( UniqueId, m_currentPrecisionType, WirePortDataType.FLOAT4, valueName, string.Format( HDSampleSceneColorHeader4, uvCoords ) ); + } +#endif + } + } + else + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalVar ); + string propertyName = CurrentPropertyReference; + OnPropertyNameChanged(); + //bool emptyName = string.IsNullOrEmpty( m_propertyInspectorName ) || propertyName == GrabTextureDefault; + bool emptyName = string.IsNullOrEmpty( m_propertyInspectorName ) || !m_useCustomGrab; + dataCollector.AddGrabPass( emptyName ? string.Empty : propertyName ); + valueName = SetFetchedData( ref dataCollector, ignoreLocalVar ); + } + + m_outputPorts[ 0 ].SetLocalValue( valueName, dataCollector.PortCategory ); + return GetOutputColorItem( 0, outputId, valueName ); + } + + + public override void OnPropertyNameChanged() + { + base.OnPropertyNameChanged(); + UIUtils.UpdateScreenColorDataNode( UniqueId, DataToArray ); + } + + public string SetFetchedData( ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + string propertyName = CurrentPropertyReference; + + bool isProjecting = m_normalize; + + if( !m_inputPorts[ 0 ].IsConnected ) // to generate proper screen pos by itself + isProjecting = true; + + if( ignoreLocalVar ) + { + string samplerValue = SamplerType + ( isProjecting ? "proj" : "" ) + "( " + propertyName + ", " + GetUVCoords( ref dataCollector, ignoreLocalVar, isProjecting ) + " )"; + return samplerValue; + } + + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string uvValue = GetUVCoords( ref dataCollector, ignoreLocalVar, isProjecting ); +#if UNITY_5_6_OR_NEWER + if( isProjecting ) + { + uvValue = string.Format( "{0}.xy/{0}.w", uvValue ); + } + string samplerOp = string.Format( "UNITY_SAMPLE_SCREENSPACE_TEXTURE({0},{1})", propertyName, uvValue ); +#else + string samplerOp = SamplerType + ( isProjecting ? "proj" : "" ) + "( " + propertyName + ", " + uvValue + " )"; +#endif + dataCollector.AddLocalVariable( UniqueId, UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, m_outputPorts[ 0 ].DataType ) + " " + ScreenColorStr + OutputId + " = " + samplerOp + ";" ); + return ScreenColorStr + OutputId; + } + + private string GetUVCoords( ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar, bool isProjecting ) + { + string result = string.Empty; + + if( m_inputPorts[ 0 ].IsConnected ) + { + result = m_inputPorts[ 0 ].GenerateShaderForOutput( ref dataCollector, ( isProjecting ? WirePortDataType.FLOAT4 : WirePortDataType.FLOAT2 ), ignoreLocalVar, true ); + } + else + { + string customScreenPos = null; + + if( dataCollector.IsTemplate ) + customScreenPos = dataCollector.TemplateDataCollectorInstance.GetScreenPos( CurrentPrecisionType ); + + if( isProjecting ) + result = GeneratorUtils.GenerateGrabScreenPosition( ref dataCollector, UniqueId, CurrentPrecisionType, !dataCollector.UsingCustomScreenPos, customScreenPos ); + else + result = GeneratorUtils.GenerateGrabScreenPositionNormalized( ref dataCollector, UniqueId, CurrentPrecisionType, !dataCollector.UsingCustomScreenPos, customScreenPos ); + } + + if( isProjecting && !dataCollector.IsSRP ) +#if UNITY_5_6_OR_NEWER + return result; +#else + return "UNITY_PROJ_COORD( " + result + " )"; +#endif + else + return result; + } + + public override void Destroy() + { + base.Destroy(); + if( m_referenceType == TexReferenceType.Object ) + { + UIUtils.UnregisterScreenColorNode( this ); + } + if( UniqueId > -1 ) + ContainerGraph.ScreenColorNodes.OnReorderEventComplete -= OnReorderEventComplete; + } + + public bool SoftValidReference + { + get + { + if( m_referenceType == TexReferenceType.Instance && m_referenceArrayId > -1 ) + { + m_referenceNode = UIUtils.GetScreenColorNode( m_referenceArrayId ); + if( m_referenceNode == null ) + { + m_referenceArrayId = -1; + m_referenceWidth = -1; + } + else if( m_referenceWidth != m_referenceNode.Position.width ) + { + m_referenceWidth = m_referenceNode.Position.width; + m_sizeIsDirty = true; + } + return m_referenceNode != null; + } + return false; + } + } + + public string CurrentPropertyReference + { + get + { + string propertyName = string.Empty; + if( m_referenceType == TexReferenceType.Instance && m_referenceArrayId > -1 ) + { + ScreenColorNode node = UIUtils.GetScreenColorNode( m_referenceArrayId ); + propertyName = ( node != null ) ? node.PropertyName : m_propertyName; + } + else if( !m_useCustomGrab ) + { + propertyName = GrabTextureDefault; + } + else + { + propertyName = m_propertyName; + } + return propertyName; + } + } + + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > 12 ) + { + m_referenceType = (TexReferenceType)Enum.Parse( typeof( TexReferenceType ), GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > 22 ) + { + m_referenceNodeId = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + else + { + m_referenceArrayId = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + + if( m_referenceType == TexReferenceType.Instance ) + { + UIUtils.UnregisterScreenColorNode( this ); + } + + UpdateHeaderColor(); + } + + if( UIUtils.CurrentShaderVersion() > 12101 ) + { + m_useCustomGrab = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + else + { + m_useCustomGrab = true; + } + + if( UIUtils.CurrentShaderVersion() > 14102 ) + { + m_normalize = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + + if( UIUtils.CurrentShaderVersion() > 18801 ) + { + m_exposure = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + + if( !m_isNodeBeingCopied && m_referenceType == TexReferenceType.Object ) + { + ContainerGraph.ScreenColorNodes.UpdateDataOnNode( UniqueId, DataToArray ); + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_referenceType ); + IOUtils.AddFieldValueToString( ref nodeInfo, ( ( m_referenceNode != null ) ? m_referenceNode.UniqueId : -1 ) ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_useCustomGrab ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_normalize ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_exposure ); + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + if( m_referenceType == TexReferenceType.Instance ) + { + if( UIUtils.CurrentShaderVersion() > 22 ) + { + m_referenceNode = UIUtils.GetNode( m_referenceNodeId ) as ScreenColorNode; + m_referenceArrayId = UIUtils.GetScreenColorNodeRegisterId( m_referenceNodeId ); + } + else + { + m_referenceNode = UIUtils.GetScreenColorNode( m_referenceArrayId ); + if( m_referenceNode != null ) + { + m_referenceNodeId = m_referenceNode.UniqueId; + } + } + } + + if( UIUtils.CurrentShaderVersion() <= 14102 ) + { + if( m_inputPorts[ 0 ].DataType == WirePortDataType.FLOAT4 ) + m_normalize = true; + else + m_normalize = false; + } + } + + public override string PropertyName + { + get + { + if( m_useCustomGrab ) + return base.PropertyName; + else + return GrabTextureDefault; + } + } + + public override string GetPropertyValStr() + { + return PropertyName; + } + + public override string DataToArray { get { return m_propertyName; } } + + public override string GetUniformValue() + { + if( SoftValidReference ) + { + if( m_referenceNode.IsConnected ) + return string.Empty; + + return m_referenceNode.GetUniformValue(); + } +#if UNITY_5_6_OR_NEWER + return "ASE_DECLARE_SCREENSPACE_TEXTURE( " + PropertyName + " )"; +#else + return "uniform sampler2D " + PropertyName + ";"; +#endif + } + + public override bool GetUniformData( out string dataType, out string dataName, ref bool fullValue ) + { + if( SoftValidReference ) + { + //if ( m_referenceNode.IsConnected ) + //{ + // dataType = string.Empty; + // dataName = string.Empty; + //} + + return m_referenceNode.GetUniformData( out dataType, out dataName, ref fullValue ); + } +#if UNITY_5_6_OR_NEWER + dataName = "ASE_DECLARE_SCREENSPACE_TEXTURE( " + PropertyName + " )"; + dataType = string.Empty; + fullValue = true; +#else + dataType = "sampler2D"; + dataName = PropertyName; +#endif + return true; + } + + public override void CheckIfAutoRegister( ref MasterNodeDataCollector dataCollector ) + { + if( m_autoRegister && (m_connStatus != NodeConnectionStatus.Connected || InsideShaderFunction )) + { + SetMacros( ref dataCollector ); + RegisterProperty( ref dataCollector ); + string propertyName = CurrentPropertyReference; + bool emptyName = string.IsNullOrEmpty( m_propertyInspectorName ) || propertyName == GrabTextureDefault; + dataCollector.AddGrabPass( emptyName ? string.Empty : propertyName ); + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ScreenColorNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ScreenColorNode.cs.meta new file mode 100644 index 0000000..2012d50 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ScreenColorNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b266c7cca236bcb469d6d4f13df55df5 +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ScreenDepthNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ScreenDepthNode.cs new file mode 100644 index 0000000..d08d1c8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ScreenDepthNode.cs @@ -0,0 +1,173 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Screen Depth", "Camera And Screen", "Given a screen position returns the depth of the scene to the object as seen by the camera" )] + public sealed class ScreenDepthNode : ParentNode + { + [SerializeField] + private bool m_convertToLinear = true; + + [SerializeField] + private int m_viewSpaceInt = 0; + + private const string ConvertToLinearStr = "Convert To Linear"; + + private readonly string[] m_viewSpaceStr = { "Eye Space", "0-1 Space" }; + + private readonly string[] m_vertexNameStr = { "eyeDepth", "clampDepth" }; + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT4, false, "Pos" ); + AddOutputPort( WirePortDataType.FLOAT, "Depth" ); + m_autoWrapProperties = true; + m_hasLeftDropdown = true; + SetAdditonalTitleText( string.Format( Constants.SubTitleSpaceFormatStr, m_viewSpaceStr[ m_viewSpaceInt ] ) ); + } + + public override void AfterCommonInit() + { + base.AfterCommonInit(); + if( PaddingTitleLeft == 0 ) + { + PaddingTitleLeft = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + if( PaddingTitleRight == 0 ) + PaddingTitleRight = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + } + } + + public override void Destroy() + { + base.Destroy(); + m_upperLeftWidget = null; + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + EditorGUI.BeginChangeCheck(); + m_viewSpaceInt = m_upperLeftWidget.DrawWidget( this, m_viewSpaceInt, m_viewSpaceStr ); + if( EditorGUI.EndChangeCheck() ) + { + SetAdditonalTitleText( string.Format( Constants.SubTitleSpaceFormatStr, m_viewSpaceStr[ m_viewSpaceInt ] ) ); + } + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUI.BeginChangeCheck(); + m_viewSpaceInt = EditorGUILayoutPopup( "View Space", m_viewSpaceInt, m_viewSpaceStr ); + if( EditorGUI.EndChangeCheck() ) + { + SetAdditonalTitleText( string.Format( Constants.SubTitleSpaceFormatStr, m_viewSpaceStr[ m_viewSpaceInt ] ) ); + } + + m_convertToLinear = EditorGUILayoutToggle( ConvertToLinearStr, m_convertToLinear ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + { + UIUtils.ShowNoVertexModeNodeMessage( this ); + return "0"; + } + + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return GetOutputColorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + + if( !( dataCollector.IsTemplate && dataCollector.IsSRP ) ) + dataCollector.AddToIncludes( UniqueId, Constants.UnityCgLibFuncs ); + + if( !dataCollector.IsTemplate || dataCollector.TemplateDataCollectorInstance.CurrentSRPType != TemplateSRPType.HD ) + { + if( dataCollector.IsTemplate && dataCollector.CurrentSRPType == TemplateSRPType.Lightweight ) + { + //dataCollector.AddToUniforms( UniqueId, Constants.CameraDepthTextureSRPVar ); + //dataCollector.AddToUniforms( UniqueId, Constants.CameraDepthTextureSRPSampler ); + dataCollector.AddToDirectives( Constants.CameraDepthTextureLWEnabler, -1, AdditionalLineType.Define ); + } + else + { + dataCollector.AddToUniforms( UniqueId, Constants.CameraDepthTextureValue ); + } + dataCollector.AddToUniforms( UniqueId, Constants.CameraDepthTextureTexelSize ); + } + + + string screenPosNorm = string.Empty; + if( m_inputPorts[ 0 ].IsConnected ) + screenPosNorm = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + else + { + if( dataCollector.IsTemplate ) + { + if( !dataCollector.TemplateDataCollectorInstance.GetCustomInterpolatedData( TemplateInfoOnSematics.SCREEN_POSITION_NORMALIZED, WirePortDataType.FLOAT4, PrecisionType.Float, ref screenPosNorm, true,MasterNodePortCategory.Fragment ) ) + { + screenPosNorm = GeneratorUtils.GenerateScreenPositionNormalized( ref dataCollector, UniqueId, CurrentPrecisionType, !dataCollector.UsingCustomScreenPos ); + } + } + else + { + screenPosNorm = GeneratorUtils.GenerateScreenPositionNormalized( ref dataCollector, UniqueId, CurrentPrecisionType, !dataCollector.UsingCustomScreenPos ); + } + } + + string screenDepthInstruction = TemplateHelperFunctions.CreateDepthFetch( dataCollector, screenPosNorm ); + + if( m_convertToLinear ) + { + string viewSpace = m_viewSpaceInt == 0 ? "LinearEyeDepth" : "Linear01Depth"; + string formatStr = string.Empty; + if( ( dataCollector.IsTemplate && dataCollector.IsSRP ) ) + formatStr = "(" + screenDepthInstruction + ",_ZBufferParams)"; + else + formatStr = "(" + screenDepthInstruction + ")"; + screenDepthInstruction = viewSpace + formatStr; + } + else + { + if( m_viewSpaceInt == 0 ) + { + screenDepthInstruction = string.Format( "({0}*( _ProjectionParams.z - _ProjectionParams.y ))", screenDepthInstruction ); + } + } + + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT, m_vertexNameStr[ m_viewSpaceInt ] + OutputId, screenDepthInstruction ); + + m_outputPorts[ 0 ].SetLocalValue( m_vertexNameStr[ m_viewSpaceInt ] + OutputId, dataCollector.PortCategory ); + return GetOutputColorItem( 0, outputId, m_vertexNameStr[ m_viewSpaceInt ] + OutputId ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_viewSpaceInt = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() >= 13901 ) + { + m_convertToLinear = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + + SetAdditonalTitleText( string.Format( Constants.SubTitleSpaceFormatStr, m_viewSpaceStr[ m_viewSpaceInt ] ) ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_viewSpaceInt ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_convertToLinear ); + } + } + +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ScreenDepthNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ScreenDepthNode.cs.meta new file mode 100644 index 0000000..95f7777 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ScreenDepthNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 52266d8a6f7f4fe428dcee2ddb0514ac +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ScreenPosInputsNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ScreenPosInputsNode.cs new file mode 100644 index 0000000..6acaa57 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ScreenPosInputsNode.cs @@ -0,0 +1,155 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Screen Position", "Camera And Screen", "Screen space position, you can either get the Screen position as is or Normalize it to have it at the [0,1] range" )] + public sealed class ScreenPosInputsNode : SurfaceShaderINParentNode + { + private const string ProjectStr = "Project"; + private const string UVInvertHack = "Scale and Offset"; + private readonly string[] m_outputTypeStr = { "Normalized", "Screen" }; + + [SerializeField] + private int m_outputTypeInt = 0; + + [SerializeField] + private bool m_scaleAndOffset = false; + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_currentInput = SurfaceInputs.SCREEN_POS; + InitialSetup(); + m_textLabelWidth = 65; + m_autoWrapProperties = true; + + m_hasLeftDropdown = true; + m_previewShaderGUID = "a5e7295278a404175b732f1516fb68a6"; + + if( UIUtils.CurrentWindow != null && UIUtils.CurrentWindow.CurrentGraph != null && UIUtils.CurrentShaderVersion() <= 2400 ) + { + m_outputTypeInt = 1; + m_previewMaterialPassId = m_outputTypeInt; + } + + ConfigureHeader(); + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + EditorGUI.BeginChangeCheck(); + m_outputTypeInt = m_upperLeftWidget.DrawWidget( this, m_outputTypeInt, m_outputTypeStr ); + if( EditorGUI.EndChangeCheck() ) + { + ConfigureHeader(); + } + } + + public override void DrawProperties() + { + //base.DrawProperties(); + + EditorGUI.BeginChangeCheck(); + m_outputTypeInt = EditorGUILayoutPopup( "Type", m_outputTypeInt, m_outputTypeStr ); + if( EditorGUI.EndChangeCheck() ) + { + ConfigureHeader(); + } + } + + void ConfigureHeader() + { + SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, m_outputTypeStr[ m_outputTypeInt ] ) ); + m_previewMaterialPassId = m_outputTypeInt; + } + + public override void Reset() + { + base.Reset(); + } + + public override void Destroy() + { + base.Destroy(); + m_upperLeftWidget = null; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + { + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + } + m_currentPrecisionType = PrecisionType.Float; + + string screenPos = string.Empty; + if( m_outputTypeInt == 0 ) + { + if( dataCollector.IsTemplate ) + { + screenPos = dataCollector.TemplateDataCollectorInstance.GetScreenPosNormalized( CurrentPrecisionType ); + } + else + { + screenPos = GeneratorUtils.GenerateScreenPositionNormalized( ref dataCollector, UniqueId, CurrentPrecisionType); + } + } + else + { + if( dataCollector.IsTemplate ) + { + screenPos = dataCollector.TemplateDataCollectorInstance.GetScreenPos( CurrentPrecisionType ); + } + else + { + screenPos = GeneratorUtils.GenerateScreenPosition( ref dataCollector, UniqueId, CurrentPrecisionType ); + } + } + + m_outputPorts[ 0 ].SetLocalValue( screenPos, dataCollector.PortCategory ); + return GetOutputVectorItem( 0, outputId, screenPos ); + + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > 2400 ) + { + if( UIUtils.CurrentShaderVersion() < 6102 ) + { + bool project = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + m_outputTypeInt = project ? 0 : 1; + } + else + { + m_outputTypeInt = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + } + + if( UIUtils.CurrentShaderVersion() > 3107 ) + { + m_scaleAndOffset = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + m_scaleAndOffset = false; + } + + ConfigureHeader(); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_outputTypeInt ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_scaleAndOffset ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ScreenPosInputsNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ScreenPosInputsNode.cs.meta new file mode 100644 index 0000000..60d2abb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ScreenPosInputsNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 32cea8ff65efa3844a0047477ec789da +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/SurfaceShaderINParentNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/SurfaceShaderINParentNode.cs new file mode 100644 index 0000000..e0f094b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/SurfaceShaderINParentNode.cs @@ -0,0 +1,122 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class SurfaceShaderINParentNode : ParentNode + { + [SerializeField] + protected SurfaceInputs m_currentInput; + + [SerializeField] + protected string m_currentInputValueStr; + + [SerializeField] + protected string m_currentInputDecStr; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_currentInput = SurfaceInputs.UV_COORDS; + m_textLabelWidth = 65; + m_customPrecision = true; + } + + public override void DrawProperties() + { + base.DrawProperties(); + DrawPrecisionProperty(); + } + //This needs to be called on the end of the CommonInit on all children + protected void InitialSetup() + { + m_currentInputValueStr = Constants.InputVarStr + "." + UIUtils.GetInputValueFromType( m_currentInput ); + + string outputName = "Out"; + switch ( m_currentInput ) + { + case SurfaceInputs.DEPTH: + { + AddOutputPort( WirePortDataType.FLOAT, outputName ); + } + break; + case SurfaceInputs.UV_COORDS: + { + outputName = "UV"; + AddOutputVectorPorts( WirePortDataType.FLOAT2, outputName ); + } + break; + case SurfaceInputs.UV2_COORDS: + { + outputName = "UV"; + AddOutputVectorPorts( WirePortDataType.FLOAT2, outputName ); + } + break; + case SurfaceInputs.VIEW_DIR: + { + outputName = "XYZ"; + AddOutputVectorPorts( WirePortDataType.FLOAT3, outputName ); + } + break; + case SurfaceInputs.COLOR: + { + outputName = "RGBA"; + AddOutputVectorPorts( WirePortDataType.FLOAT4, outputName ); + } + break; + case SurfaceInputs.SCREEN_POS: + { + outputName = "XYZW"; + AddOutputVectorPorts( WirePortDataType.FLOAT4, outputName ); + } + break; + case SurfaceInputs.WORLD_POS: + { + outputName = "XYZ"; + AddOutputVectorPorts( WirePortDataType.FLOAT3, outputName ); + } + break; + case SurfaceInputs.WORLD_REFL: + { + outputName = "XYZ"; + AddOutputVectorPorts( WirePortDataType.FLOAT3, outputName ); + } + break; + case SurfaceInputs.WORLD_NORMAL: + { + outputName = "XYZ"; + AddOutputVectorPorts( WirePortDataType.FLOAT3, outputName ); + } + break; + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + dataCollector.AddToInput( UniqueId, m_currentInput, CurrentPrecisionType ); + switch ( m_currentInput ) + { + case SurfaceInputs.VIEW_DIR: + case SurfaceInputs.WORLD_REFL: + case SurfaceInputs.WORLD_NORMAL: + { + dataCollector.AddToInput( UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + } + break; + case SurfaceInputs.WORLD_POS: + case SurfaceInputs.DEPTH: + case SurfaceInputs.UV_COORDS: + case SurfaceInputs.UV2_COORDS: + case SurfaceInputs.COLOR: + case SurfaceInputs.SCREEN_POS: break; + }; + + return GetOutputVectorItem( 0, outputId, m_currentInputValueStr ); + } + + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/SurfaceShaderINParentNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/SurfaceShaderINParentNode.cs.meta new file mode 100644 index 0000000..92a1e5b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/SurfaceShaderINParentNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 71628885b2fde0944bf7dd8e4eb2770f +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/TexelSizeNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/TexelSizeNode.cs new file mode 100644 index 0000000..1de1003 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/TexelSizeNode.cs @@ -0,0 +1,325 @@ +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; + +using System; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Texel Size", "Textures", "Texel Size for a given texture object" )] + public sealed class TexelSizeNode : ParentNode + { + private readonly string[] Dummy = { string.Empty }; + [SerializeField] + private int m_referenceSamplerId = -1; + + [SerializeField] + private int m_referenceNodeId = -1; + + [SerializeField] + private TexturePropertyNode m_inputReferenceNode = null; + + private TexturePropertyNode m_referenceNode = null; + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + + [SerializeField] + private string m_previousTexture = string.Empty; + + private int m_cachedSamplerId = -1; + private int m_cachedSamplerIdArray = -1; + private int m_cachedSamplerIdCube = -1; + private int m_cachedSamplerId3D = -1; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.SAMPLER2D, false, "Tex" ); + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.SAMPLER1D, WirePortDataType.SAMPLER2D, WirePortDataType.SAMPLER3D, WirePortDataType.SAMPLERCUBE, WirePortDataType.SAMPLER2DARRAY, WirePortDataType.OBJECT ); + AddOutputVectorPorts( WirePortDataType.FLOAT4, Constants.EmptyPortValue ); + ChangeOutputName( 1, "1/Width" ); + ChangeOutputName( 2, "1/Height" ); + ChangeOutputName( 3, "Width" ); + ChangeOutputName( 4, "Height" ); + m_textLabelWidth = 80; + m_autoWrapProperties = true; + m_hasLeftDropdown = true; + m_previewShaderGUID = "6b20226576a059443b58aa2d0b942276"; + } + + public override void AfterCommonInit() + { + base.AfterCommonInit(); + + if( PaddingTitleLeft == 0 ) + { + PaddingTitleLeft = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + if( PaddingTitleRight == 0 ) + PaddingTitleRight = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + } + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + m_inputPorts[ 0 ].MatchPortToConnection(); + m_inputReferenceNode = m_inputPorts[ 0 ].GetOutputNodeWhichIsNotRelay() as TexturePropertyNode; + UpdateTitle(); + } + + public override void OnInputPortDisconnected( int portId ) + { + base.OnInputPortDisconnected( portId ); + m_inputReferenceNode = null; + UpdateTitle(); + } + + public override void OnConnectedOutputNodeChanges( int outputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( outputPortId, otherNodeId, otherPortId, name, type ); + m_inputPorts[ 0 ].MatchPortToConnection(); + UpdateTitle(); + } + + void UpdateTitle() + { + if( m_inputReferenceNode != null ) + { + m_additionalContent.text = string.Format( Constants.PropertyValueLabel, m_inputReferenceNode.PropertyInspectorName ); + } + else if( m_referenceSamplerId > -1 && m_referenceNode != null ) + { + m_additionalContent.text = string.Format( Constants.PropertyValueLabel, m_referenceNode.PropertyInspectorName ); + } + else + { + m_additionalContent.text = string.Empty; + } + m_sizeIsDirty = true; + } + + public override void DrawProperties() + { + base.DrawProperties(); + bool guiEnabledBuffer = GUI.enabled; + EditorGUI.BeginChangeCheck(); + List arr = new List( UIUtils.TexturePropertyNodeArr() ); + + if( arr != null && arr.Count > 0 ) + { + arr.Insert( 0, "None" ); + GUI.enabled = true && ( !m_inputPorts[ 0 ].IsConnected ); + m_referenceSamplerId = EditorGUILayoutPopup( Constants.AvailableReferenceStr, m_referenceSamplerId + 1, arr.ToArray() ) - 1; + } + else + { + m_referenceSamplerId = -1; + GUI.enabled = false; + EditorGUILayoutPopup( Constants.AvailableReferenceStr, m_referenceSamplerId, Dummy ); + } + + GUI.enabled = guiEnabledBuffer; + if( EditorGUI.EndChangeCheck() ) + { + m_referenceNode = UIUtils.GetTexturePropertyNode( m_referenceSamplerId ); + if( m_referenceNode != null ) + { + m_referenceNodeId = m_referenceNode.UniqueId; + } + else + { + m_referenceNodeId = -1; + m_referenceSamplerId = -1; + } + UpdateTitle(); + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + string texelName = string.Empty; + + if( m_inputPorts[ 0 ].IsConnected ) + { + texelName = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ) + "_TexelSize"; + } + else if( m_referenceNode != null ) + { + m_referenceNode.BaseGenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + texelName = m_referenceNode.PropertyName + "_TexelSize"; + } + else + { + texelName = "_TexelSize"; + UIUtils.ShowMessage( UniqueId, "Please specify a texture sample on the Texel Size node", MessageSeverity.Warning ); + } + + dataCollector.AddToUniforms( UniqueId, "float4 " + texelName + ";", dataCollector.IsSRP ); + + switch( outputId ) + { + case 0: return texelName; + case 1: return ( texelName + ".x" ); + case 2: return ( texelName + ".y" ); + case 3: return ( texelName + ".z" ); + case 4: return ( texelName + ".w" ); + } + + return string.Empty; + } + + void SetPreviewTexture( Texture newValue ) + { + if( newValue is Cubemap ) + { + m_previewMaterialPassId = 3; + if( m_cachedSamplerIdCube == -1 ) + m_cachedSamplerIdCube = Shader.PropertyToID( "_Cube" ); + + PreviewMaterial.SetTexture( m_cachedSamplerIdCube, newValue as Cubemap ); + } + else if( newValue is Texture2DArray ) + { + + m_previewMaterialPassId = 2; + if( m_cachedSamplerIdArray == -1 ) + m_cachedSamplerIdArray = Shader.PropertyToID( "_Array" ); + + PreviewMaterial.SetTexture( m_cachedSamplerIdArray, newValue as Texture2DArray ); + } + else if( newValue is Texture3D ) + { + m_previewMaterialPassId = 1; + if( m_cachedSamplerId3D == -1 ) + m_cachedSamplerId3D = Shader.PropertyToID( "_Sampler3D" ); + + PreviewMaterial.SetTexture( m_cachedSamplerId3D, newValue as Texture3D ); + } + else + { + m_previewMaterialPassId = 0; + if( m_cachedSamplerId == -1 ) + m_cachedSamplerId = Shader.PropertyToID( "_Sampler" ); + + PreviewMaterial.SetTexture( m_cachedSamplerId, newValue ); + } + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + if( m_inputPorts[ 0 ].IsConnected ) + { + SetPreviewTexture( m_inputPorts[ 0 ].InputPreviewTexture( ContainerGraph ) ); + } + else if( m_referenceNode != null ) + { + if( m_referenceNode.Value != null ) + { + SetPreviewTexture( m_referenceNode.Value ); + } + else + { + SetPreviewTexture( m_referenceNode.PreviewTexture ); + } + } + } + + public override void OnNodeLogicUpdate( DrawInfo drawInfo ) + { + base.OnNodeLogicUpdate( drawInfo ); + + if( m_referenceNode != null && m_previousTexture != m_referenceNode.AdditonalTitleContent.text ) + { + m_previousTexture = m_referenceNode.AdditonalTitleContent.text; + PreviewIsDirty = true; + } + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + EditorGUI.BeginChangeCheck(); + { + List arr = new List( UIUtils.TexturePropertyNodeArr() ); + bool guiEnabledBuffer = GUI.enabled; + + if( arr != null && arr.Count > 0 ) + { + arr.Insert( 0, "None" ); + GUI.enabled = true && ( !m_inputPorts[ 0 ].IsConnected ); + m_referenceSamplerId = m_upperLeftWidget.DrawWidget( this, m_referenceSamplerId + 1, arr.ToArray() ) - 1; + } + else + { + m_referenceSamplerId = -1; + GUI.enabled = false; + m_upperLeftWidget.DrawWidget( this, m_referenceSamplerId, Dummy ); + } + GUI.enabled = guiEnabledBuffer; + } + if( EditorGUI.EndChangeCheck() ) + { + m_referenceNode = UIUtils.GetTexturePropertyNode( m_referenceSamplerId ); + if( m_referenceNode != null ) + { + m_referenceNodeId = m_referenceNode.UniqueId; + } + else + { + m_referenceNodeId = -1; + m_referenceSamplerId = -1; + } + UpdateTitle(); + } + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + if( UIUtils.CurrentShaderVersion() > 2404 ) + { + m_referenceNode = UIUtils.GetNode( m_referenceNodeId ) as TexturePropertyNode; + m_referenceSamplerId = UIUtils.GetTexturePropertyNodeRegisterId( m_referenceNodeId ); + } + else + { + m_referenceNode = UIUtils.GetTexturePropertyNode( m_referenceSamplerId ); + if( m_referenceNode != null ) + { + m_referenceNodeId = m_referenceNode.UniqueId; + } + } + UpdateTitle(); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > 2404 ) + { + m_referenceNodeId = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + else + { + m_referenceSamplerId = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_referenceNodeId ); + } + + public override void Destroy() + { + base.Destroy(); + m_referenceNode = null; + m_inputReferenceNode = null; + m_upperLeftWidget = null; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/TexelSizeNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/TexelSizeNode.cs.meta new file mode 100644 index 0000000..1e6fa01 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/TexelSizeNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1a23decd88779d24f9af6ae30c3d5a5f +timeCreated: 1481126953 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/UVCoordsParentNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/UVCoordsParentNode.cs new file mode 100644 index 0000000..b259d89 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/UVCoordsParentNode.cs @@ -0,0 +1,112 @@ +//// Amplify Shader Editor - Visual Shader Editing Tool +//// Copyright (c) Amplify Creations, Lda + +//using UnityEngine; +//using UnityEditor; +//using System; + +//namespace AmplifyShaderEditor +//{ +// [Serializable] +// [NodeAttributes( "[Old]Texture Coordinates", "Surface Data", "Texture UV coordinates set", null, KeyCode.U, false )] +// public sealed class UVCoordsParentNode : ParentNode +// { +// private const string TilingStr = "Tiling"; + +// [SerializeField] +// private int m_textureCoordChannel = 0; + +// [SerializeField] +// private int m_textureCoordSet = 0; + +// [SerializeField] +// private Vector2 m_tiling = new Vector2( 1, 1 ); + +// protected override void CommonInit( int uniqueId ) +// { +// base.CommonInit( uniqueId ); +// AddOutputVectorPorts( WirePortDataType.FLOAT2, Constants.EmptyPortValue ); +// m_textLabelWidth = 75; +// } + +// public override void DrawProperties() +// { +// base.DrawProperties(); +// int newChannel = EditorGUILayoutIntPopup( Constants.AvailableUVChannelLabel, m_textureCoordChannel, Constants.AvailableUVChannelsStr, Constants.AvailableUVChannels ); +// if ( newChannel != m_textureCoordChannel ) +// { +// if ( UIUtils.IsChannelAvailable( newChannel ) ) +// { +// UIUtils.ShowMessage( "Attempting to use an unoccupied used texture channel" ); +// } +// else +// { +// m_textureCoordChannel = newChannel; +// } +// } +// else if ( m_textureCoordChannel > -1 && UIUtils.IsChannelAvailable( m_textureCoordChannel ) ) +// { +// UIUtils.ShowMessage( "Texture Channel " + m_textureCoordChannel + " is unavailable for TextureCoordinate node" ); +// m_textureCoordChannel = -1; +// } + +// m_textureCoordSet = EditorGUILayoutIntPopup( Constants.AvailableUVSetsLabel, m_textureCoordSet, Constants.AvailableUVSetsStr, Constants.AvailableUVSets ); + +// m_tiling = EditorGUILayoutVector2Field( TilingStr, m_tiling ); +// } + +// public override void Draw( DrawInfo drawInfo ) +// { +// base.Draw( drawInfo ); +// if ( m_isVisible ) +// { +// m_propertyDrawPos.x = m_globalPosition.x + Constants.FLOAT_WIDTH_SPACING; +// m_propertyDrawPos.y = m_outputPorts[ 1 ].Position.y; +// m_propertyDrawPos.width = 2.7f * drawInfo.InvertedZoom * Constants.FLOAT_DRAW_WIDTH_FIELD_SIZE; +// m_propertyDrawPos.height = drawInfo.InvertedZoom * Constants.FLOAT_DRAW_HEIGHT_FIELD_SIZE; + +// m_propertyDrawPos.y = m_outputPorts[ 1 ].Position.y; +// UIUtils.DrawFloat( this, ref m_propertyDrawPos, ref m_tiling.x ); + +// m_propertyDrawPos.y = m_outputPorts[ 2 ].Position.y; +// UIUtils.DrawFloat( this, ref m_propertyDrawPos, ref m_tiling.y ); +// } +// } + +// public override void ReadFromString( ref string[] nodeParams ) +// { +// base.ReadFromString( ref nodeParams ); +// m_textureCoordChannel = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); +// m_tiling.x = Convert.ToSingle( GetCurrentParam( ref nodeParams ) ); +// m_tiling.y = Convert.ToSingle( GetCurrentParam( ref nodeParams ) ); +// } + +// public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) +// { +// base.WriteToString( ref nodeInfo, ref connectionsInfo ); +// IOUtils.AddFieldValueToString( ref nodeInfo, m_textureCoordChannel ); +// IOUtils.AddFieldValueToString( ref nodeInfo, m_tiling.x ); +// IOUtils.AddFieldValueToString( ref nodeInfo, m_tiling.y ); +// } + +// public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) +// { +// string uvChannelDeclaration = IOUtils.GetUVChannelDeclaration( UIUtils.GetChannelName( m_textureCoordChannel ), m_textureCoordChannel, m_textureCoordSet ); +// dataCollector.AddToInput( UniqueId, uvChannelDeclaration, true ); + +// if ( dataCollector.GetChannelUsage( m_textureCoordChannel ) != TextureChannelUsage.Used ) +// dataCollector.SetChannelUsage( m_textureCoordChannel, TextureChannelUsage.Required ); + +// string uvTileStr = string.Empty; +// switch ( outputId ) +// { +// case 0: { uvTileStr = "float2( " + m_tiling.x + " , " + m_tiling.y + " )"; } break; +// case 1: { uvTileStr = m_tiling.x.ToString(); } break; +// case 2: { uvTileStr = m_tiling.y.ToString(); } break; +// } +// string uvChannelName = IOUtils.GetUVChannelName( UIUtils.GetChannelName( m_textureCoordChannel ), m_textureCoordSet ); +// return ( uvTileStr + "*" + GetOutputVectorItem( 0, outputId, Constants.InputVarStr + "." + uvChannelName ) ); +// } + +// } +//} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/UVCoordsParentNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/UVCoordsParentNode.cs.meta new file mode 100644 index 0000000..eae8ca5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/UVCoordsParentNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 73fb18e7d547d514695cb0b83a29f80e +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ViewDirInputsCoordNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ViewDirInputsCoordNode.cs new file mode 100644 index 0000000..e60a359 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ViewDirInputsCoordNode.cs @@ -0,0 +1,167 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +using System; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + public enum ViewSpace + { + Tangent, + World + } + + [Serializable] + [NodeAttributes( "View Dir", "Camera And Screen", "View direction vector, you can select between World space or Tangent space" )] + public sealed class ViewDirInputsCoordNode : SurfaceShaderINParentNode + { + private const string SpaceStr = "Space"; + private const string WorldDirVarStr = "worldViewDir"; + private const string NormalizeOptionStr = "Safe Normalize"; + + [SerializeField] + private bool m_safeNormalize = false; + + [SerializeField] + private ViewSpace m_viewDirSpace = ViewSpace.World; + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_currentInput = SurfaceInputs.VIEW_DIR; + InitialSetup(); + m_textLabelWidth = 120; + m_autoWrapProperties = true; + m_drawPreviewAsSphere = true; + m_hasLeftDropdown = true; + UpdateTitle(); + m_previewShaderGUID = "07b57d9823df4bd4d8fe6dcb29fca36a"; + } + + private void UpdateTitle() + { + m_additionalContent.text = string.Format( Constants.SubTitleSpaceFormatStr, m_viewDirSpace.ToString() ); + m_sizeIsDirty = true; + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + m_upperLeftWidget.DrawWidget( ref m_viewDirSpace, this, OnWidgetUpdate ); + } + + private readonly Action OnWidgetUpdate = ( x ) => + { + ( x as ViewDirInputsCoordNode ).UpdateTitle(); + }; + + public override void DrawProperties() + { + //base.DrawProperties(); + EditorGUI.BeginChangeCheck(); + m_viewDirSpace = (ViewSpace)EditorGUILayoutEnumPopup( SpaceStr, m_viewDirSpace ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateTitle(); + } + m_safeNormalize = EditorGUILayoutToggle( NormalizeOptionStr, m_safeNormalize ); + EditorGUILayout.HelpBox( "Having safe normalize ON makes sure your view vector is not zero even if you are using your shader with no cameras.", MessageType.None ); + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + if( m_viewDirSpace == ViewSpace.World ) + m_previewMaterialPassId = 0; + else if( m_viewDirSpace == ViewSpace.Tangent ) + m_previewMaterialPassId = 1; + } + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + base.PropagateNodeData( nodeData, ref dataCollector ); + if( m_viewDirSpace == ViewSpace.Tangent ) + dataCollector.DirtyNormal = true; + + if( m_safeNormalize ) + dataCollector.SafeNormalizeViewDir = true; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + if( dataCollector.IsTemplate ) + { + string varName = ( m_viewDirSpace == ViewSpace.World ) ? dataCollector.TemplateDataCollectorInstance.GetViewDir(true,MasterNodePortCategory.Fragment, m_safeNormalize?NormalizeType.Safe:NormalizeType.Regular) : + dataCollector.TemplateDataCollectorInstance.GetTangentViewDir( CurrentPrecisionType, true,MasterNodePortCategory.Fragment, m_safeNormalize ? NormalizeType.Safe : NormalizeType.Regular ); + return GetOutputVectorItem( 0, outputId, varName ); + } + + + if( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + { + string result = GeneratorUtils.GenerateViewDirection( ref dataCollector, UniqueId, m_viewDirSpace ); + return GetOutputVectorItem( 0, outputId, result ); + } + else + { + if( m_viewDirSpace == ViewSpace.World ) + { + if( dataCollector.DirtyNormal || m_safeNormalize ) + { + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_POS ); + string result = GeneratorUtils.GenerateViewDirection( ref dataCollector, UniqueId ); + return GetOutputVectorItem( 0, outputId, result ); + } + else + { + dataCollector.AddToInput( UniqueId, SurfaceInputs.VIEW_DIR, PrecisionType.Float ); + return GetOutputVectorItem( 0, outputId, m_currentInputValueStr ); + //return base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalVar ); + } + } + else + { + if( m_safeNormalize ) + { + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_NORMAL, CurrentPrecisionType ); + dataCollector.AddToInput( UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + dataCollector.ForceNormal = true; + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_POS ); + string result = GeneratorUtils.GenerateViewDirection( ref dataCollector, UniqueId, ViewSpace.Tangent ); + return GetOutputVectorItem( 0, outputId, result ); + } + else + { + dataCollector.ForceNormal = true; + return base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalVar ); + } + } + } + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > 2402 ) + m_viewDirSpace = (ViewSpace)Enum.Parse( typeof( ViewSpace ), GetCurrentParam( ref nodeParams ) ); + + if( UIUtils.CurrentShaderVersion() > 15201 ) + { + m_safeNormalize = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + + UpdateTitle(); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_viewDirSpace ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_safeNormalize ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ViewDirInputsCoordNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ViewDirInputsCoordNode.cs.meta new file mode 100644 index 0000000..3298572 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/ViewDirInputsCoordNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4755b85e957e31d4b96d341070b156b5 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldNormalInputsNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldNormalInputsNode.cs new file mode 100644 index 0000000..d179cdd --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldNormalInputsNode.cs @@ -0,0 +1,119 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "[Deprecated] World Normal", "Surface Data", "Vertex Normal World", null, KeyCode.None, true, true, "World Normal", typeof( WorldNormalVector ) )] + public sealed class WorldNormalInputsNode : SurfaceShaderINParentNode + { + private const string PerPixelLabelStr = "Per Pixel"; + + [SerializeField] + private bool m_perPixel = true; + + [SerializeField] + private string m_precisionString; + + [SerializeField] + private bool m_addInstruction = false; + + public override void Reset() + { + base.Reset(); + m_addInstruction = true; + } + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_currentInput = SurfaceInputs.WORLD_NORMAL; + InitialSetup(); + //UIUtils.AddNormalDependentCount(); + } + + //public override void Destroy() + //{ + // ContainerGraph.RemoveNormalDependentCount(); + // base.Destroy(); + //} + + public override void DrawProperties() + { + base.DrawProperties(); + m_perPixel = EditorGUILayoutToggleLeft( PerPixelLabelStr, m_perPixel ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + if ( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + { + if ( m_addInstruction ) + { + string precision = UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, WirePortDataType.FLOAT3 ); + dataCollector.AddVertexInstruction( precision + " worldNormal = UnityObjectToWorldNormal(" + Constants.VertexShaderInputStr + ".normal)", UniqueId ); + m_addInstruction = false; + } + + return GetOutputVectorItem( 0, outputId, "worldNormal" ); + } + else + { + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_NORMAL, CurrentPrecisionType ); + dataCollector.AddToInput( UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + if ( dataCollector.PortCategory != MasterNodePortCategory.Debug && m_perPixel && dataCollector.DirtyNormal ) + { + //string result = "WorldNormalVector( " + Constants.InputVarStr + " , float3( 0,0,1 ))"; + m_precisionString = UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, WirePortDataType.FLOAT3 ); + string result = string.Format( Constants.WorldNormalLocalDecStr, m_precisionString ); + int count = 0; + for ( int i = 0; i < m_outputPorts.Count; i++ ) + { + if ( m_outputPorts[ i ].IsConnected ) + { + if ( m_outputPorts[ i ].ConnectionCount > 2 ) + { + count = 2; + break; + } + count += 1; + if ( count > 1 ) + break; + } + } + if ( count > 1 ) + { + string localVarName = "WorldNormal" + OutputId; + dataCollector.AddToLocalVariables( UniqueId, CurrentPrecisionType, m_outputPorts[ 0 ].DataType, localVarName, result ); + return GetOutputVectorItem( 0, outputId, localVarName ); + } + else + { + return GetOutputVectorItem( 0, outputId, result ); + } + } + else + { + return base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalVar ); + } + } + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if ( UIUtils.CurrentShaderVersion() > 2504 ) + m_perPixel = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_perPixel ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldNormalInputsNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldNormalInputsNode.cs.meta new file mode 100644 index 0000000..da99f65 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldNormalInputsNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 891e3ffa10c12c54e83a1e40df03df2f +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldNormalVector.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldNormalVector.cs new file mode 100644 index 0000000..861ee6d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldNormalVector.cs @@ -0,0 +1,178 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "World Normal", "Surface Data", "Per pixel world normal vector, accepts a Normal vector in tangent space (ie: normalmap)" )] + public sealed class WorldNormalVector : ParentNode + { + private const string NormalVecValStr = "newWorldNormal"; + private const string NormalVecDecStr = "float3 {0} = {1};"; + + private const string NormalizeOptionStr = "Normalize"; + private const string NormalizeFunc = "normalize( {0} )"; + + [SerializeField] + private bool m_normalize = false; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT3, false, "Normal" ); + AddOutputVectorPorts( WirePortDataType.FLOAT3, "XYZ" ); + m_inputPorts[ 0 ].Vector3InternalData = Vector3.forward; + m_previewShaderGUID = "5f55f4841abb61e45967957788593a9d"; + m_drawPreviewAsSphere = true; + m_autoWrapProperties = true; + m_textLabelWidth = 80; + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + if( m_inputPorts[ 0 ].IsConnected ) + m_previewMaterialPassId = 1; + else + m_previewMaterialPassId = 0; + } + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + base.PropagateNodeData( nodeData, ref dataCollector ); + if( m_inputPorts[ 0 ].IsConnected ) + dataCollector.DirtyNormal = true; + } + + public override void DrawProperties() + { + base.DrawProperties(); + m_normalize = EditorGUILayoutToggle( NormalizeOptionStr, m_normalize ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.IsTemplate ) + { + if( m_inputPorts[ 0 ].IsConnected ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + + + string value = dataCollector.TemplateDataCollectorInstance.GetWorldNormal( UniqueId, CurrentPrecisionType, m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ), OutputId ); + if( m_normalize ) + { + value = string.Format( NormalizeFunc, value ); + } + RegisterLocalVariable( 0, value, ref dataCollector, "worldNormal" + OutputId ); + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + } + else + { + string value = dataCollector.TemplateDataCollectorInstance.GetWorldNormal( CurrentPrecisionType ); + string name; + if( m_normalize ) + { + name = "normalizedWorldNormal"; + value = string.Format( NormalizeFunc, value ); + RegisterLocalVariable( 0, value, ref dataCollector, name ); + } + else + { + name = value; + } + return GetOutputVectorItem( 0, outputId, name ); + } + } + + if( dataCollector.PortCategory == MasterNodePortCategory.Fragment || dataCollector.PortCategory == MasterNodePortCategory.Debug ) + { + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_NORMAL, CurrentPrecisionType ); + + string result = string.Empty; + if( m_inputPorts[ 0 ].IsConnected ) + { + dataCollector.AddToInput( UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + dataCollector.ForceNormal = true; + + result = "(WorldNormalVector( " + Constants.InputVarStr + " , " + m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ) + " ))"; + if( m_normalize ) + { + result = string.Format( NormalizeFunc, result ); + } + + int connCount = 0; + for( int i = 0; i < m_outputPorts.Count; i++ ) + { + connCount += m_outputPorts[ i ].ConnectionCount; + } + + if( connCount > 1 ) + { + dataCollector.AddToLocalVariables( UniqueId, string.Format( NormalVecDecStr, NormalVecValStr + OutputId, result ) ); + return GetOutputVectorItem( 0, outputId, NormalVecValStr + OutputId ); + } + } + else + { + if( !dataCollector.DirtyNormal ) + { + result = GeneratorUtils.GenerateWorldNormal( ref dataCollector, UniqueId, m_normalize ); + } + else + { + dataCollector.AddToInput( UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + result = GeneratorUtils.GenerateWorldNormal( ref dataCollector, UniqueId, m_normalize ); + dataCollector.ForceNormal = true; + } + } + + return GetOutputVectorItem( 0, outputId, result ); + } + else + { + if( m_inputPorts[ 0 ].IsConnected ) + { + string inputTangent = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + + string normal = GeneratorUtils.GenerateWorldNormal( ref dataCollector, UniqueId ); + string tangent = GeneratorUtils.GenerateWorldTangent( ref dataCollector, UniqueId ); + dataCollector.AddToVertexLocalVariables( UniqueId, "float3x3 tangentToWorld = CreateTangentToWorldPerVertex( " + normal + ", " + tangent + ", " + Constants.VertexShaderInputStr + ".tangent.w );" ); + dataCollector.AddToVertexLocalVariables( UniqueId, "float3 tangentNormal" + OutputId + " = " + inputTangent + ";" ); + string result = "(tangentToWorld[0] * tangentNormal" + OutputId + ".x + tangentToWorld[1] * tangentNormal" + OutputId + ".y + tangentToWorld[2] * tangentNormal" + OutputId + ".z)"; + if( m_normalize ) + { + result = string.Format( NormalizeFunc, result ); + } + dataCollector.AddToVertexLocalVariables( UniqueId, "float3 modWorldNormal" + OutputId + " = " + result + ";" ); + return GetOutputVectorItem( 0, outputId, "modWorldNormal" + OutputId ); + } + else + { + string result = GeneratorUtils.GenerateWorldNormal( ref dataCollector, UniqueId, m_normalize ); + return GetOutputVectorItem( 0, outputId, result ); + } + } + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > 14202 ) + { + m_normalize = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_normalize ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldNormalVector.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldNormalVector.cs.meta new file mode 100644 index 0000000..7646e49 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldNormalVector.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d61a084db19701c4fb3030ee953ac509 +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldPosInputsNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldPosInputsNode.cs new file mode 100644 index 0000000..15c0b29 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldPosInputsNode.cs @@ -0,0 +1,37 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "World Position", "Surface Data", "World space position" )] + public sealed class WorldPosInputsNode : SurfaceShaderINParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_currentInput = SurfaceInputs.WORLD_POS; + m_drawPreviewAsSphere = true; + m_previewShaderGUID = "70d5405009b31a349a4d8285f30cf5d9"; + InitialSetup(); + } + + public override void DrawProperties() { } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + if ( dataCollector.IsTemplate ) + { + string varName = dataCollector.TemplateDataCollectorInstance.GetWorldPos(); + return GetOutputVectorItem( 0, outputId, varName ); + } + + string worldPosition = GeneratorUtils.GenerateWorldPosition( ref dataCollector, UniqueId ); + + return GetOutputVectorItem( 0, outputId, worldPosition ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldPosInputsNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldPosInputsNode.cs.meta new file mode 100644 index 0000000..91f10c8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldPosInputsNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 850bb0065928b7f499b869b8adc1ce5c +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldReflInputsNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldReflInputsNode.cs new file mode 100644 index 0000000..99b4978 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldReflInputsNode.cs @@ -0,0 +1,18 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "[Deprecated] World Reflection", "Surface Data", "World reflection vector", null, KeyCode.None, true, true, "World Reflection", typeof( WorldReflectionVector ) )] + public sealed class WorldReflInputsNode : SurfaceShaderINParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_currentInput = SurfaceInputs.WORLD_REFL; + InitialSetup(); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldReflInputsNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldReflInputsNode.cs.meta new file mode 100644 index 0000000..8e4e079 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldReflInputsNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e4f39f3a52f10644392decce9d1e6790 +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldReflectionVector.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldReflectionVector.cs new file mode 100644 index 0000000..6f952e0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldReflectionVector.cs @@ -0,0 +1,215 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "World Reflection", "Surface Data", "Per pixel world reflection vector, accepts a Normal vector in tangent space (ie: normalmap)" )] + public sealed class WorldReflectionVector : ParentNode + { + private const string ReflectionVecValStr = "newWorldReflection"; + private const string ReflectionVecDecStr = "{0} {1} = {2};"; + + private const string NormalizeOptionStr = "Normalize"; + private const string NormalizeFunc = "normalize( {0} )"; + + [SerializeField] + private bool m_normalize = false; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT3, false, "Normal" ); + AddOutputVectorPorts( WirePortDataType.FLOAT3, "XYZ" ); + m_drawPreviewAsSphere = true; + m_previewShaderGUID = "8e267e9aa545eeb418585a730f50273e"; + m_autoWrapProperties = true; + m_textLabelWidth = 80; + //UIUtils.AddNormalDependentCount(); + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + if( m_inputPorts[ 0 ].IsConnected ) + m_previewMaterialPassId = 1; + else + m_previewMaterialPassId = 0; + } + + public override void DrawProperties() + { + base.DrawProperties(); + m_normalize = EditorGUILayoutToggle( NormalizeOptionStr, m_normalize ); + } + + //public override void Destroy() + //{ + // ContainerGraph.RemoveNormalDependentCount(); + // base.Destroy(); + //} + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + base.PropagateNodeData( nodeData, ref dataCollector ); + if( m_inputPorts[ 0 ].IsConnected ) + dataCollector.DirtyNormal = true; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + if( dataCollector.IsTemplate ) + { + if( m_inputPorts[ 0 ].IsConnected ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + + + string value = dataCollector.TemplateDataCollectorInstance.GetWorldReflection( CurrentPrecisionType, m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ) ); + if( m_normalize ) + { + value = string.Format( NormalizeFunc, value ); + } + RegisterLocalVariable( 0, value, ref dataCollector, "worldRefl" + OutputId ); + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + } + else + { + string name; + string value = dataCollector.TemplateDataCollectorInstance.GetWorldReflection( CurrentPrecisionType ); + if( m_normalize ) + { + name = "normalizedWorldRefl"; + value = string.Format( NormalizeFunc, value ); + RegisterLocalVariable( 0, value, ref dataCollector, name ); + } + else + { + name = value; + } + return GetOutputVectorItem( 0, outputId, name ); + } + } + + bool isVertex = ( dataCollector.PortCategory == MasterNodePortCategory.Tessellation || dataCollector.PortCategory == MasterNodePortCategory.Vertex ); + if( isVertex ) + { + if( m_inputPorts[ 0 ].IsConnected ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + + string normal = GeneratorUtils.GenerateWorldNormal( ref dataCollector, UniqueId ); + string tangent = GeneratorUtils.GenerateWorldTangent( ref dataCollector, UniqueId ); + dataCollector.AddToVertexLocalVariables( UniqueId, "float3x3 tangentToWorld = CreateTangentToWorldPerVertex( " + normal + ", "+ tangent + ", "+ Constants.VertexShaderInputStr + ".tangent.w );" ); + string inputTangent = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + dataCollector.AddToVertexLocalVariables( UniqueId, "float3 tangentNormal" + OutputId + " = " + inputTangent + ";" ); + + string viewDir = GeneratorUtils.GenerateViewDirection( ref dataCollector, UniqueId ); + dataCollector.AddToVertexLocalVariables( UniqueId, "float3 modWorldNormal" + OutputId + " = ( tangentToWorld[0] * tangentNormal" + OutputId + ".x + tangentToWorld[1] * tangentNormal" + OutputId + ".y + tangentToWorld[2] * tangentNormal" + OutputId + ".z);" ); + + string value = "reflect( -" + viewDir + ", modWorldNormal" + OutputId + " )"; + if( m_normalize ) + { + value = string.Format( NormalizeFunc, value ); + } + + RegisterLocalVariable( 0, value, ref dataCollector, "modReflection" + OutputId ); + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + } + else + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + + string worldNormal = GeneratorUtils.GenerateWorldNormal( ref dataCollector, UniqueId ); + string viewDir = GeneratorUtils.GenerateViewDirection( ref dataCollector, UniqueId ); + + string value = "reflect( -" + viewDir + ", " + worldNormal + " )"; + if( m_normalize ) + { + value = string.Format( NormalizeFunc, value ); + } + RegisterLocalVariable( 0, value, ref dataCollector, ReflectionVecValStr + OutputId ); + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + } + } + else + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_REFL, CurrentPrecisionType ); + + string result = string.Empty; + if( m_inputPorts[ 0 ].IsConnected ) + { + dataCollector.AddToInput( UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + dataCollector.ForceNormal = true; + + result = "WorldReflectionVector( " + Constants.InputVarStr + " , " + m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ) + " )"; + if( m_normalize ) + { + result = String.Format( NormalizeFunc, result ); + } + int connCount = 0; + for( int i = 0; i < m_outputPorts.Count; i++ ) + { + connCount += m_outputPorts[ i ].ConnectionCount; + } + + if( connCount > 1 ) + { + string precisionType = UIUtils.PrecisionWirePortToCgType( UIUtils.CurrentWindow.CurrentGraph.CurrentPrecision, WirePortDataType.FLOAT3 ); + + dataCollector.AddToLocalVariables( UniqueId, string.Format( ReflectionVecDecStr, precisionType, ReflectionVecValStr + OutputId, result ) ); + RegisterLocalVariable( 0, result, ref dataCollector, ReflectionVecValStr + OutputId ); + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + } + } + else + { + dataCollector.AddToInput( UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + result = GeneratorUtils.GenerateWorldReflection( ref dataCollector, UniqueId , m_normalize ); + if( dataCollector.DirtyNormal ) + dataCollector.ForceNormal = true; + } + + return GetOutputVectorItem( 0, outputId, result ); + //RegisterLocalVariable( 0, result, ref dataCollector, "worldrefVec" + OutputId ); + //return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue ); + } + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > 14202 ) + { + m_normalize = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_normalize ); + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + if( UIUtils.CurrentShaderVersion() <= 14202 ) + { + if( !m_inputPorts[ 0 ].IsConnected ) + { + m_normalize = true; + } + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldReflectionVector.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldReflectionVector.cs.meta new file mode 100644 index 0000000..eb2bf47 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/SurfaceShaderInputs/WorldReflectionVector.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: bd82e1d90bd90fc4d924e97e5fdcc7de +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures.meta new file mode 100644 index 0000000..263b4f7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 3ab7ef71451065148bf8221d353c5020 +folderAsset: yes +timeCreated: 1481126945 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/BlendNormalsNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/BlendNormalsNode.cs new file mode 100644 index 0000000..1c5db39 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/BlendNormalsNode.cs @@ -0,0 +1,104 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Blend Normals", "Textures", "Blend Normals" )] + public class BlendNormalsNode : ParentNode + { + public readonly static string[] ModeListStr = { "Tangent Normals", "Reoriented Tangent Normals", "Reoriented World Normals" }; + public readonly static int[] ModeListInt = { 0, 1, 2 }; + + [SerializeField] + public int m_selectedMode = 0; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT3, false, "Normal A" ); + AddInputPort( WirePortDataType.FLOAT3, false, "Normal B" ); + AddInputPort( WirePortDataType.FLOAT3, false, "Vertex Normal" ); + m_inputPorts[ 2 ].Visible = false; + AddOutputPort( WirePortDataType.FLOAT3, "XYZ" ); + m_useInternalPortData = true; + m_previewShaderGUID = "bcdf750ff5f70444f98b8a3efa50dc6f"; + } + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + m_previewMaterialPassId = m_selectedMode; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( !( dataCollector.IsTemplate && dataCollector.IsSRP ) ) + dataCollector.AddToIncludes( UniqueId, Constants.UnityStandardUtilsLibFuncs ); + + string _inputA = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string _inputB = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + string result = "BlendNormals( " + _inputA + " , " + _inputB + " )"; + + if( dataCollector.IsTemplate && dataCollector.IsSRP ) + { + switch( m_selectedMode ) + { + default: + case 0: + result = "BlendNormal( " + _inputA + " , " + _inputB + " )"; + break; + case 1: + result = "BlendNormalRNM( " + _inputA + " , " + _inputB + " )"; + break; + case 2: + string inputC = m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector ); + result = "BlendNormalWorldspaceRNM( " + _inputA + " , " + _inputB + ", " + inputC + " )"; + break; + } + } + return CreateOutputLocalVariable( 0, result, ref dataCollector ); + } + + public override void DrawProperties() + { + base.DrawProperties(); + if( ContainerGraph.IsSRP ) + { + NodeUtils.DrawPropertyGroup( ref m_propertiesFoldout, Constants.ParameterLabelStr, () => + { + EditorGUI.BeginChangeCheck(); + m_selectedMode = EditorGUILayoutIntPopup( "Mode", m_selectedMode, ModeListStr, ModeListInt ); + if( EditorGUI.EndChangeCheck() ) + { + if( m_selectedMode == 2 ) + { + m_inputPorts[ 2 ].Visible = true; + } + else + { + m_inputPorts[ 2 ].Visible = false; + } + m_sizeIsDirty = true; + } + } ); + } + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > 14503 ) + m_selectedMode = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_selectedMode ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/BlendNormalsNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/BlendNormalsNode.cs.meta new file mode 100644 index 0000000..b92fa34 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/BlendNormalsNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: eceb6029efe39524d83b45c10a979943 +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/HeightMapBlendNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/HeightMapBlendNode.cs new file mode 100644 index 0000000..fc1744f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/HeightMapBlendNode.cs @@ -0,0 +1,53 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +// +// Custom Node HeightMap Texture Masking +// Donated by Rea + +using UnityEngine; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "HeightMap Texture Blend", "Textures", "Advanced Texture Blending by using heightMap and splatMask, usefull for texture layering ", null, KeyCode.None, true, false, null, null, "Rea" )] + public sealed class HeightMapBlendNode : ParentNode + { + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, "HeightMap" ); + AddInputPort( WirePortDataType.FLOAT, false, "SplatMask" ); + AddInputPort( WirePortDataType.FLOAT, false, "BlendStrength" ); + AddOutputVectorPorts( WirePortDataType.FLOAT, Constants.EmptyPortValue ); + m_textLabelWidth = 120; + m_useInternalPortData = true; + m_inputPorts[ 2 ].FloatInternalData = 1; + m_previewShaderGUID = "b2ac23d6d5dcb334982b6f31c2e7a734"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string HeightMap = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string SplatMask = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector); + string Blend = m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector ); + + string HeightMask = "saturate(pow(((" + HeightMap + "*" + SplatMask + ")*4)+(" + SplatMask + "*2)," + Blend + "))"; + string varName = "HeightMask" + OutputId; + + RegisterLocalVariable( 0, HeightMask, ref dataCollector , varName ); + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + /* + A = (heightMap * SplatMask)*4 + B = SplatMask*2 + C = pow(A+B,Blend) + saturate(C) + saturate(pow(((heightMap * SplatMask)*4)+(SplatMask*2),Blend)); + */ + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/HeightMapBlendNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/HeightMapBlendNode.cs.meta new file mode 100644 index 0000000..62736ab --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/HeightMapBlendNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b80a218ca12b89948b83d0dee41fc056 +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/PannerNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/PannerNode.cs new file mode 100644 index 0000000..e20c8c0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/PannerNode.cs @@ -0,0 +1,110 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Panner", "UV Coordinates", "Pans UV texture coordinates according to its inputs" )] + public sealed class PannerNode : ParentNode + { + private const string _speedXStr = "Speed X"; + private const string _speedYStr = "Speed Y"; + + private int m_cachedUsingEditorId = -1; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT2, false, "UV" ,-1,MasterNodePortCategory.Fragment,0); + AddInputPort( WirePortDataType.FLOAT2, false, "Speed", -1, MasterNodePortCategory.Fragment, 2 ); + AddInputPort( WirePortDataType.FLOAT, false, "Time", -1, MasterNodePortCategory.Fragment, 1 ); + AddOutputPort( WirePortDataType.FLOAT2, "Out" ); + m_textLabelWidth = 70; + m_useInternalPortData = true; + m_previewShaderGUID = "6f89a5d96bdad114b9bbd0c236cac622"; + m_inputPorts[ 2 ].FloatInternalData = 1; + m_continuousPreviewRefresh = true; + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + if ( m_cachedUsingEditorId == -1 ) + m_cachedUsingEditorId = Shader.PropertyToID( "_UsingEditor" ); + + PreviewMaterial.SetFloat( m_cachedUsingEditorId, ( m_inputPorts[ 2 ].IsConnected ? 0 : 1 ) ); + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + if( portId == 1 ) + { + m_continuousPreviewRefresh = false; + } + } + + public override void OnInputPortDisconnected( int portId ) + { + base.OnInputPortDisconnected( portId ); + if( portId == 1 ) + { + m_continuousPreviewRefresh = true; + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string timePort = m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector ); + + if( !m_inputPorts[ 2 ].IsConnected ) + { + if( !( dataCollector.IsTemplate && dataCollector.IsSRP ) ) + dataCollector.AddToIncludes( UniqueId, Constants.UnityShaderVariables ); + timePort += " * _Time.y"; + } + + string speed = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + string result = "( " + timePort + " * " + speed + " + " + m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ) + ")"; + + RegisterLocalVariable( 0, result, ref dataCollector, "panner" + OutputId ); + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() < 13107 ) + { + // The internal data for the new port can be set in here since it didn't existed + // on older shader versions + float speedX = Convert.ToSingle( GetCurrentParam( ref nodeParams ) ); + float speedY = Convert.ToSingle( GetCurrentParam( ref nodeParams ) ); + m_inputPorts[ 1 ].Vector2InternalData = new Vector2( speedX, speedY ); + } + } + + public override void ReadInputDataFromString( ref string[] nodeParams ) + { + base.ReadInputDataFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() < 13107 ) + { + //Time Port must be rewritten after internal data is read + // already existed in previous shaders + m_inputPorts[ 2 ].FloatInternalData = 1; + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/PannerNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/PannerNode.cs.meta new file mode 100644 index 0000000..e05e46e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/PannerNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 08ddf1dd61719944b9e50d4bc87c0413 +timeCreated: 1481126953 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/RotatorNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/RotatorNode.cs new file mode 100644 index 0000000..18aa778 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/RotatorNode.cs @@ -0,0 +1,96 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Rotator", "UV Coordinates", "Rotates UVs or any Vector2 value from an Anchor point for a specified Time value")] + public sealed class RotatorNode : ParentNode + { + private int m_cachedUsingEditorId = -1; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT2, false, "UV" ); + AddInputPort( WirePortDataType.FLOAT2, false, "Anchor" ); + AddInputPort( WirePortDataType.FLOAT, false, "Time" ); + AddOutputPort( WirePortDataType.FLOAT2, "Out" ); + m_useInternalPortData = true; + m_inputPorts[ 2 ].FloatInternalData = 1; + m_textLabelWidth = 50; + m_previewShaderGUID = "e21408a1c7f12f14bbc2652f69bce1fc"; + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + if ( m_cachedUsingEditorId == -1 ) + m_cachedUsingEditorId = Shader.PropertyToID( "_UsingEditor" ); + + PreviewMaterial.SetFloat( m_cachedUsingEditorId, (m_inputPorts[ 2 ].IsConnected ? 0 : 1 ) ); + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + if( portId == 2 ) + { + m_continuousPreviewRefresh = false; + } + } + + public override void OnInputPortDisconnected( int portId ) + { + base.OnInputPortDisconnected( portId ); + if( portId == 2 ) + { + m_continuousPreviewRefresh = true; + } + } + + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + string result = string.Empty; + string uv = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string anchor = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + + string time = m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector ); + if ( !m_inputPorts[ 2 ].IsConnected ) + { + if( !( dataCollector.IsTemplate && dataCollector.IsSRP ) ) + dataCollector.AddToIncludes( UniqueId, Constants.UnityShaderVariables ); + time += " * _Time.y"; + } + + result += uv; + + string cosVar = "cos" + OutputId; + string sinVar = "sin" + OutputId; + dataCollector.AddLocalVariable( UniqueId, "float " + cosVar + " = cos( "+time+" );"); + dataCollector.AddLocalVariable( UniqueId, "float " + sinVar + " = sin( "+time+" );"); + + string value = "mul( " + result + " - " + anchor + " , float2x2( "+cosVar+" , -"+sinVar+" , "+sinVar+" , "+cosVar+" )) + "+anchor; + RegisterLocalVariable( 0, value, ref dataCollector, "rotator" + OutputId ); + + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + if( UIUtils.CurrentShaderVersion() < 13107 ) + { + m_inputPorts[ 2 ].FloatInternalData = 1; + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/RotatorNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/RotatorNode.cs.meta new file mode 100644 index 0000000..b031237 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/RotatorNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e228d03a789934a4f90f9587396692e3 +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/SamplerNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/SamplerNode.cs new file mode 100644 index 0000000..e298100 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/SamplerNode.cs @@ -0,0 +1,2302 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + // Disabling Substance Deprecated warning + + public enum TexReferenceType + { + Object = 0, + Instance + } + + public enum MipType + { + Auto, + MipLevel, + MipBias, + Derivative + } + + public enum ReferenceState + { + Self, + Connected, + Instance + } + + [Serializable] +#if UNITY_2018_1_OR_NEWER + [NodeAttributes( "Texture Sample", "Textures", "Samples a chosen texture and returns its color values, Texture and UVs can be overriden and you can select different mip modes and levels. It can also unpack and scale textures marked as normalmaps.", KeyCode.T, true, 0, int.MaxValue, typeof( Texture ), typeof( Texture2D ), typeof( Texture3D ), typeof( Cubemap ), typeof( CustomRenderTexture ), Tags = "Array" )] +#else + + // Disabling Substance Deprecated warning +#pragma warning disable 0618 + [NodeAttributes("Texture Sample", "Textures", "Samples a chosen texture and returns its color values, Texture and UVs can be overriden and you can select different mip modes and levels. It can also unpack and scale textures marked as normalmaps.", KeyCode.T, true, 0, int.MaxValue, typeof(Texture), typeof(Texture2D), typeof(Texture3D), typeof(Cubemap), typeof(ProceduralTexture), typeof(RenderTexture) +#if UNITY_2017_1_OR_NEWER + ,typeof( CustomRenderTexture ) +#endif + )] +#pragma warning restore 0618 +#endif + public sealed class SamplerNode : TexturePropertyNode + { + private const string MipModeStr = "Mip Mode"; + + private const string DefaultTextureUseSematicsStr = "Use Semantics"; + private const string DefaultTextureIsNormalMapsStr = "Is Normal Map"; + + private const string NormalScaleStr = "Scale"; + + private float InstanceIconWidth = 19; + private float InstanceIconHeight = 19; + + private readonly Color ReferenceHeaderColor = new Color( 2.66f, 1.02f, 0.6f, 1.0f ); + + public readonly static int[] AvailableAutoCast = { 0, 1, 2, 3, 4 }; + public readonly static string[] AvailableAutoCastStr = { "Auto", "Locked To Texture 1D", "Locked To Texture 2D", "Locked To Texture 3D", "Locked To Cube" }; + + [SerializeField] + private int m_textureCoordSet = 0; + + [SerializeField] + private bool m_autoUnpackNormals = false; + + [SerializeField] + private bool m_useSemantics; + + [SerializeField] + private string m_samplerType; + + [SerializeField] + private MipType m_mipMode = MipType.Auto; + + [SerializeField] + private TexReferenceType m_referenceType = TexReferenceType.Object; + + [SerializeField] + private int m_referenceArrayId = -1; + + [SerializeField] + private int m_referenceNodeId = -1; + + private SamplerNode m_referenceSampler = null; + + [SerializeField] + private GUIStyle m_referenceStyle = null; + + [SerializeField] + private GUIStyle m_referenceIconStyle = null; + + [SerializeField] + private GUIContent m_referenceContent = null; + + [SerializeField] + private float m_referenceWidth = -1; + + [SerializeField] + private SamplerStateAutoGenerator m_samplerStateAutoGenerator = new SamplerStateAutoGenerator(); + + private Vector4Node m_texCoordsHelper; + + private string m_previousAdditionalText = string.Empty; + + private int m_cachedUvsId = -1; + private int m_cachedUnpackId = -1; + private int m_cachedLodId = -1; + + private InputPort m_texPort; + private InputPort m_uvPort; + private InputPort m_lodPort; + private InputPort m_ddxPort; + private InputPort m_ddyPort; + private InputPort m_normalPort; + private InputPort m_samplerPort; + private InputPort m_indexPort; + private OutputPort m_colorPort; + + private TexturePropertyNode m_previewTextProp = null; + private ReferenceState m_state = ReferenceState.Self; + + private Rect m_iconPos; + + public SamplerNode() : base() { } + public SamplerNode( int uniqueId, float x, float y, float width, float height ) : base( uniqueId, x, y, width, height ) { } + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + if( m_useSamplerArrayIdx < 0 ) + { + m_useSamplerArrayIdx = 0; + } + + m_defaultTextureValue = TexturePropertyValues.white; + AddInputPort( WirePortDataType.SAMPLER2D, false, "Tex" ); + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.SAMPLER1D, WirePortDataType.SAMPLER2D, WirePortDataType.SAMPLER3D, WirePortDataType.SAMPLERCUBE, WirePortDataType.SAMPLER2DARRAY, WirePortDataType.OBJECT ); + AddInputPort( WirePortDataType.FLOAT2, false, "UV" ); + AddInputPort( WirePortDataType.FLOAT, false, "Level" ); + AddInputPort( WirePortDataType.FLOAT2, false, "DDX" ); + AddInputPort( WirePortDataType.FLOAT2, false, "DDY" ); + AddInputPort( WirePortDataType.FLOAT, false, NormalScaleStr ); + AddInputPort( WirePortDataType.FLOAT, false, "Index" ); + AddInputPort( WirePortDataType.SAMPLERSTATE, false, "SS" ); + m_inputPorts[ 7 ].CreatePortRestrictions( WirePortDataType.SAMPLERSTATE ); + + m_texPort = m_inputPorts[ 0 ]; + m_uvPort = m_inputPorts[ 1 ]; + m_lodPort = m_inputPorts[ 2 ]; + m_ddxPort = m_inputPorts[ 3 ]; + m_ddyPort = m_inputPorts[ 4 ]; + m_normalPort = m_inputPorts[ 5 ]; + m_indexPort = m_inputPorts[ 6 ]; + m_samplerPort = m_inputPorts[ 7 ]; + m_lodPort.AutoDrawInternalData = true; + m_indexPort.AutoDrawInternalData = true; + m_normalPort.AutoDrawInternalData = true; + m_lodPort.Visible = false; + m_ddxPort.Visible = false; + m_ddyPort.Visible = false; + m_indexPort.Visible = false; + m_normalPort.Visible = m_autoUnpackNormals; + m_normalPort.FloatInternalData = 1.0f; + + //Remove output port (sampler) + m_outputPortsDict.Remove( m_outputPorts[ 1 ].PortId ); + m_outputPorts.RemoveAt( 1 ); + + m_outputPortsDict.Remove( m_outputPorts[ 0 ].PortId ); + m_outputPorts.RemoveAt( 0 ); + + AddOutputColorPorts( "RGBA" ); + m_colorPort = m_outputPorts[ 0 ]; + m_currentParameterType = PropertyType.Property; + // m_useCustomPrefix = true; + m_customPrefix = "Texture Sample "; + m_referenceContent = new GUIContent( string.Empty ); + m_freeType = false; + m_useSemantics = true; + m_drawPicker = false; + ConfigTextureData( TextureType.Texture2D ); + m_selectedLocation = PreviewLocation.TopCenter; + m_previewShaderGUID = "7b4e86a89b70ae64993bf422eb406422"; + + m_errorMessageTooltip = "A texture object marked as normal map is connected to this sampler. Please consider turning on the Unpack Normal Map option"; + m_errorMessageTypeIsError = NodeMessageType.Warning; + m_textLabelWidth = 135; + m_customPrecision = false; + } + + public override void SetPreviewInputs() + { + //TODO: rewrite this to be faster + base.SetPreviewInputs(); + + if( m_cachedUvsId == -1 ) + m_cachedUvsId = Shader.PropertyToID( "_CustomUVs" ); + + PreviewMaterial.SetInt( m_cachedUvsId, ( m_uvPort.IsConnected ? 1 : 0 ) ); + + if( m_cachedUnpackId == -1 ) + m_cachedUnpackId = Shader.PropertyToID( "_Unpack" ); + + PreviewMaterial.SetInt( m_cachedUnpackId, m_autoUnpackNormals ? 1 : 0 ); + + if( m_cachedLodId == -1 ) + m_cachedLodId = Shader.PropertyToID( "_LodType" ); + + PreviewMaterial.SetInt( m_cachedLodId, ( m_mipMode == MipType.MipLevel ? 1 : ( m_mipMode == MipType.MipBias ? 2 : 0 ) ) ); + + if( m_typeId == -1 ) + m_typeId = Shader.PropertyToID( "_Type" ); + + bool usingTexture = false; + if( m_texPort.IsConnected ) + { + usingTexture = true; + SetPreviewTexture( m_texPort.InputPreviewTexture( ContainerGraph ) ); + } + else if( SoftValidReference && m_referenceSampler.TextureProperty != null ) + { + if( m_referenceSampler.TextureProperty.Value != null ) + { + usingTexture = true; + SetPreviewTexture( m_referenceSampler.TextureProperty.Value ); + } + else + { + usingTexture = true; + SetPreviewTexture( m_referenceSampler.PreviewTexture ); + } + } + else if( TextureProperty != null ) + { + if( TextureProperty.Value != null ) + { + usingTexture = true; + SetPreviewTexture( TextureProperty.Value ); + } + } + + if( m_defaultId == -1 ) + m_defaultId = Shader.PropertyToID( "_Default" ); + + if( usingTexture ) + { + PreviewMaterial.SetInt( m_defaultId, 0 ); + m_previewMaterialPassId = 1; + } + else + { + PreviewMaterial.SetInt( m_defaultId, ( (int)m_defaultTextureValue ) + 1 ); + m_previewMaterialPassId = 0; + } + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + if( m_referenceType == TexReferenceType.Object ) + { + UIUtils.RegisterSamplerNode( this ); + UIUtils.RegisterPropertyNode( this ); + } + m_textureProperty = this; + + if( UniqueId > -1 ) + ContainerGraph.SamplerNodes.OnReorderEventComplete += OnReorderEventComplete; + } + + private void OnReorderEventComplete() + { + if( m_referenceType == TexReferenceType.Instance && m_referenceSampler != null ) + { + m_referenceArrayId = ContainerGraph.SamplerNodes.GetNodeRegisterIdx( m_referenceSampler.UniqueId ); + } + } + + public void ConfigSampler() + { + switch( m_currentType ) + { + case TextureType.Texture1D: + m_samplerType = "tex1D"; + break; + case TextureType.ProceduralTexture: + case TextureType.Texture2D: + m_samplerType = "tex2D"; + break; + case TextureType.Texture2DArray: + m_samplerType = "tex2DArray"; + break; + case TextureType.Texture3D: + m_samplerType = "tex3D"; + break; + case TextureType.Cube: + m_samplerType = "texCUBE"; + break; + } + } + + public override void DrawSubProperties() + { + ShowDefaults(); + + DrawSamplerOptions(); + + EditorGUI.BeginChangeCheck(); + Type currType = ( m_autocastMode == AutoCastType.Auto ) ? typeof( Texture ) : m_textureType; + m_defaultValue = EditorGUILayoutObjectField( Constants.DefaultValueLabel, m_defaultValue, currType, false ) as Texture; + if( EditorGUI.EndChangeCheck() ) + { + CheckTextureImporter( true ); + SetAdditonalTitleText( string.Format( Constants.PropertyValueLabel, GetPropertyValStr() ) ); + ConfigureInputPorts(); + ConfigureOutputPorts(); + //ResizeNodeToPreview(); + } + } + + public override void DrawMaterialProperties() + { + ShowDefaults(); + + DrawSamplerOptions(); + + EditorGUI.BeginChangeCheck(); + Type currType = ( m_autocastMode == AutoCastType.Auto ) ? typeof( Texture ) : m_textureType; + m_materialValue = EditorGUILayoutObjectField( Constants.MaterialValueLabel, m_materialValue, currType, false ) as Texture; + if( EditorGUI.EndChangeCheck() ) + { + CheckTextureImporter( true ); + SetAdditonalTitleText( string.Format( Constants.PropertyValueLabel, GetPropertyValStr() ) ); + ConfigureInputPorts(); + ConfigureOutputPorts(); + } + } + + new void ShowDefaults() + { + m_defaultTextureValue = (TexturePropertyValues)EditorGUILayoutEnumPopup( DefaultTextureStr, m_defaultTextureValue ); + //AutoCastType newAutoCast = (AutoCastType)EditorGUILayoutIntPopup( AutoCastModeStr, (int)m_autocastMode, AvailableAutoCastStr, AvailableAutoCast ); + AutoCastType newAutoCast = (AutoCastType)EditorGUILayoutEnumPopup( AutoCastModeStr, m_autocastMode ); + if( newAutoCast != m_autocastMode ) + { + m_autocastMode = newAutoCast; + if( m_autocastMode != AutoCastType.Auto ) + { + ConfigTextureData( m_currentType ); + ConfigureInputPorts(); + ConfigureOutputPorts(); + } + } + } + + public override void AdditionalCheck() + { + m_autoUnpackNormals = m_isNormalMap; + ConfigureInputPorts(); + ConfigureOutputPorts(); + } + + + public override void OnConnectedOutputNodeChanges( int portId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( portId, otherNodeId, otherPortId, name, type ); + if( portId == m_texPort.PortId ) + { + m_texPort.MatchPortToConnection(); + m_textureProperty = m_texPort.GetOutputNodeWhichIsNotRelay( 0 ) as TexturePropertyNode; + if( m_textureProperty != null ) + { + m_currentType = m_textureProperty.CurrentType; + ConfigureInputPorts(); + ConfigureOutputPorts(); + } + else + { + m_currentType = Constants.WireToTexture[ type ]; + ConfigureInputPorts(); + ConfigureOutputPorts(); + } + } + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + + if( portId == m_texPort.PortId ) + { + m_texPort.MatchPortToConnection(); + m_textureProperty = m_texPort.GetOutputNodeWhichIsNotRelay( 0 ) as TexturePropertyNode; + if( m_textureProperty == null ) + { + if( Constants.WireToTexture.TryGetValue( m_texPort.ConnectionType() , out m_currentType ) ) + { + //m_currentType = Constants.WireToTexture[ m_texPort.ConnectionType() ]; + m_textureProperty = this; + // This cast fails only from within shader functions if connected to a Sampler Input + // and in this case property is set by what is connected to that input + UIUtils.UnregisterPropertyNode( this ); + UIUtils.UnregisterTexturePropertyNode( this ); + } + } + else + { + m_currentType = m_textureProperty.CurrentType; + + UIUtils.UnregisterPropertyNode( this ); + UIUtils.UnregisterTexturePropertyNode( this ); + } + + ConfigureInputPorts(); + ConfigureOutputPorts(); + //ResizeNodeToPreview(); + } + + UpdateTitle(); + } + + public override void OnInputPortDisconnected( int portId ) + { + base.OnInputPortDisconnected( portId ); + + if( portId == m_texPort.PortId ) + { + m_textureProperty = this; + + if( m_referenceType == TexReferenceType.Object ) + { + UIUtils.RegisterPropertyNode( this ); + UIUtils.RegisterTexturePropertyNode( this ); + } + + ConfigureOutputPorts(); + //ResizeNodeToPreview(); + } + + UpdateTitle(); + } + + private void ForceInputPortsChange() + { + m_texPort.ChangeType( Constants.TextureToWire[ m_currentType ], false ); + m_normalPort.ChangeType( WirePortDataType.FLOAT, false ); + switch( m_currentType ) + { + case TextureType.Texture1D: + m_uvPort.ChangeType( WirePortDataType.FLOAT, false ); + m_ddxPort.ChangeType( WirePortDataType.FLOAT, false ); + m_ddyPort.ChangeType( WirePortDataType.FLOAT, false ); + break; + case TextureType.ProceduralTexture: + case TextureType.Texture2D: + case TextureType.Texture2DArray: + m_uvPort.ChangeType( WirePortDataType.FLOAT2, false ); + m_ddxPort.ChangeType( WirePortDataType.FLOAT2, false ); + m_ddyPort.ChangeType( WirePortDataType.FLOAT2, false ); + break; + case TextureType.Texture3D: + case TextureType.Cube: + m_uvPort.ChangeType( WirePortDataType.FLOAT3, false ); + m_ddxPort.ChangeType( WirePortDataType.FLOAT3, false ); + m_ddyPort.ChangeType( WirePortDataType.FLOAT3, false ); + break; + } + } + + public override void ConfigureInputPorts() + { + m_normalPort.Visible = AutoUnpackNormals; + + switch( m_mipMode ) + { + case MipType.Auto: + m_lodPort.Visible = false; + m_ddxPort.Visible = false; + m_ddyPort.Visible = false; + break; + case MipType.MipLevel: + m_lodPort.Name = "Level"; + m_lodPort.Visible = true; + m_ddxPort.Visible = false; + m_ddyPort.Visible = false; + break; + case MipType.MipBias: + m_lodPort.Name = "Bias"; + m_lodPort.Visible = true; + m_ddxPort.Visible = false; + m_ddyPort.Visible = false; + break; + case MipType.Derivative: + m_lodPort.Visible = false; + m_ddxPort.Visible = true; + m_ddyPort.Visible = true; + break; + } + + switch( m_currentType ) + { + case TextureType.Texture1D: + m_uvPort.ChangeType( WirePortDataType.FLOAT, false ); + m_ddxPort.ChangeType( WirePortDataType.FLOAT, false ); + m_ddyPort.ChangeType( WirePortDataType.FLOAT, false ); + break; + case TextureType.ProceduralTexture: + case TextureType.Texture2D: + case TextureType.Texture2DArray: + m_uvPort.ChangeType( WirePortDataType.FLOAT2, false ); + m_ddxPort.ChangeType( WirePortDataType.FLOAT2, false ); + m_ddyPort.ChangeType( WirePortDataType.FLOAT2, false ); + break; + case TextureType.Texture3D: + case TextureType.Cube: + m_uvPort.ChangeType( WirePortDataType.FLOAT3, false ); + m_ddxPort.ChangeType( WirePortDataType.FLOAT3, false ); + m_ddyPort.ChangeType( WirePortDataType.FLOAT3, false ); + break; + } + + if( m_currentType == TextureType.Texture2DArray ) + m_indexPort.Visible = true; + else + m_indexPort.Visible = false; + + m_sizeIsDirty = true; + } + + public override void ConfigureOutputPorts() + { + m_outputPorts[ m_colorPort.PortId + 4 ].Visible = !AutoUnpackNormals; + + if( !AutoUnpackNormals ) + { + m_colorPort.ChangeProperties( "RGBA", WirePortDataType.COLOR, false ); + m_outputPorts[ m_colorPort.PortId + 1 ].ChangeProperties( "R", WirePortDataType.FLOAT, false ); + m_outputPorts[ m_colorPort.PortId + 2 ].ChangeProperties( "G", WirePortDataType.FLOAT, false ); + m_outputPorts[ m_colorPort.PortId + 3 ].ChangeProperties( "B", WirePortDataType.FLOAT, false ); + m_outputPorts[ m_colorPort.PortId + 4 ].ChangeProperties( "A", WirePortDataType.FLOAT, false ); + + } + else + { + m_colorPort.ChangeProperties( "XYZ", WirePortDataType.FLOAT3, false ); + m_outputPorts[ m_colorPort.PortId + 1 ].ChangeProperties( "X", WirePortDataType.FLOAT, false ); + m_outputPorts[ m_colorPort.PortId + 2 ].ChangeProperties( "Y", WirePortDataType.FLOAT, false ); + m_outputPorts[ m_colorPort.PortId + 3 ].ChangeProperties( "Z", WirePortDataType.FLOAT, false ); + } + + m_sizeIsDirty = true; + } + + void UpdateTitle() + { + if( m_referenceType == TexReferenceType.Object ) + { + SetTitleText( m_propertyInspectorName ); + SetAdditonalTitleText( string.Format( Constants.PropertyValueLabel, GetPropertyValStr() ) ); + } + + m_sizeIsDirty = true; + } + + public override void OnObjectDropped( UnityEngine.Object obj ) + { + base.OnObjectDropped( obj ); + ConfigFromObject( obj ); + } + + public override void SetupFromCastObject( UnityEngine.Object obj ) + { + base.SetupFromCastObject( obj ); + ConfigFromObject( obj ); + } + + void UpdateHeaderColor() + { + m_headerColorModifier = ( m_referenceType == TexReferenceType.Object ) ? Color.white : ReferenceHeaderColor; + } + + void ShowSamplerUI() + { + EditorGUI.BeginDisabledGroup( m_samplerPort.IsConnected ); + string[] contents = UIUtils.TexturePropertyNodeArr(); + string[] arr = new string[ contents.Length + 1 ]; + arr[ 0 ] = ""; + for( int i = 1; i < contents.Length + 1; i++ ) + { + arr[ i ] = contents[ i - 1 ]; + } + m_useSamplerArrayIdx = EditorGUILayoutPopup( "Reference Sampler", m_useSamplerArrayIdx, arr ); + EditorGUI.EndDisabledGroup(); + } + + public void DrawSamplerOptions() + { + if( !m_indexPort.IsConnected ) + { + m_indexPort.FloatInternalData = EditorGUILayoutFloatField( "Index", m_indexPort.FloatInternalData ); + } + + m_textureCoordSet = EditorGUILayoutIntPopup( Constants.AvailableUVSetsLabel, m_textureCoordSet, Constants.AvailableUVSetsStr, Constants.AvailableUVSets ); + + MipType newMipMode = (MipType)EditorGUILayoutEnumPopup( MipModeStr, m_mipMode ); + if( newMipMode != m_mipMode ) + { + m_mipMode = newMipMode; + ConfigureInputPorts(); + ConfigureOutputPorts(); + //ResizeNodeToPreview(); + } + + if( !m_lodPort.IsConnected && m_lodPort.Visible ) + { + m_lodPort.FloatInternalData = EditorGUILayoutFloatField( newMipMode == MipType.MipBias ? "Mip Bias" : "Mip Level", m_lodPort.FloatInternalData ); + } + + if( m_currentType == TextureType.Texture2DArray && ( newMipMode == MipType.Derivative || newMipMode == MipType.MipBias ) && !UIUtils.CurrentWindow.OutsideGraph.IsSRP ) + { + EditorGUILayout.HelpBox( "Derivative and Bias mip modes for Texture Arrays only works on some platforms (D3D11 XBOXONE GLES3 GLCORE)", MessageType.Warning ); + } + + EditorGUI.BeginChangeCheck(); + m_autoUnpackNormals = EditorGUILayoutToggle( "Unpack Normal Map", m_autoUnpackNormals ); + if( m_autoUnpackNormals && !m_normalPort.IsConnected ) + { + m_normalPort.FloatInternalData = EditorGUILayoutFloatField( NormalScaleStr, m_normalPort.FloatInternalData ); + } + + if( EditorGUI.EndChangeCheck() ) + { + ConfigureInputPorts(); + ConfigureOutputPorts(); + //ResizeNodeToPreview(); + } + ShowSamplerUI(); + if( m_showErrorMessage ) + { + EditorGUILayout.HelpBox( m_errorMessageTooltip, MessageType.Warning ); + } + } + + public override void DrawMainPropertyBlock() + { + EditorGUI.BeginChangeCheck(); + m_referenceType = (TexReferenceType)EditorGUILayoutPopup( Constants.ReferenceTypeStr, (int)m_referenceType, Constants.ReferenceArrayLabels ); + if( EditorGUI.EndChangeCheck() ) + { + if( m_referenceType == TexReferenceType.Object ) + { + UIUtils.RegisterSamplerNode( this ); + UIUtils.RegisterPropertyNode( this ); + if( !m_texPort.IsConnected ) + UIUtils.RegisterTexturePropertyNode( this ); + + SetTitleText( m_propertyInspectorName ); + SetAdditonalTitleText( string.Format( Constants.PropertyValueLabel, GetPropertyValStr() ) ); + m_referenceArrayId = -1; + m_referenceNodeId = -1; + m_referenceSampler = null; + m_textureProperty = m_texPort.IsConnected ? m_texPort.GetOutputNodeWhichIsNotRelay( 0 ) as TexturePropertyNode : this; + + } + else + { + UIUtils.UnregisterSamplerNode( this ); + UIUtils.UnregisterPropertyNode( this ); + if( !m_texPort.IsConnected ) + UIUtils.UnregisterTexturePropertyNode( this ); + } + UpdateHeaderColor(); + } + + if( m_referenceType == TexReferenceType.Object ) + { + EditorGUI.BeginChangeCheck(); + if( m_texPort.IsConnected ) + { + m_drawAttributes = false; + DrawSamplerOptions(); + } + else + { + m_drawAttributes = true; + base.DrawMainPropertyBlock(); + } + if( EditorGUI.EndChangeCheck() ) + { + OnPropertyNameChanged(); + } + } + else + { + m_drawAttributes = true; + string[] arr = UIUtils.SamplerNodeArr(); + bool guiEnabledBuffer = GUI.enabled; + if( arr != null && arr.Length > 0 ) + { + GUI.enabled = true; + } + else + { + m_referenceArrayId = -1; + GUI.enabled = false; + } + + EditorGUI.BeginChangeCheck(); + m_referenceArrayId = EditorGUILayoutPopup( Constants.AvailableReferenceStr, m_referenceArrayId, arr ); + if( EditorGUI.EndChangeCheck() ) + { + m_referenceSampler = ContainerGraph.SamplerNodes.GetNode( m_referenceArrayId ); + if( m_referenceSampler != null ) + { + m_referenceNodeId = m_referenceSampler.UniqueId; + } + else + { + m_referenceArrayId = -1; + m_referenceNodeId = -1; + } + } + GUI.enabled = guiEnabledBuffer; + + DrawSamplerOptions(); + } + } + + public override void OnPropertyNameChanged() + { + base.OnPropertyNameChanged(); + UIUtils.UpdateSamplerDataNode( UniqueId, PropertyName ); + UIUtils.UpdateTexturePropertyDataNode( UniqueId, PropertyName ); + } + + public override void DrawGUIControls( DrawInfo drawInfo ) + { + base.DrawGUIControls( drawInfo ); + + if( m_state != ReferenceState.Self && drawInfo.CurrentEventType == EventType.MouseDown && m_previewRect.Contains( drawInfo.MousePosition ) && drawInfo.LeftMouseButtonPressed ) + { + UIUtils.FocusOnNode( m_previewTextProp, 1, true ); + Event.current.Use(); + } + } + + public override void OnNodeLogicUpdate( DrawInfo drawInfo ) + { + base.OnNodeLogicUpdate( drawInfo ); + CheckReference(); + + if( SoftValidReference ) + { + m_state = ReferenceState.Instance; + m_previewTextProp = m_referenceSampler.TextureProperty; + } + else if( m_texPort.IsConnected ) + { + m_state = ReferenceState.Connected; + m_previewTextProp = TextureProperty; + } + else + { + m_state = ReferenceState.Self; + } + + if( m_previewTextProp == null ) + m_previewTextProp = this; + } + + public override void OnNodeLayout( DrawInfo drawInfo ) + { + base.OnNodeLayout( drawInfo ); + + if( m_drawPreview ) + { + m_iconPos = m_globalPosition; + m_iconPos.width = InstanceIconWidth * drawInfo.InvertedZoom; + m_iconPos.height = InstanceIconHeight * drawInfo.InvertedZoom; + + m_iconPos.y += 10 * drawInfo.InvertedZoom; + m_iconPos.x += m_globalPosition.width - m_iconPos.width - 5 * drawInfo.InvertedZoom; + } + } + + public override void OnNodeRepaint( DrawInfo drawInfo ) + { + base.OnNodeRepaint( drawInfo ); + + if( !m_isVisible ) + return; + + if( drawInfo.CurrentEventType != EventType.Repaint ) + return; + + switch( m_state ) + { + default: + case ReferenceState.Self: + { + m_drawPreview = false; + //SetTitleText( PropertyInspectorName /*m_propertyInspectorName*/ ); + //small optimization, string format or concat on every frame generates garbage + //string tempVal = GetPropertyValStr(); + //if ( !m_previousAdditionalText.Equals( tempVal ) ) + //{ + // m_previousAdditionalText = tempVal; + // m_additionalContent.text = string.Concat( "Value( ", tempVal, " )" ); + //} + + m_drawPicker = true; + } + break; + case ReferenceState.Connected: + { + m_drawPreview = true; + m_drawPicker = false; + + SetTitleText( m_previewTextProp.PropertyInspectorName + " (Input)" ); + m_previousAdditionalText = m_previewTextProp.AdditonalTitleContent.text; + SetAdditonalTitleText( m_previousAdditionalText ); + // Draw chain lock + GUI.Label( m_iconPos, string.Empty, UIUtils.GetCustomStyle( CustomStyle.SamplerTextureIcon ) ); + + // Draw frame around preview + GUI.Label( m_previewRect, string.Empty, UIUtils.GetCustomStyle( CustomStyle.SamplerFrame ) ); + } + break; + case ReferenceState.Instance: + { + m_drawPreview = true; + m_drawPicker = false; + + //SetTitleText( m_previewTextProp.PropertyInspectorName + Constants.InstancePostfixStr ); + //m_previousAdditionalText = m_previewTextProp.AdditonalTitleContent.text; + //SetAdditonalTitleText( m_previousAdditionalText ); + + SetTitleTextOnCallback( m_previewTextProp.PropertyInspectorName, ( instance, newTitle ) => instance.TitleContent.text = newTitle + Constants.InstancePostfixStr ); + if( m_previewTextProp.AdditonalTitleContent.text != m_additionalContent.text ) + { + PreviewIsDirty = true; + } + SetAdditonalTitleText( m_previewTextProp.AdditonalTitleContent.text ); + + // Draw chain lock + GUI.Label( m_iconPos, string.Empty, UIUtils.GetCustomStyle( CustomStyle.SamplerTextureIcon ) ); + + // Draw frame around preview + GUI.Label( m_previewRect, string.Empty, UIUtils.GetCustomStyle( CustomStyle.SamplerFrame ) ); + } + break; + } + } + + void CheckReference() + { + if( m_referenceType != TexReferenceType.Instance ) + { + return; + } + + if( m_referenceArrayId > -1 ) + { + ParentNode newNode = ContainerGraph.SamplerNodes.GetNode( m_referenceArrayId ); + if( newNode == null || newNode.UniqueId != m_referenceNodeId ) + { + m_referenceSampler = null; + int count = ContainerGraph.SamplerNodes.NodesList.Count; + for( int i = 0; i < count; i++ ) + { + ParentNode node = ContainerGraph.SamplerNodes.GetNode( i ); + if( node.UniqueId == m_referenceNodeId ) + { + m_referenceSampler = node as SamplerNode; + m_referenceArrayId = i; + break; + } + } + } + else + { + m_texPort.DataType = m_referenceSampler.TexPort.DataType; + // Set current type + TextureType newTextureType = m_referenceSampler.CurrentType; + + // Set References Options + AutoCastType newAutoCast = m_referenceSampler.AutocastMode; + if( newAutoCast != m_autocastMode || newTextureType != m_currentType ) + { + m_currentType = newTextureType; + m_autocastMode = newAutoCast; + //if( m_autocastMode != AutoCastType.Auto ) + { + ConfigTextureData( m_currentType ); + ConfigureInputPorts(); + ConfigureOutputPorts(); + //ResizeNodeToPreview(); + } + } + } + } + + if( m_referenceSampler == null && m_referenceNodeId > -1 ) + { + m_referenceNodeId = -1; + m_referenceArrayId = -1; + } + } + + public void SetTitleTextDelay( string newText ) + { + if( !newText.Equals( m_content.text ) ) + { + m_content.text = newText; + BeginDelayedDirtyProperty(); + } + } + + public void SetAdditonalTitleTextDelay( string newText ) + { + if( !newText.Equals( m_additionalContent.text ) ) + { + m_additionalContent.text = newText; + BeginDelayedDirtyProperty(); + } + } + + private void DrawTexturePropertyPreview( DrawInfo drawInfo, bool instance ) + { + if( drawInfo.CurrentEventType != EventType.Repaint ) + return; + + Rect newPos = m_previewRect; + + TexturePropertyNode texProp = null; + if( instance ) + texProp = m_referenceSampler.TextureProperty; + else + texProp = TextureProperty; + + if( texProp == null ) + texProp = this; + + float previewSizeX = PreviewSizeX; + float previewSizeY = PreviewSizeY; + newPos.width = previewSizeX * drawInfo.InvertedZoom; + newPos.height = previewSizeY * drawInfo.InvertedZoom; + + SetTitleText( texProp.PropertyInspectorName + ( instance ? Constants.InstancePostfixStr : " (Input)" ) ); + SetAdditonalTitleText( texProp.AdditonalTitleContent.text ); + + if( m_referenceStyle == null ) + { + m_referenceStyle = UIUtils.GetCustomStyle( CustomStyle.SamplerTextureRef ); + } + + if( m_referenceIconStyle == null || m_referenceIconStyle.normal == null ) + { + m_referenceIconStyle = UIUtils.GetCustomStyle( CustomStyle.SamplerTextureIcon ); + if( m_referenceIconStyle != null && m_referenceIconStyle.normal != null && m_referenceIconStyle.normal.background != null ) + { + InstanceIconWidth = m_referenceIconStyle.normal.background.width; + InstanceIconHeight = m_referenceIconStyle.normal.background.height; + } + } + + Rect iconPos = m_globalPosition; + iconPos.width = InstanceIconWidth * drawInfo.InvertedZoom; + iconPos.height = InstanceIconHeight * drawInfo.InvertedZoom; + + iconPos.y += 10 * drawInfo.InvertedZoom; + iconPos.x += m_globalPosition.width - iconPos.width - 5 * drawInfo.InvertedZoom; + + //if ( GUI.Button( newPos, string.Empty, UIUtils.GetCustomStyle( CustomStyle.SamplerTextureRef )/* m_referenceStyle */) || + // GUI.Button( iconPos, string.Empty, m_referenceIconStyle ) + // ) + //{ + // UIUtils.FocusOnNode( texProp, 1, true ); + //} + + if( texProp.Value != null ) + { + DrawPreview( drawInfo, m_previewRect ); + GUI.Label( newPos, string.Empty, UIUtils.GetCustomStyle( CustomStyle.SamplerFrame ) ); + //UIUtils.GetCustomStyle( CustomStyle.SamplerButton ).fontSize = ( int )Mathf.Round( 9 * drawInfo.InvertedZoom ); + } + } + + public override string GenerateSamplerPropertyName( int outputId, ref MasterNodeDataCollector dataCollector ) + { + string generatedSamplerState = PropertyName; + if( m_forceSamplingMacrosGen ) + { + generatedSamplerState = GeneratorUtils.GenerateSamplerState( ref dataCollector, UniqueId, PropertyName ); + } + + if( outputId > 0 ) + return generatedSamplerState; + else + return PropertyName; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + if( dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + { + UIUtils.ShowMessage( UniqueId, m_nodeAttribs.Name + " cannot be used on Master Node Tessellation port" ); + return "(-1)"; + } + + OnPropertyNameChanged(); + + ConfigSampler(); + + string portProperty = string.Empty; + if( m_texPort.IsConnected ) + portProperty = m_texPort.GenerateShaderForOutput( ref dataCollector, true ); + + if( SoftValidReference ) + { + OrderIndex = m_referenceSampler.RawOrderIndex; + if( m_referenceSampler.TexPort.IsConnected ) + { + portProperty = m_referenceSampler.TexPort.GeneratePortInstructions( ref dataCollector ); + } + else + { + m_referenceSampler.RegisterProperty( ref dataCollector ); + } + } + + if( IsObject && ( !m_texPort.IsConnected || portProperty == "0.0" ) ) + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalVar ); + + string valueName = SetFetchedData( ref dataCollector, ignoreLocalVar, outputId, portProperty ); + if( TextureProperty is VirtualTextureObject ) + { + return valueName; + } + else + { + + return GetOutputColorItem( 0, outputId, valueName ); + } + } + + public string SampleVirtualTexture( VirtualTextureObject node, string coord ) + { + string sampler = string.Empty; + switch( node.Channel ) + { + default: + case VirtualChannel.Albedo: + case VirtualChannel.Base: + sampler = "VTSampleAlbedo( " + coord + " )"; + break; + case VirtualChannel.Normal: + case VirtualChannel.Height: + case VirtualChannel.Occlusion: + case VirtualChannel.Displacement: + sampler = "VTSampleNormal( " + coord + " )"; + break; + case VirtualChannel.Specular: + case VirtualChannel.SpecMet: + case VirtualChannel.Material: + sampler = "VTSampleSpecular( " + coord + " )"; + break; + } + return sampler; + } + + public string SampleTexture( ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar, string portProperty, MipType currMipMode, string propertyName ) + { + string samplerValue = string.Empty; + string uvCoords = GetUVCoords( ref dataCollector, ignoreLocalVar, portProperty ); + + bool isVertex = ( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ); + + bool useMacros = false; + + ParentGraph outsideGraph = UIUtils.CurrentWindow.OutsideGraph; +#if UNITY_2018_1_OR_NEWER + if( outsideGraph.SamplingMacros || m_currentType == TextureType.Texture2DArray ) +#else + if( ( outsideGraph.SamplingMacros && !outsideGraph.IsStandardSurface ) || m_currentType == TextureType.Texture2DArray ) +#endif + { + useMacros = Constants.TexSampleSRPMacros.ContainsKey( m_currentType ); + } + + if( useMacros || m_currentType == TextureType.Texture2DArray ) + { + string suffix = string.Empty; + switch( currMipMode ) + { + default: + case MipType.Auto: break; + case MipType.MipLevel: suffix = "_LOD"; break; + case MipType.MipBias: suffix = "_BIAS"; break; + case MipType.Derivative: suffix = "_GRAD"; break; + } + + if( isVertex ) + suffix = "_LOD"; + + string samplerToUse = string.Empty; + + if( !m_samplerPort.IsConnected && m_useSamplerArrayIdx > 0 ) + { + TexturePropertyNode samplerNode = UIUtils.GetTexturePropertyNode( m_useSamplerArrayIdx - 1 ); + if( samplerNode != null ) + { + if( samplerNode.IsConnected ) + { + string property = samplerNode.CurrentPropertyReference; + samplerToUse = GeneratorUtils.GenerateSamplerState( ref dataCollector, UniqueId, property ); + } + else + { + UIUtils.ShowMessage( UniqueId, string.Format( "{0} attempting to use sampler from unconnected {1} node. Reference Sampler nodes must be in use for their samplers to be created.", m_propertyName, samplerNode.PropertyName ), MessageSeverity.Warning ); + dataCollector.AddToUniforms( UniqueId, string.Format( Constants.SamplerDeclarationSRPMacros[ m_currentType ], propertyName ) ); + samplerToUse = propertyName; + } + } + else + { + UIUtils.ShowMessage( UniqueId, m_propertyName + " attempting to use sampler from invalid node.", MessageSeverity.Warning ); + dataCollector.AddToUniforms( UniqueId, string.Format( Constants.SamplerDeclarationSRPMacros[ m_currentType ], propertyName ) ); + samplerToUse = propertyName; + } + } + else + { + string samplerState = m_samplerPort.GeneratePortInstructions( ref dataCollector ); + if( m_samplerPort.IsConnected && !string.IsNullOrEmpty( samplerState ) && !samplerState.Equals( "0" ) ) + { + samplerToUse = samplerState; + } + else + { + samplerToUse = GeneratorUtils.GenerateSamplerState( ref dataCollector, UniqueId, propertyName ); + } + } + + if( outsideGraph.IsSRP ) + { + if( m_currentType == TextureType.Texture3D && ( currMipMode == MipType.MipBias || currMipMode == MipType.Derivative ) ) + GeneratorUtils.AddCustom3DSRPMacros( ref dataCollector ); + samplerValue = string.Format( Constants.TexSampleSRPMacros[ m_currentType ], suffix, propertyName, samplerToUse, uvCoords ); + } + else + { +#if !UNITY_2018_1_OR_NEWER + if( outsideGraph.IsStandardSurface ) + { + if( m_currentType == TextureType.Texture2DArray ) + GeneratorUtils.AddCustomStandardSamplingMacros( ref dataCollector, m_currentType, currMipMode ); + samplerValue = string.Format( Constants.TexSampleStandardMacros[ m_currentType ], suffix, propertyName, samplerToUse, uvCoords ); + } + else +#endif + { + GeneratorUtils.AddCustomStandardSamplingMacros( ref dataCollector, m_currentType, currMipMode ); + samplerValue = string.Format( Constants.TexSampleSamplerStandardMacros[ m_currentType ], suffix, propertyName, samplerToUse, uvCoords ); + } + } + } + else + { + string mipType = ""; + if( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + { + mipType = "lod"; + } + + switch( currMipMode ) + { + case MipType.Auto: + break; + case MipType.MipLevel: + mipType = "lod"; + break; + case MipType.MipBias: + mipType = "bias"; + break; + case MipType.Derivative: + break; + } + samplerValue = m_samplerType + mipType + "( " + propertyName + ", " + uvCoords + " )"; + } + + return samplerValue; + } + + public string SetFetchedData( ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar, int outputId, string portProperty = null ) + { + m_precisionString = UIUtils.PrecisionWirePortToCgType( CurrentPrecisionType, m_colorPort.DataType ); + string propertyName = CurrentPropertyReference; + if( !string.IsNullOrEmpty( portProperty ) && portProperty != "0.0" ) + { + propertyName = portProperty; + } + + MipType currMipMode = m_mipMode; + + if( ignoreLocalVar ) + { + if( TextureProperty is VirtualTextureObject ) + Debug.Log( "TODO" ); + + if( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + { + currMipMode = MipType.MipLevel; + } + + string samplerValue = SampleTexture( ref dataCollector, ignoreLocalVar, portProperty, currMipMode, propertyName ); + + AddNormalMapTag( ref dataCollector, ref samplerValue ); + return samplerValue; + } + + VirtualTextureObject vtex = ( TextureProperty as VirtualTextureObject ); + + if( vtex != null ) + { + string atPathname = AssetDatabase.GUIDToAssetPath( Constants.ATSharedLibGUID ); + if( string.IsNullOrEmpty( atPathname ) ) + { + UIUtils.ShowMessage( UniqueId, "Could not find Amplify Texture on your project folder. Please install it and re-compile the shader.", MessageSeverity.Error ); + } + else + { + //Need to see if the asset really exists because AssetDatabase.GUIDToAssetPath() can return a valid path if + // the asset was previously imported and deleted after that + UnityEngine.Object obj = AssetDatabase.LoadAssetAtPath( atPathname ); + if( obj == null ) + { + UIUtils.ShowMessage( UniqueId, "Could not find Amplify Texture on your project folder. Please install it and re-compile the shader.", MessageSeverity.Error ); + } + else + { + if( m_colorPort.IsLocalValue( dataCollector.PortCategory ) ) + return m_colorPort.LocalValue( dataCollector.PortCategory ); + + //string remapPortR = ".r"; + //string remapPortG = ".g"; + //string remapPortB = ".b"; + //string remapPortA = ".a"; + + //if ( vtex.Channel == VirtualChannel.Occlusion ) + //{ + // remapPortR = ".r"; remapPortG = ".r"; remapPortB = ".r"; remapPortA = ".r"; + //} + //else if ( vtex.Channel == VirtualChannel.SpecMet && ( ContainerGraph.CurrentStandardSurface != null && ContainerGraph.CurrentStandardSurface.CurrentLightingModel == StandardShaderLightModel.Standard ) ) + //{ + // remapPortR = ".r"; remapPortG = ".r"; remapPortB = ".r"; + //} + //else if ( vtex.Channel == VirtualChannel.Height || vtex.Channel == VirtualChannel.Displacement ) + //{ + // remapPortR = ".b"; remapPortG = ".b"; remapPortB = ".b"; remapPortA = ".b"; + //} + + dataCollector.AddToPragmas( UniqueId, IOUtils.VirtualTexturePragmaHeader ); + dataCollector.AddToIncludes( UniqueId, atPathname ); + + string lodBias = string.Empty; + if( dataCollector.IsFragmentCategory ) + { + lodBias = m_mipMode == MipType.MipLevel ? "Lod" : m_mipMode == MipType.MipBias ? "Bias" : ""; + } + else + { + lodBias = "Lod"; + } + + int virtualCoordId = dataCollector.GetVirtualCoordinatesId( UniqueId, GetVirtualUVCoords( ref dataCollector, ignoreLocalVar, portProperty ), lodBias ); + string virtualSampler = SampleVirtualTexture( vtex, Constants.VirtualCoordNameStr + virtualCoordId ); + string virtualVariable = dataCollector.AddVirtualLocalVariable( UniqueId, "virtualNode" + OutputId, virtualSampler ); + + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT4, virtualVariable, virtualSampler ); + + AddNormalMapTag( ref dataCollector, ref virtualVariable ); + + switch( vtex.Channel ) + { + default: + case VirtualChannel.Albedo: + case VirtualChannel.Base: + case VirtualChannel.Normal: + case VirtualChannel.Specular: + case VirtualChannel.SpecMet: + case VirtualChannel.Material: + virtualVariable = GetOutputColorItem( 0, outputId, virtualVariable ); + break; + case VirtualChannel.Displacement: + case VirtualChannel.Height: + { + if( outputId > 0 ) + virtualVariable += ".b"; + else + { + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT4, "virtual_cast_" + OutputId, virtualVariable + ".b" ); + virtualVariable = "virtual_cast_" + OutputId; + } + //virtualVariable = UIUtils.CastPortType( dataCollector.PortCategory, m_currentPrecisionType, new NodeCastInfo( UniqueId, outputId ), virtualVariable, WirePortDataType.FLOAT, WirePortDataType.FLOAT4, virtualVariable ); + } + break; + case VirtualChannel.Occlusion: + { + if( outputId > 0 ) + virtualVariable += ".r"; + else + { + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT4, "virtual_cast_" + OutputId, virtualVariable + ".r" ); + virtualVariable = "virtual_cast_" + OutputId; + } + } + break; + } + + //for ( int i = 0; i < m_outputPorts.Count; i++ ) + //{ + // if ( m_outputPorts[ i ].IsConnected ) + // { + + // //TODO: make the sampler not generate local variables at all times + // m_textureFetchedValue = "virtualNode" + OutputId; + // m_isTextureFetched = true; + + // //dataCollector.AddToLocalVariables( m_uniqueId, m_precisionString + " " + m_textureFetchedValue + " = " + virtualSampler + ";" ); + // if ( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + // dataCollector.AddToVertexLocalVariables( UniqueId, m_precisionString + " " + m_textureFetchedValue + " = " + virtualSampler + ";" ); + // else + // dataCollector.AddToLocalVariables( UniqueId, m_precisionString + " " + m_textureFetchedValue + " = " + virtualSampler + ";" ); + + // m_colorPort.SetLocalValue( m_textureFetchedValue ); + // m_outputPorts[ m_colorPort.PortId + 1 ].SetLocalValue( m_textureFetchedValue + remapPortR ); + // m_outputPorts[ m_colorPort.PortId + 2 ].SetLocalValue( m_textureFetchedValue + remapPortG ); + // m_outputPorts[ m_colorPort.PortId + 3 ].SetLocalValue( m_textureFetchedValue + remapPortB ); + // m_outputPorts[ m_colorPort.PortId + 4 ].SetLocalValue( m_textureFetchedValue + remapPortA ); + // return m_textureFetchedValue; + // } + //} + + return virtualVariable; + } + } + } + + if( m_colorPort.IsLocalValue( dataCollector.PortCategory ) ) + return m_colorPort.LocalValue( dataCollector.PortCategory ); + + if( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + { + currMipMode = MipType.MipLevel; + //mipType = "lod"; + } + + string samplerOp = SampleTexture( ref dataCollector, ignoreLocalVar, portProperty, currMipMode, propertyName ); + + AddNormalMapTag( ref dataCollector, ref samplerOp ); + + int connectedPorts = 0; + for( int i = 0; i < m_outputPorts.Count; i++ ) + { + if( m_outputPorts[ i ].IsConnected ) + { + connectedPorts += 1; + if( connectedPorts > 1 || m_outputPorts[ i ].ConnectionCount > 1 ) + { + // Create common local var and mark as fetched + string textureFetchedValue = m_samplerType + "Node" + OutputId; + + if( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + dataCollector.AddToVertexLocalVariables( UniqueId, m_precisionString + " " + textureFetchedValue + " = " + samplerOp + ";" ); + else + dataCollector.AddToLocalVariables( UniqueId, m_precisionString + " " + textureFetchedValue + " = " + samplerOp + ";" ); + + + m_colorPort.SetLocalValue( textureFetchedValue, dataCollector.PortCategory ); + m_outputPorts[ m_colorPort.PortId + 1 ].SetLocalValue( textureFetchedValue + ".r", dataCollector.PortCategory ); + m_outputPorts[ m_colorPort.PortId + 2 ].SetLocalValue( textureFetchedValue + ".g", dataCollector.PortCategory ); + m_outputPorts[ m_colorPort.PortId + 3 ].SetLocalValue( textureFetchedValue + ".b", dataCollector.PortCategory ); + m_outputPorts[ m_colorPort.PortId + 4 ].SetLocalValue( textureFetchedValue + ".a", dataCollector.PortCategory ); + return textureFetchedValue; + } + } + } + return samplerOp; + } + + public string GetUVCoords( ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar, string portProperty ) + { + bool isVertex = ( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ); + + // make sure the final result is always a float4 with empty 0's in the middle + string uvAppendix = ", "; + int coordSize = 3; + if( m_uvPort.DataType == WirePortDataType.FLOAT2 ) + { + uvAppendix = ", 0, "; + coordSize = 2; + } + else if( m_uvPort.DataType == WirePortDataType.FLOAT ) + { + uvAppendix = ", 0, 0, "; + coordSize = 1; + } + + string uvs = m_uvPort.GeneratePortInstructions( ref dataCollector ); + + // generate automatic UVs if not connected + if( !m_uvPort.IsConnected ) + { + string propertyName = CurrentPropertyReference; + + // check for references + if( !string.IsNullOrEmpty( portProperty ) && portProperty != "0.0" ) + propertyName = portProperty; + + int coordSet = ( ( m_textureCoordSet < 0 ) ? 0 : m_textureCoordSet ); + string uvName = IOUtils.GetUVChannelName( propertyName, coordSet ); + string dummyPropUV = "_tex" + ( coordSize != 2 ? "" + coordSize : "" ) + "coord" + ( coordSet > 0 ? ( coordSet + 1 ).ToString() : "" ); + string dummyUV = "uv" + ( coordSet > 0 ? ( coordSet + 1 ).ToString() : "" ) + dummyPropUV; + + string attr = GetPropertyValue(); + bool scaleOffset = true; + if( attr.IndexOf( "[NoScaleOffset]" ) > -1 ) + scaleOffset = false; + + string texCoordsST = string.Empty; + if( scaleOffset ) + { + if( m_texCoordsHelper == null ) + { + m_texCoordsHelper = CreateInstance(); + m_texCoordsHelper.ContainerGraph = ContainerGraph; + m_texCoordsHelper.SetBaseUniqueId( UniqueId, true ); + m_texCoordsHelper.RegisterPropertyOnInstancing = false; + m_texCoordsHelper.AddGlobalToSRPBatcher = true; + } + + if( UIUtils.CurrentWindow.OutsideGraph.IsInstancedShader ) + { + m_texCoordsHelper.CurrentParameterType = PropertyType.InstancedProperty; + } + else + { + m_texCoordsHelper.CurrentParameterType = PropertyType.Global; + } + m_texCoordsHelper.ResetOutputLocals(); + m_texCoordsHelper.SetRawPropertyName( propertyName + "_ST" ); + texCoordsST = m_texCoordsHelper.GenerateShaderForOutput( 0, ref dataCollector, false ); + } + + string coordInput = string.Empty; + if( !dataCollector.IsTemplate && coordSet > 3 ) + { + coordInput = GeneratorUtils.GenerateAutoUVs( ref dataCollector, UniqueId, coordSet, null, WirePortDataType.FLOAT2 ); + } + else + { + dataCollector.AddToProperties( UniqueId, "[HideInInspector] " + dummyPropUV + "( \"\", 2D ) = \"white\" {}", 9999 ); + if( isVertex ) + { + coordInput = Constants.VertexShaderInputStr + ".texcoord"; + if( coordSet > 0 ) + coordInput += coordSet.ToString(); + } + else + { + coordInput = Constants.InputVarStr + "." + dummyUV; + dataCollector.AddToInput( UniqueId, dummyUV, m_uvPort.DataType ); + } + } + + if( dataCollector.MasterNodeCategory == AvailableShaderTypes.Template ) + { + string result = string.Empty; + if( dataCollector.TemplateDataCollectorInstance.GetCustomInterpolatedData( TemplateHelperFunctions.IntToUVChannelInfo[ m_textureCoordSet ], m_uvPort.DataType, PrecisionType.Float, ref result, false, dataCollector.PortCategory ) ) + { + coordInput = result; + } + else + if( dataCollector.TemplateDataCollectorInstance.HasUV( m_textureCoordSet ) ) + coordInput = dataCollector.TemplateDataCollectorInstance.GetUVName( m_textureCoordSet, m_uvPort.DataType ); + else + coordInput = dataCollector.TemplateDataCollectorInstance.RegisterUV( m_textureCoordSet, m_uvPort.DataType ); + } + + if( !scaleOffset ) + uvName += OutputId; + + if( coordSize > 2 ) + { + uvName += coordSize; + dataCollector.UsingHigherSizeTexcoords = true; + dataCollector.AddLocalVariable( UniqueId, "float" + coordSize + " " + uvName + " = " + coordInput + ";" ); + if( scaleOffset ) + dataCollector.AddLocalVariable( UniqueId, uvName + ".xy = " + coordInput + ".xy * " + texCoordsST + ".xy + " + texCoordsST + ".zw;" ); + } + else + { + if( coordSize == 1 ) + uvName += coordSize; + + if( scaleOffset ) + dataCollector.AddLocalVariable( UniqueId, PrecisionType.Float, m_uvPort.DataType, uvName, coordInput + " * " + texCoordsST + ".xy + " + texCoordsST + ".zw" ); + else + dataCollector.AddLocalVariable( UniqueId, PrecisionType.Float, m_uvPort.DataType, uvName, coordInput ); + } + + uvs = uvName; + } + + + ParentGraph outsideGraph = UIUtils.CurrentWindow.OutsideGraph; + if( m_currentType == TextureType.Texture2DArray ) + { + string index = m_indexPort.GeneratePortInstructions( ref dataCollector ); + uvs = string.Format( "{0},{1}", uvs, index ); + + if( !( ( outsideGraph.SamplingMacros || m_currentType == TextureType.Texture2DArray ) && outsideGraph.IsSRP ) ) + { + uvs = "float3(" + uvs + ")"; + } + } + + if( isVertex ) + { + string lodLevel = m_lodPort.GeneratePortInstructions( ref dataCollector ); +#if UNITY_2018_1_OR_NEWER + if( ( outsideGraph.SamplingMacros || m_currentType == TextureType.Texture2DArray ) && m_currentType != TextureType.Texture1D ) +#else + if( ( ( outsideGraph.SamplingMacros && !outsideGraph.IsStandardSurface ) || m_currentType == TextureType.Texture2DArray ) && m_currentType != TextureType.Texture1D ) +#endif + return uvs + ", " + lodLevel; + else + return UIUtils.PrecisionWirePortToCgType( PrecisionType.Float, WirePortDataType.FLOAT4 ) + "( " + uvs + uvAppendix + lodLevel + ")"; + } + else + { + if( ( m_mipMode == MipType.MipLevel || m_mipMode == MipType.MipBias ) /*&& m_lodPort.IsConnected*/ ) + { + string lodLevel = m_lodPort.GeneratePortInstructions( ref dataCollector ); +#if UNITY_2018_1_OR_NEWER + if( ( outsideGraph.SamplingMacros || m_currentType == TextureType.Texture2DArray ) && m_currentType != TextureType.Texture1D ) +#else + if( ( ( outsideGraph.SamplingMacros && !outsideGraph.IsStandardSurface ) || m_currentType == TextureType.Texture2DArray ) && m_currentType != TextureType.Texture1D ) +#endif + return uvs + ", " + lodLevel; + else + return UIUtils.PrecisionWirePortToCgType( PrecisionType.Float, WirePortDataType.FLOAT4 ) + "( " + uvs + uvAppendix + lodLevel + ")"; + } + else if( m_mipMode == MipType.Derivative ) + { + string ddx = m_ddxPort.GeneratePortInstructions( ref dataCollector ); + string ddy = m_ddyPort.GeneratePortInstructions( ref dataCollector ); + + return uvs + ", " + ddx + ", " + ddy; + } + else + { + return uvs; + } + } + } + + public string GetVirtualUVCoords( ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar, string portProperty ) + { + string bias = ""; + if( !dataCollector.IsFragmentCategory || m_mipMode == MipType.MipBias || m_mipMode == MipType.MipLevel ) + { + string lodLevel = m_lodPort.GeneratePortInstructions( ref dataCollector ); + bias += ", " + lodLevel; + } + + if( m_uvPort.IsConnected ) + { + string uvs = m_uvPort.GeneratePortInstructions( ref dataCollector ); + return uvs + bias; + } + else + { + string propertyName = CurrentPropertyReference; + if( !string.IsNullOrEmpty( portProperty ) ) + { + propertyName = portProperty; + } + string uvChannelName = IOUtils.GetUVChannelName( propertyName, m_textureCoordSet ); + + + string uvCoord = string.Empty; + if( dataCollector.IsTemplate ) + { + string uvName = string.Empty; + if( dataCollector.TemplateDataCollectorInstance.HasUV( m_textureCoordSet ) ) + { + uvName = dataCollector.TemplateDataCollectorInstance.GetUVName( m_textureCoordSet, m_uvPort.DataType ); + } + else + { + uvName = dataCollector.TemplateDataCollectorInstance.RegisterUV( m_textureCoordSet, m_uvPort.DataType ); + } + + string attr = GetPropertyValue(); + + if( attr.IndexOf( "[NoScaleOffset]" ) > -1 ) + { + dataCollector.AddLocalVariable( UniqueId, PrecisionType.Float, WirePortDataType.FLOAT2, uvChannelName, uvName ); + } + else + { + dataCollector.AddToUniforms( UniqueId, "uniform float4 " + propertyName + "_ST;" ); + dataCollector.AddLocalVariable( UniqueId, PrecisionType.Float, WirePortDataType.FLOAT2, uvChannelName, uvName + " * " + propertyName + "_ST.xy + " + propertyName + "_ST.zw" ); + } + uvCoord = uvChannelName; + } + else + { + if( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + { + uvCoord = Constants.VertexShaderInputStr + ".texcoord"; + if( m_textureCoordSet > 0 ) + { + uvCoord += m_textureCoordSet.ToString(); + } + } + else + { + propertyName = CurrentPropertyReference; + if( !string.IsNullOrEmpty( portProperty ) && portProperty != "0.0" ) + { + propertyName = portProperty; + } + uvChannelName = IOUtils.GetUVChannelName( propertyName, m_textureCoordSet ); + + string dummyPropUV = "_texcoord" + ( m_textureCoordSet > 0 ? ( m_textureCoordSet + 1 ).ToString() : "" ); + string dummyUV = "uv" + ( m_textureCoordSet > 0 ? ( m_textureCoordSet + 1 ).ToString() : "" ) + dummyPropUV; + + dataCollector.AddToProperties( UniqueId, "[HideInInspector] " + dummyPropUV + "( \"\", 2D ) = \"white\" {}", 100 ); + dataCollector.AddToInput( UniqueId, dummyUV, WirePortDataType.FLOAT2 ); + + string attr = GetPropertyValue(); + + if( attr.IndexOf( "[NoScaleOffset]" ) > -1 ) + { + dataCollector.AddToLocalVariables( UniqueId, PrecisionType.Float, WirePortDataType.FLOAT2, uvChannelName, Constants.InputVarStr + "." + dummyUV ); + } + else + { + dataCollector.AddToUniforms( UniqueId, "uniform float4 " + propertyName + "_ST;" ); + dataCollector.AddToLocalVariables( UniqueId, PrecisionType.Float, WirePortDataType.FLOAT2, uvChannelName, Constants.InputVarStr + "." + dummyUV + " * " + propertyName + "_ST.xy + " + propertyName + "_ST.zw" ); + } + uvCoord = uvChannelName; + } + } + return uvCoord + bias; + } + } + + private void AddNormalMapTag( ref MasterNodeDataCollector dataCollector, ref string value ) + { + if( m_autoUnpackNormals ) + { + bool isScaledNormal = false; + if( m_normalPort.IsConnected ) + { + isScaledNormal = true; + } + else + { + if( m_normalPort.FloatInternalData != 1 ) + { + isScaledNormal = true; + } + } + + string scaleValue = isScaledNormal ? m_normalPort.GeneratePortInstructions( ref dataCollector ) : "1.0f"; + value = GeneratorUtils.GenerateUnpackNormalStr( ref dataCollector, CurrentPrecisionType, UniqueId, OutputId, value, isScaledNormal, scaleValue ); + + if( isScaledNormal ) + { + if( !( dataCollector.IsTemplate && dataCollector.IsSRP ) ) + { + dataCollector.AddToIncludes( UniqueId, Constants.UnityStandardUtilsLibFuncs ); + } + } + } + } + + public override void ReadOutputDataFromString( ref string[] nodeParams ) + { + base.ReadOutputDataFromString( ref nodeParams ); + ConfigureOutputPorts(); + } + + public override int InputIdFromDeprecated( int oldInputId ) + { + // this is not a good solution, it doesn't check for the deprecated type and thus assumes it always comes from texture array + switch( oldInputId ) + { + default: + return oldInputId; + case 0: + return 1; + case 1: + return 6; + case 2: + return 2; + case 3: + return 5; + case 4: + return 3; + case 5: + return 4; + case 6: + return 0; + } + } + + public override void ReadFromDeprecated( ref string[] nodeParams, Type oldType = null ) + { + base.ReadFromDeprecated( ref nodeParams, oldType ); + if( oldType == typeof( TextureArrayNode ) ) + { + base.ReadFromStringArray( ref nodeParams ); + string textureName = GetCurrentParam( ref nodeParams ); + m_defaultValue = AssetDatabase.LoadAssetAtPath( textureName ); + if( m_defaultValue ) + { + m_materialValue = m_defaultValue; + } + + m_textureCoordSet = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_referenceType = (TexReferenceType)Enum.Parse( typeof( TexReferenceType ), GetCurrentParam( ref nodeParams ) ); + m_referenceNodeId = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + if( m_referenceType == TexReferenceType.Instance ) + { + UIUtils.UnregisterSamplerNode( this ); + UIUtils.UnregisterPropertyNode( this ); + } + UpdateHeaderColor(); + + if( UIUtils.CurrentShaderVersion() > 3202 ) + m_mipMode = (MipType)Enum.Parse( typeof( MipType ), GetCurrentParam( ref nodeParams ) ); + + if( UIUtils.CurrentShaderVersion() > 5105 ) + m_autoUnpackNormals = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + + m_currentType = TextureType.Texture2DArray; + //m_autocastMode = AutoCastType.LockedToTexture2DArray; + + if( m_defaultValue == null ) + { + ConfigureInputPorts(); + ConfigureOutputPorts(); + //ResizeNodeToPreview(); + } + else + { + if( m_materialValue == null ) + { + ConfigFromObject( m_defaultValue, false, false ); + } + else + { + CheckTextureImporter( false, false ); + } + ConfigureInputPorts(); + ConfigureOutputPorts(); + } + + if( !m_isNodeBeingCopied && m_referenceType == TexReferenceType.Object ) + { + ContainerGraph.SamplerNodes.UpdateDataOnNode( UniqueId, DataToArray ); + } + + // reading input data due to internal data being lost + int count = 0; + if( UIUtils.CurrentShaderVersion() > 7003 ) + { + try + { + count = Convert.ToInt32( nodeParams[ m_currentReadParamIdx++ ] ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + else + { + count = ( m_oldInputCount < 0 ) ? m_inputPorts.Count : m_oldInputCount; + } + + for( int i = 0; i < count && i < nodeParams.Length && m_currentReadParamIdx < nodeParams.Length; i++ ) + { + if( UIUtils.CurrentShaderVersion() < 5003 ) + { + int newId = VersionConvertInputPortId( i ); + string InternalData = string.Empty; + + if( UIUtils.CurrentShaderVersion() > 23 ) + { + Enum.Parse( typeof( WirePortDataType ), nodeParams[ m_currentReadParamIdx++ ] ); + } + + InternalData = nodeParams[ m_currentReadParamIdx++ ]; + if( UIUtils.CurrentShaderVersion() >= 3100 && m_currentReadParamIdx < nodeParams.Length ) + { + nodeParams[ m_currentReadParamIdx++ ].ToString(); + } + + if( newId == 2 ) + { + m_indexPort.InternalData = InternalData; + m_indexPort.UpdatePreviewInternalData(); + } + + if( newId == 3 ) + { + m_lodPort.InternalData = InternalData; + m_lodPort.UpdatePreviewInternalData(); + } + } + else + { + string portIdStr = nodeParams[ m_currentReadParamIdx++ ]; + int portId = -1; + try + { + portId = Convert.ToInt32( portIdStr ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + + Enum.Parse( typeof( WirePortDataType ), nodeParams[ m_currentReadParamIdx++ ] ); + string InternalData = nodeParams[ m_currentReadParamIdx++ ]; + bool isEditable = Convert.ToBoolean( nodeParams[ m_currentReadParamIdx++ ] ); + if( isEditable && m_currentReadParamIdx < nodeParams.Length ) + { + nodeParams[ m_currentReadParamIdx++ ].ToString(); + } + + if( portId == 1 ) + { + m_indexPort.InternalData = InternalData; + m_indexPort.UpdatePreviewInternalData(); + } + + if( portId == 2 ) + { + m_lodPort.InternalData = InternalData; + m_lodPort.UpdatePreviewInternalData(); + } + } + } + } + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + string defaultTextureGUID = GetCurrentParam( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > 14101 ) + { + m_defaultValue = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( defaultTextureGUID ) ); + string materialTextureGUID = GetCurrentParam( ref nodeParams ); + m_materialValue = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( materialTextureGUID ) ); + } + else + { + m_defaultValue = AssetDatabase.LoadAssetAtPath( defaultTextureGUID ); + } + m_useSemantics = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + m_textureCoordSet = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_isNormalMap = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + m_defaultTextureValue = (TexturePropertyValues)Enum.Parse( typeof( TexturePropertyValues ), GetCurrentParam( ref nodeParams ) ); + m_autocastMode = (AutoCastType)Enum.Parse( typeof( AutoCastType ), GetCurrentParam( ref nodeParams ) ); + m_autoUnpackNormals = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + + if( UIUtils.CurrentShaderVersion() > 12 ) + { + m_referenceType = (TexReferenceType)Enum.Parse( typeof( TexReferenceType ), GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > 22 ) + { + m_referenceNodeId = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + else + { + m_referenceArrayId = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + + if( m_referenceType == TexReferenceType.Instance ) + { + UIUtils.UnregisterSamplerNode( this ); + UIUtils.UnregisterPropertyNode( this ); + } + UpdateHeaderColor(); + } + if( UIUtils.CurrentShaderVersion() > 2406 ) + m_mipMode = (MipType)Enum.Parse( typeof( MipType ), GetCurrentParam( ref nodeParams ) ); + + + if( UIUtils.CurrentShaderVersion() > 3201 ) + m_currentType = (TextureType)Enum.Parse( typeof( TextureType ), GetCurrentParam( ref nodeParams ) ); + + if( m_defaultValue == null ) + { + ConfigureInputPorts(); + ConfigureOutputPorts(); + //ResizeNodeToPreview(); + } + else + { + if( m_materialValue == null ) + { + ConfigFromObject( m_defaultValue, false, false ); + } + else + { + CheckTextureImporter( false, false ); + } + ConfigureInputPorts(); + ConfigureOutputPorts(); + } + + if( !m_isNodeBeingCopied && m_referenceType == TexReferenceType.Object ) + { + ContainerGraph.SamplerNodes.UpdateDataOnNode( UniqueId, DataToArray ); + } + + if( UIUtils.CurrentShaderVersion() >= 6001 && UIUtils.CurrentShaderVersion() < 7003 ) + { + m_oldInputCount = 6; + } + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + ForceInputPortsChange(); + + if( m_useSamplerArrayIdx > -1 ) + { + m_useSamplerArrayIdx = UIUtils.GetTexturePropertyNodeRegisterId( m_useSamplerArrayIdx ) + 1; + } + else + { + m_useSamplerArrayIdx = 0; + } + + EditorGUI.BeginChangeCheck(); + if( m_referenceType == TexReferenceType.Instance ) + { + if( UIUtils.CurrentShaderVersion() > 22 ) + { + + + m_referenceSampler = ContainerGraph.GetNode( m_referenceNodeId ) as SamplerNode; + m_referenceArrayId = ContainerGraph.SamplerNodes.GetNodeRegisterIdx( m_referenceNodeId ); + } + else + { + m_referenceSampler = ContainerGraph.SamplerNodes.GetNode( m_referenceArrayId ); + if( m_referenceSampler != null ) + { + m_referenceNodeId = m_referenceSampler.UniqueId; + } + } + } + + if( EditorGUI.EndChangeCheck() ) + { + OnPropertyNameChanged(); + } + } + + public override void ReadAdditionalData( ref string[] nodeParams ) { } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, ( m_defaultValue != null ) ? AssetDatabase.AssetPathToGUID( AssetDatabase.GetAssetPath( m_defaultValue ) ) : Constants.NoStringValue ); + IOUtils.AddFieldValueToString( ref nodeInfo, ( m_materialValue != null ) ? AssetDatabase.AssetPathToGUID( AssetDatabase.GetAssetPath( m_materialValue ) ) : Constants.NoStringValue ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_useSemantics.ToString() ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_textureCoordSet.ToString() ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_isNormalMap.ToString() ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_defaultTextureValue ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_autocastMode ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_autoUnpackNormals ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_referenceType ); + IOUtils.AddFieldValueToString( ref nodeInfo, ( ( m_referenceSampler != null ) ? m_referenceSampler.UniqueId : -1 ) ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_mipMode ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_currentType ); + } + + public override void WriteAdditionalToString( ref string nodeInfo, ref string connectionsInfo ) { } + + public override int VersionConvertInputPortId( int portId ) + { + int newPort = portId; + //change normal scale port to last + if( UIUtils.CurrentShaderVersion() < 2407 ) + { + if( portId == 1 ) + newPort = 4; + } + + if( UIUtils.CurrentShaderVersion() < 2408 ) + { + newPort = newPort + 1; + } + + return newPort; + } + + public override void Destroy() + { + base.Destroy(); + + //Not calling m_texCoordsHelper.Destroy() on purpose so UIUtils does not incorrectly unregister stuff + if( m_texCoordsHelper != null ) + { + DestroyImmediate( m_texCoordsHelper ); + m_texCoordsHelper = null; + } + + m_samplerStateAutoGenerator.Destroy(); + m_samplerStateAutoGenerator = null; + m_defaultValue = null; + m_materialValue = null; + m_referenceSampler = null; + m_referenceStyle = null; + m_referenceContent = null; + m_texPort = null; + m_uvPort = null; + m_lodPort = null; + m_ddxPort = null; + m_ddyPort = null; + m_normalPort = null; + m_colorPort = null; + m_samplerPort = null; + m_indexPort = null; + + if( m_referenceType == TexReferenceType.Object ) + { + UIUtils.UnregisterSamplerNode( this ); + UIUtils.UnregisterPropertyNode( this ); + } + if( UniqueId > -1 ) + ContainerGraph.SamplerNodes.OnReorderEventComplete -= OnReorderEventComplete; + } + + public override string GetPropertyValStr() + { + return m_materialMode ? ( m_materialValue != null ? m_materialValue.name : IOUtils.NO_TEXTURES ) : ( m_defaultValue != null ? m_defaultValue.name : IOUtils.NO_TEXTURES ); + } + + public TexturePropertyNode TextureProperty + { + get + { + if( m_referenceSampler != null ) + { + m_textureProperty = m_referenceSampler as TexturePropertyNode; + } + else if( m_texPort.IsConnected ) + { + m_textureProperty = m_texPort.GetOutputNodeWhichIsNotRelay( 0 ) as TexturePropertyNode; + } + + if( m_textureProperty == null ) + return this; + + return m_textureProperty; + } + } + + public override string GetPropertyValue() + { + if( SoftValidReference ) + { + if( m_referenceSampler.TexPort.IsConnected ) + { + return string.Empty; + } + else + { + return m_referenceSampler.TextureProperty.GetPropertyValue(); + } + } + else + if( m_texPort.IsConnected && ( m_texPort.GetOutputNodeWhichIsNotRelay( 0 ) as TexturePropertyNode ) != null ) + { + return TextureProperty.GetPropertyValue(); + } + + switch( m_currentType ) + { + case TextureType.Texture1D: + { + return PropertyAttributes + GetTexture1DPropertyValue(); + } + case TextureType.ProceduralTexture: + case TextureType.Texture2D: + { + return PropertyAttributes + GetTexture2DPropertyValue(); + } + case TextureType.Texture3D: + { + return PropertyAttributes + GetTexture3DPropertyValue(); + } + case TextureType.Cube: + { + return PropertyAttributes + GetCubePropertyValue(); + } + case TextureType.Texture2DArray: + { + return PropertyAttributes + GetTexture2DArrayPropertyValue(); + } + } + return string.Empty; + } + + public override string GetUniformValue() + { + + if( SoftValidReference ) + { + if( m_referenceSampler.TexPort.IsConnected ) + return string.Empty; + else + return m_referenceSampler.TextureProperty.GetUniformValue(); + } + else if( m_texPort.IsConnected && ( m_texPort.GetOutputNodeWhichIsNotRelay( 0 ) as TexturePropertyNode ) != null ) + { + return TextureProperty.GetUniformValue(); + } + + return base.GetUniformValue(); + } + + public override bool GetUniformData( out string dataType, out string dataName, ref bool fullValue ) + { + if( SoftValidReference ) + { + if( m_referenceSampler.TexPort.IsConnected ) + { + base.GetUniformData( out dataType, out dataName, ref fullValue ); + return false; + } + else + return m_referenceSampler.TextureProperty.GetUniformData( out dataType, out dataName, ref fullValue ); + } + else if( m_texPort.IsConnected && ( m_texPort.GetOutputNodeWhichIsNotRelay( 0 ) as TexturePropertyNode ) != null ) + { + return TextureProperty.GetUniformData( out dataType, out dataName, ref fullValue ); + + } + + return base.GetUniformData( out dataType, out dataName, ref fullValue ); + } + + public string UVCoordsName { get { return Constants.InputVarStr + "." + IOUtils.GetUVChannelName( CurrentPropertyReference, m_textureCoordSet ); } } + public bool HasPropertyReference + { + get + { + if( m_referenceType == TexReferenceType.Instance && m_referenceArrayId > -1 ) + { + SamplerNode node = ContainerGraph.SamplerNodes.GetNode( m_referenceArrayId ); + if( node != null ) + return true; + } + + if( m_texPort.IsConnected ) + { + return true; + } + + return false; + } + } + + public override string CurrentPropertyReference + { + get + { + string propertyName = string.Empty; + if( m_referenceType == TexReferenceType.Instance && m_referenceArrayId > -1 ) + { + SamplerNode node = ContainerGraph.SamplerNodes.GetNode( m_referenceArrayId ); + propertyName = ( node != null ) ? node.TextureProperty.PropertyName : PropertyName; + } + else if( m_texPort.IsConnected && ( m_texPort.GetOutputNodeWhichIsNotRelay( 0 ) as TexturePropertyNode ) != null ) + { + propertyName = TextureProperty.PropertyName; + } + else + { + propertyName = PropertyName; + } + return propertyName; + } + } + + public bool SoftValidReference + { + get + { + if( m_referenceType == TexReferenceType.Instance && m_referenceArrayId > -1 ) + { + m_referenceSampler = ContainerGraph.SamplerNodes.GetNode( m_referenceArrayId ); + + m_texPort.Locked = true; + + if( m_referenceContent == null ) + m_referenceContent = new GUIContent(); + + + if( m_referenceSampler != null ) + { + m_referenceContent.image = m_referenceSampler.Value; + if( m_referenceWidth != m_referenceSampler.Position.width ) + { + m_referenceWidth = m_referenceSampler.Position.width; + m_sizeIsDirty = true; + } + } + else + { + m_referenceArrayId = -1; + m_referenceWidth = -1; + } + + return m_referenceSampler != null; + } + m_texPort.Locked = false; + return false; + } + } + public override void ForceUpdateFromMaterial( Material material ) + { + if( UIUtils.IsProperty( m_currentParameterType ) && material.HasProperty( PropertyName ) ) + { + m_materialValue = material.GetTexture( PropertyName ); + CheckTextureImporter( true ); + PreviewIsDirty = true; + } + + } + public override void SetContainerGraph( ParentGraph newgraph ) + { + base.SetContainerGraph( newgraph ); + m_textureProperty = m_texPort.GetOutputNodeWhichIsNotRelay( 0 ) as TexturePropertyNode; + if( m_textureProperty == null ) + { + m_textureProperty = this; + } + } + + public bool AutoUnpackNormals + { + get { return m_autoUnpackNormals; } + set + { + if( value != m_autoUnpackNormals ) + { + m_autoUnpackNormals = value; + if( !UIUtils.IsLoading ) + { + m_defaultTextureValue = value ? TexturePropertyValues.bump : TexturePropertyValues.white; + } + } + } + } + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + base.PropagateNodeData( nodeData, ref dataCollector ); + if( dataCollector.IsTemplate ) + { + if( !m_texPort.IsConnected ) + dataCollector.TemplateDataCollectorInstance.SetUVUsage( m_textureCoordSet, m_uvPort.DataType ); + } + else if( m_textureCoordSet > 3 ) + { + dataCollector.AddCustomAppData( string.Format( TemplateHelperFunctions.TexUVFullSemantic, m_textureCoordSet ) ); + } + } + + private InputPort TexPort { get { return m_texPort; } } + public bool IsObject { get { return ( m_referenceType == TexReferenceType.Object ) || ( m_referenceSampler == null ); } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/SamplerNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/SamplerNode.cs.meta new file mode 100644 index 0000000..87957e4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/SamplerNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 057d23b232d9c044cbf3f1d0b1a06909 +timeCreated: 1481126953 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/SamplerStateNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/SamplerStateNode.cs new file mode 100644 index 0000000..531e086 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/SamplerStateNode.cs @@ -0,0 +1,378 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Sampler State", "Textures", "Creates a custom sampler state or returns the default one of a selected texture object" )] + public class SamplerStateNode : ParentNode + { + private readonly string[] Dummy = { string.Empty }; + private const string WrapModeStr = "Wrap Mode"; + private const string UAxisStr = "U axis"; + private const string VAxisStr = "V axis"; + private const string FilterModeStr = "Filter Mode"; + private const string MessageMacrosOFF = "Sampling Macros option is turned OFF, this node will not generate any sampler state"; + private const string MessageTextureObject = "Only Texture Objects that are actually being sampled within the shader generate valid sampler states.\n\nPlease make sure the referenced Texture Object is being sampled otherwise the shader will fail to compile."; + private const string MessageUnitSuppport = "Unity support for sampler states in versions below Unity 2018.1 is limited.\n\nNotably, only vertex/frag shaders support it and not surfaces shaders and sampler states can only be reused and not created if the version is below 2017.1"; + + [SerializeField] + protected int m_wrapMode = 0; + + [SerializeField] + protected TextureWrapMode m_wrapModeU = TextureWrapMode.Repeat; + + [SerializeField] + protected TextureWrapMode m_wrapModeV = TextureWrapMode.Repeat; + + [SerializeField] + protected FilterMode m_filterMode = FilterMode.Bilinear; + + [SerializeField] + private int m_referenceSamplerId = -1; + + [SerializeField] + private int m_referenceNodeId = -1; + + [SerializeField] + private TexturePropertyNode m_inputReferenceNode = null; + + private TexturePropertyNode m_referenceNode = null; + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + + private InputPort m_texPort; + + private readonly string[] m_wrapModeStr = { + "Repeat", + "Clamp", +#if UNITY_2018_3_OR_NEWER + "Mirror", + "Mirror Once", + "Per-axis" +#endif + }; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.SAMPLER2D, false, "Tex" ); + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.SAMPLER1D, WirePortDataType.SAMPLER2D, WirePortDataType.SAMPLER3D, WirePortDataType.SAMPLERCUBE, WirePortDataType.SAMPLER2DARRAY ); + AddOutputPort( WirePortDataType.SAMPLERSTATE, "Out" ); + m_texPort = m_inputPorts[ 0 ]; + m_hasLeftDropdown = true; + m_autoWrapProperties = true; + m_errorMessageTypeIsError = NodeMessageType.Warning; + m_errorMessageTooltip = MessageMacrosOFF; + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + m_inputPorts[ 0 ].MatchPortToConnection(); + m_inputReferenceNode = m_inputPorts[ 0 ].GetOutputNodeWhichIsNotRelay() as TexturePropertyNode; + UpdateTitle(); + + } + + public override void OnInputPortDisconnected( int portId ) + { + base.OnInputPortDisconnected( portId ); + m_inputReferenceNode = null; + UpdateTitle(); + } + + public override void OnConnectedOutputNodeChanges( int outputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( outputPortId, otherNodeId, otherPortId, name, type ); + m_inputPorts[ 0 ].MatchPortToConnection(); + UpdateTitle(); + } + + void UpdateTitle() + { + if( m_inputReferenceNode != null ) + { + m_additionalContent.text = string.Format( Constants.PropertyValueLabel, m_inputReferenceNode.PropertyInspectorName ); + } + else if( m_referenceSamplerId > -1 && m_referenceNode != null ) + { + m_additionalContent.text = string.Format( Constants.PropertyValueLabel, m_referenceNode.PropertyInspectorName ); + } + else + { + m_additionalContent.text = string.Empty; + } + m_sizeIsDirty = true; + } + + public override void DrawProperties() + { + base.DrawProperties(); + bool guiEnabledBuffer = GUI.enabled; + EditorGUI.BeginChangeCheck(); + List arr = new List( UIUtils.TexturePropertyNodeArr() ); + + if( arr != null && arr.Count > 0 ) + { + arr.Insert( 0, "None" ); + GUI.enabled = true && ( !m_inputPorts[ 0 ].IsConnected ); + m_referenceSamplerId = EditorGUILayoutPopup( Constants.AvailableReferenceStr, m_referenceSamplerId + 1, arr.ToArray() ) - 1; + } + else + { + m_referenceSamplerId = -1; + GUI.enabled = false; + EditorGUILayoutPopup( Constants.AvailableReferenceStr, m_referenceSamplerId, Dummy ); + } + + GUI.enabled = guiEnabledBuffer; + if( EditorGUI.EndChangeCheck() ) + { + m_referenceNode = UIUtils.GetTexturePropertyNode( m_referenceSamplerId ); + if( m_referenceNode != null ) + { + m_referenceNodeId = m_referenceNode.UniqueId; + } + else + { + m_referenceNodeId = -1; + m_referenceSamplerId = -1; + } + UpdateTitle(); + } + + EditorGUI.BeginDisabledGroup( m_texPort.IsConnected || m_referenceNodeId >= 0 ); + EditorGUI.BeginChangeCheck(); + m_wrapMode = EditorGUILayoutPopup( WrapModeStr, m_wrapMode, m_wrapModeStr ); + if( EditorGUI.EndChangeCheck() ) + { + switch( m_wrapMode ) + { + case 0: + m_wrapModeU = TextureWrapMode.Repeat; + m_wrapModeV = TextureWrapMode.Repeat; + break; + case 1: + m_wrapModeU = TextureWrapMode.Clamp; + m_wrapModeV = TextureWrapMode.Clamp; + break; +#if UNITY_2018_3_OR_NEWER + case 2: + m_wrapModeU = TextureWrapMode.Mirror; + m_wrapModeV = TextureWrapMode.Mirror; + break; + case 3: + m_wrapModeU = TextureWrapMode.MirrorOnce; + m_wrapModeV = TextureWrapMode.MirrorOnce; + break; +#endif + } + } + + if( m_wrapMode == 4 ) + { + EditorGUI.indentLevel++; + m_wrapModeU = (TextureWrapMode)EditorGUILayoutEnumPopup( UAxisStr, m_wrapModeU ); + m_wrapModeV = (TextureWrapMode)EditorGUILayoutEnumPopup( VAxisStr, m_wrapModeV ); + EditorGUI.indentLevel--; + } + + m_filterMode = (FilterMode)EditorGUILayoutEnumPopup( FilterModeStr, m_filterMode ); + EditorGUI.EndDisabledGroup(); + + if( !UIUtils.CurrentWindow.OutsideGraph.SamplingMacros ) + EditorGUILayout.HelpBox( MessageMacrosOFF, MessageType.Warning ); + + if( m_texPort.IsConnected || m_referenceNodeId >= 0 ) + EditorGUILayout.HelpBox( MessageTextureObject, MessageType.Info ); + +#if !UNITY_2018_1_OR_NEWER + EditorGUILayout.HelpBox( MessageUnitSuppport, MessageType.Warning ); +#endif + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + if( !UIUtils.CurrentWindow.OutsideGraph.SamplingMacros && ContainerGraph.CurrentShaderFunction == null ) + m_showErrorMessage = true; + else + m_showErrorMessage = false; + + EditorGUI.BeginChangeCheck(); + { + List arr = new List( UIUtils.TexturePropertyNodeArr() ); + bool guiEnabledBuffer = GUI.enabled; + + if( arr != null && arr.Count > 0 ) + { + arr.Insert( 0, "None" ); + GUI.enabled = true && ( !m_inputPorts[ 0 ].IsConnected ); + m_referenceSamplerId = m_upperLeftWidget.DrawWidget( this, m_referenceSamplerId + 1, arr.ToArray() ) - 1; + } + else + { + m_referenceSamplerId = -1; + GUI.enabled = false; + m_upperLeftWidget.DrawWidget( this, m_referenceSamplerId, Dummy ); + } + GUI.enabled = guiEnabledBuffer; + } + if( EditorGUI.EndChangeCheck() ) + { + m_referenceNode = UIUtils.GetTexturePropertyNode( m_referenceSamplerId ); + if( m_referenceNode != null ) + { + m_referenceNodeId = m_referenceNode.UniqueId; + } + else + { + m_referenceNodeId = -1; + m_referenceSamplerId = -1; + } + UpdateTitle(); + } + } + + public string GenerateSamplerAttributes() + { + string result = string.Empty; + switch( m_filterMode ) + { + case FilterMode.Point: + result += "_point"; + break; + default: + case FilterMode.Bilinear: + result += "_linear"; + break; + case FilterMode.Trilinear: + result += "_trilinear"; + break; + } + + int finalWrap = m_wrapModeU == m_wrapModeV ? (int)m_wrapModeU : m_wrapMode; + switch( finalWrap ) + { + case 0: + default: + result += "_repeat"; + break; + case 1: + result += "_clamp"; + break; +#if UNITY_2018_3_OR_NEWER + case 2: + result += "_mirror"; + break; + case 3: + result += "_mirrorOnce"; + break; +#endif + case 4: + { + switch( m_wrapModeU ) + { + default: + case TextureWrapMode.Repeat: + result += "_repeatU"; + break; + case TextureWrapMode.Clamp: + result += "_clampU"; + break; +#if UNITY_2018_3_OR_NEWER + case TextureWrapMode.Mirror: + result += "_mirrorU"; + break; + case TextureWrapMode.MirrorOnce: + result += "_mirrorOnceU"; + break; +#endif + } + switch( m_wrapModeV ) + { + default: + case TextureWrapMode.Repeat: + result += "_repeatV"; + break; + case TextureWrapMode.Clamp: + result += "_clampV"; + break; +#if UNITY_2018_3_OR_NEWER + case TextureWrapMode.Mirror: + result += "_mirrorV"; + break; + case TextureWrapMode.MirrorOnce: + result += "_mirrorOnceV"; + break; +#endif + } + } + break; + } + return result; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( !m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + { + string propertyOrOptions = string.Empty; + if( m_texPort.IsConnected ) + { + propertyOrOptions = m_texPort.GeneratePortInstructions( ref dataCollector ); + } + else if( m_referenceNode != null ) + { + m_referenceNode.BaseGenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + propertyOrOptions = m_referenceNode.PropertyName; + } + else + { + propertyOrOptions = GenerateSamplerAttributes(); + } + + string sampler = GeneratorUtils.GenerateSamplerState( ref dataCollector, UniqueId, propertyOrOptions ); + + m_outputPorts[ 0 ].SetLocalValue( sampler, dataCollector.PortCategory ); + } + + return m_outputPorts[ outputId ].LocalValue( dataCollector.PortCategory ); + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + m_referenceNode = UIUtils.GetNode( m_referenceNodeId ) as TexturePropertyNode; + m_referenceSamplerId = UIUtils.GetTexturePropertyNodeRegisterId( m_referenceNodeId ); + UpdateTitle(); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_wrapMode = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_wrapModeU = (TextureWrapMode)Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_wrapModeV = (TextureWrapMode)Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_filterMode = (FilterMode)Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_referenceNodeId = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_wrapMode ); + IOUtils.AddFieldValueToString( ref nodeInfo, (int)m_wrapModeU ); + IOUtils.AddFieldValueToString( ref nodeInfo, (int)m_wrapModeV ); + IOUtils.AddFieldValueToString( ref nodeInfo, (int)m_filterMode ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_referenceNodeId ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/SamplerStateNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/SamplerStateNode.cs.meta new file mode 100644 index 0000000..397a1c8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/SamplerStateNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 43b6f20fe0e24ff40bf9f25b001b40d8 +timeCreated: 1593535352 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/SubstanceSamplerNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/SubstanceSamplerNode.cs new file mode 100644 index 0000000..102dc73 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/SubstanceSamplerNode.cs @@ -0,0 +1,1357 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +using UnityEngine; +using UnityEditor; +using System; +using System.Collections.Generic; +#if !UNITY_2018_1_OR_NEWER +namespace AmplifyShaderEditor +{ + // Disabling Substance Deprecated warning +#pragma warning disable 0618 + [Serializable] + [NodeAttributes( "Substance Sample", "Textures", "Samples a procedural material", KeyCode.None, true, 0, int.MaxValue, typeof( SubstanceArchive ), typeof( ProceduralMaterial ) )] + public sealed class SubstanceSamplerNode : PropertyNode + { + private const string GlobalVarDecStr = "uniform sampler2D {0};"; + private const string PropertyDecStr = "{0}(\"{0}\", 2D) = \"white\""; + + private const string AutoNormalStr = "Auto-Normal"; + private const string SubstanceStr = "Substance"; + + private float TexturePreviewSizeX = 128; + private float TexturePreviewSizeY = 128; + + private float PickerPreviewWidthAdjust = 18; + + private bool m_editing; + + private CacheNodeConnections m_cacheNodeConnections; + + [SerializeField] + private int m_firstOutputConnected = 0; + + [SerializeField] + private ProceduralMaterial m_proceduralMaterial; + + [SerializeField] + private int m_textureCoordSet = 0; + + [SerializeField] + private ProceduralOutputType[] m_textureTypes; + + [SerializeField] + private bool m_autoNormal = true; + + private System.Type m_type; + + private Texture[] m_textures = new Texture[] { }; + + private List m_outputConns = new List(); + + private Rect m_previewArea; + + private Rect m_pickerArea; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT2, false, "UV" ); + AddOutputPort( WirePortDataType.COLOR, Constants.EmptyPortValue ); + m_insideSize.Set( TexturePreviewSizeX + PickerPreviewWidthAdjust, TexturePreviewSizeY + 10 ); + m_type = typeof( ProceduralMaterial ); + m_currentParameterType = PropertyType.Property; + m_freeType = false; + m_freeName = false; + m_autoWrapProperties = true; + m_customPrefix = "Substance Sample "; + m_drawPrecisionUI = false; + m_showPreview = true; + m_drawPreviewExpander = false; + m_selectedLocation = PreviewLocation.TopCenter; + m_cacheNodeConnections = new CacheNodeConnections(); + m_previewShaderGUID = "6f322c1da33f1e744941aafcb0ad1a2d"; + m_showAutoRegisterUI = false; + } + + public override void RenderNodePreview() + { + //Runs at least one time + if( !m_initialized ) + { + // nodes with no preview don't update at all + PreviewIsDirty = false; + return; + } + + if( !PreviewIsDirty ) + return; + + SetPreviewInputs(); + + PreviewMaterial.SetInt( "_CustomUVs", m_inputPorts[ 0 ].IsConnected ? 1 : 0 ); + + if( m_proceduralMaterial == null ) + return; + + Texture[] texs = m_proceduralMaterial.GetGeneratedTextures(); + int count = m_outputPorts.Count; + for( int i = 0; i < count; i++ ) + { + RenderTexture temp = RenderTexture.active; + RenderTexture.active = m_outputPorts[ i ].OutputPreviewTexture; + + PreviewMaterial.SetTexture( "_GenTex", texs[ i ] ); + + if( m_autoNormal && m_textureTypes[ i ] == ProceduralOutputType.Normal ) + Graphics.Blit( null, m_outputPorts[ i ].OutputPreviewTexture, PreviewMaterial, 1 ); + else + Graphics.Blit( null, m_outputPorts[ i ].OutputPreviewTexture, PreviewMaterial, 0 ); + RenderTexture.active = temp; + } + + PreviewIsDirty = m_continuousPreviewRefresh; + } + + public override void OnOutputPortConnected( int portId, int otherNodeId, int otherPortId ) + { + base.OnOutputPortConnected( portId, otherNodeId, otherPortId ); + m_firstOutputConnected = -1; + } + + public override void OnOutputPortDisconnected( int portId ) + { + base.OnOutputPortDisconnected( portId ); + m_firstOutputConnected = -1; + } + + void CalculateFirstOutputConnected() + { + m_outputConns.Clear(); + int count = m_outputPorts.Count; + bool connectionsAvailable = false; + for( int i = 0; i < count; i++ ) + { + if( m_outputPorts[ i ].IsConnected ) + { + connectionsAvailable = true; + } + } + + for( int i = 0; i < count; i++ ) + { + if( connectionsAvailable ) + { + if( m_outputPorts[ i ].IsConnected ) + { + if( m_firstOutputConnected < 0 ) + m_firstOutputConnected = i; + + m_outputConns.Add( i ); + } + } + else + { + m_outputConns.Add( i ); + } + } + + if( m_firstOutputConnected < 0 ) + m_firstOutputConnected = 0; + } + + public override void OnNodeLayout( DrawInfo drawInfo ) + { + base.OnNodeLayout( drawInfo ); + + m_previewArea = m_remainingBox; + m_previewArea.width = TexturePreviewSizeX * drawInfo.InvertedZoom; + m_previewArea.height = TexturePreviewSizeY * drawInfo.InvertedZoom; + m_previewArea.x += 0.5f * m_remainingBox.width - 0.5f * m_previewArea.width; + m_pickerArea = m_previewArea; + m_pickerArea.width = 40 * drawInfo.InvertedZoom; + m_pickerArea.x = m_previewArea.xMax - m_pickerArea.width - 2; + m_pickerArea.height = 14 * drawInfo.InvertedZoom; + m_pickerArea.y = m_previewArea.yMax - m_pickerArea.height - 2; + } + + public override void DrawGUIControls( DrawInfo drawInfo ) + { + base.DrawGUIControls( drawInfo ); + + if( !( drawInfo.CurrentEventType == EventType.MouseDown || drawInfo.CurrentEventType == EventType.MouseUp || drawInfo.CurrentEventType == EventType.ExecuteCommand || drawInfo.CurrentEventType == EventType.DragPerform ) ) + return; + + bool insideBox = m_previewArea.Contains( drawInfo.MousePosition ); + + if( insideBox ) + { + m_editing = true; + } + else if( m_editing && !insideBox && drawInfo.CurrentEventType != EventType.ExecuteCommand ) + { + GUI.FocusControl( null ); + m_editing = false; + } + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + if( m_editing ) + { + m_textures = m_proceduralMaterial != null ? m_proceduralMaterial.GetGeneratedTextures() : null; + if( GUI.Button( m_pickerArea, string.Empty, GUIStyle.none ) ) + { + int controlID = EditorGUIUtility.GetControlID( FocusType.Passive ); + EditorGUIUtility.ShowObjectPicker( m_proceduralMaterial, false, "", controlID ); + } + + string commandName = Event.current.commandName; + UnityEngine.Object newValue = null; + if( commandName == "ObjectSelectorUpdated" ) + { + newValue = EditorGUIUtility.GetObjectPickerObject(); + if( newValue != (UnityEngine.Object)m_proceduralMaterial ) + { + PreviewIsDirty = true; + UndoRecordObject( "Changing value EditorGUIObjectField on node Substance Sample" ); + + m_proceduralMaterial = newValue != null ? (ProceduralMaterial)newValue : null; + m_textures = m_proceduralMaterial != null ? m_proceduralMaterial.GetGeneratedTextures() : null; + OnNewSubstanceSelected( m_textures ); + } + } + else if( commandName == "ObjectSelectorClosed" ) + { + newValue = EditorGUIUtility.GetObjectPickerObject(); + if( newValue != (UnityEngine.Object)m_proceduralMaterial ) + { + PreviewIsDirty = true; + UndoRecordObject( "Changing value EditorGUIObjectField on node Substance Sample" ); + + m_proceduralMaterial = newValue != null ? (ProceduralMaterial)newValue : null; + m_textures = m_proceduralMaterial != null ? m_proceduralMaterial.GetGeneratedTextures() : null; + OnNewSubstanceSelected( m_textures ); + } + m_editing = false; + } + + if( GUI.Button( m_previewArea, string.Empty, GUIStyle.none ) ) + { + if( m_proceduralMaterial != null ) + { + Selection.activeObject = m_proceduralMaterial; + EditorGUIUtility.PingObject( Selection.activeObject ); + } + m_editing = false; + } + } + + if( drawInfo.CurrentEventType == EventType.Repaint ) + { + if( !m_editing ) + m_textures = m_proceduralMaterial != null ? m_proceduralMaterial.GetGeneratedTextures() : null; + + if( m_textures != null ) + { + if( m_firstOutputConnected < 0 ) + { + CalculateFirstOutputConnected(); + } + else if( m_textures.Length != m_textureTypes.Length ) + { + OnNewSubstanceSelected( m_textures ); + } + + int texCount = m_outputConns.Count; + Rect individuals = m_previewArea; + individuals.height /= texCount; + + for( int i = 0; i < texCount; i++ ) + { + EditorGUI.DrawPreviewTexture( individuals, m_textures[ m_outputConns[ i ] ], null, ScaleMode.ScaleAndCrop ); + individuals.y += individuals.height; + } + } + else + { + GUI.Label( m_previewArea, string.Empty, UIUtils.ObjectFieldThumb ); + } + + if( ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD2 ) + { + Rect smallButton = m_previewArea; + smallButton.height = 14 * drawInfo.InvertedZoom; + smallButton.y = m_previewArea.yMax - smallButton.height - 2; + smallButton.width = 40 * drawInfo.InvertedZoom; + smallButton.x = m_previewArea.xMax - smallButton.width - 2; + if( m_textures == null ) + { + GUI.Label( m_previewArea, "None (Procedural Material)", UIUtils.ObjectFieldThumbOverlay ); + } + GUI.Label( m_pickerArea, "Select", UIUtils.GetCustomStyle( CustomStyle.SamplerButton ) ); + } + + GUI.Label( m_previewArea, string.Empty, UIUtils.GetCustomStyle( CustomStyle.SamplerFrame ) ); + } + } + + void OnNewSubstanceSelected( Texture[] textures ) + { + CacheCurrentSettings(); + ConfigPortsFromMaterial( true, textures ); + ConnectFromCache(); + m_requireMaterialUpdate = true; + CalculateFirstOutputConnected(); + ContainerGraph.ParentWindow.RequestRepaint(); + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUI.BeginChangeCheck(); + m_proceduralMaterial = EditorGUILayoutObjectField( SubstanceStr, m_proceduralMaterial, m_type, false ) as ProceduralMaterial; + if( EditorGUI.EndChangeCheck() ) + { + Texture[] textures = m_proceduralMaterial != null ? m_proceduralMaterial.GetGeneratedTextures() : null; + if( textures != null ) + { + OnNewSubstanceSelected( textures ); + } + } + + m_textureCoordSet = EditorGUILayoutIntPopup( Constants.AvailableUVSetsLabel, m_textureCoordSet, Constants.AvailableUVSetsStr, Constants.AvailableUVSets ); + EditorGUI.BeginChangeCheck(); + m_autoNormal = EditorGUILayoutToggle( AutoNormalStr, m_autoNormal ); + if( EditorGUI.EndChangeCheck() ) + { + for( int i = 0; i < m_textureTypes.Length; i++ ) + { + WirePortDataType portType = ( m_autoNormal && m_textureTypes[ i ] == ProceduralOutputType.Normal ) ? WirePortDataType.FLOAT3 : WirePortDataType.COLOR; + if( m_outputPorts[ i ].DataType != portType ) + { + m_outputPorts[ i ].ChangeType( portType, false ); + } + } + } + } + + private void CacheCurrentSettings() + { + m_cacheNodeConnections.Clear(); + for( int portId = 0; portId < m_outputPorts.Count; portId++ ) + { + if( m_outputPorts[ portId ].IsConnected ) + { + int connCount = m_outputPorts[ portId ].ConnectionCount; + for( int connIdx = 0; connIdx < connCount; connIdx++ ) + { + WireReference connection = m_outputPorts[ portId ].GetConnection( connIdx ); + m_cacheNodeConnections.Add( m_outputPorts[ portId ].Name, new NodeCache( connection.NodeId, connection.PortId ) ); + } + } + } + } + + private void ConnectFromCache() + { + for( int i = 0; i < m_outputPorts.Count; i++ ) + { + List connections = m_cacheNodeConnections.GetList( m_outputPorts[ i ].Name ); + if( connections != null ) + { + int count = connections.Count; + for( int connIdx = 0; connIdx < count; connIdx++ ) + { + UIUtils.SetConnection( connections[ connIdx ].TargetNodeId, connections[ connIdx ].TargetPortId, UniqueId, i ); + } + } + } + } + + + private void ConfigPortsFromMaterial( bool invalidateConnections = false, Texture[] newTextures = null ) + { + SetAdditonalTitleText( ( m_proceduralMaterial != null ) ? string.Format( Constants.PropertyValueLabel, m_proceduralMaterial.name ) : "Value( )" ); + + Texture[] textures = newTextures != null ? newTextures : ( ( m_proceduralMaterial != null ) ? m_proceduralMaterial.GetGeneratedTextures() : null ); + if( textures != null ) + { + m_firstOutputConnected = -1; + string nameToRemove = m_proceduralMaterial.name + "_"; + m_textureTypes = new ProceduralOutputType[ textures.Length ]; + for( int i = 0; i < textures.Length; i++ ) + { + ProceduralTexture procTex = textures[ i ] as ProceduralTexture; + m_textureTypes[ i ] = procTex.GetProceduralOutputType(); + + WirePortDataType portType = ( m_autoNormal && m_textureTypes[ i ] == ProceduralOutputType.Normal ) ? WirePortDataType.FLOAT3 : WirePortDataType.COLOR; + string newName = textures[ i ].name.Replace( nameToRemove, string.Empty ); + char firstLetter = Char.ToUpper( newName[ 0 ] ); + newName = firstLetter.ToString() + newName.Substring( 1 ); + if( i < m_outputPorts.Count ) + { + m_outputPorts[ i ].ChangeProperties( newName, portType, false ); + if( invalidateConnections ) + { + m_outputPorts[ i ].FullDeleteConnections(); + } + } + else + { + AddOutputPort( portType, newName ); + } + } + + if( textures.Length < m_outputPorts.Count ) + { + int itemsToRemove = m_outputPorts.Count - textures.Length; + for( int i = 0; i < itemsToRemove; i++ ) + { + int idx = m_outputPorts.Count - 1; + if( m_outputPorts[ idx ].IsConnected ) + { + m_outputPorts[ idx ].ForceClearConnection(); + } + RemoveOutputPort( idx ); + } + } + } + else + { + int itemsToRemove = m_outputPorts.Count - 1; + m_outputPorts[ 0 ].ChangeProperties( Constants.EmptyPortValue, WirePortDataType.COLOR, false ); + m_outputPorts[ 0 ].ForceClearConnection(); + + for( int i = 0; i < itemsToRemove; i++ ) + { + int idx = m_outputPorts.Count - 1; + if( m_outputPorts[ idx ].IsConnected ) + { + m_outputPorts[ idx ].ForceClearConnection(); + } + RemoveOutputPort( idx ); + } + } + + m_sizeIsDirty = true; + m_isDirty = true; + } + + private void ConfigFromObject( UnityEngine.Object obj ) + { + ProceduralMaterial newMat = AssetDatabase.LoadAssetAtPath( AssetDatabase.GetAssetPath( obj ) ); + if( newMat != null ) + { + m_proceduralMaterial = newMat; + ConfigPortsFromMaterial(); + } + } + + public override void OnObjectDropped( UnityEngine.Object obj ) + { + ConfigFromObject( obj ); + } + + public override void SetupFromCastObject( UnityEngine.Object obj ) + { + ConfigFromObject( obj ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_proceduralMaterial == null ) + { + return "(0).xxxx"; + } + + if( m_outputPorts[ outputId ].IsLocalValue( dataCollector.PortCategory ) ) + { + return m_outputPorts[ outputId ].LocalValue( dataCollector.PortCategory ); + } + + Texture[] textures = m_proceduralMaterial.GetGeneratedTextures(); + + string uvPropertyName = string.Empty; + for( int i = 0; i < m_outputPorts.Count; i++ ) + { + if( m_outputPorts[ i ].HasConnectedNode ) + { + uvPropertyName = textures[ i ].name; + break; + } + } + + string name = textures[ outputId ].name + OutputId; + dataCollector.AddToUniforms( UniqueId, string.Format( GlobalVarDecStr, textures[ outputId ].name ) ); + dataCollector.AddToProperties( UniqueId, string.Format( PropertyDecStr, textures[ outputId ].name ) + "{}", -1 ); + bool isVertex = ( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ); + string value = string.Format( "tex2D{0}({1}, {2})", ( isVertex ? "lod" : string.Empty ), textures[ outputId ].name, GetUVCoords( ref dataCollector, ignoreLocalvar, uvPropertyName ) ); + if( m_autoNormal && m_textureTypes[ outputId ] == ProceduralOutputType.Normal ) + { + value = GeneratorUtils.GenerateUnpackNormalStr( ref dataCollector, CurrentPrecisionType, UniqueId, OutputId, value, false, "1.0" ); + } + + dataCollector.AddPropertyNode( this ); + RegisterLocalVariable( outputId, value, ref dataCollector, name ); + + return m_outputPorts[ outputId ].LocalValue( dataCollector.PortCategory ); + } + + public string GetUVCoords( ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar, string propertyName ) + { + bool isVertex = ( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ); + if( m_inputPorts[ 0 ].IsConnected ) + { + return m_inputPorts[ 0 ].GenerateShaderForOutput( ref dataCollector, isVertex ? WirePortDataType.FLOAT4 : WirePortDataType.FLOAT2, ignoreLocalVar, true ); + } + else + { + string uvChannelName = IOUtils.GetUVChannelName( propertyName, m_textureCoordSet ); + + if( dataCollector.IsTemplate ) + { + string propertyHelperVar = propertyName + "_ST"; + dataCollector.AddToUniforms( UniqueId, "float4", propertyHelperVar, dataCollector.IsSRP ); + string uvName = string.Empty; + if( dataCollector.TemplateDataCollectorInstance.HasUV( m_textureCoordSet ) ) + { + uvName = dataCollector.TemplateDataCollectorInstance.GetUVName( m_textureCoordSet ); + } + else + { + uvName = dataCollector.TemplateDataCollectorInstance.RegisterUV( m_textureCoordSet ); + } + + uvChannelName = "uv" + propertyName; + if( isVertex ) + { + string value = string.Format( Constants.TilingOffsetFormat, uvName, propertyHelperVar + ".xy", propertyHelperVar + ".zw" ); + string lodLevel = "0"; + + value = "float4( " + value + ", 0 , " + lodLevel + " )"; + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT4, uvChannelName, value ); + } + else + { + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT2, uvChannelName, string.Format( Constants.TilingOffsetFormat, uvName, propertyHelperVar + ".xy", propertyHelperVar + ".zw" ) ); + } + } + else + { + string vertexCoords = Constants.VertexShaderInputStr + ".texcoord"; + if( m_textureCoordSet > 0 ) + { + vertexCoords += m_textureCoordSet.ToString(); + } + + + string dummyPropUV = "_texcoord" + ( m_textureCoordSet > 0 ? ( m_textureCoordSet + 1 ).ToString() : "" ); + string dummyUV = "uv" + ( m_textureCoordSet > 0 ? ( m_textureCoordSet + 1 ).ToString() : "" ) + dummyPropUV; + + dataCollector.AddToUniforms( UniqueId, "uniform float4 " + propertyName + "_ST;" ); + dataCollector.AddToProperties( UniqueId, "[HideInInspector] " + dummyPropUV + "( \"\", 2D ) = \"white\" {}", 100 ); + dataCollector.AddToInput( UniqueId, dummyUV, WirePortDataType.FLOAT2 ); + + if( isVertex ) + { + dataCollector.AddToVertexLocalVariables( UniqueId, "float4 " + uvChannelName + " = float4(" + vertexCoords + " * " + propertyName + "_ST.xy + " + propertyName + "_ST.zw, 0 ,0);" ); + return uvChannelName; + } + else + dataCollector.AddToLocalVariables( UniqueId, PrecisionType.Float, WirePortDataType.FLOAT2, uvChannelName, Constants.InputVarStr + "." + dummyUV + " * " + propertyName + "_ST.xy + " + propertyName + "_ST.zw" ); + + } + + return uvChannelName; + } + } + + public override void UpdateMaterial( Material mat ) + { + base.UpdateMaterial( mat ); + if( m_proceduralMaterial != null ) + { + Texture[] textures = m_proceduralMaterial.GetGeneratedTextures(); + for( int i = 0; i < textures.Length; i++ ) + { + if( mat.HasProperty( textures[ i ].name ) && !InsideShaderFunction ) + { + mat.SetTexture( textures[ i ].name, textures[ i ] ); + } + } + } + } + + public override bool UpdateShaderDefaults( ref Shader shader, ref TextureDefaultsDataColector defaultCol ) + { + if( m_proceduralMaterial != null ) + { + Texture[] textures = m_proceduralMaterial.GetGeneratedTextures(); + for( int i = 0; i < textures.Length; i++ ) + { + defaultCol.AddValue( textures[ i ].name, textures[ i ] ); + } + } + return true; + } + + public override void Destroy() + { + base.Destroy(); + m_textures = null; + m_proceduralMaterial = null; + m_cacheNodeConnections.Clear(); + m_cacheNodeConnections = null; + m_outputConns.Clear(); + m_outputConns = null; + } + + public override string GetPropertyValStr() + { + return m_proceduralMaterial ? m_proceduralMaterial.name : string.Empty; + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + string guid = GetCurrentParam( ref nodeParams ); + m_textureCoordSet = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_autoNormal = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + if( guid.Length > 1 ) + { + m_proceduralMaterial = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( guid ) ); + if( m_proceduralMaterial != null ) + { + ConfigPortsFromMaterial(); + } + else + { + UIUtils.ShowMessage( UniqueId, "Substance not found ", MessageSeverity.Error ); + } + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + string guid = ( m_proceduralMaterial != null ) ? AssetDatabase.AssetPathToGUID( AssetDatabase.GetAssetPath( m_proceduralMaterial ) ) : "0"; + IOUtils.AddFieldValueToString( ref nodeInfo, guid ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_textureCoordSet ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_autoNormal ); + } + + } +#pragma warning restore 0618 +} +#elif SUBSTANCE_PLUGIN_ENABLED + +using Substance.Game; + +namespace AmplifyShaderEditor +{ + public enum ASEProceduralOutputType + { + Color, + Normal, + } + // Disabling Substance Deprecated warning +#pragma warning disable 0618 + [Serializable] + [NodeAttributes( "Substance Sample", "Textures", "Samples a procedural material", KeyCode.None, true, 0, int.MaxValue, typeof( SubstanceGraph ), typeof( Substance.Game.Substance ) )] + public sealed class SubstanceSamplerNode : PropertyNode + { + private const string NormalMapCheck = "normal"; + private const string GlobalVarDecStr = "uniform sampler2D {0};"; + private const string PropertyDecStr = "{0}(\"{1}\", 2D) = \"white\""; + + private const string AutoNormalStr = "Auto-Normal"; + private const string SubstanceStr = "Substance"; + + private float TexturePreviewSizeX = 128; + private float TexturePreviewSizeY = 128; + + private float PickerPreviewWidthAdjust = 18; + + private bool m_editing; + + private CacheNodeConnections m_cacheNodeConnections; + + [SerializeField] + private int m_firstOutputConnected = 0; + + [SerializeField] + private Substance.Game.SubstanceGraph m_substanceGraph; + [SerializeField] + private string m_substanceGUID = string.Empty; + + [SerializeField] + private int m_textureCoordSet = 0; + + [SerializeField] + private ASEProceduralOutputType[] m_textureTypes; + + [SerializeField] + private bool m_autoNormal = true; + + private System.Type m_type; + + private List m_textures = new List(); + + private List m_outputConns = new List(); + + private Rect m_previewArea; + + private Rect m_pickerArea; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT2, false, "UV" ); + AddOutputPort( WirePortDataType.COLOR, Constants.EmptyPortValue ); + m_insideSize.Set( TexturePreviewSizeX + PickerPreviewWidthAdjust, TexturePreviewSizeY + 10 ); + m_type = typeof( Substance.Game.Substance ); + m_currentParameterType = PropertyType.Property; + m_freeType = false; + m_freeName = false; + m_autoWrapProperties = true; + m_customPrefix = "Substance Sample "; + m_drawPrecisionUI = false; + m_showPreview = true; + m_drawPreviewExpander = false; + m_selectedLocation = PreviewLocation.TopCenter; + m_cacheNodeConnections = new CacheNodeConnections(); + m_previewShaderGUID = "6f322c1da33f1e744941aafcb0ad1a2d"; + m_showAutoRegisterUI = false; + } + + public override void RenderNodePreview() + { + if( !m_initialized ) + return; + + SetPreviewInputs(); + PreviewMaterial.SetInt( "_CustomUVs", m_inputPorts[ 0 ].IsConnected ? 1 : 0 ); + + if( m_substanceGraph == null ) + return; + + List texs = m_substanceGraph.generatedTextures; + int count = m_outputPorts.Count; + for( int i = 0; i < count; i++ ) + { + RenderTexture temp = RenderTexture.active; + RenderTexture.active = m_outputPorts[ i ].OutputPreviewTexture; + + PreviewMaterial.SetTexture( "_GenTex", texs[ i ] ); + + if( m_autoNormal && m_textureTypes[ i ] == ASEProceduralOutputType.Normal ) + Graphics.Blit( null, m_outputPorts[ i ].OutputPreviewTexture, PreviewMaterial, 1 ); + else + Graphics.Blit( null, m_outputPorts[ i ].OutputPreviewTexture, PreviewMaterial, 0 ); + RenderTexture.active = temp; + } + } + + public override void OnOutputPortConnected( int portId, int otherNodeId, int otherPortId ) + { + base.OnOutputPortConnected( portId, otherNodeId, otherPortId ); + m_firstOutputConnected = -1; + } + + public override void OnOutputPortDisconnected( int portId ) + { + base.OnOutputPortDisconnected( portId ); + m_firstOutputConnected = -1; + } + + void CalculateFirstOutputConnected() + { + m_outputConns.Clear(); + int count = m_outputPorts.Count; + bool connectionsAvailable = false; + for( int i = 0; i < count; i++ ) + { + if( m_outputPorts[ i ].IsConnected ) + { + connectionsAvailable = true; + } + } + + for( int i = 0; i < count; i++ ) + { + if( connectionsAvailable ) + { + if( m_outputPorts[ i ].IsConnected ) + { + if( m_firstOutputConnected < 0 ) + m_firstOutputConnected = i; + + m_outputConns.Add( i ); + } + } + else + { + m_outputConns.Add( i ); + } + } + + if( m_firstOutputConnected < 0 ) + m_firstOutputConnected = 0; + } + + public override void OnNodeLayout( DrawInfo drawInfo ) + { + base.OnNodeLayout( drawInfo ); + + m_previewArea = m_remainingBox; + m_previewArea.width = TexturePreviewSizeX * drawInfo.InvertedZoom; + m_previewArea.height = TexturePreviewSizeY * drawInfo.InvertedZoom; + m_previewArea.x += 0.5f * m_remainingBox.width - 0.5f * m_previewArea.width; + m_pickerArea = m_previewArea; + m_pickerArea.width = 40 * drawInfo.InvertedZoom; + m_pickerArea.x = m_previewArea.xMax - m_pickerArea.width - 2; + m_pickerArea.height = 14 * drawInfo.InvertedZoom; + m_pickerArea.y = m_previewArea.yMax - m_pickerArea.height - 2; + } + + public override void DrawGUIControls( DrawInfo drawInfo ) + { + base.DrawGUIControls( drawInfo ); + + if( !( drawInfo.CurrentEventType == EventType.MouseDown || drawInfo.CurrentEventType == EventType.MouseUp || drawInfo.CurrentEventType == EventType.ExecuteCommand || drawInfo.CurrentEventType == EventType.DragPerform ) ) + return; + + bool insideBox = m_previewArea.Contains( drawInfo.MousePosition ); + + if( insideBox ) + { + m_editing = true; + } + else if( m_editing && !insideBox && drawInfo.CurrentEventType != EventType.ExecuteCommand ) + { + GUI.FocusControl( null ); + m_editing = false; + } + } + + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + if( m_editing ) + { + m_textures = m_substanceGraph != null ? m_substanceGraph.generatedTextures : null; + if( GUI.Button( m_pickerArea, string.Empty, GUIStyle.none ) ) + { + int controlID = EditorGUIUtility.GetControlID( FocusType.Passive ); + EditorGUIUtility.ShowObjectPicker( m_substanceGraph, false, "", controlID ); + } + + string commandName = Event.current.commandName; + UnityEngine.Object newValue = null; + if( commandName == "ObjectSelectorUpdated" ) + { + newValue = EditorGUIUtility.GetObjectPickerObject(); + if( newValue != (UnityEngine.Object)m_substanceGraph ) + { + UndoRecordObject( "Changing value EditorGUIObjectField on node Substance Sample" ); + + SubstanceGraph = newValue != null ? (SubstanceGraph)newValue : null; + m_textures = m_substanceGraph != null ? m_substanceGraph.generatedTextures : null; + OnNewSubstanceSelected( m_textures ); + } + } + else if( commandName == "ObjectSelectorClosed" ) + { + newValue = EditorGUIUtility.GetObjectPickerObject(); + if( newValue != (UnityEngine.Object)m_substanceGraph ) + { + UndoRecordObject( "Changing value EditorGUIObjectField on node Substance Sample" ); + + SubstanceGraph = newValue != null ? (SubstanceGraph)newValue : null; + m_textures = m_substanceGraph != null ? m_substanceGraph.generatedTextures : null; + OnNewSubstanceSelected( m_textures ); + } + m_editing = false; + } + + if( GUI.Button( m_previewArea, string.Empty, GUIStyle.none ) ) + { + if( m_substanceGraph != null ) + { + Selection.activeObject = m_substanceGraph; + EditorGUIUtility.PingObject( Selection.activeObject ); + } + m_editing = false; + } + } + + if( drawInfo.CurrentEventType == EventType.Repaint ) + { + if( !m_editing ) + m_textures = m_substanceGraph != null ? m_substanceGraph.generatedTextures : null; + + if( m_textures != null ) + { + if( m_firstOutputConnected < 0 ) + { + CalculateFirstOutputConnected(); + } + else if( m_textures.Count != m_textureTypes.Length ) + { + OnNewSubstanceSelected( m_textures ); + } + + int texCount = m_outputConns.Count; + Rect individuals = m_previewArea; + individuals.height /= texCount; + + for( int i = 0; i < texCount; i++ ) + { + + //EditorGUI.DrawPreviewTexture( individuals, m_textures[ m_outputConns[ i ] ], null, ScaleMode.ScaleAndCrop ); + EditorGUI.DrawPreviewTexture( individuals, m_outputPorts[ m_outputConns[ i ] ].OutputPreviewTexture, null, ScaleMode.ScaleAndCrop ); + individuals.y += individuals.height; + } + } + else + { + GUI.Label( m_previewArea, string.Empty, UIUtils.ObjectFieldThumb ); + } + + if( ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD2 ) + { + Rect smallButton = m_previewArea; + smallButton.height = 14 * drawInfo.InvertedZoom; + smallButton.y = m_previewArea.yMax - smallButton.height - 2; + smallButton.width = 40 * drawInfo.InvertedZoom; + smallButton.x = m_previewArea.xMax - smallButton.width - 2; + if( m_textures == null ) + { + GUI.Label( m_previewArea, "None (Procedural Material)", UIUtils.ObjectFieldThumbOverlay ); + } + GUI.Label( m_pickerArea, "Select", UIUtils.GetCustomStyle( CustomStyle.SamplerButton ) ); + } + + GUI.Label( m_previewArea, string.Empty, UIUtils.GetCustomStyle( CustomStyle.SamplerFrame ) ); + } + } + + void OnNewSubstanceSelected( List textures ) + { + CacheCurrentSettings(); + ConfigPortsFromMaterial( true, textures ); + ConnectFromCache(); + m_requireMaterialUpdate = true; + CalculateFirstOutputConnected(); + ContainerGraph.ParentWindow.RequestRepaint(); + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUI.BeginChangeCheck(); + SubstanceGraph = EditorGUILayoutObjectField( SubstanceStr, m_substanceGraph, m_type, false ) as SubstanceGraph; + if( EditorGUI.EndChangeCheck() ) + { + List textures = m_substanceGraph != null ? m_substanceGraph.generatedTextures : null; + if( textures != null ) + { + OnNewSubstanceSelected( textures ); + } + } + + m_textureCoordSet = EditorGUILayoutIntPopup( Constants.AvailableUVSetsLabel, m_textureCoordSet, Constants.AvailableUVSetsStr, Constants.AvailableUVSets ); + EditorGUI.BeginChangeCheck(); + m_autoNormal = EditorGUILayoutToggle( AutoNormalStr, m_autoNormal ); + if( EditorGUI.EndChangeCheck() ) + { + for( int i = 0; i < m_textureTypes.Length; i++ ) + { + WirePortDataType portType = ( m_autoNormal && m_textureTypes[ i ] == ASEProceduralOutputType.Normal ) ? WirePortDataType.FLOAT3 : WirePortDataType.COLOR; + if( m_outputPorts[ i ].DataType != portType ) + { + m_outputPorts[ i ].ChangeType( portType, false ); + } + } + } + } + + private void CacheCurrentSettings() + { + m_cacheNodeConnections.Clear(); + for( int portId = 0; portId < m_outputPorts.Count; portId++ ) + { + if( m_outputPorts[ portId ].IsConnected ) + { + int connCount = m_outputPorts[ portId ].ConnectionCount; + for( int connIdx = 0; connIdx < connCount; connIdx++ ) + { + WireReference connection = m_outputPorts[ portId ].GetConnection( connIdx ); + m_cacheNodeConnections.Add( m_outputPorts[ portId ].Name, new NodeCache( connection.NodeId, connection.PortId ) ); + } + } + } + } + + private void ConnectFromCache() + { + for( int i = 0; i < m_outputPorts.Count; i++ ) + { + List connections = m_cacheNodeConnections.GetList( m_outputPorts[ i ].Name ); + if( connections != null ) + { + int count = connections.Count; + for( int connIdx = 0; connIdx < count; connIdx++ ) + { + UIUtils.SetConnection( connections[ connIdx ].TargetNodeId, connections[ connIdx ].TargetPortId, UniqueId, i ); + } + } + } + } + + + private void ConfigPortsFromMaterial( bool invalidateConnections = false, List newTextures = null ) + { + SetAdditonalTitleText( ( m_substanceGraph != null ) ? string.Format( Constants.PropertyValueLabel, m_substanceGraph.name ) : "Value( )" ); + + List textures = newTextures != null ? newTextures : ( ( m_substanceGraph != null ) ? m_substanceGraph.generatedTextures : null ); + if( textures != null ) + { + m_firstOutputConnected = -1; + string nameToRemove = m_substanceGraph.graphLabel + "_"; + m_textureTypes = new ASEProceduralOutputType[ textures.Count ]; + for( int i = 0; i < textures.Count; i++ ) + { + //TODO: Replace for a more efficient test as soon as Laurent gives more infos + bool isNormal = textures[ i ].format == TextureFormat.BC5 || textures[ i ].name.EndsWith( NormalMapCheck ); + m_textureTypes[ i ] = isNormal?ASEProceduralOutputType.Normal:ASEProceduralOutputType.Color; + + WirePortDataType portType = ( m_autoNormal && m_textureTypes[ i ] == ASEProceduralOutputType.Normal ) ? WirePortDataType.FLOAT3 : WirePortDataType.COLOR; + string newName = textures[ i ].name.Replace( nameToRemove, string.Empty ); + char firstLetter = Char.ToUpper( newName[ 0 ] ); + newName = firstLetter.ToString() + newName.Substring( 1 ); + if( i < m_outputPorts.Count ) + { + m_outputPorts[ i ].ChangeProperties( newName, portType, false ); + if( invalidateConnections ) + { + m_outputPorts[ i ].FullDeleteConnections(); + } + } + else + { + AddOutputPort( portType, newName ); + } + } + + if( textures.Count < m_outputPorts.Count ) + { + int itemsToRemove = m_outputPorts.Count - textures.Count; + for( int i = 0; i < itemsToRemove; i++ ) + { + int idx = m_outputPorts.Count - 1; + if( m_outputPorts[ idx ].IsConnected ) + { + m_outputPorts[ idx ].ForceClearConnection(); + } + RemoveOutputPort( idx ); + } + } + } + else + { + int itemsToRemove = m_outputPorts.Count - 1; + m_outputPorts[ 0 ].ChangeProperties( Constants.EmptyPortValue, WirePortDataType.COLOR, false ); + m_outputPorts[ 0 ].ForceClearConnection(); + + for( int i = 0; i < itemsToRemove; i++ ) + { + int idx = m_outputPorts.Count - 1; + if( m_outputPorts[ idx ].IsConnected ) + { + m_outputPorts[ idx ].ForceClearConnection(); + } + RemoveOutputPort( idx ); + } + } + + m_sizeIsDirty = true; + m_isDirty = true; + } + + private void ConfigFromObject( UnityEngine.Object obj ) + { + SubstanceGraph newGraph = obj as SubstanceGraph;// AssetDatabase.LoadAssetAtPath( AssetDatabase.GetAssetPath( obj ) ); + if( newGraph != null ) + { + SubstanceGraph = newGraph; + ConfigPortsFromMaterial(); + } + + Substance.Game.Substance newSubstance = obj as Substance.Game.Substance;// AssetDatabase.LoadAssetAtPath( AssetDatabase.GetAssetPath( obj ) ); + if( newSubstance != null && newSubstance.graphs.Count > 0 ) + { + SubstanceGraph = newSubstance.graphs[0]; + ConfigPortsFromMaterial(); + } + + } + + public override void OnObjectDropped( UnityEngine.Object obj ) + { + ConfigFromObject( obj ); + } + + public override void SetupFromCastObject( UnityEngine.Object obj ) + { + ConfigFromObject( obj ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_substanceGraph == null ) + { + return "(0).xxxx"; + } + + if( m_outputPorts[ outputId ].IsLocalValue( dataCollector.PortCategory ) ) + { + return m_outputPorts[ outputId ].LocalValue( dataCollector.PortCategory ); + } + + List textures = m_substanceGraph.generatedTextures; + + string uvPropertyName = string.Empty; + for( int i = 0; i < m_outputPorts.Count; i++ ) + { + if( m_outputPorts[ i ].HasConnectedNode ) + { + uvPropertyName = UIUtils.GeneratePropertyName( textures[ i ].name , PropertyType.Property ); + break; + } + } + + string propertyName = UIUtils.GeneratePropertyName( textures[ outputId ].name, PropertyType.Property ); + string name = propertyName + OutputId; + dataCollector.AddToUniforms( UniqueId, string.Format( GlobalVarDecStr, propertyName ) ); + dataCollector.AddToProperties( UniqueId, string.Format( PropertyDecStr, propertyName, textures[ outputId ].name ) + "{}", -1 ); + bool isVertex = ( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ); + string value = string.Format( "tex2D{0}({1}, {2})", ( isVertex ? "lod" : string.Empty ), propertyName, GetUVCoords( ref dataCollector, ignoreLocalvar, uvPropertyName ) ); + if( m_autoNormal && m_textureTypes[ outputId ] == ASEProceduralOutputType.Normal ) + { + value = GeneratorUtils.GenerateUnpackNormalStr( ref dataCollector, CurrentPrecisionType, UniqueId, OutputId, value, false, "1.0" ); + } + + dataCollector.AddPropertyNode( this ); + RegisterLocalVariable( outputId, value, ref dataCollector, name ); + + return m_outputPorts[ outputId ].LocalValue( dataCollector.PortCategory ); + } + + public string GetUVCoords( ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar, string propertyName ) + { + bool isVertex = ( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ); + if( m_inputPorts[ 0 ].IsConnected ) + { + return m_inputPorts[ 0 ].GenerateShaderForOutput( ref dataCollector, isVertex ? WirePortDataType.FLOAT4 : WirePortDataType.FLOAT2, ignoreLocalVar, true ); + } + else + { + string uvChannelName = IOUtils.GetUVChannelName( propertyName, m_textureCoordSet ); + + if( dataCollector.IsTemplate ) + { + string propertyHelperVar = propertyName + "_ST"; + dataCollector.AddToUniforms( UniqueId, "float4", propertyHelperVar, dataCollector.IsSRP ); + string uvName = string.Empty; + string result = string.Empty; + if( dataCollector.TemplateDataCollectorInstance.GetCustomInterpolatedData( TemplateHelperFunctions.IntToUVChannelInfo[ m_textureCoordSet ], WirePortDataType.FLOAT4, PrecisionType.Float, ref result, false, dataCollector.PortCategory ) ) + { + if( m_inputPorts[ 0 ].DataType != WirePortDataType.FLOAT4 ) + result += UIUtils.GetAutoSwizzle( m_inputPorts[ 0 ].DataType ); + uvName = result; + } + else + if( dataCollector.TemplateDataCollectorInstance.HasUV( m_textureCoordSet ) ) + { + uvName = dataCollector.TemplateDataCollectorInstance.GetUVName( m_textureCoordSet ); + } + else + { + uvName = dataCollector.TemplateDataCollectorInstance.RegisterUV( m_textureCoordSet ); + } + + uvChannelName = "uv" + propertyName; + if( isVertex ) + { + string value = string.Format( Constants.TilingOffsetFormat, uvName, propertyHelperVar + ".xy", propertyHelperVar + ".zw" ); + string lodLevel = "0"; + + value = "float4( " + value + ", 0 , " + lodLevel + " )"; + dataCollector.AddLocalVariable( UniqueId, m_currentPrecisionType, WirePortDataType.FLOAT4, uvChannelName, value ); + } + else + { + dataCollector.AddLocalVariable( UniqueId, m_currentPrecisionType, WirePortDataType.FLOAT2, uvChannelName, string.Format( Constants.TilingOffsetFormat, uvName, propertyHelperVar + ".xy", propertyHelperVar + ".zw" ) ); + } + } + else + { + string vertexCoords = Constants.VertexShaderInputStr + ".texcoord"; + if( m_textureCoordSet > 0 ) + { + vertexCoords += m_textureCoordSet.ToString(); + } + + + string dummyPropUV = "_texcoord" + ( m_textureCoordSet > 0 ? ( m_textureCoordSet + 1 ).ToString() : "" ); + string dummyUV = "uv" + ( m_textureCoordSet > 0 ? ( m_textureCoordSet + 1 ).ToString() : "" ) + dummyPropUV; + + dataCollector.AddToUniforms( UniqueId, "uniform float4 " + propertyName + "_ST;" ); + dataCollector.AddToProperties( UniqueId, "[HideInInspector] " + dummyPropUV + "( \"\", 2D ) = \"white\" {}", 100 ); + dataCollector.AddToInput( UniqueId, dummyUV, WirePortDataType.FLOAT2 ); + + if( isVertex ) + { + dataCollector.AddToVertexLocalVariables( UniqueId, "float4 " + uvChannelName + " = float4(" + vertexCoords + " * " + propertyName + "_ST.xy + " + propertyName + "_ST.zw, 0 ,0);" ); + return uvChannelName; + } + else + dataCollector.AddToLocalVariables( UniqueId, PrecisionType.Float, WirePortDataType.FLOAT2, uvChannelName, Constants.InputVarStr + "." + dummyUV + " * " + propertyName + "_ST.xy + " + propertyName + "_ST.zw" ); + + } + + return uvChannelName; + } + } + + public override void UpdateMaterial( Material mat ) + { + base.UpdateMaterial( mat ); + if( m_substanceGraph != null ) + { + List textures = m_substanceGraph.generatedTextures; + for( int i = 0; i < textures.Count; i++ ) + { + string textureName = UIUtils.GeneratePropertyName( textures[ i ].name, PropertyType.Property ); + if( mat.HasProperty( textureName ) && !InsideShaderFunction ) + { + mat.SetTexture( textureName, textures[ i ] ); + } + } + } + } + + public override bool UpdateShaderDefaults( ref Shader shader, ref TextureDefaultsDataColector defaultCol ) + { + if( m_substanceGraph != null ) + { + List textures = m_substanceGraph.generatedTextures; + for( int i = 0; i < textures.Count; i++ ) + { + defaultCol.AddValue( UIUtils.GeneratePropertyName( textures[ i ].name, PropertyType.Property ), textures[ i ] ); + } + } + return true; + } + + public override void OnNodeLogicUpdate( DrawInfo drawInfo ) + { + base.OnNodeLogicUpdate( drawInfo ); + if( m_substanceGraph == null && !string.IsNullOrEmpty( m_substanceGUID ) ) + { + SubstanceGraph = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( m_substanceGUID ) ); + if( m_substanceGraph == null ) + { + m_substanceGUID = string.Empty; + } + } + } + + public override void Destroy() + { + base.Destroy(); + m_textures = null; + m_substanceGraph = null; + m_substanceGUID = string.Empty; + m_cacheNodeConnections.Clear(); + m_cacheNodeConnections = null; + m_outputConns.Clear(); + m_outputConns = null; + } + + public override string GetPropertyValStr() + { + return m_substanceGraph ? m_substanceGraph.name : string.Empty; + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + string guid = GetCurrentParam( ref nodeParams ); + m_textureCoordSet = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_autoNormal = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + if( guid.Length > 1 ) + { + SubstanceGraph = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( guid ) ); + if( m_substanceGraph != null ) + { + ConfigPortsFromMaterial(); + } + else + { + UIUtils.ShowMessage( "Substance not found ", MessageSeverity.Error ); + } + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + string guid = ( m_substanceGraph != null ) ? AssetDatabase.AssetPathToGUID( AssetDatabase.GetAssetPath( m_substanceGraph ) ) : "0"; + IOUtils.AddFieldValueToString( ref nodeInfo, guid ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_textureCoordSet ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_autoNormal ); + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + if( m_substanceGraph != null ) + { + int count = m_outputPorts.Count; + for( int i = 0; i < count; i++ ) + { + if( m_autoNormal && m_textureTypes[ i ] == ASEProceduralOutputType.Normal ) + m_outputPorts[ i ].ChangeType( WirePortDataType.FLOAT3, false ); + else + m_outputPorts[ i ].ChangeType( WirePortDataType.FLOAT4, false ); + } + } + } + + public SubstanceGraph SubstanceGraph + { + set + { + m_substanceGraph = value; + if( value != null ) + { + m_substanceGUID = AssetDatabase.AssetPathToGUID( AssetDatabase.GetAssetPath( value ) ); + } + else + { + m_substanceGUID = string.Empty; + } + } + get { return m_substanceGraph; } + } + } +#pragma warning restore 0618 +} +#endif diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/SubstanceSamplerNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/SubstanceSamplerNode.cs.meta new file mode 100644 index 0000000..02886b0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/SubstanceSamplerNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7323b6020278e034b9e4c670cbc61361 +timeCreated: 1486640033 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TFHCFlipBookUVAnimation.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TFHCFlipBookUVAnimation.cs new file mode 100644 index 0000000..3735c3a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TFHCFlipBookUVAnimation.cs @@ -0,0 +1,238 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +// +// Custom Node Flipbook UV Animation +// Donated by The Four Headed Cat - @fourheadedcat + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + + [Serializable] + [NodeAttributes( "Flipbook UV Animation", "UV Coordinates", "Animate a Flipbook Texture Modifying UV Coordinates.", null, KeyCode.None, true, false, null, null, "The Four Headed Cat - @fourheadedcat" )] + public sealed class TFHCFlipBookUVAnimation : ParentNode + + { + + private const string TextureVerticalDirectionStr = "Texture Direction"; + private const string NegativeSpeedBehaviorStr = "If Negative Speed"; + + [SerializeField] + private int m_selectedTextureVerticalDirection = 0; + + [SerializeField] + private int m_negativeSpeedBehavior = 0; + + [SerializeField] + private readonly string[] m_textureVerticalDirectionValues = { "Top To Bottom", "Bottom To Top" }; + + [SerializeField] + private readonly string[] m_negativeSpeedBehaviorValues = { "Switch to Positive", "Reverse Animation" }; + + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT2, false, "UV" ); + AddInputPort( WirePortDataType.FLOAT, false, "Columns" ); + AddInputPort( WirePortDataType.FLOAT, false, "Rows" ); + AddInputPort( WirePortDataType.FLOAT, false, "Speed" ); + AddInputPort( WirePortDataType.FLOAT, false, "Start Frame" ); + AddInputPort( WirePortDataType.FLOAT, false, "Time" ); + + AddOutputVectorPorts( WirePortDataType.FLOAT2, "UV" ); + m_outputPorts[ 1 ].Name = "U"; + m_outputPorts[ 2 ].Name = "V"; + m_textLabelWidth = 125; + m_useInternalPortData = true; + m_autoWrapProperties = true; + m_previewShaderGUID = "04fe24be792bfd5428b92132d7cf0f7d"; + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + if( portId == 5 ) + { + m_previewMaterialPassId = 1; + } + } + + public override void OnInputPortDisconnected( int portId ) + { + base.OnInputPortDisconnected( portId ); + if( portId == 5 ) + { + m_previewMaterialPassId = 0; + } + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUILayout.BeginVertical(); + m_selectedTextureVerticalDirection = EditorGUILayoutPopup( TextureVerticalDirectionStr, m_selectedTextureVerticalDirection, m_textureVerticalDirectionValues ); + m_negativeSpeedBehavior = EditorGUILayoutPopup( NegativeSpeedBehaviorStr, m_negativeSpeedBehavior, m_negativeSpeedBehaviorValues ); + EditorGUILayout.EndVertical(); + EditorGUILayout.HelpBox( "Flipbook UV Animation:\n\n - UV: Texture Coordinates to Flipbook.\n - Columns: number of Columns (X) of the Flipbook Texture.\n - Rows: number of Rows (Y) of the Flipbook Textures.\n - Speed: speed of the animation.\n - Texture Direction: set the vertical order of the texture tiles.\n - If Negative Speed: set the behavior when speed is negative.\n\n - Out: UV Coordinates.", MessageType.None ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_selectedTextureVerticalDirection = ( int ) int.Parse( GetCurrentParam( ref nodeParams ) ); + m_negativeSpeedBehavior = ( int ) int.Parse( GetCurrentParam( ref nodeParams ) ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_selectedTextureVerticalDirection ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_negativeSpeedBehavior ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + // OPTIMIZATION NOTES + // + // round( fmod( x, y ) ) can be replaced with a faster + // floor( frac( x / y ) * y + 0.5 ) => div can be muls with 1/y, almost always static/constant + // + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + + string uv = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string columns = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + + if ( !m_inputPorts[ 1 ].IsConnected ) + columns = ( float.Parse( columns ) == 0f ? "1" : columns ); + + string rows = m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector ); + if ( !m_inputPorts[ 2 ].IsConnected ) + rows = ( float.Parse( rows ) == 0f ? "1" : rows ); + + string speed = m_inputPorts[ 3 ].GeneratePortInstructions( ref dataCollector ); + string startframe = m_inputPorts[ 4 ].GeneratePortInstructions( ref dataCollector ); + string timer = m_inputPorts[ 5 ].IsConnected ? m_inputPorts[ 5 ].GeneratePortInstructions( ref dataCollector ) : "_Time[ 1 ]"; + + string vcomment1 = "// *** BEGIN Flipbook UV Animation vars ***"; + string vcomment2 = "// Total tiles of Flipbook Texture"; + string vtotaltiles = "float fbtotaltiles" + OutputId + " = " + columns + " * " + rows + ";"; + string vcomment3 = "// Offsets for cols and rows of Flipbook Texture"; + string vcolsoffset = "float fbcolsoffset" + OutputId + " = 1.0f / " + columns + ";"; + string vrowssoffset = "float fbrowsoffset" + OutputId + " = 1.0f / " + rows + ";"; + string vcomment4 = "// Speed of animation"; + + string vspeed = string.Format( "float fbspeed{0} = {1} * {2};", OutputId,timer,speed); + string vcomment5 = "// UV Tiling (col and row offset)"; + string vtiling = "float2 fbtiling" + OutputId + " = float2(fbcolsoffset" + OutputId + ", fbrowsoffset" + OutputId + ");"; + string vcomment6 = "// UV Offset - calculate current tile linear index, and convert it to (X * coloffset, Y * rowoffset)"; + string vcomment7 = "// Calculate current tile linear index"; + //float fbcurrenttileindex1 = round( fmod( fbspeed1 + _Float0, fbtotaltiles1 ) ); + string vcurrenttileindex = "float fbcurrenttileindex" + OutputId + " = round( fmod( fbspeed" + OutputId + " + " + startframe + ", fbtotaltiles" + OutputId + ") );"; + string vcurrenttileindex1 = "fbcurrenttileindex" + OutputId + " += ( fbcurrenttileindex" + OutputId + " < 0) ? fbtotaltiles" + OutputId + " : 0;"; + //fbcurrenttileindex1 += ( fbcurrenttileindex1 < 0 ) ? fbtotaltiles1 : 0; + //string vcurrenttileindex = "int fbcurrenttileindex" + m_uniqueId + " = (int)fmod( fbspeed" + m_uniqueId + ", fbtotaltiles" + m_uniqueId + ") + " + startframe + ";"; + string vcomment8 = "// Obtain Offset X coordinate from current tile linear index"; + + //float fblinearindextox1 = round( fmod( fbcurrenttileindex1, 5.0 ) ); + //string voffsetx1 = "int fblinearindextox" + m_uniqueId + " = fbcurrenttileindex" + m_uniqueId + " % (int)" + columns + ";"; + string voffsetx1 = "float fblinearindextox" + OutputId + " = round ( fmod ( fbcurrenttileindex" + OutputId + ", " + columns + " ) );"; + string vcomment9 = String.Empty; + string voffsetx2 = String.Empty; + if ( m_negativeSpeedBehavior != 0 ) + { + vcomment9 = "// Reverse X animation if speed is negative"; + voffsetx2 = "fblinearindextox" + OutputId + " = (" + speed + " > 0 ? fblinearindextox" + OutputId + " : (int)" + columns + " - fblinearindextox" + OutputId + ");"; + } + string vcomment10 = "// Multiply Offset X by coloffset"; + string voffsetx3 = "float fboffsetx" + OutputId + " = fblinearindextox" + OutputId + " * fbcolsoffset" + OutputId + ";"; + string vcomment11 = "// Obtain Offset Y coordinate from current tile linear index"; + //float fblinearindextoy1 = round( fmod( ( fbcurrenttileindex1 - fblinearindextox1 ) / 5.0, 5.0 ) ); + string voffsety1 = "float fblinearindextoy" + OutputId + " = round( fmod( ( fbcurrenttileindex" + OutputId + " - fblinearindextox" + OutputId + " ) / " + columns + ", " + rows + " ) );"; + //string voffsety1 = "int fblinearindextoy" + m_uniqueId + " = (int)( ( fbcurrenttileindex" + m_uniqueId + " - fblinearindextox" + m_uniqueId + " ) / " + columns + " ) % (int)" + rows + ";"; + //string vcomment10 = "// Reverse Y to get from Top to Bottom"; + //string voffsety2 = "fblinearindextoy" + m_uniqueId + " = (int)" + rows + " - fblinearindextoy" + m_uniqueId + ";"; + string vcomment12 = String.Empty; + string voffsety2 = String.Empty; + if ( m_negativeSpeedBehavior == 0 ) + { + if ( m_selectedTextureVerticalDirection == 0 ) + { + vcomment12 = "// Reverse Y to get tiles from Top to Bottom"; + voffsety2 = "fblinearindextoy" + OutputId + " = (int)(" + rows + "-1) - fblinearindextoy" + OutputId + ";"; + } + } + else + { + string reverseanimationoperator = String.Empty; + if ( m_selectedTextureVerticalDirection == 0 ) + { + vcomment12 = "// Reverse Y to get tiles from Top to Bottom and Reverse Y animation if speed is negative"; + reverseanimationoperator = " < "; + } + else + { + vcomment12 = "// Reverse Y animation if speed is negative"; + reverseanimationoperator = " > "; + } + voffsety2 = "fblinearindextoy" + OutputId + " = (" + speed + reverseanimationoperator + " 0 ? fblinearindextoy" + OutputId + " : (int)" + rows + " - fblinearindextoy" + OutputId + ");"; + } + string vcomment13 = "// Multiply Offset Y by rowoffset"; + string voffsety3 = "float fboffsety" + OutputId + " = fblinearindextoy" + OutputId + " * fbrowsoffset" + OutputId + ";"; + string vcomment14 = "// UV Offset"; + string voffset = "float2 fboffset" + OutputId + " = float2(fboffsetx" + OutputId + ", fboffsety" + OutputId + ");"; + //string voffset = "float2 fboffset" + m_uniqueId + " = float2( ( ( (int)fmod( fbspeed" + m_uniqueId + " , fbtotaltiles" + m_uniqueId + ") % (int)" + columns + " ) * fbcolsoffset" + m_OutputId + " ) , ( ( (int)" + rows + " - ( (int)( ( (int)fmod( fbspeed" + m_uniqueId + " , fbtotaltiles" + m_uniqueId + " ) - ( (int)fmod( fbspeed" + m_uniqueId + " , fbtotaltiles" + m_uniqueId + " ) % (int)" + columns + " ) ) / " + columns + " ) % (int)" + rows + " ) ) * fbrowsoffset" + m_uniqueId + " ) );"; + string vcomment15 = "// Flipbook UV"; + string vfbuv = "half2 fbuv" + OutputId + " = " + uv + " * fbtiling" + OutputId + " + fboffset" + OutputId + ";"; + string vcomment16 = "// *** END Flipbook UV Animation vars ***"; + string result = "fbuv" + OutputId; + + dataCollector.AddLocalVariable( UniqueId, vcomment1 ); + dataCollector.AddLocalVariable( UniqueId, vcomment2 ); + dataCollector.AddLocalVariable( UniqueId, vtotaltiles ); + dataCollector.AddLocalVariable( UniqueId, vcomment3 ); + dataCollector.AddLocalVariable( UniqueId, vcolsoffset ); + dataCollector.AddLocalVariable( UniqueId, vrowssoffset ); + dataCollector.AddLocalVariable( UniqueId, vcomment4 ); + dataCollector.AddLocalVariable( UniqueId, vspeed ); + dataCollector.AddLocalVariable( UniqueId, vcomment5 ); + dataCollector.AddLocalVariable( UniqueId, vtiling ); + dataCollector.AddLocalVariable( UniqueId, vcomment6 ); + dataCollector.AddLocalVariable( UniqueId, vcomment7 ); + dataCollector.AddLocalVariable( UniqueId, vcurrenttileindex ); + dataCollector.AddLocalVariable( UniqueId, vcurrenttileindex1 ); + dataCollector.AddLocalVariable( UniqueId, vcomment8 ); + dataCollector.AddLocalVariable( UniqueId, voffsetx1 ); + if ( m_negativeSpeedBehavior != 0 ) + { + dataCollector.AddLocalVariable( UniqueId, vcomment9 ); + dataCollector.AddLocalVariable( UniqueId, voffsetx2 ); + } + dataCollector.AddLocalVariable( UniqueId, vcomment10 ); + dataCollector.AddLocalVariable( UniqueId, voffsetx3 ); + dataCollector.AddLocalVariable( UniqueId, vcomment11 ); + dataCollector.AddLocalVariable( UniqueId, voffsety1 ); + if ( m_selectedTextureVerticalDirection == 0 || m_negativeSpeedBehavior != 0 ) + { + dataCollector.AddLocalVariable( UniqueId, vcomment12 ); + dataCollector.AddLocalVariable( UniqueId, voffsety2 ); + } + dataCollector.AddLocalVariable( UniqueId, vcomment13 ); + dataCollector.AddLocalVariable( UniqueId, voffsety3 ); + dataCollector.AddLocalVariable( UniqueId, vcomment14 ); + dataCollector.AddLocalVariable( UniqueId, voffset ); + dataCollector.AddLocalVariable( UniqueId, vcomment15 ); + dataCollector.AddLocalVariable( UniqueId, vfbuv ); + dataCollector.AddLocalVariable( UniqueId, vcomment16 ); + + m_outputPorts[ 0 ].SetLocalValue( result, dataCollector.PortCategory ); + + return GetOutputVectorItem( 0, outputId, result ); + + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TFHCFlipBookUVAnimation.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TFHCFlipBookUVAnimation.cs.meta new file mode 100644 index 0000000..cf165fe --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TFHCFlipBookUVAnimation.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 38b8c76e7f2dc294581195a669942706 +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TFHCPixelate.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TFHCPixelate.cs new file mode 100644 index 0000000..3d778d9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TFHCPixelate.cs @@ -0,0 +1,54 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +// +// Custom Node Pixelate UV +// Donated by The Four Headed Cat - @fourheadedcat + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Pixelate UV", "UV Coordinates", "Pixelate Texture Modifying UV.", null, KeyCode.None, true, false, null, null, "The Four Headed Cat - @fourheadedcat" )] + public sealed class TFHCPixelate : ParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT2, true, "UV" ); + AddInputPort( WirePortDataType.FLOAT, false, "Pixels X" ); + AddInputPort( WirePortDataType.FLOAT, false, "Pixels Y" ); + AddOutputPort( WirePortDataType.FLOAT2, "Out" ); + m_useInternalPortData = true; + m_previewShaderGUID = "e2f7e3c513ed18340868b8cbd0d85cfb"; + } + + public override void DrawProperties() + { + base.DrawProperties (); + EditorGUILayout.HelpBox ("Pixelate UV.\n\n - UV is the Texture Coordinates to pixelate.\n - Pixels X is the number of horizontal pixels\n - Pixels Y is the number of vertical pixels.", MessageType.None); + + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + string uv = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + string PixelCount_X = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ); + string PixelCount_Y = m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector ); + + string pixelWidth = "float pixelWidth" + OutputId + " = 1.0f / " + PixelCount_X + ";"; + string pixelHeight = "float pixelHeight" + OutputId + " = 1.0f / " + PixelCount_Y + ";"; + string pixelatedUV = "half2 pixelateduv" + OutputId + " = half2((int)(" + uv + ".x / pixelWidth" + OutputId + ") * pixelWidth" + OutputId + ", (int)(" + uv + ".y / pixelHeight" + OutputId + ") * pixelHeight" + OutputId + ");"; + string result = "pixelateduv" + OutputId; + + dataCollector.AddLocalVariable( UniqueId, pixelWidth ); + dataCollector.AddLocalVariable( UniqueId, pixelHeight ); + dataCollector.AddLocalVariable( UniqueId, pixelatedUV ); + + return GetOutputVectorItem( 0, outputId, result); + + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TFHCPixelate.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TFHCPixelate.cs.meta new file mode 100644 index 0000000..fc01dd0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TFHCPixelate.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 72a1a810ace8ea440ba20d4a4f9086ce +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TextureCoordinatesNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TextureCoordinatesNode.cs new file mode 100644 index 0000000..f2820df --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TextureCoordinatesNode.cs @@ -0,0 +1,628 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Texture Coordinates", "UV Coordinates", "Texture UV coordinates set, if Tex is connected to a texture object it will use that texture scale factors, otherwise uses Tilling and Offset port values", null, KeyCode.U, tags: "uv" )] + public sealed class TextureCoordinatesNode : ParentNode + { + + private const string DummyPropertyDec = "[HideInInspector] _DummyTex{0}( \"\", 2D ) = \"white\""; + private const string DummyUniformDec = "uniform sampler2D _DummyTex{0};"; + private const string DummyTexCoordDef = "uv{0}_DummyTex{0}"; + private const string DummyTexCoordSurfDef = "float2 texCoordDummy{0} = {1}.uv{2}_DummyTex{2}*{3} + {4};"; + private const string DummyTexCoordSurfVar = "texCoordDummy{0}"; + + private readonly string[] Dummy = { string.Empty }; + + private const string TilingStr = "Tiling"; + private const string OffsetStr = "Offset"; + private const string TexCoordStr = "texcoord_"; + + [SerializeField] + private int m_referenceArrayId = -1; + + [SerializeField] + private int m_referenceNodeId = -1; + + [SerializeField] + private int m_textureCoordChannel = 0; + + //[SerializeField] + //private int m_texcoordId = -1; + + [SerializeField] + private int m_texcoordSize = 2; + + [SerializeField] + private string m_surfaceTexcoordName = string.Empty; + + [SerializeField] + private TexturePropertyNode m_inputReferenceNode = null; + + private Vector4Node m_texCoordsHelper; + + private TexturePropertyNode m_referenceNode = null; + + private InputPort m_texPort = null; + private InputPort m_tilingPort = null; + private InputPort m_offsetPort = null; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.SAMPLER2D, false, "Tex", -1, MasterNodePortCategory.Fragment, 2 ); + m_texPort = m_inputPorts[ m_inputPorts.Count - 1 ]; + m_texPort.CreatePortRestrictions( WirePortDataType.SAMPLER1D, WirePortDataType.SAMPLER2D, WirePortDataType.SAMPLER3D, WirePortDataType.SAMPLERCUBE, WirePortDataType.SAMPLER2DARRAY, WirePortDataType.OBJECT ); + + AddInputPort( WirePortDataType.FLOAT2, false, "Tiling", -1, MasterNodePortCategory.Fragment, 0 ); + m_tilingPort = m_inputPorts[ m_inputPorts.Count - 1 ]; + m_tilingPort.Vector2InternalData = new Vector2( 1, 1 ); + AddInputPort( WirePortDataType.FLOAT2, false, "Offset", -1, MasterNodePortCategory.Fragment, 1 ); + m_offsetPort = m_inputPorts[ m_inputPorts.Count - 1 ]; + + + AddOutputVectorPorts( WirePortDataType.FLOAT2, "UV" ); + m_outputPorts[ 1 ].Name = "U"; + m_outputPorts[ 2 ].Name = "V"; + AddOutputPort( WirePortDataType.FLOAT, "W" ); + AddOutputPort( WirePortDataType.FLOAT, "T" ); + m_textLabelWidth = 90; + m_useInternalPortData = true; + m_autoWrapProperties = true; + m_hasLeftDropdown = true; + m_tilingPort.Category = MasterNodePortCategory.Vertex; + m_offsetPort.Category = MasterNodePortCategory.Vertex; + UpdateOutput(); + m_previewShaderGUID = "085e462b2de441a42949be0e666cf5d2"; + } + + public override void Reset() + { + m_surfaceTexcoordName = string.Empty; + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + if( portId == 2 ) + { + m_texPort.MatchPortToConnection(); + m_inputReferenceNode = m_texPort.GetOutputNodeWhichIsNotRelay() as TexturePropertyNode; + UpdatePorts(); + } + UpdateTitle(); + } + + public override void OnInputPortDisconnected( int portId ) + { + base.OnInputPortDisconnected( portId ); + if( portId == 2 ) + { + m_inputReferenceNode = null; + UpdatePorts(); + } + UpdateTitle(); + } + + public override void OnConnectedOutputNodeChanges( int portId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( portId, otherNodeId, otherPortId, name, type ); + if( portId == 2 ) + { + m_texPort.MatchPortToConnection(); + UpdateTitle(); + } + } + + void UpdateTitle() + { + if( m_inputReferenceNode != null ) + { + m_additionalContent.text = string.Format( "Value( {0} )", m_inputReferenceNode.PropertyInspectorName ); + } + else if( m_referenceArrayId > -1 && m_referenceNode != null ) + { + m_additionalContent.text = string.Format( "Value( {0} )", m_referenceNode.PropertyInspectorName ); + } + else + { + m_additionalContent.text = string.Empty; + } + m_sizeIsDirty = true; + } + + void UpdatePorts() + { + if( m_inputReferenceNode != null || m_texPort.IsConnected ) + { + m_tilingPort.Locked = true; + m_offsetPort.Locked = true; + } + else if( m_referenceArrayId > -1 ) + { + m_tilingPort.Locked = true; + m_offsetPort.Locked = true; + } + else + { + m_tilingPort.Locked = false; + m_offsetPort.Locked = false; + } + } + + public override void DrawProperties() + { + bool guiEnabledBuffer = GUI.enabled; + + EditorGUI.BeginChangeCheck(); + List arr = new List( UIUtils.TexturePropertyNodeArr() ); + if( arr != null && arr.Count > 0 ) + { + arr.Insert( 0, "None" ); + GUI.enabled = true && ( !m_texPort.IsConnected ); + m_referenceArrayId = EditorGUILayoutPopup( Constants.AvailableReferenceStr, m_referenceArrayId + 1, arr.ToArray() ) - 1; + } + else + { + m_referenceArrayId = -1; + GUI.enabled = false; + EditorGUILayoutPopup( Constants.AvailableReferenceStr, 0, Dummy ); + } + + GUI.enabled = guiEnabledBuffer; + if( EditorGUI.EndChangeCheck() ) + { + m_referenceNode = UIUtils.GetTexturePropertyNode( m_referenceArrayId ); + if( m_referenceNode != null ) + { + m_referenceNodeId = m_referenceNode.UniqueId; + } + else + { + m_referenceNodeId = -1; + m_referenceArrayId = -1; + } + + UpdateTitle(); + UpdatePorts(); + } + + EditorGUI.BeginChangeCheck(); + m_texcoordSize = EditorGUILayoutIntPopup( Constants.AvailableUVSizesLabel, m_texcoordSize, Constants.AvailableUVSizesStr, Constants.AvailableUVSizes ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateOutput(); + } + + m_textureCoordChannel = EditorGUILayoutIntPopup( Constants.AvailableUVSetsLabel, m_textureCoordChannel, Constants.AvailableUVSetsStr, Constants.AvailableUVSets ); + + + if( m_referenceArrayId > -1 ) + GUI.enabled = false; + + base.DrawProperties(); + + GUI.enabled = guiEnabledBuffer; + } + + private void UpdateOutput() + { + if( m_texcoordSize == 3 ) + { + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT3, false ); + m_outputPorts[ 0 ].Name = "UVW"; + m_outputPorts[ 3 ].Visible = true; + m_outputPorts[ 4 ].Visible = false; + } + else if( m_texcoordSize == 4 ) + { + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT4, false ); + m_outputPorts[ 0 ].Name = "UVWT"; + m_outputPorts[ 3 ].Visible = true; + m_outputPorts[ 4 ].Visible = true; + } + else + { + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT2, false ); + m_outputPorts[ 0 ].Name = "UV"; + m_outputPorts[ 3 ].Visible = false; + m_outputPorts[ 4 ].Visible = false; + } + m_sizeIsDirty = true; + } + + public override void OnNodeLogicUpdate( DrawInfo drawInfo ) + { + base.OnNodeLogicUpdate( drawInfo ); + CheckReference(); + } + + //public override void Draw( DrawInfo drawInfo ) + //{ + // base.Draw( drawInfo ); + // //CheckReference(); + //} + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + if( m_dropdownEditing ) + { + EditorGUI.BeginChangeCheck(); + m_texcoordSize = EditorGUIIntPopup( m_dropdownRect, m_texcoordSize, Constants.AvailableUVSizesStr, Constants.AvailableUVSizes, UIUtils.PropertyPopUp ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateOutput(); + DropdownEditing = false; + } + } + } + + void CheckReference() + { + if( m_referenceArrayId > -1 ) + { + ParentNode newNode = UIUtils.GetTexturePropertyNode( m_referenceArrayId ); + if( newNode == null || newNode.UniqueId != m_referenceNodeId ) + { + m_referenceNode = null; + int count = UIUtils.GetTexturePropertyNodeAmount(); + for( int i = 0; i < count; i++ ) + { + ParentNode node = UIUtils.GetTexturePropertyNode( i ); + if( node.UniqueId == m_referenceNodeId ) + { + m_referenceNode = node as TexturePropertyNode; + m_referenceArrayId = i; + break; + } + } + } + } + + if( m_referenceNode == null && m_referenceNodeId > -1 ) + { + m_referenceNodeId = -1; + m_referenceArrayId = -1; + UpdateTitle(); + UpdatePorts(); + } + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_textureCoordChannel = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > 2402 ) + { + if( UIUtils.CurrentShaderVersion() > 2404 ) + { + m_referenceNodeId = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + else + { + m_referenceArrayId = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + } + + if( UIUtils.CurrentShaderVersion() > 5001 ) + { + m_texcoordSize = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + UpdateOutput(); + } + } + + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + if( UIUtils.CurrentShaderVersion() > 2402 ) + { + if( UIUtils.CurrentShaderVersion() > 2404 ) + { + m_referenceNode = UIUtils.GetNode( m_referenceNodeId ) as TexturePropertyNode; + if( m_referenceNodeId > -1 ) + m_referenceArrayId = UIUtils.GetTexturePropertyNodeRegisterId( m_referenceNodeId ); + } + else + { + m_referenceNode = UIUtils.GetTexturePropertyNode( m_referenceArrayId ); + if( m_referenceNode != null ) + { + m_referenceNodeId = m_referenceNode.UniqueId; + } + } + UpdateTitle(); + UpdatePorts(); + } + } + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + if( dataCollector != null && dataCollector.TesselationActive ) + { + base.PropagateNodeData( nodeData, ref dataCollector ); + return; + } + + if( dataCollector.IsTemplate ) + { + dataCollector.TemplateDataCollectorInstance.SetUVUsage( m_textureCoordChannel, m_texcoordSize ); + } + else if( m_textureCoordChannel > 3 ) + { + dataCollector.AddCustomAppData( string.Format( TemplateHelperFunctions.TexUVFullSemantic, m_textureCoordChannel ) ); + } + UIUtils.SetCategoryInBitArray( ref m_category, nodeData.Category ); + + MasterNodePortCategory propagateCategory = ( nodeData.Category != MasterNodePortCategory.Vertex && nodeData.Category != MasterNodePortCategory.Tessellation ) ? MasterNodePortCategory.Vertex : nodeData.Category; + nodeData.Category = propagateCategory; + nodeData.GraphDepth += 1; + if( nodeData.GraphDepth > m_graphDepth ) + { + m_graphDepth = nodeData.GraphDepth; + } + + int count = m_inputPorts.Count; + for( int i = 0; i < count; i++ ) + { + if( m_inputPorts[ i ].IsConnected ) + { + //m_inputPorts[ i ].GetOutputNode().PropagateNodeCategory( category ); + m_inputPorts[ i ].GetOutputNode().PropagateNodeData( nodeData, ref dataCollector ); + } + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_textureCoordChannel ); + IOUtils.AddFieldValueToString( ref nodeInfo, ( ( m_referenceNode != null ) ? m_referenceNode.UniqueId : -1 ) ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_texcoordSize ); + } + + string GetValidPropertyName() + { + string propertyName = string.Empty; + if( m_inputReferenceNode != null ) + { + propertyName = m_inputReferenceNode.PropertyName; + } + else if( m_referenceArrayId > -1 ) + { + m_referenceNode = UIUtils.GetTexturePropertyNode( m_referenceArrayId ); + if( m_referenceNode != null ) + { + propertyName = m_referenceNode.PropertyName; + } + } + + return propertyName; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + if( dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + { + UIUtils.ShowMessage( UniqueId, m_nodeAttribs.Name + " cannot be used on Master Node Tessellation port" ); + return "-1"; + } + + //bool isVertex = ( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ); + + string tiling = string.Empty; + string offset = string.Empty; + + string portProperty = string.Empty; + if( m_texPort.IsConnected ) + { + portProperty = m_texPort.GeneratePortInstructions( ref dataCollector ); + } + else if( m_referenceArrayId > -1 ) + { + TexturePropertyNode temp = UIUtils.GetTexturePropertyNode( m_referenceArrayId ); + if( temp != null ) + { + portProperty = temp.BaseGenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalVar ); + } + } + + //TEMPLATES + if( dataCollector.MasterNodeCategory == AvailableShaderTypes.Template ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + + string uvName = string.Empty; + string result = string.Empty; + string indexStr = m_textureCoordChannel > 0 ? ( m_textureCoordChannel + 1 ).ToString() : ""; + string sizeDif = string.Empty; + if( m_texcoordSize == 3 ) + sizeDif = "3"; + else if( m_texcoordSize == 4 ) + sizeDif = "4"; + + if( dataCollector.TemplateDataCollectorInstance.GetCustomInterpolatedData( TemplateHelperFunctions.IntToUVChannelInfo[ m_textureCoordChannel ], m_outputPorts[ 0 ].DataType, PrecisionType.Float, ref result, false, dataCollector.PortCategory ) ) + { + uvName = result; + } + else if( dataCollector.TemplateDataCollectorInstance.HasUV( m_textureCoordChannel ) ) + { + uvName = dataCollector.TemplateDataCollectorInstance.GetUVName( m_textureCoordChannel, m_outputPorts[ 0 ].DataType ); + } + else + { + uvName = dataCollector.TemplateDataCollectorInstance.RegisterUV( m_textureCoordChannel, m_outputPorts[ 0 ].DataType ); + } + string currPropertyName = GetValidPropertyName(); + if( !string.IsNullOrEmpty( portProperty ) && portProperty != "0.0" ) + { + currPropertyName = portProperty; + } + if( !string.IsNullOrEmpty( currPropertyName ) ) + { + string finalTexCoordName = "uv" + indexStr + ( m_texcoordSize > 2 ? "s" + sizeDif : "" ) + currPropertyName; + string dummyPropertyTexcoords = currPropertyName + "_ST"; + + if( m_texCoordsHelper == null ) + { + m_texCoordsHelper = CreateInstance(); + m_texCoordsHelper.ContainerGraph = ContainerGraph; + m_texCoordsHelper.SetBaseUniqueId( UniqueId, true ); + m_texCoordsHelper.RegisterPropertyOnInstancing = false; + m_texCoordsHelper.AddGlobalToSRPBatcher = true; + } + + if( UIUtils.CurrentWindow.OutsideGraph.IsInstancedShader ) + { + m_texCoordsHelper.CurrentParameterType = PropertyType.InstancedProperty; + } + else + { + m_texCoordsHelper.CurrentParameterType = PropertyType.Global; + } + m_texCoordsHelper.ResetOutputLocals(); + m_texCoordsHelper.SetRawPropertyName( dummyPropertyTexcoords ); + dummyPropertyTexcoords = m_texCoordsHelper.GenerateShaderForOutput( 0, ref dataCollector, false ); + + if( m_texcoordSize > 2 ) + { + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, m_outputPorts[ 0 ].DataType, finalTexCoordName, uvName ); + dataCollector.AddLocalVariable( UniqueId, finalTexCoordName + ".xy", string.Format( Constants.TilingOffsetFormat, uvName + ".xy", dummyPropertyTexcoords + ".xy", dummyPropertyTexcoords + ".zw" ) + ";" ); + m_outputPorts[ 0 ].SetLocalValue( finalTexCoordName, dataCollector.PortCategory ); + } + else + { + RegisterLocalVariable( 0, string.Format( Constants.TilingOffsetFormat, uvName, dummyPropertyTexcoords + ".xy", dummyPropertyTexcoords + ".zw" ), ref dataCollector, finalTexCoordName ); + } + //RegisterLocalVariable( 0, string.Format( Constants.TilingOffsetFormat, uvName, dummyPropertyTexcoords+".xy", dummyPropertyTexcoords+".zw" ), ref dataCollector, finalTexCoordName ); + } + else + { + string finalTexCoordName = "texCoord" + OutputId; + tiling = m_tilingPort.GeneratePortInstructions( ref dataCollector ); + offset = m_offsetPort.GeneratePortInstructions( ref dataCollector ); + + if( m_texcoordSize > 2 ) + { + dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, m_outputPorts[ 0 ].DataType, finalTexCoordName, uvName ); + dataCollector.AddLocalVariable( UniqueId, finalTexCoordName + ".xy", string.Format( Constants.TilingOffsetFormat, uvName + ".xy", tiling, offset ) + ";" ); + m_outputPorts[ 0 ].SetLocalValue( finalTexCoordName, dataCollector.PortCategory ); + } + else + { + RegisterLocalVariable( 0, string.Format( Constants.TilingOffsetFormat, uvName, tiling, offset ), ref dataCollector, finalTexCoordName ); + } + //RegisterLocalVariable( 0, string.Format( Constants.TilingOffsetFormat, uvName, tiling, offset ), ref dataCollector, finalTexCoordName ); + } + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + } + + //SURFACE + string propertyName = GetValidPropertyName(); + if( !string.IsNullOrEmpty( portProperty ) && portProperty != "0.0" ) + { + propertyName = portProperty; + } + + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + + if( !m_tilingPort.IsConnected && m_tilingPort.Vector2InternalData == Vector2.one ) + tiling = null; + else + tiling = m_tilingPort.GeneratePortInstructions( ref dataCollector ); + + if( !m_offsetPort.IsConnected && m_offsetPort.Vector2InternalData == Vector2.zero ) + offset = null; + else + offset = m_offsetPort.GeneratePortInstructions( ref dataCollector ); + + if( !string.IsNullOrEmpty( propertyName ) /*m_referenceArrayId > -1*/ ) + { + m_surfaceTexcoordName = GeneratorUtils.GenerateAutoUVs( ref dataCollector, UniqueId, m_textureCoordChannel, propertyName, m_outputPorts[ 0 ].DataType, tiling, offset, OutputId ); + } + else + { + m_surfaceTexcoordName = GeneratorUtils.GenerateAutoUVs( ref dataCollector, UniqueId, m_textureCoordChannel, null, m_outputPorts[ 0 ].DataType, tiling, offset, OutputId ); + } + + m_outputPorts[ 0 ].SetLocalValue( m_surfaceTexcoordName, dataCollector.PortCategory ); + return GetOutputVectorItem( 0, outputId, m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ) ); + } + + public override void ReadInputDataFromString( ref string[] nodeParams ) + { + if( UIUtils.CurrentShaderVersion() > 7003 ) + { + base.ReadInputDataFromString( ref nodeParams ); + } + else + { + for( int i = 0; i < 2 && i < nodeParams.Length && m_currentReadParamIdx < nodeParams.Length; i++ ) + { + if( UIUtils.CurrentShaderVersion() < 5003 ) + { + int newId = VersionConvertInputPortId( i ) + 1; + if( UIUtils.CurrentShaderVersion() > 23 ) + { + m_inputPorts[ newId ].DataType = (WirePortDataType)Enum.Parse( typeof( WirePortDataType ), nodeParams[ m_currentReadParamIdx++ ] ); + } + + m_inputPorts[ newId ].InternalData = nodeParams[ m_currentReadParamIdx++ ]; + if( m_inputPorts[ newId ].IsEditable && UIUtils.CurrentShaderVersion() >= 3100 && m_currentReadParamIdx < nodeParams.Length ) + { + m_inputPorts[ newId ].Name = nodeParams[ m_currentReadParamIdx++ ]; + } + } + else + { + int portId = Convert.ToInt32( nodeParams[ m_currentReadParamIdx++ ] ); + WirePortDataType DataType = (WirePortDataType)Enum.Parse( typeof( WirePortDataType ), nodeParams[ m_currentReadParamIdx++ ] ); + string InternalData = nodeParams[ m_currentReadParamIdx++ ]; + bool isEditable = Convert.ToBoolean( nodeParams[ m_currentReadParamIdx++ ] ); + string Name = string.Empty; + if( isEditable && m_currentReadParamIdx < nodeParams.Length ) + { + Name = nodeParams[ m_currentReadParamIdx++ ]; + } + + InputPort inputPort = GetInputPortByUniqueId( portId ); + if( inputPort != null ) + { + inputPort.DataType = DataType; + inputPort.InternalData = InternalData; + if( !string.IsNullOrEmpty( Name ) ) + { + inputPort.Name = Name; + } + } + } + } + } + } + + public override void Destroy() + { + base.Destroy(); + m_referenceNode = null; + + if( m_texCoordsHelper != null ) + { + //Not calling m_texCoordsHelper.Destroy() on purpose so UIUtils does not incorrectly unregister stuff + DestroyImmediate( m_texCoordsHelper ); + m_texCoordsHelper = null; + } + } + + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TextureCoordinatesNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TextureCoordinatesNode.cs.meta new file mode 100644 index 0000000..be9e118 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TextureCoordinatesNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 872b1da17041cd64482c826cbfd9c8c6 +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TexturePropertyNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TexturePropertyNode.cs new file mode 100644 index 0000000..929f52c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TexturePropertyNode.cs @@ -0,0 +1,1138 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + public enum TexturePropertyValues + { + white, + black, + gray, + bump + } + + public enum TextureType + { + Texture1D, + Texture2D, + Texture3D, + Cube, + Texture2DArray, + ProceduralTexture + } + + public enum AutoCastType + { + Auto = 0, + LockedToTexture1D, + LockedToTexture2D, + LockedToTexture3D, + LockedToCube, + LockedToTexture2DArray + } + + + [Serializable] + [NodeAttributes( "Texture Object", "Textures", "Represents a Texture Asset. Can be used in samplers Tex inputs or shader function inputs to reuse the same texture multiple times.", SortOrderPriority = 1 )] + public class TexturePropertyNode : PropertyNode + { + private const string ObjectSelectorCmdStr = "ObjectSelectorClosed"; + + protected readonly string[] AvailablePropertyTypeLabels = { PropertyType.Property.ToString(), PropertyType.Global.ToString() }; + protected readonly int[] AvailablePropertyTypeValues = { (int)PropertyType.Property, (int)PropertyType.Global }; + + protected const int OriginalFontSizeUpper = 9; + protected const int OriginalFontSizeLower = 9; + + protected const string DefaultTextureStr = "Default Texture"; + protected const string AutoCastModeStr = "Auto-Cast Mode"; + + protected const string AutoUnpackNormalsStr = "Normal"; + + [SerializeField] + protected Texture m_defaultValue; + + [SerializeField] + protected Texture m_materialValue; + + [SerializeField] + protected TexturePropertyValues m_defaultTextureValue; + + [SerializeField] + protected bool m_isNormalMap; + + [SerializeField] + protected System.Type m_textureType = typeof( Texture2D ); + + [SerializeField] + protected int m_useSamplerArrayIdx = -1; + + //[SerializeField] + //protected bool m_isTextureFetched; + + //[SerializeField] + //protected string m_textureFetchedValue; + + [SerializeField] + protected TextureType m_currentType = TextureType.Texture2D; + + [SerializeField] + protected AutoCastType m_autocastMode = AutoCastType.Auto; + + protected int PreviewSizeX = 128; + protected int PreviewSizeY = 128; + + protected bool m_linearTexture; + + protected TexturePropertyNode m_textureProperty = null; + + protected bool m_drawPicker; + + protected bool m_drawAutocast = true; + + protected int m_cachedSamplerId = -1; + protected int m_cachedSamplerIdArray = -1; + protected int m_cachedSamplerIdCube = -1; + protected int m_cachedSamplerId3D = -1; + protected int m_defaultId = -1; + protected int m_typeId = -1; + + private TextureType m_previousType = TextureType.Texture2D; + private string m_labelText = "None (Texture2D)"; + + protected bool m_isEditingPicker; + + protected bool m_forceSamplingMacrosGen = false; + + public TexturePropertyNode() : base() { } + public TexturePropertyNode( int uniqueId, float x, float y, float width, float height ) : base( uniqueId, x, y, width, height ) { } + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + GlobalTypeWarningText = string.Format( GlobalTypeWarningText, "Texture" ); + m_defaultTextureValue = TexturePropertyValues.white; + m_insideSize.Set( PreviewSizeX, PreviewSizeY + 5 ); + AddOutputPort( WirePortDataType.SAMPLER2D, "Tex" ); + AddOutputPort( WirePortDataType.SAMPLERSTATE, "SS" ); + m_outputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.SAMPLER1D, WirePortDataType.SAMPLER2D, WirePortDataType.SAMPLER3D, WirePortDataType.SAMPLERCUBE, WirePortDataType.SAMPLER2DARRAY, WirePortDataType.OBJECT ); + m_currentParameterType = PropertyType.Property; + m_customPrefix = "Texture "; + m_drawPrecisionUI = false; + m_showVariableMode = true; + m_freeType = false; + m_drawPicker = true; + m_hasLeftDropdown = true; + m_textLabelWidth = 115; + m_longNameSize = 225; + m_availableAttribs.Add( new PropertyAttributes( "No Scale Offset", "[NoScaleOffset]" ) ); + m_availableAttribs.Add( new PropertyAttributes( "Normal", "[Normal]" ) ); + m_availableAttribs.Add( new PropertyAttributes( "Single Line Texture", "[SingleLineTexture]" ) ); + m_showPreview = true; + m_drawPreviewExpander = false; + m_drawPreview = false; + m_drawPreviewMaskButtons = false; + m_previewShaderGUID = "e53988745ec6e034694ee2640cd3d372"; + } + + public override void AfterCommonInit() + { + base.AfterCommonInit(); + m_hasLeftDropdown = true; + } + + protected void SetPreviewTexture( Texture newValue ) + { + if( newValue is Cubemap ) + { + PreviewMaterial.SetInt( m_typeId, 3 ); + + if( m_cachedSamplerIdCube == -1 ) + m_cachedSamplerIdCube = Shader.PropertyToID( "_Cube" ); + + PreviewMaterial.SetTexture( m_cachedSamplerIdCube, newValue as Cubemap ); + } + else if( newValue is Texture2DArray ) + { + PreviewMaterial.SetInt( m_typeId, 4 ); + + if( m_cachedSamplerIdArray == -1 ) + m_cachedSamplerIdArray = Shader.PropertyToID( "_Array" ); + + PreviewMaterial.SetTexture( m_cachedSamplerIdArray, newValue as Texture2DArray ); + } + else if( newValue is Texture3D ) + { + PreviewMaterial.SetInt( m_typeId, 2 ); + + if( m_cachedSamplerId3D == -1 ) + m_cachedSamplerId3D = Shader.PropertyToID( "_Sampler3D" ); + + PreviewMaterial.SetTexture( m_cachedSamplerId3D, newValue as Texture3D ); + } + else + { + PreviewMaterial.SetInt( m_typeId, 1 ); + + if( m_cachedSamplerId == -1 ) + m_cachedSamplerId = Shader.PropertyToID( "_Sampler" ); + + PreviewMaterial.SetTexture( m_cachedSamplerId, newValue ); + } + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + + if( Value == null ) + { + if( m_defaultId == -1 ) + m_defaultId = Shader.PropertyToID( "_Default" ); + + PreviewMaterial.SetInt( m_defaultId, ( (int)m_defaultTextureValue ) + 1 ); + m_previewMaterialPassId = 0; + } + else + { + if( m_defaultId == -1 ) + m_defaultId = Shader.PropertyToID( "_Default" ); + + PreviewMaterial.SetInt( m_defaultId, 0 ); + + if( m_typeId == -1 ) + m_typeId = Shader.PropertyToID( "_Type" ); + + m_previewMaterialPassId = 1; + SetPreviewTexture( Value ); + //if( Value is Cubemap ) + //{ + // PreviewMaterial.SetInt( m_typeId, 3 ); + + // if( m_cachedSamplerIdCube == -1 ) + // m_cachedSamplerIdCube = Shader.PropertyToID( "_Cube" ); + + // PreviewMaterial.SetTexture( m_cachedSamplerIdCube, Value as Cubemap ); + //} + //else if( Value is Texture2DArray ) + //{ + // PreviewMaterial.SetInt( m_typeId, 4 ); + + // if( m_cachedSamplerIdArray == -1 ) + // m_cachedSamplerIdArray = Shader.PropertyToID( "_Array" ); + + // PreviewMaterial.SetTexture( m_cachedSamplerIdArray, Value as Texture2DArray ); + //} + //else if( Value is Texture3D ) + //{ + // PreviewMaterial.SetInt( m_typeId, 2 ); + + // if( m_cachedSamplerId3D == -1 ) + // m_cachedSamplerId3D = Shader.PropertyToID( "_Sampler3D" ); + + // PreviewMaterial.SetTexture( m_cachedSamplerId3D, Value as Texture3D ); + //} + //else + //{ + // PreviewMaterial.SetInt( m_typeId, 1 ); + + // if( m_cachedSamplerId == -1 ) + // m_cachedSamplerId = Shader.PropertyToID( "_Sampler" ); + + // PreviewMaterial.SetTexture( m_cachedSamplerId, Value ); + //} + } + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + m_textureProperty = this; + UIUtils.RegisterPropertyNode( this ); + UIUtils.RegisterTexturePropertyNode( this ); + } + + protected void ConfigTextureData( TextureType type ) + { + switch( m_autocastMode ) + { + case AutoCastType.Auto: + { + m_currentType = type; + } + break; + case AutoCastType.LockedToTexture1D: + { + m_currentType = TextureType.Texture1D; + } + break; + case AutoCastType.LockedToTexture2DArray: + { + m_currentType = TextureType.Texture2DArray; + } + break; + case AutoCastType.LockedToTexture2D: + { + m_currentType = TextureType.Texture2D; + } + break; + case AutoCastType.LockedToTexture3D: + { + m_currentType = TextureType.Texture3D; + } + break; + case AutoCastType.LockedToCube: + { + m_currentType = TextureType.Cube; + } + break; + } + + ConfigTextureType(); + } + + protected void ConfigTextureType() + { + switch( m_currentType ) + { + case TextureType.Texture1D: + { + m_textureType = typeof( Texture ); + } + break; + case TextureType.Texture2DArray: + { + m_textureType = typeof( Texture2DArray ); + } + break; + case TextureType.Texture2D: + { + m_textureType = typeof( Texture2D ); + } + break; + case TextureType.Texture3D: + { + m_textureType = typeof( Texture3D ); + } + break; + case TextureType.Cube: + { + m_textureType = typeof( Cubemap ); + } + break; +#if !UNITY_2018_1_OR_NEWER + // Disabling Substance Deprecated warning +#pragma warning disable 0618 + case TextureType.ProceduralTexture: + { + m_textureType = typeof( ProceduralTexture ); + } + break; +#pragma warning restore 0618 +#endif + + } + } + + protected void DrawTexturePropertyType() + { + PropertyType parameterType = (PropertyType)EditorGUILayoutIntPopup( ParameterTypeStr, (int)m_currentParameterType, AvailablePropertyTypeLabels, AvailablePropertyTypeValues ); + if( parameterType != m_currentParameterType ) + { + ChangeParameterType( parameterType ); + } + } + + // Texture1D + public string GetTexture1DPropertyValue() + { + return PropertyName + "(\"" + m_propertyInspectorName + "\", 2D) = \"" + m_defaultTextureValue + "\" {}"; + } + + public string GetTexture1DUniformValue() + { + return "uniform sampler1D " + PropertyName + ";"; + } + + // Texture2D + public string GetTexture2DPropertyValue() + { + return PropertyName + "(\"" + m_propertyInspectorName + "\", 2D) = \"" + m_defaultTextureValue + "\" {}"; + } + + public string GetTexture2DUniformValue() + { + if( PropertyName == "_CameraDepthTexture" ) + return Constants.CameraDepthTextureValue; + else + return GeneratorUtils.GetPropertyDeclaraction( PropertyName, TextureType.Texture2D, ";" ); + } + + //Texture3D + public string GetTexture3DPropertyValue() + { + return PropertyName + "(\"" + m_propertyInspectorName + "\", 3D) = \"" + m_defaultTextureValue + "\" {}"; + } + + public string GetTexture3DUniformValue() + { + return GeneratorUtils.GetPropertyDeclaraction( PropertyName, TextureType.Texture3D, ";" ); + } + + // Cube + public string GetCubePropertyValue() + { + return PropertyName + "(\"" + m_propertyInspectorName + "\", CUBE) = \"" + m_defaultTextureValue + "\" {}"; + } + + public string GetCubeUniformValue() + { + return GeneratorUtils.GetPropertyDeclaraction( PropertyName, TextureType.Cube, ";" ); + } + + // Texture2DArray + public string GetTexture2DArrayPropertyValue() + { + return PropertyName + "(\"" + m_propertyInspectorName + "\", 2DArray) = \"" + m_defaultTextureValue + "\" {}"; + } + + public string GetTexture2DArrayUniformValue() + { + return GeneratorUtils.GetPropertyDeclaraction( PropertyName, TextureType.Texture2DArray, ";" ); + } + + public override void DrawMainPropertyBlock() + { + DrawTexturePropertyType(); + base.DrawMainPropertyBlock(); + } + + public override void DrawSubProperties() + { + ShowDefaults(); + + + EditorGUI.BeginChangeCheck(); + Type currType = ( m_autocastMode == AutoCastType.Auto ) ? typeof( Texture ) : m_textureType; + m_defaultValue = EditorGUILayoutObjectField( Constants.DefaultValueLabel, m_defaultValue, currType, false ) as Texture; + if( EditorGUI.EndChangeCheck() ) + { + CheckTextureImporter( true ); + SetAdditonalTitleText( string.Format( Constants.PropertyValueLabel, GetPropertyValStr() ) ); + } + } + + public override void DrawMaterialProperties() + { + ShowDefaults(); + + EditorGUI.BeginChangeCheck(); + Type currType = ( m_autocastMode == AutoCastType.Auto ) ? typeof( Texture ) : m_textureType; + m_materialValue = EditorGUILayoutObjectField( Constants.MaterialValueLabel, m_materialValue, currType, false ) as Texture; + if( EditorGUI.EndChangeCheck() ) + { + CheckTextureImporter( true ); + SetAdditonalTitleText( string.Format( Constants.PropertyValueLabel, GetPropertyValStr() ) ); + } + } + + new void ShowDefaults() + { + m_defaultTextureValue = (TexturePropertyValues)EditorGUILayoutEnumPopup( DefaultTextureStr, m_defaultTextureValue ); + + if( !m_drawAutocast ) + return; + + AutoCastType newAutoCast = (AutoCastType)EditorGUILayoutEnumPopup( AutoCastModeStr, m_autocastMode ); + if( newAutoCast != m_autocastMode ) + { + m_autocastMode = newAutoCast; + if( m_autocastMode != AutoCastType.Auto ) + { + ConfigTextureData( m_currentType ); + ConfigureInputPorts(); + ConfigureOutputPorts(); + } + } + } + + private void ConfigurePortsFromReference() + { + m_sizeIsDirty = true; + } + + public virtual void ConfigureOutputPorts() + { + switch( m_currentType ) + { + case TextureType.Texture1D: + m_outputPorts[ 0 ].ChangeType( WirePortDataType.SAMPLER1D, false ); + break; + case TextureType.ProceduralTexture: + case TextureType.Texture2D: + m_outputPorts[ 0 ].ChangeType( WirePortDataType.SAMPLER2D, false ); + break; + case TextureType.Texture3D: + m_outputPorts[ 0 ].ChangeType( WirePortDataType.SAMPLER3D, false ); + break; + case TextureType.Cube: + m_outputPorts[ 0 ].ChangeType( WirePortDataType.SAMPLERCUBE, false ); + break; + case TextureType.Texture2DArray: + m_outputPorts[ 0 ].ChangeType( WirePortDataType.SAMPLER2DARRAY, false ); + break; + } + + m_sizeIsDirty = true; + } + + public virtual void ConfigureInputPorts() + { + } + + public virtual void AdditionalCheck() + { + } + + public virtual void CheckTextureImporter( bool additionalCheck, bool writeDefault = true ) + { + m_requireMaterialUpdate = true; + Texture texture = m_materialMode ? m_materialValue : m_defaultValue; + TextureImporter importer = AssetImporter.GetAtPath( AssetDatabase.GetAssetPath( texture ) ) as TextureImporter; + if( importer != null ) + { + +#if UNITY_5_5_OR_NEWER + m_isNormalMap = importer.textureType == TextureImporterType.NormalMap; +#else + m_isNormalMap = importer.normalmap; +#endif + if( writeDefault && !UIUtils.IsLoading ) + { + if( m_defaultTextureValue == TexturePropertyValues.bump && !m_isNormalMap ) + m_defaultTextureValue = TexturePropertyValues.white; + else if( m_isNormalMap ) + m_defaultTextureValue = TexturePropertyValues.bump; + } + + if( additionalCheck ) + AdditionalCheck(); + m_linearTexture = !importer.sRGBTexture; + } + + if( ( texture as Texture2DArray ) != null ) + { + ConfigTextureData( TextureType.Texture2DArray ); + } + else if( ( texture as Texture2D ) != null ) + { + ConfigTextureData( TextureType.Texture2D ); + } + else if( ( texture as Texture3D ) != null ) + { + ConfigTextureData( TextureType.Texture3D ); + } + else if( ( texture as Cubemap ) != null ) + { + ConfigTextureData( TextureType.Cube ); + } +#if !UNITY_2018_1_OR_NEWER + // Disabling Substance Deprecated warning +#pragma warning disable 0618 + else if( ( texture as ProceduralTexture ) != null ) + { + ConfigTextureData( TextureType.ProceduralTexture ); + } +#pragma warning restore 0618 +#endif + + ConfigureInputPorts(); + ConfigureOutputPorts(); + } + + public override void OnObjectDropped( UnityEngine.Object obj ) + { + base.OnObjectDropped( obj ); + ConfigFromObject( obj ); + } + + public override void SetupFromCastObject( UnityEngine.Object obj ) + { + base.SetupFromCastObject( obj ); + ConfigFromObject( obj ); + } + + protected void ConfigFromObject( UnityEngine.Object obj, bool writeDefault = true, bool additionalCheck = true ) + { + Texture texture = obj as Texture; + if( texture ) + { + m_materialValue = texture; + m_defaultValue = texture; + CheckTextureImporter( additionalCheck, writeDefault ); + } + } + + + + public override void DrawGUIControls( DrawInfo drawInfo ) + { + base.DrawGUIControls( drawInfo ); + + if( !( drawInfo.CurrentEventType == EventType.MouseDown || drawInfo.CurrentEventType == EventType.MouseUp || drawInfo.CurrentEventType == EventType.ExecuteCommand || drawInfo.CurrentEventType == EventType.DragPerform ) ) + return; + + bool insideBox = m_previewRect.Contains( drawInfo.MousePosition ); + + bool closePicker = false; + if( insideBox ) + { + m_isEditingPicker = true; + } + else if( m_isEditingPicker && !insideBox && drawInfo.CurrentEventType != EventType.ExecuteCommand ) + { + closePicker = true; + } + + if( m_isEditingPicker && drawInfo.CurrentEventType == EventType.ExecuteCommand && + Event.current.commandName.Equals( ObjectSelectorCmdStr ) ) + { + closePicker = true; + } + + if( closePicker ) + { + GUI.FocusControl( null ); + m_isEditingPicker = false; + } + + } + + public override void OnNodeLayout( DrawInfo drawInfo ) + { + base.OnNodeLayout( drawInfo ); + ConfigTextureType(); + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + if( m_dropdownEditing ) + { + PropertyType parameterType = (PropertyType)EditorGUIIntPopup( m_dropdownRect, (int)m_currentParameterType, AvailablePropertyTypeLabels, AvailablePropertyTypeValues, UIUtils.PropertyPopUp ); + if( parameterType != m_currentParameterType ) + { + ChangeParameterType( parameterType ); + DropdownEditing = false; + } + } + + if( m_isEditingPicker && m_drawPicker && m_currentParameterType != PropertyType.Global ) + { + Rect hitRect = m_previewRect; + hitRect.height = 14 * drawInfo.InvertedZoom; + hitRect.y = m_previewRect.yMax - hitRect.height; + hitRect.width = 4 * 14 * drawInfo.InvertedZoom; + + bool restoreMouse = false; + if( Event.current.type == EventType.MouseDown && hitRect.Contains( drawInfo.MousePosition ) ) + { + restoreMouse = true; + Event.current.type = EventType.Ignore; + } + + EditorGUI.BeginChangeCheck(); + m_colorBuffer = GUI.color; + GUI.color = Color.clear; + Type currType = ( m_autocastMode == AutoCastType.Auto ) ? typeof( Texture ) : m_textureType; + if( m_materialMode ) + { + m_materialValue = EditorGUIObjectField( m_previewRect, m_materialValue, currType, false ) as Texture; + } + else + { + m_defaultValue = EditorGUIObjectField( m_previewRect, m_defaultValue, currType, false ) as Texture; + } + GUI.color = m_colorBuffer; + + if( EditorGUI.EndChangeCheck() ) + { + CheckTextureImporter( true ); + SetTitleText( m_propertyInspectorName ); + SetAdditonalTitleText( string.Format( Constants.PropertyValueLabel, GetPropertyValStr() ) ); + ConfigureInputPorts(); + ConfigureOutputPorts(); + BeginDelayedDirtyProperty(); + PreviewIsDirty = true; + } + //else if( drawInfo.CurrentEventType == EventType.ExecuteCommand ) + //{ + // GUI.FocusControl( null ); + // m_isEditingPicker = false; + //} + + if( restoreMouse ) + { + Event.current.type = EventType.MouseDown; + } + + if( ( drawInfo.CurrentEventType == EventType.MouseDown || drawInfo.CurrentEventType == EventType.MouseUp ) ) + DrawPreviewMaskButtonsLayout( drawInfo, m_previewRect ); + } + + if( !m_drawPicker ) + return; + + if( drawInfo.CurrentEventType == EventType.Repaint ) + { + DrawTexturePicker( drawInfo ); + } + } + + + + protected void DrawTexturePicker( DrawInfo drawInfo ) + { + Rect newRect = m_previewRect; + Texture currentValue = m_materialMode ? m_materialValue : m_defaultValue; + + //??? + //m_showPreview = true; + bool showButtons = m_currentParameterType != PropertyType.Global; + + if( currentValue == null ) + GUI.Label( newRect, string.Empty, UIUtils.ObjectFieldThumb ); + else + DrawPreview( drawInfo, m_previewRect ); + + if( ContainerGraph.LodLevel <= ParentGraph.NodeLOD.LOD2 ) + { + Rect butRect = m_previewRect; + butRect.y -= 1; + butRect.x += 1; + + Rect smallButton = newRect; + smallButton.height = 14 * drawInfo.InvertedZoom; + smallButton.y = newRect.yMax - smallButton.height - 2; + smallButton.width = 40 * drawInfo.InvertedZoom; + smallButton.x = newRect.xMax - smallButton.width - 2; + if( currentValue == null ) + { + if( m_previousType != m_currentType ) + { + m_previousType = m_currentType; + m_labelText = "None (" + m_currentType.ToString() + ")"; + } + + GUI.Label( newRect, m_labelText, UIUtils.ObjectFieldThumbOverlay ); + } + else if( showButtons ) + { + DrawPreviewMaskButtonsRepaint( drawInfo, butRect ); + } + + if( showButtons ) + GUI.Label( smallButton, "Select", UIUtils.GetCustomStyle( CustomStyle.SamplerButton ) ); + } + + GUI.Label( newRect, string.Empty, UIUtils.GetCustomStyle( CustomStyle.SamplerFrame ) ); + } + + public override void CheckIfAutoRegister( ref MasterNodeDataCollector dataCollector ) + { + // Also testing inside shader function because node can be used indirectly over a custom expression and directly over a Function Output node + // That isn't being used externaly making it to not be registered ( since m_connStatus it set to Connected by being connected to an output node + if( CurrentParameterType != PropertyType.Constant && m_autoRegister && ( m_connStatus != NodeConnectionStatus.Connected || InsideShaderFunction ) ) + { + RegisterProperty( ref dataCollector ); + if( m_autoRegister && m_containerGraph.ParentWindow.OutsideGraph.SamplingMacros ) + { + GeneratorUtils.GenerateSamplerState( ref dataCollector, UniqueId, PropertyName ); + } + } + } + + public string GenerateSamplerState( ref MasterNodeDataCollector dataCollector ) + { + return GeneratorUtils.GenerateSamplerState( ref dataCollector, UniqueId, PropertyName ); + } + + public virtual string GenerateSamplerPropertyName( int outputId, ref MasterNodeDataCollector dataCollector ) + { + string generatedSamplerState = string.Empty; + + if( outputId > 0 || m_forceSamplingMacrosGen ) + { + generatedSamplerState = GeneratorUtils.GenerateSamplerState( ref dataCollector, UniqueId, PropertyName ); + } + + if( outputId > 0 ) + return generatedSamplerState; + else + return PropertyName; + } + + public string BaseGenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalVar ); + return GenerateSamplerPropertyName( outputId , ref dataCollector ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + return BaseGenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalVar ); + } + + public override void UpdateMaterial( Material mat ) + { + base.UpdateMaterial( mat ); + if( UIUtils.IsProperty( m_currentParameterType ) && !InsideShaderFunction ) + { + OnPropertyNameChanged(); + if( mat.HasProperty( PropertyName ) ) + { + mat.SetTexture( PropertyName, m_materialValue ); + } + } + } + + public override void SetMaterialMode( Material mat, bool fetchMaterialValues ) + { + base.SetMaterialMode( mat, fetchMaterialValues ); + if( fetchMaterialValues && m_materialMode && UIUtils.IsProperty( m_currentParameterType ) ) + { + if( mat.HasProperty( PropertyName ) ) + { + m_materialValue = mat.GetTexture( PropertyName ); + CheckTextureImporter( false, false ); + } + } + } + + public override void ForceUpdateFromMaterial( Material material ) + { + if( UIUtils.IsProperty( m_currentParameterType ) && material.HasProperty( PropertyName ) ) + { + m_materialValue = material.GetTexture( PropertyName ); + CheckTextureImporter( false, false ); + PreviewIsDirty = true; + } + } + + public override bool UpdateShaderDefaults( ref Shader shader, ref TextureDefaultsDataColector defaultCol/* ref string metaStr */) + { + if( m_defaultValue != null ) + { + defaultCol.AddValue( PropertyName, m_defaultValue ); + } + + return true; + } + + public void ReadFromStringArray( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + ReadAdditionalData( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > 17101 ) + { + m_useSamplerArrayIdx = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + } + + public virtual void ReadAdditionalData( ref string[] nodeParams ) + { + string defaultTextureGUID = GetCurrentParam( ref nodeParams ); + //m_defaultValue = AssetDatabase.LoadAssetAtPath( textureName ); + if( UIUtils.CurrentShaderVersion() > 14101 ) + { + m_defaultValue = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( defaultTextureGUID ) ); + string materialTextureGUID = GetCurrentParam( ref nodeParams ); + m_materialValue = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( materialTextureGUID ) ); + } + else + { + m_defaultValue = AssetDatabase.LoadAssetAtPath( defaultTextureGUID ); + } + + m_isNormalMap = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + m_defaultTextureValue = (TexturePropertyValues)Enum.Parse( typeof( TexturePropertyValues ), GetCurrentParam( ref nodeParams ) ); + m_autocastMode = (AutoCastType)Enum.Parse( typeof( AutoCastType ), GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > 15306 ) + { + m_currentType = (TextureType)Enum.Parse( typeof( TextureType ), GetCurrentParam( ref nodeParams ) ); + } + else + { + m_currentType = TextureType.Texture2D; + } + + ConfigTextureData( m_currentType ); + + //ConfigFromObject( m_defaultValue ); + if( m_materialValue == null ) + { + ConfigFromObject( m_defaultValue ); + } + else + { + CheckTextureImporter( true, true ); + } + ConfigureInputPorts(); + ConfigureOutputPorts(); + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + ConfigureInputPorts(); + ConfigureOutputPorts(); + } + + public override void ReadAdditionalClipboardData( ref string[] nodeParams ) + { + base.ReadAdditionalClipboardData( ref nodeParams ); + string textureName = GetCurrentParam( ref nodeParams ); + m_materialValue = AssetDatabase.LoadAssetAtPath( textureName ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + WriteAdditionalToString( ref nodeInfo, ref connectionsInfo ); + if( m_useSamplerArrayIdx > 0 ) + { + TexturePropertyNode samplerNode = UIUtils.GetTexturePropertyNode( m_useSamplerArrayIdx - 1 ); + IOUtils.AddFieldValueToString( ref nodeInfo, ( samplerNode != null ? samplerNode.UniqueId : -1 ) ); + } + else + { + IOUtils.AddFieldValueToString( ref nodeInfo, -1 ); + } + } + + public virtual void WriteAdditionalToString( ref string nodeInfo, ref string connectionsInfo ) + { + //IOUtils.AddFieldValueToString( ref nodeInfo, ( m_defaultValue != null ) ? AssetDatabase.GetAssetPath( m_defaultValue ) : Constants.NoStringValue ); + IOUtils.AddFieldValueToString( ref nodeInfo, ( m_defaultValue != null ) ? AssetDatabase.AssetPathToGUID( AssetDatabase.GetAssetPath( m_defaultValue ) ) : Constants.NoStringValue ); + IOUtils.AddFieldValueToString( ref nodeInfo, ( m_materialValue != null ) ? AssetDatabase.AssetPathToGUID( AssetDatabase.GetAssetPath( m_materialValue ) ) : Constants.NoStringValue ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_isNormalMap.ToString() ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_defaultTextureValue ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_autocastMode ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_currentType ); + } + + public override void WriteAdditionalClipboardData( ref string nodeInfo ) + { + base.WriteAdditionalClipboardData( ref nodeInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, ( m_materialValue != null ) ? AssetDatabase.GetAssetPath( m_materialValue ) : Constants.NoStringValue ); + } + + public override void Destroy() + { + base.Destroy(); + m_defaultValue = null; + m_materialValue = null; + m_textureProperty = null; + UIUtils.UnregisterPropertyNode( this ); + UIUtils.UnregisterTexturePropertyNode( this ); + } + + public override string GetPropertyValStr() + { + return m_materialMode ? ( m_materialValue != null ? m_materialValue.name : IOUtils.NO_TEXTURES ) : ( m_defaultValue != null ? m_defaultValue.name : IOUtils.NO_TEXTURES ); + } + + public override string GetPropertyValue() + { + switch( m_currentType ) + { + case TextureType.Texture1D: + { + return PropertyAttributes + GetTexture1DPropertyValue(); + } + case TextureType.ProceduralTexture: + case TextureType.Texture2D: + { + return PropertyAttributes + GetTexture2DPropertyValue(); + } + case TextureType.Texture3D: + { + return PropertyAttributes + GetTexture3DPropertyValue(); + } + case TextureType.Cube: + { + return PropertyAttributes + GetCubePropertyValue(); + } + case TextureType.Texture2DArray: + { + return PropertyAttributes + GetTexture2DArrayPropertyValue(); + } + } + return string.Empty; + } + + public override string GetUniformValue() + { + switch( m_currentType ) + { + case TextureType.Texture1D: + { + return GetTexture1DUniformValue(); + } + case TextureType.ProceduralTexture: + case TextureType.Texture2D: + { + return GetTexture2DUniformValue(); + } + case TextureType.Texture3D: + { + return GetTexture3DUniformValue(); + } + case TextureType.Cube: + { + return GetCubeUniformValue(); + } + case TextureType.Texture2DArray: + { + return GetTexture2DArrayUniformValue(); + } + } + + return string.Empty; + } + + public override bool GetUniformData( out string dataType, out string dataName, ref bool fullValue ) + { + m_excludeUniform = false; + ParentGraph outsideGraph = UIUtils.CurrentWindow.OutsideGraph; +#if UNITY_2018_1_OR_NEWER + if( outsideGraph.SamplingMacros || m_currentType == TextureType.Texture2DArray ) +#else + if( ( outsideGraph.SamplingMacros && !outsideGraph.IsStandardSurface ) || m_currentType == TextureType.Texture2DArray ) +#endif + { + if( outsideGraph.IsSRP ) + { + if( Constants.TexDeclarationSRPMacros.ContainsKey( m_currentType ) ) + { + dataName = GeneratorUtils.GetPropertyDeclaraction( PropertyName, m_currentType, ";" ); + dataType = string.Empty; + fullValue = true; + return true; + } + } + else if( Constants.TexDeclarationStandardMacros.ContainsKey( m_currentType ) ) + { +#if !UNITY_2018_1_OR_NEWER + if( m_currentType == TextureType.Texture2DArray && outsideGraph.IsStandardSurface ) + dataName = string.Format( Constants.TexDeclarationStandardMacros[ m_currentType ], PropertyName ); + else +#endif + dataName = GeneratorUtils.GetPropertyDeclaraction( PropertyName, m_currentType, ";" ); + dataType = string.Empty; + fullValue = true; + return true; + } + } + + //TODO: this is a hack and needs to be properly fixed + if( PropertyName == "_CameraDepthTexture" ) + { + m_excludeUniform = true; + dataType = "UNITY_DECLARE_DEPTH_TEXTURE("; + dataName = m_propertyName + " )"; + return true; + } + + dataType = UIUtils.TextureTypeToCgType( m_currentType ); + dataName = m_propertyName; + return true; + } + + public virtual string CurrentPropertyReference + { + get + { + string propertyName = string.Empty; + propertyName = PropertyName; + return propertyName; + } + } + + public Texture Value + { + get { return m_materialMode ? m_materialValue : m_defaultValue; } + set + { + if( m_materialMode ) + m_materialValue = value; + else + m_defaultValue = value; + } + } + + public Texture MaterialValue + { + get { return m_materialValue; } + set { m_materialValue = value; } + } + + public Texture DefaultValue + { + get { return m_defaultValue; } + set { m_defaultValue = value; } + } + + public void SetInspectorName( string newName ) + { + m_propertyInspectorName = newName; + } + + public void SetPropertyName( string newName ) + { + m_propertyName = newName; + } + + public bool IsValid { get { return m_materialMode ? ( m_materialValue != null ) : ( m_defaultValue != null ); } } + + public virtual bool IsNormalMap { get { return m_isNormalMap; } } + public bool IsLinearTexture { get { return m_linearTexture; } } + + public override void OnPropertyNameChanged() + { + base.OnPropertyNameChanged(); + UIUtils.UpdateTexturePropertyDataNode( UniqueId, PropertyName ); + } + + public override void SetGlobalValue() { Shader.SetGlobalTexture( m_propertyName, m_defaultValue ); } + public override void FetchGlobalValue() { m_materialValue = Shader.GetGlobalTexture( m_propertyName ); } + public override string DataToArray { get { return PropertyName; } } + public TextureType CurrentType { get { return m_currentType; } } + + public bool DrawAutocast + { + get { return m_drawAutocast; } + set { m_drawAutocast = value; } + } + + public TexturePropertyValues DefaultTextureValue + { + get { return m_defaultTextureValue; } + set { m_defaultTextureValue = value; } + } + + public AutoCastType AutocastMode + { + get { return m_autocastMode; } + } + public bool ForceSamplingMacrosGen { set { m_forceSamplingMacrosGen = value; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TexturePropertyNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TexturePropertyNode.cs.meta new file mode 100644 index 0000000..721cc6d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TexturePropertyNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c1210b3dd22dafe418c5a998df2c3443 +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TextureTransformNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TextureTransformNode.cs new file mode 100644 index 0000000..d46fb35 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TextureTransformNode.cs @@ -0,0 +1,361 @@ +using UnityEngine; +using UnityEditor; +using System; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Texture Transform", "Textures", "Gives access to texture tiling and offset as set on the material inspector" )] + public sealed class TextureTransformNode : ParentNode + { + private readonly string[] Dummy = { string.Empty }; + private const string InstancedLabelStr = "Instanced"; + + [SerializeField] + private bool m_instanced = false; + + [SerializeField] + private int m_referenceSamplerId = -1; + + [SerializeField] + private int m_referenceNodeId = -1; + + [SerializeField] + private TexturePropertyNode m_inputReferenceNode = null; + + private TexturePropertyNode m_referenceNode = null; + + private Vector4Node m_texCoordsHelper; + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + + private int m_cachedSamplerId = -1; + private int m_cachedSamplerIdArray = -1; + private int m_cachedSamplerIdCube = -1; + private int m_cachedSamplerId3D = -1; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.SAMPLER2D, false, "Tex" ); + m_inputPorts[ 0 ].CreatePortRestrictions( WirePortDataType.SAMPLER1D, WirePortDataType.SAMPLER2D, WirePortDataType.SAMPLER3D, WirePortDataType.SAMPLERCUBE, WirePortDataType.SAMPLER2DARRAY, WirePortDataType.OBJECT ); + AddOutputPort( WirePortDataType.FLOAT2, "Tiling" ); + AddOutputPort( WirePortDataType.FLOAT2, "Offset" ); + m_textLabelWidth = 80; + m_autoWrapProperties = true; + m_hasLeftDropdown = true; + m_previewShaderGUID = "25ba2903568b00343ae06788994cab54"; + } + + public override void AfterCommonInit() + { + base.AfterCommonInit(); + + if( PaddingTitleLeft == 0 ) + { + PaddingTitleLeft = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + if( PaddingTitleRight == 0 ) + PaddingTitleRight = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + } + } + + public override void RenderNodePreview() + { + //Runs at least one time + if( !m_initialized ) + { + // nodes with no preview don't update at all + PreviewIsDirty = false; + return; + } + + if( !PreviewIsDirty ) + return; + + SetPreviewInputs(); + + RenderTexture temp = RenderTexture.active; + + RenderTexture.active = m_outputPorts[ 0 ].OutputPreviewTexture; + PreviewMaterial.SetInt( "_PreviewID", 0 ); + Graphics.Blit( null, m_outputPorts[ 0 ].OutputPreviewTexture, PreviewMaterial, m_previewMaterialPassId ); + + RenderTexture.active = m_outputPorts[ 1 ].OutputPreviewTexture; + PreviewMaterial.SetInt( "_PreviewID", 1 ); + Graphics.Blit( null, m_outputPorts[ 1 ].OutputPreviewTexture, PreviewMaterial, m_previewMaterialPassId ); + RenderTexture.active = temp; + + PreviewIsDirty = m_continuousPreviewRefresh; + + FinishPreviewRender = true; + } + + void SetPreviewTexture( Texture newValue ) + { + if( newValue is Cubemap ) + { + m_previewMaterialPassId = 3; + if( m_cachedSamplerIdCube == -1 ) + m_cachedSamplerIdCube = Shader.PropertyToID( "_Cube" ); + + PreviewMaterial.SetTexture( m_cachedSamplerIdCube, newValue as Cubemap ); + } + else if( newValue is Texture2DArray ) + { + + m_previewMaterialPassId = 2; + if( m_cachedSamplerIdArray == -1 ) + m_cachedSamplerIdArray = Shader.PropertyToID( "_Array" ); + + PreviewMaterial.SetTexture( m_cachedSamplerIdArray, newValue as Texture2DArray ); + } + else if( newValue is Texture3D ) + { + m_previewMaterialPassId = 1; + if( m_cachedSamplerId3D == -1 ) + m_cachedSamplerId3D = Shader.PropertyToID( "_Sampler3D" ); + + PreviewMaterial.SetTexture( m_cachedSamplerId3D, newValue as Texture3D ); + } + else + { + m_previewMaterialPassId = 0; + if( m_cachedSamplerId == -1 ) + m_cachedSamplerId = Shader.PropertyToID( "_Sampler" ); + + PreviewMaterial.SetTexture( m_cachedSamplerId, newValue ); + } + } + + public override void SetPreviewInputs() + { + base.SetPreviewInputs(); + if( m_inputPorts[ 0 ].IsConnected ) + { + SetPreviewTexture( m_inputPorts[ 0 ].InputPreviewTexture( ContainerGraph ) ); + } + else if( m_referenceNode != null ) + { + if( m_referenceNode.Value != null ) + { + SetPreviewTexture( m_referenceNode.Value ); + } + else + { + SetPreviewTexture( m_referenceNode.PreviewTexture ); + } + } + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + m_inputPorts[ 0 ].MatchPortToConnection(); + m_inputReferenceNode = m_inputPorts[ 0 ].GetOutputNodeWhichIsNotRelay() as TexturePropertyNode; + UpdateTitle(); + + } + + public override void OnInputPortDisconnected( int portId ) + { + base.OnInputPortDisconnected( portId ); + m_inputReferenceNode = null; + UpdateTitle(); + } + + public override void OnConnectedOutputNodeChanges( int outputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( outputPortId, otherNodeId, otherPortId, name, type ); + m_inputPorts[ 0 ].MatchPortToConnection(); + UpdateTitle(); + } + + void UpdateTitle() + { + if( m_inputReferenceNode != null ) + { + m_additionalContent.text = string.Format( Constants.PropertyValueLabel, m_inputReferenceNode.PropertyInspectorName ); + } + else if( m_referenceSamplerId > -1 && m_referenceNode != null ) + { + m_additionalContent.text = string.Format( Constants.PropertyValueLabel, m_referenceNode.PropertyInspectorName ); + } + else + { + m_additionalContent.text = string.Empty; + } + m_sizeIsDirty = true; + } + + public override void DrawProperties() + { + base.DrawProperties(); + bool guiEnabledBuffer = GUI.enabled; + EditorGUI.BeginChangeCheck(); + List arr = new List( UIUtils.TexturePropertyNodeArr() ); + + if( arr != null && arr.Count > 0 ) + { + arr.Insert( 0, "None" ); + GUI.enabled = true && ( !m_inputPorts[ 0 ].IsConnected ); + m_referenceSamplerId = EditorGUILayoutPopup( Constants.AvailableReferenceStr, m_referenceSamplerId + 1, arr.ToArray() ) - 1; + } + else + { + m_referenceSamplerId = -1; + GUI.enabled = false; + EditorGUILayoutPopup( Constants.AvailableReferenceStr, m_referenceSamplerId, Dummy ); + } + + GUI.enabled = guiEnabledBuffer; + if( EditorGUI.EndChangeCheck() ) + { + m_referenceNode = UIUtils.GetTexturePropertyNode( m_referenceSamplerId ); + if( m_referenceNode != null ) + { + m_referenceNodeId = m_referenceNode.UniqueId; + } + else + { + m_referenceNodeId = -1; + m_referenceSamplerId = -1; + } + UpdateTitle(); + } + + m_instanced = EditorGUILayoutToggle( InstancedLabelStr, m_instanced ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( !m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + string texTransform = string.Empty; + + if( m_inputPorts[ 0 ].IsConnected ) + { + texTransform = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ) + "_ST"; + } + else if( m_referenceNode != null ) + { + m_referenceNode.BaseGenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalvar ); + texTransform = m_referenceNode.PropertyName + "_ST"; + } + else + { + texTransform = "_ST"; + UIUtils.ShowMessage( UniqueId, "Please specify a texture sample on the Texture Transform Size node", MessageSeverity.Warning ); + } + + //bool excludeUniformKeyword = UIUtils.CurrentWindow.OutsideGraph.IsInstancedShader || UIUtils.CurrentWindow.OutsideGraph.IsSRP; + //string uniformRegister = UIUtils.GenerateUniformName( excludeUniformKeyword, WirePortDataType.FLOAT4, texTransform ); + //dataCollector.AddToUniforms( UniqueId, uniformRegister, true ); + if( m_texCoordsHelper == null ) + { + m_texCoordsHelper = CreateInstance(); + m_texCoordsHelper.ContainerGraph = ContainerGraph; + m_texCoordsHelper.SetBaseUniqueId( UniqueId, true ); + m_texCoordsHelper.RegisterPropertyOnInstancing = false; + m_texCoordsHelper.AddGlobalToSRPBatcher = true; + } + + if( m_instanced ) + { + m_texCoordsHelper.CurrentParameterType = PropertyType.InstancedProperty; + } + else + { + m_texCoordsHelper.CurrentParameterType = PropertyType.Global; + } + m_texCoordsHelper.ResetOutputLocals(); + m_texCoordsHelper.SetRawPropertyName( texTransform ); + texTransform = m_texCoordsHelper.GenerateShaderForOutput( 0, ref dataCollector, false ); + + m_outputPorts[ 0 ].SetLocalValue( texTransform + ".xy", dataCollector.PortCategory ); + m_outputPorts[ 1 ].SetLocalValue( texTransform + ".zw", dataCollector.PortCategory ); + } + + return m_outputPorts[ outputId ].LocalValue( dataCollector.PortCategory ); + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + EditorGUI.BeginChangeCheck(); + { + List arr = new List( UIUtils.TexturePropertyNodeArr() ); + bool guiEnabledBuffer = GUI.enabled; + + if( arr != null && arr.Count > 0 ) + { + arr.Insert( 0, "None" ); + GUI.enabled = true && ( !m_inputPorts[ 0 ].IsConnected ); + m_referenceSamplerId = m_upperLeftWidget.DrawWidget( this, m_referenceSamplerId + 1, arr.ToArray() ) - 1; + } + else + { + m_referenceSamplerId = -1; + GUI.enabled = false; + m_upperLeftWidget.DrawWidget( this, m_referenceSamplerId, Dummy ); + } + GUI.enabled = guiEnabledBuffer; + } + if( EditorGUI.EndChangeCheck() ) + { + m_referenceNode = UIUtils.GetTexturePropertyNode( m_referenceSamplerId ); + if( m_referenceNode != null ) + { + m_referenceNodeId = m_referenceNode.UniqueId; + } + else + { + m_referenceNodeId = -1; + m_referenceSamplerId = -1; + } + UpdateTitle(); + } + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + m_referenceNode = UIUtils.GetNode( m_referenceNodeId ) as TexturePropertyNode; + m_referenceSamplerId = UIUtils.GetTexturePropertyNodeRegisterId( m_referenceNodeId ); + UpdateTitle(); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_referenceNodeId = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > 17200 ) + { + m_instanced = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_referenceNodeId ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_instanced ); + } + + public override void Destroy() + { + base.Destroy(); + m_referenceNode = null; + m_inputReferenceNode = null; + m_upperLeftWidget = null; + if( m_texCoordsHelper != null ) + { + //Not calling m_texCoordsHelper.Destroy() on purpose so UIUtils does not incorrectly unregister stuff + DestroyImmediate( m_texCoordsHelper ); + m_texCoordsHelper = null; + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TextureTransformNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TextureTransformNode.cs.meta new file mode 100644 index 0000000..be1ce29 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/TextureTransformNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4f9ca941b3f5014448e530c761a418d9 +timeCreated: 1512045037 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/UnpackScaleNormalNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/UnpackScaleNormalNode.cs new file mode 100644 index 0000000..e374cc5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/UnpackScaleNormalNode.cs @@ -0,0 +1,68 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +namespace AmplifyShaderEditor +{ + [NodeAttributes( "Unpack Scale Normal", "Textures", "Applies UnpackNormal/UnpackScaleNormal function" )] + [Serializable] + public class UnpackScaleNormalNode : ParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT4, false, "Value" ); + AddInputPort( WirePortDataType.FLOAT, false, "Scale" ); + m_inputPorts[ 1 ].FloatInternalData = 1; + AddOutputVectorPorts( WirePortDataType.FLOAT3, "XYZ" ); + m_useInternalPortData = true; + m_previewShaderGUID = "8b0ae05e25d280c45af81ded56f8012e"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + string src = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + + + bool isScaledNormal = false; + if ( m_inputPorts[ 1 ].IsConnected ) + { + isScaledNormal = true; + } + else + { + if ( m_inputPorts[ 1 ].FloatInternalData != 1 ) + { + isScaledNormal = true; + } + } + + string normalMapUnpackMode = string.Empty; + string scaleValue = isScaledNormal?m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ):"1.0"; + normalMapUnpackMode = GeneratorUtils.GenerateUnpackNormalStr( ref dataCollector, CurrentPrecisionType, UniqueId, OutputId, src, isScaledNormal, scaleValue ); + if( isScaledNormal && !( dataCollector.IsTemplate && dataCollector.IsSRP ) ) + { + dataCollector.AddToIncludes( UniqueId, Constants.UnityStandardUtilsLibFuncs ); + } + + int outputUsage = 0; + for ( int i = 0; i < m_outputPorts.Count; i++ ) + { + if ( m_outputPorts[ i ].IsConnected ) + outputUsage += 1; + } + + + if ( outputUsage > 1 && !dataCollector.IsSRP ) + { + string varName = "localUnpackNormal" + OutputId; + dataCollector.AddLocalVariable( UniqueId, "float3 " + varName + " = " + normalMapUnpackMode + ";" ); + return GetOutputVectorItem( 0, outputId, varName ); + } + else + { + return GetOutputVectorItem( 0, outputId, normalMapUnpackMode ); + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/UnpackScaleNormalNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/UnpackScaleNormalNode.cs.meta new file mode 100644 index 0000000..270e519 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/UnpackScaleNormalNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ad04713692e9f124e86030d792c3e648 +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/VirtualTextureObject.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/VirtualTextureObject.cs new file mode 100644 index 0000000..339cdc2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/VirtualTextureObject.cs @@ -0,0 +1,296 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + public enum VirtualPreset + { + Unity_Legacy, + Unity5, + Alloy, + UBER, + Skyshop, + Lux + } + + public enum VirtualChannel + { + Albedo = 0, + Base, + Normal, + Height, + Occlusion, + Displacement, + Specular, + SpecMet, + Material, + } + + [Serializable] + [NodeAttributes( "Virtual Texture Object", "Textures", "Represents a Virtual Texture Asset", SortOrderPriority = 1 )] + public class VirtualTextureObject : TexturePropertyNode + { + protected const string VirtualPresetStr = "Layout Preset"; + protected const string VirtualChannelStr = "Virtual Layer"; + + private const string VirtualTextureObjectInfo = "Can only be used alongside a Texture Sample node by connecting to its Tex Input Port.\n" + + "\nProperty name must match the value set on your Virtual Texture.\n" + + "Default e.g Albedo = _MainTex\n" + + "\nName your node according to the respective channel property in your Virtual Texture. The Albedo must be set to _MainTex ( temporary requirement )."; + private readonly string[] ChannelTypeStr = { + "Albedo - D.RGBA", + "Base - D.RGBA", + "Normal - N.GA", + "Height - N.B", + "Occlusion - N.R", + "Displacement - N.B", + "Specular - S.RGBA", + "Specular|Metallic - S.RGBA", + "Material - S.RGBA",}; + + private readonly string[] Dummy = { string.Empty }; + private string[] m_channelTypeStr; + + [SerializeField] + protected VirtualPreset m_virtualPreset = VirtualPreset.Unity5; + + [SerializeField] + protected VirtualChannel m_virtualChannel = VirtualChannel.Albedo; + + [SerializeField] + private int m_selectedChannelInt = 0; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + ChangeChannels(); + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + if ( UniqueId != -1 ) + UIUtils.AddVirtualTextureCount(); + } + + public override void DrawSubProperties() + { + ShowDefaults(); + + base.DrawSubProperties(); + } + + public override void DrawMaterialProperties() + { + ShowDefaults(); + + base.DrawMaterialProperties(); + } + + new void ShowDefaults() + { + EditorGUI.BeginChangeCheck(); + m_virtualPreset = ( VirtualPreset ) EditorGUILayoutEnumPopup( VirtualPresetStr, m_virtualPreset ); + if ( EditorGUI.EndChangeCheck() ) + { + ChangeChannels(); + } + + EditorGUI.BeginChangeCheck(); + m_selectedChannelInt = EditorGUILayoutPopup( VirtualChannelStr, m_selectedChannelInt, m_channelTypeStr ); + if ( EditorGUI.EndChangeCheck() ) + { + m_virtualChannel = GetChannel( m_selectedChannelInt ); + } + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUILayout.HelpBox( VirtualTextureObjectInfo, MessageType.Info ); + } + + private VirtualChannel GetChannel( int popupInt ) + { + int remapInt = 0; + switch ( m_virtualPreset ) + { + case VirtualPreset.Unity_Legacy: + remapInt = popupInt == 0 ? 1 : popupInt == 1 ? 2 : popupInt == 2 ? 4 : popupInt == 3 ? 5 : 0; + break; + default: + case VirtualPreset.Unity5: + case VirtualPreset.UBER: + remapInt = popupInt == 0 ? 0 : popupInt == 1 ? 7 : popupInt == 2 ? 2 : popupInt == 3 ? 3 : popupInt == 4 ? 4 : 0; + break; + case VirtualPreset.Alloy: + remapInt = popupInt == 0 ? 1 : popupInt == 1 ? 2 : popupInt == 2 ? 8 : popupInt == 3 ? 3 : 0; + break; + case VirtualPreset.Skyshop: + case VirtualPreset.Lux: + remapInt = popupInt == 0 ? 1 : popupInt == 1 ? 2 : popupInt == 2 ? 6 : 0; + break; + } + + return ( VirtualChannel ) remapInt; + } + + private void ChangeChannels() + { + m_channelTypeStr = Dummy; + switch ( m_virtualPreset ) + { + case VirtualPreset.Unity_Legacy: + m_channelTypeStr = new string[] { ChannelTypeStr[ 1 ], ChannelTypeStr[ 2 ], ChannelTypeStr[ 4 ], ChannelTypeStr[ 5 ] }; + break; + default: + case VirtualPreset.Unity5: + case VirtualPreset.UBER: + m_channelTypeStr = new string[] { ChannelTypeStr[ 0 ], ChannelTypeStr[ 7 ], ChannelTypeStr[ 2 ], ChannelTypeStr[ 3 ], ChannelTypeStr[ 4 ] }; + break; + case VirtualPreset.Alloy: + m_channelTypeStr = new string[] { ChannelTypeStr[ 1 ], ChannelTypeStr[ 2 ], ChannelTypeStr[ 8 ], ChannelTypeStr[ 3 ] }; + break; + case VirtualPreset.Skyshop: + case VirtualPreset.Lux: + m_channelTypeStr = new string[] { ChannelTypeStr[ 1 ], ChannelTypeStr[ 2 ], ChannelTypeStr[ 6 ] }; + break; + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalVar ); + dataCollector.AddToProperties( UniqueId, "[HideInInspector] _VTInfoBlock( \"VT( auto )\", Vector ) = ( 0, 0, 0, 0 )", -1 ); + + return PropertyName; + } + + public override string GetPropertyValue() + { + string propertyValue = string.Empty; + switch ( m_virtualChannel ) + { + default: + case VirtualChannel.Albedo: + case VirtualChannel.Base: + propertyValue = PropertyName + "(\"" + m_propertyInspectorName + "\", 2D) = \"" + m_defaultTextureValue + "\" {}"; + break; + case VirtualChannel.Normal: + propertyValue = PropertyName + "(\"" + m_propertyInspectorName + "\", 2D) = \"" + m_defaultTextureValue + "\" {}"; + break; + case VirtualChannel.SpecMet: + propertyValue = PropertyName + "(\"" + m_propertyInspectorName + "\", 2D) = \"" + m_defaultTextureValue + "\" {}"; + break; + } + return PropertyAttributes + propertyValue; + } + + public override string GetUniformValue() + { + return "uniform sampler2D " + PropertyName + ";"; + } + + public override bool GetUniformData( out string dataType, out string dataName, ref bool fullValue ) + { + dataType = "sampler2D"; + dataName = PropertyName; + return true; + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + string defaultTextureGUID = GetCurrentParam( ref nodeParams ); + //m_defaultValue = AssetDatabase.LoadAssetAtPath( textureName ); + if( UIUtils.CurrentShaderVersion() > 14101 ) + { + m_defaultValue = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( defaultTextureGUID ) ); + string materialTextureGUID = GetCurrentParam( ref nodeParams ); + m_materialValue = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( materialTextureGUID ) ); + } + else + { + m_defaultValue = AssetDatabase.LoadAssetAtPath( defaultTextureGUID ); + } + m_isNormalMap = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + m_defaultTextureValue = ( TexturePropertyValues ) Enum.Parse( typeof( TexturePropertyValues ), GetCurrentParam( ref nodeParams ) ); + m_autocastMode = ( AutoCastType ) Enum.Parse( typeof( AutoCastType ), GetCurrentParam( ref nodeParams ) ); + m_virtualPreset = ( VirtualPreset ) Enum.Parse( typeof( VirtualPreset ), GetCurrentParam( ref nodeParams ) ); + m_selectedChannelInt = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + ChangeChannels(); + m_virtualChannel = GetChannel( m_selectedChannelInt ); + + //m_forceNodeUpdate = true; + + //ConfigFromObject( m_defaultValue ); + if( m_materialValue == null ) + { + ConfigFromObject( m_defaultValue ); + } + else + { + CheckTextureImporter( true, true ); + } + ConfigureInputPorts(); + ConfigureOutputPorts(); + } + + public override void ReadAdditionalData( ref string[] nodeParams ) { } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + //IOUtils.AddFieldValueToString( ref nodeInfo, ( m_defaultValue != null ) ? AssetDatabase.GetAssetPath( m_defaultValue ) : Constants.NoStringValue ); + IOUtils.AddFieldValueToString( ref nodeInfo, ( m_defaultValue != null ) ? AssetDatabase.AssetPathToGUID( AssetDatabase.GetAssetPath( m_defaultValue ) ) : Constants.NoStringValue ); + IOUtils.AddFieldValueToString( ref nodeInfo, ( m_materialValue != null ) ? AssetDatabase.AssetPathToGUID( AssetDatabase.GetAssetPath( m_materialValue ) ) : Constants.NoStringValue ); + + IOUtils.AddFieldValueToString( ref nodeInfo, m_isNormalMap.ToString() ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_defaultTextureValue ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_autocastMode ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_virtualPreset ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_selectedChannelInt ); + } + + public override void WriteAdditionalToString( ref string nodeInfo, ref string connectionsInfo ) { } + + //public override string PropertyName + //{ + // get + // { + // string propertyName = string.Empty; + // switch ( m_virtualChannel ) + // { + // default: + // case VirtualChannel.Albedo: + // case VirtualChannel.Base: + // propertyName = "_MainTex"; + // break; + // case VirtualChannel.Normal: + // propertyName = "_BumpMap"; + // break; + // case VirtualChannel.SpecMet: + // propertyName = "_MetallicGlossMap"; + // break; + // case VirtualChannel.Occlusion: + // propertyName = "_OcclusionMap"; + // break; + // } + // return propertyName; + // } + //} + + public override void Destroy() + { + base.Destroy(); + UIUtils.RemoveVirtualTextureCount(); + } + + public override bool IsNormalMap { get { return m_isNormalMap || m_virtualChannel == VirtualChannel.Normal; } } + public VirtualChannel Channel { get { return m_virtualChannel; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/VirtualTextureObject.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/VirtualTextureObject.cs.meta new file mode 100644 index 0000000..f271911 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Textures/VirtualTextureObject.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: bacb12043c5bc504aa49e0a5a9bbc534 +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/UndoParentNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/UndoParentNode.cs new file mode 100644 index 0000000..b8377c1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/UndoParentNode.cs @@ -0,0 +1,722 @@ +using UnityEditor; +using UnityEngine; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class UndoParentNode : ScriptableObject + { + private const string MessageFormat = "Changing value {0} on node {1}"; + + [SerializeField] + protected NodeAttributes m_nodeAttribs; + + [SerializeField] + protected ParentGraph m_containerGraph; + + public void UndoRecordObject( string name ) + { + UIUtils.MarkUndoAction(); + Undo.RegisterCompleteObjectUndo( UIUtils.CurrentWindow, name ); + Undo.RecordObject( this, name ); + } + + public virtual void RecordObject( string Id ) + { + Undo.RecordObject( this, Id ); + } + public virtual void RecordObjectOnDestroy( string Id ) + { + Undo.RecordObject( this, Id ); + } + + public string EditorGUILayoutStringField( string name, string value, params GUILayoutOption[] options ) + { + string newValue = EditorGUILayout.TextField( name, value, options ); + if( !newValue.Equals( value ) ) + { + UndoRecordObject( string.Format( MessageFormat, "EditorGUILayoutStringField", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public string EditorGUILayoutTextField( GUIContent label, string text, params GUILayoutOption[] options ) + { + string newValue = EditorGUILayout.TextField( label, text, options ); + if( !text.Equals( newValue ) ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public string EditorGUILayoutTextField( string text, params GUILayoutOption[] options ) + { + string newValue = EditorGUILayout.TextField( text, options ); + if( !text.Equals( newValue ) ) + { + UndoRecordObject( string.Format( MessageFormat, "EditorGUILayoutTextField", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public string EditorGUILayoutTextField( string label, string text, params GUILayoutOption[] options ) + { + string newValue = EditorGUILayout.TextField( label, text, options ); + if( !text.Equals( newValue ) ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public Enum EditorGUILayoutEnumPopup( GUIContent label, Enum selected, params GUILayoutOption[] options ) + { + Enum newValue = EditorGUILayout.EnumPopup( label, selected, options ); + if( !newValue.ToString().Equals( selected.ToString() ) ) + { + UndoRecordObject( string.Concat( "Changing value ", label, " on node ", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + //UndoRecordObject(string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public Enum EditorGUILayoutEnumPopup( string label, Enum selected, params GUILayoutOption[] options ) + { + Enum newValue = EditorGUILayout.EnumPopup( label, selected, options ); + if( !newValue.ToString().Equals( selected.ToString() ) ) + { + UndoRecordObject( string.Concat( "Changing value ", label, " on node ", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + //UndoRecordObject(string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public Enum EditorGUILayoutEnumPopup( Enum selected, params GUILayoutOption[] options ) + { + Enum newValue = EditorGUILayout.EnumPopup( selected, options ); + if( !newValue.ToString().Equals( selected.ToString() ) ) + { + UndoRecordObject( string.Concat( "Changing value EditorGUILayoutEnumPopup on node ", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + //UndoRecordObject(string.Format( MessageFormat, "EditorGUILayoutEnumPopup", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public int EditorGUILayoutIntPopup( string label, int selectedValue, string[] displayedOptions, int[] optionValues, params GUILayoutOption[] options ) + { + int newValue = EditorGUILayout.IntPopup( label, selectedValue, displayedOptions, optionValues, options ); + if( newValue != selectedValue ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + + public int EditorGUILayoutPopup( string label, int selectedIndex, string[] displayedOptions, GUIStyle style, params GUILayoutOption[] options ) + { + int newValue = EditorGUILayout.Popup( label, selectedIndex, displayedOptions, style, options ); + if( newValue != selectedIndex ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + + public int EditorGUILayoutPopup( GUIContent label, int selectedIndex, GUIContent[] displayedOptions, params GUILayoutOption[] options ) + { + int newValue = EditorGUILayout.Popup( label, selectedIndex, displayedOptions, options ); + if( newValue != selectedIndex ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public int EditorGUILayoutPopup( GUIContent label, int selectedIndex, GUIContent[] displayedOptions, GUIStyle style, params GUILayoutOption[] options ) + { + int newValue = EditorGUILayout.Popup( label, selectedIndex, displayedOptions, style, options ); + if( newValue != selectedIndex ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public int EditorGUILayoutPopup( int selectedIndex, string[] displayedOptions, params GUILayoutOption[] options ) + { + int newValue = EditorGUILayout.Popup( selectedIndex, displayedOptions, options ); + if( newValue != selectedIndex ) + { + UndoRecordObject( string.Format( MessageFormat, "EditorGUILayoutPopup", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public int EditorGUILayoutPopup( string label, int selectedIndex, string[] displayedOptions, params GUILayoutOption[] options ) + { + int newValue = EditorGUILayout.Popup( label, selectedIndex, displayedOptions, options ); + if( newValue != selectedIndex ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public bool EditorGUILayoutToggle( GUIContent label, bool value, params GUILayoutOption[] options ) + { + bool newValue = EditorGUILayout.Toggle( label, value, options ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public bool EditorGUILayoutToggle( string label, bool value, params GUILayoutOption[] options ) + { + bool newValue = EditorGUILayout.Toggle( label, value, options ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public bool EditorGUILayoutToggle( string label, bool value, GUIStyle style, params GUILayoutOption[] options ) + { + bool newValue = EditorGUILayout.Toggle( label, value, style, options ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public int EditorGUILayoutIntField( int value, params GUILayoutOption[] options ) + { + int newValue = EditorGUILayout.IntField( value, options ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, "EditorGUILayoutIntField", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public int EditorGUILayoutIntField( GUIContent label, int value, params GUILayoutOption[] options ) + { + int newValue = EditorGUILayout.IntField( label, value, options ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public int EditorGUILayoutIntField( string label, int value, params GUILayoutOption[] options ) + { + int newValue = EditorGUILayout.IntField( label, value, options ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public float EditorGUILayoutFloatField( GUIContent label, float value, params GUILayoutOption[] options ) + { + float newValue = EditorGUILayout.FloatField( label, value, options ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public float EditorGUILayoutFloatField( string label, float value, params GUILayoutOption[] options ) + { + float newValue = EditorGUILayout.FloatField( label, value, options ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public float EditorGUILayoutRangedFloatField( string label, float value, float min, float max, params GUILayoutOption[] options ) + { + float newValue = Mathf.Clamp( EditorGUILayout.FloatField( label, value, options ), min, max ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public Color EditorGUILayoutColorField( string label, Color value, params GUILayoutOption[] options ) + { + Color newValue = EditorGUILayout.ColorField( label, value, options ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } +#if UNITY_2018_1_OR_NEWER + public Color EditorGUILayoutColorField( GUIContent label, Color value, bool showEyedropper, bool showAlpha, bool hdr, params GUILayoutOption[] options ) + { + Color newValue = EditorGUILayout.ColorField( label, value, showEyedropper, showAlpha, hdr, options ); + if( newValue != value ) + { + UndoRecordObject(string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } +#else + public Color EditorGUILayoutColorField( GUIContent label, Color value, bool showEyedropper, bool showAlpha, bool hdr, ColorPickerHDRConfig hdrConfig, params GUILayoutOption[] options ) + { + Color newValue = EditorGUILayout.ColorField( label, value, showEyedropper, showAlpha, hdr, hdrConfig, options ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } +#endif + public float EditorGUILayoutSlider( string label, float value, float leftValue, float rightValue, params GUILayoutOption[] options ) + { + float newValue = EditorGUILayout.Slider( label, value, leftValue, rightValue, options ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public float EditorGUILayoutSlider( GUIContent label, float value, float leftValue, float rightValue, params GUILayoutOption[] options ) + { + float newValue = EditorGUILayout.Slider( label, value, leftValue, rightValue, options ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + public UnityEngine.Object EditorGUILayoutObjectField( string label, UnityEngine.Object obj, System.Type objType, bool allowSceneObjects, params GUILayoutOption[] options ) + { + UnityEngine.Object newValue = EditorGUILayout.ObjectField( label, obj, objType, allowSceneObjects, options ); + if( newValue != obj ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public Vector2 EditorGUIVector2Field( Rect position, string label, Vector2 value ) + { + Vector2 newValue = EditorGUI.Vector2Field( position, label, value ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + + public Vector2 EditorGUILayoutVector2Field( string label, Vector2 value, params GUILayoutOption[] options ) + { + Vector2 newValue = EditorGUILayout.Vector2Field( label, value, options ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public Vector3 EditorGUIVector3Field( Rect position, string label, Vector3 value ) + { + Vector3 newValue = EditorGUI.Vector3Field( position, label, value ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public Vector3 EditorGUILayoutVector3Field( string label, Vector3 value, params GUILayoutOption[] options ) + { + Vector3 newValue = EditorGUILayout.Vector3Field( label, value, options ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public Vector4 EditorGUIVector4Field( Rect position, string label, Vector4 value ) + { + Vector4 newValue = EditorGUI.Vector4Field( position, label, value ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public Vector4 EditorGUILayoutVector4Field( string label, Vector4 value, params GUILayoutOption[] options ) + { + Vector4 newValue = EditorGUILayout.Vector4Field( label, value, options ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public int EditorGUILayoutIntSlider( GUIContent label, int value, int leftValue, int rightValue, params GUILayoutOption[] options ) + { + int newValue = EditorGUILayout.IntSlider( label, value, leftValue, rightValue, options ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public int EditorGUILayoutIntSlider( string label, int value, int leftValue, int rightValue, params GUILayoutOption[] options ) + { + int newValue = EditorGUILayout.IntSlider( label, value, leftValue, rightValue, options ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public bool EditorGUILayoutToggleLeft( string label, bool value, params GUILayoutOption[] options ) + { + bool newValue = EditorGUILayout.ToggleLeft( label, value, options ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public bool EditorGUILayoutToggleLeft( GUIContent label, bool value, params GUILayoutOption[] options ) + { + bool newValue = EditorGUILayout.ToggleLeft( label, value, options ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public string EditorGUILayoutTextArea( string text, GUIStyle style, params GUILayoutOption[] options ) + { + string newValue = EditorGUILayout.TextArea( text, style, options ); + if( !newValue.Equals( text ) ) + { + UndoRecordObject( string.Format( MessageFormat, "EditorGUILayoutTextArea", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public bool EditorGUILayoutFoldout( bool foldout, string content ) + { + bool newValue = EditorGUILayout.Foldout( foldout, content ); + if( newValue != foldout ) + { + UndoRecordObject( string.Format( MessageFormat, "EditorGUILayoutFoldout", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public bool EditorGUIFoldout( Rect position, bool foldout, string content ) + { + bool newValue = EditorGUI.Foldout( position, foldout, content ); + if( newValue != foldout ) + { + UndoRecordObject( string.Format( MessageFormat, "EditorGUIFoldout", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public string EditorGUITextField( Rect position, string label, string text ) + { + string newValue = EditorGUI.TextField( position, label, text ); + if( !newValue.Equals( text ) ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public string EditorGUITextArea( Rect position, string text ) + { + string newValue = EditorGUI.TextArea( position, text ); + if( !newValue.Equals( text ) ) + { + UndoRecordObject( string.Format( MessageFormat, "TextArea", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public string EditorGUITextArea( Rect position, string text, [UnityEngine.Internal.DefaultValue( "EditorStyles.textField" )] GUIStyle style ) + { + string newValue = EditorGUI.TextArea( position, text,style ); + if( !newValue.Equals( text ) ) + { + UndoRecordObject( string.Format( MessageFormat, "TextArea", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public string EditorGUITextField( Rect position, string label, string text, [UnityEngine.Internal.DefaultValue( "EditorStyles.textField" )] GUIStyle style ) + { + string newValue = EditorGUI.TextField( position, label, text, style ); + if( !newValue.Equals( text ) ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } +#if UNITY_2018_1_OR_NEWER + public Color EditorGUIColorField( Rect position, GUIContent label, Color value, bool showEyedropper, bool showAlpha, bool hdr ) + { + Color newValue = EditorGUI.ColorField( position, label, value, showEyedropper, showAlpha, hdr ); + if( newValue != value ) + { + UndoRecordObject(string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } +#else + public Color EditorGUIColorField( Rect position, GUIContent label, Color value, bool showEyedropper, bool showAlpha, bool hdr, ColorPickerHDRConfig hdrConfig ) + { + Color newValue = EditorGUI.ColorField( position, label, value, showEyedropper, showAlpha, hdr, hdrConfig ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } +#endif + public Color EditorGUIColorField( Rect position, string label, Color value ) + { + Color newValue = EditorGUI.ColorField( position, label, value ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + + public int EditorGUIIntField( Rect position, string label, int value ) + { + int newValue = EditorGUI.IntField( position, label, value ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public int EditorGUIIntField( Rect position, string label, int value, [UnityEngine.Internal.DefaultValue( "EditorStyles.numberField" )] GUIStyle style ) + { + int newValue = EditorGUI.IntField( position, label, value, style ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public float EditorGUIFloatField( Rect position, string label, float value ) + { + float newValue = EditorGUI.FloatField( position, label, value ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public float EditorGUIFloatField( Rect position, string label, float value, [UnityEngine.Internal.DefaultValue( "EditorStyles.numberField" )] GUIStyle style ) + { + float newValue = EditorGUI.FloatField( position, label, value, style ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, label, ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public float EditorGUIFloatField( Rect position, float value, [UnityEngine.Internal.DefaultValue( "EditorStyles.numberField" )] GUIStyle style ) + { + float newValue = EditorGUI.FloatField( position, value, style ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, "EditorGUIFloatField", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public float GUIHorizontalSlider( Rect position, float value, float leftValue, float rightValue, GUIStyle slider, GUIStyle thumb ) + { + float newValue = GUI.HorizontalSlider( position, value, leftValue, rightValue, slider, thumb ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, "GUIHorizontalSlider", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public Enum EditorGUIEnumPopup( Rect position, Enum selected ) + { + Enum newValue = EditorGUI.EnumPopup( position, selected ); + if( !newValue.ToString().Equals( selected.ToString() ) ) + { + UndoRecordObject( string.Concat( "Changing value EditorGUIEnumPopup on node ", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + //UndoRecordObject(string.Format( MessageFormat, "EditorGUIEnumPopup", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public Enum EditorGUIEnumPopup( Rect position, Enum selected, [UnityEngine.Internal.DefaultValue( "EditorStyles.popup" )] GUIStyle style ) + { + Enum newValue = EditorGUI.EnumPopup( position, selected, style ); + if( !newValue.ToString().Equals( selected.ToString() ) ) + { + UndoRecordObject( string.Concat( "Changing value EditorGUIEnumPopup on node ", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + //UndoRecordObject(string.Format( MessageFormat, "EditorGUIEnumPopup", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public int EditorGUIIntPopup( Rect position, int selectedValue, GUIContent[] displayedOptions, int[] optionValues, [UnityEngine.Internal.DefaultValue( "EditorStyles.popup" )] GUIStyle style ) + { + int newValue = EditorGUI.IntPopup( position, selectedValue, displayedOptions, optionValues, style ); + if( newValue != selectedValue ) + { + UndoRecordObject( string.Format( MessageFormat, "EditorGUIIntEnumPopup", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public int EditorGUIPopup( Rect position, string label, int selectedIndex, string[] displayedOptions ) + { + int newValue = EditorGUI.Popup( position, label, selectedIndex, displayedOptions ); + if( newValue != selectedIndex ) + { + UndoRecordObject( string.Format( MessageFormat, "EditorGUIEnumPopup", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public int EditorGUIPopup( Rect position, int selectedIndex, GUIContent[] displayedOptions, [UnityEngine.Internal.DefaultValue( "EditorStyles.popup" )] GUIStyle style ) + { + int newValue = EditorGUI.Popup( position, selectedIndex, displayedOptions, style ); + if( newValue != selectedIndex ) + { + UndoRecordObject( string.Format( MessageFormat, "EditorGUIEnumPopup", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public int EditorGUIPopup( Rect position, int selectedIndex, string[] displayedOptions, [UnityEngine.Internal.DefaultValue( "EditorStyles.popup" )] GUIStyle style ) + { + int newValue = EditorGUI.Popup( position, selectedIndex, displayedOptions, style ); + if( newValue != selectedIndex ) + { + UndoRecordObject( string.Format( MessageFormat, "EditorGUIEnumPopup", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public UnityEngine.Object EditorGUIObjectField( Rect position, UnityEngine.Object obj, System.Type objType, bool allowSceneObjects ) + { + UnityEngine.Object newValue = EditorGUI.ObjectField( position, obj, objType, allowSceneObjects ); + if( newValue != obj ) + { + UndoRecordObject( string.Format( MessageFormat, "EditorGUIObjectField", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + public int EditorGUIIntPopup( Rect position, int selectedValue, string[] displayedOptions, int[] optionValues, [UnityEngine.Internal.DefaultValue( "EditorStyles.popup" )] GUIStyle style ) + { + int newValue = EditorGUI.IntPopup( position, selectedValue, displayedOptions, optionValues, style ); + if( newValue != selectedValue ) + { + UndoRecordObject( string.Format( MessageFormat, "EditorGUIIntPopup", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public bool EditorGUIToggle( Rect position, bool value ) + { + bool newValue = EditorGUI.Toggle( position, value ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, "EditorGUIToggle", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public bool EditorGUIToggle( Rect position, string text, bool value ) + { + bool newValue = EditorGUI.Toggle( position,text, value ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, "EditorGUIToggle", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public string GUITextField( Rect position, string text, GUIStyle style ) + { + string newValue = GUI.TextField( position, text, style ); + if( !newValue.Equals( text ) ) + { + UndoRecordObject( string.Format( MessageFormat, "GUITextfield", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + + public bool GUILayoutToggle( bool value, string text, GUIStyle style, params GUILayoutOption[] options ) + { + bool newValue = GUILayout.Toggle( value, text, style, options ); + if( newValue != value ) + { + UndoRecordObject( string.Format( MessageFormat, "GUILayoutToggle", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return newValue; + } + + public bool GUILayoutButton( string text, GUIStyle style, params GUILayoutOption[] options ) + { + bool value = GUILayout.Button( text, style, options ); + if( value ) + { + UndoRecordObject( string.Format( MessageFormat, "GUILayoutButton", ( ( m_nodeAttribs != null ) ? m_nodeAttribs.Name : GetType().ToString() ) ) ); + } + return value; + } + + /// + /// It's the graph the node exists in, this is set after node creation and it's not available on CommonInit + /// + public ParentGraph ContainerGraph + { + get { return m_containerGraph; } + set { m_containerGraph = value; } + } + } +} + diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/UndoParentNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/UndoParentNode.cs.meta new file mode 100644 index 0000000..f320dc1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/UndoParentNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: bcc69b2f388d45f43a9157ce814b5aae +timeCreated: 1490183752 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex.meta new file mode 100644 index 0000000..9c22229 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 579ecde4d9d1a0e45a655588b39f457a +folderAsset: yes +timeCreated: 1481126945 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/BillboardNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/BillboardNode.cs new file mode 100644 index 0000000..0cb8787 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/BillboardNode.cs @@ -0,0 +1,123 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; +using UnityEditor; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Billboard", "Miscellaneous", "Calculates new Vertex positions and normals to achieve a billboard effect." )] + public sealed class BillboardNode : ParentNode + { + private const string ErrorMessage = "Billboard node should only be connected to vertex ports."; + private const string WarningMessage = "This node is a bit different from all others as it injects the necessary code into the vertex body and writes directly on the vertex position and normal.\nIt outputs a value of 0 so it can be connected directly to a vertex port.\n[Only if that port is a relative vertex offset]."; + + [SerializeField] + private BillboardType m_billboardType = BillboardType.Cylindrical; + + [SerializeField] + private bool m_rotationIndependent = false; + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddOutputPort( WirePortDataType.FLOAT3, "Out" ); + m_textLabelWidth = 115; + m_hasLeftDropdown = true; + SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, m_billboardType ) ); + } + + public override void Destroy() + { + base.Destroy(); + m_upperLeftWidget = null; + } + + public override void AfterCommonInit() + { + base.AfterCommonInit(); + + if( PaddingTitleLeft == 0 ) + { + PaddingTitleLeft = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + if( PaddingTitleRight == 0 ) + PaddingTitleRight = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + } + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + m_upperLeftWidget.DrawWidget( ref m_billboardType, this, OnWidgetUpdate ); + } + + private readonly Action OnWidgetUpdate = ( x ) => + { + x.SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, ( x as BillboardNode ).Type ) ); + }; + + public override void DrawProperties() + { + base.DrawProperties(); + NodeUtils.DrawPropertyGroup( ref m_propertiesFoldout, Constants.ParameterLabelStr, () => + { + EditorGUI.BeginChangeCheck(); + m_billboardType = (BillboardType)EditorGUILayoutEnumPopup( BillboardOpHelper.BillboardTypeStr, m_billboardType ); + if( EditorGUI.EndChangeCheck() ) + { + SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, m_billboardType ) ); + } + m_rotationIndependent = EditorGUILayoutToggle( BillboardOpHelper.BillboardRotIndStr, m_rotationIndependent ); + } ); + EditorGUILayout.HelpBox( WarningMessage, MessageType.Warning ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.IsFragmentCategory ) + { + UIUtils.ShowMessage( UniqueId, ErrorMessage,MessageSeverity.Error ); + return m_outputPorts[0].ErrorValue; + } + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].ErrorValue; + + m_outputPorts[ 0 ].SetLocalValue( "0", dataCollector.PortCategory ); + string vertexPosValue = dataCollector.IsTemplate ? dataCollector.TemplateDataCollectorInstance.GetVertexPosition( WirePortDataType.OBJECT, CurrentPrecisionType ) : "v.vertex"; + string vertexNormalValue = dataCollector.IsTemplate ? dataCollector.TemplateDataCollectorInstance.GetVertexNormal( CurrentPrecisionType ) : "v.normal"; + bool vertexIsFloat3 = false; + if( dataCollector.IsTemplate ) + { + InterpDataHelper info = dataCollector.TemplateDataCollectorInstance.GetInfo( TemplateInfoOnSematics.POSITION ); + if( info != null ) + { + vertexIsFloat3 = info.VarType == WirePortDataType.FLOAT3; + } + } + + BillboardOpHelper.FillDataCollector( ref dataCollector, m_billboardType, m_rotationIndependent, vertexPosValue, vertexNormalValue, vertexIsFloat3 ); + + return "0"; + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_billboardType = (BillboardType)Enum.Parse( typeof( BillboardType ), GetCurrentParam( ref nodeParams ) ); + m_rotationIndependent = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_billboardType ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_rotationIndependent ); + SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, m_billboardType ) ); + } + + public BillboardType Type { get { return m_billboardType; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/BillboardNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/BillboardNode.cs.meta new file mode 100644 index 0000000..7b2c540 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/BillboardNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 08fd3dd8f623aca42b7eb9962a89753d +timeCreated: 1501161489 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/BitangentVertexDataNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/BitangentVertexDataNode.cs new file mode 100644 index 0000000..828a499 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/BitangentVertexDataNode.cs @@ -0,0 +1,37 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Vertex Bitangent", "Vertex Data", "Calculated bitangent vector in object space, can be used in both local vertex offset and fragment outputs. Already has tangent sign and object transform into account" )] + public sealed class BitangentVertexDataNode : ParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddOutputVectorPorts( WirePortDataType.FLOAT3, "XYZ" ); + m_drawPreviewAsSphere = true; + m_previewShaderGUID = "76873532ab67d2947beaf07151383cbe"; + } + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + base.PropagateNodeData( nodeData, ref dataCollector ); + dataCollector.DirtyNormal = true; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + if ( dataCollector.PortCategory == MasterNodePortCategory.Fragment || dataCollector.PortCategory == MasterNodePortCategory.Debug ) + { + dataCollector.ForceNormal = true; + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_NORMAL, CurrentPrecisionType ); + dataCollector.AddToInput( UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + } + + string vertexBitangent = GeneratorUtils.GenerateVertexBitangent( ref dataCollector, UniqueId, CurrentPrecisionType ); + return GetOutputVectorItem( 0, outputId, vertexBitangent ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/BitangentVertexDataNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/BitangentVertexDataNode.cs.meta new file mode 100644 index 0000000..1c5ff97 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/BitangentVertexDataNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 839ecbdfc8ed4fd4d8a08ec07f7159fa +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/ColorVertexDataNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/ColorVertexDataNode.cs new file mode 100644 index 0000000..0cea161 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/ColorVertexDataNode.cs @@ -0,0 +1,18 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "[VS] Vertex Color", "Vertex Data", "Vertex color. Only works on Vertex Shaders ports ( p.e. Local Vertex Offset Port ).", null,KeyCode.None,true,true,"Vertex Color",typeof(VertexColorNode))] + public sealed class ColorVertexDataNode : VertexDataNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_currentVertexData = "color"; + ConvertFromVectorToColorPorts(); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/ColorVertexDataNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/ColorVertexDataNode.cs.meta new file mode 100644 index 0000000..b8990fe --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/ColorVertexDataNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ca76669baa9fa204b8ce5200eb07c1db +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/NormalVertexDataNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/NormalVertexDataNode.cs new file mode 100644 index 0000000..b5fc4b5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/NormalVertexDataNode.cs @@ -0,0 +1,44 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Vertex Normal", "Vertex Data", "Vertex normal vector in object space, can be used in both local vertex offset and fragment outputs" )] + public sealed class NormalVertexDataNode : VertexDataNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_currentVertexData = "normal"; + ChangeOutputProperties( 0, "XYZ", WirePortDataType.FLOAT3 ); + m_outputPorts[ 4 ].Visible = false; + m_drawPreviewAsSphere = true; + m_previewShaderGUID = "6b24b06c33f9fe84c8a2393f13ab5406"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + string vertexNormal = string.Empty; + + if( dataCollector.MasterNodeCategory == AvailableShaderTypes.Template ) + { + vertexNormal = dataCollector.TemplateDataCollectorInstance.GetVertexNormal( CurrentPrecisionType ); + return GetOutputVectorItem( 0, outputId, vertexNormal ); + } + + if( dataCollector.PortCategory == MasterNodePortCategory.Fragment || dataCollector.PortCategory == MasterNodePortCategory.Debug ) + { + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_NORMAL, CurrentPrecisionType ); + if( dataCollector.DirtyNormal ) + { + dataCollector.AddToInput( UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + dataCollector.ForceNormal = true; + } + } + + vertexNormal = GeneratorUtils.GenerateVertexNormal( ref dataCollector, UniqueId, CurrentPrecisionType ); + return GetOutputVectorItem( 0, outputId, vertexNormal ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/NormalVertexDataNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/NormalVertexDataNode.cs.meta new file mode 100644 index 0000000..62b8c9d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/NormalVertexDataNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4c7b60515f9cf6043bf8d03531d268f9 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/ObjectScaleNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/ObjectScaleNode.cs new file mode 100644 index 0000000..6dd1b8d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/ObjectScaleNode.cs @@ -0,0 +1,75 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; +using UnityEditor; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Object Scale", "Vertex Data", "Object Scale extracted directly from its transform matrix" )] + public class ObjectScaleNode : ParentNode + { + private const string RotationIndependentScaleStr = "Rotation Independent Scale"; + + [SerializeField] + private bool m_rotationIndependentScale = false; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddOutputVectorPorts( WirePortDataType.FLOAT3, "XYZ" ); + m_drawPreviewAsSphere = true; + m_previewShaderGUID = "5540033c6c52f51468938c1a42bd2730"; + m_textLabelWidth = 180; + UpdateMaterialPass(); + m_autoWrapProperties = true; + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUI.BeginChangeCheck(); + m_rotationIndependentScale = EditorGUILayoutToggle( RotationIndependentScaleStr, m_rotationIndependentScale ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateMaterialPass(); + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + string objectScale = m_rotationIndependentScale ? GeneratorUtils.GenerateRotationIndependentObjectScale( ref dataCollector, UniqueId ): + GeneratorUtils.GenerateObjectScale( ref dataCollector, UniqueId ); + + return GetOutputVectorItem( 0, outputId, objectScale ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() < 17402 ) + { + m_rotationIndependentScale = false; + } + else + { + m_rotationIndependentScale = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + UpdateMaterialPass(); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_rotationIndependentScale ); + } + + void UpdateMaterialPass() + { + m_previewMaterialPassId = m_rotationIndependentScale ? 1 : 0; + PreviewIsDirty = true; + } + + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/ObjectScaleNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/ObjectScaleNode.cs.meta new file mode 100644 index 0000000..7103bef --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/ObjectScaleNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ef1fe46d0cc472e45ad13ac737db2c1e +timeCreated: 1493993914 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/OutlineNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/OutlineNode.cs new file mode 100644 index 0000000..18600b0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/OutlineNode.cs @@ -0,0 +1,392 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +using UnityEngine; +using UnityEditor; +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Outline", "Miscellaneous", "Uses vertices to simulate an outline around the object" )] + public sealed class OutlineNode : ParentNode + { + enum OutlineAlphaModes + { + None = 0, + Masked, + Transparent, + AlphaPremultiplied + }; + + private const string CullModePortNameStr = "Cull Mode"; + private const string AlphaModePortNameStr = "Alpha"; + private const string MaskedModePortNamStr = "Opacity Mask"; + private const string OutlineAlphaModeStr = "Alpha Mode"; + private const string OpacityMaskClipValueStr = "Mask Clip Value"; + private const string ErrorMessage = "Outline node should only be connected to vertex ports."; + + [SerializeField] + private bool m_noFog = true; + + [SerializeField] + private string[] AvailableOutlineModes = { "Vertex Offset", "Vertex Scale", "Custom" }; + + [SerializeField] + private int[] AvailableOutlineValues = { 0, 1, 2 }; + + [SerializeField] + private int m_currentSelectedMode = 0; + + [SerializeField] + private OutlineAlphaModes m_currentAlphaMode = OutlineAlphaModes.None; + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + + [NonSerialized] + private StandardSurfaceOutputNode m_masterNode = null; + + [SerializeField] + private int m_zTestMode = 0; + + [SerializeField] + private int m_zWriteMode = 0; + + [SerializeField] + private CullMode m_cullMode = CullMode.Front; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + + AddOutputPort( WirePortDataType.FLOAT3, "Out" ); + + AddInputPort( WirePortDataType.FLOAT3, false, "Color", -1, MasterNodePortCategory.Fragment, 0 ); + AddInputPort( WirePortDataType.FLOAT, false, "Alpha", -1, MasterNodePortCategory.Fragment, 2 ); + AddInputPort( WirePortDataType.FLOAT, false, "Width", -1, MasterNodePortCategory.Fragment, 1 ); + GetInputPortByUniqueId( 2 ).Visible = false; + m_textLabelWidth = 115; + m_hasLeftDropdown = true; + SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, AvailableOutlineModes[ m_currentSelectedMode ] ) ); + } + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + base.PropagateNodeData( nodeData, ref dataCollector ); + if( GetInputPortByUniqueId( 0 ).IsConnected ) + dataCollector.UsingCustomOutlineColor = true; + + if( GetInputPortByUniqueId( 1 ).IsConnected ) + dataCollector.UsingCustomOutlineWidth = true; + + if( GetInputPortByUniqueId( 2 ).IsConnected ) + dataCollector.UsingCustomOutlineAlpha = true; + + if( !dataCollector.IsTemplate ) + { + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.ZWriteMode = m_zWriteMode; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.OffsetMode = m_currentSelectedMode; + } + } + + public override void AfterCommonInit() + { + base.AfterCommonInit(); + + if( PaddingTitleLeft == 0 ) + { + PaddingTitleLeft = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + if( PaddingTitleRight == 0 ) + PaddingTitleRight = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + } + } + + public override void Destroy() + { + base.Destroy(); + m_upperLeftWidget = null; + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + EditorGUI.BeginChangeCheck(); + m_currentSelectedMode = m_upperLeftWidget.DrawWidget( this, m_currentSelectedMode, AvailableOutlineModes ); + if( EditorGUI.EndChangeCheck() ) + { + SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, AvailableOutlineModes[ m_currentSelectedMode ] ) ); + UpdatePorts(); + } + } + + void CheckAlphaPortVisibility() + { + InputPort alphaPort = GetInputPortByUniqueId( 2 ); + if( m_currentAlphaMode != OutlineAlphaModes.None ) + { + if( !alphaPort.Visible ) + alphaPort.Visible = true; + + if( m_currentAlphaMode == OutlineAlphaModes.Masked ) + { + GetInputPortByUniqueId( 2 ).Name = MaskedModePortNamStr; + } + else + { + GetInputPortByUniqueId( 2 ).Name = AlphaModePortNameStr; + } + m_sizeIsDirty = true; + } + + if( m_currentAlphaMode == OutlineAlphaModes.None && alphaPort.Visible ) + { + alphaPort.Visible = false; + m_sizeIsDirty = true; + } + } + + public override void DrawProperties() + { + base.DrawProperties(); + NodeUtils.DrawPropertyGroup( ref m_propertiesFoldout, Constants.ParameterLabelStr, () => + { + EditorGUI.BeginChangeCheck(); + m_currentSelectedMode = EditorGUILayoutIntPopup( "Type", m_currentSelectedMode, AvailableOutlineModes, AvailableOutlineValues ); + if( EditorGUI.EndChangeCheck() ) + { + SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, AvailableOutlineModes[ m_currentSelectedMode ] ) ); + UpdatePorts(); + } + + EditorGUI.BeginChangeCheck(); + m_currentAlphaMode = (OutlineAlphaModes)EditorGUILayoutEnumPopup( OutlineAlphaModeStr, m_currentAlphaMode ); + if( EditorGUI.EndChangeCheck() ) + { + CheckAlphaPortVisibility(); + } + + if( m_currentAlphaMode == OutlineAlphaModes.Masked ) + { + if( m_masterNode == null ) + { + m_masterNode = UIUtils.CurrentWindow.OutsideGraph.CurrentMasterNode as StandardSurfaceOutputNode; + } + + if( m_masterNode != null ) + { + m_masterNode.ShowOpacityMaskValueUI(); + } + } + + m_cullMode = (CullMode)EditorGUILayoutEnumPopup( CullModePortNameStr, m_cullMode ); + m_zWriteMode = EditorGUILayoutPopup( ZBufferOpHelper.ZWriteModeStr, m_zWriteMode, ZBufferOpHelper.ZWriteModeValues ); + m_zTestMode = EditorGUILayoutPopup( ZBufferOpHelper.ZTestModeStr, m_zTestMode, ZBufferOpHelper.ZTestModeLabels ); + m_noFog = EditorGUILayoutToggle( "No Fog", m_noFog ); + + } ); + } + + void UpdatePorts() + { + if( m_currentSelectedMode == 2 ) //custom mode + { + GetInputPortByUniqueId( 1 ).ChangeProperties( "Offset", WirePortDataType.FLOAT3, false ); + } + else + { + GetInputPortByUniqueId( 1 ).ChangeProperties( "Width", WirePortDataType.FLOAT, false ); + } + + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.IsTemplate ) + return m_outputPorts[0].ErrorValue; + + if( dataCollector.IsFragmentCategory ) + { + UIUtils.ShowMessage( UniqueId, ErrorMessage ); + return m_outputPorts[ 0 ].ErrorValue; + } + + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].ErrorValue; + + m_outputPorts[ 0 ].SetLocalValue( "0", dataCollector.PortCategory ); + + StandardSurfaceOutputNode masterNode = UIUtils.CurrentWindow.OutsideGraph.CurrentMasterNode as StandardSurfaceOutputNode; + + MasterNodeDataCollector outlineDataCollector = new MasterNodeDataCollector(); + outlineDataCollector.IsOutlineDataCollector = true; + outlineDataCollector.DirtyNormal = true; + InputPort colorPort = GetInputPortByUniqueId( 0 ); + InputPort alphaPort = GetInputPortByUniqueId( 2 ); + InputPort vertexPort = GetInputPortByUniqueId( 1 ); + + //if( vertexPort.IsConnected ) + //{ + // outlineDataCollector.PortCategory = MasterNodePortCategory.Vertex; + // string outlineWidth = vertexPort.GenerateShaderForOutput( ref outlineDataCollector, vertexPort.DataType, true, true ); + // outlineDataCollector.AddToVertexLocalVariables( UniqueId, PrecisionType.Float, vertexPort.DataType, "outlineVar", outlineWidth ); + + // outlineDataCollector.AddVertexInstruction( outlineDataCollector.SpecialLocalVariables, UniqueId, false ); + // outlineDataCollector.ClearSpecialLocalVariables(); + + // outlineDataCollector.AddVertexInstruction( outlineDataCollector.VertexLocalVariables, UniqueId, false ); + // outlineDataCollector.ClearVertexLocalVariables(); + + // // need to check whether this breaks other outputs or not + // UIUtils.CurrentWindow.OutsideGraph.ResetNodesLocalVariables(); + //} + + outlineDataCollector.PortCategory = MasterNodePortCategory.Fragment; + string outlineColor = colorPort.GeneratePortInstructions( ref outlineDataCollector );// "\to.Emission = " + colorPort.GeneratePortInstructions( ref outlineDataCollector ) + ";"; + string alphaValue = alphaPort.Visible ? alphaPort.GeneratePortInstructions( ref outlineDataCollector ) : string.Empty; + + + + bool addTabs = outlineDataCollector.DirtySpecialLocalVariables || alphaPort.Available; + outlineDataCollector.AddInstructions( "\t" + outlineDataCollector.SpecialLocalVariables.TrimStart( '\t' ) ); + outlineDataCollector.ClearSpecialLocalVariables(); + outlineDataCollector.AddInstructions( ( addTabs ? "\t\t\t" : "" ) + "o.Emission = " + outlineColor + ";" ); + if( alphaPort.Visible ) + { + if( m_currentAlphaMode == OutlineAlphaModes.Masked ) + { + float maskClipValue = 0.5f; + + if( masterNode != null ) + maskClipValue = masterNode.OpacityMaskClipValue; + + if( masterNode.InlineOpacityMaskClipValue.IsValid ) + { + RangedFloatNode fnode = UIUtils.GetNode( masterNode.InlineOpacityMaskClipValue.NodeId ) as RangedFloatNode; + if( fnode != null ) + { + outlineDataCollector.AddToProperties( fnode.UniqueId, fnode.GetPropertyValue(), fnode.OrderIndex ); + outlineDataCollector.AddToUniforms( fnode.UniqueId, fnode.GetUniformValue() ); + } + else + { + IntNode inode = UIUtils.GetNode( masterNode.InlineOpacityMaskClipValue.NodeId ) as IntNode; + outlineDataCollector.AddToProperties( inode.UniqueId, inode.GetPropertyValue(), inode.OrderIndex ); + outlineDataCollector.AddToUniforms( inode.UniqueId, inode.GetUniformValue() ); + } + } + else + { + outlineDataCollector.AddToProperties( -1, string.Format( IOUtils.MaskClipValueProperty, OpacityMaskClipValueStr, maskClipValue ), -1 ); + outlineDataCollector.AddToUniforms( -1, string.Format( IOUtils.MaskClipValueUniform, maskClipValue ) ); + } + + outlineDataCollector.AddInstructions( ( addTabs ? "\n\t\t\t" : "" ) + "clip( " + alphaValue + " - " + masterNode.InlineOpacityMaskClipValue.GetValueOrProperty( IOUtils.MaskClipValueName, false ) + " );" ); + } + else + { + outlineDataCollector.AddInstructions( ( addTabs ? "\n\t\t\t" : "" ) + "o.Alpha = " + alphaValue + ";" ); + } + } + + if( outlineDataCollector.UsingWorldNormal ) + outlineDataCollector.AddInstructions( ( addTabs ? "\n\t\t\t" : "" ) + "o.Normal = float3(0,0,-1);" ); + + //Moved vertex port code generation from ln.227 to this after fragment ones + //to correctly include vertex instructions generated by them + UIUtils.CurrentWindow.OutsideGraph.ResetNodesLocalVariables(); + outlineDataCollector.PortCategory = MasterNodePortCategory.Vertex; + string outlineWidth = vertexPort.GenerateShaderForOutput( ref outlineDataCollector, vertexPort.DataType, true, true ); + + + outlineDataCollector.AddToVertexLocalVariables( UniqueId, PrecisionType.Float, vertexPort.DataType, "outlineVar", outlineWidth ); + + outlineDataCollector.AddVertexInstruction( outlineDataCollector.SpecialLocalVariables, UniqueId, false ); + outlineDataCollector.ClearSpecialLocalVariables(); + + outlineDataCollector.AddVertexInstruction( outlineDataCollector.VertexLocalVariables, UniqueId, false ); + outlineDataCollector.ClearVertexLocalVariables(); + + outlineDataCollector.AddASEMacros(); + + // need to check whether this breaks other outputs or not + UIUtils.CurrentWindow.OutsideGraph.ResetNodesLocalVariables(); + + if( masterNode != null ) + { + masterNode.CheckSamplingMacrosFlag(); + //masterNode.AdditionalIncludes.AddToDataCollector( ref outlineDataCollector ); + //masterNode.AdditionalPragmas.AddToDataCollector( ref outlineDataCollector ); + //masterNode.AdditionalDefines.AddToDataCollector( ref outlineDataCollector ); + if( !masterNode.CustomShadowCaster ) + masterNode.AdditionalDirectives.AddAllToDataCollector( ref outlineDataCollector ); + } + + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.InputList = outlineDataCollector.InputList; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.Inputs = outlineDataCollector.Inputs; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.DirtyInput = outlineDataCollector.DirtyInputs; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.Includes = outlineDataCollector.Includes; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.Pragmas = outlineDataCollector.Pragmas; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.Defines = outlineDataCollector.Defines; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.StandardAdditionalDirectives = outlineDataCollector.StandardAdditionalDirectives; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.Uniforms = outlineDataCollector.Uniforms; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.InstancedProperties = outlineDataCollector.InstancedProperties; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.GrabPasses = outlineDataCollector.GrabPass; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.UniformList = outlineDataCollector.UniformsList; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.InstancedPropertiesList = outlineDataCollector.InstancedPropertiesList; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.VertexData = outlineDataCollector.VertexData; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.Instructions = outlineDataCollector.Instructions; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.Functions = outlineDataCollector.Functions; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.LocalFunctions = outlineDataCollector.LocalFunctions; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.OutlineCullMode = m_cullMode; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.ZTestMode = m_zTestMode; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.ZWriteMode = m_zWriteMode; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.OffsetMode = m_currentSelectedMode; + UIUtils.CurrentWindow.OutsideGraph.CurrentStandardSurface.OutlineHelper.CustomNoFog = m_noFog; + dataCollector.CustomOutlineSelectedAlpha = (int)m_currentAlphaMode; + + for( int i = 0; i < outlineDataCollector.PropertiesList.Count; i++ ) + { + dataCollector.AddToProperties( UniqueId, outlineDataCollector.PropertiesList[ i ].PropertyName, outlineDataCollector.PropertiesList[ i ].OrderIndex ); + } + + dataCollector.UsingInternalData = dataCollector.UsingInternalData || outlineDataCollector.UsingInternalData; + UIUtils.CurrentWindow.OutsideGraph.ResetNodesLocalVariablesIfNot( MasterNodePortCategory.Vertex ); + return "0"; + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_currentSelectedMode = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_noFog = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > 14202 ) + m_currentAlphaMode = (OutlineAlphaModes)Enum.Parse( typeof( OutlineAlphaModes ), GetCurrentParam( ref nodeParams ) ); + + if( UIUtils.CurrentShaderVersion() > 14302 ) + { + m_zWriteMode = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_zTestMode = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + + if( UIUtils.CurrentShaderVersion() > 15304 ) + { + m_cullMode = (CullMode)Enum.Parse( typeof( CullMode ), GetCurrentParam( ref nodeParams ) ); + } + + SetAdditonalTitleText( string.Format( Constants.SubTitleTypeFormatStr, AvailableOutlineModes[ m_currentSelectedMode ] ) ); + UpdatePorts(); + CheckAlphaPortVisibility(); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_currentSelectedMode ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_noFog ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_currentAlphaMode ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_zWriteMode ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_zTestMode ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_cullMode ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/OutlineNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/OutlineNode.cs.meta new file mode 100644 index 0000000..60f49a8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/OutlineNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 24f267627c002964badad2901309c96a +timeCreated: 1501161489 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/PosVertexDataNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/PosVertexDataNode.cs new file mode 100644 index 0000000..a71ed20 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/PosVertexDataNode.cs @@ -0,0 +1,138 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Vertex Position", "Vertex Data", "Vertex position vector in object space, can be used in both local vertex offset and fragment outputs" )] + public sealed class PosVertexDataNode : VertexDataNode + { + private const string PropertyLabel = "Size"; + private readonly string[] SizeLabels = { "XYZ", "XYZW" }; + + [SerializeField] + private int m_sizeOption = 0; + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_currentVertexData = "vertex"; + ChangeOutputProperties( 0, "XYZ", WirePortDataType.FLOAT3 ); + m_drawPreviewAsSphere = true; + m_outputPorts[ 4 ].Visible = false; + m_hasLeftDropdown = true; + m_autoWrapProperties = true; + m_previewShaderGUID = "a5c14f759dd021b4b8d4b6eeb85ac227"; + } + + public override void Destroy() + { + base.Destroy(); + m_upperLeftWidget = null; + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + EditorGUI.BeginChangeCheck(); + m_sizeOption = m_upperLeftWidget.DrawWidget( this, m_sizeOption, SizeLabels ); + if( EditorGUI.EndChangeCheck() ) + { + UpdatePorts(); + } + } + + public override void DrawProperties() + { + EditorGUI.BeginChangeCheck(); + m_sizeOption = EditorGUILayoutPopup( PropertyLabel, m_sizeOption, SizeLabels ); + if ( EditorGUI.EndChangeCheck() ) + { + UpdatePorts(); + } + } + + void UpdatePorts() + { + if ( m_sizeOption == 0 ) + { + ChangeOutputProperties( 0, SizeLabels[ 0 ], WirePortDataType.FLOAT3, false ); + m_outputPorts[ 4 ].Visible = false; + } + else + { + ChangeOutputProperties( 0, SizeLabels[ 1 ], WirePortDataType.FLOAT4, false ); + m_outputPorts[ 4 ].Visible = true; + } + } + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + + if ( dataCollector.MasterNodeCategory == AvailableShaderTypes.Template ) + { + string vertexPos = dataCollector.TemplateDataCollectorInstance.GetVertexPosition( ( m_sizeOption == 0 ) ? WirePortDataType.FLOAT3 : WirePortDataType.FLOAT4, CurrentPrecisionType ); + return GetOutputVectorItem( 0, outputId, vertexPos ); + } + + + if ( dataCollector.PortCategory == MasterNodePortCategory.Fragment || dataCollector.PortCategory == MasterNodePortCategory.Debug ) + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalVar ); + + WirePortDataType sizeType = m_sizeOption == 0 ? WirePortDataType.FLOAT3 : WirePortDataType.FLOAT4; + + string vertexPosition = GeneratorUtils.GenerateVertexPosition( ref dataCollector, UniqueId, sizeType ); + return GetOutputVectorItem( 0, outputId, vertexPosition ); + + //if ( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + //{ + // string vertexVar = base.GenerateShaderForOutput( 0, ref dataCollector, ignoreLocalVar ); + // if ( outputId != 0 ) + // { + // return GetOutputVectorItem( 0, outputId, vertexVar ); + // } + // else if ( m_sizeOption == 0 ) + // { + // vertexVar += ".xyz"; + // } + + // return vertexVar; + //} + //else + //{ + + // string vertexVar = GeneratorUtils.GenerateVertexPositionOnFrag( ref dataCollector, UniqueId, m_currentPrecisionType ); + // if ( outputId != 0 ) + // { + // return GetOutputVectorItem( 0, outputId, vertexVar ); + // } + // else if ( m_sizeOption == 0 ) + // { + // vertexVar += ".xyz"; + // } + // return GetOutputVectorItem( 0, outputId, vertexVar ); + //} + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if ( UIUtils.CurrentShaderVersion() > 7101 ) + { + m_sizeOption = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + UpdatePorts(); + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_sizeOption ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/PosVertexDataNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/PosVertexDataNode.cs.meta new file mode 100644 index 0000000..9ff223e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/PosVertexDataNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: fc77801277f0faf4ca0be33f565b5604 +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TangentSignVertexDataNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TangentSignVertexDataNode.cs new file mode 100644 index 0000000..f9beb05 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TangentSignVertexDataNode.cs @@ -0,0 +1,23 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Vertex Tangent Sign", "Vertex Data", "Vertex tangent sign in object space, return the W value of tangent vector that contains only the sign of the tangent" )] + public sealed class TangentSignVertexDataNode : ParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddOutputVectorPorts( WirePortDataType.FLOAT, "Sign" ); + m_drawPreviewAsSphere = true; + m_previewShaderGUID = "f5466d126f4bb1f49917eac88b1cb6af"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + return GeneratorUtils.GenerateVertexTangentSign( ref dataCollector, UniqueId, CurrentPrecisionType ); ; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TangentSignVertexDataNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TangentSignVertexDataNode.cs.meta new file mode 100644 index 0000000..c07ffb6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TangentSignVertexDataNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1f79f23d5c10c9e4fb6a59c1ef70f6fc +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TangentVertexDataNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TangentVertexDataNode.cs new file mode 100644 index 0000000..da6d25f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TangentVertexDataNode.cs @@ -0,0 +1,120 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +using System; +using UnityEditor; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Vertex Tangent", "Vertex Data", "Vertex tangent vector in object space, can be used in both local vertex offset and fragment outputs" )] + public sealed class TangentVertexDataNode : VertexDataNode + { + private const string PropertyLabel = "Size"; + private readonly string[] SizeLabels = { "XYZ", "XYZW" }; + + [SerializeField] + private int m_sizeOption = 0; + + private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_currentVertexData = "tangent"; + ChangeOutputProperties( 0, "XYZ", WirePortDataType.FLOAT3 ); + m_outputPorts[ 4 ].Visible = false; + m_drawPreviewAsSphere = true; + m_hasLeftDropdown = true; + m_previewShaderGUID = "0a44bb521d06d6143a4acbc3602037f8"; + } + + public override void Destroy() + { + base.Destroy(); + m_upperLeftWidget = null; + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + EditorGUI.BeginChangeCheck(); + m_sizeOption = m_upperLeftWidget.DrawWidget( this, m_sizeOption, SizeLabels ); + if( EditorGUI.EndChangeCheck() ) + { + UpdatePorts(); + } + } + + public override void DrawProperties() + { + EditorGUI.BeginChangeCheck(); + m_sizeOption = EditorGUILayoutPopup( PropertyLabel, m_sizeOption, SizeLabels ); + if( EditorGUI.EndChangeCheck() ) + { + UpdatePorts(); + } + } + + void UpdatePorts() + { + if( m_sizeOption == 0 ) + { + ChangeOutputProperties( 0, SizeLabels[ 0 ], WirePortDataType.FLOAT3, false ); + m_outputPorts[ 4 ].Visible = false; + } + else + { + ChangeOutputProperties( 0, SizeLabels[ 1 ], WirePortDataType.FLOAT4, false ); + m_outputPorts[ 4 ].Visible = true; + } + } + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + base.PropagateNodeData( nodeData, ref dataCollector ); + dataCollector.DirtyNormal = true; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + string vertexTangent = string.Empty; + if ( dataCollector.MasterNodeCategory == AvailableShaderTypes.Template ) + { + vertexTangent = dataCollector.TemplateDataCollectorInstance.GetVertexTangent( WirePortDataType.FLOAT4, CurrentPrecisionType ); + if( m_sizeOption == 0 ) + vertexTangent += ".xyz"; + + return GetOutputVectorItem( 0, outputId, vertexTangent ); + } + + if ( dataCollector.PortCategory == MasterNodePortCategory.Fragment || dataCollector.PortCategory == MasterNodePortCategory.Debug ) + { + dataCollector.ForceNormal = true; + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_NORMAL, CurrentPrecisionType ); + dataCollector.AddToInput( UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + } + + WirePortDataType sizeType = m_sizeOption == 0 ? WirePortDataType.FLOAT3 : WirePortDataType.FLOAT4; + + vertexTangent = GeneratorUtils.GenerateVertexTangent( ref dataCollector, UniqueId, CurrentPrecisionType, sizeType ); + return GetOutputVectorItem( 0, outputId, vertexTangent ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > 16100 ) + { + m_sizeOption = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + UpdatePorts(); + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_sizeOption ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TangentVertexDataNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TangentVertexDataNode.cs.meta new file mode 100644 index 0000000..2ce6f77 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TangentVertexDataNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b544118f39abfe84581b8249973d52c5 +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation.meta new file mode 100644 index 0000000..89948ec --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 518d8e72c2385b9488817fee5368f56c +folderAsset: yes +timeCreated: 1482150091 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/DistanceBasedTessNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/DistanceBasedTessNode.cs new file mode 100644 index 0000000..c49df07 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/DistanceBasedTessNode.cs @@ -0,0 +1,30 @@ + +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Distance-based Tessellation", "Miscellaneous", "Calculates tessellation based on distance from camera" )] + public sealed class DistanceBasedTessNode : TessellationParentNode + { + private const string FunctionBody = "UnityDistanceBasedTess( v0.vertex, v1.vertex, v2.vertex, {0},{1},{2})"; + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false,"Factor"); + AddInputPort( WirePortDataType.FLOAT, false, "Min Dist" ); + AddInputPort( WirePortDataType.FLOAT, false, "Max Dist" ); + AddOutputPort( WirePortDataType.FLOAT4, Constants.EmptyPortValue ); + } + + protected override string BuildTessellationFunction( ref MasterNodeDataCollector dataCollector ) + { + return string.Format( FunctionBody, + m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ), + m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector ), + m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ) ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/DistanceBasedTessNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/DistanceBasedTessNode.cs.meta new file mode 100644 index 0000000..18016c1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/DistanceBasedTessNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5a83fb450d164d34bb756f46b3f4290e +timeCreated: 1482150091 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/EdgeLengthCullTessNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/EdgeLengthCullTessNode.cs new file mode 100644 index 0000000..48c5db0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/EdgeLengthCullTessNode.cs @@ -0,0 +1,27 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Edge Length Tessellation With Cull", "Miscellaneous", "Tessellation level computed based on triangle edge length on the screen with patch frustum culling" )] + public sealed class EdgeLengthCullTessNode : TessellationParentNode + { + private const string FunctionBody = "UnityEdgeLengthBasedTessCull( v0.vertex, v1.vertex, v2.vertex, {0},{1})"; + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, "Edge Length" ); + AddInputPort( WirePortDataType.FLOAT, false, "Max Disp." ); + AddOutputPort( WirePortDataType.FLOAT4, Constants.EmptyPortValue ); + } + + protected override string BuildTessellationFunction( ref MasterNodeDataCollector dataCollector ) + { + return string.Format( FunctionBody, + m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ), + m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector ) ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/EdgeLengthCullTessNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/EdgeLengthCullTessNode.cs.meta new file mode 100644 index 0000000..20d4dd2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/EdgeLengthCullTessNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4b09c64ce2fd06a4cb4036d8cc0f8b2a +timeCreated: 1482150962 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/EdgeLengthTessNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/EdgeLengthTessNode.cs new file mode 100644 index 0000000..f4905bf --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/EdgeLengthTessNode.cs @@ -0,0 +1,23 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Edge Length Tessellation", "Miscellaneous", "Tessellation level computed based on triangle edge length on the screen" )] + public sealed class EdgeLengthTessNode : TessellationParentNode + { + private const string FunctionBody = "UnityEdgeLengthBasedTess (v0.vertex, v1.vertex, v2.vertex, {0})"; + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddInputPort( WirePortDataType.FLOAT, false, "Edge Length" ); + AddOutputPort( WirePortDataType.FLOAT4, Constants.EmptyPortValue ); + } + + protected override string BuildTessellationFunction( ref MasterNodeDataCollector dataCollector ) + { + return string.Format( FunctionBody, m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ) ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/EdgeLengthTessNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/EdgeLengthTessNode.cs.meta new file mode 100644 index 0000000..2c936ef --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/EdgeLengthTessNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: abe3e8fa4d49c9742a95ac801fd14d7d +timeCreated: 1482150962 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/TessellationParentNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/TessellationParentNode.cs new file mode 100644 index 0000000..be14feb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/TessellationParentNode.cs @@ -0,0 +1,29 @@ +namespace AmplifyShaderEditor +{ + public class TessellationParentNode : ParentNode + { + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_useInternalPortData = true; + } + + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( dataCollector.PortCategory != MasterNodePortCategory.Tessellation ) + { + UIUtils.ShowMessage( UniqueId, m_nodeAttribs.Name + " can only be used on Master Node Tessellation port" ); + return "(-1)"; + } + + return BuildTessellationFunction( ref dataCollector ); + } + + protected virtual string BuildTessellationFunction( ref MasterNodeDataCollector dataCollector ) + { + return string.Empty; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/TessellationParentNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/TessellationParentNode.cs.meta new file mode 100644 index 0000000..0799224 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/Tessellation/TessellationParentNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 79c24faef1fec884d937e74bdc9209da +timeCreated: 1482162387 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TexCoord1VertexDataNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TexCoord1VertexDataNode.cs new file mode 100644 index 0000000..5297ac7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TexCoord1VertexDataNode.cs @@ -0,0 +1,16 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "[VS] Vertex TexCoord1", "Vertex Data", "Second set of vertex texture coordinates. Only works on Vertex Shaders ports ( p.e. Local Vertex Offset Port )." ,null,UnityEngine.KeyCode.None,true,true, "[VS] Vertex TexCoord" )] + public sealed class TexCoord1VertexDataNode : VertexDataNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_currentVertexData = "texcoord1"; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TexCoord1VertexDataNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TexCoord1VertexDataNode.cs.meta new file mode 100644 index 0000000..6852927 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TexCoord1VertexDataNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ebd7eb3a7f6149e4e9dacbcda2d8089f +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TexCoordVertexDataNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TexCoordVertexDataNode.cs new file mode 100644 index 0000000..e6e0cd8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TexCoordVertexDataNode.cs @@ -0,0 +1,241 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Vertex TexCoord", "Vertex Data", "Vertex texture coordinates, can be used in both local vertex offset and fragment outputs", tags: "uv" )] + public sealed class TexCoordVertexDataNode : VertexDataNode + { + [SerializeField] + private int m_texcoordSize = 2; + + [SerializeField] + private int m_index = 0; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_currentVertexData = "texcoord"; + ChangeOutputProperties( 0, "UV", WirePortDataType.FLOAT2, false ); + m_outputPorts[ 1 ].Name = "U"; + m_outputPorts[ 2 ].Name = "V"; + m_outputPorts[ 3 ].Visible = false; + m_outputPorts[ 4 ].Visible = false; + m_outputPorts[ 3 ].Name = "W"; + m_outputPorts[ 4 ].Name = "T"; + m_autoWrapProperties = true; + m_hasLeftDropdown = true; + m_previewShaderGUID = "6c1bee77276896041bbb73b1b9e7f8ac"; + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUI.BeginChangeCheck(); + m_texcoordSize = EditorGUILayoutIntPopup( Constants.AvailableUVSizesLabel, m_texcoordSize, Constants.AvailableUVSizesStr, Constants.AvailableUVSizes ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateOutput(); + } + + EditorGUI.BeginChangeCheck(); + m_index = EditorGUILayoutIntPopup( Constants.AvailableUVChannelLabel, m_index, Constants.AvailableUVSetsStr, Constants.AvailableUVChannels ); + if( EditorGUI.EndChangeCheck() ) + { + m_currentVertexData = ( m_index == 0 ) ? "texcoord" : "texcoord" + Constants.AvailableUVChannelsStr[ m_index ]; + } + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + if( m_dropdownEditing ) + { + EditorGUI.BeginChangeCheck(); + m_texcoordSize = EditorGUIIntPopup( m_dropdownRect, m_texcoordSize, Constants.AvailableUVSizesStr, Constants.AvailableUVSizes, UIUtils.PropertyPopUp ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateOutput(); + DropdownEditing = false; + } + } + } + + private void UpdateOutput() + { + if( m_texcoordSize == 3 ) + { + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT3, false ); + m_outputPorts[ 0 ].Name = "UVW"; + m_outputPorts[ 3 ].Visible = true; + m_outputPorts[ 4 ].Visible = false; + } + else if( m_texcoordSize == 4 ) + { + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT4, false ); + m_outputPorts[ 0 ].Name = "UVWT"; + m_outputPorts[ 3 ].Visible = true; + m_outputPorts[ 4 ].Visible = true; + } + else + { + m_texcoordSize = 2; + m_outputPorts[ 0 ].ChangeType( WirePortDataType.FLOAT2, false ); + m_outputPorts[ 0 ].Name = "UV"; + m_outputPorts[ 3 ].Visible = false; + m_outputPorts[ 4 ].Visible = false; + } + m_sizeIsDirty = true; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + if( dataCollector.IsTemplate ) + { + if( !dataCollector.TemplateDataCollectorInstance.HasUV( m_index ) ) + { + dataCollector.TemplateDataCollectorInstance.RegisterUV( m_index, m_outputPorts[ 0 ].DataType ); + } + + string result = string.Empty; + if( dataCollector.TemplateDataCollectorInstance.GetCustomInterpolatedData( TemplateHelperFunctions.IntToUVChannelInfo[ m_index ], m_outputPorts[ 0 ].DataType, PrecisionType.Float, ref result, false, dataCollector.PortCategory ) ) + { + return GetOutputVectorItem( 0, outputId, result ); + } + else + if( dataCollector.TemplateDataCollectorInstance.HasUV( m_index ) ) + { + InterpDataHelper info = dataCollector.TemplateDataCollectorInstance.GetUVInfo( m_index ); + if( outputId == 0 ) + { + return dataCollector.TemplateDataCollectorInstance.GetUVName( m_index, m_outputPorts[ 0 ].DataType ); + } + else if( outputId <= TemplateHelperFunctions.DataTypeChannelUsage[ info.VarType ] ) + { + return GetOutputVectorItem( 0, outputId, info.VarName ); + } + Debug.LogWarning( "Attempting to access inexisting UV channel" ); + } + else + { + Debug.LogWarning( "Attempting to access non-registered UV" ); + } + return "0"; + } + + if( dataCollector.PortCategory == MasterNodePortCategory.Fragment || dataCollector.PortCategory == MasterNodePortCategory.Debug ) + { + if( m_texcoordSize > 2 ) + dataCollector.UsingHigherSizeTexcoords = true; + } + + WirePortDataType size = (WirePortDataType)( 1 << ( m_texcoordSize + 1 ) ); + string texcoords = GeneratorUtils.GenerateAutoUVs( ref dataCollector, UniqueId, m_index, null, size ); + return GetOutputVectorItem( 0, outputId, texcoords ); + } + + /// + /// Generates UV properties and uniforms and returns the varible name to use in the fragment shader + /// + /// + /// + /// + /// frag variable name + static public string GenerateFragUVs( ref MasterNodeDataCollector dataCollector, int uniqueId, int index, string propertyName = null, WirePortDataType size = WirePortDataType.FLOAT2 ) + { + string dummyPropUV = "_texcoord" + ( index > 0 ? ( index + 1 ).ToString() : "" ); + string dummyUV = "uv" + ( index > 0 ? ( index + 1 ).ToString() : "" ) + dummyPropUV; + + dataCollector.AddToProperties( uniqueId, "[HideInInspector] " + dummyPropUV + "( \"\", 2D ) = \"white\" {}", 100 ); + dataCollector.AddToInput( uniqueId, dummyUV, size ); + + string result = Constants.InputVarStr + "." + dummyUV; + if( !string.IsNullOrEmpty( propertyName ) ) + { + dataCollector.AddToUniforms( uniqueId, "uniform float4 " + propertyName + "_ST;" ); + dataCollector.AddToLocalVariables( uniqueId, PrecisionType.Float, size, "uv" + propertyName, result + " * " + propertyName + "_ST.xy + " + propertyName + "_ST.zw" ); + result = "uv" + propertyName; + } + + return result; + } + + static public string GenerateVertexUVs( ref MasterNodeDataCollector dataCollector, int uniqueId, int index, string propertyName = null, WirePortDataType size = WirePortDataType.FLOAT2 ) + { + + string result = Constants.VertexShaderInputStr + ".texcoord"; + if( index > 0 ) + { + result += index.ToString(); + } + + switch( size ) + { + default: + case WirePortDataType.FLOAT2: + { + result += ".xy"; + } + break; + case WirePortDataType.FLOAT3: + { + result += ".xyz"; + } + break; + case WirePortDataType.FLOAT4: break; + } + + if( !string.IsNullOrEmpty( propertyName ) ) + { + dataCollector.AddToUniforms( uniqueId, "uniform float4 " + propertyName + "_ST;" ); + dataCollector.AddToVertexLocalVariables( uniqueId, UIUtils.WirePortToCgType( size ) + " uv" + propertyName + " = " + Constants.VertexShaderInputStr + ".texcoord" + ( index > 0 ? index.ToString() : string.Empty ) + " * " + propertyName + "_ST.xy + " + propertyName + "_ST.zw;" ); + result = "uv" + propertyName; + } + + return result; + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > 2502 ) + { + m_index = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + + if( UIUtils.CurrentShaderVersion() > 5111 ) + { + m_texcoordSize = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + UpdateOutput(); + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_index ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_texcoordSize ); + } + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + base.PropagateNodeData( nodeData, ref dataCollector ); + if( dataCollector.IsTemplate ) + { + dataCollector.TemplateDataCollectorInstance.SetUVUsage( m_index, m_texcoordSize ); + } + else if( m_index > 3 ) + { + dataCollector.AddCustomAppData( string.Format( TemplateHelperFunctions.TexUVFullSemantic, m_index ) ); + } + } + + + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TexCoordVertexDataNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TexCoordVertexDataNode.cs.meta new file mode 100644 index 0000000..54fd39f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/TexCoordVertexDataNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b865968ce22b9d949993e5e60126eb11 +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexBinormalNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexBinormalNode.cs new file mode 100644 index 0000000..70a7d7b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexBinormalNode.cs @@ -0,0 +1,48 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +// +// Custom Node Vertex Binormal World +// Donated by Community Member Kebrus + +using UnityEngine; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "World Bitangent", "Surface Data", "Per pixel world bitangent vector", null, KeyCode.None, true, false, null, null, "kebrus" )] + public sealed class VertexBinormalNode : ParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddOutputVectorPorts( WirePortDataType.FLOAT3, "XYZ" ); + m_drawPreviewAsSphere = true; + m_previewShaderGUID = "76873532ab67d2947beaf07151383cbe"; + } + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + base.PropagateNodeData( nodeData, ref dataCollector ); + dataCollector.DirtyNormal = true; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( dataCollector.IsTemplate ) + return GetOutputVectorItem( 0, outputId, dataCollector.TemplateDataCollectorInstance.GetWorldBinormal( CurrentPrecisionType ) ); + + if( dataCollector.PortCategory == MasterNodePortCategory.Fragment || dataCollector.PortCategory == MasterNodePortCategory.Debug ) + { + dataCollector.ForceNormal = true; + + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_NORMAL, CurrentPrecisionType ); + dataCollector.AddToInput( UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + } + + string worldBitangent = GeneratorUtils.GenerateWorldBitangent( ref dataCollector, UniqueId ); + + return GetOutputVectorItem( 0, outputId, worldBitangent ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexBinormalNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexBinormalNode.cs.meta new file mode 100644 index 0000000..b990b9a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexBinormalNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8ae297dac4e208f4e86c8f7a022fc5bd +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexColorNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexColorNode.cs new file mode 100644 index 0000000..53ef576 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexColorNode.cs @@ -0,0 +1,47 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Vertex Color", "Vertex Data", "Vertex color interpolated on fragment" )] + public sealed class VertexColorNode : VertexDataNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_currentVertexData = "color"; + m_outputPorts[ 0 ].Name = "RGBA"; + ConvertFromVectorToColorPorts(); + m_drawPreviewAsSphere = true; + m_previewShaderGUID = "ca1d22db6470c5f4d9f93a9873b4f5bc"; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + if( dataCollector.MasterNodeCategory == AvailableShaderTypes.Template ) + { + string color = dataCollector.TemplateDataCollectorInstance.GetVertexColor( CurrentPrecisionType ); + return GetOutputColorItem( 0, outputId, color ); + } + + if( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + { + return base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalVar ); + } + else + { + dataCollector.AddToInput( UniqueId, SurfaceInputs.COLOR ); + string result = Constants.InputVarStr + "." + Constants.ColorVariable; + switch( outputId ) + { + case 1: result += ".r"; break; + case 2: result += ".g"; break; + case 3: result += ".b"; break; + case 4: result += ".a"; break; + } + return result; + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexColorNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexColorNode.cs.meta new file mode 100644 index 0000000..ac1eee7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexColorNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6271f602b9ab61e4c9a96a91e473c1e0 +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexDataNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexDataNode.cs new file mode 100644 index 0000000..9fa8cff --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexDataNode.cs @@ -0,0 +1,50 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using System; + +namespace AmplifyShaderEditor +{ + //public enum VertexData + //{ + // vertex = 0, + // tangent, + // normal, + // texcoord, + // texcoord1, + // color + //} + + [Serializable] + public class VertexDataNode : ParentNode + { + [SerializeField] + protected string m_currentVertexData; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_currentVertexData = "vertex"; + +// Type type = typeof( StandardSurfaceOutputNode ); + //m_restictions.AddPortRestriction( type, 0 ); + //m_restictions.AddPortRestriction( type, 2 ); + //m_restictions.AddPortRestriction( type, 3 ); + //m_restictions.AddPortRestriction( type, 4 ); + //m_restictions.AddPortRestriction( type, 5 ); + //m_restictions.AddPortRestriction( type, 6 ); + //m_restictions.AddPortRestriction( type, 7 ); + //m_restictions.AddPortRestriction( type, 8 ); + //m_restictions.AddPortRestriction( type, 9 ); + //m_restictions.AddPortRestriction( type, 10 ); + AddOutputVectorPorts( WirePortDataType.FLOAT4, "Out" ); + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + base.GenerateShaderForOutput( outputId, ref dataCollector, ignoreLocalVar ); + return GetOutputVectorItem( 0, outputId, Constants.VertexShaderInputStr + "." + m_currentVertexData ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexDataNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexDataNode.cs.meta new file mode 100644 index 0000000..66737ec --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexDataNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e5f8fa23e49e4be478b283a704459767 +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexTangentNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexTangentNode.cs new file mode 100644 index 0000000..b4e6064 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexTangentNode.cs @@ -0,0 +1,50 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +// +// Custom Node Vertex Tangent World +// Donated by Community Member Kebrus + +using UnityEngine; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "World Tangent", "Surface Data", "Per pixel world tangent vector", null, KeyCode.None, true, false, null, null, "kebrus" )] + public sealed class VertexTangentNode : ParentNode + { + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddOutputVectorPorts( WirePortDataType.FLOAT3, "XYZ" ); + m_drawPreviewAsSphere = true; + m_previewShaderGUID = "61f0b80493c9b404d8c7bf56d59c3f81"; + } + + public override void PropagateNodeData( NodeData nodeData, ref MasterNodeDataCollector dataCollector ) + { + base.PropagateNodeData( nodeData , ref dataCollector ); + dataCollector.DirtyNormal = true; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if ( dataCollector.IsTemplate ) + { + return GetOutputVectorItem( 0, outputId, dataCollector.TemplateDataCollectorInstance.GetWorldTangent( CurrentPrecisionType ) ); + } + + if( dataCollector.PortCategory == MasterNodePortCategory.Fragment || dataCollector.PortCategory == MasterNodePortCategory.Debug ) + { + dataCollector.ForceNormal = true; + + dataCollector.AddToInput( UniqueId, SurfaceInputs.WORLD_NORMAL, CurrentPrecisionType ); + dataCollector.AddToInput( UniqueId, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + } + + string worldTangent = GeneratorUtils.GenerateWorldTangent( ref dataCollector, UniqueId ); + + return GetOutputVectorItem( 0, outputId, worldTangent ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexTangentNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexTangentNode.cs.meta new file mode 100644 index 0000000..d3f0bbf --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexTangentNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3aca1dfe55df44d4cbaf99d5a40f7470 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexToFragmentNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexToFragmentNode.cs new file mode 100644 index 0000000..68de3f0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexToFragmentNode.cs @@ -0,0 +1,187 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +// +// Custom Node Vertex To Fragment +// Donated by Jason Booth - http://u3d.as/DND + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [System.Serializable] + [NodeAttributes( "Vertex To Fragment", "Miscellaneous", "Pass vertex data to the pixel shader", null, KeyCode.None, true, false, null, null, "Jason Booth - http://u3d.as/DND" )] + public sealed class VertexToFragmentNode : SingleInputOp + { + private const string DisabledInterpolatorMsg = "No Interpolation option cannot be used over Standard Surface type as we must be able to directly control interpolators registry, which does't happen over this shader type. Please disable it."; + private const string NoInterpolationUsageMsg = "No interpolation is performed when passing value from vertex to fragment during rasterization. Please note this option will not work across all API's and can even throw compilation errors on some of them ( p.e. Metal and GLES 2.0 )"; + + private const string SampleInfoMessage = "Interpolate at sample location rather than at the pixel center. This causes the pixel shader to execute per-sample rather than per-pixel. Only available in shader model 4.1 or higher"; + + [SerializeField] + private bool m_noInterpolation; + + [SerializeField] + private bool m_sample; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_inputPorts[ 0 ].AddPortForbiddenTypes( WirePortDataType.FLOAT3x3, + WirePortDataType.FLOAT4x4, + WirePortDataType.SAMPLER1D, + WirePortDataType.SAMPLER2D, + WirePortDataType.SAMPLER3D, + WirePortDataType.SAMPLERCUBE, + WirePortDataType.SAMPLER2DARRAY, + WirePortDataType.SAMPLERSTATE ); + m_inputPorts[ 0 ].Name = "(VS) In"; + m_outputPorts[ 0 ].Name = "Out"; + m_useInternalPortData = false; + m_autoWrapProperties = true; + m_errorMessageTypeIsError = NodeMessageType.Warning; + m_previewShaderGUID = "74e4d859fbdb2c0468de3612145f4929"; + } + + public override void DrawProperties() + { + base.DrawProperties(); + bool isSurface = ContainerGraph.IsStandardSurface; + EditorGUI.BeginDisabledGroup( isSurface && !m_noInterpolation ); + m_noInterpolation = EditorGUILayoutToggle( "No Interpolation" , m_noInterpolation ); + EditorGUI.EndDisabledGroup(); + if( m_noInterpolation ) + { + if( isSurface ) + { + EditorGUILayout.HelpBox( DisabledInterpolatorMsg, MessageType.Warning ); + } else + { + EditorGUILayout.HelpBox( NoInterpolationUsageMsg, MessageType.Info ); + } + } + + EditorGUI.BeginDisabledGroup( isSurface && !m_sample ); + m_sample = EditorGUILayoutToggle( "Sample" , m_sample ); + EditorGUI.EndDisabledGroup(); + if( m_sample ) + EditorGUILayout.HelpBox( SampleInfoMessage , MessageType.Info ); + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + m_showErrorMessage = ContainerGraph.IsStandardSurface && m_noInterpolation || + ContainerGraph.IsStandardSurface && m_sample; + } + + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + if( m_outputPorts[ 0 ].IsLocalValue( dataCollector.PortCategory ) ) + return m_outputPorts[ 0 ].LocalValue( dataCollector.PortCategory ); + + bool noInterpolationFlag = dataCollector.IsTemplate ? m_noInterpolation : false; + bool sampleFlag = dataCollector.IsTemplate ? m_sample : false; + string varName = GenerateInputInVertex( ref dataCollector, 0, "vertexToFrag" + OutputId,true, noInterpolationFlag, sampleFlag ); + m_outputPorts[ 0 ].SetLocalValue( varName, dataCollector.PortCategory ); + + return varName; + + ////TEMPLATES + //if( dataCollector.IsTemplate ) + //{ + // if( !dataCollector.IsFragmentCategory ) + // return m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + + // string varName = "vertexToFrag" + OutputId; + // if( dataCollector.TemplateDataCollectorInstance.HasCustomInterpolatedData( varName ) ) + // return varName; + + // MasterNodePortCategory category = dataCollector.PortCategory; + // dataCollector.PortCategory = MasterNodePortCategory.Vertex; + // bool dirtyVertexVarsBefore = dataCollector.DirtyVertexVariables; + // ContainerGraph.ResetNodesLocalVariablesIfNot( this, MasterNodePortCategory.Vertex ); + + // string data = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + + // dataCollector.PortCategory = category; + // if( !dirtyVertexVarsBefore && dataCollector.DirtyVertexVariables ) + // { + // dataCollector.AddVertexInstruction( dataCollector.VertexLocalVariables, UniqueId, false ); + // dataCollector.ClearVertexLocalVariables(); + // ContainerGraph.ResetNodesLocalVariablesIfNot( this, MasterNodePortCategory.Vertex ); + // } + + // ContainerGraph.ResetNodesLocalVariablesIfNot( this, MasterNodePortCategory.Fragment ); + + // dataCollector.TemplateDataCollectorInstance.RegisterCustomInterpolatedData( varName, m_inputPorts[ 0 ].DataType, m_currentPrecisionType, data ); + // //return varName; + + // m_outputPorts[ 0 ].SetLocalValue( varName ); + // return m_outputPorts[ 0 ].LocalValue; + //} + + ////SURFACE + //{ + // if( !dataCollector.IsFragmentCategory ) + // { + // return m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + // } + + // if( dataCollector.TesselationActive ) + // { + // UIUtils.ShowMessage( "Unable to use Vertex to Frag when Tessellation is active" ); + // return m_outputPorts[ 0 ].ErrorValue; + // } + + + // string interpName = "data" + OutputId; + // dataCollector.AddToInput( UniqueId, interpName, m_inputPorts[ 0 ].DataType, m_currentPrecisionType ); + + // MasterNodePortCategory portCategory = dataCollector.PortCategory; + // dataCollector.PortCategory = MasterNodePortCategory.Vertex; + + // bool dirtyVertexVarsBefore = dataCollector.DirtyVertexVariables; + + // ContainerGraph.ResetNodesLocalVariablesIfNot( this, MasterNodePortCategory.Vertex ); + + // string vertexVarValue = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector ); + // dataCollector.AddLocalVariable( UniqueId, Constants.VertexShaderOutputStr + "." + interpName, vertexVarValue + ";" ); + + // dataCollector.PortCategory = portCategory; + + // if( !dirtyVertexVarsBefore && dataCollector.DirtyVertexVariables ) + // { + // dataCollector.AddVertexInstruction( dataCollector.VertexLocalVariables, UniqueId, false ); + // dataCollector.ClearVertexLocalVariables(); + // ContainerGraph.ResetNodesLocalVariablesIfNot( this, MasterNodePortCategory.Vertex ); + // } + + // ContainerGraph.ResetNodesLocalVariablesIfNot( this, MasterNodePortCategory.Fragment ); + + // //return Constants.InputVarStr + "." + interpName; + + // m_outputPorts[ 0 ].SetLocalValue( Constants.InputVarStr + "." + interpName ); + // return m_outputPorts[ 0 ].LocalValue; + //} + } + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > 18707 ) + m_noInterpolation = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + + if( UIUtils.CurrentShaderVersion() > 18808 ) + m_sample = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_noInterpolation ); + IOUtils.AddFieldValueToString( ref nodeInfo , m_sample ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexToFragmentNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexToFragmentNode.cs.meta new file mode 100644 index 0000000..0131f74 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Nodes/Vertex/VertexToFragmentNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9ecea5c13558ad4499dd4bc558670b8e +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/PreMadeShaders.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/PreMadeShaders.cs new file mode 100644 index 0000000..e6fd5c6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/PreMadeShaders.cs @@ -0,0 +1,47 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; + +using System.Collections.Generic; +namespace AmplifyShaderEditor +{ + public class PreMadeShaders + { + public static readonly string FlatColorSequenceId = "Flat Color"; + private Dictionary m_actionLib; + public PreMadeShaders() + { + m_actionLib = new Dictionary(); + ActionSequence sequence = new ActionSequence( FlatColorSequenceId ); + sequence.AddToSequence( new CreateNodeActionData( 1, typeof( ColorNode ), new Vector2( -250, 125 ) ) ); + sequence.AddToSequence( new CreateConnectionActionData( 0, 4, 1, 0 ) ); + m_actionLib.Add( sequence.Name, sequence ); + } + + public ActionSequence GetSequence( string name ) + { + if ( m_actionLib.ContainsKey( name ) ) + { + return m_actionLib[ name ]; + } + return null; + } + + public void Destroy() + { + var items = m_actionLib.GetEnumerator(); + while ( items.MoveNext() ) + { + items.Current.Value.Destroy(); + } + m_actionLib.Clear(); + m_actionLib = null; + } + + public ActionSequence FlatColorSequence + { + get { return m_actionLib[ FlatColorSequenceId ]; } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/PreMadeShaders.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/PreMadeShaders.cs.meta new file mode 100644 index 0000000..745f638 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/PreMadeShaders.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b4e28cbcd41f3b04ca36fc1b34d2c10f +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates.meta new file mode 100644 index 0000000..d2ecd46 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c1807893b16b7724e840f3d8099a6394 +folderAsset: yes +timeCreated: 1481126944 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalDefinesHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalDefinesHelper.cs new file mode 100644 index 0000000..fb4d756 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalDefinesHelper.cs @@ -0,0 +1,31 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class TemplateAdditionalDefinesHelper : TemplateAdditionalParentHelper + { + public TemplateAdditionalDefinesHelper() : base( "Additional Defines" ) + { + m_helpBoxMessage = "Please add your defines without the #define keywords"; + } + + public override void AddToDataCollector( ref MasterNodeDataCollector dataCollector, TemplateIncludePragmaContainter nativesContainer ) + { + for( int i = 0; i < m_additionalItems.Count; i++ ) + { + if( !string.IsNullOrEmpty( m_additionalItems[ i ] ) && !nativesContainer.HasDefine( m_additionalItems[ i ] ) ) + dataCollector.AddToDefines( -1, m_additionalItems[ i ] ); + } + + for( int i = 0; i < m_outsideItems.Count; i++ ) + { + if( !string.IsNullOrEmpty( m_outsideItems[ i ] ) && !nativesContainer.HasDefine( m_outsideItems[ i ] ) ) + dataCollector.AddToDefines( -1, m_outsideItems[ i ] ); + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalDefinesHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalDefinesHelper.cs.meta new file mode 100644 index 0000000..3194a2a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalDefinesHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 35a7fdfdb9a6b0048aa322a9fe58a371 +timeCreated: 1520275148 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalDirectivesHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalDirectivesHelper.cs new file mode 100644 index 0000000..28664a8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalDirectivesHelper.cs @@ -0,0 +1,837 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.IO; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; +using UnityEditorInternal; + +namespace AmplifyShaderEditor +{ + public enum AdditionalLineType + { + Include, + Define, + Pragma, + Custom + } + + public enum AdditionalContainerOrigin + { + Native, + ShaderFunction, + Custom + } + + + [Serializable] + public class AdditionalDirectiveContainerSaveItem + { + public AdditionalLineType LineType = AdditionalLineType.Include; + public string LineValue = string.Empty; + public bool GUIDToggle = false; + public string GUIDValue = string.Empty; + public AdditionalContainerOrigin Origin = AdditionalContainerOrigin.Custom; + public AdditionalDirectiveContainerSaveItem( AdditionalLineType lineType, string lineValue, bool guidToggle, string guidValue, AdditionalContainerOrigin origin ) + { + LineType = lineType; + LineValue = lineValue; + GUIDToggle = guidToggle; + GUIDValue = guidValue; + Origin = origin; + } + + public AdditionalDirectiveContainerSaveItem( AdditionalDirectiveContainer container ) + { + LineType = container.LineType; + LineValue = container.LineValue; + GUIDToggle = container.GUIDToggle; + GUIDValue = container.GUIDValue; + Origin = container.Origin; + } + } + + [Serializable] + public class AdditionalDirectiveContainer : ScriptableObject + { + public AdditionalLineType LineType = AdditionalLineType.Include; + public string LineValue = string.Empty; + public bool GUIDToggle = false; + public string GUIDValue = string.Empty; + public AdditionalContainerOrigin Origin = AdditionalContainerOrigin.Custom; + public TextAsset LibObject = null; + public string OwnerId = string.Empty; + + public void Init( string ownerId, AdditionalDirectiveContainer item ) + { + LineType = item.LineType; + LineValue = item.LineValue; + GUIDToggle = item.GUIDToggle; + GUIDValue = item.GUIDValue; + Origin = item.Origin; + LibObject = item.LibObject; + OwnerId = ownerId; + } + + public void Init( AdditionalDirectiveContainerSaveItem item ) + { + LineType = item.LineType; + LineValue = item.LineValue; + GUIDToggle = item.GUIDToggle; + GUIDValue = item.GUIDValue; + Origin = item.Origin; + if( GUIDToggle ) + { + LibObject = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( GUIDValue ) ); + } + } + + public void OnDestroy() + { + //Debug.Log( "Destoying directives" ); + LibObject = null; + } + + public string Value + { + get + { + switch( LineType ) + { + case AdditionalLineType.Include: + { + if( GUIDToggle ) + { + string shaderPath = AssetDatabase.GUIDToAssetPath( GUIDValue ); + if( !string.IsNullOrEmpty( shaderPath ) ) + return shaderPath; + } + return LineValue; + } + case AdditionalLineType.Define: return LineValue; + case AdditionalLineType.Pragma: return LineValue; + } + return LineValue; + } + } + + public string FormattedValue + { + get + { + switch( LineType ) + { + case AdditionalLineType.Include: + { + if( GUIDToggle ) + { + string shaderPath = AssetDatabase.GUIDToAssetPath( GUIDValue ); + if( !string.IsNullOrEmpty( shaderPath ) ) + return string.Format( Constants.IncludeFormat, shaderPath ); + } + + return string.Format( Constants.IncludeFormat, LineValue ); + } + case AdditionalLineType.Define: + return string.Format( Constants.DefineFormat, LineValue ); + case AdditionalLineType.Pragma: + return string.Format( Constants.PragmaFormat, LineValue ); + } + return LineValue; + } + } + } + + + + public enum ReordableAction + { + None, + Add, + Remove + } + + [Serializable] + public sealed class TemplateAdditionalDirectivesHelper : TemplateModuleParent + { + private string NativeFoldoutStr = "Native"; + + [SerializeField] + private List m_additionalDirectives = new List(); + + [SerializeField] + private List m_shaderFunctionDirectives = new List(); + + [SerializeField] + private List m_nativeDirectives = new List(); + + [SerializeField] + private int m_nativeDirectivesIndex = -1; + + [SerializeField] + private bool m_nativeDirectivesFoldout = false; + + //ONLY USED BY SHADER FUNCTIONS + // Since AdditionalDirectiveContainer must be a ScriptableObject because of serialization shenanigans it will not serialize the info correctly into the shader function when saving it into a file ( it only saves the id ) + // For it to properly work, each AdditionalDirectiveContainer should be added to the SF asset, but that would make it to have children ( which are seen on the project inspector ) + // Must revisit this later on and come up with a proper solution + [SerializeField] + private List m_directivesSaveItems = new List(); + + + private ReordableAction m_actionType = ReordableAction.None; + private int m_actionIndex = 0; + private ReorderableList m_reordableList = null; + private GUIStyle m_propertyAdjustment; + private UndoParentNode m_currOwner; + private Rect m_nativeRect = Rect.zero; + + public TemplateAdditionalDirectivesHelper( string moduleName ) : base( moduleName ) { } + + //public void AddShaderFunctionItem( AdditionalLineType type, string item ) + //{ + // UpdateShaderFunctionDictionary(); + // string id = type + item; + // if( !m_shaderFunctionDictionary.ContainsKey( id ) ) + // { + // AdditionalDirectiveContainer newItem = ScriptableObject.CreateInstance(); + // newItem.LineType = type; + // newItem.LineValue = item; + // newItem.hideFlags = HideFlags.HideAndDontSave; + // m_shaderFunctionDirectives.Add( newItem ); + // m_shaderFunctionDictionary.Add( id, newItem ); + // } + //} + + public void AddShaderFunctionItems( string ownerOutputId, List functionList ) + { + RemoveShaderFunctionItems( ownerOutputId ); + if( functionList.Count > 0 ) + { + for( int i = 0; i < functionList.Count; i++ ) + { + AdditionalDirectiveContainer item = ScriptableObject.CreateInstance(); + item.Init( ownerOutputId, functionList[ i ] ); + m_shaderFunctionDirectives.Add( item ); + } + } + //if( functionList.Count > 0 ) + //{ + + // m_shaderFunctionDirectives.AddRange( functionList ); + //} + } + + public void RemoveShaderFunctionItems( string ownerOutputId/*, List functionList */) + { + List list = m_shaderFunctionDirectives.FindAll( ( x ) => x.OwnerId.Equals( ownerOutputId )); + for( int i = 0; i < list.Count; i++ ) + { + m_shaderFunctionDirectives.Remove( list[ i ] ); + ScriptableObject.DestroyImmediate( list[ i ] ); + } + list.Clear(); + list = null; + + //for( int i = 0; i < functionList.Count; i++ ) + //{ + // m_shaderFunctionDirectives.Remove( functionList[ i ] ); + //} + } + + //public void RemoveShaderFunctionItem( AdditionalLineType type, string item ) + //{ + // m_shaderFunctionDirectives.RemoveAll( x => x.LineType == type && x.LineValue.Equals( item ) ); + //} + + public void AddItems( AdditionalLineType type, List items ) + { + int count = items.Count; + for( int i = 0; i < count; i++ ) + { + AdditionalDirectiveContainer newItem = ScriptableObject.CreateInstance(); + newItem.LineType = type; + newItem.LineValue = items[ i ]; + newItem.hideFlags = HideFlags.HideAndDontSave; + m_additionalDirectives.Add( newItem ); + } + UpdateNativeIndex(); + } + + public void AddNativeContainer() + { + if( m_nativeDirectives.Count > 0 ) + { + if( m_additionalDirectives.FindIndex( x => x.Origin.Equals( AdditionalContainerOrigin.Native ) ) == -1 ) + { + AdditionalDirectiveContainer newItem = ScriptableObject.CreateInstance(); + newItem.Origin = AdditionalContainerOrigin.Native; + newItem.hideFlags = HideFlags.HideAndDontSave; + //m_additionalDirectives.Add( newItem ); + //m_nativeDirectivesIndex = m_additionalDirectives.Count - 1; + m_additionalDirectives.Insert( 0, newItem ); + m_nativeDirectivesIndex = 0; + } + } + } + + public void FillNativeItems( List nativeItems ) + { + m_nativeDirectives.Clear(); + m_nativeDirectives.AddRange( nativeItems ); + AddNativeContainer(); + } + + void DrawNativeItems() + { + EditorGUILayout.Separator(); + EditorGUI.indentLevel++; + int count = m_nativeDirectives.Count; + for( int i = 0; i < count; i++ ) + { + EditorGUILayout.LabelField( m_nativeDirectives[ i ] ); + } + EditorGUI.indentLevel--; + EditorGUILayout.Separator(); + } + + void DrawNativeItemsRect() + { + int count = m_nativeDirectives.Count; + m_nativeRect.y += EditorGUIUtility.singleLineHeight; + for( int i = 0; i < count; i++ ) + { + EditorGUI.LabelField( m_nativeRect, m_nativeDirectives[ i ] ); + m_nativeRect.y += EditorGUIUtility.singleLineHeight; + } + } + + void DrawButtons() + { + EditorGUILayout.Separator(); + + // Add keyword + if( GUILayout.Button( string.Empty, UIUtils.PlusStyle, GUILayout.Width( Constants.PlusMinusButtonLayoutWidth ) ) ) + { + AdditionalDirectiveContainer newItem = ScriptableObject.CreateInstance(); + newItem.hideFlags = HideFlags.HideAndDontSave; + m_additionalDirectives.Add( newItem ); + UpdateNativeIndex(); + EditorGUI.FocusTextInControl( null ); + m_isDirty = true; + } + + //Remove keyword + if( GUILayout.Button( string.Empty, UIUtils.MinusStyle, GUILayout.Width( Constants.PlusMinusButtonLayoutWidth ) ) ) + { + if( m_additionalDirectives.Count > 0 ) + { + AdditionalDirectiveContainer itemToDelete = m_additionalDirectives[ m_additionalDirectives.Count - 1 ]; + m_additionalDirectives.RemoveAt( m_additionalDirectives.Count - 1 ); + ScriptableObject.DestroyImmediate( itemToDelete ); + EditorGUI.FocusTextInControl( null ); + } + m_isDirty = true; + } + } + + public override void Draw( UndoParentNode currOwner, bool style = true ) + { + m_currOwner = currOwner; + if( m_reordableList == null ) + { + m_reordableList = new ReorderableList( m_additionalDirectives, typeof( AdditionalDirectiveContainer ), true, false, false, false ) + { + headerHeight = 0, + footerHeight = 0, + showDefaultBackground = false, + elementHeightCallback = ( index ) => + { + if( m_additionalDirectives[ index ].Origin == AdditionalContainerOrigin.Native && m_nativeDirectivesFoldout ) + { + return ( m_nativeDirectives.Count + 1 ) * ( EditorGUIUtility.singleLineHeight ) + 5; + } + + return EditorGUIUtility.singleLineHeight + 5; + }, + drawElementCallback = ( Rect rect, int index, bool isActive, bool isFocused ) => + { + if( m_additionalDirectives[ index ].Origin == AdditionalContainerOrigin.Native && m_nativeDirectivesFoldout ) + { + rect.height = ( m_nativeDirectives.Count + 1 ) * ( EditorGUIUtility.singleLineHeight ) + 5; + } + + if( m_additionalDirectives[ index ] != null ) + { + float labelWidthStyleAdjust = 0; + if( style ) + { + rect.xMin -= 10; + labelWidthStyleAdjust = 15; + } + else + { + rect.xMin -= 1; + } + + float popUpWidth = style ? 80 : 65f; + float widthAdjust = m_additionalDirectives[ index ].LineType == AdditionalLineType.Include ? -14 : 0; + Rect popupPos = new Rect( rect.x, rect.y, popUpWidth, EditorGUIUtility.singleLineHeight ); + Rect GUIDTogglePos = m_additionalDirectives[ index ].LineType == AdditionalLineType.Include ? new Rect( rect.x + rect.width - 3 * Constants.PlusMinusButtonLayoutWidth, rect.y, Constants.PlusMinusButtonLayoutWidth, Constants.PlusMinusButtonLayoutWidth ) : new Rect(); + Rect buttonPlusPos = new Rect( rect.x + rect.width - 2 * Constants.PlusMinusButtonLayoutWidth, rect.y - 2, Constants.PlusMinusButtonLayoutWidth, Constants.PlusMinusButtonLayoutWidth ); + Rect buttonMinusPos = new Rect( rect.x + rect.width - Constants.PlusMinusButtonLayoutWidth, rect.y - 2, Constants.PlusMinusButtonLayoutWidth, Constants.PlusMinusButtonLayoutWidth ); + float labelWidthBuffer = EditorGUIUtility.labelWidth; + Rect labelPos = new Rect( rect.x + popupPos.width - labelWidthStyleAdjust, rect.y, labelWidthStyleAdjust + rect.width - popupPos.width - buttonPlusPos.width - buttonMinusPos.width + widthAdjust, EditorGUIUtility.singleLineHeight ); + + if( m_additionalDirectives[ index ].Origin == AdditionalContainerOrigin.Native ) + { + m_nativeRect = rect; +#if UNITY_2019_3_OR_NEWER + m_nativeRect.y -= ( m_nativeRect.height - ( EditorGUIUtility.singleLineHeight + 5 ) ) * 0.5f; +#endif + m_nativeRect.xMin += 2; + m_nativeRect.xMax -= 2; + m_nativeRect.yMax -= 2; + + NodeUtils.DrawNestedPropertyGroup( ref m_nativeDirectivesFoldout, rect, NativeFoldoutStr, DrawNativeItemsRect, 4 ); + return; + } + + m_additionalDirectives[ index ].LineType = (AdditionalLineType)m_currOwner.EditorGUIEnumPopup( popupPos, m_additionalDirectives[ index ].LineType ); + + if( m_additionalDirectives[ index ].LineType == AdditionalLineType.Include ) + { + if( m_additionalDirectives[ index ].GUIDToggle ) + { + //if( m_additionalDirectives[ index ].LibObject == null && !string.IsNullOrEmpty( m_additionalDirectives[ index ].GUIDValue ) ) + //{ + // m_additionalDirectives[ index ].LibObject = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( m_additionalDirectives[ index ].GUIDValue ) ); + //} + + EditorGUI.BeginChangeCheck(); + TextAsset obj = m_currOwner.EditorGUIObjectField( labelPos, m_additionalDirectives[ index ].LibObject, typeof( TextAsset ), false ) as TextAsset; + if( EditorGUI.EndChangeCheck() ) + { + string pathName = AssetDatabase.GetAssetPath( obj ); + string extension = Path.GetExtension( pathName ); + extension = extension.ToLower(); + if( extension.Equals( ".cginc" ) || extension.Equals( ".hlsl" ) ) + { + m_additionalDirectives[ index ].LibObject = obj; + m_additionalDirectives[ index ].GUIDValue = AssetDatabase.AssetPathToGUID( pathName ); + } + } + } + else + { + m_additionalDirectives[ index ].LineValue = m_currOwner.EditorGUITextField( labelPos, string.Empty, m_additionalDirectives[ index ].LineValue ); + } + + if( GUI.Button( GUIDTogglePos, m_additionalDirectives[ index ].GUIDToggle ? UIUtils.FloatIntIconOFF : UIUtils.FloatIntIconON, UIUtils.FloatIntPickerONOFF ) ) + m_additionalDirectives[ index ].GUIDToggle = !m_additionalDirectives[ index ].GUIDToggle; + } + else + { + m_additionalDirectives[ index ].LineValue = m_currOwner.EditorGUITextField( labelPos, string.Empty, m_additionalDirectives[ index ].LineValue ); + } + + if( GUI.Button( buttonPlusPos, string.Empty, UIUtils.PlusStyle ) ) + { + m_actionType = ReordableAction.Add; + m_actionIndex = index; + } + + if( GUI.Button( buttonMinusPos, string.Empty, UIUtils.MinusStyle ) ) + { + m_actionType = ReordableAction.Remove; + m_actionIndex = index; + } + } + }, + onReorderCallback = ( ReorderableList list ) => + { + UpdateNativeIndex(); + } + }; + } + + if( m_actionType != ReordableAction.None ) + { + switch( m_actionType ) + { + case ReordableAction.Add: + { + AdditionalDirectiveContainer newItem = ScriptableObject.CreateInstance(); + newItem.hideFlags = HideFlags.HideAndDontSave; + m_additionalDirectives.Insert( m_actionIndex + 1, newItem ); + } + break; + case ReordableAction.Remove: + AdditionalDirectiveContainer itemToDelete = m_additionalDirectives[ m_actionIndex ]; + m_additionalDirectives.RemoveAt( m_actionIndex ); + ScriptableObject.DestroyImmediate( itemToDelete ); + break; + } + m_isDirty = true; + m_actionType = ReordableAction.None; + EditorGUI.FocusTextInControl( null ); + } + bool foldoutValue = currOwner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedAdditionalDirectives; + if( style ) + { + NodeUtils.DrawPropertyGroup( ref foldoutValue, m_moduleName, DrawReordableList, DrawButtons ); + } + else + { + NodeUtils.DrawNestedPropertyGroup( ref foldoutValue, m_moduleName, DrawReordableList, DrawButtons ); + } + currOwner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedAdditionalDirectives = foldoutValue; + } + + void DrawReordableList() + { + if( m_reordableList != null ) + { + if( m_propertyAdjustment == null ) + { + m_propertyAdjustment = new GUIStyle(); + m_propertyAdjustment.padding.left = 17; + } + //EditorGUILayout.BeginVertical( m_propertyAdjustment ); + EditorGUILayout.Space(); + if( m_nativeDirectives.Count > 0 ) + { + //NodeUtils.DrawNestedPropertyGroup( ref m_nativeDirectivesFoldout, NativeFoldoutStr, DrawNativeItems, 4 ); + } + if( m_additionalDirectives.Count == 0 ) + { + EditorGUILayout.HelpBox( "Your list is Empty!\nUse the plus button to add one.", MessageType.Info ); + } + else + { + m_reordableList.DoLayoutList(); + } + EditorGUILayout.Space(); + //EditorGUILayout.EndVertical(); + } + } + + public void AddAllToDataCollector( ref MasterNodeDataCollector dataCollector, TemplateIncludePragmaContainter nativesContainer ) + { + //List list = m_additionalDirectives; + //int count = list.FindIndex( x => x.Origin.Equals( AdditionalContainerOrigin.Native ) ); + //for( int i = 0; i < count; i++ ) + //{ + // switch( list[ i ].LineType ) + // { + // case AdditionalLineType.Include: + // { + // string value = list[ i ].Value; + // if( !string.IsNullOrEmpty( value ) && + // !nativesContainer.HasInclude( value ) ) + // { + // dataCollector.AddToMisc( list[ i ].FormattedValue ); + // } + // } + // break; + // case AdditionalLineType.Define: + // { + // if( !string.IsNullOrEmpty( list[ i ].LineValue ) && + // !nativesContainer.HasDefine( list[ i ].LineValue ) ) + // { + // dataCollector.AddToMisc( list[ i ].FormattedValue ); + // } + // } + // break; + // case AdditionalLineType.Pragma: + // { + // if( !string.IsNullOrEmpty( list[ i ].LineValue ) && + // !nativesContainer.HasPragma( list[ i ].LineValue ) ) + // { + // dataCollector.AddToMisc( list[ i ].FormattedValue ); + // } + // } + // break; + // default: + // case AdditionalLineType.Custom: + // dataCollector.AddToMisc( list[ i ].LineValue ); + // break; + // } + //} + + AddToDataCollector( ref dataCollector, nativesContainer, false ); + AddToDataCollector( ref dataCollector, nativesContainer, true ); + } + + public void AddAllToDataCollector( ref MasterNodeDataCollector dataCollector ) + { + AddToDataCollector( ref dataCollector, false ); + AddToDataCollector( ref dataCollector, true ); + } + + void AddToDataCollector( ref MasterNodeDataCollector dataCollector, TemplateIncludePragmaContainter nativesContainer, bool fromSF ) + { + List list = fromSF ? m_shaderFunctionDirectives : m_additionalDirectives; + int count = list.Count; + for( int i = 0; i < count; i++ ) + { + int orderIdx = fromSF ? 1 : ( i > m_nativeDirectivesIndex ? 1 : -1 ); + switch( list[ i ].LineType ) + { + case AdditionalLineType.Include: + { + string value = list[ i ].Value; + if( !string.IsNullOrEmpty( value ) && + !nativesContainer.HasInclude( value ) ) + { + dataCollector.AddToDirectives( list[ i ].FormattedValue, orderIdx ); + } + } + break; + case AdditionalLineType.Define: + { + if( !string.IsNullOrEmpty( list[ i ].LineValue ) && + !nativesContainer.HasDefine( list[ i ].LineValue ) ) + { + dataCollector.AddToDirectives( list[ i ].FormattedValue, orderIdx ); + } + } + break; + case AdditionalLineType.Pragma: + { + if( !string.IsNullOrEmpty( list[ i ].LineValue ) && + !nativesContainer.HasPragma( list[ i ].LineValue ) ) + { + dataCollector.AddToDirectives( list[ i ].FormattedValue, orderIdx ); + } + } + break; + default: + case AdditionalLineType.Custom: + dataCollector.AddToDirectives( list[ i ].LineValue, orderIdx ); + break; + } + } + } + + void AddToDataCollector( ref MasterNodeDataCollector dataCollector, bool fromSF ) + { + List list = fromSF ? m_shaderFunctionDirectives : m_additionalDirectives; + int orderIdx = 1; + int count = list.Count; + for( int i = 0; i < count; i++ ) + { + switch( list[ i ].LineType ) + { + case AdditionalLineType.Include: + { + string value = list[ i ].FormattedValue; + if( !string.IsNullOrEmpty( value ) ) + { + dataCollector.AddToDirectives( value, orderIdx ); + } + } + break; + case AdditionalLineType.Define: + { + if( !string.IsNullOrEmpty( list[ i ].LineValue ) ) + { + dataCollector.AddToDirectives( list[ i ].FormattedValue, orderIdx ); + } + } + break; + case AdditionalLineType.Pragma: + { + if( !string.IsNullOrEmpty( list[ i ].LineValue ) ) + { + dataCollector.AddToDirectives( list[ i ].FormattedValue, orderIdx ); + } + } + break; + default: + case AdditionalLineType.Custom: + dataCollector.AddToDirectives( list[ i ].LineValue, orderIdx ); + break; + } + } + } + + public override void ReadFromString( ref uint index, ref string[] nodeParams ) + { + try + { + m_nativeDirectivesIndex = -1; + int count = Convert.ToInt32( nodeParams[ index++ ] ); + m_additionalDirectives.Clear(); + for( int i = 0; i < count; i++ ) + { + AdditionalLineType lineType = (AdditionalLineType)Enum.Parse( typeof( AdditionalLineType ), nodeParams[ index++ ] ); + string lineValue = nodeParams[ index++ ]; + AdditionalDirectiveContainer newItem = ScriptableObject.CreateInstance(); + newItem.hideFlags = HideFlags.HideAndDontSave; + newItem.LineType = lineType; + newItem.LineValue = lineValue.Replace( Constants.SemiColonSeparator, ';' ); + if( UIUtils.CurrentShaderVersion() > 15607 ) + { + newItem.GUIDToggle = Convert.ToBoolean( nodeParams[ index++ ] ); + newItem.GUIDValue = nodeParams[ index++ ]; + if( newItem.GUIDToggle ) + { + newItem.LibObject = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( newItem.GUIDValue ) ); + if( newItem.LibObject == null ) + { + Debug.LogWarning( "Include file not found with GUID " + newItem.GUIDValue ); + } + } + } + AdditionalContainerOrigin origin = AdditionalContainerOrigin.Custom; + if( UIUtils.CurrentShaderVersion() > 16902 ) + { + origin = (AdditionalContainerOrigin)Enum.Parse( typeof( AdditionalContainerOrigin ), nodeParams[ index++ ] ); + newItem.Origin = origin; + } + + m_additionalDirectives.Add( newItem ); + + if( origin == AdditionalContainerOrigin.Native ) + { + m_nativeDirectivesIndex = i; + } + } + AddNativeContainer(); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + + public override void WriteToString( ref string nodeInfo ) + { + if( m_additionalDirectives.Count == 1 && m_additionalDirectives[ 0 ].Origin == AdditionalContainerOrigin.Native ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, 0 ); + return; + } + + IOUtils.AddFieldValueToString( ref nodeInfo, m_additionalDirectives.Count ); + for( int i = 0; i < m_additionalDirectives.Count; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_additionalDirectives[ i ].LineType ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_additionalDirectives[ i ].LineValue.Replace( ';', Constants.SemiColonSeparator ) ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_additionalDirectives[ i ].GUIDToggle ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_additionalDirectives[ i ].GUIDValue ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_additionalDirectives[ i ].Origin ); + } + } + + // read comment on m_directivesSaveItems declaration + public void UpdateSaveItemsFromDirectives() + { + bool foundNull = false; + m_directivesSaveItems.Clear(); + for( int i = 0; i < m_additionalDirectives.Count; i++ ) + { + if( m_additionalDirectives[ i ] != null ) + { + m_directivesSaveItems.Add( new AdditionalDirectiveContainerSaveItem( m_additionalDirectives[ i ] ) ); + } + else + { + foundNull = true; + } + } + + if( foundNull ) + { + m_additionalDirectives.RemoveAll( item => item == null ); + } + } + + public void CleanNullDirectives() + { + m_additionalDirectives.RemoveAll( item => item == null ); + } + + public void ResetDirectivesOrigin() + { + for( int i = 0; i < m_directivesSaveItems.Count; i++ ) + { + m_directivesSaveItems[ i ].Origin = AdditionalContainerOrigin.Custom; + } + } + + // read comment on m_directivesSaveItems declaration + public void UpdateDirectivesFromSaveItems() + { + if( m_directivesSaveItems.Count > 0 ) + { + for( int i = 0; i < m_additionalDirectives.Count; i++ ) + { + if( m_additionalDirectives[ i ] != null ) + ScriptableObject.DestroyImmediate( m_additionalDirectives[ i ] ); + } + + m_additionalDirectives.Clear(); + + for( int i = 0; i < m_directivesSaveItems.Count; i++ ) + { + AdditionalDirectiveContainer newItem = ScriptableObject.CreateInstance(); + newItem.hideFlags = HideFlags.HideAndDontSave; + newItem.Init( m_directivesSaveItems[ i ] ); + m_additionalDirectives.Add( newItem ); + } + UpdateNativeIndex(); + //m_directivesSaveItems.Clear(); + } + } + + void UpdateNativeIndex() + { + m_nativeDirectivesIndex = -1; + int count = m_additionalDirectives.Count; + for( int i = 0; i < count; i++ ) + { + if( m_additionalDirectives[ i ].Origin == AdditionalContainerOrigin.Native ) + { + m_nativeDirectivesIndex = i; + break; + } + } + } + + public override void Destroy() + { + base.Destroy(); + + m_nativeDirectives.Clear(); + m_nativeDirectives = null; + + for( int i = 0; i < m_additionalDirectives.Count; i++ ) + { + ScriptableObject.DestroyImmediate( m_additionalDirectives[ i ] ); + } + + m_additionalDirectives.Clear(); + m_additionalDirectives = null; + + for( int i = 0; i < m_shaderFunctionDirectives.Count; i++ ) + { + ScriptableObject.DestroyImmediate( m_shaderFunctionDirectives[ i ] ); + } + + m_shaderFunctionDirectives.Clear(); + m_shaderFunctionDirectives = null; + + + m_propertyAdjustment = null; + m_reordableList = null; + } + + + public List DirectivesList { get { return m_additionalDirectives; } } + public bool IsValid { get { return m_validData; } set { m_validData = value; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalDirectivesHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalDirectivesHelper.cs.meta new file mode 100644 index 0000000..43fdc89 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalDirectivesHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c6b57deeb826a674f9715fab4dfb4cb1 +timeCreated: 1528278077 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalIncludesHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalIncludesHelper.cs new file mode 100644 index 0000000..7d58666 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalIncludesHelper.cs @@ -0,0 +1,31 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class TemplateAdditionalIncludesHelper : TemplateAdditionalParentHelper + { + public TemplateAdditionalIncludesHelper() : base( "Additional Includes" ) + { + m_helpBoxMessage = "Please add your includes without the #include \"\" keywords"; + } + + public override void AddToDataCollector( ref MasterNodeDataCollector dataCollector , TemplateIncludePragmaContainter nativesContainer ) + { + for( int i = 0; i < m_additionalItems.Count; i++ ) + { + if( !string.IsNullOrEmpty( m_additionalItems[ i ] ) && !nativesContainer.HasInclude( m_additionalItems[ i ] ) ) + dataCollector.AddToIncludes( -1, m_additionalItems[ i ] ); + } + + for( int i = 0; i < m_outsideItems.Count; i++ ) + { + if( !string.IsNullOrEmpty( m_outsideItems[ i ] ) && !nativesContainer.HasInclude( m_outsideItems[ i ] ) ) + dataCollector.AddToIncludes( -1, m_outsideItems[ i ] ); + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalIncludesHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalIncludesHelper.cs.meta new file mode 100644 index 0000000..9a45474 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalIncludesHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0ab4c474dfddce2429da08f56e651ed4 +timeCreated: 1520275148 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalParentHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalParentHelper.cs new file mode 100644 index 0000000..da765cc --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalParentHelper.cs @@ -0,0 +1,193 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class TemplateAdditionalParentHelper : TemplateModuleParent + { + private string NativeFoldoutStr = "Native"; + + protected string m_helpBoxMessage = string.Empty; + private const float ShaderKeywordButtonLayoutWidth = 15; + private ParentNode m_currentOwner; + + [SerializeField] + protected List m_nativeItems = new List(); + + [SerializeField] + protected bool m_nativeItemsFoldout = false; + + [SerializeField] + protected List m_additionalItems = new List(); + + [SerializeField] + protected List m_outsideItems = new List(); + + public TemplateAdditionalParentHelper( string moduleName ) : base( moduleName ) { } + public bool IsValid { set{ m_validData = value; } get{ return m_validData; } } + + public void FillNativeItems( List nativeItems ) + { + m_nativeItems.Clear(); + m_nativeItems.AddRange( nativeItems ); + } + + public void Draw( ParentNode owner ) + { + m_currentOwner = owner; + bool foldout = owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedAdditionalDefines; + NodeUtils.DrawNestedPropertyGroup( ref foldout, m_moduleName, DrawMainBody, DrawButtons ); + owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedAdditionalDefines = foldout; + } + + public void CopyFrom( TemplateAdditionalParentHelper other ) + { + m_additionalItems.Clear(); + m_outsideItems.Clear(); + int otherAdditionalItemsCount = other.ItemsList.Count; + for( int i = 0; i < otherAdditionalItemsCount; i++ ) + { + m_additionalItems.Add( other.ItemsList[ i ] ); + } + + int otherOusideItemsCount = other.OutsideList.Count; + for( int i = 0; i < otherOusideItemsCount; i++ ) + { + m_outsideItems.Add( other.OutsideList[ i ] ); + } + } + + void DrawButtons() + { + EditorGUILayout.Separator(); + + // Add keyword + if( GUILayout.Button( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + m_additionalItems.Add( string.Empty ); + EditorGUI.FocusTextInControl( null ); + m_isDirty = true; + } + + //Remove keyword + if( GUILayout.Button( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + if( m_additionalItems.Count > 0 ) + { + m_additionalItems.RemoveAt( m_additionalItems.Count - 1 ); + EditorGUI.FocusTextInControl( null ); + } + m_isDirty = true; + } + } + void DrawNativeItems() + { + EditorGUILayout.Separator(); + EditorGUI.indentLevel++; + int count = m_nativeItems.Count; + for ( int i = 0; i < count; i++ ) + { + EditorGUILayout.LabelField( m_nativeItems[i] ); + } + EditorGUI.indentLevel--; + EditorGUILayout.Separator(); + } + void DrawMainBody() + { + EditorGUILayout.Separator(); + + if( m_nativeItems.Count > 0 ) + { + NodeUtils.DrawNestedPropertyGroup( ref m_nativeItemsFoldout, NativeFoldoutStr, DrawNativeItems ,4); + } + + int itemCount = m_additionalItems.Count; + int markedToDelete = -1; + for( int i = 0; i < itemCount; i++ ) + { + EditorGUILayout.BeginHorizontal(); + { + EditorGUI.BeginChangeCheck(); + m_additionalItems[ i ] = EditorGUILayout.TextField( m_additionalItems[ i ] ); + if( EditorGUI.EndChangeCheck() ) + { + m_additionalItems[ i ] = UIUtils.RemoveShaderInvalidCharacters( m_additionalItems[ i ] ); + m_isDirty = true; + } + + // Add new port + if( m_currentOwner.GUILayoutButton( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + m_additionalItems.Insert( i + 1, string.Empty ); + EditorGUI.FocusTextInControl( null ); + m_isDirty = true; + } + + //Remove port + if( m_currentOwner.GUILayoutButton( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + markedToDelete = i; + m_isDirty = true; + } + } + EditorGUILayout.EndHorizontal(); + } + + if( markedToDelete > -1 ) + { + if( m_additionalItems.Count > markedToDelete ) + { + m_additionalItems.RemoveAt( markedToDelete ); + EditorGUI.FocusTextInControl( null ); + } + } + EditorGUILayout.Separator(); + EditorGUILayout.HelpBox( m_helpBoxMessage, MessageType.Info ); + } + + public override void ReadFromString( ref uint index, ref string[] nodeParams ) + { + try + { + int count = Convert.ToInt32( nodeParams[ index++ ] ); + for( int i = 0; i < count; i++ ) + { + m_additionalItems.Add( nodeParams[ index++ ] ); + } + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + + public override void WriteToString( ref string nodeInfo ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_additionalItems.Count ); + for( int i = 0; i < m_additionalItems.Count; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_additionalItems[ i ] ); + } + } + + public virtual void AddToDataCollector( ref MasterNodeDataCollector dataCollector , TemplateIncludePragmaContainter nativesContainer ) { } + + public override void Destroy() + { + m_additionalItems.Clear(); + m_additionalItems = null; + m_currentOwner = null; + m_nativeItems.Clear(); + m_nativeItems = null; + } + + public List ItemsList { get { return m_additionalItems; } set { m_additionalItems = value; } } + public List OutsideList { get { return m_outsideItems; } set { m_outsideItems = value; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalParentHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalParentHelper.cs.meta new file mode 100644 index 0000000..6d0983f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalParentHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5360ba11600eeb44786246ca70212e25 +timeCreated: 1520332262 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalPragmasHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalPragmasHelper.cs new file mode 100644 index 0000000..3c08f1a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalPragmasHelper.cs @@ -0,0 +1,31 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class TemplateAdditionalPragmasHelper : TemplateAdditionalParentHelper + { + public TemplateAdditionalPragmasHelper() : base( "Additional Pragmas" ) + { + m_helpBoxMessage = "Please add your pragmas without the #pragma keywords"; + } + + public override void AddToDataCollector( ref MasterNodeDataCollector dataCollector, TemplateIncludePragmaContainter nativesContainer ) + { + for( int i = 0; i < m_additionalItems.Count; i++ ) + { + if( !string.IsNullOrEmpty( m_additionalItems[ i ] ) && !nativesContainer.HasPragma( m_additionalItems[ i ] )) + dataCollector.AddToPragmas( -1, m_additionalItems[ i ] ); + } + + for( int i = 0; i < m_outsideItems.Count; i++ ) + { + if( !string.IsNullOrEmpty( m_outsideItems[ i ] ) && !nativesContainer.HasPragma( m_outsideItems[ i ] ) ) + dataCollector.AddToPragmas( -1, m_outsideItems[ i ] ); + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalPragmasHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalPragmasHelper.cs.meta new file mode 100644 index 0000000..4abd023 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAdditionalPragmasHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: de89b62c2bd8eec4b915a0decba936fb +timeCreated: 1520275148 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAlphaToMaskModule.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAlphaToMaskModule.cs new file mode 100644 index 0000000..307a633 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAlphaToMaskModule.cs @@ -0,0 +1,128 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + public sealed class TemplateAlphaToMaskModule : TemplateModuleParent + { + private const string AlphaToMaskFormatStr = "AlphaToMask "; + private const string AlphaToMaskFormat = "AlphaToMask {0}"; + + public TemplateAlphaToMaskModule() : base( "Alpha To Coverage" ) { } + + private static readonly string AlphaToMaskStr = "Alpha To Coverage"; + + [SerializeField] + private bool m_alphaToMask = false; + + [SerializeField] + private InlineProperty m_inlineAlphaToMask = new InlineProperty(); + + public void CopyFrom( TemplateAlphaToMaskModule other , bool allData ) + { + if( allData ) + m_independentModule = other.IndependentModule; + + m_alphaToMask = other.AlphaToMask; + m_inlineAlphaToMask.CopyFrom( other.AlphaToMaskInlineProperty ); + } + + public void ConfigureFromTemplateData( TemplateAlphaToMaskData data ) + { + bool newValidData = ( data.DataCheck == TemplateDataCheck.Valid ); + + if( newValidData && m_validData != newValidData ) + { + m_independentModule = data.IndependentModule; + if( string.IsNullOrEmpty( data.InlineData ) ) + { + m_alphaToMask = data.AlphaToMaskData; + m_inlineAlphaToMask.IntValue = m_alphaToMask ? 1 : 0; + m_inlineAlphaToMask.ResetProperty(); + } + else + { + m_inlineAlphaToMask.SetInlineByName( data.InlineData ); + } + } + + m_validData = newValidData; + } + + public override void Draw( UndoParentNode owner, bool style = true ) + { + EditorGUI.BeginChangeCheck(); + m_inlineAlphaToMask.CustomDrawer( ref owner, ( x ) => { m_alphaToMask = owner.EditorGUILayoutToggle( AlphaToMaskStr, m_alphaToMask ); }, AlphaToMaskStr ); + if( EditorGUI.EndChangeCheck() ) + { + m_inlineAlphaToMask.IntValue = m_alphaToMask ? 1 : 0; + m_isDirty = true; + } + } + + public override void ReadFromString( ref uint index, ref string[] nodeParams ) + { + bool validDataOnMeta = m_validData; + if( UIUtils.CurrentShaderVersion() > TemplatesManager.MPShaderVersion ) + { + validDataOnMeta = Convert.ToBoolean( nodeParams[ index++ ] ); + } + + if( validDataOnMeta ) + { + if( UIUtils.CurrentShaderVersion() < 15304 ) + { + m_alphaToMask = Convert.ToBoolean( nodeParams[ index++ ] ); + m_inlineAlphaToMask.IntValue = m_alphaToMask ? 1 : 0; + } + else + { + m_inlineAlphaToMask.ReadFromString( ref index, ref nodeParams ); + m_alphaToMask = m_inlineAlphaToMask.IntValue == 1; + } + } + } + + public override void WriteToString( ref string nodeInfo ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_validData ); + if( m_validData ) + { + m_inlineAlphaToMask.WriteToString( ref nodeInfo ); + } + } + + public override string GenerateShaderData( bool isSubShader ) + { + return AlphaToMaskFormatStr + m_inlineAlphaToMask.GetValueOrProperty( m_alphaToMask ? "On" : "Off"); + } + + public override void Destroy() + { + base.Destroy(); + m_inlineAlphaToMask = null; + } + + //public string CurrentAlphaToMask + //{ + // get { return string.Format( AlphaToMaskFormat, m_alphaToMask ? "On" : "Off" ); } + //} + + public bool AlphaToMask + { + get { return m_alphaToMask; } + set + { + m_alphaToMask = value; + m_inlineAlphaToMask.IntValue = value ? 1 : 0; + m_inlineAlphaToMask.Active = false; + } + } + public InlineProperty AlphaToMaskInlineProperty { get { return m_inlineAlphaToMask; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAlphaToMaskModule.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAlphaToMaskModule.cs.meta new file mode 100644 index 0000000..fa73b46 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateAlphaToMaskModule.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 84e56f8cb109deb4da1945562567bf0c +timeCreated: 1593170303 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateCodeSnippetBase.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateCodeSnippetBase.cs new file mode 100644 index 0000000..ea717e6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateCodeSnippetBase.cs @@ -0,0 +1,102 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + public enum TemplateCodeSnippetType + { + Toggle + }; + + + public enum TemplateCodeSnippetInfoIdx + { + Name = 0, + Type + }; + + [Serializable] + public class TemplateCodeSnippetElement + { + public string Id; + public string Snippet; + public TemplateCodeSnippetElement( string id, string snippet ) + { + Id = id; + Snippet = snippet; + } + } + + [Serializable] + public class TemplateCodeSnippetBase : ScriptableObject + { + [SerializeField] + private string m_nameId; + + [SerializeField] + private TemplateCodeSnippetType m_type; + + [SerializeField] + private List m_elements = new List(); + + public void Init( string nameId, TemplateCodeSnippetType type ) + { + m_nameId = nameId; + m_type = type; + } + + public void AddSnippet( TemplateCodeSnippetElement element ) + { + m_elements.Add( element ); + } + + public void Destroy() + { + for ( int i = 0; i < m_elements.Count; i++ ) + { + m_elements[ i ].Snippet = null; + } + m_elements.Clear(); + m_elements = null; + } + + public virtual void DrawProperties( ParentNode owner ) { } + public virtual bool CheckSnippet() { return true; } + + public void InsertSnippet( ref string shaderBody ) + { + bool insertSnippet = CheckSnippet(); + for ( int i = 0; i < m_elements.Count; i++ ) + { + shaderBody = shaderBody.Replace( m_elements[ i ].Id, ( insertSnippet ? m_elements[ i ].Snippet : string.Empty ) ); + } + } + public string NameId { get { return m_nameId; } } + public TemplateCodeSnippetType Type { get { return m_type; } } + public List Elements { get { return m_elements; } } + } + + [Serializable] + public class TemplateCodeSnippetToggle : TemplateCodeSnippetBase + { + private const string Label = "Activate"; + [SerializeField] + private bool m_value = false; + + + public override bool CheckSnippet() + { + return m_value; + } + + public override void DrawProperties( ParentNode owner ) + { + m_value = owner.EditorGUILayoutToggle( Label, m_value ); + } + } + +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateCodeSnippetBase.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateCodeSnippetBase.cs.meta new file mode 100644 index 0000000..612a553 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateCodeSnippetBase.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5fc48fb872ce5e74aa913f987a025ea4 +timeCreated: 1495113330 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateColorMaskModule.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateColorMaskModule.cs new file mode 100644 index 0000000..34c867c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateColorMaskModule.cs @@ -0,0 +1,200 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +using System; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class TemplateColorMaskModule : TemplateModuleParent + { + private const string ColorMaskOp = "ColorMask "; + private const string ColorMaskOff = "ColorMask RGBA"; + private GUIContent ColorMaskContent = new GUIContent( "Color Mask", "Sets color channel writing mask, turning all off makes the object completely invisible\nDefault: RGBA" ); + private readonly char[] m_colorMaskChar = { 'R', 'G', 'B', 'A' }; + + private GUIStyle m_leftToggleColorMask; + private GUIStyle m_middleToggleColorMask; + private GUIStyle m_rightToggleColorMask; + + public TemplateColorMaskModule() : base( "Color Mask" ) { } + + [SerializeField] + private bool[] m_colorMask = { true, true, true, true }; + + [SerializeField] + private string m_target = string.Empty; + + [SerializeField] + private InlineProperty m_inlineColorMask = new InlineProperty(); + + public void CopyFrom( TemplateColorMaskModule other, bool allData ) + { + if( allData ) + m_independentModule = other.IndependentModule; + + for( int i = 0; i < m_colorMask.Length; i++ ) + { + m_colorMask[ i ] = other.ColorMask[ i ]; + } + + m_target = other.Target; + + m_inlineColorMask.CopyFrom( other.InlineColorMask ); + } + + public void ConfigureFromTemplateData( TemplateColorMaskData data ) + { + bool newValidData = ( data.DataCheck == TemplateDataCheck.Valid ); + if( newValidData && m_validData != newValidData ) + { + m_independentModule = data.IndependentModule; + m_target = data.Target; + if( string.IsNullOrEmpty( data.InlineData ) ) + { + for( int i = 0; i < 4; i++ ) + { + m_colorMask[ i ] = data.ColorMaskData[ i ]; + } + m_inlineColorMask.ResetProperty(); + } + else + { + m_inlineColorMask.SetInlineByName( data.InlineData ); + } + } + + m_validData = newValidData; + } + + public override void Draw( UndoParentNode owner, bool style = true ) + { + EditorGUI.BeginChangeCheck(); + { + m_inlineColorMask.CustomDrawer( ref owner, DrawColorMaskControls, ColorMaskContent.text + m_target ); + } + + if( EditorGUI.EndChangeCheck() ) + { + m_isDirty = true; + CustomEdited = true; + } + } + + private void DrawColorMaskControls( UndoParentNode owner ) + { + if( m_leftToggleColorMask == null || m_leftToggleColorMask.normal.background == null ) + { + m_leftToggleColorMask = GUI.skin.GetStyle( "ButtonLeft" ); + } + + if( m_middleToggleColorMask == null || m_middleToggleColorMask.normal.background == null ) + { + m_middleToggleColorMask = GUI.skin.GetStyle( "ButtonMid" ); + } + + if( m_rightToggleColorMask == null || m_rightToggleColorMask.normal.background == null ) + { + m_rightToggleColorMask = GUI.skin.GetStyle( "ButtonRight" ); + } + + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField( "Color Mask"+ m_target, GUILayout.Width( EditorGUIUtility.labelWidth - 3 ) ); + + m_colorMask[ 0 ] = owner.GUILayoutToggle( m_colorMask[ 0 ], "R", m_leftToggleColorMask ); + m_colorMask[ 1 ] = owner.GUILayoutToggle( m_colorMask[ 1 ], "G", m_middleToggleColorMask ); + m_colorMask[ 2 ] = owner.GUILayoutToggle( m_colorMask[ 2 ], "B", m_middleToggleColorMask ); + m_colorMask[ 3 ] = owner.GUILayoutToggle( m_colorMask[ 3 ], "A", m_rightToggleColorMask ); + + EditorGUILayout.EndHorizontal(); + } + + public override string GenerateShaderData( bool isSubShader ) + { + if( m_inlineColorMask.IsValid ) + return ColorMaskOp + m_inlineColorMask.GetValueOrProperty() + Target; + + int count = 0; + string colorMask = string.Empty; + for( int i = 0; i < m_colorMask.Length; i++ ) + { + if( m_colorMask[ i ] ) + { + count++; + colorMask += m_colorMaskChar[ i ]; + } + } + + if( count != m_colorMask.Length ) + { + return ColorMaskOp + ( ( count == 0 ) ? "0" : colorMask ) + Target; + } + + return ColorMaskOff + Target; + } + + public override void ReadFromString( ref uint index, ref string[] nodeParams ) + { + base.ReadFromString( ref index, ref nodeParams ); + bool validDataOnMeta = m_validData; + if( UIUtils.CurrentShaderVersion() > TemplatesManager.MPShaderVersion ) + { + validDataOnMeta = Convert.ToBoolean( nodeParams[ index++ ] ); + } + + if( validDataOnMeta ) + { + for( int i = 0; i < m_colorMask.Length; i++ ) + { + m_colorMask[ i ] = Convert.ToBoolean( nodeParams[ index++ ] ); + } + + if( UIUtils.CurrentShaderVersion() > 15303 ) + { + m_inlineColorMask.ReadFromString( ref index, ref nodeParams ); + } + } + } + + public override void WriteToString( ref string nodeInfo ) + { + base.WriteToString( ref nodeInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_validData ); + if( m_validData ) + { + for( int i = 0; i < m_colorMask.Length; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_colorMask[ i ] ); + } + m_inlineColorMask.WriteToString( ref nodeInfo ); + } + } + + public bool[] ColorMask + { + get { return m_colorMask; } + set + { + m_colorMask = value; + m_inlineColorMask.Active = false; + } + } + + public string Target + { + get { return m_target; } + set { m_target = value; } + } + + public override void Destroy() + { + m_leftToggleColorMask = null; + m_middleToggleColorMask = null; + m_rightToggleColorMask = null; + m_inlineColorMask = null; + } + + public InlineProperty InlineColorMask { get { return m_inlineColorMask; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateColorMaskModule.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateColorMaskModule.cs.meta new file mode 100644 index 0000000..8cb1fbb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateColorMaskModule.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e1d9e34bd7946e247aa6d28b2859c6b1 +timeCreated: 1511259305 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateCullModeModule.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateCullModeModule.cs new file mode 100644 index 0000000..f99b5c0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateCullModeModule.cs @@ -0,0 +1,128 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + public sealed class TemplateCullModeModule : TemplateModuleParent + { + private const string CullModeFormatStr = "Cull "; + + public TemplateCullModeModule() : base("Cull Mode"){ } + + private static readonly string CullModeStr = "Cull Mode"; + + [SerializeField] + private CullMode m_cullMode = CullMode.Back; + + [SerializeField] + private InlineProperty m_inlineCullMode = new InlineProperty(); + + public void CopyFrom( TemplateCullModeModule other , bool allData ) + { + if( allData ) + m_independentModule = other.IndependentModule; + + m_cullMode = other.CurrentCullMode; + m_inlineCullMode.CopyFrom( other.CullInlineProperty ); + } + + public void ConfigureFromTemplateData( TemplateCullModeData data ) + { + bool newValidData = ( data.DataCheck == TemplateDataCheck.Valid ); + + if( newValidData && m_validData != newValidData ) + { + m_independentModule = data.IndependentModule; + if( string.IsNullOrEmpty( data.InlineData ) ) + { + m_cullMode = data.CullModeData; + m_inlineCullMode.IntValue = (int)m_cullMode; + m_inlineCullMode.ResetProperty(); + } + else + { + m_inlineCullMode.SetInlineByName( data.InlineData ); + } + } + + m_validData = newValidData; + } + + public override void Draw( UndoParentNode owner, bool style = true ) + { + EditorGUI.BeginChangeCheck(); + //m_cullMode = (CullMode)owner.EditorGUILayoutEnumPopup( CullModeStr, m_cullMode ); + m_inlineCullMode.CustomDrawer( ref owner, ( x ) => { m_cullMode = (CullMode)owner.EditorGUILayoutEnumPopup( CullModeStr, m_cullMode ); }, CullModeStr ); + if( EditorGUI.EndChangeCheck() ) + { + m_inlineCullMode.IntValue = (int)m_cullMode; + m_isDirty = true; + CustomEdited = true; + } + } + + public override void ReadFromString( ref uint index, ref string[] nodeParams ) + { + base.ReadFromString( ref index, ref nodeParams ); + bool validDataOnMeta = m_validData; + if( UIUtils.CurrentShaderVersion() > TemplatesManager.MPShaderVersion ) + { + validDataOnMeta = Convert.ToBoolean( nodeParams[ index++ ] ); + } + + if( validDataOnMeta ) + { + if( UIUtils.CurrentShaderVersion() < 15304 ) + { + m_cullMode = (CullMode)Enum.Parse( typeof( CullMode ), nodeParams[ index++ ] ); + m_inlineCullMode.IntValue = (int)m_cullMode; + } + else + { + m_inlineCullMode.ReadFromString( ref index, ref nodeParams ); + m_cullMode = (CullMode)m_inlineCullMode.IntValue; + } + } + } + + public override void WriteToString( ref string nodeInfo ) + { + base.WriteToString( ref nodeInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_validData ); + if( m_validData ) + { + //IOUtils.AddFieldValueToString( ref nodeInfo, m_cullMode ); + m_inlineCullMode.WriteToString( ref nodeInfo ); + } + } + + public override string GenerateShaderData( bool isSubShader ) + { + //return CullModeFormatStr + m_cullMode.ToString(); + return CullModeFormatStr + m_inlineCullMode.GetValueOrProperty( m_cullMode.ToString()); + } + + public override void Destroy() + { + base.Destroy(); + m_inlineCullMode = null; + } + + public CullMode CurrentCullMode + { + get { return m_cullMode; } + set + { + m_cullMode = value; + m_inlineCullMode.IntValue = (int)value; + m_inlineCullMode.Active = false; + } + } + public InlineProperty CullInlineProperty { get { return m_inlineCullMode; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateCullModeModule.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateCullModeModule.cs.meta new file mode 100644 index 0000000..7b3fa30 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateCullModeModule.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: dcbce53ba2eeecd4a8f2c7f5f9a43b7a +timeCreated: 1511186525 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateDBItem.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateDBItem.cs new file mode 100644 index 0000000..602f2fb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateDBItem.cs @@ -0,0 +1,21 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class TemplateDBItem + { + public string GUID; + } + + [Serializable] + public class TemplateDB : ScriptableObject + { + public List Items = new List(); + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateDBItem.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateDBItem.cs.meta new file mode 100644 index 0000000..7917d76 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateDBItem.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b12f2516af03f3443b1f2c08c72aa490 +timeCreated: 1610016988 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateData.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateData.cs new file mode 100644 index 0000000..c563d25 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateData.cs @@ -0,0 +1,1183 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +// THIS FILE IS DEPRECATED AND SHOULD NOT BE USED + +using System; +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +using System.Text.RegularExpressions; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class TemplateDataContainer + { + public int UNITY_VERSION = -1; + public TemplateData TemplateDataRef; + } + + [Serializable] + public class VertexDataContainer + { + [SerializeField] + private List m_vertexData; + + [SerializeField] + private string m_vertexDataId = string.Empty; + + [SerializeField] + private int m_vertexDataStartIdx = -1; + + public void Reload() + { + if( m_vertexData != null ) + { + m_vertexData.Clear(); + } + } + + public void Destroy() + { + if( m_vertexData != null ) + { + m_vertexData.Clear(); + m_vertexData = null; + } + } + + + public List VertexData { get { return m_vertexData; } set { m_vertexData = value; } } + public string VertexDataId { get { return m_vertexDataId; } set { m_vertexDataId = value; } } + public int VertexDataStartIdx { get { return m_vertexDataStartIdx; } set { m_vertexDataStartIdx = value; } } + } + + [Serializable] + public sealed class TemplateData : TemplateDataParent + { + [SerializeField] + private string m_templateBody = string.Empty; + + [SerializeField] + private string m_shaderNameId = string.Empty; + + [SerializeField] + private List m_propertyList = new List(); + private Dictionary m_propertyDict = new Dictionary(); + + [SerializeField] + private List m_inputDataList = new List(); + private Dictionary m_inputDataDict = new Dictionary(); + + //[SerializeField] + //private List m_snippetElementsList = new List(); + //private Dictionary m_snippetElementsDict = new Dictionary(); + + [SerializeField] + private List m_localVarsList = new List(); + + [SerializeField] + private VertexDataContainer m_vertexDataContainer = new VertexDataContainer(); + + [SerializeField] + private TemplateInterpData m_interpolatorDataContainer; + + [SerializeField] + private List m_availableShaderProperties = new List(); + + [SerializeField] + private TemplateFunctionData m_vertexFunctionData; + + [SerializeField] + private TemplateFunctionData m_fragmentFunctionData; + + [SerializeField] + private TemplateBlendData m_blendData = new TemplateBlendData(); + + [SerializeField] + private TemplateAlphaToMaskData m_alphaToMaskData = new TemplateAlphaToMaskData(); + + [SerializeField] + private TemplateCullModeData m_cullModeData = new TemplateCullModeData(); + + [SerializeField] + private TemplateColorMaskData m_colorMaskData = new TemplateColorMaskData(); + + [SerializeField] + private TemplateStencilData m_stencilData = new TemplateStencilData(); + + [SerializeField] + private TemplateDepthData m_depthData = new TemplateDepthData(); + + [SerializeField] + private TemplateTagsModuleData m_tagData = new TemplateTagsModuleData(); + + public TemplateData() + { + m_templateType = TemplateDataType.LegacySinglePass; + } + + public TemplateData( string name ) + { + m_templateType = TemplateDataType.LegacySinglePass; + Name = name; + } + + public TemplateData( string name, string guid ) + { + m_templateType = TemplateDataType.LegacySinglePass; + m_communityTemplate = false; + if( !string.IsNullOrEmpty( guid ) ) + { + string datapath = AssetDatabase.GUIDToAssetPath( guid ); + if( string.IsNullOrEmpty( datapath ) ) + { + m_isValid = false; + return; + } + + string body = string.Empty; + try + { + body = IOUtils.LoadTextFileFromDisk( datapath ); + } + catch( Exception e ) + { + Debug.LogException( e ); + m_isValid = false; + return; + } + + if( !string.IsNullOrEmpty( body ) ) + { + LoadTemplateBody( body ); + Name = string.IsNullOrEmpty( name ) ? m_defaultShaderName : name; + m_guid = guid; + } + } + } + + public TemplateData( string name, string guid, string body ) + { + m_templateType = TemplateDataType.LegacySinglePass; + m_communityTemplate = true; + if( !string.IsNullOrEmpty( body ) ) + { + LoadTemplateBody( body ); + Name = string.IsNullOrEmpty( name ) ? m_defaultShaderName : name; + m_guid = guid; + } + } + + public override bool Reload() + { + if( m_vertexDataContainer != null ) + { + m_vertexDataContainer.Reload(); + } + + if( m_interpolatorDataContainer != null ) + { + m_interpolatorDataContainer.Destroy(); + } + + if( m_availableShaderProperties != null ) + { + m_availableShaderProperties.Clear(); + } + + if( m_propertyDict != null ) + { + m_propertyDict.Clear(); + } + + if( m_propertyList != null ) + { + m_propertyList.Clear(); + } + + if( m_inputDataDict != null ) + { + m_inputDataDict.Clear(); + } + + if( m_inputDataList != null ) + { + m_inputDataList.Clear(); + } + + if( m_localVarsList != null ) + { + m_localVarsList.Clear(); + } + + //if( m_snippetElementsDict != null ) + //{ + // m_snippetElementsDict.Clear(); + //} + + //if( m_snippetElementsList != null ) + //{ + // for( int i = 0; i < m_snippetElementsList.Count; i++ ) + // { + // GameObject.DestroyImmediate( m_snippetElementsList[ i ] ); + // m_snippetElementsList[ i ] = null; + // } + // m_snippetElementsList.Clear(); + //} + + string datapath = AssetDatabase.GUIDToAssetPath( m_guid ); + string body = string.Empty; + try + { + body = IOUtils.LoadTextFileFromDisk( datapath ); + body = UIUtils.ForceLFLineEnding( body ); + } + catch( Exception e ) + { + Debug.LogException( e ); + m_isValid = false; + } + LoadTemplateBody( body ); + if( m_communityTemplate ) + { + Name = m_defaultShaderName; + } + return true; + } + + void LoadTemplateBody( string body ) + { + + m_templateBody = UIUtils.ForceLFLineEnding( body ) ; + + if( m_templateBody.IndexOf( TemplatesManager.TemplateShaderNameBeginTag ) < 0 ) + { + m_isValid = false; + return; + } + + //Fetching common tags + FetchCommonTags(); + + //Fetch function code areas + FetchCodeAreas( TemplatesManager.TemplateVertexCodeBeginArea, MasterNodePortCategory.Vertex ); + FetchCodeAreas( TemplatesManager.TemplateFragmentCodeBeginArea, MasterNodePortCategory.Fragment ); + + //Fetching inputs + FetchInputs( MasterNodePortCategory.Fragment ); + FetchInputs( MasterNodePortCategory.Vertex ); + + + //Fetch local variables must be done after fetching code areas as it needs them to see is variable is on vertex or fragment + TemplateHelperFunctions.FetchLocalVars( m_templateBody, ref m_localVarsList, m_vertexFunctionData, m_fragmentFunctionData ); + + //Fetch snippets + } + + void FetchSubShaderProperties() + { + Match match = Regex.Match( m_templateBody, @"Pass\s*{" ); + if( match.Groups.Count == 0 ) + { + return; + } + + int beginSubShader = m_templateBody.IndexOf( "SubShader" ); + int endSubShader = match.Groups[ 0 ].Index; + if( beginSubShader > 0 && endSubShader > 0 && endSubShader > beginSubShader ) + { + // ADD A PLACE TO INSERT GRAB PASSES + int passIndex = m_templateBody.IndexOf( TemplatesManager.TemplatePassTag ); + if( passIndex < 0 ) + { + int currIdx = endSubShader - 1; + string identation = string.Empty; + for( ; currIdx > 0; currIdx-- ) + { + if( m_templateBody[ currIdx ] != '\n' ) + { + identation = m_templateBody[ currIdx ] + identation; + } + else + { + identation = m_templateBody[ currIdx ] + identation; + break; + } + } + if( currIdx > 0 ) + { + m_templateBody = m_templateBody.Insert( currIdx, identation + TemplatesManager.TemplatePassTag ); + } + } + + // GET ALL THE MODULES + string subBody = m_templateBody.Substring( beginSubShader, endSubShader - beginSubShader ); + //CULL MODE + { + int cullIdx = subBody.IndexOf( "Cull" ); + if( cullIdx > 0 ) + { + int end = subBody.IndexOf( TemplatesManager.TemplateNewLine, cullIdx ); + string cullParams = subBody.Substring( cullIdx, end - cullIdx ); + m_cullModeData.CullModeId = cullParams; + TemplateHelperFunctions.CreateCullMode( cullParams, ref m_cullModeData ); + if( m_cullModeData.DataCheck == TemplateDataCheck.Valid ) + AddId( cullParams, false, string.Empty ); + } + } + //COLOR MASK + { + int colorMaskIdx = subBody.IndexOf( "ColorMask" ); + if( colorMaskIdx > 0 ) + { + int end = subBody.IndexOf( TemplatesManager.TemplateNewLine, colorMaskIdx ); + string colorMaskParams = subBody.Substring( colorMaskIdx, end - colorMaskIdx ); + m_colorMaskData.ColorMaskId = colorMaskParams; + TemplateHelperFunctions.CreateColorMask( colorMaskParams, ref m_colorMaskData, TemplateHelperFunctions.ColorMaskPattern ); + if( m_colorMaskData.DataCheck == TemplateDataCheck.Valid ) + AddId( colorMaskParams, false ); + } + } + //BlEND MODE + { + int blendModeIdx = subBody.IndexOf( "Blend" ); + if( blendModeIdx > 0 ) + { + int end = subBody.IndexOf( TemplatesManager.TemplateNewLine, blendModeIdx ); + string blendParams = subBody.Substring( blendModeIdx, end - blendModeIdx ); + m_blendData.BlendModeId = blendParams; + TemplateHelperFunctions.CreateBlendMode( blendParams, ref m_blendData, TemplateHelperFunctions.BlendModePattern ); + if( m_blendData.ValidBlendMode ) + { + AddId( blendParams, false ); + } + } + } + //BLEND OP + { + int blendOpIdx = subBody.IndexOf( "BlendOp" ); + if( blendOpIdx > 0 ) + { + int end = subBody.IndexOf( TemplatesManager.TemplateNewLine, blendOpIdx ); + string blendOpParams = subBody.Substring( blendOpIdx, end - blendOpIdx ); + BlendData.BlendOpId = blendOpParams; + TemplateHelperFunctions.CreateBlendOp( blendOpParams, ref m_blendData, TemplateHelperFunctions.BlendOpPattern ); + if( m_blendData.ValidBlendOp ) + { + AddId( blendOpParams, false ); + } + } + + m_blendData.DataCheck = ( m_blendData.ValidBlendMode || m_blendData.ValidBlendOp ) ? TemplateDataCheck.Valid : TemplateDataCheck.Invalid; + } + + //STENCIL + { + int stencilIdx = subBody.IndexOf( "Stencil" ); + if( stencilIdx > -1 ) + { + int stencilEndIdx = subBody.IndexOf( "}", stencilIdx ); + if( stencilEndIdx > 0 ) + { + string stencilParams = subBody.Substring( stencilIdx, stencilEndIdx + 1 - stencilIdx ); + m_stencilData.StencilBufferId = stencilParams; + TemplateHelperFunctions.CreateStencilOps( stencilParams, ref m_stencilData ); + if( m_stencilData.DataCheck == TemplateDataCheck.Valid ) + { + AddId( stencilParams, true ); + } + } + } + } + + //ZWRITE + { + int zWriteOpIdx = subBody.IndexOf( "ZWrite" ); + if( zWriteOpIdx > -1 ) + { + int zWriteEndIdx = subBody.IndexOf( TemplatesManager.TemplateNewLine, zWriteOpIdx ); + if( zWriteEndIdx > 0 ) + { + m_depthData.ZWriteModeId = subBody.Substring( zWriteOpIdx, zWriteEndIdx + 1 - zWriteOpIdx ); + TemplateHelperFunctions.CreateZWriteMode( m_depthData.ZWriteModeId, ref m_depthData ); + if( m_depthData.DataCheck == TemplateDataCheck.Valid ) + { + AddId( m_depthData.ZWriteModeId, true ); + } + } + } + } + + //ZTEST + { + int zTestOpIdx = subBody.IndexOf( "ZTest" ); + if( zTestOpIdx > -1 ) + { + int zTestEndIdx = subBody.IndexOf( TemplatesManager.TemplateNewLine, zTestOpIdx ); + if( zTestEndIdx > 0 ) + { + m_depthData.ZTestModeId = subBody.Substring( zTestOpIdx, zTestEndIdx + 1 - zTestOpIdx ); + TemplateHelperFunctions.CreateZTestMode( m_depthData.ZTestModeId, ref m_depthData ); + if( m_depthData.DataCheck == TemplateDataCheck.Valid ) + { + AddId( m_depthData.ZTestModeId, true ); + } + } + } + } + + //ZOFFSET + { + int zOffsetIdx = subBody.IndexOf( "Offset" ); + if( zOffsetIdx > -1 ) + { + int zOffsetEndIdx = subBody.IndexOf( TemplatesManager.TemplateNewLine, zOffsetIdx ); + if( zOffsetEndIdx > 0 ) + { + m_depthData.OffsetId = subBody.Substring( zOffsetIdx, zOffsetEndIdx + 1 - zOffsetIdx ); + TemplateHelperFunctions.CreateZOffsetMode( m_depthData.OffsetId, ref m_depthData ); + if( m_depthData.DataCheck == TemplateDataCheck.Valid ) + { + AddId( m_depthData.OffsetId, true ); + } + } + } + + m_depthData.SetDataCheck(); + } + + //TAGS + { + int tagsIdx = subBody.IndexOf( "Tags" ); + if( tagsIdx > -1 ) + { + int tagsEndIdx = subBody.IndexOf( "}", tagsIdx ); + if( tagsEndIdx > -1 ) + { + m_tagData.Reset(); + m_tagData.TagsId = subBody.Substring( tagsIdx, tagsEndIdx + 1 - tagsIdx ); + TemplateHelperFunctions.CreateTags( ref m_tagData, true ); + m_tagData.DataCheck = TemplateDataCheck.Valid; + AddId( m_tagData.TagsId, false ); + } + else + { + m_tagData.DataCheck = TemplateDataCheck.Invalid; + } + } + else + { + m_tagData.DataCheck = TemplateDataCheck.Invalid; + } + } + } + } + + void FetchCommonTags() + { + // Name + try + { + int nameBegin = m_templateBody.IndexOf( TemplatesManager.TemplateShaderNameBeginTag ); + if( nameBegin < 0 ) + { + // Not a template + return; + } + + int nameEnd = m_templateBody.IndexOf( TemplatesManager.TemplateFullEndTag, nameBegin ); + int defaultBegin = nameBegin + TemplatesManager.TemplateShaderNameBeginTag.Length; + int defaultLength = nameEnd - defaultBegin; + m_defaultShaderName = m_templateBody.Substring( defaultBegin, defaultLength ); + int[] nameIdx = m_defaultShaderName.AllIndexesOf( "\"" ); + nameIdx[ 0 ] += 1; // Ignore the " character from the string + m_defaultShaderName = m_defaultShaderName.Substring( nameIdx[ 0 ], nameIdx[ 1 ] - nameIdx[ 0 ] ); + m_shaderNameId = m_templateBody.Substring( nameBegin, nameEnd + TemplatesManager.TemplateFullEndTag.Length - nameBegin ); + AddId( m_shaderNameId, false ); + + } + catch( Exception e ) + { + Debug.LogException( e ); + m_isValid = false; + } + + FetchSubShaderProperties(); + // Vertex Data + { + int vertexDataTagBegin = m_templateBody.IndexOf( TemplatesManager.TemplateVertexDataTag ); + if( vertexDataTagBegin > -1 ) + { + m_vertexDataContainer.VertexDataStartIdx = vertexDataTagBegin; + int vertexDataTagEnd = m_templateBody.IndexOf( TemplatesManager.TemplateEndOfLine, vertexDataTagBegin ); + m_vertexDataContainer.VertexDataId = m_templateBody.Substring( vertexDataTagBegin, vertexDataTagEnd + TemplatesManager.TemplateEndOfLine.Length - vertexDataTagBegin ); + int dataBeginIdx = m_templateBody.LastIndexOf( '{', vertexDataTagBegin, vertexDataTagBegin ); + string vertexData = m_templateBody.Substring( dataBeginIdx + 1, vertexDataTagBegin - dataBeginIdx ); + + int parametersBegin = vertexDataTagBegin + TemplatesManager.TemplateVertexDataTag.Length; + string parameters = m_templateBody.Substring( parametersBegin, vertexDataTagEnd - parametersBegin ); + m_vertexDataContainer.VertexData = TemplateHelperFunctions.CreateVertexDataList( vertexData, parameters ); + AddId( m_vertexDataContainer.VertexDataId ); + } + } + + // Available interpolators + try + { + int interpDataBegin = m_templateBody.IndexOf( TemplatesManager.TemplateInterpolatorBeginTag ); + if( interpDataBegin > -1 ) + { + int interpDataEnd = m_templateBody.IndexOf( TemplatesManager.TemplateEndOfLine, interpDataBegin ); + string interpDataId = m_templateBody.Substring( interpDataBegin, interpDataEnd + TemplatesManager.TemplateEndOfLine.Length - interpDataBegin ); + + int dataBeginIdx = m_templateBody.LastIndexOf( '{', interpDataBegin, interpDataBegin ); + string interpData = m_templateBody.Substring( dataBeginIdx + 1, interpDataBegin - dataBeginIdx ); + + m_interpolatorDataContainer = TemplateHelperFunctions.CreateInterpDataList( interpData, interpDataId, 8 ); + m_interpolatorDataContainer.InterpDataId = interpDataId; + m_interpolatorDataContainer.InterpDataStartIdx = interpDataBegin; + AddId( interpDataId ); + } + } + catch( Exception e ) + { + Debug.LogException( e ); + m_isValid = false; + } + + + try + { + Dictionary duplicatesHelper = new Dictionary(); + m_availableShaderProperties = new List(); + + // Common Tags + for( int i = 0; i < TemplatesManager.CommonTags.Length; i++ ) + { + int idx = m_templateBody.IndexOf( TemplatesManager.CommonTags[ i ].Id ); + if( idx > -1 ) + { + string currentId = TemplatesManager.CommonTags[ i ].Id; + + TemplateCommonTagId commonTagId = (TemplateCommonTagId)i; + switch( commonTagId ) + { + // Properties + case TemplateCommonTagId.Property: + { + TemplateHelperFunctions.CreateShaderPropertiesList( m_templateBody.Substring( 0, idx + TemplatesManager.CommonTags[ i ].Id.Length ), ref m_availableShaderProperties, ref duplicatesHelper,-1,-1 ); + } + break; + // Globals + case TemplateCommonTagId.Global: + { + TemplateHelperFunctions.CreateShaderGlobalsList( m_templateBody.Substring( 0, idx + TemplatesManager.CommonTags[ i ].Id.Length ), ref m_availableShaderProperties, ref duplicatesHelper,-1,-1 ); + } + break; + + //Tags + //case TemplateCommonTagId.Tag: + //{ + // m_propertyList[ m_propertyList.Count - 1 ].Indentation = " "; + //} + //break; + //case TemplateCommonTagId.CullMode: + //{ + // int newId = idx + TemplatesManager.CommonTags[ i ].Id.Length; + // int end = m_templateBody.IndexOf( TemplatesManager.TemplateNewLine, newId ); + // string cullParams = m_templateBody.Substring( newId, end - newId ); + // currentId = m_templateBody.Substring( idx, end - idx ); + // m_cullModeData.CullModeId = currentId; + // TemplateHelperFunctions.CreateCullMode( cullParams, ref m_cullModeData ); + //} + //break; + //Blend Mode + //case TemplateCommonTagId.BlendMode: + //{ + // int newId = idx + TemplatesManager.CommonTags[ i ].Id.Length; + // int end = m_templateBody.IndexOf( TemplatesManager.TemplateNewLine, newId ); + // string blendParams = m_templateBody.Substring( newId, end - newId ); + // currentId = m_templateBody.Substring( idx, end - idx ); + // m_blendData.BlendModeId = currentId; + // TemplateHelperFunctions.CreateBlendMode( blendParams, ref m_blendData ); + //}break; + //case TemplateCommonTagId.BlendOp: + //{ + // int newId = idx + TemplatesManager.CommonTags[ i ].Id.Length; + // int end = m_templateBody.IndexOf( TemplatesManager.TemplateNewLine, newId ); + // currentId = m_templateBody.Substring( idx, end - idx ); + // BlendData.BlendOpId = currentId; + // TemplateHelperFunctions.CreateBlendOp( m_templateBody.Substring( newId, end - newId ), ref m_blendData ); + //}break; + //case TemplateCommonTagId.ColorMask: + //{ + // int newId = idx + TemplatesManager.CommonTags[ i ].Id.Length; + // int end = m_templateBody.IndexOf( TemplatesManager.TemplateNewLine, newId ); + // string colorMaskParams = m_templateBody.Substring( newId, end - newId ); + // currentId = m_templateBody.Substring( idx, end - idx ); + // m_colorMaskData.ColorMaskId = currentId; + // TemplateHelperFunctions.CreateColorMask( colorMaskParams, ref m_colorMaskData ); + //} + //break; + //case TemplateCommonTagId.StencilOp: + //{ + // int id = m_templateBody.LastIndexOf( "Stencil" ); + // if( id > -1 ) + // { + // string stencilParams = m_templateBody.Substring( id, idx - id ); + // currentId = stencilParams + TemplatesManager.TemplateStencilOpTag; + // m_stencilData.StencilBufferId = currentId; + // TemplateHelperFunctions.CreateStencilOps( stencilParams, ref m_stencilData ); + // } + + //} + //break; + default: + break; + } + + //AddId( TemplatesManager.CommonTags[ i ] ); + AddId( currentId, TemplatesManager.CommonTags[ i ].SearchIndentation, TemplatesManager.CommonTags[ i ].CustomIndentation ); + } + } + + duplicatesHelper.Clear(); + duplicatesHelper = null; + } + catch( Exception e ) + { + Debug.LogException( e ); + m_isValid = false; + } + } + + void FetchCodeAreas( string begin, MasterNodePortCategory category ) + { + int areaBeginIndexes = m_templateBody.IndexOf( begin ); + + if( areaBeginIndexes > -1 ) + { + int beginIdx = areaBeginIndexes + begin.Length; + int endIdx = m_templateBody.IndexOf( TemplatesManager.TemplateEndOfLine, beginIdx ); + int length = endIdx - beginIdx; + + string parameters = m_templateBody.Substring( beginIdx, length ); + + string[] parametersArr = parameters.Split( IOUtils.FIELD_SEPARATOR ); + + string id = m_templateBody.Substring( areaBeginIndexes, endIdx + TemplatesManager.TemplateEndOfLine.Length - areaBeginIndexes ); + string inParameters = parametersArr[ 0 ]; + string outParameters = ( parametersArr.Length > 1 ) ? parametersArr[ 1 ] : string.Empty; + if( category == MasterNodePortCategory.Fragment ) + { + m_fragmentFunctionData = new TemplateFunctionData(-1, string.Empty, id, areaBeginIndexes, inParameters, outParameters, category ); + } + else + { + m_vertexFunctionData = new TemplateFunctionData( -1, string.Empty,id, areaBeginIndexes, inParameters, outParameters, category ); + } + AddId( id, true ); + } + } + + void FetchInputs( MasterNodePortCategory portCategory ) + { + string beginTag = ( portCategory == MasterNodePortCategory.Fragment ) ? TemplatesManager.TemplateInputsFragBeginTag : TemplatesManager.TemplateInputsVertBeginTag; + int[] inputBeginIndexes = m_templateBody.AllIndexesOf( beginTag ); + if( inputBeginIndexes != null && inputBeginIndexes.Length > 0 ) + { + for( int i = 0; i < inputBeginIndexes.Length; i++ ) + { + int inputEndIdx = m_templateBody.IndexOf( TemplatesManager.TemplateEndSectionTag, inputBeginIndexes[ i ] ); + int defaultValueBeginIdx = inputEndIdx + TemplatesManager.TemplateEndSectionTag.Length; + int endLineIdx = m_templateBody.IndexOf( TemplatesManager.TemplateFullEndTag, defaultValueBeginIdx ); + + string defaultValue = m_templateBody.Substring( defaultValueBeginIdx, endLineIdx - defaultValueBeginIdx ); + string tagId = m_templateBody.Substring( inputBeginIndexes[ i ], endLineIdx + TemplatesManager.TemplateFullEndTag.Length - inputBeginIndexes[ i ] ); + + int beginIndex = inputBeginIndexes[ i ] + beginTag.Length; + int length = inputEndIdx - beginIndex; + string inputData = m_templateBody.Substring( beginIndex, length ); + string[] inputDataArray = inputData.Split( IOUtils.FIELD_SEPARATOR ); + if( inputDataArray != null && inputDataArray.Length > 0 ) + { + try + { + string portName = inputDataArray[ (int)TemplatePortIds.Name ]; + WirePortDataType dataType = (WirePortDataType)Enum.Parse( typeof( WirePortDataType ), inputDataArray[ (int)TemplatePortIds.DataType ].ToUpper() ); + + int portUniqueIDArrIdx = (int)TemplatePortIds.UniqueId; + int portUniqueId = ( portUniqueIDArrIdx < inputDataArray.Length ) ? Convert.ToInt32( inputDataArray[ portUniqueIDArrIdx ] ) : -1; + if( portUniqueId < 0 ) + portUniqueId = m_inputDataList.Count; + + int portOrderArrayIdx = (int)TemplatePortIds.OrderId; + int portOrderId = ( portOrderArrayIdx < inputDataArray.Length ) ? Convert.ToInt32( inputDataArray[ portOrderArrayIdx ] ) : -1; + if( portOrderId < 0 ) + portOrderId = m_inputDataList.Count; + + AddInput( inputBeginIndexes[ i ], tagId, portName, defaultValue, dataType, portCategory, portUniqueId, portOrderId ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + } + } + } + + //void FetchSnippets() + //{ + // int[] codeSnippetAttribBeginIndexes = m_templateBody.AllIndexesOf( TemplatesManager.TemplateCodeSnippetAttribBegin ); + // int[] codeSnippetAttribEndIndexes = m_templateBody.AllIndexesOf( TemplatesManager.TemplateCodeSnippetAttribEnd ); + // int[] codeSnippetEndIndexes = m_templateBody.AllIndexesOf( TemplatesManager.TemplateCodeSnippetEnd ); + + // if( codeSnippetAttribBeginIndexes != null && codeSnippetAttribBeginIndexes.Length > 0 && + // codeSnippetAttribEndIndexes != null && codeSnippetAttribEndIndexes.Length > 0 && + // codeSnippetEndIndexes != null && codeSnippetEndIndexes.Length > 0 && + // codeSnippetEndIndexes.Length == codeSnippetAttribBeginIndexes.Length && + // codeSnippetAttribBeginIndexes.Length == codeSnippetAttribEndIndexes.Length ) + // { + // for( int i = 0; i < codeSnippetAttribBeginIndexes.Length; i++ ) + // { + // // get attributes + // int startAttribIndex = codeSnippetAttribBeginIndexes[ i ] + TemplatesManager.TemplateCodeSnippetAttribBegin.Length; + // int lengthAttrib = codeSnippetAttribEndIndexes[ i ] - startAttribIndex; + // string snippetAttribs = m_templateBody.Substring( startAttribIndex, lengthAttrib ); + // string[] snippetAttribsArr = snippetAttribs.Split( IOUtils.FIELD_SEPARATOR ); + // if( snippetAttribsArr != null && snippetAttribsArr.Length > 0 ) + // { + // string attribName = snippetAttribsArr[ (int)TemplateCodeSnippetInfoIdx.Name ]; + // TemplateCodeSnippetType attribType = (TemplateCodeSnippetType)Enum.Parse( typeof( TemplateCodeSnippetType ), snippetAttribsArr[ (int)TemplateCodeSnippetInfoIdx.Type ] ); + // if( m_snippetElementsDict.ContainsKey( attribName ) ) + // { + // if( m_snippetElementsDict[ attribName ].Type != attribType ) + // { + // if( DebugConsoleWindow.DeveloperMode ) + // Debug.LogWarning( "Found incompatible types for snippet " + attribName ); + // } + // } + // else + // { + // switch( attribType ) + // { + // case TemplateCodeSnippetType.Toggle: + // { + // //Register must be done by first instantiang the correct type and register it on both containers + // //Overrides don't work if we use the container reference into the other + // TemplateCodeSnippetToggle newSnippet = ScriptableObject.CreateInstance(); + // newSnippet.Init( attribName, attribType ); + // m_snippetElementsDict.Add( attribName, newSnippet ); + // m_snippetElementsList.Add( newSnippet ); + // } + // break; + // } + + // } + // // Add initial tag indentation + // int indentationIndex = codeSnippetAttribBeginIndexes[ i ]; + // int lengthAdjust = 0; + // for( ; indentationIndex > 0; indentationIndex--, lengthAdjust++ ) + // { + // if( m_templateBody[ indentationIndex ] == TemplatesManager.TemplateNewLine ) + // { + // indentationIndex += 1; + // lengthAdjust -= 1; + // break; + // } + // } + + // if( indentationIndex > 0 ) + // { + // string snippetId = m_templateBody.Substring( indentationIndex, + // codeSnippetEndIndexes[ i ] + TemplatesManager.TemplateCodeSnippetEnd.Length - codeSnippetAttribBeginIndexes[ i ] + lengthAdjust ); + + // int snippetCodeStart = codeSnippetAttribEndIndexes[ i ] + TemplatesManager.TemplateCodeSnippetAttribEnd.Length; + // int snippetCodeLength = codeSnippetEndIndexes[ i ] - snippetCodeStart; + // //Remove possible identation characters present between tag and last instruction + // if( m_templateBody[ snippetCodeStart + snippetCodeLength - 1 ] != TemplatesManager.TemplateNewLine ) + // { + // for( ; snippetCodeLength > 0; snippetCodeLength-- ) + // { + // if( m_templateBody[ snippetCodeStart + snippetCodeLength - 1 ] == TemplatesManager.TemplateNewLine ) + // break; + // } + // } + + // if( snippetCodeLength > 0 ) + // { + // string snippetCode = m_templateBody.Substring( snippetCodeStart, snippetCodeLength ); + // TemplateCodeSnippetElement element = new TemplateCodeSnippetElement( snippetId, snippetCode ); + // m_snippetElementsDict[ attribName ].AddSnippet( element ); + // } + // } + // } + // } + // } + //} + + //void RefreshSnippetInfo() + //{ + // if( m_snippetElementsDict == null ) + // { + // m_snippetElementsDict = new Dictionary(); + // } + + // if( m_snippetElementsDict.Count != m_snippetElementsList.Count ) + // { + // m_snippetElementsDict.Clear(); + // for( int i = 0; i < m_snippetElementsList.Count; i++ ) + // { + // m_snippetElementsDict.Add( m_snippetElementsList[ i ].NameId, m_snippetElementsList[ i ] ); + // } + // } + //} + + //public void DrawSnippetProperties( ParentNode owner ) + //{ + // for( int i = 0; i < m_snippetElementsList.Count; i++ ) + // { + // m_snippetElementsList[ i ].DrawProperties( owner ); + // } + //} + + //public void InsertSnippets( ref string shaderBody ) + //{ + // for( int i = 0; i < m_snippetElementsList.Count; i++ ) + // { + // m_snippetElementsList[ i ].InsertSnippet( ref shaderBody ); + // } + //} + + public void AddId( string ID, bool searchIndentation = true ) + { + AddId( ID, searchIndentation, string.Empty ); + } + + public void AddId( string ID, bool searchIndentation, string customIndentation ) + { + int propertyIndex = m_templateBody.IndexOf( ID ); + if( propertyIndex > -1 ) + { + if( searchIndentation ) + { + int indentationIndex = -1; + for( int i = propertyIndex; i > 0; i-- ) + { + if( m_templateBody[ i ] == TemplatesManager.TemplateNewLine ) + { + indentationIndex = i + 1; + break; + } + } + if( indentationIndex > -1 ) + { + int length = propertyIndex - indentationIndex; + string indentation = ( length > 0 ) ? m_templateBody.Substring( indentationIndex, length ) : string.Empty; + m_propertyList.Add( new TemplateProperty( ID, indentation, false ) ); + } + } + else + { + m_propertyList.Add( new TemplateProperty( ID, customIndentation, true ) ); + } + } + } + + void BuildInfo() + { + if( m_propertyDict == null ) + { + m_propertyDict = new Dictionary(); + } + + if( m_propertyList.Count != m_propertyDict.Count ) + { + m_propertyDict.Clear(); + for( int i = 0; i < m_propertyList.Count; i++ ) + { + m_propertyDict.Add( m_propertyList[ i ].Id, m_propertyList[ i ] ); + } + } + } + + public void ResetTemplateUsageData() + { + BuildInfo(); + for( int i = 0; i < m_propertyList.Count; i++ ) + { + m_propertyList[ i ].Used = false; + } + } + + public void AddInput( int tagStartIdx, string tagId, string portName, string defaultValue, WirePortDataType dataType, MasterNodePortCategory portCategory, int portUniqueId, int portOrderId ) + { + TemplateInputData inputData = new TemplateInputData( tagStartIdx, tagStartIdx, tagId, portName, defaultValue, dataType, portCategory, portUniqueId, portOrderId, string.Empty ); + m_inputDataList.Add( inputData ); + m_inputDataDict.Add( inputData.PortUniqueId, inputData ); + AddId( tagId, false ); + } + + public override void Destroy() + { + if( m_vertexDataContainer != null ) + { + m_vertexDataContainer.Destroy(); + m_vertexDataContainer = null; + } + + if( m_interpolatorDataContainer != null ) + { + m_interpolatorDataContainer.Destroy(); + m_interpolatorDataContainer = null; + } + + if( m_availableShaderProperties != null ) + { + m_availableShaderProperties.Clear(); + m_availableShaderProperties = null; + } + + if( m_propertyDict != null ) + { + m_propertyDict.Clear(); + m_propertyDict = null; + } + + if( m_propertyList != null ) + { + m_propertyList.Clear(); + m_propertyList = null; + } + + if( m_inputDataDict != null ) + { + m_inputDataDict.Clear(); + m_inputDataDict = null; + } + + if( m_inputDataList != null ) + { + m_inputDataList.Clear(); + m_inputDataList = null; + } + + if( m_localVarsList != null ) + { + m_localVarsList.Clear(); + m_localVarsList = null; + } + //if( m_snippetElementsDict != null ) + //{ + // m_snippetElementsDict.Clear(); + // m_snippetElementsDict = null; + //} + + //if( m_snippetElementsList != null ) + //{ + // for( int i = 0; i < m_snippetElementsList.Count; i++ ) + // { + // GameObject.DestroyImmediate( m_snippetElementsList[ i ] ); + // m_snippetElementsList[ i ] = null; + // } + // m_snippetElementsList.Clear(); + // m_snippetElementsList = null; + //} + + m_alphaToMaskData = null; + m_cullModeData = null; + m_blendData = null; + m_colorMaskData = null; + m_stencilData = null; + if( m_tagData != null ) + { + m_tagData.Destroy(); + m_tagData = null; + } + } + + public void FillEmptyTags( ref string body ) + { + body = body.Replace( TemplatesManager.TemplateLocalVarTag, string.Empty ); + for( int i = 0; i < m_propertyList.Count; i++ ) + { + if( !m_propertyList[ i ].Used ) + { + if( m_propertyList[ i ].UseCustomIndentation ) + { + body = body.Replace( m_propertyList[ i ].Id, string.Empty ); + } + else + { + body = body.Replace( m_propertyList[ i ].Indentation + m_propertyList[ i ].Id, string.Empty ); + } + } + } + } + + public bool FillVertexInstructions( ref string body, params string[] values ) + { + if( m_vertexFunctionData != null && !string.IsNullOrEmpty( m_vertexFunctionData.Id ) ) + { + return FillTemplateBody( m_vertexFunctionData.Id, ref body, values ); + } + + if( values.Length > 0 ) + { + UIUtils.ShowMessage( "Attemping to add vertex instructions on a template with no assigned vertex code area", MessageSeverity.Error ); + return false; + } + return true; + } + + public bool FillFragmentInstructions( ref string body, params string[] values ) + { + if( m_fragmentFunctionData != null && !string.IsNullOrEmpty( m_fragmentFunctionData.Id ) ) + { + return FillTemplateBody( m_fragmentFunctionData.Id, ref body, values ); + } + + if( values.Length > 0 ) + { + UIUtils.ShowMessage( "Attemping to add fragment instructions on a template with no assigned vertex code area", MessageSeverity.Error ); + return false; + } + return true; + } + + // values must be unindented an without line feed + public bool FillTemplateBody( string id, ref string body, params string[] values ) + { + if( values.Length == 0 ) + { + return true; + } + + BuildInfo(); + + if( m_propertyDict.ContainsKey( id ) ) + { + string finalValue = string.Empty; + for( int i = 0; i < values.Length; i++ ) + { + + if( m_propertyDict[ id ].AutoLineFeed ) + { + string[] valuesArr = values[ i ].Split( '\n' ); + for( int j = 0; j < valuesArr.Length; j++ ) + { + //first value will be automatically indented by the string replace + finalValue += ( ( i == 0 && j == 0 ) ? string.Empty : m_propertyDict[ id ].Indentation ) + valuesArr[ j ]; + finalValue += TemplatesManager.TemplateNewLine; + } + + } + else + { + //first value will be automatically indented by the string replace + finalValue += ( i == 0 ? string.Empty : m_propertyDict[ id ].Indentation ) + values[ i ]; + } + } + + body = body.Replace( id, finalValue ); + m_propertyDict[ id ].Used = true; + return true; + } + + if( values.Length > 1 || !string.IsNullOrEmpty( values[ 0 ] ) ) + { + UIUtils.ShowMessage( string.Format( "Attempting to write data into inexistant tag {0}. Please review the template {1} body and consider adding the missing tag.", id, m_name ), MessageSeverity.Error ); + return false; + } + + return true; + + } + + public bool FillTemplateBody( string id, ref string body, List values ) + { + if( values.Count == 0 ) + { + return true; + } + + string[] array = new string[ values.Count ]; + for( int i = 0; i < values.Count; i++ ) + { + array[ i ] = values[ i ].PropertyName; + } + return FillTemplateBody( id, ref body, array ); + } + + public TemplateInputData InputDataFromId( int id ) + { + if( m_inputDataDict == null ) + m_inputDataDict = new Dictionary(); + + if( m_inputDataDict.Count != m_inputDataList.Count ) + { + m_inputDataDict.Clear(); + for( int i = 0; i < m_inputDataList.Count; i++ ) + { + m_inputDataDict.Add( m_inputDataList[ i ].PortUniqueId, m_inputDataList[ i ] ); + } + } + + if( m_inputDataDict.ContainsKey( id ) ) + return m_inputDataDict[ id ]; + + return null; + } + + public string GetVertexData( TemplateInfoOnSematics info ) + { + int count = m_vertexDataContainer.VertexData.Count; + for( int i = 0; i < count; i++ ) + { + if( m_vertexDataContainer.VertexData[ i ].DataInfo == info ) + { + return string.Format( TemplateHelperFunctions.TemplateVarFormat, m_vertexFunctionData.InVarName, m_vertexDataContainer.VertexData[ i ].VarName ); + } + } + return string.Empty; + } + + public string GetInterpolatedData( TemplateInfoOnSematics info ) + { + int count = m_interpolatorDataContainer.Interpolators.Count; + for( int i = 0; i < count; i++ ) + { + if( m_interpolatorDataContainer.Interpolators[ i ].DataInfo == info ) + { + return string.Format( TemplateHelperFunctions.TemplateVarFormat, m_fragmentFunctionData.InVarName, m_interpolatorDataContainer.Interpolators[ i ].VarName ); + } + } + return string.Empty; + } + + public string InterpDataId { get { return m_interpolatorDataContainer.InterpDataId; } } + public string VertexDataId { get { return m_vertexDataContainer.VertexDataId; } } + public string ShaderNameId { get { return m_shaderNameId; } set { m_shaderNameId = value; } } + public string TemplateBody { get { return m_templateBody; } set { m_templateBody = value; } } + public List InputDataList { get { return m_inputDataList; } set { m_inputDataList = value; } } + public List LocalVarsList { get { return m_localVarsList; } } + public List VertexDataList { get { return m_vertexDataContainer.VertexData; } } + public TemplateInterpData InterpolatorData { get { return m_interpolatorDataContainer; } } + public TemplateFunctionData VertexFunctionData { get { return m_vertexFunctionData; } set { m_vertexFunctionData = value; } } + public TemplateFunctionData FragmentFunctionData { get { return m_fragmentFunctionData; } set { m_fragmentFunctionData = value; } } + public List AvailableShaderProperties { get { return m_availableShaderProperties; } set { m_availableShaderProperties = value; } } + public TemplateBlendData BlendData { get { return m_blendData; } set { m_blendData = value; } } + public TemplateAlphaToMaskData AlphaToMaskData { get { return m_alphaToMaskData; } set { m_alphaToMaskData = value; } } + public TemplateCullModeData CullModeData { get { return m_cullModeData; } set { m_cullModeData = value; } } + public TemplateColorMaskData ColorMaskData { get { return m_colorMaskData; } set { m_colorMaskData = value; } } + public TemplateStencilData StencilData { get { return m_stencilData; } set { m_stencilData = value; } } + public TemplateDepthData DepthData { get { return m_depthData; } set { m_depthData = value; } } + public TemplateTagsModuleData TagData { get { return m_tagData; } set { m_tagData = value; } } + private List PropertyList { get { return m_propertyList; } set { m_propertyList = value; } } + public VertexDataContainer VertexDataContainer { get { return m_vertexDataContainer; } set { m_vertexDataContainer = value; } } + public TemplateInterpData InterpolatorDataContainer { get { return m_interpolatorDataContainer; } set { m_interpolatorDataContainer = value; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateData.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateData.cs.meta new file mode 100644 index 0000000..2002009 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateData.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b03340e569366ae4dbd502e14c62e225 +timeCreated: 1493904667 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateDataCollector.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateDataCollector.cs new file mode 100644 index 0000000..6b0ad6d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateDataCollector.cs @@ -0,0 +1,2104 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System; + +namespace AmplifyShaderEditor +{ + public enum NormalizeType + { + Off, + Regular, + Safe + } + + public class InterpDataHelper + { + public string VarName; + public WirePortDataType VarType; + public bool IsSingleComponent; + public bool SetAtCompileTime; + public InterpDataHelper( WirePortDataType varType, string varName, bool isSingleComponent = true , bool setAtCompileTime = false ) + { + VarName = varName; + VarType = varType; + IsSingleComponent = isSingleComponent; + SetAtCompileTime = setAtCompileTime; + } + } + + public class TemplateCustomData + { + public WirePortDataType DataType; + public string Name; + public bool IsVertex; + public bool IsFragment; + public TemplateCustomData( string name, WirePortDataType dataType ) + { + name = Name; + DataType = dataType; + IsVertex = false; + IsFragment = false; + } + } + + public class TemplateInputParameters + { + public WirePortDataType Type; + public string Name; + public string Declaration; + public TemplateSemantics Semantic; + public TemplateInputParameters( WirePortDataType type, PrecisionType precision, string name, TemplateSemantics semantic, string custom = null ) + { + Type = type; + Name = name; + Semantic = semantic; + Declaration = string.Format( "{0} {1} : {2}", UIUtils.PrecisionWirePortToCgType( precision, type ), Name, Semantic ); + if( !string.IsNullOrEmpty( custom ) ) + Declaration = custom; + } + } + + public class TemplateDataCollector + { +#if UNITY_2018_2_OR_NEWER + private const int MaxUV = 8; + private int[] m_UVUsage = { 0, 0, 0, 0, 0, 0, 0, 0 }; +#else + private const int MaxUV = 4; + private int[] m_UVUsage = { 0, 0, 0, 0 }; +#endif + private int m_multipassSubshaderIdx = 0; + private int m_multipassPassIdx = 0; + private TemplateMultiPass m_currentTemplate; + private TemplateSRPType m_currentSRPType = TemplateSRPType.BuiltIn; + + private Dictionary m_customInterpolatedData; + private Dictionary m_registeredVertexData; + + private Dictionary m_availableFragData; + private Dictionary m_availableVertData; + private TemplateInterpData m_interpolatorData; + private Dictionary m_vertexDataDict; + private TemplateData m_currentTemplateData; + private MasterNodeDataCollector m_currentDataCollector; + public Dictionary m_vertexInputParams; + public Dictionary m_fragmentInputParams; + + private Dictionary m_specialVertexLocalVars; + private Dictionary m_specialFragmentLocalVars; + + private List m_lateDirectivesList = new List(); + private Dictionary m_lateDirectivesDict = new Dictionary(); + + private List m_srpBatcherPropertiesList = new List(); + private List m_fullSrpBatcherPropertiesList = new List(); + private Dictionary m_srpBatcherPropertiesDict = new Dictionary(); + + public void CopySRPPropertiesFromDataCollector( int nodeId, TemplateDataCollector dataCollector ) + { + for( int i = 0; i < dataCollector.SrpBatcherPropertiesList.Count; i++ ) + { + AddSRPBatcherProperty( nodeId, dataCollector.SrpBatcherPropertiesList[ i ].PropertyName ); + } + } + + public void AddSRPBatcherProperty( int nodeID, string property ) + { + if( !m_srpBatcherPropertiesDict.ContainsKey( property ) ) + { + PropertyDataCollector newValue = new PropertyDataCollector( nodeID, property ); + m_srpBatcherPropertiesDict.Add( property, newValue ); + m_srpBatcherPropertiesList.Add( newValue ); + } + } + + public void SetUVUsage( int uv, WirePortDataType type ) + { + if( uv >= 0 && uv < MaxUV ) + { + m_UVUsage[ uv ] = Mathf.Max( m_UVUsage[ uv ], TemplateHelperFunctions.DataTypeChannelUsage[ type ] ); + } + } + + public void SetUVUsage( int uv, int size ) + { + if( uv >= 0 && uv < MaxUV ) + { + m_UVUsage[ uv ] = Mathf.Max( m_UVUsage[ uv ], size ); + } + } + + public void CloseLateDirectives() + { + if( m_lateDirectivesList.Count > 0 ) + { + m_lateDirectivesList.Add( new PropertyDataCollector( -1, string.Empty ) ); + } + } + + public void AddHDLightInfo() + { +#if !UNITY_2018_3_OR_NEWER + AddLateDirective( AdditionalLineType.Custom, "#if (SHADERPASS != SHADERPASS_FORWARD) //On forward this info is already included" ); + AddLateDirective( AdditionalLineType.Include, "HDRP/Lighting/LightDefinition.cs.hlsl" ); + AddLateDirective( AdditionalLineType.Include, "HDRP/Lighting/LightLoop/Shadow.hlsl" ); + AddLateDirective( AdditionalLineType.Include, "HDRP/Lighting/LightLoop/LightLoopDef.hlsl" ); + AddLateDirective( AdditionalLineType.Custom, "#endif // End of light info includes" ); +#endif + } + + public void AddLateDirective( AdditionalLineType type, string value ) + { + + if( !m_lateDirectivesDict.ContainsKey( value ) ) + { + string formattedValue = string.Empty; + switch( type ) + { + case AdditionalLineType.Include: formattedValue = string.Format( Constants.IncludeFormat, value ); break; + case AdditionalLineType.Define: formattedValue = string.Format( Constants.DefineFormat, value ); break; + case AdditionalLineType.Pragma: formattedValue = string.Format( Constants.PragmaFormat, value ); break; + case AdditionalLineType.Custom: formattedValue = value; break; + } + PropertyDataCollector property = new PropertyDataCollector( -1, formattedValue ); + m_lateDirectivesDict.Add( value, property ); + m_lateDirectivesList.Add( property ); + } + } + + public void SetMultipassInfo( TemplateMultiPass currentTemplate, int subShaderIdx, int passIdx, TemplateSRPType currentSRPType ) + { + m_currentTemplate = currentTemplate; + m_multipassSubshaderIdx = subShaderIdx; + m_multipassPassIdx = passIdx; + m_currentSRPType = currentSRPType; + } + + public bool HasDirective( AdditionalLineType type, string value ) + { + switch( type ) + { + case AdditionalLineType.Include: + { + return m_currentTemplate.SubShaders[ m_multipassSubshaderIdx ].Modules.IncludePragmaContainer.HasInclude( value ) || + m_currentTemplate.SubShaders[ m_multipassSubshaderIdx ].Passes[ m_multipassPassIdx ].Modules.IncludePragmaContainer.HasInclude( value ); + } + case AdditionalLineType.Define: + { + return m_currentTemplate.SubShaders[ m_multipassSubshaderIdx ].Modules.IncludePragmaContainer.HasDefine( value ) || + m_currentTemplate.SubShaders[ m_multipassSubshaderIdx ].Passes[ m_multipassPassIdx ].Modules.IncludePragmaContainer.HasDefine( value ); + } + case AdditionalLineType.Pragma: + { + return m_currentTemplate.SubShaders[ m_multipassSubshaderIdx ].Modules.IncludePragmaContainer.HasPragma( value ) || + m_currentTemplate.SubShaders[ m_multipassSubshaderIdx ].Passes[ m_multipassPassIdx ].Modules.IncludePragmaContainer.HasPragma( value ); + } + } + + return false; + } + + public void FillSpecialVariables( TemplatePass currentPass ) + { + m_specialVertexLocalVars = new Dictionary(); + m_specialFragmentLocalVars = new Dictionary(); + int localVarAmount = currentPass.LocalVarsList.Count; + for( int i = 0; i < localVarAmount; i++ ) + { + if( currentPass.LocalVarsList[ i ].IsSpecialVar ) + { + if( currentPass.LocalVarsList[ i ].Category == MasterNodePortCategory.Vertex ) + { + m_specialVertexLocalVars.Add( currentPass.LocalVarsList[ i ].SpecialVarType, currentPass.LocalVarsList[ i ] ); + } + else + { + m_specialFragmentLocalVars.Add( currentPass.LocalVarsList[ i ].SpecialVarType, currentPass.LocalVarsList[ i ] ); + } + } + } + } + + public void BuildFromTemplateData( MasterNodeDataCollector dataCollector, TemplateData templateData ) + { + m_registeredVertexData = new Dictionary(); + m_customInterpolatedData = new Dictionary(); + + + m_currentDataCollector = dataCollector; + m_currentTemplateData = templateData; + + m_vertexDataDict = new Dictionary(); + if( templateData.VertexDataList != null ) + { + for( int i = 0; i < templateData.VertexDataList.Count; i++ ) + { + m_vertexDataDict.Add( templateData.VertexDataList[ i ].Semantics, new TemplateVertexData( templateData.VertexDataList[ i ] ) ); + } + } + + m_availableFragData = new Dictionary(); + if( templateData.InterpolatorData != null && templateData.FragmentFunctionData != null ) + { + m_interpolatorData = new TemplateInterpData( templateData.InterpolatorData ); + int fragCount = templateData.InterpolatorData.Interpolators.Count; + for( int i = 0; i < fragCount; i++ ) + { + string varName = string.Empty; + if( templateData.InterpolatorData.Interpolators[ i ].ExcludeStructPrefix ) + { + varName = templateData.InterpolatorData.Interpolators[ i ].VarName; + } + else if( templateData.InterpolatorData.Interpolators[ i ].IsSingleComponent ) + { + varName = string.Format( TemplateHelperFunctions.TemplateVarFormat, + templateData.FragmentFunctionData.InVarName, + templateData.InterpolatorData.Interpolators[ i ].VarNameWithSwizzle ); + } + else + { + varName = string.Format( templateData.InterpolatorData.Interpolators[ i ].VarNameWithSwizzle, templateData.FragmentFunctionData.InVarName ); + } + + m_availableFragData.Add( templateData.InterpolatorData.Interpolators[ i ].DataInfo, + new InterpDataHelper( templateData.InterpolatorData.Interpolators[ i ].SwizzleType, + varName, + templateData.InterpolatorData.Interpolators[ i ].IsSingleComponent ) ); + } + } + + + m_availableVertData = new Dictionary(); + if( templateData.VertexFunctionData != null && templateData.VertexDataList != null ) + { + int vertCount = templateData.VertexDataList.Count; + for( int i = 0; i < vertCount; i++ ) + { + string varName = string.Empty; + if( templateData.VertexDataList[ i ].ExcludeStructPrefix ) + { + varName = templateData.VertexDataList[ i ].VarName; + } + else + { + varName = string.Format( TemplateHelperFunctions.TemplateVarFormat, templateData.VertexFunctionData.InVarName, templateData.VertexDataList[ i ].VarNameWithSwizzle ); + } + + m_availableVertData.Add( templateData.VertexDataList[ i ].DataInfo, + new InterpDataHelper( templateData.VertexDataList[ i ].SwizzleType, + varName, + templateData.VertexDataList[ i ].IsSingleComponent ) ); + } + } + } + + public void RegisterFragInputParams( WirePortDataType type, PrecisionType precision, string name, TemplateSemantics semantic, string custom ) + { + if( m_fragmentInputParams == null ) + m_fragmentInputParams = new Dictionary(); + + m_fragmentInputParams.Add( semantic, new TemplateInputParameters( type, precision, name, semantic, custom ) ); + } + + public void RegisterFragInputParams( WirePortDataType type, PrecisionType precision, string name, TemplateSemantics semantic ) + { + if( m_fragmentInputParams == null ) + m_fragmentInputParams = new Dictionary(); + + m_fragmentInputParams.Add( semantic, new TemplateInputParameters( type, precision, name, semantic ) ); + } + + public void RegisterVertexInputParams( WirePortDataType type, PrecisionType precision, string name, TemplateSemantics semantic ) + { + if( m_vertexInputParams == null ) + m_vertexInputParams = new Dictionary(); + + m_vertexInputParams.Add( semantic, new TemplateInputParameters( type, precision, name, semantic ) ); + } + + public string GetVertexId() + { + var precision = PrecisionType.Float; + bool useMasterNodeCategory = true; + MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment; + + WirePortDataType type = WirePortDataType.UINT; + if( HasInfo( TemplateInfoOnSematics.VERTEXID, useMasterNodeCategory, customCategory ) ) + { + InterpDataHelper info = GetInfo( TemplateInfoOnSematics.VERTEXID, useMasterNodeCategory, customCategory ); + return TemplateHelperFunctions.AutoSwizzleData( info.VarName, info.VarType, type, true ); + } + else + { + MasterNodePortCategory portCategory = useMasterNodeCategory ? m_currentDataCollector.PortCategory : customCategory; + string name = "ase_vertexID"; + return RegisterInfoOnSemantic( portCategory, TemplateInfoOnSematics.VERTEXID, TemplateSemantics.SV_VertexID, name, WirePortDataType.UINT, precision, true ); + } + + // need to review this later + //if( m_vertexInputParams != null && m_vertexInputParams.ContainsKey( TemplateSemantics.SV_VertexID ) ) + //{ + // if( m_currentDataCollector.PortCategory == MasterNodePortCategory.Vertex ) + // return m_vertexInputParams[ TemplateSemantics.SV_VertexID ].Name; + //} + //else + //{ + // RegisterVertexInputParams( WirePortDataType.UINT, PrecisionType.Float, TemplateHelperFunctions.SemanticsDefaultName[ TemplateSemantics.SV_VertexID ], TemplateSemantics.SV_VertexID ); + //} + + //if( m_currentDataCollector.PortCategory != MasterNodePortCategory.Vertex ) + // RegisterCustomInterpolatedData( m_vertexInputParams[ TemplateSemantics.SV_VertexID ].Name, WirePortDataType.INT, PrecisionType.Float, m_vertexInputParams[ TemplateSemantics.SV_VertexID ].Name ); + + //return m_vertexInputParams[ TemplateSemantics.SV_VertexID ].Name; + } +#if UNITY_EDITOR_WIN + public string GetPrimitiveId() + { + if( m_fragmentInputParams != null && m_fragmentInputParams.ContainsKey( TemplateSemantics.SV_PrimitiveID ) ) + return m_fragmentInputParams[ TemplateSemantics.SV_PrimitiveID ].Name; + + RegisterFragInputParams( WirePortDataType.UINT, PrecisionType.Half, TemplateHelperFunctions.SemanticsDefaultName[ TemplateSemantics.SV_PrimitiveID ], TemplateSemantics.SV_PrimitiveID ); + return m_fragmentInputParams[ TemplateSemantics.SV_PrimitiveID ].Name; + } +#endif + public string GetVFace( int uniqueId ) + { + #if UNITY_2018_3_OR_NEWER + if( IsHDRP && ASEPackageManagerHelper.CurrentHDVersion >= ASESRPVersions.ASE_SRP_6_9_0 ) + { + string result = string.Empty; + if( GetCustomInterpolatedData( TemplateInfoOnSematics.VFACE, WirePortDataType.FLOAT, PrecisionType.Float, ref result, true, MasterNodePortCategory.Fragment ) ) + { + m_currentDataCollector.AddToDirectives( "#if !defined(ASE_NEED_CULLFACE)" ); + m_currentDataCollector.AddToDirectives( "#define ASE_NEED_CULLFACE 1" ); + m_currentDataCollector.AddToDirectives( "#endif //ASE_NEED_CULLFACE" ); + return result; + } + else + { + if( m_fragmentInputParams != null && m_fragmentInputParams.ContainsKey( TemplateSemantics.VFACE ) ) + return m_fragmentInputParams[ TemplateSemantics.VFACE ].Name; + + string custom = "FRONT_FACE_TYPE "+ TemplateHelperFunctions.SemanticsDefaultName[ TemplateSemantics.VFACE ] + " : FRONT_FACE_SEMANTIC"; + RegisterFragInputParams( WirePortDataType.FLOAT, PrecisionType.Half, TemplateHelperFunctions.SemanticsDefaultName[ TemplateSemantics.VFACE ], TemplateSemantics.VFACE, custom ); + return m_fragmentInputParams[ TemplateSemantics.VFACE ].Name; + } + } + else + #endif + { + if( m_fragmentInputParams != null && m_fragmentInputParams.ContainsKey( TemplateSemantics.VFACE ) ) + return m_fragmentInputParams[ TemplateSemantics.VFACE ].Name; + + RegisterFragInputParams( WirePortDataType.FLOAT, PrecisionType.Half, TemplateHelperFunctions.SemanticsDefaultName[ TemplateSemantics.VFACE ], TemplateSemantics.VFACE ); + return m_fragmentInputParams[ TemplateSemantics.VFACE ].Name; + } + } + + public string GetShadowCoords( int uniqueId, bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment ) + { + // overriding precision + var precision = PrecisionType.Float; + + string worldPos = GetWorldPos( false, m_currentDataCollector.PortCategory ); + + string result = string.Empty; + if( GetCustomInterpolatedData( TemplateInfoOnSematics.SHADOWCOORDS, WirePortDataType.FLOAT4, precision, ref result, useMasterNodeCategory, customCategory ) ) + { + return result; + } + + string varName = GeneratorUtils.ShadowCoordsStr; + if( HasCustomInterpolatedData( varName, useMasterNodeCategory, customCategory ) ) + return varName; + + + string shadowCoordsValue = string.Format( "TransformWorldToShadowCoord({0})", worldPos ); + if( m_currentDataCollector.PortCategory == MasterNodePortCategory.Fragment ) + { + worldPos = GetWorldPos( false, MasterNodePortCategory.Vertex ); + m_currentDataCollector.AddLocalVariable( uniqueId, "#if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) //la" ); + RegisterCustomInterpolatedData( varName, WirePortDataType.FLOAT4, precision, string.Format( "TransformWorldToShadowCoord({0})", worldPos ), false, MasterNodePortCategory.Fragment ); + m_currentDataCollector.AddLocalVariable( uniqueId, "#elif defined(MAIN_LIGHT_CALCULATE_SHADOWS) //la" ); + m_currentDataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT4, varName, shadowCoordsValue ); + m_currentDataCollector.AddLocalVariable( uniqueId, "#else //la" ); + m_currentDataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT4, varName, "0" ); + m_currentDataCollector.AddLocalVariable( uniqueId, "#endif //la" ); + } else + { + m_currentDataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT4, varName, shadowCoordsValue ); + } + return varName; + } + + public bool HasUV( int uvChannel ) + { + return ( m_currentDataCollector.PortCategory == MasterNodePortCategory.Fragment ) ? m_availableFragData.ContainsKey( TemplateHelperFunctions.IntToUVChannelInfo[ uvChannel ] ) : m_availableVertData.ContainsKey( TemplateHelperFunctions.IntToUVChannelInfo[ uvChannel ] ); + } + + public string GetUVName( int uvChannel, WirePortDataType dataType = WirePortDataType.FLOAT2 ) + { + InterpDataHelper info = ( m_currentDataCollector.PortCategory == MasterNodePortCategory.Fragment ) ? m_availableFragData[ TemplateHelperFunctions.IntToUVChannelInfo[ uvChannel ] ] : m_availableVertData[ TemplateHelperFunctions.IntToUVChannelInfo[ uvChannel ] ]; + if( dataType != info.VarType ) + return info.VarName + UIUtils.GetAutoSwizzle( dataType ); + else + return info.VarName; + } + + public string GetTextureCoord( int uvChannel, string propertyName, int uniqueId, PrecisionType precisionType ) + { + bool isVertex = ( m_currentDataCollector.PortCategory == MasterNodePortCategory.Vertex || m_currentDataCollector.PortCategory == MasterNodePortCategory.Tessellation ); + string uvChannelName = string.Empty; + string propertyHelperVar = propertyName + "_ST"; + m_currentDataCollector.AddToUniforms( uniqueId, "float4", propertyHelperVar, IsSRP ); + string uvName = string.Empty; + string result = string.Empty; + if( GetCustomInterpolatedData( TemplateHelperFunctions.IntToUVChannelInfo[ uvChannel ], WirePortDataType.FLOAT2, PrecisionType.Float, ref result, false, m_currentDataCollector.PortCategory ) ) + { + uvName = result; + } + else + if( m_currentDataCollector.TemplateDataCollectorInstance.HasUV( uvChannel ) ) + { + uvName = m_currentDataCollector.TemplateDataCollectorInstance.GetUVName( uvChannel ); + } + else + { + uvName = m_currentDataCollector.TemplateDataCollectorInstance.RegisterUV( uvChannel ); + } + + uvChannelName = "uv" + propertyName; + if( isVertex ) + { + string value = string.Format( Constants.TilingOffsetFormat, uvName, propertyHelperVar + ".xy", propertyHelperVar + ".zw" ); + string lodLevel = "0"; + + value = "float4( " + value + ", 0 , " + lodLevel + " )"; + m_currentDataCollector.AddLocalVariable( uniqueId, precisionType, WirePortDataType.FLOAT4, uvChannelName, value ); + } + else + { + m_currentDataCollector.AddLocalVariable( uniqueId, precisionType, WirePortDataType.FLOAT2, uvChannelName, string.Format( Constants.TilingOffsetFormat, uvName, propertyHelperVar + ".xy", propertyHelperVar + ".zw" ) ); + } + return uvChannelName; + } + + public string GenerateAutoUVs( int uvChannel, WirePortDataType size = WirePortDataType.FLOAT2 ) + { + string uvName = string.Empty; + string result = string.Empty; + if( GetCustomInterpolatedData( TemplateHelperFunctions.IntToUVChannelInfo[ uvChannel ], size, PrecisionType.Float, ref result, false, m_currentDataCollector.PortCategory ) ) + { + uvName = result; + } + else + if( HasUV( uvChannel ) ) + { + uvName = GetUVName( uvChannel, size ); + } + else + { + uvName = RegisterUV( uvChannel, size ); + } + return uvName; + } + + public string GetUV( int uvChannel, MasterNodePortCategory category = MasterNodePortCategory.Fragment, WirePortDataType size = WirePortDataType.FLOAT4 ) + { + if( !HasUV( uvChannel ) ) + { + RegisterUV( uvChannel, size ); + } + + InterpDataHelper info = ( category == MasterNodePortCategory.Fragment ) ? m_availableFragData[ TemplateHelperFunctions.IntToUVChannelInfo[ uvChannel ] ] : m_availableVertData[ TemplateHelperFunctions.IntToUVChannelInfo[ uvChannel ] ]; + return info.VarName; + } + + public InterpDataHelper GetUVInfo( int uvChannel ) + { + return ( m_currentDataCollector.PortCategory == MasterNodePortCategory.Fragment ) ? m_availableFragData[ TemplateHelperFunctions.IntToUVChannelInfo[ uvChannel ] ] : m_availableVertData[ TemplateHelperFunctions.IntToUVChannelInfo[ uvChannel ] ]; + } + + public string RegisterUV( int UVChannel, WirePortDataType size = WirePortDataType.FLOAT2 ) + { + int channelsSize = TemplateHelperFunctions.DataTypeChannelUsage[ size ]; + WirePortDataType originalSize = size; + if( m_UVUsage[ UVChannel ] > channelsSize ) + { + size = TemplateHelperFunctions.ChannelToDataType[ m_UVUsage[ UVChannel ] ]; + } + + if( m_currentDataCollector.PortCategory == MasterNodePortCategory.Vertex ) + { + TemplateSemantics semantic = TemplateHelperFunctions.IntToSemantic[ UVChannel ]; + + if( m_vertexDataDict.ContainsKey( semantic ) ) + { + return m_vertexDataDict[ semantic ].VarName; + } + + string varName = TemplateHelperFunctions.BaseInterpolatorName + ( ( UVChannel > 0 ) ? UVChannel.ToString() : string.Empty ); + m_availableVertData.Add( TemplateHelperFunctions.IntToUVChannelInfo[ UVChannel ], + new InterpDataHelper( WirePortDataType.FLOAT4, + string.Format( TemplateHelperFunctions.TemplateVarFormat, + m_currentTemplateData.VertexFunctionData.InVarName, + varName ) ) ); + + m_currentDataCollector.AddToVertexInput( + string.Format( TemplateHelperFunctions.TexFullSemantic, + varName, + semantic ) ); + RegisterOnVertexData( semantic, size, varName ); + string finalVarName = m_availableVertData[ TemplateHelperFunctions.IntToUVChannelInfo[ UVChannel ] ].VarName; + switch( size ) + { + case WirePortDataType.FLOAT: + case WirePortDataType.INT: + case WirePortDataType.UINT: + finalVarName += ".x"; + break; + case WirePortDataType.FLOAT2: + finalVarName += ".xy"; + break; + case WirePortDataType.FLOAT3: + finalVarName += ".xyz"; + break; + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + case WirePortDataType.SAMPLER1D: + case WirePortDataType.SAMPLER2D: + case WirePortDataType.SAMPLER3D: + case WirePortDataType.SAMPLERCUBE: + case WirePortDataType.SAMPLER2DARRAY: + case WirePortDataType.SAMPLERSTATE: + case WirePortDataType.OBJECT: + default: + break; + } + return finalVarName; + } + else + { + //search if the correct vertex data is set ... + TemplateInfoOnSematics info = TemplateHelperFunctions.IntToInfo[ UVChannel ]; + TemplateSemantics vertexSemantics = TemplateSemantics.NONE; + foreach( KeyValuePair kvp in m_vertexDataDict ) + { + if( kvp.Value.DataInfo == info ) + { + vertexSemantics = kvp.Key; + break; + } + } + + // if not, add vertex data and create interpolator + if( vertexSemantics == TemplateSemantics.NONE ) + { + vertexSemantics = TemplateHelperFunctions.IntToSemantic[ UVChannel ]; + + if( !m_vertexDataDict.ContainsKey( vertexSemantics ) ) + { + string varName = TemplateHelperFunctions.BaseInterpolatorName + ( ( UVChannel > 0 ) ? UVChannel.ToString() : string.Empty ); + m_availableVertData.Add( TemplateHelperFunctions.IntToUVChannelInfo[ UVChannel ], + new InterpDataHelper( WirePortDataType.FLOAT4, + string.Format( TemplateHelperFunctions.TemplateVarFormat, + m_currentTemplateData.VertexFunctionData.InVarName, + varName ) ) ); + + m_currentDataCollector.AddToVertexInput( + string.Format( TemplateHelperFunctions.TexFullSemantic, + varName, + vertexSemantics ) ); + RegisterOnVertexData( vertexSemantics, size, varName ); + } + } + + // either way create interpolator + TemplateVertexData availableInterp = RequestNewInterpolator( size, false ); + if( availableInterp != null ) + { + bool isPosition = vertexSemantics == TemplateSemantics.POSITION || vertexSemantics == TemplateSemantics.POSITION; + + string interpVarName = m_currentTemplateData.VertexFunctionData.OutVarName + "." + availableInterp.VarNameWithSwizzle; + InterpDataHelper vertInfo = m_availableVertData[ TemplateHelperFunctions.IntToUVChannelInfo[ UVChannel ] ]; + string interpDecl = string.Format( TemplateHelperFunctions.TemplateVariableDecl, interpVarName, TemplateHelperFunctions.AutoSwizzleData( vertInfo.VarName, vertInfo.VarType, size , isPosition ) ); + m_currentDataCollector.AddToVertexInterpolatorsDecl( interpDecl ); + string finalVarName = m_currentTemplateData.FragmentFunctionData.InVarName + "." + availableInterp.VarNameWithSwizzle; + m_availableFragData.Add( TemplateHelperFunctions.IntToUVChannelInfo[ UVChannel ], new InterpDataHelper( size, finalVarName ) ); + if( size != originalSize ) + { + //finalVarName = m_currentTemplateData.FragmentFunctionData.InVarName + "." + availableInterp.VarName + UIUtils.GetAutoSwizzle( originalSize ); + finalVarName = m_availableFragData[ TemplateHelperFunctions.IntToUVChannelInfo[ UVChannel ] ].VarName + UIUtils.GetAutoSwizzle( originalSize ); + } + return finalVarName; + } + } + return string.Empty; + } + //////////////////////////////////////////////////////////////////////////////////////////////// + bool IsSemanticUsedOnInterpolator( TemplateSemantics semantics ) + { + for( int i = 0; i < m_interpolatorData.Interpolators.Count; i++ ) + { + if( m_interpolatorData.Interpolators[ i ].Semantics == semantics ) + { + return true; + } + } + return false; + } + + public bool HasInfo( TemplateInfoOnSematics info, bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment ) + { + MasterNodePortCategory category = useMasterNodeCategory ? m_currentDataCollector.PortCategory : customCategory; + return ( category == MasterNodePortCategory.Fragment ) ? m_availableFragData.ContainsKey( info ) : m_availableVertData.ContainsKey( info ); + } + + public InterpDataHelper GetInfo( TemplateInfoOnSematics info, bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment ) + { + MasterNodePortCategory category = useMasterNodeCategory ? m_currentDataCollector.PortCategory : customCategory; + if( category == MasterNodePortCategory.Fragment ) + { + if( !m_availableFragData[ info ].SetAtCompileTime ) + { + string defineValue = string.Empty; + if( TemplateHelperFunctions.InfoToDefineFrag.TryGetValue( info, out defineValue ) ) + m_currentDataCollector.AddToDefines( -1, defineValue ); + } + return m_availableFragData[ info ]; + } + else + { + if( !m_availableVertData[ info ].SetAtCompileTime ) + { + string defineValue = string.Empty; + if( TemplateHelperFunctions.InfoToDefineVertex.TryGetValue( info, out defineValue ) ) + m_currentDataCollector.AddToDefines( -1, defineValue ); + } + return m_availableVertData[ info ]; + } + } + + public string RegisterInfoOnSemantic( TemplateInfoOnSematics info, TemplateSemantics semantic, string name, WirePortDataType dataType, PrecisionType precisionType, bool requestNewInterpolator, string dataName = null ) + { + return RegisterInfoOnSemantic( m_currentDataCollector.PortCategory, info, semantic, name, dataType, precisionType, requestNewInterpolator, dataName ); + } + // This should only be used to semantics outside the text coord set + public string RegisterInfoOnSemantic( MasterNodePortCategory portCategory, TemplateInfoOnSematics info, TemplateSemantics semantic, string name, WirePortDataType dataType, PrecisionType precisionType, bool requestNewInterpolator, string dataName = null ) + { + if( portCategory == MasterNodePortCategory.Vertex ) + { + if( m_vertexDataDict.ContainsKey( semantic ) ) + { + return m_vertexDataDict[ semantic ].VarName; + } + + m_availableVertData.Add( info, + new InterpDataHelper( dataType, + string.Format( TemplateHelperFunctions.TemplateVarFormat, + m_currentTemplateData.VertexFunctionData.InVarName, + name ),true,true ) ); + + string vertInputVarType = UIUtils.PrecisionWirePortToCgType( precisionType, dataType ); + m_currentDataCollector.AddToVertexInput( + string.Format( TemplateHelperFunctions.InterpFullSemantic, + vertInputVarType, + name, + semantic ) ); + RegisterOnVertexData( semantic, dataType, name ); + return m_availableVertData[ info ].VarName; + } + else + { + //search if the correct vertex data is set ... + TemplateSemantics vertexSemantics = TemplateSemantics.NONE; + foreach( KeyValuePair kvp in m_vertexDataDict ) + { + if( kvp.Value.DataInfo == info ) + { + vertexSemantics = kvp.Key; + break; + } + } + + // if not, add vertex data and create interpolator + if( vertexSemantics == TemplateSemantics.NONE ) + { + vertexSemantics = semantic; + + if( !m_vertexDataDict.ContainsKey( vertexSemantics ) ) + { + m_availableVertData.Add( info, + new InterpDataHelper( dataType, + string.Format( TemplateHelperFunctions.TemplateVarFormat, + m_currentTemplateData.VertexFunctionData.InVarName, + name ),true,true ) ); + + string vertInputVarType = UIUtils.PrecisionWirePortToCgType( precisionType, dataType ); + m_currentDataCollector.AddToVertexInput( + string.Format( TemplateHelperFunctions.InterpFullSemantic, + vertInputVarType, + name, + vertexSemantics ) ); + RegisterOnVertexData( vertexSemantics, dataType, name ); + } + } + + // either way create interpolator + + TemplateVertexData availableInterp = null; + if( requestNewInterpolator || IsSemanticUsedOnInterpolator( semantic ) ) + { + availableInterp = RequestNewInterpolator( dataType, false, dataName ); + } + else + { + availableInterp = RegisterOnInterpolator( semantic, dataType, dataName ); + } + + if( availableInterp != null ) + { + bool isPosition = vertexSemantics == TemplateSemantics.POSITION || vertexSemantics == TemplateSemantics.POSITION; + + string interpVarName = m_currentTemplateData.VertexFunctionData.OutVarName + "." + availableInterp.VarNameWithSwizzle; + string interpDecl = string.Format( TemplateHelperFunctions.TemplateVariableDecl, interpVarName, TemplateHelperFunctions.AutoSwizzleData( m_availableVertData[ info ].VarName, m_availableVertData[ info ].VarType, dataType, isPosition ) ); + m_currentDataCollector.AddToVertexInterpolatorsDecl( interpDecl ); + string finalVarName = m_currentTemplateData.FragmentFunctionData.InVarName + "." + availableInterp.VarNameWithSwizzle; + m_availableFragData.Add( info, new InterpDataHelper( dataType, finalVarName ) ); + return finalVarName; + } + } + return string.Empty; + } + + TemplateVertexData RegisterOnInterpolator( TemplateSemantics semantics, WirePortDataType dataType, string vertexDataName = null ) + { + if( vertexDataName == null ) + { + if( TemplateHelperFunctions.SemanticsDefaultName.ContainsKey( semantics ) ) + { + vertexDataName = TemplateHelperFunctions.SemanticsDefaultName[ semantics ]; + } + else + { + vertexDataName = string.Empty; + Debug.LogError( "No valid name given to vertex data" ); + } + } + + TemplateVertexData data = new TemplateVertexData( semantics, dataType, vertexDataName ); + m_interpolatorData.Interpolators.Add( data ); + string interpolator = string.Format( TemplateHelperFunctions.InterpFullSemantic, UIUtils.WirePortToCgType( dataType ), data.VarName, data.Semantics ); + m_currentDataCollector.AddToInterpolators( interpolator ); + return data; + } + + public void RegisterOnVertexData( TemplateSemantics semantics, WirePortDataType dataType, string varName ) + { + m_vertexDataDict.Add( semantics, new TemplateVertexData( semantics, dataType, varName ) ); + } + + public TemplateVertexData RequestMacroInterpolator( string varName ) + { + if( varName != null && m_registeredVertexData.ContainsKey( varName ) ) + { + return m_registeredVertexData[ varName ]; + } + + for( int i = 0; i < m_interpolatorData.AvailableInterpolators.Count; i++ ) + { + if( !m_interpolatorData.AvailableInterpolators[ i ].IsFull ) + { + TemplateVertexData data = m_interpolatorData.AvailableInterpolators[ i ].RequestChannels( WirePortDataType.FLOAT4, false, varName ); + if( data != null ) + { + if( !m_registeredVertexData.ContainsKey( data.VarName ) ) + { + m_registeredVertexData.Add( data.VarName, data ); + } + if( m_interpolatorData.AvailableInterpolators[ i ].Usage == 1 ) + { + string interpolator = string.Format( TemplateHelperFunctions.InterpMacro, varName, TemplateHelperFunctions.SemanticToInt[ data.Semantics ] ); + m_currentDataCollector.AddToInterpolators( interpolator ); + } + return data; + } + } + } + return null; + } + + public bool HasRawInterpolatorOfName( string name ) + { + return m_interpolatorData.HasRawInterpolatorOfName( name ); + } + + public TemplateVertexData RequestNewInterpolator( WirePortDataType dataType, bool isColor, string varName = null , bool noInterpolationFlag = false, bool sampleFlag = false ) + { + if( varName != null && m_registeredVertexData.ContainsKey( varName ) ) + { + return m_registeredVertexData[ varName ]; + } + + for( int i = 0; i < m_interpolatorData.AvailableInterpolators.Count; i++ ) + { + if( !m_interpolatorData.AvailableInterpolators[ i ].IsFull ) + { + if( m_interpolatorData.AvailableInterpolators[ i ].Usage != 0 && + (m_interpolatorData.AvailableInterpolators[ i ].NoInterpolation != noInterpolationFlag || + m_interpolatorData.AvailableInterpolators[ i ].Sample != sampleFlag )) + continue; + + TemplateVertexData data = m_interpolatorData.AvailableInterpolators[ i ].RequestChannels( dataType, isColor, varName ); + if( data != null ) + { + if( !m_registeredVertexData.ContainsKey( data.VarName ) ) + { + m_registeredVertexData.Add( data.VarName, data ); + } + + if( m_interpolatorData.AvailableInterpolators[ i ].Usage == 1 ) + { + m_interpolatorData.AvailableInterpolators[ i ].NoInterpolation = noInterpolationFlag; + m_interpolatorData.AvailableInterpolators[ i ].Sample = sampleFlag; + // First time using this interpolator, so we need to register it + string interpolator = string.Format( TemplateHelperFunctions.TexFullSemantic, + data.VarName, data.Semantics ); + if( noInterpolationFlag ) + interpolator = "nointerpolation " + interpolator; + + if( sampleFlag) + interpolator = "sample " + interpolator; + + m_currentDataCollector.AddToInterpolators( interpolator ); + } + return data; + } + } + } + + // This area is reached if max available interpolators from shader model is reached + // Nevertheless, we register all new interpolators to that list so no imediate compilation errors are thrown + // A warning message is then thrown to warn the user about this + int newInterpId = 1 + TemplateHelperFunctions.SemanticToInt[ m_interpolatorData.AvailableInterpolators[ m_interpolatorData.AvailableInterpolators.Count - 1 ].Semantic ]; + if( TemplateHelperFunctions.IntToSemantic.ContainsKey( newInterpId ) ) + { + TemplateInterpElement item = new TemplateInterpElement( TemplateHelperFunctions.IntToSemantic[ newInterpId ] ); + m_interpolatorData.AvailableInterpolators.Add( item ); + TemplateVertexData data = item.RequestChannels( dataType, isColor, varName ); + if( data != null ) + { + if( !m_registeredVertexData.ContainsKey( data.VarName ) ) + { + m_registeredVertexData.Add( data.VarName, data ); + } + + if( item.Usage == 1 ) + { + string interpolator = string.Format( TemplateHelperFunctions.TexFullSemantic, data.VarName, data.Semantics ); + m_currentDataCollector.AddToInterpolators( interpolator ); + } + return data; + } + } + + UIUtils.ShowMessage( "Maximum amount of interpolators exceeded", MessageSeverity.Error ); + return null; + } + + // Unused channels in interpolators must be set to something so the compiler doesn't generate warnings + public List GetInterpUnusedChannels() + { + List resetInstrucctions = new List(); + + if( m_interpolatorData != null ) + { + for( int i = 0; i < m_interpolatorData.AvailableInterpolators.Count; i++ ) + { + if( m_interpolatorData.AvailableInterpolators[ i ].Usage > 0 && !m_interpolatorData.AvailableInterpolators[ i ].IsFull ) + { + string channels = string.Empty; + bool[] availableChannels = m_interpolatorData.AvailableInterpolators[ i ].AvailableChannels; + for( int j = 0; j < availableChannels.Length; j++ ) + { + if( availableChannels[ j ] ) + { + channels += TemplateHelperFunctions.VectorSwizzle[ j ]; + } + } + + resetInstrucctions.Add( string.Format( "{0}.{1}.{2} = 0;", m_currentTemplateData.VertexFunctionData.OutVarName, m_interpolatorData.AvailableInterpolators[ i ].Name, channels ) ); + } + } + } + + if( resetInstrucctions.Count > 0 ) + { + resetInstrucctions.Insert( 0, "\n//setting value to unused interpolator channels and avoid initialization warnings" ); + } + + return resetInstrucctions; + } + + public bool ContainsSpecialLocalFragVar( TemplateInfoOnSematics info, WirePortDataType type, ref string result ) + { + if( m_specialFragmentLocalVars.ContainsKey( info ) ) + { + result = m_specialFragmentLocalVars[ info ].LocalVarName; + if( m_specialFragmentLocalVars[ info ].DataType != type ) + { + result = TemplateHelperFunctions.AutoSwizzleData( result, m_specialFragmentLocalVars[ info ].DataType, type, false ); + } + return true; + } + return false; + } + + public bool GetCustomInterpolatedData( TemplateInfoOnSematics info, WirePortDataType type, PrecisionType precisionType, ref string result, bool useMasterNodeCategory, MasterNodePortCategory customCategory ) + { + bool isPosition = info == TemplateInfoOnSematics.POSITION || + info == TemplateInfoOnSematics.CLIP_POS || + info == TemplateInfoOnSematics.SCREEN_POSITION || + info == TemplateInfoOnSematics.SCREEN_POSITION_NORMALIZED || + info == TemplateInfoOnSematics.WORLD_POSITION || + info == TemplateInfoOnSematics.RELATIVE_WORLD_POS; + + + MasterNodePortCategory category = useMasterNodeCategory ? m_currentDataCollector.PortCategory : customCategory; + if( category == MasterNodePortCategory.Vertex ) + { + if( m_specialVertexLocalVars.ContainsKey( info ) ) + { + result = m_specialVertexLocalVars[ info ].LocalVarName; + if( m_specialVertexLocalVars[ info ].DataType != type ) + { + result = TemplateHelperFunctions.AutoSwizzleData( result, m_specialVertexLocalVars[ info ].DataType, type , isPosition ); + } + + string defineValue = string.Empty; + if( TemplateHelperFunctions.InfoToDefineVertex.TryGetValue( info, out defineValue ) ) + m_currentDataCollector.AddToDefines( -1, defineValue ); + + return true; + } + } + + if( category == MasterNodePortCategory.Fragment ) + { + if( m_specialFragmentLocalVars.ContainsKey( info ) ) + { + result = m_specialFragmentLocalVars[ info ].LocalVarName; + if( m_specialFragmentLocalVars[ info ].DataType != type ) + { + result = TemplateHelperFunctions.AutoSwizzleData( result, m_specialFragmentLocalVars[ info ].DataType, type, isPosition ); + } + + string defineValue = string.Empty; + if( TemplateHelperFunctions.InfoToDefineFrag.TryGetValue( info, out defineValue )) + m_currentDataCollector.AddToDefines( -1, defineValue ); + return true; + } + + if( m_availableFragData.ContainsKey( info ) ) + { + if( m_availableFragData[ info ].IsSingleComponent ) + { + result = m_availableFragData[ info ].VarName; + if( m_availableFragData[ info ].VarType != type ) + { + result = TemplateHelperFunctions.AutoSwizzleData( result, m_availableFragData[ info ].VarType, type, isPosition ); + } + return true; + } + else if( TemplateHelperFunctions.InfoToLocalVar.ContainsKey( info ) && TemplateHelperFunctions.InfoToWirePortType.ContainsKey( info ) ) + { + result = TemplateHelperFunctions.InfoToLocalVar[ info ]; + m_currentDataCollector.AddLocalVariable( -1, precisionType, TemplateHelperFunctions.InfoToWirePortType[ info ], result, m_availableFragData[ info ].VarName ); + return true; + } + } + } + return false; + } + + public string GetVertexPosition( WirePortDataType type, PrecisionType precisionType, bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment ) + { + if( HasInfo( TemplateInfoOnSematics.POSITION, useMasterNodeCategory, customCategory ) ) + { + InterpDataHelper info = GetInfo( TemplateInfoOnSematics.POSITION, useMasterNodeCategory, customCategory ); + if( type != WirePortDataType.OBJECT && type != info.VarType ) + return TemplateHelperFunctions.AutoSwizzleData( info.VarName, info.VarType, type,true ); + else + return info.VarName; + } + else + { + MasterNodePortCategory portCategory = useMasterNodeCategory ? m_currentDataCollector.PortCategory : customCategory; + string name = "ase_vertex_pos"; + string varName = RegisterInfoOnSemantic( portCategory, TemplateInfoOnSematics.POSITION, TemplateSemantics.POSITION, name, WirePortDataType.FLOAT4, precisionType, true ); + if( type != WirePortDataType.OBJECT && type != WirePortDataType.FLOAT4 ) + return TemplateHelperFunctions.AutoSwizzleData( varName, WirePortDataType.FLOAT4, type,true ); + else + return varName; + } + } + + private const string InstancingLibStandard = "UnityInstancing.cginc"; + private const string InstancingLibSRP = "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl"; + + public void SetupInstancing() + { + if( !HasInfo( TemplateInfoOnSematics.INSTANCE_ID ) ) + { + m_currentDataCollector.AddToPragmas( -1, IOUtils.InstancedPropertiesHeader ); + m_currentDataCollector.AddToIncludes( -1, IsSRP ? InstancingLibSRP : InstancingLibStandard ); + m_currentDataCollector.AddToVertexInput( Constants.InstanceIdMacro ); + m_currentDataCollector.AddToInterpolators( Constants.InstanceIdMacro ); + m_currentDataCollector.AddToLocalVariables( MasterNodePortCategory.Vertex, -1, string.Format( "UNITY_SETUP_INSTANCE_ID({0});", m_currentTemplateData.VertexFunctionData.InVarName ) ); + m_currentDataCollector.AddToLocalVariables( MasterNodePortCategory.Vertex, -1, string.Format( "UNITY_TRANSFER_INSTANCE_ID({0}, {1});", m_currentTemplateData.VertexFunctionData.InVarName, m_currentTemplateData.VertexFunctionData.OutVarName ) ); + m_currentDataCollector.AddToLocalVariables( MasterNodePortCategory.Fragment, -1, string.Format( "UNITY_SETUP_INSTANCE_ID({0});", m_currentTemplateData.FragmentFunctionData.InVarName ) ); + } + } + + public string GetVertexColor( PrecisionType precisionType ) + { + if( HasInfo( TemplateInfoOnSematics.COLOR ) ) + { + return GetInfo( TemplateInfoOnSematics.COLOR ).VarName; + } + else + { + string name = "ase_color"; + return RegisterInfoOnSemantic( TemplateInfoOnSematics.COLOR, TemplateSemantics.COLOR, name, WirePortDataType.FLOAT4, precisionType, false ); + } + } + + public string GetVertexNormal( PrecisionType precisionType, bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment ) + { + if( HasInfo( TemplateInfoOnSematics.NORMAL, useMasterNodeCategory, customCategory ) ) + { + InterpDataHelper info = GetInfo( TemplateInfoOnSematics.NORMAL, useMasterNodeCategory, customCategory ); + return TemplateHelperFunctions.AutoSwizzleData( info.VarName, info.VarType, WirePortDataType.FLOAT3 , false); + } + else + { + MasterNodePortCategory category = useMasterNodeCategory ? m_currentDataCollector.PortCategory : customCategory; + string name = "ase_normal"; + return RegisterInfoOnSemantic( category, TemplateInfoOnSematics.NORMAL, TemplateSemantics.NORMAL, name, WirePortDataType.FLOAT3, precisionType, false ); + } + } + + public string GetWorldNormal( PrecisionType precisionType = PrecisionType.Float, bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment, bool normalize = false ) + { + string result = string.Empty; + if( GetCustomInterpolatedData( TemplateInfoOnSematics.WORLD_NORMAL, WirePortDataType.FLOAT3, precisionType, ref result, useMasterNodeCategory, customCategory ) ) + { + if( normalize ) + return string.Format( "normalize( {0} )", result ); + else + return result; + } + + string varName = normalize ? "normalizeWorldNormal" : GeneratorUtils.WorldNormalStr; + + if( HasCustomInterpolatedData( varName, useMasterNodeCategory, customCategory ) ) + return varName; + + string worldNormalValue = string.Empty; + + if( !GetCustomInterpolatedData( TemplateInfoOnSematics.WORLD_NORMAL, WirePortDataType.FLOAT3, precisionType, ref worldNormalValue, false, MasterNodePortCategory.Vertex ) ) + { + string vertexNormal = GetVertexNormal( precisionType, false, MasterNodePortCategory.Vertex ); + string formatStr = string.Empty; + if( IsSRP ) + formatStr = "TransformObjectToWorldNormal({0})"; + else + formatStr = "UnityObjectToWorldNormal({0})"; + worldNormalValue = string.Format( formatStr, vertexNormal ); + } + + if( normalize ) + worldNormalValue = string.Format( "normalize( {0} )", worldNormalValue ); + + RegisterCustomInterpolatedData( varName, WirePortDataType.FLOAT3, precisionType, worldNormalValue, useMasterNodeCategory, customCategory ); + return varName; + } + + public string GetWorldNormal( int uniqueId, PrecisionType precisionType, string normal, string outputId ) + { + string tanToWorld0 = string.Empty; + string tanToWorld1 = string.Empty; + string tanToWorld2 = string.Empty; + + GetWorldTangentTf( precisionType, out tanToWorld0, out tanToWorld1, out tanToWorld2, true ); + + string tanNormal = "tanNormal" + outputId; + m_currentDataCollector.AddLocalVariable( uniqueId, "float3 " + tanNormal + " = " + normal + ";" ); + return string.Format( "float3(dot({1},{0}), dot({2},{0}), dot({3},{0}))", tanNormal, tanToWorld0, tanToWorld1, tanToWorld2 ); + } + + public string GetVertexTangent( WirePortDataType type, PrecisionType precisionType, bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment ) + { + if( HasInfo( TemplateInfoOnSematics.TANGENT, useMasterNodeCategory, customCategory ) ) + { + InterpDataHelper info = GetInfo( TemplateInfoOnSematics.TANGENT, useMasterNodeCategory, customCategory ); + if( type != WirePortDataType.OBJECT && type != info.VarType ) + return TemplateHelperFunctions.AutoSwizzleData( info.VarName, info.VarType, type , false); + else + return info.VarName; + } + else + { + MasterNodePortCategory category = useMasterNodeCategory ? m_currentDataCollector.PortCategory : customCategory; + string name = "ase_tangent"; + string varName = RegisterInfoOnSemantic( category, TemplateInfoOnSematics.TANGENT, TemplateSemantics.TANGENT, name, WirePortDataType.FLOAT4, precisionType, false ); + if( type != WirePortDataType.OBJECT && type != WirePortDataType.FLOAT4 ) + return TemplateHelperFunctions.AutoSwizzleData( varName, WirePortDataType.FLOAT4, type , false ); + else + return varName; + } + } + + public string GetVertexBitangent( PrecisionType precisionType, bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment ) + { + string varName = GeneratorUtils.VertexBitangentStr; + if( HasCustomInterpolatedData( varName, useMasterNodeCategory, customCategory ) ) + return varName; + + string tangentValue = GetVertexTangent( WirePortDataType.FLOAT4, precisionType, false, MasterNodePortCategory.Vertex ); + string normalValue = GetVertexNormal( precisionType, false, MasterNodePortCategory.Vertex ); + + string bitangentValue = string.Format( "cross( {0}, {1}.xyz ) * {1}.w * unity_WorldTransformParams.w", normalValue, tangentValue ); + RegisterCustomInterpolatedData( varName, WirePortDataType.FLOAT3, precisionType, bitangentValue, useMasterNodeCategory, customCategory ); + return varName; + } + + public string GetWorldTangent( PrecisionType precisionType, bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment ) + { + string result = string.Empty; + if( GetCustomInterpolatedData( TemplateInfoOnSematics.WORLD_TANGENT, WirePortDataType.FLOAT3, precisionType, ref result, useMasterNodeCategory, customCategory ) ) + { + return result; + } + + string varName = GeneratorUtils.WorldTangentStr; + if( HasCustomInterpolatedData( varName, useMasterNodeCategory, customCategory ) ) + return varName; + + string worldTangentValue = string.Empty; + if( !GetCustomInterpolatedData( TemplateInfoOnSematics.WORLD_TANGENT, WirePortDataType.FLOAT3, precisionType, ref worldTangentValue, false, MasterNodePortCategory.Vertex ) ) + { + string vertexTangent = GetVertexTangent( WirePortDataType.FLOAT4, precisionType, false, MasterNodePortCategory.Vertex ); + string formatStr = string.Empty; + + if( IsSRP ) + formatStr = "TransformObjectToWorldDir({0}.xyz)"; + else + formatStr = "UnityObjectToWorldDir({0})"; + + worldTangentValue = string.Format( formatStr, vertexTangent ); + } + RegisterCustomInterpolatedData( varName, WirePortDataType.FLOAT3, precisionType, worldTangentValue, useMasterNodeCategory, customCategory ); + return varName; + } + + public string GetTangentSign( PrecisionType precisionType, bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment ) + { + string varName = GeneratorUtils.VertexTangentSignStr; + if( HasCustomInterpolatedData( varName, useMasterNodeCategory, customCategory ) ) + return varName; + + string tangentValue = GetVertexTangent( WirePortDataType.FLOAT4, precisionType, false, MasterNodePortCategory.Vertex ); + string tangentSignValue = string.Format( "{0}.w * unity_WorldTransformParams.w", tangentValue ); + RegisterCustomInterpolatedData( varName, WirePortDataType.FLOAT, precisionType, tangentSignValue, useMasterNodeCategory, customCategory ); + return varName; + } + + + public string GetWorldBinormal( PrecisionType precisionType, bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment ) + { + string result = string.Empty; + if( GetCustomInterpolatedData( TemplateInfoOnSematics.WORLD_BITANGENT, WirePortDataType.FLOAT3, precisionType, ref result, useMasterNodeCategory, customCategory ) ) + { + return result; + } + + string varName = GeneratorUtils.WorldBitangentStr; + if( HasCustomInterpolatedData( varName, useMasterNodeCategory, customCategory ) ) + return varName; + + string worldBinormal = string.Empty; + if( !GetCustomInterpolatedData( TemplateInfoOnSematics.WORLD_BITANGENT, WirePortDataType.FLOAT3, precisionType, ref worldBinormal, false, MasterNodePortCategory.Vertex ) ) + { + string worldNormal = GetWorldNormal( precisionType, false, MasterNodePortCategory.Vertex ); + string worldtangent = GetWorldTangent( precisionType, false, MasterNodePortCategory.Vertex ); + string tangentSign = GetTangentSign( precisionType, false, MasterNodePortCategory.Vertex ); + worldBinormal = string.Format( "cross( {0}, {1} ) * {2}", worldNormal, worldtangent, tangentSign ); + } + + RegisterCustomInterpolatedData( varName, WirePortDataType.FLOAT3, PrecisionType.Float, worldBinormal, useMasterNodeCategory, customCategory ); + return varName; + } + + public string GetWorldReflection( PrecisionType precisionType, bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment, bool normalize = false ) + { + string varName = GeneratorUtils.WorldReflectionStr;//UIUtils.GetInputValueFromType( SurfaceInputs.WORLD_REFL ); + if( normalize ) + varName = "normalized" + varName; + + if( HasCustomInterpolatedData( varName, useMasterNodeCategory, customCategory ) ) + return varName; + + string worldNormal = GetWorldNormal( precisionType ); + string worldViewDir = GetViewDir(); + string worldRefl = string.Format( "reflect(-{0}, {1})", worldViewDir, worldNormal ); + + if( normalize ) + worldRefl = string.Format( "normalize( {0} )", worldRefl ); + + m_currentDataCollector.AddLocalVariable( -1, precisionType, WirePortDataType.FLOAT3, varName, worldRefl ); + return varName; + } + + public string GetWorldReflection( PrecisionType precisionType, string normal ) + { + string tanToWorld0 = string.Empty; + string tanToWorld1 = string.Empty; + string tanToWorld2 = string.Empty; + + GetWorldTangentTf( precisionType, out tanToWorld0, out tanToWorld1, out tanToWorld2 ); + string worldRefl = GetViewDir(); + + return string.Format( "reflect( -{0}, float3( dot( {2}, {1} ), dot( {3}, {1} ), dot( {4}, {1} ) ) )", worldRefl, normal, tanToWorld0, tanToWorld1, tanToWorld2 ); + } + + public string GetLightAtten( int uniqueId, bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment ) + { + //string result = string.Empty; + //if( GetCustomInterpolatedData( TemplateInfoOnSematics.WORLD_POSITION, PrecisionType.Float, ref result, useMasterNodeCategory, customCategory ) ) + //{ + // return result; + //} + + //string varName = GeneratorUtils.WorldPositionStr;//UIUtils.GetInputValueFromType( SurfaceInputs.WORLD_POS ); + //if( HasCustomInterpolatedData( varName, useMasterNodeCategory, customCategory ) ) + // return varName; + + //if( !m_availableVertData.ContainsKey( TemplateInfoOnSematics.POSITION ) ) + //{ + // UIUtils.ShowMessage( "Attempting to access inexisting vertex position to calculate world pos" ); + // return "fixed3(0,0,0)"; + //} + + //string vertexPos = m_availableVertData[ TemplateInfoOnSematics.POSITION ].VarName; + //string worldPosConversion = string.Format( "mul(unity_ObjectToWorld, {0}).xyz", vertexPos ); + + //RegisterCustomInterpolatedData( varName, WirePortDataType.FLOAT3, PrecisionType.Float, worldPosConversion, useMasterNodeCategory, customCategory ); + //return varName; + + m_currentDataCollector.AddToIncludes( uniqueId, Constants.UnityAutoLightLib ); + m_currentDataCollector.AddToDefines( uniqueId, "ASE_SHADOWS 1" ); +#if UNITY_5_6_OR_NEWER + RequestMacroInterpolator( "UNITY_SHADOW_COORDS" ); +#else + RequestMacroInterpolator( "SHADOW_COORDS" ); + m_currentDataCollector.AddToPragmas( uniqueId, "multi_compile_fwdbase" ); +#endif + //string vOutName = CurrentTemplateData.VertexFunctionData.OutVarName; + string fInName = CurrentTemplateData.FragmentFunctionData.InVarName; + string worldPos = GetWorldPos(); + m_currentDataCollector.AddLocalVariable( uniqueId, "UNITY_LIGHT_ATTENUATION(ase_atten, " + fInName + ", " + worldPos + ")" ); + return "ase_atten"; + + } + + public string GenerateRotationIndependentObjectScale( ref MasterNodeDataCollector dataCollector, int uniqueId ) + { + string value = string.Empty; + + if( m_currentSRPType != TemplateSRPType.BuiltIn ) + { + value = "float3( length( GetWorldToObjectMatrix()[ 0 ].xyz ), length( GetWorldToObjectMatrix()[ 1 ].xyz ), length( GetWorldToObjectMatrix()[ 2 ].xyz ) )"; + } + else + { + value = "float3( length( unity_WorldToObject[ 0 ].xyz ), length( unity_WorldToObject[ 1 ].xyz ), length( unity_WorldToObject[ 2 ].xyz ) )"; + } + value = "( 1.0 / "+ value +" )"; + dataCollector.AddLocalVariable( uniqueId, PrecisionType.Float, WirePortDataType.FLOAT3, GeneratorUtils.ParentObjectScaleStr, value ); + return GeneratorUtils.ParentObjectScaleStr; + } + + public string GenerateObjectScale( ref MasterNodeDataCollector dataCollector, int uniqueId ) + { + string value = string.Empty; + + if( m_currentSRPType != TemplateSRPType.BuiltIn ) + { + value = "float3( length( GetObjectToWorldMatrix()[ 0 ].xyz ), length( GetObjectToWorldMatrix()[ 1 ].xyz ), length( GetObjectToWorldMatrix()[ 2 ].xyz ) )"; + } + else + { + value = "float3( length( unity_ObjectToWorld[ 0 ].xyz ), length( unity_ObjectToWorld[ 1 ].xyz ), length( unity_ObjectToWorld[ 2 ].xyz ) )"; + } + dataCollector.AddLocalVariable( uniqueId, PrecisionType.Float, WirePortDataType.FLOAT3, GeneratorUtils.ObjectScaleStr, value ); + return GeneratorUtils.ObjectScaleStr; + } + + public string GetWorldPos( bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment ) + { + // overriding precision + var precision = PrecisionType.Float; + + string result = string.Empty; + if( GetCustomInterpolatedData( TemplateInfoOnSematics.WORLD_POSITION, WirePortDataType.FLOAT3, precision, ref result, useMasterNodeCategory, customCategory ) ) + { + return result; + } + else if( m_currentSRPType == TemplateSRPType.HD ) + { + if( GetCustomInterpolatedData( TemplateInfoOnSematics.RELATIVE_WORLD_POS, WirePortDataType.FLOAT3, precision, ref result, useMasterNodeCategory, customCategory ) ) + { + string worldPosVarName = GeneratorUtils.WorldPositionStr; + string relWorldPosConversion = string.Format( "GetAbsolutePositionWS( {0} )", result ); + m_currentDataCollector.AddLocalVariable( -1, precision, WirePortDataType.FLOAT3, worldPosVarName, relWorldPosConversion ); + return worldPosVarName; + } + } + + string varName = GeneratorUtils.WorldPositionStr;//UIUtils.GetInputValueFromType( SurfaceInputs.WORLD_POS ); + if( HasCustomInterpolatedData( varName, useMasterNodeCategory, customCategory ) ) + return varName; + + if( !m_availableVertData.ContainsKey( TemplateInfoOnSematics.POSITION ) ) + { + UIUtils.ShowMessage( "Attempting to access inexisting vertex position to calculate world pos" ); + return "half3(0,0,0)"; + } + + string vertexPos = m_availableVertData[ TemplateInfoOnSematics.POSITION ].VarName; + + string worldPosConversion = string.Empty; + + //Check if world pos already defined in the vertex body + if( !GetCustomInterpolatedData( TemplateInfoOnSematics.WORLD_POSITION, WirePortDataType.FLOAT3, precision, ref worldPosConversion, false, MasterNodePortCategory.Vertex ) ) + { + if( m_currentSRPType == TemplateSRPType.HD ) + { +#if UNITY_2018_3_OR_NEWER + worldPosConversion = string.Format( "GetAbsolutePositionWS( TransformObjectToWorld( ({0}).xyz ) )", vertexPos ); +#else + worldPosConversion = string.Format( "GetAbsolutePositionWS( mul( GetObjectToWorldMatrix(), {0}).xyz )", vertexPos ); +#endif + } + else if( m_currentSRPType == TemplateSRPType.Lightweight ) + { + worldPosConversion = string.Format( "mul(GetObjectToWorldMatrix(), {0}).xyz", vertexPos ); + } + else + { + worldPosConversion = string.Format( "mul(unity_ObjectToWorld, {0}).xyz", vertexPos ); + } + } + RegisterCustomInterpolatedData( varName, WirePortDataType.FLOAT3, precision, worldPosConversion, useMasterNodeCategory, customCategory ); + return varName; + } + + public string GetClipPosForValue( string customVertexPos, string outputId, bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment ) + { + string varName = GeneratorUtils.ClipPositionStr + outputId; + if( HasCustomInterpolatedData( varName, useMasterNodeCategory, customCategory ) ) + return varName; + + if( !m_availableVertData.ContainsKey( TemplateInfoOnSematics.POSITION ) ) + { + UIUtils.ShowMessage( "Attempting to access inexisting vertex position to calculate clip pos" ); + return "half4(0,0,0,0)"; + } + + string formatStr = string.Empty; + switch( m_currentSRPType ) + { + default: + case TemplateSRPType.BuiltIn: + formatStr = "UnityObjectToClipPos({0})"; + break; + case TemplateSRPType.HD: + formatStr = "TransformWorldToHClip( TransformObjectToWorld({0}))"; + break; + case TemplateSRPType.Lightweight: + formatStr = "TransformObjectToHClip(({0}).xyz)"; + break; + } + + string clipSpaceConversion = string.Format( formatStr, customVertexPos ); + RegisterCustomInterpolatedData( varName, WirePortDataType.FLOAT4, PrecisionType.Float, clipSpaceConversion, useMasterNodeCategory, customCategory ); + return varName; + } + + public string GetClipPos( bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment ) + { + string varName = GeneratorUtils.ClipPositionStr;// "clipPos"; + if( HasCustomInterpolatedData( varName, useMasterNodeCategory, customCategory ) ) + return varName; + + if( !m_availableVertData.ContainsKey( TemplateInfoOnSematics.POSITION ) ) + { + UIUtils.ShowMessage( "Attempting to access inexisting vertex position to calculate clip pos" ); + return "half4(0,0,0,0)"; + } + + string vertexPos = m_availableVertData[ TemplateInfoOnSematics.POSITION ].VarName; + + string formatStr = string.Empty; + switch( m_currentSRPType ) + { + default: + case TemplateSRPType.BuiltIn: + formatStr = "UnityObjectToClipPos({0})"; + break; + case TemplateSRPType.HD: + formatStr = "TransformWorldToHClip( TransformObjectToWorld({0}))"; + break; + case TemplateSRPType.Lightweight: + formatStr = "TransformObjectToHClip(({0}).xyz)"; + break; + } + + string clipSpaceConversion = string.Format( formatStr, vertexPos ); + RegisterCustomInterpolatedData( varName, WirePortDataType.FLOAT4, PrecisionType.Float, clipSpaceConversion, useMasterNodeCategory, customCategory ); + return varName; + } + + public string GetScreenPosForValue( PrecisionType precision, string customVertexPos, string outputId, bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment ) + { + // overriding precision + precision = PrecisionType.Float; + + string varName = UIUtils.GetInputValueFromType( SurfaceInputs.SCREEN_POS ) + outputId; + if( HasCustomInterpolatedData( varName, useMasterNodeCategory, customCategory ) ) + return varName; + + string clipSpacePos = GetClipPosForValue( customVertexPos, outputId, false, MasterNodePortCategory.Vertex ); + string screenPosConversion = string.Empty; + if( m_currentSRPType == TemplateSRPType.HD ) + { + screenPosConversion = string.Format( "ComputeScreenPos( {0} , _ProjectionParams.x )", clipSpacePos ); + } + else + { + screenPosConversion = string.Format( "ComputeScreenPos({0})", clipSpacePos ); + } + RegisterCustomInterpolatedData( varName, WirePortDataType.FLOAT4, precision, screenPosConversion, useMasterNodeCategory, customCategory ); + return varName; + } + + public string GetScreenPos( PrecisionType precision, bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment ) + { + // overriding precision + precision = PrecisionType.Float; + + string result = string.Empty; + if( GetCustomInterpolatedData( TemplateInfoOnSematics.SCREEN_POSITION, WirePortDataType.FLOAT4, precision, ref result, useMasterNodeCategory, customCategory ) ) + { + return result; + } + + string varName = UIUtils.GetInputValueFromType( SurfaceInputs.SCREEN_POS ); + if( HasCustomInterpolatedData( varName, useMasterNodeCategory, customCategory ) ) + return varName; + + string clipSpacePos = GetClipPos( false, MasterNodePortCategory.Vertex ); + string screenPosConversion = string.Empty; + if( m_currentSRPType == TemplateSRPType.HD ) + { + screenPosConversion = string.Format( "ComputeScreenPos( {0} , _ProjectionParams.x )", clipSpacePos ); + } + else + { + screenPosConversion = string.Format( "ComputeScreenPos({0})", clipSpacePos ); + } + RegisterCustomInterpolatedData( varName, WirePortDataType.FLOAT4, precision, screenPosConversion, useMasterNodeCategory, customCategory ); + return varName; + } + + public string GetScreenPosNormalized( PrecisionType precision, bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment ) + { + string result = string.Empty; + if( GetCustomInterpolatedData( TemplateInfoOnSematics.SCREEN_POSITION_NORMALIZED, WirePortDataType.FLOAT4, precision, ref result, useMasterNodeCategory, customCategory ) ) + { + return result; + } + + string varName = GeneratorUtils.ScreenPositionNormalizedStr;// "norm" + UIUtils.GetInputValueFromType( SurfaceInputs.SCREEN_POS ); + string screenPos = GetScreenPos( precision, useMasterNodeCategory, customCategory ); + string clipPlaneTestOp = string.Format( "{0}.z = ( UNITY_NEAR_CLIP_VALUE >= 0 ) ? {0}.z : {0}.z * 0.5 + 0.5;", varName ); + m_currentDataCollector.AddLocalVariable( -1, precision, WirePortDataType.FLOAT4, varName, string.Format( GeneratorUtils.NormalizedScreenPosFormat, screenPos ) ); + m_currentDataCollector.AddLocalVariable( -1, clipPlaneTestOp ); + return varName; + } + + public string GetViewDir( bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment, NormalizeType normalizeType = NormalizeType.Regular ) + { + // overriding precision + var precision = PrecisionType.Float; + + string result = string.Empty; + if( GetCustomInterpolatedData( TemplateInfoOnSematics.WORLD_VIEW_DIR, WirePortDataType.FLOAT3, precision, ref result, useMasterNodeCategory, customCategory ) ) + return result; + + string varName = GeneratorUtils.WorldViewDirectionStr;//UIUtils.GetInputValueFromType( SurfaceInputs.VIEW_DIR ); + if( HasCustomInterpolatedData( varName, useMasterNodeCategory, customCategory ) ) + return varName; + + string worldPos = GetWorldPos(); + + string formatStr = string.Empty; + if( IsSRP ) + formatStr = "( _WorldSpaceCameraPos.xyz - {0} )"; + else + formatStr = "UnityWorldSpaceViewDir({0})"; + + string viewDir = string.Format( formatStr, worldPos ); + m_currentDataCollector.AddLocalVariable( -1, precision, WirePortDataType.FLOAT3, varName, viewDir ); + + switch( normalizeType ) + { + default: + case NormalizeType.Off: + break; + case NormalizeType.Regular: + m_currentDataCollector.AddLocalVariable( -1, varName + " = normalize(" + varName + ");" ); + break; + case NormalizeType.Safe: + m_currentDataCollector.AddLocalVariable( -1, varName + " = " + TemplateHelperFunctions.SafeNormalize( m_currentDataCollector, varName ) + ";" ); + break; + } + + + //RegisterCustomInterpolatedData( varName, WirePortDataType.FLOAT3, PrecisionType.Float, viewDir, useMasterNodeCategory, customCategory ); + return varName; + } + + public string GetTangentViewDir( PrecisionType precisionType, bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment, NormalizeType normalizeType = NormalizeType.Regular ) + { + string varName = GeneratorUtils.TangentViewDirectionStr; + if( HasCustomInterpolatedData( varName, useMasterNodeCategory, customCategory ) ) + return varName; + + string tanToWorld0 = string.Empty; + string tanToWorld1 = string.Empty; + string tanToWorld2 = string.Empty; + + GetWorldTangentTf( precisionType, out tanToWorld0, out tanToWorld1, out tanToWorld2 ); + string viewDir = GetViewDir(); + string tanViewDir = string.Format( " {0} * {3}.x + {1} * {3}.y + {2} * {3}.z", tanToWorld0, tanToWorld1, tanToWorld2, viewDir ); + + m_currentDataCollector.AddLocalVariable( -1, precisionType, WirePortDataType.FLOAT3, varName, tanViewDir ); + switch( normalizeType ) + { + default: + case NormalizeType.Off: break; + case NormalizeType.Regular: + m_currentDataCollector.AddLocalVariable( -1, varName + " = normalize(" + varName + ");" ); + break; + case NormalizeType.Safe: + m_currentDataCollector.AddLocalVariable( -1, varName + " = " + TemplateHelperFunctions.SafeNormalize( m_currentDataCollector, varName ) + ";" ); + break; + } + + return varName; + } + + public void GetWorldTangentTf( PrecisionType precisionType, out string tanToWorld0, out string tanToWorld1, out string tanToWorld2, bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment ) + { + tanToWorld0 = "tanToWorld0"; + tanToWorld1 = "tanToWorld1"; + tanToWorld2 = "tanToWorld2"; + + if( HasCustomInterpolatedData( tanToWorld0, useMasterNodeCategory, customCategory ) || + HasCustomInterpolatedData( tanToWorld1, useMasterNodeCategory, customCategory ) || + HasCustomInterpolatedData( tanToWorld2, useMasterNodeCategory, customCategory ) ) + return; + + string worldTangent = GetWorldTangent( precisionType, useMasterNodeCategory, customCategory ); + string worldNormal = GetWorldNormal( precisionType, useMasterNodeCategory, customCategory ); + string worldBinormal = GetWorldBinormal( precisionType, useMasterNodeCategory, customCategory ); + + string tanToWorldVar0 = string.Format( "float3( {0}.x, {1}.x, {2}.x )", worldTangent, worldBinormal, worldNormal ); + string tanToWorldVar1 = string.Format( "float3( {0}.y, {1}.y, {2}.y )", worldTangent, worldBinormal, worldNormal ); + string tanToWorldVar2 = string.Format( "float3( {0}.z, {1}.z, {2}.z )", worldTangent, worldBinormal, worldNormal ); + + if( customCategory == MasterNodePortCategory.Vertex ) + { + RegisterCustomInterpolatedData( tanToWorld0, WirePortDataType.FLOAT3, precisionType, tanToWorldVar0, useMasterNodeCategory, customCategory ); + RegisterCustomInterpolatedData( tanToWorld1, WirePortDataType.FLOAT3, precisionType, tanToWorldVar1, useMasterNodeCategory, customCategory ); + RegisterCustomInterpolatedData( tanToWorld2, WirePortDataType.FLOAT3, precisionType, tanToWorldVar2, useMasterNodeCategory, customCategory ); + } + else + { + m_currentDataCollector.AddLocalVariable( -1, precisionType, WirePortDataType.FLOAT3, tanToWorld0, tanToWorldVar0 ); + m_currentDataCollector.AddLocalVariable( -1, precisionType, WirePortDataType.FLOAT3, tanToWorld1, tanToWorldVar1 ); + m_currentDataCollector.AddLocalVariable( -1, precisionType, WirePortDataType.FLOAT3, tanToWorld2, tanToWorldVar2 ); + } + } + + public string GetTangentToWorldMatrixFast( PrecisionType precisionType, bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment ) + { + string worldTangent = GetWorldTangent( precisionType ); + string worldNormal = GetWorldNormal( precisionType ); + string worldBinormal = GetWorldBinormal( precisionType ); + + string varName = GeneratorUtils.TangentToWorldFastStr; + if( HasCustomInterpolatedData( varName, useMasterNodeCategory, customCategory ) ) + return varName; + + string result = string.Format( "float3x3({0}.x,{1}.x,{2}.x,{0}.y,{1}.y,{2}.y,{0}.z,{1}.z,{2}.z)", worldTangent, worldBinormal, worldNormal ); + m_currentDataCollector.AddLocalVariable( -1, precisionType, WirePortDataType.FLOAT3x3, GeneratorUtils.TangentToWorldFastStr, result ); + return GeneratorUtils.TangentToWorldFastStr; + } + + public string GetTangentToWorldMatrixPrecise( PrecisionType precisionType, bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment ) + { + string worldToTangent = GetWorldToTangentMatrix( precisionType, useMasterNodeCategory, customCategory ); + GeneratorUtils.Add3x3InverseFunction( ref m_currentDataCollector, UIUtils.PrecisionWirePortToCgType( precisionType, WirePortDataType.FLOAT ) ); + m_currentDataCollector.AddLocalVariable( -1, precisionType, WirePortDataType.FLOAT3x3, GeneratorUtils.TangentToWorldPreciseStr, string.Format( GeneratorUtils.Inverse3x3Header, worldToTangent ) ); + return GeneratorUtils.TangentToWorldPreciseStr; + } + + public string GetWorldToTangentMatrix( PrecisionType precisionType, bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment ) + { + string worldTangent = GetWorldTangent( precisionType ); + string worldNormal = GetWorldNormal( precisionType ); + string worldBinormal = GetWorldBinormal( precisionType ); + + string varName = GeneratorUtils.WorldToTangentStr;// "worldToTanMat"; + if( HasCustomInterpolatedData( varName, useMasterNodeCategory, customCategory ) ) + return varName; + string worldTanMat = string.Format( "float3x3({0},{1},{2})", worldTangent, worldBinormal, worldNormal ); + + m_currentDataCollector.AddLocalVariable( -1, precisionType, WirePortDataType.FLOAT3x3, varName, worldTanMat ); + return varName; + } + + public string GetObjectToViewPos( PrecisionType precision, bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment ) + { + // overriding precision + precision = PrecisionType.Float; + + string varName = "objectToViewPos"; + if( HasCustomInterpolatedData( varName, useMasterNodeCategory, customCategory ) ) + return varName; + string vertexPos = GetVertexPosition( WirePortDataType.FLOAT3, precision, false, MasterNodePortCategory.Vertex ); + + string formatStr = string.Empty; + if( IsSRP ) + formatStr = "TransformWorldToView(TransformObjectToWorld({0}))"; + else + formatStr = "UnityObjectToViewPos({0})"; + + string objectToViewPosValue = string.Format( formatStr, vertexPos ); + RegisterCustomInterpolatedData( varName, WirePortDataType.FLOAT3, precision, objectToViewPosValue, useMasterNodeCategory, customCategory ); + return varName; + } + + public string GetEyeDepth( PrecisionType precision, bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment, int viewSpace = 0 ) + { + // overriding precision + precision = PrecisionType.Float; + + string varName = "eyeDepth"; + if( HasCustomInterpolatedData( varName, useMasterNodeCategory, customCategory ) ) + return varName; + string objectToView = GetObjectToViewPos( precision, false, MasterNodePortCategory.Vertex ); + string eyeDepthValue = string.Format( "-{0}.z", objectToView ); + if( viewSpace == 1 ) + { + eyeDepthValue += " * _ProjectionParams.w"; + } + + RegisterCustomInterpolatedData( varName, WirePortDataType.FLOAT, precision, eyeDepthValue, useMasterNodeCategory, customCategory ); + return varName; + } + + public string GetObjectSpaceLightDir( PrecisionType precisionType, bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment ) + { + if( !IsSRP ) + { + m_currentDataCollector.AddToIncludes( -1, Constants.UnityLightingLib ); + m_currentDataCollector.AddToIncludes( -1, Constants.UnityAutoLightLib ); + } + + string varName = "objectSpaceLightDir"; + + if( HasCustomInterpolatedData( varName, useMasterNodeCategory, customCategory ) ) + return varName; + + string vertexPos = GetVertexPosition( WirePortDataType.FLOAT4, precisionType, false, MasterNodePortCategory.Vertex ); + + string objectSpaceLightDir = string.Empty; + switch( m_currentSRPType ) + { + default: + case TemplateSRPType.BuiltIn: + objectSpaceLightDir = string.Format( "ObjSpaceLightDir({0})", vertexPos ); + break; + case TemplateSRPType.HD: + string worldSpaceLightDir = GetWorldSpaceLightDir( precisionType, useMasterNodeCategory, customCategory ); + objectSpaceLightDir = string.Format( "mul( GetWorldToObjectMatrix(), {0} ).xyz", worldSpaceLightDir ); + break; + case TemplateSRPType.Lightweight: + objectSpaceLightDir = "mul( GetWorldToObjectMatrix(), _MainLightPosition ).xyz"; + break; + } + + RegisterCustomInterpolatedData( varName, WirePortDataType.FLOAT3, precisionType, objectSpaceLightDir, useMasterNodeCategory, customCategory ); + return varName; + } + + public string GetWorldSpaceLightDir( PrecisionType precision, bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment ) + { + if( !IsSRP ) + { + m_currentDataCollector.AddToIncludes( -1, Constants.UnityLightingLib ); + m_currentDataCollector.AddToIncludes( -1, Constants.UnityAutoLightLib ); + AddLateDirective( AdditionalLineType.Custom, "//This is a late directive" ); + } + else + { + + string lightVar; + if( m_currentSRPType == TemplateSRPType.HD ) + { + AddHDLightInfo(); + lightVar = "-" + string.Format( TemplateHelperFunctions.HDLightInfoFormat, "0", "forward" ); + } + else + { + lightVar = "_MainLightPosition.xyz"; + } + return m_currentDataCollector.SafeNormalizeLightDir ? string.Format( "SafeNormalize({0})", lightVar ) : lightVar; + } + + string varName = "worldSpaceLightDir"; + if( HasCustomInterpolatedData( varName, useMasterNodeCategory, customCategory ) ) + return varName; + + string worldPos = GetWorldPos( useMasterNodeCategory, customCategory ); + string worldSpaceLightDir = string.Format( "UnityWorldSpaceLightDir({0})", worldPos ); + if( m_currentDataCollector.SafeNormalizeLightDir ) + { + if( IsSRP ) + { + worldSpaceLightDir = string.Format( "SafeNormalize{0})", worldSpaceLightDir ); + } + else + { + m_currentDataCollector.AddToIncludes( -1, Constants.UnityBRDFLib ); + worldSpaceLightDir = string.Format( "Unity_SafeNormalize({0})", worldSpaceLightDir ); + } + } + + m_currentDataCollector.AddLocalVariable( -1, precision, WirePortDataType.FLOAT3, varName, worldSpaceLightDir ); + return varName; + } + + public void RegisterCustomInterpolatedData( string name, WirePortDataType dataType, PrecisionType precision, string vertexInstruction, bool useMasterNodeCategory = true, + MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment, bool noInterpolationFlag = false, bool sampleFlag = false ) + { + bool addLocalVariable = !name.Equals( vertexInstruction ); + + MasterNodePortCategory category = useMasterNodeCategory ? m_currentDataCollector.PortCategory : customCategory; + + if( !m_customInterpolatedData.ContainsKey( name ) ) + { + m_customInterpolatedData.Add( name, new TemplateCustomData( name, dataType ) ); + } + + if( !m_customInterpolatedData[ name ].IsVertex ) + { + m_customInterpolatedData[ name ].IsVertex = true; + if( addLocalVariable ) + m_currentDataCollector.AddToVertexLocalVariables( -1, precision, dataType, name, vertexInstruction ); + } + + if( category == MasterNodePortCategory.Fragment ) + { + if( !m_customInterpolatedData[ name ].IsFragment ) + { + m_customInterpolatedData[ name ].IsFragment = true; + TemplateVertexData interpData = RequestNewInterpolator( dataType, false,null, noInterpolationFlag,sampleFlag ); + if( interpData == null ) + { + Debug.LogErrorFormat( "Could not assign interpolator of type {0} to variable {1}", dataType, name ); + return; + } + + m_currentDataCollector.AddToVertexLocalVariables( -1, m_currentTemplateData.VertexFunctionData.OutVarName + "." + interpData.VarNameWithSwizzle, name ); + m_currentDataCollector.AddToLocalVariables( -1, precision, dataType, name, m_currentTemplateData.FragmentFunctionData.InVarName + "." + interpData.VarNameWithSwizzle ); + } + } + } + + public bool HasCustomInterpolatedData( string name, bool useMasterNodeCategory = true, MasterNodePortCategory customCategory = MasterNodePortCategory.Fragment ) + { + if( m_customInterpolatedData.ContainsKey( name ) ) + { + MasterNodePortCategory category = useMasterNodeCategory ? m_currentDataCollector.PortCategory : customCategory; + return ( category == MasterNodePortCategory.Fragment ) ? m_customInterpolatedData[ name ].IsFragment : m_customInterpolatedData[ name ].IsVertex; + } + return false; + } + + public bool HasFragmentInputParams + { + get + { + if( m_fragmentInputParams != null ) + return m_fragmentInputParams.Count > 0; + + return false; + } + } + + public string FragInputParamsStr + { + get + { + string value = string.Empty; + if( m_fragmentInputParams != null && m_fragmentInputParams.Count > 0 ) + { + int count = m_fragmentInputParams.Count; + if( count > 0 ) + { + value = ", "; + foreach( KeyValuePair kvp in m_fragmentInputParams ) + { + value += kvp.Value.Declaration; + + if( --count > 0 ) + { + value += " , "; + } + } + } + } + return value; + } + } + + public string VertexInputParamsStr + { + get + { + string value = string.Empty; + if( m_vertexInputParams != null && m_vertexInputParams.Count > 0 ) + { + int count = m_vertexInputParams.Count; + if( count > 0 ) + { + value = ", "; + foreach( KeyValuePair kvp in m_vertexInputParams ) + { + value += kvp.Value.Declaration; + + if( --count > 0 ) + { + value += " , "; + } + } + } + } + return value; + } + } + + public void Destroy() + { + m_currentTemplate = null; + + m_currentTemplateData = null; + + m_currentDataCollector = null; + + if( m_fullSrpBatcherPropertiesList != null ) + { + m_fullSrpBatcherPropertiesList.Clear(); + m_fullSrpBatcherPropertiesList = null; + } + + if( m_srpBatcherPropertiesList != null ) + { + m_srpBatcherPropertiesList.Clear(); + m_srpBatcherPropertiesList = null; + } + + if( m_srpBatcherPropertiesDict != null ) + { + m_srpBatcherPropertiesDict.Clear(); + m_srpBatcherPropertiesDict = null; + } + + if( m_lateDirectivesList != null ) + { + m_lateDirectivesList.Clear(); + m_lateDirectivesList = null; + } + + if( m_lateDirectivesDict != null ) + { + m_lateDirectivesDict.Clear(); + m_lateDirectivesDict = null; + } + + if( m_registeredVertexData != null ) + { + m_registeredVertexData.Clear(); + m_registeredVertexData = null; + } + + if( m_vertexInputParams != null ) + { + m_vertexInputParams.Clear(); + m_vertexInputParams = null; + } + + if( m_fragmentInputParams != null ) + { + m_fragmentInputParams.Clear(); + m_fragmentInputParams = null; + } + + if( m_vertexDataDict != null ) + { + m_vertexDataDict.Clear(); + m_vertexDataDict = null; + } + + if( m_interpolatorData != null ) + { + m_interpolatorData.Destroy(); + m_interpolatorData = null; + } + + if( m_availableFragData != null ) + { + m_availableFragData.Clear(); + m_availableFragData = null; + } + + if( m_availableVertData != null ) + { + m_availableVertData.Clear(); + m_availableVertData = null; + } + + if( m_customInterpolatedData != null ) + { + m_customInterpolatedData.Clear(); + m_customInterpolatedData = null; + } + + if( m_specialVertexLocalVars != null ) + { + m_specialVertexLocalVars.Clear(); + m_specialVertexLocalVars = null; + } + + if( m_specialFragmentLocalVars != null ) + { + m_specialFragmentLocalVars.Clear(); + m_specialFragmentLocalVars = null; + } + } + + public void BuildCBuffer( int nodeId ) + { + m_fullSrpBatcherPropertiesList.Clear(); + if( m_srpBatcherPropertiesList.Count > 0 ) + { + var regex = new Regex( @"(\d)\s+\b" ); + m_srpBatcherPropertiesList.Sort( ( a, b ) => + { + var matchA = regex.Match( a.PropertyName ); + int sizeA = 0; + if( matchA.Groups.Count > 1 && matchA.Groups[ 1 ].Value.Length > 0 ) + sizeA = Convert.ToInt32( matchA.Groups[ 1 ].Value, System.Globalization.CultureInfo.InvariantCulture ); + + var matchB = regex.Match( b.PropertyName ); + int sizeB = 0; + if( matchB.Groups.Count > 1 && matchB.Groups[ 1 ].Value.Length > 0 ) + sizeB = Convert.ToInt32( matchB.Groups[ 1 ].Value, System.Globalization.CultureInfo.InvariantCulture ); + + return sizeB.CompareTo( sizeA ); + } ); + + m_fullSrpBatcherPropertiesList.Insert(0, new PropertyDataCollector( nodeId, IOUtils.SRPCBufferPropertiesBegin )); + m_fullSrpBatcherPropertiesList.AddRange( m_srpBatcherPropertiesList ); + m_fullSrpBatcherPropertiesList.Add( new PropertyDataCollector( nodeId, IOUtils.SRPCBufferPropertiesEnd ) ); + } + } + + + public void DumpSRPBatcher() + { + for( int i = 0; i < m_srpBatcherPropertiesList.Count; i++ ) + { + Debug.Log( i + "::" + m_srpBatcherPropertiesList[ i ].PropertyName ); + } + } + + public const string GlobalMaxInterpolatorReachedMsg = "Maximum amount of interpolators reached!\nPlease consider optmizing your shader!"; + public const string MaxInterpolatorSMReachedMsg = "Maximum amount of interpolators reached for current shader model on pass {0}! Please consider increasing the shader model to {1}!"; + public void CheckInterpolatorOverflow( string currShaderModel, string passName ) + { + int maxInterpolatorAmount = TemplateHelperFunctions.AvailableInterpolators[ currShaderModel ]; + int currInterpolatorAmount = 1 + TemplateHelperFunctions.SemanticToInt[ InterpData.AvailableInterpolators[ InterpData.AvailableInterpolators.Count - 1 ].Semantic ]; + if( currInterpolatorAmount > maxInterpolatorAmount ) + { + string shaderModel = string.Empty; + if( TemplateHelperFunctions.GetShaderModelForInterpolatorAmount( currInterpolatorAmount, ref shaderModel ) ) + { + UIUtils.ShowMessage( string.Format( MaxInterpolatorSMReachedMsg, passName, shaderModel ), MessageSeverity.Error ); + } + else + { + UIUtils.ShowMessage( GlobalMaxInterpolatorReachedMsg, MessageSeverity.Error ); + } + } + } + + public Dictionary FragInputParameters { get { return m_fragmentInputParams; } } + + public bool HasVertexInputParams + { + get + { + if( m_vertexInputParams != null ) + return m_vertexInputParams.Count > 0; + + return false; + } + } + + public Dictionary VertexInputParameters { get { return m_vertexInputParams; } } + public TemplateData CurrentTemplateData { get { return m_currentTemplateData; } } + public int MultipassSubshaderIdx { get { return m_multipassSubshaderIdx; } } + public int MultipassPassIdx { get { return m_multipassPassIdx; } } + public TemplateSRPType CurrentSRPType { get { return m_currentSRPType; } set { m_currentSRPType = value; } } + public bool IsHDRP { get { return m_currentSRPType == TemplateSRPType.HD; } } + public bool IsLWRP { get { return m_currentSRPType == TemplateSRPType.Lightweight; } } + public bool IsSRP { get { return ( m_currentSRPType == TemplateSRPType.Lightweight || m_currentSRPType == TemplateSRPType.HD ); } } + public TemplateInterpData InterpData { get { return m_interpolatorData; } } + public List LateDirectivesList { get { return m_lateDirectivesList; } } + public List SrpBatcherPropertiesList { get { return m_srpBatcherPropertiesList; } } + public List FullSrpBatcherPropertiesList { get { return m_fullSrpBatcherPropertiesList; } } + public Dictionary VertexDataDict { get { return m_vertexDataDict; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateDataCollector.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateDataCollector.cs.meta new file mode 100644 index 0000000..9386f5f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateDataCollector.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c757602c408f7354b96c2a5eb21662a4 +timeCreated: 1495710491 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateDataParent.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateDataParent.cs new file mode 100644 index 0000000..b7c3fd0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateDataParent.cs @@ -0,0 +1,217 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + public enum TemplateDataType + { + LegacySinglePass, + MultiPass + } + + [Serializable] + public class TemplateIncludePragmaContainter + { + [SerializeField] + private int m_nativeTopIndex = -1; + + [SerializeField] + private List m_nativeDirectivesList = new List(); + + [SerializeField] + private List m_includesList = new List(); + private Dictionary m_includesDict = new Dictionary(); + + [SerializeField] + private List m_pragmasList = new List(); + private Dictionary m_pragmasDict = new Dictionary(); + + [SerializeField] + private List m_definesList = new List(); + private Dictionary m_definesDict = new Dictionary(); + + public void RefreshIncludesList() + { + if ( m_includesDict.Count != m_includesList.Count ) + { + m_includesDict.Clear(); + int count = m_includesList.Count; + for ( int i = 0; i < count; i++ ) + { + m_includesDict.Add( m_includesList[ i ], m_includesList[ i ] ); + } + } + } + + public void RefreshPragmasList() + { + if ( m_pragmasDict.Count != m_pragmasList.Count ) + { + m_pragmasDict.Clear(); + int count = m_pragmasList.Count; + for ( int i = 0; i < count; i++ ) + { + m_pragmasDict.Add( m_pragmasList[ i ], m_pragmasList[ i ] ); + } + } + } + + + public void RefreshDefinesList() + { + if ( m_definesDict.Count != m_definesList.Count ) + { + m_definesDict.Clear(); + int count = m_definesList.Count; + for ( int i = 0; i < count; i++ ) + { + m_definesDict.Add( m_definesList[ i ], m_definesList[ i ] ); + } + } + } + + public bool HasInclude( string include ) + { + RefreshIncludesList(); + return m_includesDict.ContainsKey( include ); + } + + public bool HasPragma( string pragma ) + { + RefreshPragmasList(); + return m_pragmasDict.ContainsKey( pragma ); + } + + public bool HasDefine( string pragma ) + { + RefreshDefinesList(); + return m_definesDict.ContainsKey( pragma ); + } + + public void AddInclude( string include ) + { + RefreshIncludesList(); + if ( !m_includesDict.ContainsKey( include ) ) + { + m_includesList.Add( include ); + m_includesDict.Add( include, include ); + } + } + + public void AddPragma( string pragma ) + { + RefreshPragmasList(); + if ( !m_pragmasDict.ContainsKey( pragma ) ) + { + m_pragmasList.Add( pragma ); + m_pragmasDict.Add( pragma, pragma ); + } + } + + public void AddDefine( string define ) + { + RefreshDefinesList(); + if ( !m_definesDict.ContainsKey( define ) ) + { + m_definesList.Add( define ); + m_definesDict.Add( define, define ); + } + } + + public void AddNativeDirective( string native, int topIndex ) + { + m_nativeTopIndex = topIndex; + m_nativeDirectivesList.Add( native ); + } + + public void Destroy() + { + m_nativeDirectivesList.Clear(); + m_nativeDirectivesList = null; + + + m_includesList.Clear(); + m_includesDict.Clear(); + m_includesList = null; + m_includesDict = null; + + m_pragmasList.Clear(); + m_pragmasDict.Clear(); + m_pragmasList = null; + m_pragmasDict = null; + + m_definesList.Clear(); + m_definesDict.Clear(); + m_definesList = null; + m_definesDict = null; + } + + public List IncludesList { get { return m_includesList; } } + public List PragmasList { get { return m_pragmasList; } } + public List DefinesList { get { return m_definesList; } } + public List NativeDirectivesList { get { return m_nativeDirectivesList; } } + public int NativeTopIndex { get { return m_nativeTopIndex; } } + + } + + [Serializable] + public class TemplateInfoContainer + { + public string Id = string.Empty; + public string Data = string.Empty; + public int Index = -1; + public bool IsValid { get { return Index > -1; } } + public void Reset() + { + Id = string.Empty; + Data = string.Empty; + Index = -1; + } + } + + [Serializable] + public class TemplateDataParent : ScriptableObject + { + [SerializeField] + protected TemplateDataType m_templateType; + + [SerializeField] + protected string m_name; + + [SerializeField] + protected string m_guid; + + [SerializeField] + protected int m_orderId; + + [SerializeField] + protected string m_defaultShaderName = string.Empty; + + [SerializeField] + protected bool m_isValid = true; + + [SerializeField] + protected bool m_communityTemplate = false; + + public virtual void Destroy() { } + public virtual bool Reload() { return true; } + public string Name + { + get { return m_name; } + set + { + m_name = value.StartsWith( "Hidden/" ) ? value.Replace( "Hidden/", string.Empty ) : value; + } + } + public string GUID { get { return m_guid; } set { m_guid = value; } } + public int OrderId { get { return m_orderId; } set { m_orderId = value; } } + public string DefaultShaderName { get { return m_defaultShaderName; } set { m_defaultShaderName = value; } } + public bool IsValid { get { return m_isValid; } } + public TemplateDataType TemplateType { get { return m_templateType; } } + public virtual void Init( string name, string guid, bool isCommunity ) { m_communityTemplate = isCommunity; } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateDataParent.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateDataParent.cs.meta new file mode 100644 index 0000000..49aee2a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateDataParent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4e8f3788c7c239042b3cc3d086311227 +timeCreated: 1518720013 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateDepthModule.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateDepthModule.cs new file mode 100644 index 0000000..a3f6c7f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateDepthModule.cs @@ -0,0 +1,397 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + public sealed class TemplateDepthModule : TemplateModuleParent + { + private const string ZWriteFormatter = "ZWrite {0}\n"; + private const string ZTestFormatter = "ZTest {0}\n"; + + [SerializeField] + private bool m_validZTest = false; + + [SerializeField] + private InlineProperty m_zTestMode = new InlineProperty( 0 ); + + [SerializeField] + private bool m_validZWrite = false; + + [SerializeField] + private InlineProperty m_zWriteMode = new InlineProperty( 0 ); + + [SerializeField] + private InlineProperty m_offsetFactor = new InlineProperty( 0 ); + + [SerializeField] + private InlineProperty m_offsetUnits = new InlineProperty( 0 ); + + [SerializeField] + private bool m_offsetEnabled = false; + + [SerializeField] + private bool m_validOffset = false; + + public TemplateDepthModule() : base( "Depth" ) { } + + public void CopyFrom( TemplateDepthModule other, bool allData ) + { + if( allData ) + { + m_independentModule = other.IndependentModule; + m_validZTest = other.ValidZTest; + m_validZWrite = other.ValidZWrite; + m_validOffset = other.ValidOffset; + } + + m_zTestMode.CopyFrom( other.ZTestMode ); + m_zWriteMode.CopyFrom( other.ZWriteMode ); + m_offsetFactor.CopyFrom( other.OffsetFactor ); + m_offsetUnits.CopyFrom( other.OffsetUnits ); + m_offsetEnabled = other.OffsetEnabled; + } + + public void ConfigureFromTemplateData( TemplateDepthData depthData ) + { + m_independentModule = depthData.IndependentModule; + if( depthData.ValidZTest && m_validZTest != depthData.ValidZTest ) + { + if( string.IsNullOrEmpty( depthData.ZTestInlineValue ) ) + { + m_zTestMode.IntValue = ZBufferOpHelper.ZTestModeDict[ depthData.ZTestModeValue ]; + m_zTestMode.ResetProperty(); + } + else + { + m_zTestMode.SetInlineByName( depthData.ZTestInlineValue ); + } + } + + + + if( depthData.ValidZWrite && m_validZWrite != depthData.ValidZWrite ) + { + if( string.IsNullOrEmpty( depthData.ZWriteInlineValue ) ) + { + m_zWriteMode.IntValue = ZBufferOpHelper.ZWriteModeDict[ depthData.ZWriteModeValue ]; + m_zWriteMode.ResetProperty(); + } + else + { + m_zWriteMode.SetInlineByName( depthData.ZWriteInlineValue ); + } + } + + if( depthData.ValidOffset && m_validOffset != depthData.ValidOffset ) + { + if( string.IsNullOrEmpty( depthData.OffsetFactorInlineValue ) ) + { + m_offsetFactor.FloatValue = depthData.OffsetFactor; + m_offsetFactor.ResetProperty(); + } + else + { + m_offsetFactor.SetInlineByName( depthData.OffsetFactorInlineValue ); + } + + if( string.IsNullOrEmpty( depthData.OffsetUnitsInlineValue ) ) + { + m_offsetUnits.FloatValue = depthData.OffsetUnits; + m_offsetUnits.ResetProperty(); + } + else + { + m_offsetUnits.SetInlineByName( depthData.OffsetUnitsInlineValue ); + } + m_offsetEnabled = depthData.ValidOffset; + } + + m_validZTest = depthData.ValidZTest; + m_validZWrite = depthData.ValidZWrite; + m_validOffset = depthData.ValidOffset; + m_validData = m_validZTest || m_validZWrite || m_validOffset; + } + + public override void ShowUnreadableDataMessage( ParentNode owner ) + { + bool foldoutValue = owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedDepth; + NodeUtils.DrawPropertyGroup( ref foldoutValue, ZBufferOpHelper.DepthParametersStr, base.ShowUnreadableDataMessage ); + owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedDepth = foldoutValue; + } + + public override void Draw( UndoParentNode owner, bool style = true ) + { + bool foldout = owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedDepth; + if( style ) + { + NodeUtils.DrawPropertyGroup( ref foldout, ZBufferOpHelper.DepthParametersStr, () => + { + EditorGUI.indentLevel++; + DrawBlock( owner ); + EditorGUI.indentLevel--; + } ); + } + else + { + NodeUtils.DrawNestedPropertyGroup( ref foldout, ZBufferOpHelper.DepthParametersStr, () => + { + DrawBlock( owner ); + } ); + } + owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedDepth = foldout; + } + + void DrawBlock( UndoParentNode owner ) + { + EditorGUI.BeginChangeCheck(); + var cache = EditorGUIUtility.labelWidth; + EditorGUIUtility.labelWidth = EditorGUIUtility.labelWidth - 20; + + Color cachedColor = GUI.color; + GUI.color = new Color( cachedColor.r, cachedColor.g, cachedColor.b, ( EditorGUIUtility.isProSkin ? 0.5f : 0.25f ) ); + //EditorGUILayout.BeginVertical( UIUtils.MenuItemBackgroundStyle ); + GUI.color = cachedColor; + + EditorGUILayout.Separator(); + + if( m_validZWrite ) + m_zWriteMode.EnumTypePopup( ref owner, ZBufferOpHelper.ZWriteModeStr, ZBufferOpHelper.ZWriteModeValues ); + + if( m_validZTest ) + m_zTestMode.EnumTypePopup( ref owner, ZBufferOpHelper.ZTestModeStr, ZBufferOpHelper.ZTestModeLabels ); + + + if( m_validOffset ) + { + m_offsetEnabled = owner.EditorGUILayoutToggle( ZBufferOpHelper.OffsetStr, m_offsetEnabled ); + if( m_offsetEnabled ) + { + EditorGUI.indentLevel++; + m_offsetFactor.FloatField( ref owner, ZBufferOpHelper.OffsetFactorStr ); + m_offsetUnits.FloatField( ref owner, ZBufferOpHelper.OffsetUnitsStr ); + EditorGUI.indentLevel--; + } + } + EditorGUILayout.Separator(); + EditorGUIUtility.labelWidth = cache; + //EditorGUILayout.EndVertical(); + if( EditorGUI.EndChangeCheck() ) + { + m_isDirty = true; + CustomEdited = true; + } + } + + public void ReadZWriteFromString( ref uint index, ref string[] nodeParams ) + { + bool validDataOnMeta = m_validZWrite; + if( UIUtils.CurrentShaderVersion() > TemplatesManager.MPShaderVersion ) + { + validDataOnMeta = Convert.ToBoolean( nodeParams[ index++ ] ); + } + + if( validDataOnMeta ) + { + if( UIUtils.CurrentShaderVersion() < 15304 ) + { + m_zWriteMode.IntValue = Convert.ToInt32( nodeParams[ index++ ] ); + } + else + { + m_zWriteMode.ReadFromString( ref index, ref nodeParams ); + } + } + } + + public void ReadZTestFromString( ref uint index, ref string[] nodeParams ) + { + bool validDataOnMeta = m_validZTest; + if( UIUtils.CurrentShaderVersion() > TemplatesManager.MPShaderVersion ) + { + validDataOnMeta = Convert.ToBoolean( nodeParams[ index++ ] ); + } + + if( validDataOnMeta ) + { + if( UIUtils.CurrentShaderVersion() < 15304 ) + { + m_zTestMode.IntValue = Convert.ToInt32( nodeParams[ index++ ] ); + } + else + { + m_zTestMode.ReadFromString( ref index, ref nodeParams ); + } + } + } + + public void ReadOffsetFromString( ref uint index, ref string[] nodeParams ) + { + bool validDataOnMeta = m_validOffset; + if( UIUtils.CurrentShaderVersion() > TemplatesManager.MPShaderVersion ) + { + validDataOnMeta = Convert.ToBoolean( nodeParams[ index++ ] ); + } + + if( validDataOnMeta ) + { + m_offsetEnabled = Convert.ToBoolean( nodeParams[ index++ ] ); + if( UIUtils.CurrentShaderVersion() < 15304 ) + { + m_offsetFactor.FloatValue = Convert.ToSingle( nodeParams[ index++ ] ); + m_offsetUnits.FloatValue = Convert.ToSingle( nodeParams[ index++ ] ); + } + else + { + m_offsetFactor.ReadFromString( ref index, ref nodeParams, false ); + m_offsetUnits.ReadFromString( ref index, ref nodeParams, false ); + } + } + } + + public override void ReadFromString( ref uint index, ref string[] nodeParams ) + { + base.ReadFromString( ref index, ref nodeParams ); + ReadZWriteFromString( ref index, ref nodeParams ); + ReadZTestFromString( ref index, ref nodeParams ); + ReadOffsetFromString( ref index, ref nodeParams ); + } + + public void WriteZWriteToString( ref string nodeInfo ) + { + base.WriteToString( ref nodeInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_validZWrite ); + if( m_validZWrite ) + m_zWriteMode.WriteToString( ref nodeInfo ); + } + + public void WriteZTestToString( ref string nodeInfo ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_validZTest ); + if( m_validZTest ) + m_zTestMode.WriteToString( ref nodeInfo ); + } + + public void WriteOffsetToString( ref string nodeInfo ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_validOffset ); + if( m_validOffset ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_offsetEnabled ); + m_offsetFactor.WriteToString( ref nodeInfo ); + m_offsetUnits.WriteToString( ref nodeInfo ); + } + } + + public override void WriteToString( ref string nodeInfo ) + { + WriteZWriteToString( ref nodeInfo ); + WriteZTestToString( ref nodeInfo ); + WriteOffsetToString( ref nodeInfo ); + } + + public bool IsActive { get { return ( m_zTestMode.IsValid || m_zTestMode.IntValue != 0 ) || ( m_zWriteMode.IsValid || m_zWriteMode.IntValue != 0 ) || m_offsetEnabled; } } + public string CurrentZWriteMode + { + get + { + if( m_zWriteMode.IsValid ) + { + return string.Format( ZWriteFormatter, m_zWriteMode.GetValueOrProperty() ); ; + } + + int finalZWrite = ( m_zWriteMode.IntValue == 0 ) ? 1 : m_zWriteMode.IntValue; + return string.Format( ZWriteFormatter, ZBufferOpHelper.ZWriteModeValues[ finalZWrite ] ); ; + } + } + public string CurrentZTestMode + { + get + { + if( m_zTestMode.IsValid ) + return string.Format( ZTestFormatter, m_zTestMode.GetValueOrProperty() ); + + int finalZTestMode = ( m_zTestMode.IntValue == 0 ) ? 3 : m_zTestMode.IntValue; + return string.Format( ZTestFormatter, ZBufferOpHelper.ZTestModeValues[ finalZTestMode ] ); + } + } + + public string CurrentOffset + { + get + { + if( m_offsetEnabled ) + return "Offset " + m_offsetFactor.GetValueOrProperty() + " , " + m_offsetUnits.GetValueOrProperty() + "\n"; + else + return "Offset 0,0\n"; + } + } + + public bool ValidZTest { get { return m_validZTest; } } + public bool ValidZWrite { get { return m_validZWrite; } } + public bool ValidOffset { get { return m_validOffset; } } + public InlineProperty ZTestMode { get { return m_zTestMode; } } + public InlineProperty ZWriteMode { get { return m_zWriteMode; } } + public InlineProperty OffsetFactor { get { return m_offsetFactor; } } + public InlineProperty OffsetUnits { get { return m_offsetUnits; } } + public bool OffsetEnabled { get { return m_offsetEnabled; } } + + + public ZTestMode ZTestModeValue + { + set + { + m_zTestMode.IntValue = ZBufferOpHelper.ZTestModeDict[ value ]; + m_zTestMode.Active = false; + } + get + { + return (ZTestMode)( m_zTestMode.IntValue - 1 ); + } + } + public ZWriteMode ZWriteModeValue + { + set + { + m_zWriteMode.IntValue = ZBufferOpHelper.ZWriteModeDict[ value ]; + m_zWriteMode.Active = false; + } + get + { + return (ZWriteMode)( m_zWriteMode.IntValue - 1 ); + } + } + public float OffsetFactorValue + { + set + { + m_offsetEnabled = true; + m_offsetFactor.FloatValue = value; + m_offsetFactor.Active = false; + } + get + { + return m_offsetFactor.FloatValue; + } + } + + public float OffsetUnitsValue + { + set + { + m_offsetEnabled = true; + m_offsetUnits.FloatValue = value; + m_offsetUnits.Active = false; + } + get + { + return m_offsetUnits.FloatValue; + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateDepthModule.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateDepthModule.cs.meta new file mode 100644 index 0000000..a559fe7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateDepthModule.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 91bbf209a618780459e775d6816a4b06 +timeCreated: 1513873547 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateFragmentDataNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateFragmentDataNode.cs new file mode 100644 index 0000000..4857ebb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateFragmentDataNode.cs @@ -0,0 +1,280 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +using UnityEngine; +using UnityEditor; +using System; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Template Fragment Data", "Surface Data", "Select and use available interpolated fragment data from the template" )] + public class TemplateFragmentDataNode : TemplateNodeParent + { + private List m_interpolatorData = null; + + [SerializeField] + private int m_currentDataIdx = -1; + + [SerializeField] + private string m_dataName = string.Empty; + [SerializeField] + private string m_inVarName = string.Empty; + + private string[] m_dataLabels = null; + + private bool m_fetchDataId = false; + private UpperLeftWidgetHelper m_upperLeftWidgetHelper = new UpperLeftWidgetHelper(); + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_autoWrapProperties = true; + } + + void FetchDataId() + { + if( m_interpolatorData != null ) + { + m_currentDataIdx = 0; + int count = m_interpolatorData.Count; + m_dataLabels = new string[ count ]; + for( int i = 0; i < count; i++ ) + { + m_dataLabels[ i ] = m_interpolatorData[ i ].VarName; + if( m_interpolatorData[ i ].VarName.Equals( m_dataName ) ) + { + m_currentDataIdx = i; + } + } + UpdateFromId(); + } + else + { + m_currentDataIdx = -1; + } + } + + void UpdateFromId() + { + if( m_interpolatorData != null ) + { + if( m_interpolatorData.Count == 0 ) + { + for( int i = 0; i < 4; i++ ) + m_containerGraph.DeleteConnection( false, UniqueId, i, false, true ); + + m_headerColor = UIUtils.GetColorFromCategory( "Default" ); + m_content.text = "None"; + m_additionalContent.text = string.Empty; + m_outputPorts[ 0 ].ChangeProperties( "None", WirePortDataType.OBJECT, false ); + ConfigurePorts(); + return; + } + + bool areCompatible = TemplateHelperFunctions.CheckIfCompatibles( m_outputPorts[ 0 ].DataType, m_interpolatorData[ m_currentDataIdx ].DataType ); + switch( m_interpolatorData[ m_currentDataIdx ].DataType ) + { + default: + case WirePortDataType.INT: + case WirePortDataType.FLOAT: + m_outputPorts[ 0 ].ChangeProperties( Constants.EmptyPortValue, m_interpolatorData[ m_currentDataIdx ].DataType, false ); + break; + case WirePortDataType.FLOAT2: + m_outputPorts[ 0 ].ChangeProperties( "XY", m_interpolatorData[ m_currentDataIdx ].DataType, false ); + break; + case WirePortDataType.FLOAT3: + m_outputPorts[ 0 ].ChangeProperties( "XYZ", m_interpolatorData[ m_currentDataIdx ].DataType, false ); + break; + case WirePortDataType.FLOAT4: + m_outputPorts[ 0 ].ChangeProperties( "XYZW", m_interpolatorData[ m_currentDataIdx ].DataType, false ); + break; + case WirePortDataType.COLOR: + m_outputPorts[ 0 ].ChangeProperties( "RGBA", m_interpolatorData[ m_currentDataIdx ].DataType, false ); + break; + } + + ConfigurePorts(); + + if( !areCompatible ) + { + m_containerGraph.DeleteConnection( false, UniqueId, 0, false, true ); + } + + m_dataName = m_interpolatorData[ m_currentDataIdx ].VarName; + m_content.text = m_dataName; + m_sizeIsDirty = true; + CheckWarningState(); + } + } + + + public override void DrawProperties() + { + base.DrawProperties(); + if( m_multiPassMode ) + { + DrawMultipassProperties(); + } + + if( m_currentDataIdx > -1 ) + { + EditorGUI.BeginChangeCheck(); + m_currentDataIdx = EditorGUILayoutPopup( DataLabelStr, m_currentDataIdx, m_dataLabels ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateFromId(); + } + } + } + + protected override void OnSubShaderChange() + { + base.OnSubShaderChange(); + FetchInterpolator(); + FetchDataId(); + } + + protected override void OnPassChange() + { + FetchInterpolator(); + FetchDataId(); + } + + void DrawMultipassProperties() + { + DrawSubShaderUI(); + DrawPassUI(); + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + if( m_containerGraph.CurrentCanvasMode != NodeAvailability.TemplateShader ) + return; + + if( m_interpolatorData == null || m_interpolatorData.Count == 0 ) + { + MasterNode masterNode = m_containerGraph.CurrentMasterNode; + FetchInterpolator( masterNode ); + } + + if( m_fetchDataId ) + { + m_fetchDataId = false; + FetchDataId(); + } + + if( m_currentDataIdx > -1 ) + { + EditorGUI.BeginChangeCheck(); + m_currentDataIdx = m_upperLeftWidgetHelper.DrawWidget( this, m_currentDataIdx, m_dataLabels ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateFromId(); + } + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.MasterNodeCategory != AvailableShaderTypes.Template ) + { + UIUtils.ShowMessage( UniqueId, "Template Fragmment Data node is only intended for templates use only" ); + return m_outputPorts[ 0 ].ErrorValue; + } + + if( !dataCollector.IsFragmentCategory ) + { + UIUtils.ShowMessage( UniqueId, "Template Fragment Data node node is only intended for fragment use use only" ); + return m_outputPorts[ 0 ].ErrorValue; + } + + if( m_multiPassMode ) + { + if( dataCollector.TemplateDataCollectorInstance.MultipassSubshaderIdx != SubShaderIdx || + dataCollector.TemplateDataCollectorInstance.MultipassPassIdx != PassIdx + ) + { + UIUtils.ShowMessage( UniqueId, string.Format( "{0} is only intended for subshader {1} and pass {2}", m_dataLabels[ m_currentDataIdx ], SubShaderIdx, PassIdx ) ); + return m_outputPorts[ outputId ].ErrorValue; + } + } + + return GetOutputVectorItem( 0, outputId, m_inVarName + m_dataName ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_dataName = GetCurrentParam( ref nodeParams ); + m_fetchDataId = true; + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_dataName ); + } + + public override void OnMasterNodeReplaced( MasterNode newMasterNode ) + { + base.OnMasterNodeReplaced( newMasterNode ); + if( newMasterNode.CurrentMasterNodeCategory == AvailableShaderTypes.Template ) + { + FetchInterpolator( newMasterNode ); + } + else + { + m_interpolatorData = null; + m_currentDataIdx = -1; + } + } + + protected override bool ValidatePass( int passIdx ) + { + return ( m_templateMPData.SubShaders[ SubShaderIdx ].Passes[ passIdx ].FragmentFunctionData != null && + m_templateMPData.SubShaders[ SubShaderIdx ].Passes[ passIdx ].InterpolatorDataContainer != null ); + } + + void FetchInterpolator( MasterNode masterNode = null ) + { + FetchMultiPassTemplate( masterNode ); + if( m_multiPassMode ) + { + if( m_templateMPData != null ) + { + m_inVarName = m_templateMPData.SubShaders[ SubShaderIdx ].Passes[ PassIdx ].FragmentFunctionData.InVarName + "."; + m_interpolatorData = m_templateMPData.SubShaders[ SubShaderIdx ].Passes[ PassIdx ].InterpolatorDataContainer.RawInterpolators; + m_fetchDataId = true; + } + } + else + { + if( masterNode == null ) + masterNode = m_containerGraph.CurrentMasterNode; + + TemplateData currentTemplate = ( masterNode as TemplateMasterNode ).CurrentTemplate; + if( currentTemplate != null ) + { + m_inVarName = currentTemplate.FragmentFunctionData.InVarName + "."; + m_interpolatorData = currentTemplate.InterpolatorData.RawInterpolators; + FetchDataId(); + } + else + { + m_interpolatorData = null; + m_currentDataIdx = -1; + } + } + } + + public override void Destroy() + { + base.Destroy(); + m_dataLabels = null; + m_interpolatorData = null; + m_upperLeftWidgetHelper = null; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateFragmentDataNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateFragmentDataNode.cs.meta new file mode 100644 index 0000000..8e3e69f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateFragmentDataNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2b53cc116abb0df45b028f41b8f0305e +timeCreated: 1506595629 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateHelperFunctions.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateHelperFunctions.cs new file mode 100644 index 0000000..910fe63 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateHelperFunctions.cs @@ -0,0 +1,2487 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.IO; +using System.Text.RegularExpressions; +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + public enum CustomTemplatePropertyUIEnum + { + None, + HDPBR + } + + public enum TemplateSemantics + { + NONE, + POSITION, + SV_POSITION, + COLOR, + COLOR0, + COLOR1, + TEXCOORD0, + TEXCOORD1, + TEXCOORD2, + TEXCOORD3, + TEXCOORD4, + TEXCOORD5, + TEXCOORD6, + TEXCOORD7, + TEXCOORD8, + TEXCOORD9, + TEXCOORD10, + TEXCOORD11, + TEXCOORD12, + TEXCOORD13, + TEXCOORD14, + TEXCOORD15, + NORMAL, + TANGENT, + VFACE, + SV_VertexID, + SV_PrimitiveID, + SV_InstanceID, + INTERNALTESSPOS, + INSTANCEID_SEMANTIC + } + + public enum TemplateInfoOnSematics + { + NONE, + POSITION, + CLIP_POS, + SCREEN_POSITION, + SCREEN_POSITION_NORMALIZED, + COLOR, + TEXTURE_COORDINATES0, + TEXTURE_COORDINATES1, + TEXTURE_COORDINATES2, + TEXTURE_COORDINATES3, + TEXTURE_COORDINATES4, + TEXTURE_COORDINATES5, + TEXTURE_COORDINATES6, + TEXTURE_COORDINATES7, + NORMAL, + TANGENT, + WORLD_NORMAL, + WORLD_TANGENT, + WORLD_BITANGENT, + WORLD_VIEW_DIR, + WORLD_POSITION, + RELATIVE_WORLD_POS, + INSTANCE_ID, + OTHER, + VFACE, + SHADOWCOORDS, + VERTEXID + } + + public enum TemplateShaderPropertiesIdx + { + Identation = 1, + Name = 3, + InspectorName, + Type + } + + public enum TemplateShaderGlobalsIdx + { + Type = 1, + Name = 2 + } + public enum TemplateDataCheck + { + Valid, + Invalid + } + + public enum InvisibleOptionsEnum + { + SyncProperties = 1 << 0 + } + + public enum TemplateSpecialTags + { + RenderType, + Queue, + DisableBatching, + None + } + + public class TemplateReplaceHelper + { + public TemplateMultiPassMasterNode MasterNode = null; + public bool Used = false; + public TemplateReplaceHelper( TemplateMultiPassMasterNode masterNode ) { MasterNode = masterNode; } + } + + [Serializable] + public class TemplatesTagData + { + public string Name; + public string Value; + public TemplatesTagData( string name, string value ) + { + Name = name; + Value = value; + } + } + + [Serializable] + public class TemplateModuleData + { + public bool IndependentModule = true; + public TemplateDataCheck DataCheck = TemplateDataCheck.Invalid; + public string InlineData = string.Empty; + public int StartIdx; + public bool IsValid { get { return DataCheck == TemplateDataCheck.Valid; } } + public virtual void SetAllModulesDefault() { IndependentModule = false; DataCheck = TemplateDataCheck.Valid; } + } + + [Serializable] + public sealed class TemplateTagsModuleData : TemplateModuleData + { + public string TagsId; + public List Tags = new List(); + public void Destroy() + { + Tags.Clear(); + Tags = null; + } + + public void Reset() + { + Tags.Clear(); + } + + public void Dump() + { + string dump = string.Empty; + for( int i = 0; i < Tags.Count; i++ ) + { + dump += string.Format( "[{0}] Name: {1} Value: {2}\n", i, Tags[ i ].Name, Tags[ i ].Value ); + } + Debug.Log( dump ); + } + } + + [Serializable] + public class TemplateShaderModelData : TemplateModuleData + { + public string Id = string.Empty; + public string Value = "2.5"; + public int InterpolatorAmount = 8; + public bool Encapsulate = false; + public override void SetAllModulesDefault() + { + base.SetAllModulesDefault(); + Id = string.Empty; + Value = "3.0"; + InterpolatorAmount = 10; + Encapsulate = true; + } + } + + [Serializable] + public sealed class TemplateDepthData : TemplateModuleData + { + public bool ValidZWrite; + public string ZWriteModeId; + public ZWriteMode ZWriteModeValue; + public int ZWriteStartIndex; + public string ZWriteInlineValue; + + + public bool ValidZTest; + public string ZTestModeId; + public ZTestMode ZTestModeValue; + public int ZTestStartIndex; + public string ZTestInlineValue; + + public bool ValidOffset; + public string OffsetId; + public float OffsetFactor; + public float OffsetUnits; + public int OffsetStartIndex; + public string OffsetFactorInlineValue; + public string OffsetUnitsInlineValue; + + public override void SetAllModulesDefault() + { + base.SetAllModulesDefault(); + ValidZWrite = true; + ZWriteModeId = string.Empty; + ZWriteModeValue = ZWriteMode.On; + ZWriteStartIndex = -1; + ZWriteInlineValue = string.Empty; + + + ValidZTest = true; + ZTestModeId = string.Empty; + ZTestModeValue = ZTestMode.LEqual; + ZTestStartIndex = -1; + ZTestInlineValue = string.Empty; + + ValidOffset = true; + OffsetId = string.Empty; + OffsetFactor = 0; + OffsetUnits = 0; + OffsetStartIndex = -1; + OffsetFactorInlineValue = string.Empty; + OffsetUnitsInlineValue = string.Empty; + } + + public void SetDataCheck() + { + DataCheck = ( ValidZWrite || ValidZTest || ValidOffset )?TemplateDataCheck.Valid:TemplateDataCheck.Invalid; + } + } + + [Serializable] + public sealed class TemplateStencilData : TemplateModuleData + { + public string StencilBufferId; + public bool Active = true; + + public int Reference; + public string ReferenceInline; + + public int ReadMask = 255; + public string ReadMaskInline; + + public int WriteMask = 255; + public string WriteMaskInline; + + public string ComparisonFront; + public string ComparisonFrontInline; + + public string PassFront; + public string PassFrontInline; + + public string FailFront; + public string FailFrontInline; + + public string ZFailFront; + public string ZFailFrontInline; + + public string ComparisonBack; + public string ComparisonBackInline; + + public string PassBack; + public string PassBackInline; + + public string FailBack; + public string FailBackInline; + + public string ZFailBack; + public string ZFailBackInline; + + public void SetDefaultValues() + { + Active = false; + + StencilBufferId = string.Empty; + + Reference = 255; + ReferenceInline = string.Empty; + + ReadMask = 255; + ReadMaskInline = string.Empty; + + WriteMask = 255; + WriteMaskInline = string.Empty; + + ComparisonFront = "always"; + ComparisonFrontInline = string.Empty; + + PassFront = "keep"; + PassFrontInline = string.Empty; + + FailFront = "keep"; + FailFrontInline = string.Empty; + + ZFailFront = "keep"; + ZFailFrontInline = string.Empty; + + + ComparisonBack = "always"; + ComparisonBackInline = string.Empty; + + PassBack = "keep"; + PassBackInline = string.Empty; + + FailBack = "keep"; + FailBackInline = string.Empty; + + ZFailBack = "keep"; + ZFailBackInline = string.Empty; + } + + public void SetIndependentDefault() + { + IndependentModule = true; + DataCheck = TemplateDataCheck.Valid; + SetDefaultValues(); + } + + public override void SetAllModulesDefault() + { + base.SetAllModulesDefault(); + SetDefaultValues(); + } + } + + [Serializable] + public sealed class TemplateBlendData : TemplateModuleData + { + public bool ValidBlendMode = false; + public bool BlendModeOff = true; + + public string Target = string.Empty; + + public string BlendModeId; + public bool SeparateBlendFactors = false; + public AvailableBlendFactor SourceFactorRGB = AvailableBlendFactor.One; + public string SourceFactorRGBInline; + public AvailableBlendFactor DestFactorRGB = AvailableBlendFactor.Zero; + public string DestFactorRGBInline; + public int BlendModeStartIndex; + + public AvailableBlendFactor SourceFactorAlpha = AvailableBlendFactor.One; + public string SourceFactorAlphaInline; + public AvailableBlendFactor DestFactorAlpha = AvailableBlendFactor.Zero; + public string DestFactorAlphaInline; + + public bool ValidBlendOp = false; + public string BlendOpId; + public bool SeparateBlendOps = false; + public AvailableBlendOps BlendOpRGB = AvailableBlendOps.OFF; + public string BlendOpRGBInline; + public AvailableBlendOps BlendOpAlpha = AvailableBlendOps.OFF; + public string BlendOpAlphaInline; + public int BlendOpStartIndex; + + + public override void SetAllModulesDefault() + { + base.SetAllModulesDefault(); + + + if( !ValidBlendMode ) + { + ValidBlendMode = true; + BlendModeOff = true; + BlendModeId = string.Empty; + SeparateBlendFactors = false; + SourceFactorRGB = AvailableBlendFactor.One; + SourceFactorRGBInline = string.Empty; + DestFactorRGB = AvailableBlendFactor.Zero; + DestFactorRGBInline = string.Empty; + BlendModeStartIndex = -1; + SourceFactorAlpha = AvailableBlendFactor.One; + SourceFactorAlphaInline = string.Empty; + DestFactorAlpha = AvailableBlendFactor.Zero; + DestFactorAlphaInline = string.Empty; + } + + if( !ValidBlendOp ) + { + ValidBlendOp = true; + BlendOpId = string.Empty; + SeparateBlendOps = false; + BlendOpRGB = AvailableBlendOps.OFF; + BlendOpRGBInline = string.Empty; + BlendOpAlpha = AvailableBlendOps.OFF; + BlendOpAlphaInline = string.Empty; + BlendOpStartIndex = -1; + } + + DataCheck = TemplateDataCheck.Valid; + } + + } + + [Serializable] + public sealed class TemplateAlphaToMaskData : TemplateModuleData + { + public string AlphaToMaskId; + public bool AlphaToMaskData = false; + public override void SetAllModulesDefault() + { + base.SetAllModulesDefault(); + AlphaToMaskId = string.Empty; + AlphaToMaskData = false; + } + } + + [Serializable] + public sealed class TemplateCullModeData : TemplateModuleData + { + public string CullModeId; + public CullMode CullModeData = CullMode.Back; + public override void SetAllModulesDefault() + { + base.SetAllModulesDefault(); + CullModeId = string.Empty; + CullModeData = CullMode.Back; + } + } + + [Serializable] + public sealed class TemplateColorMaskData : TemplateModuleData + { + public string ColorMaskId; + public bool[] ColorMaskData = { true, true, true, true }; + public string Target = string.Empty; + public override void SetAllModulesDefault() + { + base.SetAllModulesDefault(); + ColorMaskId = string.Empty; + Target = string.Empty; + for( int i = 0; i < ColorMaskData.Length; i++ ) + { + ColorMaskData[ i ] = true; + } + } + } + + public static class TemplateHelperFunctions + { + /* + struct DirectionalLightData + { + uint lightLayers; + float3 positionRWS; + float3 color; + int cookieIndex; + float volumetricDimmer; + float3 right; + float3 up; + float3 forward; + int tileCookie; + int shadowIndex; + int contactShadowIndex; + float4 shadowMaskSelector; + int nonLightmappedOnly; + float diffuseScale; + float specularScale; + }; + */ + public static string HDLightInfoFormat = "_DirectionalLightDatas[{0}].{1}"; + + public static string[] VectorSwizzle = { "x", "y", "z", "w" }; + public static string[] ColorSwizzle = { "r", "g", "b", "a" }; + + public static readonly Dictionary CustomTemplatePropertyUI = new Dictionary + { + { "None", CustomTemplatePropertyUIEnum.None}, + { "HDPBR", CustomTemplatePropertyUIEnum.HDPBR} + }; + + public static readonly Dictionary InvisibleOptions = new Dictionary() + { + { "SyncP", InvisibleOptionsEnum.SyncProperties } + }; + + public static readonly Dictionary StringToReservedTags = new Dictionary() + { + { TemplateSpecialTags.RenderType.ToString(), TemplateSpecialTags.RenderType}, + { TemplateSpecialTags.Queue.ToString(), TemplateSpecialTags.Queue}, + { TemplateSpecialTags.DisableBatching.ToString(), TemplateSpecialTags.DisableBatching}, + }; + + public static readonly Dictionary StringToDisableBatching = new Dictionary + { + {"true",DisableBatching.True}, + {"True",DisableBatching.True}, + {"false",DisableBatching.False}, + {"False",DisableBatching.False}, + {"LOD Fading",DisableBatching.LODFading}, + {"LODFading",DisableBatching.LODFading} + }; + + public static readonly Dictionary StringToRenderType = new Dictionary + { + {"Opaque",RenderType.Opaque}, + {"Transparent",RenderType.Transparent}, + {"TransparentCutout",RenderType.TransparentCutout}, + {"Background",RenderType.Background}, + {"Overlay",RenderType.Overlay}, + {"TreeOpaque",RenderType.TreeOpaque}, + {"TreeTransparentCutout",RenderType.TreeTransparentCutout}, + {"TreeBillboard",RenderType.TreeBillboard}, + {"Grass",RenderType.Grass}, + {"GrassBillboard",RenderType.GrassBillboard} + }; + + public static readonly Dictionary StringToRenderQueue = new Dictionary + { + {"Background",RenderQueue.Background }, + {"Geometry",RenderQueue.Geometry }, + {"AlphaTest",RenderQueue.AlphaTest }, + {"Transparent",RenderQueue.Transparent }, + {"Overlay",RenderQueue.Overlay } + }; + + public static readonly Dictionary PropertyToWireType = new Dictionary + { + {"Float",WirePortDataType.FLOAT}, + {"Range",WirePortDataType.FLOAT}, + {"Int",WirePortDataType.INT}, + {"Color",WirePortDataType.COLOR}, + {"Vector",WirePortDataType.FLOAT4}, + {"2D",WirePortDataType.SAMPLER2D}, + {"3D",WirePortDataType.SAMPLER3D}, + {"Cube",WirePortDataType.SAMPLERCUBE}, + {"2DArray",WirePortDataType.SAMPLER2DARRAY}, + }; + + public static readonly Dictionary DataTypeChannelUsage = new Dictionary + { + {WirePortDataType.OBJECT,0 }, + {WirePortDataType.FLOAT,1 }, + {WirePortDataType.FLOAT2,2 }, + {WirePortDataType.FLOAT3,3 }, + {WirePortDataType.FLOAT4,4 }, + {WirePortDataType.FLOAT3x3,0 }, + {WirePortDataType.FLOAT4x4,0 }, + {WirePortDataType.COLOR,4 }, + {WirePortDataType.INT,1 }, + {WirePortDataType.UINT,1 }, + {WirePortDataType.SAMPLER1D,0 }, + {WirePortDataType.SAMPLER2D,0 }, + {WirePortDataType.SAMPLER3D,0 }, + {WirePortDataType.SAMPLERCUBE,0 }, + {WirePortDataType.SAMPLER2DARRAY,0 }, + {WirePortDataType.SAMPLERSTATE,0 } + }; + + public static readonly Dictionary ChannelToDataType = new Dictionary + { + {1,WirePortDataType.FLOAT}, + {2,WirePortDataType.FLOAT2}, + {3,WirePortDataType.FLOAT3}, + {4,WirePortDataType.FLOAT4} + }; + + public static readonly Dictionary SemanticsDefaultName = new Dictionary + { + {TemplateSemantics.COLOR ,"ase_color"}, + {TemplateSemantics.NORMAL ,"ase_normal"}, + {TemplateSemantics.POSITION ,"ase_position"}, + {TemplateSemantics.SV_POSITION ,"ase_sv_position"}, + {TemplateSemantics.TANGENT ,"ase_tangent"}, + {TemplateSemantics.VFACE ,"ase_vface"}, + {TemplateSemantics.SV_VertexID ,"ase_vertexId"}, + {TemplateSemantics.SV_PrimitiveID ,"ase_primitiveId"}, + {TemplateSemantics.INTERNALTESSPOS ,"ase_internalTessPos"}, + {TemplateSemantics.TEXCOORD0 ,"ase_tex_coord0"}, + {TemplateSemantics.TEXCOORD1 ,"ase_tex_coord1"}, + {TemplateSemantics.TEXCOORD2 ,"ase_tex_coord2"}, + {TemplateSemantics.TEXCOORD3 ,"ase_tex_coord3"}, + {TemplateSemantics.TEXCOORD4 ,"ase_tex_coord4"}, + {TemplateSemantics.TEXCOORD5 ,"ase_tex_coord5"}, + {TemplateSemantics.TEXCOORD6 ,"ase_tex_coord6"}, + {TemplateSemantics.TEXCOORD7 ,"ase_tex_coord7"}, + {TemplateSemantics.TEXCOORD8 ,"ase_tex_coord8"}, + {TemplateSemantics.TEXCOORD9 ,"ase_tex_coord9"}, + {TemplateSemantics.TEXCOORD10 ,"ase_tex_coord10"}, + {TemplateSemantics.TEXCOORD11 ,"ase_tex_coord11"}, + {TemplateSemantics.TEXCOORD12 ,"ase_tex_coord12"}, + {TemplateSemantics.TEXCOORD13 ,"ase_tex_coord13"}, + {TemplateSemantics.TEXCOORD14 ,"ase_tex_coord14"}, + {TemplateSemantics.TEXCOORD15 ,"ase_tex_coord15"}, + }; + + public static readonly Dictionary IntToInfo = new Dictionary + { + {0,TemplateInfoOnSematics.TEXTURE_COORDINATES0 }, + {1,TemplateInfoOnSematics.TEXTURE_COORDINATES1 }, + {2,TemplateInfoOnSematics.TEXTURE_COORDINATES2 }, + {3,TemplateInfoOnSematics.TEXTURE_COORDINATES3 }, + {4,TemplateInfoOnSematics.TEXTURE_COORDINATES4 }, + {5,TemplateInfoOnSematics.TEXTURE_COORDINATES5 }, + {6,TemplateInfoOnSematics.TEXTURE_COORDINATES6 }, + {7,TemplateInfoOnSematics.TEXTURE_COORDINATES7 }, + }; + + public static readonly Dictionary ShortcutToInfo = new Dictionary + { + {"p" ,TemplateInfoOnSematics.POSITION }, + {"sp" ,TemplateInfoOnSematics.CLIP_POS }, + {"spu" ,TemplateInfoOnSematics.SCREEN_POSITION }, + {"spn" ,TemplateInfoOnSematics.SCREEN_POSITION_NORMALIZED }, + {"c" ,TemplateInfoOnSematics.COLOR }, + {"uv0" ,TemplateInfoOnSematics.TEXTURE_COORDINATES0 }, + {"uv1" ,TemplateInfoOnSematics.TEXTURE_COORDINATES1 }, + {"uv2" ,TemplateInfoOnSematics.TEXTURE_COORDINATES2 }, + {"uv3" ,TemplateInfoOnSematics.TEXTURE_COORDINATES3 }, + {"uv4" ,TemplateInfoOnSematics.TEXTURE_COORDINATES4 }, + {"uv5" ,TemplateInfoOnSematics.TEXTURE_COORDINATES5 }, + {"uv6" ,TemplateInfoOnSematics.TEXTURE_COORDINATES6 }, + {"uv7" ,TemplateInfoOnSematics.TEXTURE_COORDINATES7 }, + {"n" ,TemplateInfoOnSematics.NORMAL }, + {"t" ,TemplateInfoOnSematics.TANGENT }, + {"wn" ,TemplateInfoOnSematics.WORLD_NORMAL}, + {"wt" ,TemplateInfoOnSematics.WORLD_TANGENT}, + {"wbt" ,TemplateInfoOnSematics.WORLD_BITANGENT}, + {"wvd" ,TemplateInfoOnSematics.WORLD_VIEW_DIR}, + {"wp" ,TemplateInfoOnSematics.WORLD_POSITION}, + {"rwp" ,TemplateInfoOnSematics.RELATIVE_WORLD_POS}, + {"vf" ,TemplateInfoOnSematics.VFACE}, + {"sc" ,TemplateInfoOnSematics.SHADOWCOORDS} + }; + + public static readonly Dictionary InfoToDefineFrag = new Dictionary + { + {TemplateInfoOnSematics.POSITION ,"ASE_NEEDS_FRAG_POSITION"}, + {TemplateInfoOnSematics.CLIP_POS ,"ASE_NEEDS_FRAG_CLIP_POS"}, + {TemplateInfoOnSematics.SCREEN_POSITION,"ASE_NEEDS_FRAG_SCREEN_POSITION" }, + {TemplateInfoOnSematics.SCREEN_POSITION_NORMALIZED,"ASE_NEEDS_FRAG_SCREEN_POSITION_NORMALIZED" }, + {TemplateInfoOnSematics.COLOR, "ASE_NEEDS_FRAG_COLOR"}, + {TemplateInfoOnSematics.TEXTURE_COORDINATES0,"ASE_NEEDS_FRAG_TEXTURE_COORDINATES0" }, + {TemplateInfoOnSematics.TEXTURE_COORDINATES1,"ASE_NEEDS_FRAG_TEXTURE_COORDINATES1" }, + {TemplateInfoOnSematics.TEXTURE_COORDINATES2,"ASE_NEEDS_FRAG_TEXTURE_COORDINATES2" }, + {TemplateInfoOnSematics.TEXTURE_COORDINATES3,"ASE_NEEDS_FRAG_TEXTURE_COORDINATES3" }, + {TemplateInfoOnSematics.TEXTURE_COORDINATES4,"ASE_NEEDS_FRAG_TEXTURE_COORDINATES4" }, + {TemplateInfoOnSematics.TEXTURE_COORDINATES5,"ASE_NEEDS_FRAG_TEXTURE_COORDINATES5" }, + {TemplateInfoOnSematics.TEXTURE_COORDINATES6,"ASE_NEEDS_FRAG_TEXTURE_COORDINATES6" }, + {TemplateInfoOnSematics.TEXTURE_COORDINATES7,"ASE_NEEDS_FRAG_TEXTURE_COORDINATES7" }, + {TemplateInfoOnSematics.NORMAL,"ASE_NEEDS_FRAG_NORMAL" }, + {TemplateInfoOnSematics.TANGENT ,"ASE_NEEDS_FRAG_TANGENT"}, + {TemplateInfoOnSematics.WORLD_NORMAL,"ASE_NEEDS_FRAG_WORLD_NORMAL"}, + {TemplateInfoOnSematics.WORLD_TANGENT,"ASE_NEEDS_FRAG_WORLD_TANGENT"}, + {TemplateInfoOnSematics.WORLD_BITANGENT,"ASE_NEEDS_FRAG_WORLD_BITANGENT"}, + {TemplateInfoOnSematics.WORLD_VIEW_DIR,"ASE_NEEDS_FRAG_WORLD_VIEW_DIR"}, + {TemplateInfoOnSematics.WORLD_POSITION,"ASE_NEEDS_FRAG_WORLD_POSITION"}, + {TemplateInfoOnSematics.RELATIVE_WORLD_POS,"ASE_NEEDS_FRAG_RELATIVE_WORLD_POS"}, + {TemplateInfoOnSematics.VFACE,"ASE_NEEDS_FRAG_VFACE"}, + {TemplateInfoOnSematics.SHADOWCOORDS,"ASE_NEEDS_FRAG_SHADOWCOORDS"} + }; + + public static readonly Dictionary InfoToDefineVertex = new Dictionary + { + {TemplateInfoOnSematics.POSITION ,"ASE_NEEDS_VERT_POSITION"}, + {TemplateInfoOnSematics.CLIP_POS ,"ASE_NEEDS_VERT_CLIP_POS"}, + {TemplateInfoOnSematics.SCREEN_POSITION,"ASE_NEEDS_VERT_SCREEN_POSITION" }, + {TemplateInfoOnSematics.SCREEN_POSITION_NORMALIZED,"ASE_NEEDS_VERT_SCREEN_POSITION_NORMALIZED" }, + {TemplateInfoOnSematics.COLOR, "ASE_NEEDS_VERT_COLOR"}, + {TemplateInfoOnSematics.TEXTURE_COORDINATES0,"ASE_NEEDS_VERT_TEXTURE_COORDINATES0" }, + {TemplateInfoOnSematics.TEXTURE_COORDINATES1,"ASE_NEEDS_VERT_TEXTURE_COORDINATES1" }, + {TemplateInfoOnSematics.TEXTURE_COORDINATES2,"ASE_NEEDS_VERT_TEXTURE_COORDINATES2" }, + {TemplateInfoOnSematics.TEXTURE_COORDINATES3,"ASE_NEEDS_VERT_TEXTURE_COORDINATES3" }, + {TemplateInfoOnSematics.TEXTURE_COORDINATES4,"ASE_NEEDS_VERT_TEXTURE_COORDINATES4" }, + {TemplateInfoOnSematics.TEXTURE_COORDINATES5,"ASE_NEEDS_VERT_TEXTURE_COORDINATES5" }, + {TemplateInfoOnSematics.TEXTURE_COORDINATES6,"ASE_NEEDS_VERT_TEXTURE_COORDINATES6" }, + {TemplateInfoOnSematics.TEXTURE_COORDINATES7,"ASE_NEEDS_VERT_TEXTURE_COORDINATES7" }, + {TemplateInfoOnSematics.NORMAL,"ASE_NEEDS_VERT_NORMAL" }, + {TemplateInfoOnSematics.TANGENT ,"ASE_NEEDS_VERT_TANGENT"}, + {TemplateInfoOnSematics.WORLD_NORMAL,"ASE_NEEDS_VERT_WORLD_NORMAL"}, + {TemplateInfoOnSematics.WORLD_TANGENT,"ASE_NEEDS_VERT_WORLD_TANGENT"}, + {TemplateInfoOnSematics.WORLD_BITANGENT,"ASE_NEEDS_VERT_WORLD_BITANGENT"}, + {TemplateInfoOnSematics.WORLD_VIEW_DIR,"ASE_NEEDS_VERT_WORLD_VIEW_DIR"}, + {TemplateInfoOnSematics.WORLD_POSITION,"ASE_NEEDS_VERT_WORLD_POSITION"}, + {TemplateInfoOnSematics.RELATIVE_WORLD_POS,"ASE_NEEDS_VERT_RELATIVE_WORLD_POS"}, + {TemplateInfoOnSematics.VFACE,"ASE_NEEDS_VERT_VFACE"}, + {TemplateInfoOnSematics.SHADOWCOORDS,"ASE_NEEDS_VERT_SHADOWCOORDS"} + }; + + public static readonly Dictionary InfoToLocalVar = new Dictionary + { + {TemplateInfoOnSematics.POSITION,GeneratorUtils.VertexPosition4Str }, + {TemplateInfoOnSematics.CLIP_POS,GeneratorUtils.ClipPositionStr }, + {TemplateInfoOnSematics.SCREEN_POSITION,GeneratorUtils.ScreenPositionStr }, + {TemplateInfoOnSematics.SCREEN_POSITION_NORMALIZED,GeneratorUtils.ScreenPositionNormalizedStr }, + {TemplateInfoOnSematics.COLOR, "ase_color" }, + {TemplateInfoOnSematics.TEXTURE_COORDINATES0, "ase_uv0" }, + {TemplateInfoOnSematics.TEXTURE_COORDINATES1, "ase_uv1" }, + {TemplateInfoOnSematics.TEXTURE_COORDINATES2, "ase_uv2" }, + {TemplateInfoOnSematics.TEXTURE_COORDINATES3, "ase_uv3" }, + {TemplateInfoOnSematics.NORMAL, GeneratorUtils.VertexNormalStr }, + {TemplateInfoOnSematics.TANGENT, GeneratorUtils.VertexTangentStr }, + {TemplateInfoOnSematics.WORLD_NORMAL, GeneratorUtils.WorldNormalStr}, + {TemplateInfoOnSematics.WORLD_TANGENT, GeneratorUtils.WorldTangentStr}, + {TemplateInfoOnSematics.WORLD_BITANGENT, GeneratorUtils.WorldBitangentStr}, + {TemplateInfoOnSematics.WORLD_VIEW_DIR, GeneratorUtils.WorldViewDirectionStr}, + {TemplateInfoOnSematics.WORLD_POSITION, GeneratorUtils.WorldPositionStr}, + {TemplateInfoOnSematics.RELATIVE_WORLD_POS, GeneratorUtils.RelativeWorldPositionStr}, + {TemplateInfoOnSematics.VFACE, GeneratorUtils.VFaceStr}, + {TemplateInfoOnSematics.SHADOWCOORDS, GeneratorUtils.ShadowCoordsStr} + }; + + + public static readonly Dictionary InfoToWirePortType = new Dictionary + { + {TemplateInfoOnSematics.POSITION,WirePortDataType.FLOAT4 }, + {TemplateInfoOnSematics.CLIP_POS,WirePortDataType.FLOAT4 }, + {TemplateInfoOnSematics.SCREEN_POSITION,WirePortDataType.FLOAT4 }, + {TemplateInfoOnSematics.SCREEN_POSITION_NORMALIZED,WirePortDataType.FLOAT4 }, + {TemplateInfoOnSematics.COLOR, WirePortDataType.COLOR }, + {TemplateInfoOnSematics.TEXTURE_COORDINATES0, WirePortDataType.FLOAT4 }, + {TemplateInfoOnSematics.TEXTURE_COORDINATES1, WirePortDataType.FLOAT4 }, + {TemplateInfoOnSematics.TEXTURE_COORDINATES2, WirePortDataType.FLOAT4 }, + {TemplateInfoOnSematics.TEXTURE_COORDINATES3, WirePortDataType.FLOAT4 }, + {TemplateInfoOnSematics.NORMAL, WirePortDataType.FLOAT3 }, + {TemplateInfoOnSematics.TANGENT, WirePortDataType.FLOAT4 }, + {TemplateInfoOnSematics.WORLD_NORMAL, WirePortDataType.FLOAT3}, + {TemplateInfoOnSematics.WORLD_TANGENT, WirePortDataType.FLOAT3}, + {TemplateInfoOnSematics.WORLD_BITANGENT, WirePortDataType.FLOAT3}, + {TemplateInfoOnSematics.WORLD_VIEW_DIR, WirePortDataType.FLOAT3}, + {TemplateInfoOnSematics.WORLD_POSITION, WirePortDataType.FLOAT3}, + {TemplateInfoOnSematics.RELATIVE_WORLD_POS, WirePortDataType.FLOAT3}, + {TemplateInfoOnSematics.VFACE, WirePortDataType.FLOAT}, + {TemplateInfoOnSematics.SHADOWCOORDS, WirePortDataType.FLOAT4}, + }; + public static readonly Dictionary IntToUVChannelInfo = new Dictionary + { + {0,TemplateInfoOnSematics.TEXTURE_COORDINATES0 }, + {1,TemplateInfoOnSematics.TEXTURE_COORDINATES1 }, + {2,TemplateInfoOnSematics.TEXTURE_COORDINATES2 }, + {3,TemplateInfoOnSematics.TEXTURE_COORDINATES3 }, + {4,TemplateInfoOnSematics.TEXTURE_COORDINATES4 }, + {5,TemplateInfoOnSematics.TEXTURE_COORDINATES5 }, + {6,TemplateInfoOnSematics.TEXTURE_COORDINATES6 }, + {7,TemplateInfoOnSematics.TEXTURE_COORDINATES7 } + }; + + public static readonly Dictionary IntToSemantic = new Dictionary + { + { 0,TemplateSemantics.TEXCOORD0 }, + { 1,TemplateSemantics.TEXCOORD1 }, + { 2,TemplateSemantics.TEXCOORD2 }, + { 3,TemplateSemantics.TEXCOORD3 }, + { 4,TemplateSemantics.TEXCOORD4 }, + { 5,TemplateSemantics.TEXCOORD5 }, + { 6,TemplateSemantics.TEXCOORD6 }, + { 7,TemplateSemantics.TEXCOORD7 }, + { 8,TemplateSemantics.TEXCOORD8 }, + { 9,TemplateSemantics.TEXCOORD9 }, + { 10,TemplateSemantics.TEXCOORD10 }, + { 11,TemplateSemantics.TEXCOORD11 }, + { 12,TemplateSemantics.TEXCOORD12 }, + { 13,TemplateSemantics.TEXCOORD13 }, + { 14,TemplateSemantics.TEXCOORD14 }, + { 15,TemplateSemantics.TEXCOORD15 } + }; + + public static readonly Dictionary SemanticToInt = new Dictionary + { + { TemplateSemantics.TEXCOORD0,0 }, + { TemplateSemantics.TEXCOORD1,1 }, + { TemplateSemantics.TEXCOORD2,2 }, + { TemplateSemantics.TEXCOORD3,3 }, + { TemplateSemantics.TEXCOORD4,4 }, + { TemplateSemantics.TEXCOORD5,5 }, + { TemplateSemantics.TEXCOORD6,6 }, + { TemplateSemantics.TEXCOORD7,7 }, + { TemplateSemantics.TEXCOORD8,8 }, + { TemplateSemantics.TEXCOORD9,9 }, + { TemplateSemantics.TEXCOORD10,10 }, + { TemplateSemantics.TEXCOORD11,11 }, + { TemplateSemantics.TEXCOORD12,12 }, + { TemplateSemantics.TEXCOORD13,13 }, + { TemplateSemantics.TEXCOORD14,14 }, + { TemplateSemantics.TEXCOORD15,15 }, + }; + + public static readonly Dictionary ShortcutToSemantic = new Dictionary + { + { "p" ,TemplateSemantics.POSITION }, + { "sp" ,TemplateSemantics.SV_POSITION }, + { "c" ,TemplateSemantics.COLOR }, + { "n" ,TemplateSemantics.NORMAL }, + { "t" ,TemplateSemantics.TANGENT }, + { "tc0" ,TemplateSemantics.TEXCOORD0 }, + { "tc1" ,TemplateSemantics.TEXCOORD1 }, + { "tc2" ,TemplateSemantics.TEXCOORD2 }, + { "tc3" ,TemplateSemantics.TEXCOORD3 }, + { "tc4" ,TemplateSemantics.TEXCOORD4 }, + { "tc5" ,TemplateSemantics.TEXCOORD5 }, + { "tc6" ,TemplateSemantics.TEXCOORD6 }, + { "tc7" ,TemplateSemantics.TEXCOORD7 }, + { "tc8" ,TemplateSemantics.TEXCOORD8 }, + { "tc9" ,TemplateSemantics.TEXCOORD9 }, + { "tc10" ,TemplateSemantics.TEXCOORD10 }, + { "tc11" ,TemplateSemantics.TEXCOORD11 }, + { "tc12" ,TemplateSemantics.TEXCOORD12 }, + { "tc13" ,TemplateSemantics.TEXCOORD13 }, + { "tc14" ,TemplateSemantics.TEXCOORD14 }, + { "tc15" ,TemplateSemantics.TEXCOORD15 } + }; + + public static readonly Dictionary CgToWirePortType = new Dictionary() + { + {"float" ,WirePortDataType.FLOAT}, + {"float2" ,WirePortDataType.FLOAT2}, + {"float3" ,WirePortDataType.FLOAT3}, + {"float4" ,WirePortDataType.FLOAT4}, + {"float3x3" ,WirePortDataType.FLOAT3x3}, + {"float4x4" ,WirePortDataType.FLOAT4x4}, + {"half" ,WirePortDataType.FLOAT}, + {"half2" ,WirePortDataType.FLOAT2}, + {"half3" ,WirePortDataType.FLOAT3}, + {"half4" ,WirePortDataType.FLOAT4}, + {"half3x3" ,WirePortDataType.FLOAT3x3}, + {"half4x4" ,WirePortDataType.FLOAT4x4}, + {"fixed" ,WirePortDataType.FLOAT}, + {"fixed2" ,WirePortDataType.FLOAT2}, + {"fixed3" ,WirePortDataType.FLOAT3}, + {"fixed4" ,WirePortDataType.FLOAT4}, + {"fixed3x3" ,WirePortDataType.FLOAT3x3}, + {"fixed4x4" ,WirePortDataType.FLOAT4x4}, + {"int" ,WirePortDataType.INT}, + {"uint" ,WirePortDataType.INT}, + {"sampler1D" ,WirePortDataType.SAMPLER1D}, + {"sampler2D" ,WirePortDataType.SAMPLER2D}, + {"sampler2D_float" ,WirePortDataType.SAMPLER2D}, + {"sampler3D" ,WirePortDataType.SAMPLER3D}, + {"samplerCUBE" ,WirePortDataType.SAMPLERCUBE}, + {"sampler2DArray" ,WirePortDataType.SAMPLER2DARRAY}, + {"SamplerState" ,WirePortDataType.SAMPLERSTATE} + }; + + public static readonly Dictionary AvailableInterpolators = new Dictionary() + { + {"2.0",8 }, + {"2.5",8 }, + {"3.0",10}, + {"3.5",10}, + {"4.0",16}, + {"4.5",16}, + {"4.6",16}, + {"5.0",16} + }; + + public static readonly string[] AvailableShaderModels = + { "2.0", "2.5", "3.0", "3.5", "4.0", "4.5", "4.6", "5.0" }; + + public static readonly Dictionary ShaderModelToArrayIdx = new Dictionary() + { + {"2.0",0}, + {"2.5",1}, + {"3.0",2}, + {"3.5",3}, + {"4.0",4}, + {"4.5",5}, + {"4.6",6}, + {"5.0",7} + }; + + public static readonly string HDPBRTag = "UNITY_MATERIAL_LIT"; + public static readonly Dictionary TagToRenderPipeline = new Dictionary() + { + { "UniversalPipeline",TemplateSRPType.Lightweight }, + { "LightweightPipeline",TemplateSRPType.Lightweight }, + { "HDRenderPipeline",TemplateSRPType.HD } + }; +#if UNITY_2018_3_OR_NEWER + public static string CoreColorLib = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"; + public static string CoreCommonLib = "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"; +#else + public static string CoreCommonLib = "CoreRP/ShaderLibrary/Common.hlsl"; + public static string CoreColorLib = "CoreRP/ShaderLibrary/Color.hlsl"; +#endif + + public static string FetchSubShaderBody = @"(SubShader.*)\/\*ase_lod\*\/"; + public static string TemplateCustomUI = @"\/\*CustomNodeUI:(\w*)\*\/"; + public static string HidePassPattern = @"\/\*ase_hide_pass[:]*([a-zA-Z:]*)\*\/"; + public static string ASEPassPattern = @"\/\*ase_pass[:]*([a-zA-Z:]*)\*\/"; + public static string BlendWholeWordPattern = @"\bBlend\b"; + public static string BlendOpWholeWordPattern = @"\bBlendOp\b"; + public static string AlphaToMaskPattern = @"\bAlphaToMask\s+(\[*\w+\]*)"; + public static string CullWholeWordPattern = @"\bCull\b"; + public static string ColorMaskWholeWordPattern = @"\bColorMask\b"; + public static string StencilWholeWordPattern = @"\bStencil\b"; + public static string ZWriteWholeWordPattern = @"\bZWrite\b"; + public static string ZTestWholeWordPattern = @"\bZTest\b"; + public static string ZOffsetWholeWordPattern = @"\bOffset\b"; + public static string TagsWholeWordPattern = @"\bTags\b"; + + + public static string CustomInspectorPattern = "^\\s*CustomEditor\\s+\\\"([\\w\\.]*)\\\""; + public static string FallbackPattern = "^\\s*Fallback\\s+\\\"([\\w\\/\\\\]*)\\\""; + public static string DefinesPattern = @"^\s*#define\s+([\w .]*)"; + public static string PragmasPattern = @"^\s*#pragma\s+([\w .]*)"; + public static string IncludesPattern = "^\\s*#include\\s+\"([\\w.\\/]*)\""; + public static string GlobalDirectivesPattern = "[#]+(define|pragma|include)\\s+([\\w .\\/\\\"]*)"; + public static string BeforePragmaPattern = @"(?:CGPROGRAM|HLSLPROGRAM|GLSLPROGRAM).*?\n(\s*)(.)"; + public static string GlobalTOPDirectivesPattern = @"(CGPROGRAM|CGINCLUDE|HLSLPROGRAM|HLSLINCLUDE).*?\n\s*(.)"; + + public static string VertexPragmaPattern = @"#pragma vertex\s+(\w+)"; + public static string FragmentPragmaPattern = @"#pragma fragment\s+(\w+)"; + public static string FunctionBodyStartPattern = @"\s+{0}\s*\("; + + public static string ShaderModelPattern = @"#pragma\s+target\s+([0-9]*[.]*[0-9]*)"; + + public static readonly string LocalVarPattern = @"\/\*ase_local_var[:]*(\w*)\*\/\s*(\w*)\s+(\w*)"; + + public static readonly string InlinePattern = @"\/\*ase_inline_begin\*\/(.*?)\/\*ase_inline_end\*\/"; + + public static readonly string SubShaderLODPattern = @"\sLOD\s+(\d+)"; + + public static readonly string PassNamePattern = "Name\\s+\\\"([\\w\\+\\-\\*\\/\\(\\) ]*)\\\""; + + public static readonly string TagsPattern = "\"(\\w+)\"\\s*=\\s*\"(\\w+\\+*\\w*)\""; + public static readonly string ZTestPattern = @"^\s*ZTest\s+(\[*\w+\]*)"; + public static readonly string ZWritePattern = @"^\s*ZWrite\s+(\[*\w+\]*)"; + //public static readonly string ZOffsetPattern = @"\s*Offset\s+([-+]?[0-9]*\.?[0-9]+)\s*,\s*([-+]?[0-9]*\.?[0-9]+)"; + public static readonly string ZOffsetPattern = @"^\s*Offset\s+([-+]?[0-9]*\.?[0-9]+|\[*\w+\]*)\s*,\s*([-+]?[0-9]*\.?[0-9]+|\[*\w+\]*)\s*"; + public static readonly string VertexDataPattern = @"([a-z0-9D_]+|samplerCUBE|sampler2DArray)\s+(\w+)\s*:\s*([A-Z0-9_]+);"; + public static readonly string InterpRangePattern = @"ase_interp\((\d\.{0,1}\w{0,4}),(\d*)\)"; + //public static readonly string PropertiesPatternB = "(\\w*)\\s*\\(\\s*\"([\\w ]*)\"\\s*\\,\\s*(\\w*)\\s*.*\\)"; + //public static readonly string PropertiesPatternC = "^\\s*(\\w*)\\s*\\(\\s*\"([\\w\\(\\)\\+\\-\\\\* ]*)\"\\s*\\,\\s*(\\w*)\\s*.*\\)"; + //public static readonly string PropertiesPatternD = "(\\/\\/\\s*)*(\\w*)\\s*\\(\\s*\"([\\w\\(\\)\\+\\-\\\\* ]*)\"\\s*\\,\\s*(\\w*)\\s*.*\\)"; + //public static readonly string PropertiesPatternE = "(\\/\\/\\s*)*(\\w*)\\s*\\(\\s*\"([\\w\\(\\)\\+\\-\\\\* ]*)\"\\s*\\,\\s*(\\w*)\\s*.*\\)\\s*=\\s*[\\w,()\" {}]*"; + //public static readonly string PropertiesPatternF = "^(\\/\\/)*\\s*(\\[[\\[\\]\\w\\s\\(\\)\\_\\,]*\\])*\\s*(\\w*)\\s*\\(\\s*\"([\\w\\(\\)\\+\\-\\\\* ]*)\"\\s*\\,\\s*(\\w*)\\s*.*\\)\\s*=\\s*[\\w,()\" {}]*"; + //public static readonly string PropertiesPatternG = "^(\\s*)(\\[[\\[\\]\\w\\s\\(\\)\\_\\,]*\\])*\\s*(\\w*)\\s*\\(\\s*\"([\\w\\(\\)\\+\\-\\\\* ]*)\"\\s*\\,\\s*(\\w*)\\s*.*\\)\\s*=\\s*[\\w,()\" {}]*"; + public static readonly string PropertiesPatternG = "^(\\s*)(\\[[\\[\\]\\w\\s\\(\\)_,\\.]*\\])*[\\s\\/]*(\\w*)\\s*\\(\\s*\"([\\w\\(\\)\\+\\-\\\\* ]*)\"\\s*\\,\\s*(\\w*)\\s*.*\\)\\s*=\\s*[\\w,()\" {}\\.]*"; + public static readonly string CullModePattern = @"^\s*Cull\s+(\[*\w+\]*)"; + + public static readonly string ColorMaskPatternFirst = @"\bColorMask\s+([\d\w\[\]]+)(\s+0)*"; + + public static readonly string ColorMaskPattern = @"\bColorMask\s+([\d\w\[\]]+)(\s+0)"; + public static readonly string ColorMask1Pattern = @"\bColorMask\s+([\d\w\[\]]+)(\s+1)"; + public static readonly string ColorMask2Pattern = @"\bColorMask\s+([\d\w\[\]]+)(\s+2)"; + public static readonly string ColorMask3Pattern = @"\bColorMask\s+([\d\w\[\]]+)(\s+3)"; + //public static readonly string BlendModePattern = @"\s*Blend\s+(\w+)\s+(\w+)(?:[\s,]+(\w+)\s+(\w+)|)"; + //public static readonly string BlendModePattern = @"\s*Blend\s+(\[*\w+\]*)\s+(\[*\w+\]*)(?:[\s,]+(\[*\w+\]*)\s+(\[*\w+\]*)|)"; + //public static readonly string BlendModePattern = @"^\s*Blend\s+(?:(?=\d)|(\[*\w+\]*)\s+(\[*\w+\]*)(?:[\s,]+(\[*\w+\]*)\s+(\[*\w+\]*)|))"; + public static readonly string BlendModePatternFirst = @"\bBlend([ \t]+0)*[ \t]+(?:Off|(\[*\w+\]*)[ \t]+(\[*\w+\]*)(?:(?=[ \t]+Blend)|(?:[ \t,]+(\[*\w+\]*)[ \t]+(\[*\w+\]*)|)))"; + public static readonly string BlendModePattern = @"\bBlend([ \t]+0)[ \t]+(?:Off|(\[*\w+\]*)[ \t]+(\[*\w+\]*)(?:(?=[ \t]+Blend)|(?:[ \t,]+(\[*\w+\]*)[ \t]+(\[*\w+\]*)|)))"; + public static readonly string BlendModePattern1 = @"\bBlend([ \t]+1)[ \t]+(?:Off|(\[*\w+\]*)[ \t]+(\[*\w+\]*)(?:(?=[ \t]+Blend)|(?:[ \t,]+(\[*\w+\]*)[ \t]+(\[*\w+\]*)|)))"; + public static readonly string BlendModePattern2 = @"\bBlend([ \t]+2)[ \t]+(?:Off|(\[*\w+\]*)[ \t]+(\[*\w+\]*)(?:(?=[ \t]+Blend)|(?:[ \t,]+(\[*\w+\]*)[ \t]+(\[*\w+\]*)|)))"; + public static readonly string BlendModePattern3 = @"\bBlend([ \t]+3)[ \t]+(?:Off|(\[*\w+\]*)[ \t]+(\[*\w+\]*)(?:(?=[ \t]+Blend)|(?:[ \t,]+(\[*\w+\]*)[ \t]+(\[*\w+\]*)|)))"; + //public static readonly string BlendOpPattern = @"\s*BlendOp\s+(\w+)[\s,]*(?:(\w+)|)"; + //public static readonly string BlendOpPattern = @"\s*BlendOp\s+(\[*\w+\]*)[\s,]*(?:(\[*\w+\]*)|)"; + //public static readonly string BlendOpPattern = @"^\s*BlendOp\s+(?:(?=\d)|(\[*\w+\]*)[\s,]*(?:(\[*\w+\]*)|))"; + public static readonly string BlendOpPatternFirst = @"\bBlendOp([ \t]+0)*[ \t]+(\[*\w+\]*)(?:(?=[ \t]+Blend)|[ \t,]*(?:(\[*\w+\]*)|))"; + public static readonly string BlendOpPattern = @"\bBlendOp([ \t]+0)[ \t]+(\[*\w+\]*)(?:(?=[ \t]+Blend)|[ \t,]*(?:(\[*\w+\]*)|))"; + public static readonly string BlendOpPattern1 = @"\bBlendOp([ \t]+1)[ \t]+(\[*\w+\]*)(?:(?=[ \t]+Blend)|[ \t,]*(?:(\[*\w+\]*)|))"; + public static readonly string BlendOpPattern2 = @"\bBlendOp([ \t]+2)[ \t]+(\[*\w+\]*)(?:(?=[ \t]+Blend)|[ \t,]*(?:(\[*\w+\]*)|))"; + public static readonly string BlendOpPattern3 = @"\bBlendOp([ \t]+3)[ \t]+(\[*\w+\]*)(?:(?=[ \t]+Blend)|[ \t,]*(?:(\[*\w+\]*)|))"; + public static readonly string StencilOpGlobalPattern = @"Stencil\s*{([\w\W\s]*)}"; + public static readonly string StencilOpLinePattern = @"(\w+)\s*(\[*\w+\]*)"; + + public static readonly string ShaderGlobalsOverallPattern = @"(?:\/\*ase_pragma\*\/|[\}\#])[\#\&\|\!\<\>\(\)\=\w\s\;\/\*\.\\""]*\/\*ase_globals\*\/"; + public static readonly string ShaderGlobalsMultilinePattern = @"^\s*(?:uniform\s*)*(\w*)\s*(\w*);$"; + + public static readonly string TexSemantic = "float4 {0} : TEXCOORD{1};"; + public static readonly string TexFullSemantic = "float4 {0} : {1};"; + public static readonly string InterpFullSemantic = "{0} {1} : {2};"; + public static readonly string BaseInterpolatorName = "ase_texcoord"; + public static readonly string TexUVFullSemantic = "float4 ase_texcoord{0} : TEXCOORD{0};"; + public static readonly string InterpMacro = "{0}({1})"; + + public static readonly string InterpolatorDecl = Constants.VertexShaderOutputStr + ".{0} = " + Constants.VertexShaderInputStr + ".{0};"; + public static readonly string TemplateVariableDecl = "{0} = {1};"; + public static readonly string TemplateVarFormat = "{0}.{1}"; + + //public static readonly string StructsRemoval = @"struct\s+\w+\s+{[\s\w;\/\*]+};"; + public static readonly string StructsRemoval = @"struct\s+\w+\s+{[\#\&\|\!\<\>\s\w\(\).;:=,\/\*]+};"; + + public static readonly string SRPBatcherFindTag = @"CBUFFER_START\s*\(\s*UnityPerMaterial\s*\)\s*\n(\s*)"; + + public static string ReplaceAt( this string body, string oldStr, string newStr, int startIndex ) + { + return body.Remove( startIndex, oldStr.Length ).Insert( startIndex, newStr ); + } + + public static bool GetPassUniqueId( TemplateTagData tagData, TemplatePropertyContainer propertyContainer, TemplateIdManager idManager, string uniquePrefix, int offsetIdx, string subBody, ref string passUniqueID ) + { + Match match = Regex.Match( subBody, ASEPassPattern ); + if( match.Success && match.Groups.Count > 1 && match.Groups[1].Length > 0 ) + { + passUniqueID = match.Groups[ 1 ].Value; + + tagData.StartIdx = offsetIdx + match.Index; + tagData.Id = match.Value; + + idManager.RegisterId( tagData.StartIdx, uniquePrefix + tagData.Id, tagData.Id ); + propertyContainer.AddId( subBody, tagData.Id, tagData.SearchIndentation ); + return true; + } + return false; + } + + public static CustomTemplatePropertyUIEnum FetchCustomUI( string data ) + { + Match match = Regex.Match( data, TemplateCustomUI ); + if( match.Success && CustomTemplatePropertyUI.ContainsKey( match.Groups[ 1 ].Value ) ) + { + return CustomTemplatePropertyUI[ match.Groups[ 1 ].Value ]; + } + return CustomTemplatePropertyUIEnum.None; + } + + public static bool FetchInvisibleInfo( string input, ref int optionsArr, ref string id, ref int idIndex ) + { + Match match = Regex.Match( input, HidePassPattern ); + if( match.Success ) + { + id = match.Value; + idIndex = match.Index; + if( match.Groups.Count > 1 ) + { + string[] properties = match.Groups[ 1 ].Value.Split( ':' ); + for( int i = 0; i < properties.Length; i++ ) + { + if( InvisibleOptions.ContainsKey( properties[ i ] ) ) + { + optionsArr |= (int)InvisibleOptions[ properties[ i ] ]; + } + } + } + } + return match.Success; + } + + static public string GenerateTextureSemantic( ref MasterNodeDataCollector dataCollector, int uv ) + { + string texCoordName = BaseInterpolatorName; + if( uv > 0 ) + { + texCoordName += uv.ToString(); + } + + string texCoordData = string.Format( TexSemantic, texCoordName, uv ); + dataCollector.AddToVertexInput( texCoordData ); + dataCollector.AddToInterpolators( texCoordData ); + dataCollector.AddToVertexInterpolatorsDecl( string.Format( InterpolatorDecl, texCoordName ) ); + return texCoordName; + } + + public static void CreatePragmaIncludeList( string data, TemplateIncludePragmaContainter includePragmaContainer ) + { + // this finds the topmost position for including directives + int topIndex = -1; + foreach( Match match in Regex.Matches( data, GlobalTOPDirectivesPattern, RegexOptions.Singleline ) ) + { + if( match.Groups.Count == 3 ) + { + topIndex = match.Groups[ 2 ].Index; + } + } + + foreach( Match match in Regex.Matches( data, GlobalDirectivesPattern, RegexOptions.Multiline ) ) + { + if( match.Success ) + { + includePragmaContainer.AddNativeDirective( match.Groups[ 0 ].Value, topIndex ); + } + } + + foreach( Match match in Regex.Matches( data, PragmasPattern, RegexOptions.Multiline ) ) + { + if( match.Groups.Count == 2 ) + { + includePragmaContainer.AddPragma( match.Groups[ 1 ].Value ); + } + } + + foreach( Match match in Regex.Matches( data, DefinesPattern, RegexOptions.Multiline ) ) + { + if( match.Groups.Count == 2 ) + { + includePragmaContainer.AddDefine( match.Groups[ 1 ].Value ); + } + } + + foreach( Match match in Regex.Matches( data, IncludesPattern, RegexOptions.Multiline ) ) + { + if( match.Groups.Count == 2 ) + { + includePragmaContainer.AddInclude( match.Groups[ 1 ].Value ); + } + } + } + + public static void CreateShaderPropertiesList( string propertyData, ref List propertiesList, ref Dictionary duplicatesHelper, int subShaderId, int passId) + { + int identationIdx = (int)TemplateShaderPropertiesIdx.Identation; + int nameIdx = (int)TemplateShaderPropertiesIdx.Name; + int typeIdx = (int)TemplateShaderPropertiesIdx.Type; + int inspectorNameIdx = (int)TemplateShaderPropertiesIdx.InspectorName; + + foreach( Match match in Regex.Matches( propertyData, PropertiesPatternG,RegexOptions.Multiline ) ) + { + if( match.Groups.Count > 1 ) + { + if( !duplicatesHelper.ContainsKey( match.Groups[ nameIdx ].Value ) && PropertyToWireType.ContainsKey( match.Groups[ typeIdx ].Value ) ) + { + TemplateShaderPropertyData newData = new TemplateShaderPropertyData( match.Index, + match.Value, + match.Groups[ identationIdx ].Value, + match.Groups[ inspectorNameIdx ].Value, + match.Groups[ nameIdx ].Value, + PropertyToWireType[ match.Groups[ typeIdx ].Value ], + PropertyType.Property, + subShaderId, + passId); + propertiesList.Add( newData ); + duplicatesHelper.Add( newData.PropertyName, newData ); + } + } + } + } + public const string DepthMacroDeclRegex = @"UNITY_DECLARE_DEPTH_TEXTURE\(\s*_CameraDepthTexture"; + public static void CheckUnityBuiltinGlobalMacros( string propertyData, ref List propertiesList, ref Dictionary duplicatesHelper, int subShaderId, int passId ) + { + Match match = Regex.Match( propertyData, DepthMacroDeclRegex ); + if( match.Success ) + { + TemplateShaderPropertyData newData = new TemplateShaderPropertyData( -1, + string.Empty, + string.Empty, + string.Empty, + Constants.CameraDepthTextureValue, + WirePortDataType.SAMPLER2D, + PropertyType.Global, + subShaderId, + passId, + true ); + duplicatesHelper.Add( newData.PropertyName, newData ); + propertiesList.Add( newData ); + } + } + + public static void CreateShaderGlobalsList( string propertyData, ref List propertiesList, ref Dictionary duplicatesHelper,int subShaderId, int passId ) + { + int typeIdx = (int)TemplateShaderGlobalsIdx.Type; + int nameIdx = (int)TemplateShaderGlobalsIdx.Name; + + // removes structs + propertyData = Regex.Replace( propertyData, StructsRemoval, "" ); + MatchCollection matchCollection = Regex.Matches( propertyData, ShaderGlobalsOverallPattern ); + string value = ( matchCollection.Count > 0 ) ? matchCollection[ 0 ].Groups[ 0 ].Value : propertyData; + foreach( Match lineMatch in Regex.Matches( value, ShaderGlobalsMultilinePattern, RegexOptions.Multiline ) ) + { + if( lineMatch.Groups.Count > 1 ) + { + if( !duplicatesHelper.ContainsKey( lineMatch.Groups[ nameIdx ].Value ) && CgToWirePortType.ContainsKey( lineMatch.Groups[ typeIdx ].Value ) ) + { + TemplateShaderPropertyData newData = new TemplateShaderPropertyData( -1, + string.Empty, + string.Empty, + string.Empty, + lineMatch.Groups[ nameIdx ].Value, + CgToWirePortType[ lineMatch.Groups[ typeIdx ].Value ], + PropertyType.Global, + subShaderId, + passId); + duplicatesHelper.Add( newData.PropertyName, newData ); + propertiesList.Add( newData ); + } + } + } + } + + public static void CreateStencilOps( string stencilData, ref TemplateStencilData stencilDataObj ) + { + stencilDataObj.DataCheck = TemplateDataCheck.Invalid; + MatchCollection overallGlobalMatch = Regex.Matches( stencilData, StencilOpGlobalPattern ); + if( overallGlobalMatch.Count == 1 && overallGlobalMatch[ 0 ].Groups.Count == 2 ) + { + string property = string.Empty; + string value = overallGlobalMatch[ 0 ].Groups[ 1 ].Value; + foreach( Match match in Regex.Matches( value, StencilOpLinePattern ) ) + { + stencilDataObj.DataCheck = TemplateDataCheck.Valid; + if( match.Groups.Count == 3 ) + { + switch( match.Groups[ 1 ].Value ) + { + default: + { + stencilDataObj.DataCheck = TemplateDataCheck.Invalid; + return; + } + case "Ref": + { + if( match.Groups[ 2 ].Success && IsInlineProperty( match.Groups[ 2 ].Value, ref property ) ) + { + stencilDataObj.ReferenceInline = property; + } + else + { + try + { + stencilDataObj.Reference = Convert.ToInt32( match.Groups[ 2 ].Value ); + } + catch( Exception e ) + { + Debug.LogException( e ); + stencilDataObj.DataCheck = TemplateDataCheck.Invalid; + return; + } + } + } + break; + case "ReadMask": + { + if( match.Groups[ 2 ].Success && IsInlineProperty( match.Groups[ 2 ].Value, ref property ) ) + { + stencilDataObj.ReadMaskInline = property; + } + else + { + try + { + stencilDataObj.ReadMask = Convert.ToInt32( match.Groups[ 2 ].Value ); + } + catch( Exception e ) + { + Debug.LogException( e ); + stencilDataObj.DataCheck = TemplateDataCheck.Invalid; + return; + } + } + } + break; + case "WriteMask": + { + if( match.Groups[ 2 ].Success && IsInlineProperty( match.Groups[ 2 ].Value, ref property ) ) + { + stencilDataObj.WriteMaskInline = property; + } + else + { + try + { + stencilDataObj.WriteMask = Convert.ToInt32( match.Groups[ 2 ].Value ); + } + catch( Exception e ) + { + Debug.LogException( e ); + stencilDataObj.DataCheck = TemplateDataCheck.Invalid; + return; + } + } + } + break; + case "CompFront": + case "Comp": + { + if( match.Groups[ 2 ].Success && IsInlineProperty( match.Groups[ 2 ].Value, ref property ) ) + { + stencilDataObj.ComparisonFrontInline = property; + } + else + { + stencilDataObj.ComparisonFront = match.Groups[ 2 ].Value; + } + } + break; + case "PassFront": + case "Pass": + { + if( match.Groups[ 2 ].Success && IsInlineProperty( match.Groups[ 2 ].Value, ref property ) ) + { + stencilDataObj.PassFrontInline = property; + } + else + { + stencilDataObj.PassFront = match.Groups[ 2 ].Value; + } + } + break; + case "FailFront": + case "Fail": + { + if( match.Groups[ 2 ].Success && IsInlineProperty( match.Groups[ 2 ].Value, ref property ) ) + { + stencilDataObj.FailFrontInline = property; + } + else + { + stencilDataObj.FailFront = match.Groups[ 2 ].Value; + } + } + break; + case "ZFail": + case "ZFailFront": + { + if( match.Groups[ 2 ].Success && IsInlineProperty( match.Groups[ 2 ].Value, ref property ) ) + { + stencilDataObj.ZFailFrontInline = property; + } + else + { + stencilDataObj.ZFailFront = match.Groups[ 2 ].Value; + } + } + break; + case "CompBack": + { + if( match.Groups[ 2 ].Success && IsInlineProperty( match.Groups[ 2 ].Value, ref property ) ) + { + stencilDataObj.ComparisonBackInline = property; + } + else + { + stencilDataObj.ComparisonBack = match.Groups[ 2 ].Value; + } + } + break; + case "PassBack": + { + if( match.Groups[ 2 ].Success && IsInlineProperty( match.Groups[ 2 ].Value, ref property ) ) + { + stencilDataObj.PassBackInline = property; + } + else + { + stencilDataObj.PassBack = match.Groups[ 2 ].Value; + } + } + break; + case "FailBack": + { + if( match.Groups[ 2 ].Success && IsInlineProperty( match.Groups[ 2 ].Value, ref property ) ) + { + stencilDataObj.FailBackInline = property; + } + else + { + stencilDataObj.FailBack = match.Groups[ 2 ].Value; + } + } + break; + case "ZFailBack": + { + if( match.Groups[ 2 ].Success && IsInlineProperty( match.Groups[ 2 ].Value, ref property ) ) + { + stencilDataObj.ZFailBackInline = property; + } + else + { + stencilDataObj.ZFailBack = match.Groups[ 2 ].Value; + } + } + break; + } + } + } + } + } + + public static void CreateColorMask( string colorMaskData, ref TemplateColorMaskData colorMaskObj, string pattern ) + { + colorMaskObj.DataCheck = TemplateDataCheck.Invalid; + Match match = Regex.Match( colorMaskData, pattern ); + //if( match.Groups.Count == 3 /*&& !match.Groups[ 2 ].Success*/ ) // second group is the colormask MRT which isn't implemented yet + { + string property = string.Empty; + if( match.Groups[ 1 ].Success && IsInlineProperty( match.Groups[ 1 ].Value, ref property ) ) + { + colorMaskObj.InlineData = property; + colorMaskObj.DataCheck = TemplateDataCheck.Valid; + colorMaskObj.Target = match.Groups[ 2 ].Value; + } + else + { + for( int i = 0; i < 4; i++ ) + { + colorMaskObj.ColorMaskData[ i ] = false; + } + + colorMaskObj.Target = match.Groups[ 2 ].Value; + colorMaskObj.DataCheck = TemplateDataCheck.Valid; + try + { + for( int i = 0; i < match.Groups[ 1 ].Value.Length; i++ ) + { + switch( Char.ToLower( match.Groups[ 1 ].Value[ i ] ) ) + { + case 'r': colorMaskObj.ColorMaskData[ 0 ] = true; break; + case 'g': colorMaskObj.ColorMaskData[ 1 ] = true; break; + case 'b': colorMaskObj.ColorMaskData[ 2 ] = true; break; + case 'a': colorMaskObj.ColorMaskData[ 3 ] = true; break; + case '0': + { + for( int j = 0; j < 4; j++ ) + { + colorMaskObj.ColorMaskData[ j ] = false; + } + return; + } + default: + { + colorMaskObj.DataCheck = TemplateDataCheck.Invalid; + return; + } + } + } + } + catch( Exception e ) + { + Debug.LogException( e ); + colorMaskObj.DataCheck = TemplateDataCheck.Invalid; + return; + } + } + } + } + + public static void CreateAlphaToMask( string alphaToMaskData, ref TemplateAlphaToMaskData alphaToMaskObj ) + { + alphaToMaskObj.DataCheck = TemplateDataCheck.Invalid; + Match match = Regex.Match( alphaToMaskData, AlphaToMaskPattern ); + if( match.Groups.Count == 2 ) + { + string property = string.Empty; + if( match.Groups[ 1 ].Success && IsInlineProperty( match.Groups[ 1 ].Value, ref property ) ) + { + alphaToMaskObj.InlineData = property; + alphaToMaskObj.DataCheck = TemplateDataCheck.Valid; + } + else + { + try + { + alphaToMaskObj.AlphaToMaskData = match.Groups[ 1 ].Value == "On" ? true : false; + alphaToMaskObj.DataCheck = TemplateDataCheck.Valid; + } + catch( Exception e ) + { + alphaToMaskObj.DataCheck = TemplateDataCheck.Invalid; + Debug.LogException( e ); + return; + } + } + } + } + + public static void CreateCullMode( string cullModeData, ref TemplateCullModeData cullDataObj ) + { + cullDataObj.DataCheck = TemplateDataCheck.Invalid; + Match match = Regex.Match( cullModeData, CullModePattern ); + if( match.Groups.Count == 2 ) + { + string property = string.Empty; + if( match.Groups[ 1 ].Success && IsInlineProperty( match.Groups[ 1 ].Value, ref property ) ) + { + cullDataObj.InlineData = property; + cullDataObj.DataCheck = TemplateDataCheck.Valid; + } + else + { + try + { + cullDataObj.CullModeData = (CullMode)Enum.Parse( typeof( CullMode ), match.Groups[ 1 ].Value ); + cullDataObj.DataCheck = TemplateDataCheck.Valid; + } + catch( Exception e ) + { + cullDataObj.DataCheck = TemplateDataCheck.Invalid; + Debug.LogException( e ); + return; + } + } + } + } + + public static void CreateBlendMode( string blendModeData, ref TemplateBlendData blendDataObj, string pattern ) + { + blendDataObj.ValidBlendMode = true; + string property = string.Empty; + bool noMatches = true; + // TODO: OPTIMIZE REGEX EXPRESSIONS TO NOT CATCH EMPTY GROUPS + Match match = Regex.Match( blendModeData, pattern ); + //Debug.Log( blendModeData + " | " + match.Groups.Count + "|" + match.Groups[ 0 ].Value + " " + match.Groups[ 0 ].Success + " " + match.Groups[ 1 ].Success + " " + match.Groups[ 2 ].Success + " " + match.Groups[ 3 ].Success + " " + match.Groups[ 4 ].Success + " " + match.Groups[ 5 ].Success ); + { + if( match.Groups.Count <= 4 && match.Groups.Count >= 3 ) + { + if( match.Groups[ 0 ].Success && match.Groups[ 2 ].Success ) + { + try + { + if( IsInlineProperty( match.Groups[ 2 ].Value, ref property ) ) + { + blendDataObj.SourceFactorRGBInline = property; + } + else + { + AvailableBlendFactor sourceAll = (AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), match.Groups[ 2 ].Value ); + blendDataObj.SourceFactorRGB = sourceAll; + } + if( match.Groups[ 3 ].Success && IsInlineProperty( match.Groups[ 3 ].Value, ref property ) ) + { + blendDataObj.DestFactorRGBInline = property; + } + else + { + AvailableBlendFactor destAll = (AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), match.Groups[ 3 ].Value ); + blendDataObj.DestFactorRGB = destAll; + } + blendDataObj.Target = match.Groups[ 1 ].Value; + blendDataObj.SeparateBlendFactors = false; + blendDataObj.BlendModeOff = false; + noMatches = false; + } + catch( Exception e ) + { + Debug.LogException( e ); + blendDataObj.DataCheck = TemplateDataCheck.Invalid; + blendDataObj.ValidBlendMode = false; + return; + } + } + } + else if( match.Groups.Count >= 5 ) + { + if( match.Groups[ 1 ].Success ) + blendDataObj.Target = match.Groups[ 1 ].Value; + + if( !match.Groups[ 2 ].Success && !match.Groups[ 3 ].Success ) + { + if( match.Groups[ 0 ].Value.IndexOf("Off") > -1 ) + { + blendDataObj.BlendModeOff = true; + noMatches = false; + } + } + + if( match.Groups[ 0 ].Success && match.Groups[ 2 ].Success ) + { + try + { + if( IsInlineProperty( match.Groups[ 2 ].Value, ref property ) ) + { + blendDataObj.SourceFactorRGBInline = property; + } + else + { + AvailableBlendFactor sourceRGB = (AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), match.Groups[ 2 ].Value ); + blendDataObj.SourceFactorRGB = sourceRGB; + } + + if( match.Groups[ 3 ].Success && IsInlineProperty( match.Groups[ 3 ].Value, ref property ) ) + { + blendDataObj.DestFactorRGBInline = property; + } + else + { + AvailableBlendFactor destRGB = (AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), match.Groups[ 3 ].Value ); + blendDataObj.DestFactorRGB = destRGB; + } + + if( match.Groups[ 4 ].Success && match.Groups[ 5 ].Success ) + { + if( IsInlineProperty( match.Groups[ 4 ].Value, ref property ) ) + { + blendDataObj.SourceFactorAlphaInline = property; + } + else + { + AvailableBlendFactor sourceA = (AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), match.Groups[ 4 ].Value ); + blendDataObj.SourceFactorAlpha = sourceA; + } + + if( IsInlineProperty( match.Groups[ 5 ].Value, ref property ) ) + { + blendDataObj.DestFactorAlphaInline = property; + } + else + { + AvailableBlendFactor destA = (AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), match.Groups[ 5 ].Value ); + blendDataObj.DestFactorAlpha = destA; + } + + blendDataObj.SeparateBlendFactors = true; + } + else + { + blendDataObj.SeparateBlendFactors = false; + } + blendDataObj.Target = match.Groups[ 1 ].Value; + blendDataObj.BlendModeOff = false; + noMatches = false; + } + catch( Exception e ) + { + Debug.LogException( e ); + blendDataObj.DataCheck = TemplateDataCheck.Invalid; + blendDataObj.ValidBlendMode = false; + return; + } + } + } + } + + if( noMatches ) + blendDataObj.ValidBlendMode = false; + } + + public static void CreateBlendOp( string blendOpData, ref TemplateBlendData blendDataObj, string pattern ) + { + bool noMatches = true; + blendDataObj.ValidBlendOp = true; + string property = string.Empty; + // TODO: OPTIMIZE REGEX EXPRESSIONS TO NOT CATCH EMPTY GROUPS + Match match = Regex.Match( blendOpData, pattern ); + { + if( match.Groups.Count == 3 ) + { + if( match.Groups[ 0 ].Success && match.Groups[ 2 ].Success ) + { + + try + { + if( IsInlineProperty( match.Groups[ 2 ].Value, ref property ) ) + { + blendDataObj.BlendOpRGBInline = property; + } + else + { + AvailableBlendOps blendOpsAll = (AvailableBlendOps)Enum.Parse( typeof( AvailableBlendOps ), match.Groups[ 2 ].Value ); + blendDataObj.BlendOpRGB = blendOpsAll; + } + blendDataObj.SeparateBlendOps = false; + blendDataObj.Target = match.Groups[ 1 ].Value; + noMatches = false; + } + catch( Exception e ) + { + Debug.LogException( e ); + blendDataObj.DataCheck = TemplateDataCheck.Invalid; + blendDataObj.ValidBlendOp = false; + return; + } + } + } + else if( match.Groups.Count == 4 ) + { + if( match.Groups[ 0 ].Success && match.Groups[ 2 ].Success ) + { + try + { + if( IsInlineProperty( match.Groups[ 2 ].Value, ref property ) ) + { + blendDataObj.BlendOpRGBInline = property; + } + else + { + AvailableBlendOps blendOpsRGB = (AvailableBlendOps)Enum.Parse( typeof( AvailableBlendOps ), match.Groups[ 2 ].Value ); + blendDataObj.BlendOpRGB = blendOpsRGB; + } + + if( match.Groups[ 3 ].Success ) + { + if( IsInlineProperty( match.Groups[ 3 ].Value, ref property ) ) + { + blendDataObj.BlendOpAlphaInline = property; + } + else + { + AvailableBlendOps blendOpsA = (AvailableBlendOps)Enum.Parse( typeof( AvailableBlendOps ), match.Groups[ 3 ].Value ); + blendDataObj.BlendOpAlpha = blendOpsA; + } + blendDataObj.SeparateBlendOps = true; + } + else + { + blendDataObj.SeparateBlendOps = false; + } + blendDataObj.Target = match.Groups[ 1 ].Value; + noMatches = false; + } + catch( Exception e ) + { + Debug.LogException( e ); + blendDataObj.DataCheck = TemplateDataCheck.Invalid; + blendDataObj.ValidBlendOp = false; + return; + } + } + } + } + + if( noMatches ) + blendDataObj.ValidBlendOp = false; + } + + public static void FetchLocalVars( string body, ref List localVarList, TemplateFunctionData vertexFunction, TemplateFunctionData fragFunction ) + { + foreach( Match match in Regex.Matches( body, LocalVarPattern ) ) + { + if( match.Groups.Count == 4 ) + { + if( CgToWirePortType.ContainsKey( match.Groups[ 2 ].Value ) ) + { + MasterNodePortCategory category; + if( fragFunction.MainBodyLocalIdx > vertexFunction.MainBodyLocalIdx ) + { + if( match.Index < fragFunction.MainBodyLocalIdx ) + { + category = MasterNodePortCategory.Vertex; + } + else + { + category = MasterNodePortCategory.Fragment; + } + } + else + { + if( match.Index < vertexFunction.MainBodyLocalIdx ) + { + category = MasterNodePortCategory.Fragment; + } + else + { + category = MasterNodePortCategory.Vertex; + } + } + + if( !string.IsNullOrEmpty( match.Groups[ 1 ].Value ) && ShortcutToInfo.ContainsKey( match.Groups[ 1 ].Value ) ) + { + string id = match.Groups[ 0 ].Value.Substring( 0, match.Groups[ 0 ].Value.IndexOf( "*/" ) + 2 ); + TemplateLocalVarData data = new TemplateLocalVarData( ShortcutToInfo[ match.Groups[ 1 ].Value ], id, CgToWirePortType[ match.Groups[ 2 ].Value ], category, match.Groups[ 3 ].Value, match.Index ); + localVarList.Add( data ); + } + else + { + TemplateLocalVarData data = new TemplateLocalVarData( CgToWirePortType[ match.Groups[ 2 ].Value ], category, match.Groups[ 3 ].Value, match.Index ); + localVarList.Add( data ); + } + + } + } + } + } + + public static void FetchInlineVars( string body, ref TemplateIdManager idManager ) + { + foreach( Match match in Regex.Matches( body, InlinePattern ) ) + { + if( match.Success && match.Groups.Count == 2 ) + { + string id = match.Groups[ 0 ].Value; + string prop = match.Groups[ 1 ].Value; + idManager.RegisterTag( id, prop ); + } + } + } + + public static TemplateSRPType CreateTags( ref TemplateTagsModuleData tagsObj, bool isSubShader ) + { + TemplateSRPType srpType = TemplateSRPType.BuiltIn; + MatchCollection matchColl = Regex.Matches( tagsObj.TagsId, TagsPattern, RegexOptions.IgnorePatternWhitespace ); + int count = matchColl.Count; + if( count > 0 ) + { + for( int i = 0; i < count; i++ ) + { + if( matchColl[ i ].Groups.Count == 3 ) + { + if( isSubShader && matchColl[ i ].Groups[ 1 ].Value.Equals( "RenderPipeline" ) ) + { + if( TagToRenderPipeline.ContainsKey( matchColl[ i ].Groups[ 2 ].Value ) ) + srpType = TagToRenderPipeline[ matchColl[ i ].Groups[ 2 ].Value ]; + } + tagsObj.Tags.Add( new TemplatesTagData( matchColl[ i ].Groups[ 1 ].Value, matchColl[ i ].Groups[ 2 ].Value ) ); + } + } + } + return srpType; + } + + public static void CreateZWriteMode( string zWriteData, ref TemplateDepthData depthDataObj ) + { + depthDataObj.DataCheck = TemplateDataCheck.Invalid; + Match match = Regex.Match( zWriteData, ZWritePattern ); + if( match.Groups.Count == 2 ) + { + string property = string.Empty; + if( match.Groups[ 1 ].Success && IsInlineProperty( match.Groups[ 1 ].Value, ref property ) ) + { + depthDataObj.ZWriteInlineValue = property; + depthDataObj.DataCheck = TemplateDataCheck.Valid; + depthDataObj.ValidZWrite = true; + } + else + { + try + { + depthDataObj.ZWriteModeValue = (ZWriteMode)Enum.Parse( typeof( ZWriteMode ), match.Groups[ 1 ].Value ); + depthDataObj.DataCheck = TemplateDataCheck.Valid; + depthDataObj.ValidZWrite = true; + } + catch + { + depthDataObj.DataCheck = TemplateDataCheck.Invalid; + } + } + } + } + + public static void CreateZTestMode( string zTestData, ref TemplateDepthData depthDataObj ) + { + depthDataObj.DataCheck = TemplateDataCheck.Invalid; + Match match = Regex.Match( zTestData, ZTestPattern ); + if( match.Groups.Count == 2 ) + { + string property = string.Empty; + if( match.Groups[ 1 ].Success && IsInlineProperty( match.Groups[ 1 ].Value, ref property ) ) + { + depthDataObj.ZTestInlineValue = property; + depthDataObj.DataCheck = TemplateDataCheck.Valid; + depthDataObj.ValidZTest = true; + } + else + { + try + { + depthDataObj.ZTestModeValue = (ZTestMode)Enum.Parse( typeof( ZTestMode ), match.Groups[ 1 ].Value ); + depthDataObj.DataCheck = TemplateDataCheck.Valid; + depthDataObj.ValidZTest = true; + } + catch + { + depthDataObj.DataCheck = TemplateDataCheck.Invalid; + } + } + } + } + + public static void CreateZOffsetMode( string zOffsetData, ref TemplateDepthData depthDataObj ) + { + depthDataObj.DataCheck = TemplateDataCheck.Invalid; + Match match = Regex.Match( zOffsetData, ZOffsetPattern ); + if( match.Groups.Count == 3 ) + { + try + { + string property = string.Empty; + + if( match.Groups[ 1 ].Success && IsInlineProperty( match.Groups[ 1 ].Value, ref property ) ) + { + depthDataObj.OffsetFactorInlineValue = property; + } + else + { + depthDataObj.OffsetFactor = Convert.ToSingle( match.Groups[ 1 ].Value ); + } + + if( match.Groups[ 2 ].Success && IsInlineProperty( match.Groups[ 2 ].Value, ref property ) ) + { + depthDataObj.OffsetUnitsInlineValue = property; + } + else + { + depthDataObj.OffsetUnits = Convert.ToSingle( match.Groups[ 2 ].Value ); + } + + depthDataObj.ValidOffset = true; + depthDataObj.DataCheck = TemplateDataCheck.Valid; + } + catch + { + depthDataObj.DataCheck = TemplateDataCheck.Invalid; + } + } + } + + public static List CreateVertexDataList( string vertexData, string parametersBody ) + { + List vertexDataList = null; + Dictionary vertexDataDict = null; + + foreach( Match match in Regex.Matches( vertexData, VertexDataPattern ) ) + { + if( match.Groups.Count > 1 ) + { + if( vertexDataList == null ) + { + vertexDataList = new List(); + vertexDataDict = new Dictionary(); + } + + WirePortDataType dataType = CgToWirePortType[ match.Groups[ 1 ].Value ]; + string varName = match.Groups[ 2 ].Value; + TemplateSemantics semantics = TemplateSemantics.NONE; + try + { + semantics = (TemplateSemantics)Enum.Parse( typeof( TemplateSemantics ), match.Groups[ 3 ].Value ); + } + catch(Exception e) + { + Debug.LogException( e ); + } + TemplateVertexData templateVertexData = new TemplateVertexData( semantics, dataType, varName ); + vertexDataList.Add( templateVertexData ); + vertexDataDict.Add( semantics, templateVertexData ); + } + } + + if( vertexData.Contains( Constants.InstanceIdMacro ) ) + { + TemplateVertexData templateVertexData = new TemplateVertexData( TemplateSemantics.SV_InstanceID, WirePortDataType.UINT, Constants.InstanceIdVariable ); + templateVertexData.DataInfo = TemplateInfoOnSematics.INSTANCE_ID; + templateVertexData.Available = true; + templateVertexData.ExcludeStructPrefix = true; + + vertexDataList.Add( templateVertexData ); + vertexDataDict.Add( TemplateSemantics.SV_InstanceID, templateVertexData ); + } + + if( !string.IsNullOrEmpty( parametersBody ) ) + { + string[] paramsArray = parametersBody.Split( IOUtils.FIELD_SEPARATOR ); + if( paramsArray.Length > 0 ) + { + for( int i = 0; i < paramsArray.Length; i++ ) + { + string[] paramDataArr = paramsArray[ i ].Split( IOUtils.VALUE_SEPARATOR ); + if( paramDataArr.Length == 2 ) + { + string[] swizzleInfoArr = paramDataArr[ 1 ].Split( IOUtils.FLOAT_SEPARATOR ); + TemplateSemantics semantic = ShortcutToSemantic[ swizzleInfoArr[ 0 ] ]; + if( vertexDataDict.ContainsKey( semantic ) ) + { + TemplateVertexData templateVertexData = vertexDataDict[ semantic ]; + if( templateVertexData != null ) + { + if( swizzleInfoArr.Length > 1 ) + { + templateVertexData.DataSwizzle = "." + swizzleInfoArr[ 1 ]; + } + templateVertexData.DataInfo = ShortcutToInfo[ paramDataArr[ 0 ] ]; + templateVertexData.Available = true; + } + } + } + } + } + } + + if( vertexDataDict != null ) + { + vertexDataDict.Clear(); + vertexDataDict = null; + } + + return vertexDataList; + } + + public static TemplateInterpData CreateInterpDataList( string interpData, string fullLine, int maxInterpolators ) + { + TemplateInterpData interpDataObj = null; + List interpDataList = null; + Dictionary interpDataDict = null; + Match rangeMatch = Regex.Match( fullLine, InterpRangePattern ); + if( rangeMatch.Groups.Count > 0 ) + { + interpDataObj = new TemplateInterpData(); + // Get range of available interpolators + int minVal = 0; + int maxVal = 0; + try + { + string[] minValArgs = rangeMatch.Groups[ 1 ].Value.Split( IOUtils.FLOAT_SEPARATOR ); + minVal = Convert.ToInt32( minValArgs[ 0 ] ); + if( string.IsNullOrEmpty( rangeMatch.Groups[ 2 ].Value ) ) + { + maxVal = maxInterpolators - 1; + interpDataObj.DynamicMax = true; + } + else + { + maxVal = Convert.ToInt32( rangeMatch.Groups[ 2 ].Value ); + } + if( minVal > maxVal ) + { + //int aux = minVal; + //minVal = maxVal; + //maxVal = aux; + maxVal = minVal; + } + + for( int i = minVal; i <= maxVal; i++ ) + { + interpDataObj.AvailableInterpolators.Add( new TemplateInterpElement( IntToSemantic[ i ] ) ); + } + if( minValArgs.Length > 1 ) + { + interpDataObj.AvailableInterpolators[ 0 ].SetAvailableChannelsFromString( minValArgs[ 1 ] ); + } + } + catch( Exception e ) + { + Debug.LogException( e ); + } + + interpDataList = new List(); + interpDataDict = new Dictionary(); + + //Get Current interpolators + int parametersBeginIdx = fullLine.IndexOf( ":" ) + 1; + int parametersEnd = fullLine.IndexOf( TemplatesManager.TemplateEndOfLine ); + string parametersBody = fullLine.Substring( parametersBeginIdx, parametersEnd - parametersBeginIdx ); + + foreach( Match match in Regex.Matches( interpData, VertexDataPattern ) ) + { + if( match.Groups.Count > 1 ) + { + WirePortDataType dataType = CgToWirePortType[ match.Groups[ 1 ].Value ]; + string varName = match.Groups[ 2 ].Value; + TemplateSemantics semantics = TemplateSemantics.NONE; + try + { + semantics = (TemplateSemantics)Enum.Parse( typeof( TemplateSemantics ), match.Groups[ 3 ].Value ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + + TemplateVertexData templateVertexData = new TemplateVertexData( semantics, dataType, varName ); + //interpDataList.Add( templateVertexData ); + interpDataDict.Add( semantics, templateVertexData ); + interpDataObj.RawInterpolators.Add( templateVertexData ); + //Check if they are also on the free channels list and update their names + interpDataObj.ReplaceNameOnInterpolator( semantics, varName ); + } + } + + if( interpData.Contains( Constants.InstanceIdMacro ) ) + { + TemplateVertexData templateInterpData = new TemplateVertexData( TemplateSemantics.SV_InstanceID, WirePortDataType.UINT, Constants.InstanceIdVariable ); + templateInterpData.DataInfo = TemplateInfoOnSematics.INSTANCE_ID; + templateInterpData.Available = true; + templateInterpData.ExcludeStructPrefix = true; + interpDataList.Add( templateInterpData ); + interpDataDict.Add( TemplateSemantics.SV_InstanceID, templateInterpData ); + } + + Dictionary auxDict = new Dictionary(); + // Get info for available interpolators + string[] paramsArray = parametersBody.Split( IOUtils.FIELD_SEPARATOR ); + if( paramsArray.Length > 0 ) + { + for( int i = 0; i < paramsArray.Length; i++ ) + { + string[] paramDataArr = paramsArray[ i ].Split( IOUtils.VALUE_SEPARATOR ); + if( paramDataArr.Length == 2 ) + { + string[] swizzleInfoArr = paramDataArr[ 1 ].Split( IOUtils.FLOAT_SEPARATOR ); + TemplateSemantics semantic = ShortcutToSemantic[ swizzleInfoArr[ 0 ] ]; + if( interpDataDict.ContainsKey( semantic ) ) + { + if( interpDataDict[ semantic ] != null ) + { + string[] multiComponent = paramDataArr[ 0 ].Split( IOUtils.FLOAT_SEPARATOR ); + + if( multiComponent.Length > 1 ) + { + TemplateVertexData templateInterpData = null; + if( auxDict.ContainsKey( multiComponent[ 0 ] ) ) + { + templateInterpData = auxDict[ multiComponent[ 0 ] ]; + } + else + { + templateInterpData = new TemplateVertexData( interpDataDict[ semantic ] ); + //if( swizzleInfoArr.Length > 1 ) + //{ + // templateInterpData.DataSwizzle = "." + swizzleInfoArr[ 1 ]; + //} + templateInterpData.DataInfo = ShortcutToInfo[ multiComponent[ 0 ] ]; + templateInterpData.Available = true; + interpDataList.Add( templateInterpData ); + auxDict.Add( multiComponent[ 0 ], templateInterpData ); + } + + if( swizzleInfoArr[ 1 ].Length == multiComponent[ 1 ].Length ) + { + for( int channelIdx = 0; channelIdx < swizzleInfoArr[ 1 ].Length; channelIdx++ ) + { + templateInterpData.RegisterComponent( multiComponent[ 1 ][ channelIdx ], interpDataDict[ semantic ].VarName + "." + swizzleInfoArr[ 1 ][ channelIdx ] ); + } + } + } + else + { + TemplateVertexData templateInterpData = new TemplateVertexData( interpDataDict[ semantic ] ); + if( swizzleInfoArr.Length > 1 ) + { + templateInterpData.DataSwizzle = "." + swizzleInfoArr[ 1 ]; + } + templateInterpData.DataInfo = ShortcutToInfo[ paramDataArr[ 0 ] ]; + templateInterpData.Available = true; + interpDataList.Add( templateInterpData ); + } + } + } + } + } + } + + /*TODO: + 1) Remove interpDataList.Add( templateVertexData ); from initial foreach + 2) When looping though each foreach array element, create a new TemplateVertexData + from the one containted on the interpDataDict and add it to interpDataList + */ + for( int i = 0; i < interpDataList.Count; i++ ) + { + interpDataList[ i ].BuildVar(); + } + + auxDict.Clear(); + auxDict = null; + + interpDataObj.Interpolators = interpDataList; + interpDataDict.Clear(); + interpDataDict = null; + } + return interpDataObj; + } + + public static void FetchDependencies( TemplateInfoContainer dependencies, ref string body ) + { + int index = body.IndexOf( TemplatesManager.TemplateDependenciesListTag ); + if( index > 0 ) + { + dependencies.Index = index; + dependencies.Id = TemplatesManager.TemplateDependenciesListTag; + dependencies.Data = TemplatesManager.TemplateDependenciesListTag; + } + else + { + int lastIndex = body.LastIndexOf( '}' ); + if( lastIndex > 0 ) + { + body = body.Insert( lastIndex, "\t" + TemplatesManager.TemplateDependenciesListTag + "\n" ); + FetchDependencies( dependencies, ref body ); + } + } + } + + public static void FetchCustomInspector( TemplateInfoContainer inspectorContainer, ref string body ) + { + Match match = Regex.Match( body, CustomInspectorPattern, RegexOptions.Multiline ); + if( match != null && match.Groups.Count > 1 ) + { + inspectorContainer.Index = match.Index; + inspectorContainer.Id = match.Groups[ 0 ].Value; + inspectorContainer.Data = match.Groups[ 1 ].Value; + +#if UNITY_2019_3_OR_NEWER + if( ASEPackageManagerHelper.CurrentHDVersion > ASESRPVersions.ASE_SRP_6_9_1 ) + { + if( inspectorContainer.Data.Equals( "UnityEditor.Experimental.Rendering.HDPipeline.HDLitGUI" ) ) + inspectorContainer.Data = "UnityEditor.Rendering.HighDefinition.HDLitGUI"; + } +#endif + } + else + { + int index = body.LastIndexOf( '}' ); + if( index > 0 ) + { + body = body.Insert( index, string.Format( "\tCustomEditor \"{0}\"\n", Constants.DefaultCustomInspector ) ); + FetchCustomInspector( inspectorContainer, ref body ); + } + } + } + + public static void FetchFallback( TemplateInfoContainer fallbackContainer, ref string body ) + { + Match match = Regex.Match( body, FallbackPattern, RegexOptions.Multiline | RegexOptions.IgnoreCase ); + if( match != null && match.Groups.Count > 1 ) + { + fallbackContainer.Index = match.Index; + fallbackContainer.Id = match.Groups[ 0 ].Value; + fallbackContainer.Data = match.Groups[ 1 ].Value; + } + else + { + int index = body.LastIndexOf( '}' ); + if( index > 0 ) + { + body = body.Insert( index, "\tFallback \"\"\n" ); + FetchFallback( fallbackContainer, ref body ); + } + } + } + + public static string AutoSwizzleData( string dataVar, WirePortDataType from, WirePortDataType to, bool isPosition ) + { + switch( from ) + { + case WirePortDataType.COLOR: + case WirePortDataType.FLOAT4: + { + switch( to ) + { + case WirePortDataType.FLOAT3: dataVar += ".xyz"; break; + case WirePortDataType.FLOAT2: dataVar += ".xy"; break; + case WirePortDataType.INT: + case WirePortDataType.FLOAT: dataVar += ".x"; break; + } + } + break; + case WirePortDataType.FLOAT3: + { + switch( to ) + { + case WirePortDataType.FLOAT4: dataVar = string.Format( "float4({0},{1})", dataVar,(isPosition?1:0) ); break; + case WirePortDataType.FLOAT2: dataVar += ".xy"; break; + case WirePortDataType.INT: + case WirePortDataType.FLOAT: dataVar += ".x"; break; + } + } + break; + case WirePortDataType.FLOAT2: + { + switch( to ) + { + case WirePortDataType.FLOAT4: dataVar = string.Format( "float4({0},0,{1})", dataVar , (isPosition ? 1 : 0) ); break; + case WirePortDataType.FLOAT3: dataVar = string.Format( "float3({0},0)", dataVar ); break; + case WirePortDataType.INT: + case WirePortDataType.FLOAT: dataVar += ".x"; break; + } + } + break; + case WirePortDataType.FLOAT: + { + switch( to ) + { + case WirePortDataType.FLOAT4: dataVar = string.Format( "float4({0},0,0,{1})", dataVar, ( isPosition ? 1 : 0 ) ); break; + case WirePortDataType.FLOAT3: dataVar = string.Format( "float3({0},0,0)", dataVar ); break; + case WirePortDataType.FLOAT2: dataVar = string.Format( "float2({0},0)", dataVar ); break; + } + } + break; + } + return dataVar; + } + + public static bool CheckIfTemplate( string assetPath ) + { + if( assetPath.EndsWith( ".shader" ) ) + { + if( File.Exists( assetPath ) ) + { + string body = IOUtils.LoadTextFileFromDisk( assetPath ); + return ( body.IndexOf( TemplatesManager.TemplateShaderNameBeginTag ) > -1 ); + } + } + return false; + } + + public static bool CheckIfCompatibles( WirePortDataType first, WirePortDataType second ) + { + switch( first ) + { + case WirePortDataType.OBJECT: + return true; + case WirePortDataType.FLOAT: + case WirePortDataType.FLOAT2: + case WirePortDataType.FLOAT3: + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: + case WirePortDataType.INT: + { + switch( second ) + { + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + case WirePortDataType.SAMPLER1D: + case WirePortDataType.SAMPLER2D: + case WirePortDataType.SAMPLER3D: + case WirePortDataType.SAMPLERCUBE: + case WirePortDataType.SAMPLER2DARRAY: + case WirePortDataType.SAMPLERSTATE: + return false; + } + } + break; + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + { + switch( second ) + { + case WirePortDataType.FLOAT: + case WirePortDataType.FLOAT2: + case WirePortDataType.FLOAT3: + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: + case WirePortDataType.INT: + case WirePortDataType.SAMPLER1D: + case WirePortDataType.SAMPLER2D: + case WirePortDataType.SAMPLER3D: + case WirePortDataType.SAMPLERCUBE: + case WirePortDataType.SAMPLER2DARRAY: + case WirePortDataType.SAMPLERSTATE: + return false; + } + } + break; + case WirePortDataType.SAMPLER1D: + case WirePortDataType.SAMPLER2D: + case WirePortDataType.SAMPLER3D: + case WirePortDataType.SAMPLERCUBE: + case WirePortDataType.SAMPLER2DARRAY: + { + switch( second ) + { + case WirePortDataType.FLOAT: + case WirePortDataType.FLOAT2: + case WirePortDataType.FLOAT3: + case WirePortDataType.FLOAT4: + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + case WirePortDataType.COLOR: + case WirePortDataType.INT: + case WirePortDataType.SAMPLERSTATE: + return false; + } + } + break; + case WirePortDataType.SAMPLERSTATE: + { + switch( second ) + { + default: + return false; + case WirePortDataType.SAMPLERSTATE: + case WirePortDataType.OBJECT: + break; + } + } + break; + } + return true; + } + // Lightweight <-> Default functions + public static string WorldSpaceViewDir( MasterNodeDataCollector dataCollector, string worldPosVec3, bool normalize ) + { + string value = string.Empty; + if( dataCollector.IsTemplate && dataCollector.IsSRP ) + { + value = string.Format( "_WorldSpaceCameraPos.xyz - {0}", worldPosVec3 ); + } + else + { + value = string.Format( "UnityWorldSpaceViewDir( {0} )", worldPosVec3 ); + } + + if( normalize ) + { + value = SafeNormalize( dataCollector, value ); + } + + return value; + } + + public static string SafeNormalize( MasterNodeDataCollector dataCollector, string value ) + { + if( dataCollector.IsTemplate && dataCollector.IsSRP ) + { + value = string.Format( "SafeNormalize( {0} )", value ); + } + else + { + dataCollector.AddToIncludes( -1, Constants.UnityBRDFLib ); + value = string.Format( "Unity_SafeNormalize( {0} )", value ); + } + return value; + } + + public static bool IsInlineProperty( string data, ref string property ) + { + if( data.Length > 0 && data[ 0 ] == '[' && data[ data.Length - 1 ] == ']' ) + { + property = data.Substring( 1, data.Length - 2 ); + return true; + } + return false; + } + + // public static readonly string FetchDefaultDepthFormat = "UNITY_SAMPLE_DEPTH(tex2Dproj(_CameraDepthTexture,UNITY_PROJ_COORD( {0} )))"; + public static readonly string FetchDefaultDepthFormat = "SAMPLE_DEPTH_TEXTURE( _CameraDepthTexture, {0}.xy )"; + public static readonly string FetchDefaultDepthFormatVertex = "SAMPLE_DEPTH_TEXTURE_LOD( _CameraDepthTexture, float4( {0}.xy, 0, 0 ) )"; + + public static readonly string FetchLWDepthFormat = "SHADERGRAPH_SAMPLE_SCENE_DEPTH( {0}.xy )"; + public static readonly string FetchLWDepthFormatVertex = "SHADERGRAPH_SAMPLE_SCENE_DEPTH_LOD( {0}.xy )"; +#if UNITY_2018_3_OR_NEWER + public static readonly string FetchHDDepthFormat = "SampleCameraDepth( {0}.xy )"; +#else + public static readonly string FetchHDDepthFormat = "SAMPLE_TEXTURE2D( _CameraDepthTexture, s_point_clamp_sampler, {0}.xy ).r"; +#endif + public static string CreateDepthFetch( MasterNodeDataCollector dataCollector, string screenPos ) + { + string screenDepthInstruction = string.Empty; + if( dataCollector.IsTemplate && dataCollector.IsSRP ) + { + if( dataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.Lightweight ) + { + if( dataCollector.PortCategory == MasterNodePortCategory.Vertex ) + { + string m_functionBody = string.Empty; + GenerateLW( ref m_functionBody ); + dataCollector.AddFunctions( FetchLWDepthFormatVertex, m_functionBody, "0" ); + screenDepthInstruction = string.Format( FetchLWDepthFormatVertex, screenPos ); + } + else + screenDepthInstruction = string.Format( FetchLWDepthFormat, screenPos ); + } + else if( dataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.HD ) + screenDepthInstruction = string.Format( FetchHDDepthFormat, screenPos ); + } + else + { + if( dataCollector.PortCategory == MasterNodePortCategory.Vertex ) + screenDepthInstruction = string.Format( FetchDefaultDepthFormatVertex, screenPos ); + else + screenDepthInstruction = string.Format( FetchDefaultDepthFormat, screenPos ); + } + return screenDepthInstruction; + } + + public static void GenerateLW( ref string body ) + { + body = string.Empty; + IOUtils.AddFunctionHeader( ref body, "float SHADERGRAPH_SAMPLE_SCENE_DEPTH_LOD(float2 uv)" ); + IOUtils.AddFunctionLine( ref body, "#if defined(REQUIRE_DEPTH_TEXTURE)" ); + IOUtils.AddFunctionLine( ref body, "#if defined(UNITY_STEREO_INSTANCING_ENABLED) || defined(UNITY_STEREO_MULTIVIEW_ENABLED)" ); + IOUtils.AddFunctionLine( ref body, " \tfloat rawDepth = SAMPLE_TEXTURE2D_ARRAY_LOD(_CameraDepthTexture, sampler_CameraDepthTexture, uv, unity_StereoEyeIndex, 0).r;" ); + IOUtils.AddFunctionLine( ref body, "#else" ); + IOUtils.AddFunctionLine( ref body, " \tfloat rawDepth = SAMPLE_DEPTH_TEXTURE_LOD(_CameraDepthTexture, sampler_CameraDepthTexture, uv, 0);" ); + IOUtils.AddFunctionLine( ref body, "#endif" ); + IOUtils.AddFunctionLine( ref body, "return rawDepth;" ); + IOUtils.AddFunctionLine( ref body, "#endif // REQUIRE_DEPTH_TEXTURE" ); + IOUtils.AddFunctionLine( ref body, "return 0;" ); + IOUtils.CloseFunctionBody( ref body ); + } + + public static bool GetShaderModelForInterpolatorAmount( int interpAmount, ref string shaderModel ) + { + for( int i = 0; i < AvailableShaderModels.Length; i++ ) + { + if( AvailableInterpolators[ AvailableShaderModels[ i ] ] >= interpAmount ) + { + shaderModel = AvailableShaderModels[ i ]; + return true; + } + } + return false; + } + + public static string GetSubShaderFrom( string shaderBody ) + { + Match match = Regex.Match( shaderBody, FetchSubShaderBody, RegexOptions.Singleline ); + if( match.Success && match.Groups.Count > 1 ) + { + return match.Groups[ 1 ].Value; + } + + return string.Empty; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateHelperFunctions.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateHelperFunctions.cs.meta new file mode 100644 index 0000000..8cbfe8c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateHelperFunctions.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 517aad6764d713946bc566f0a83cd44d +timeCreated: 1495548641 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateIdManager.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateIdManager.cs new file mode 100644 index 0000000..a9d242d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateIdManager.cs @@ -0,0 +1,236 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class TemplatePassId + { + public string PassId; + public bool RemoveFromShader; + } + + + [Serializable] + public class TemplateTag + { + public string Tag = string.Empty; + public string Replacement = string.Empty; + public string Output = string.Empty; + public TemplateTag( string tag, string replacement = null ) + { + Tag = tag; + if( replacement != null ) + { + Replacement = replacement; + Output = replacement; + } + } + } + + [Serializable] + public class TemplateId + { + public int StartIdx = -1; + public string UniqueID; + public string Tag; + public string ReplacementText; + public bool IsReplaced = false; + public bool EmptyReplacer = false; + public TemplateId( int bodyIdx, string uniqueID, string tag, bool emptyReplacer = false ) + { + StartIdx = bodyIdx; + UniqueID = uniqueID; + Tag = tag; + EmptyReplacer = emptyReplacer; + ReplacementText = emptyReplacer ? string.Empty : tag; + } + + public void SetReplacementText( string replacementText ) + { + ReplacementText = replacementText; + IsReplaced = true; + } + + public void Reset() + { + ReplacementText = EmptyReplacer?string.Empty:Tag; + IsReplaced = false; + } + } + + [Serializable] + public class TemplateIdManager + { + [SerializeField] + private bool m_isSorted = false; + [SerializeField] + private string m_shaderBody; + [SerializeField] + private List m_registeredIds = new List(); + + [SerializeField] + private List m_registeredTags = new List(); + + [SerializeField] + private List m_registeredPassIds = new List(); + + private Dictionary m_registeredIdsDict = new Dictionary(); + + public TemplateIdManager( string shaderBody ) + { + m_shaderBody = shaderBody; + } + + public void Destroy() + { + m_registeredPassIds.Clear(); + m_registeredPassIds = null; + + m_registeredTags.Clear(); + m_registeredTags = null; + + m_registeredIds.Clear(); + m_registeredIds = null; + if( m_registeredIdsDict != null ) + { + m_registeredIdsDict.Clear(); + m_registeredIdsDict = null; + } + } + + void RefreshIds() + { + if( m_registeredIdsDict == null ) + { + m_registeredIdsDict = new Dictionary(); + } + + if( m_registeredIdsDict.Count != m_registeredIds.Count ) + { + m_registeredIdsDict.Clear(); + int count = m_registeredIds.Count; + for( int i = 0; i < count; i++ ) + { + m_registeredIdsDict.Add( m_registeredIds[ i ].UniqueID, m_registeredIds[ i ] ); + } + } + } + + public void RegisterId( int bodyIdx, string uniqueID, string tag, bool emptyReplacer = false ) + { + if( bodyIdx < 0 ) + return; + + RefreshIds(); + + TemplateId templateId = new TemplateId( bodyIdx, uniqueID, tag, emptyReplacer ); + m_registeredIds.Add( templateId ); + m_registeredIdsDict.Add( uniqueID, templateId ); + } + + public void RegisterTag( string tag, string replacement = null ) + { + m_registeredTags.Add( new TemplateTag( tag, replacement ) ); + } + + public void RegisterPassId( string passId ) + { + m_registeredPassIds.Add( new TemplatePassId() { PassId = passId, RemoveFromShader = false } ); + } + + public void SetPassIdUsage( int idx , bool removeFromShader ) + { + m_registeredPassIds[ idx ].RemoveFromShader = removeFromShader; + } + + public void SetReplacementText( string uniqueId, string replacementText ) + { + RefreshIds(); + + if( m_registeredIdsDict.ContainsKey( uniqueId ) && m_registeredIdsDict[ uniqueId ].StartIdx >= 0 ) + m_registeredIdsDict[ uniqueId ].SetReplacementText( replacementText ); + } + + + public string BuildShader() + { + if( !m_isSorted ) + { + m_registeredIds.Sort( ( x, y ) => { return x.StartIdx.CompareTo( y.StartIdx ); } ); + } + + int idCount = m_registeredIds.Count; + int offset = 0; + string finalShaderBody = m_shaderBody; + for( int i = 0; i < idCount; i++ ) + { + if( m_registeredIds[ i ].StartIdx >= 0 && m_registeredIds[ i ].IsReplaced ) + { + finalShaderBody = finalShaderBody.ReplaceAt( m_registeredIds[ i ].Tag, m_registeredIds[ i ].ReplacementText, offset + m_registeredIds[ i ].StartIdx ); + offset += ( m_registeredIds[ i ].ReplacementText.Length - m_registeredIds[ i ].Tag.Length ); + } + } + + int count = m_registeredPassIds.Count; + for( int i = 0; i < count; i++ ) + { + if( m_registeredPassIds[ i ].RemoveFromShader ) + finalShaderBody = finalShaderBody.Replace( m_registeredPassIds[ i ].PassId, string.Empty ); + } + + for( int i = 0; i < idCount; i++ ) + { + if( !m_registeredIds[ i ].IsReplaced && !m_registeredIds[ i ].Tag.Equals( m_registeredIds[ i ].ReplacementText ) ) + { + finalShaderBody = finalShaderBody.Replace( m_registeredIds[ i ].Tag, m_registeredIds[ i ].ReplacementText ); + } + } + + count = m_registeredTags.Count; + for( int i = 0; i < count; i++ ) + { + finalShaderBody = finalShaderBody.Replace( m_registeredTags[ i ].Tag, m_registeredTags[ i ].Replacement ); + m_registeredTags[ i ].Replacement = m_registeredTags[ i ].Output; + } + + //finalShaderBody = finalShaderBody.Replace( TemplatesManager.TemplateExcludeFromGraphTag, string.Empty ); + //finalShaderBody = finalShaderBody.Replace( TemplatesManager.TemplateMainPassTag, string.Empty ); + + return finalShaderBody; + } + + public void ResetRegistersState() + { + int count = m_registeredIds.Count; + for( int i = 0; i < count; i++ ) + { + m_registeredIds[ i ].Reset(); + } + } + + public void Reset() + { + m_registeredIds.Clear(); + if( m_registeredIdsDict == null ) + { + m_registeredIdsDict = new Dictionary(); + } + else + { + m_registeredIdsDict.Clear(); + } + } + + public string ShaderBody + { + get { return m_shaderBody; } + set { m_shaderBody = value; } + } + + public List RegisteredTags { get { return m_registeredTags; } set { m_registeredTags = value; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateIdManager.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateIdManager.cs.meta new file mode 100644 index 0000000..887ff5a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateIdManager.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b0d2e93061ffcbd45b085a61e5000daa +timeCreated: 1517315635 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateInterpData.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateInterpData.cs new file mode 100644 index 0000000..d71b057 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateInterpData.cs @@ -0,0 +1,239 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class TemplateInterpElement + { + public TemplateSemantics Semantic; + public bool[] AvailableChannels = { true, true, true, true }; + public bool IsFull = false; + public int Usage = 0; + public string Name; + //https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-struct + public bool NoInterpolation; + public bool Sample; + + public TemplateInterpElement( TemplateInterpElement other ) + { + Semantic = other.Semantic; + for ( int i = 0; i < AvailableChannels.Length; i++ ) + { + AvailableChannels[ i ] = other.AvailableChannels[ i ]; + } + IsFull = other.IsFull; + Usage = other.Usage; + Name = other.Name; + NoInterpolation = other.NoInterpolation; + Sample = other.Sample; + } + + public TemplateInterpElement( TemplateSemantics semantic ) + { + Semantic = semantic; + int semanticId = TemplateHelperFunctions.SemanticToInt[ Semantic ]; + Name = ( semanticId == 0 ) ? TemplateHelperFunctions.BaseInterpolatorName : TemplateHelperFunctions.BaseInterpolatorName + semanticId.ToString(); + } + + public void SetAvailableChannelsFromString( string channels ) + { + for ( int i = 0; i < AvailableChannels.Length; i++ ) + { + AvailableChannels[ i ] = false; + } + Usage = AvailableChannels.Length; + + for ( int i = 0; i < channels.Length; i++ ) + { + switch ( channels[ i ] ) + { + case 'x': if ( !AvailableChannels[ 0 ] ) { AvailableChannels[ 0 ] = true; Usage--; } break; + case 'y': if ( !AvailableChannels[ 1 ] ) { AvailableChannels[ 1 ] = true; Usage--; } break; + case 'z': if ( !AvailableChannels[ 2 ] ) { AvailableChannels[ 2 ] = true; Usage--; } break; + case 'w': if ( !AvailableChannels[ 3 ] ) { AvailableChannels[ 3 ] = true; Usage--; } break; + } + } + } + + public TemplateVertexData RequestChannels( WirePortDataType type, bool isColor, string customName = null ) + { + if ( IsFull ) + return null; + + int channelsRequired = TemplateHelperFunctions.DataTypeChannelUsage[ type ]; + if ( channelsRequired == 0 ) + return null; + + int firstChannel = -1; + for ( int i = 0; i < AvailableChannels.Length; i++ ) + { + if ( AvailableChannels[ i ] ) + { + if ( firstChannel < 0 ) + { + firstChannel = i; + } + channelsRequired -= 1; + if ( channelsRequired == 0 ) + break; + } + } + + //did not found enough channels to fill request + if ( channelsRequired > 0 ) + return null; + + if( Usage == 0 && customName != null ) + { + Name = customName; + } + + Usage += 1; + TemplateVertexData data = null; + + if ( type == WirePortDataType.COLOR || type == WirePortDataType.FLOAT4 ) + { + // Automatically lock all channels + for ( int i = firstChannel; i < ( firstChannel + channelsRequired ); i++ ) + { + AvailableChannels[ i ] = false; + } + IsFull = true; + data = new TemplateVertexData( Semantic, type, Name ); + } + else + { + string[] swizzleArray = ( isColor ) ? TemplateHelperFunctions.ColorSwizzle : TemplateHelperFunctions.VectorSwizzle; + string channels = "."; + int count = firstChannel + TemplateHelperFunctions.DataTypeChannelUsage[ type ]; + for ( int i = firstChannel; i < count; i++ ) + { + AvailableChannels[ i ] = false; + channels += swizzleArray[ i ]; + if ( i == ( AvailableChannels.Length - 1 ) ) + { + IsFull = true; + } + } + + data = new TemplateVertexData( Semantic, type, Name, channels ); + } + return data; + } + } + + [Serializable] + public class TemplateInterpData + { + [SerializeField] + private string m_interpDataId = string.Empty; + + [SerializeField] + private int m_interpDataStartIdx = -1; + + [SerializeField] + private bool m_dynamicMax = false; + + public List AvailableInterpolators = new List(); + public List Interpolators = new List(); + public List RawInterpolators = new List(); + + public TemplateInterpData() { } + + public bool HasRawInterpolatorOfName( string name ) + { + return RawInterpolators.Exists( ( x ) => x.VarName.Equals( name )); + } + + public TemplateInterpData( TemplateInterpData other ) + { + m_dynamicMax = other.DynamicMax; + + foreach ( TemplateInterpElement data in other.AvailableInterpolators ) + { + AvailableInterpolators.Add( new TemplateInterpElement( data ) ); + } + + for ( int i = 0; i < other.Interpolators.Count; i++ ) + { + Interpolators.Add( new TemplateVertexData( other.Interpolators[ i ] ) ); + } + + for( int i = 0; i < other.RawInterpolators.Count; i++ ) + { + RawInterpolators.Add( new TemplateVertexData( other.RawInterpolators[ i ] ) ); + } + } + + + public void RecalculateAvailableInterpolators( int newMax ) + { + if( m_dynamicMax ) + { + if( !TemplateHelperFunctions.IntToSemantic.ContainsKey( ( newMax - 1 ) ) ) + { + Debug.LogWarning( "Attempting to add inexisting available interpolators" ); + return; + } + + if( AvailableInterpolators.Count > 0 ) + { + int currMax = 1 + TemplateHelperFunctions.SemanticToInt[ AvailableInterpolators[ AvailableInterpolators.Count - 1 ].Semantic ]; + if( newMax > currMax ) + { + int count = newMax - currMax; + for( int i = 0; i < count; i++ ) + { + AvailableInterpolators.Add( new TemplateInterpElement( TemplateHelperFunctions.IntToSemantic[ currMax + i ] )); + } + } + else if( newMax < currMax ) + { + int min = TemplateHelperFunctions.SemanticToInt[ AvailableInterpolators[ 0 ].Semantic ]; + if( newMax > min ) + { + int count = currMax - newMax; + for( int i = 0; i < count; i++ ) + { + AvailableInterpolators.RemoveAt( AvailableInterpolators.Count - 1 ); + } + } + } + } + } + } + + public void ReplaceNameOnInterpolator( TemplateSemantics semantic, string newName ) + { + for ( int i = 0; i < AvailableInterpolators.Count; i++ ) + { + if ( AvailableInterpolators[ i ].Semantic == semantic ) + { + AvailableInterpolators[ i ].Name = newName; + break; + } + } + } + + public void Destroy() + { + AvailableInterpolators.Clear(); + AvailableInterpolators = null; + + Interpolators.Clear(); + Interpolators = null; + + RawInterpolators.Clear(); + RawInterpolators = null; + } + + public string InterpDataId { get { return m_interpDataId; } set { m_interpDataId = value; } } + public int InterpDataStartIdx { get { return m_interpDataStartIdx; } set { m_interpDataStartIdx = value; } } + public bool DynamicMax { get { return m_dynamicMax; } set { m_dynamicMax = value; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateInterpData.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateInterpData.cs.meta new file mode 100644 index 0000000..cf31bc9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateInterpData.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8f700ba5366bcda45beea5c0e2db9f3e +timeCreated: 1496053368 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateLocalVarData.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateLocalVarData.cs new file mode 100644 index 0000000..3cde2f0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateLocalVarData.cs @@ -0,0 +1,59 @@ +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class TemplateLocalVarData + { + [SerializeField] + private WirePortDataType m_dataType = WirePortDataType.OBJECT; + + [SerializeField] + private string m_localVarName = string.Empty; + + [SerializeField] + private int m_position = -1; + + [SerializeField] + private bool m_isSpecialVar = false; + + [SerializeField] + private TemplateInfoOnSematics m_specialVarType; + + [SerializeField] + private MasterNodePortCategory m_category; + + [SerializeField] + private string m_id; + + public TemplateLocalVarData( WirePortDataType dataType, MasterNodePortCategory category, string localVarName, int position ) + { + m_dataType = dataType; + m_localVarName = localVarName; + m_position = position; + m_category = category; + //Debug.Log( m_localVarName + " " + m_inputData.PortCategory + " " + m_inputData.PortName ); + } + + public TemplateLocalVarData( TemplateInfoOnSematics specialVarType,string id, WirePortDataType dataType, MasterNodePortCategory category, string localVarName, int position ) + { + m_id = id; + m_dataType = dataType; + m_localVarName = localVarName; + m_position = position; + m_specialVarType = specialVarType; + m_isSpecialVar = true; + m_category = category; + //Debug.Log( m_localVarName + " " + m_inputData.PortCategory + " " + m_inputData.PortName ); + } + + public WirePortDataType DataType { get { return m_dataType; } } + public string LocalVarName { get { return m_localVarName; } } + public int Position { get { return m_position; } } + public bool IsSpecialVar { get { return m_isSpecialVar; } } + public TemplateInfoOnSematics SpecialVarType{ get { return m_specialVarType; } } + public MasterNodePortCategory Category { get { return m_category; } } + public string Id { get { return m_id; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateLocalVarData.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateLocalVarData.cs.meta new file mode 100644 index 0000000..267c352 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateLocalVarData.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4c6ad22d8633c7142ae0237479df76ed +timeCreated: 1518017743 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateLocalVarsNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateLocalVarsNode.cs new file mode 100644 index 0000000..e767678 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateLocalVarsNode.cs @@ -0,0 +1,264 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +using UnityEngine; +using UnityEditor; +using System; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Template Local Var Data", "Surface Data", "Select and use available local variable data from the template" )] + public sealed class TemplateLocalVarsNode : TemplateNodeParent + { + private List m_localVarsData = null; + + [SerializeField] + private int m_currentDataIdx = -1; + + [SerializeField] + private string m_dataName = string.Empty; + + private string[] m_dataLabels = null; + + private bool m_fetchDataId = false; + private UpperLeftWidgetHelper m_upperLeftWidgetHelper = new UpperLeftWidgetHelper(); + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_autoWrapProperties = true; + } + + void FetchDataId() + { + if( m_localVarsData != null && m_localVarsData.Count > 0 ) + { + m_currentDataIdx = 0; + int count = m_localVarsData.Count; + m_dataLabels = new string[ count ]; + for( int i = 0; i < count; i++ ) + { + m_dataLabels[ i ] = m_localVarsData[ i ].LocalVarName; + if( m_localVarsData[ i ].LocalVarName.Equals( m_dataName ) ) + { + m_currentDataIdx = i; + } + } + UpdateFromId(); + } + else + { + m_currentDataIdx = -1; + } + } + + void UpdateFromId() + { + if( m_localVarsData != null ) + { + if( m_localVarsData.Count == 0 ) + { + for( int i = 0; i < 4; i++ ) + m_containerGraph.DeleteConnection( false, UniqueId, i, false, true ); + + m_headerColor = UIUtils.GetColorFromCategory( "Default" ); + m_content.text = "None"; + m_additionalContent.text = string.Empty; + m_outputPorts[ 0 ].ChangeProperties( "None", WirePortDataType.OBJECT, false ); + ConfigurePorts(); + return; + } + + bool areCompatible = TemplateHelperFunctions.CheckIfCompatibles( m_outputPorts[ 0 ].DataType, m_localVarsData[ m_currentDataIdx ].DataType ); + string category = m_localVarsData[ m_currentDataIdx ].Category == MasterNodePortCategory.Fragment ? "Surface Data" : "Vertex Data"; + m_headerColor = UIUtils.GetColorFromCategory( category ); + switch( m_localVarsData[ m_currentDataIdx ].DataType ) + { + default: + case WirePortDataType.INT: + case WirePortDataType.FLOAT: + m_outputPorts[ 0 ].ChangeProperties( Constants.EmptyPortValue, m_localVarsData[ m_currentDataIdx ].DataType, false ); + break; + case WirePortDataType.FLOAT2: + m_outputPorts[ 0 ].ChangeProperties( "XY", m_localVarsData[ m_currentDataIdx ].DataType, false ); + break; + case WirePortDataType.FLOAT3: + m_outputPorts[ 0 ].ChangeProperties( "XYZ", m_localVarsData[ m_currentDataIdx ].DataType, false ); + break; + case WirePortDataType.FLOAT4: + m_outputPorts[ 0 ].ChangeProperties( "XYZW", m_localVarsData[ m_currentDataIdx ].DataType, false ); + break; + case WirePortDataType.COLOR: + m_outputPorts[ 0 ].ChangeProperties( "RGBA", m_localVarsData[ m_currentDataIdx ].DataType, false ); + break; + } + + ConfigurePorts(); + + if( !areCompatible ) + { + m_containerGraph.DeleteConnection( false, UniqueId, 0, false, true ); + } + + m_dataName = m_localVarsData[ m_currentDataIdx ].LocalVarName; + m_content.text = m_dataName; + m_sizeIsDirty = true; + CheckWarningState(); + } + } + + public override void DrawProperties() + { + base.DrawProperties(); + if( m_multiPassMode ) + { + DrawMultipassProperties(); + } + + if( m_currentDataIdx > -1 ) + { + EditorGUI.BeginChangeCheck(); + m_currentDataIdx = EditorGUILayoutPopup( DataLabelStr, m_currentDataIdx, m_dataLabels ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateFromId(); + } + } + } + protected override void OnSubShaderChange() + { + FetchLocalVarData(); + FetchDataId(); + } + + protected override void OnPassChange() + { + base.OnPassChange(); + FetchLocalVarData(); + FetchDataId(); + } + + void DrawMultipassProperties() + { + DrawSubShaderUI(); + DrawPassUI(); + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + if( m_containerGraph.CurrentCanvasMode != NodeAvailability.TemplateShader ) + return; + + if( m_localVarsData == null || m_localVarsData.Count == 0 ) + { + MasterNode masterNode = m_containerGraph.CurrentMasterNode; + if( masterNode.CurrentMasterNodeCategory == AvailableShaderTypes.Template ) + { + FetchLocalVarData( masterNode ); + } + } + + if( m_fetchDataId ) + { + m_fetchDataId = false; + FetchDataId(); + } + + if( m_currentDataIdx > -1 ) + { + EditorGUI.BeginChangeCheck(); + m_currentDataIdx = m_upperLeftWidgetHelper.DrawWidget( this, m_currentDataIdx, m_dataLabels ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateFromId(); + } + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( m_localVarsData[ m_currentDataIdx ].Category != dataCollector.PortCategory ) + { + UIUtils.ShowMessage( UniqueId, string.Format( "Local Var {0} can only work on ports of type {1}", m_localVarsData[ m_currentDataIdx ].LocalVarName, m_localVarsData[ m_currentDataIdx ].Category ) ); + return m_outputPorts[ 0 ].ErrorValue; + } + + if( m_multiPassMode ) + { + if( dataCollector.TemplateDataCollectorInstance.MultipassSubshaderIdx != SubShaderIdx || + dataCollector.TemplateDataCollectorInstance.MultipassPassIdx != PassIdx + ) + { + UIUtils.ShowMessage( UniqueId, string.Format( "{0} is only intended for subshader {1} and pass {2}", m_dataLabels[ m_currentDataIdx ], SubShaderIdx, PassIdx ) ); + return m_outputPorts[ outputId ].ErrorValue; + } + } + + return GetOutputVectorItem( 0, outputId, m_dataName ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_dataName = GetCurrentParam( ref nodeParams ); + m_fetchDataId = true; + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_dataName ); + } + + public override void OnMasterNodeReplaced( MasterNode newMasterNode ) + { + base.OnMasterNodeReplaced( newMasterNode ); + if( newMasterNode.CurrentMasterNodeCategory == AvailableShaderTypes.Template ) + { + FetchLocalVarData( newMasterNode ); + } + else + { + m_localVarsData = null; + m_currentDataIdx = -1; + } + } + + void FetchLocalVarData( MasterNode masterNode = null ) + { + FetchMultiPassTemplate( masterNode ); + if( m_multiPassMode ) + { + if( m_templateMPData != null ) + { + m_localVarsData = m_templateMPData.SubShaders[ SubShaderIdx ].Passes[ PassIdx ].LocalVarsList; + m_fetchDataId = true; + } + } + else + { + TemplateData currentTemplate = ( masterNode as TemplateMasterNode ).CurrentTemplate; + if( currentTemplate != null ) + { + m_localVarsData = currentTemplate.LocalVarsList; + m_fetchDataId = true; + } + else + { + m_localVarsData = null; + m_currentDataIdx = -1; + } + } + } + + public override void Destroy() + { + base.Destroy(); + m_dataLabels = null; + m_localVarsData = null; + m_upperLeftWidgetHelper = null; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateLocalVarsNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateLocalVarsNode.cs.meta new file mode 100644 index 0000000..f7453d9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateLocalVarsNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f708a5bf672ab004a9363a4a71f48f28 +timeCreated: 1518104790 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMasterNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMasterNode.cs new file mode 100644 index 0000000..883368b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMasterNode.cs @@ -0,0 +1,770 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +// THIS FILE IS DEPRECATED AND SHOULD NOT BE USED + +#define SHOW_TEMPLATE_HELP_BOX + +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Template Master Node", "Master", "Shader Generated according to template rules", null, KeyCode.None, false, true, "Template MultiPass Master Node", typeof( TemplateMultiPassMasterNode ) )] + public sealed class TemplateMasterNode : MasterNode + { + private const string WarningMessage = "Templates is a feature that is still heavily under development and users may experience some problems.\nPlease email support@amplify.pt if any issue occurs."; + private const string CurrentTemplateLabel = "Current Template"; + private const string OpenTemplateStr = "Edit Template"; + + //protected const string SnippetsFoldoutStr = " Snippets"; + //[SerializeField] + //private bool m_snippetsFoldout = true; + + [NonSerialized] + private TemplateData m_currentTemplate = null; + + private bool m_fireTemplateChange = false; + private bool m_fetchMasterNodeCategory = false; + private bool m_reRegisterTemplateData = false; + + [SerializeField] + private string m_templateGUID = string.Empty; + + [SerializeField] + private string m_templateName = string.Empty; + + [SerializeField] + private TemplatesBlendModule m_blendOpHelper = new TemplatesBlendModule(); + + [SerializeField] + private TemplateAlphaToMaskModule m_alphaToMaskHelper = new TemplateAlphaToMaskModule(); + + [SerializeField] + private TemplateCullModeModule m_cullModeHelper = new TemplateCullModeModule(); + + [SerializeField] + private TemplateColorMaskModule m_colorMaskHelper = new TemplateColorMaskModule(); + + [SerializeField] + private TemplatesStencilBufferModule m_stencilBufferHelper = new TemplatesStencilBufferModule(); + + [SerializeField] + private TemplateDepthModule m_depthOphelper = new TemplateDepthModule(); + + [SerializeField] + private TemplateTagsModule m_tagsHelper = new TemplateTagsModule(); + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_masterNodeCategory = 1;// First Template + m_marginPreviewLeft = 20; + m_insideSize.y = 60; + m_customPrecision = true; + } + + public override void ReleaseResources() + { + if( m_currentTemplate != null && m_currentTemplate.AvailableShaderProperties != null ) + { + // Unregister old template properties + int oldPropertyCount = m_currentTemplate.AvailableShaderProperties.Count; + for( int i = 0; i < oldPropertyCount; i++ ) + { + UIUtils.ReleaseUniformName( UniqueId, m_currentTemplate.AvailableShaderProperties[ i ].PropertyName ); + } + } + } + + public override void OnEnable() + { + base.OnEnable(); + m_reRegisterTemplateData = true; + } + + void FetchInfoFromTemplate() + { + if( m_currentTemplate.BlendData.DataCheck == TemplateDataCheck.Valid ) + m_blendOpHelper.ConfigureFromTemplateData( m_currentTemplate.BlendData ); + + if( m_currentTemplate.AlphaToMaskData.DataCheck == TemplateDataCheck.Valid ) + m_alphaToMaskHelper.ConfigureFromTemplateData( m_currentTemplate.AlphaToMaskData ); + + if( m_currentTemplate.CullModeData.DataCheck == TemplateDataCheck.Valid ) + m_cullModeHelper.ConfigureFromTemplateData( m_currentTemplate.CullModeData ); + + if( m_currentTemplate.ColorMaskData.DataCheck == TemplateDataCheck.Valid ) + m_colorMaskHelper.ConfigureFromTemplateData( m_currentTemplate.ColorMaskData ); + + if( m_currentTemplate.StencilData.DataCheck == TemplateDataCheck.Valid ) + m_stencilBufferHelper.ConfigureFromTemplateData( m_currentTemplate.StencilData ); + + if( m_currentTemplate.DepthData.DataCheck == TemplateDataCheck.Valid ) + m_depthOphelper.ConfigureFromTemplateData( m_currentTemplate.DepthData ); + + if( m_currentTemplate.TagData.DataCheck == TemplateDataCheck.Valid ) + m_tagsHelper.ConfigureFromTemplateData( m_currentTemplate.TagData ); + } + + void FetchCurrentTemplate() + { + m_currentTemplate = m_containerGraph.ParentWindow.TemplatesManagerInstance.GetTemplate( m_templateGUID ) as TemplateData; + if( m_currentTemplate == null ) + { + m_currentTemplate = m_containerGraph.ParentWindow.TemplatesManagerInstance.GetTemplate( m_templateName ) as TemplateData; + } + + if( m_currentTemplate != null ) + { + if( m_inputPorts.Count != m_currentTemplate.InputDataList.Count ) + { + DeleteAllInputConnections( true ); + + List inputDataList = m_currentTemplate.InputDataList; + int count = inputDataList.Count; + for( int i = 0; i < count; i++ ) + { + AddInputPort( inputDataList[ i ].DataType, false, inputDataList[ i ].PortName, inputDataList[ i ].OrderId, inputDataList[ i ].PortCategory, inputDataList[ i ].PortUniqueId ); + } + FetchInfoFromTemplate(); + } + else + { + List inputDataList = m_currentTemplate.InputDataList; + int count = inputDataList.Count; + for( int i = 0; i < count; i++ ) + { + m_inputPorts[ i ].ChangeProperties( inputDataList[ i ].PortName, inputDataList[ i ].DataType, false ); + } + } + } + } + + public override void RefreshAvailableCategories() + { + FetchCurrentTemplate(); + + int templateCount = m_containerGraph.ParentWindow.TemplatesManagerInstance.TemplateCount; + m_availableCategories = new MasterNodeCategoriesData[ templateCount + 1 ]; + m_availableCategoryLabels = new GUIContent[ templateCount + 1 ]; + + m_availableCategories[ 0 ] = new MasterNodeCategoriesData( AvailableShaderTypes.SurfaceShader, string.Empty ); + m_availableCategoryLabels[ 0 ] = new GUIContent( "Surface" ); + if( m_currentTemplate == null ) + { + m_masterNodeCategory = -1; + } + + for( int i = 0; i < templateCount; i++ ) + { + int idx = i + 1; + TemplateData templateData = m_containerGraph.ParentWindow.TemplatesManagerInstance.GetTemplate( i ) as TemplateData; + + if( m_currentTemplate != null && m_currentTemplate.GUID.Equals( templateData.GUID ) ) + m_masterNodeCategory = idx; + + m_availableCategories[ idx ] = new MasterNodeCategoriesData( AvailableShaderTypes.Template, templateData.GUID ); + m_availableCategoryLabels[ idx ] = new GUIContent( templateData.Name ); + } + } + + void SetCategoryIdxFromTemplate() + { + int templateCount = m_containerGraph.ParentWindow.TemplatesManagerInstance.TemplateCount; + for( int i = 0; i < templateCount; i++ ) + { + int idx = i + 1; + TemplateData templateData = m_containerGraph.ParentWindow.TemplatesManagerInstance.GetTemplate( i ) as TemplateData; + if( templateData != null && m_currentTemplate != null && m_currentTemplate.GUID.Equals( templateData.GUID ) ) + m_masterNodeCategory = idx; + } + } + + public void SetTemplate( TemplateData newTemplate, bool writeDefaultData, bool fetchMasterNodeCategory ) + { + ReleaseResources(); + + if( newTemplate == null || newTemplate.InputDataList == null ) + return; + + m_fetchMasterNodeCategory = fetchMasterNodeCategory; + + DeleteAllInputConnections( true ); + m_currentTemplate = newTemplate; + m_currentShaderData = newTemplate.Name; + + List inputDataList = newTemplate.InputDataList; + int count = inputDataList.Count; + for( int i = 0; i < count; i++ ) + { + AddInputPort( inputDataList[ i ].DataType, false, inputDataList[ i ].PortName, inputDataList[ i ].OrderId, inputDataList[ i ].PortCategory, inputDataList[ i ].PortUniqueId ); + } + + if( writeDefaultData ) + { + ShaderName = newTemplate.DefaultShaderName; + } + + RegisterProperties(); + m_fireTemplateChange = true; + m_templateGUID = newTemplate.GUID; + m_templateName = newTemplate.DefaultShaderName; + FetchInfoFromTemplate(); + } + + void RegisterProperties() + { + if( m_currentTemplate != null ) + { + m_reRegisterTemplateData = false; + // Register old template properties + int newPropertyCount = m_currentTemplate.AvailableShaderProperties.Count; + for( int i = 0; i < newPropertyCount; i++ ) + { + int nodeId = UIUtils.CheckUniformNameOwner( m_currentTemplate.AvailableShaderProperties[ i ].PropertyName ); + if( nodeId > -1 ) + { + ParentNode node = m_containerGraph.GetNode( nodeId ); + if( node != null ) + { + UIUtils.ShowMessage( string.Format( "Template requires property name {0} which is currently being used by {1}. Please rename it and reload template.", m_currentTemplate.AvailableShaderProperties[ i ].PropertyName, node.Attributes.Name ) ); + } + else + { + UIUtils.ShowMessage( string.Format( "Template requires property name {0} which is currently being on your graph. Please rename it and reload template.", m_currentTemplate.AvailableShaderProperties[ i ].PropertyName ) ); + } + } + else + { + UIUtils.RegisterUniformName( UniqueId, m_currentTemplate.AvailableShaderProperties[ i ].PropertyName ); + } + } + } + } + + public override void DrawProperties() + { + if( m_currentTemplate == null ) + return; + + base.DrawProperties(); + + bool generalIsVisible = ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedGeneralShaderOptions; + NodeUtils.DrawPropertyGroup( ref generalIsVisible, GeneralFoldoutStr, DrawGeneralOptions ); + ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedGeneralShaderOptions = generalIsVisible; + + if( m_currentTemplate.AlphaToMaskData.DataCheck == TemplateDataCheck.Valid ) + m_alphaToMaskHelper.Draw( this ); + + if( m_currentTemplate.BlendData.DataCheck == TemplateDataCheck.Valid ) + m_blendOpHelper.Draw( this ); + + + if( m_currentTemplate.StencilData.DataCheck == TemplateDataCheck.Valid ) + { + CullMode cullMode = ( m_currentTemplate.CullModeData.DataCheck == TemplateDataCheck.Valid ) ? m_cullModeHelper.CurrentCullMode : CullMode.Back; + m_stencilBufferHelper.Draw( this, cullMode ); + } + + if( m_currentTemplate.DepthData.DataCheck == TemplateDataCheck.Valid ) + m_depthOphelper.Draw( this ); + + if( m_currentTemplate.TagData.DataCheck == TemplateDataCheck.Valid ) + m_tagsHelper.Draw( this ); + + DrawMaterialInputs( UIUtils.MenuItemToolbarStyle ); + + // NodeUtils.DrawPropertyGroup( ref m_snippetsFoldout, SnippetsFoldoutStr, DrawSnippetOptions ); + if( GUILayout.Button( OpenTemplateStr ) && m_currentTemplate != null ) + { + try + { + string pathname = AssetDatabase.GUIDToAssetPath( m_currentTemplate.GUID ); + if( !string.IsNullOrEmpty( pathname ) ) + { + Shader selectedTemplate = AssetDatabase.LoadAssetAtPath( pathname ); + if( selectedTemplate != null ) + { + AssetDatabase.OpenAsset( selectedTemplate, 1 ); + } + } + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + +#if SHOW_TEMPLATE_HELP_BOX + EditorGUILayout.HelpBox( WarningMessage, MessageType.Warning ); +#endif + + } + + public void DrawGeneralOptions() + { + DrawShaderName(); + DrawCurrentShaderType(); + EditorGUI.BeginChangeCheck(); + DrawPrecisionProperty( false ); + if( EditorGUI.EndChangeCheck() ) + ContainerGraph.CurrentPrecision = m_currentPrecisionType; + + DrawSamplingMacros(); + + if( m_currentTemplate.CullModeData.DataCheck == TemplateDataCheck.Valid ) + m_cullModeHelper.Draw( this ); + + if( m_currentTemplate.ColorMaskData.DataCheck == TemplateDataCheck.Valid ) + m_colorMaskHelper.Draw( this ); + } + + //public void DrawSnippetOptions() + //{ + // m_currentTemplate.DrawSnippetProperties( this ); + //} + + bool CreateInstructionsForList( ref List ports, ref string shaderBody, ref List vertexInstructions, ref List fragmentInstructions ) + { + if( ports.Count == 0 ) + return true; + + bool isValid = true; + UIUtils.CurrentWindow.CurrentGraph.ResetNodesLocalVariables(); + for( int i = 0; i < ports.Count; i++ ) + { + TemplateInputData inputData = m_currentTemplate.InputDataFromId( ports[ i ].PortId ); + if( ports[ i ].IsConnected ) + { + m_currentDataCollector.ResetInstructions(); + m_currentDataCollector.ResetVertexInstructions(); + + m_currentDataCollector.PortCategory = ports[ i ].Category; + string newPortInstruction = ports[ i ].GeneratePortInstructions( ref m_currentDataCollector ); + + + if( m_currentDataCollector.DirtySpecialLocalVariables ) + { + string cleanVariables = m_currentDataCollector.SpecialLocalVariables.Replace( "\t", string.Empty ); + m_currentDataCollector.AddInstructions( cleanVariables, false ); + m_currentDataCollector.ClearSpecialLocalVariables(); + } + + if( m_currentDataCollector.DirtyVertexVariables ) + { + string cleanVariables = m_currentDataCollector.VertexLocalVariables.Replace( "\t", string.Empty ); + m_currentDataCollector.AddVertexInstruction( cleanVariables, UniqueId, false ); + m_currentDataCollector.ClearVertexLocalVariables(); + } + + // fill functions + for( int j = 0; j < m_currentDataCollector.InstructionsList.Count; j++ ) + { + fragmentInstructions.Add( m_currentDataCollector.InstructionsList[ j ].PropertyName ); + } + + for( int j = 0; j < m_currentDataCollector.VertexDataList.Count; j++ ) + { + vertexInstructions.Add( m_currentDataCollector.VertexDataList[ j ].PropertyName ); + } + + isValid = m_currentTemplate.FillTemplateBody( inputData.TagId, ref shaderBody, newPortInstruction ) && isValid; + } + else + { + isValid = m_currentTemplate.FillTemplateBody( inputData.TagId, ref shaderBody, inputData.DefaultValue ) && isValid; + } + } + return isValid; + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + if( m_currentTemplate == null ) + { + FetchCurrentTemplate(); + } + + if( m_reRegisterTemplateData ) + { + RegisterProperties(); + } + + if( m_containerGraph.IsInstancedShader ) + { + DrawInstancedIcon( drawInfo ); + } + + if( m_fetchMasterNodeCategory ) + { + if( m_availableCategories != null ) + { + m_fetchMasterNodeCategory = false; + SetCategoryIdxFromTemplate(); + } + } + + if( m_fireTemplateChange ) + { + m_fireTemplateChange = false; + m_containerGraph.FireMasterNodeReplacedEvent(); + } + } + + public override void UpdateFromShader( Shader newShader ) + { + if( m_currentMaterial != null ) + { + m_currentMaterial.shader = newShader; + } + CurrentShader = newShader; + } + + public override void UpdateMasterNodeMaterial( Material material ) + { + m_currentMaterial = material; + FireMaterialChangedEvt(); + } + + public override Shader Execute( string pathname, bool isFullPath ) + { + if( m_currentTemplate == null ) + return m_currentShader; + + //Create data collector + ForceReordering(); + base.Execute( pathname, isFullPath ); + + SetupNodeCategories(); + + m_currentDataCollector.TemplateDataCollectorInstance.BuildFromTemplateData( m_currentDataCollector, m_currentTemplate ); + int shaderPropertiesAmount = m_currentTemplate.AvailableShaderProperties.Count; + for( int i = 0; i < shaderPropertiesAmount; i++ ) + { + m_currentDataCollector.SoftRegisterUniform( m_currentTemplate.AvailableShaderProperties[ i ] ); + } + m_containerGraph.CheckPropertiesAutoRegister( ref m_currentDataCollector ); + + //Sort ports by both + List fragmentPorts = new List(); + List vertexPorts = new List(); + SortInputPorts( ref vertexPorts, ref fragmentPorts ); + + string shaderBody = m_currentTemplate.TemplateBody; + + List vertexInstructions = new List(); + List fragmentInstructions = new List(); + + bool validBody = true; + + validBody = CreateInstructionsForList( ref fragmentPorts, ref shaderBody, ref vertexInstructions, ref fragmentInstructions ) && validBody; + ContainerGraph.ResetNodesLocalVariablesIfNot( MasterNodePortCategory.Vertex ); + validBody = CreateInstructionsForList( ref vertexPorts, ref shaderBody, ref vertexInstructions, ref fragmentInstructions ) && validBody; + + m_currentTemplate.ResetTemplateUsageData(); + + // Fill vertex interpolators assignment + for( int i = 0; i < m_currentDataCollector.VertexInterpDeclList.Count; i++ ) + { + vertexInstructions.Add( m_currentDataCollector.VertexInterpDeclList[ i ] ); + } + + vertexInstructions.AddRange( m_currentDataCollector.TemplateDataCollectorInstance.GetInterpUnusedChannels() ); + //Fill common local variables and operations + + validBody = m_currentTemplate.FillVertexInstructions( ref shaderBody, vertexInstructions.ToArray() ) && validBody; + validBody = m_currentTemplate.FillFragmentInstructions( ref shaderBody, fragmentInstructions.ToArray() ) && validBody; + + // Add Instanced Properties + if( m_containerGraph.IsInstancedShader ) + { + m_currentDataCollector.TabifyInstancedVars(); + m_currentDataCollector.InstancedPropertiesList.Insert( 0, new PropertyDataCollector( -1, string.Format( IOUtils.InstancedPropertiesBegin, UIUtils.RemoveInvalidCharacters( m_shaderName ) ) ) ); + m_currentDataCollector.InstancedPropertiesList.Add( new PropertyDataCollector( -1, IOUtils.InstancedPropertiesEnd ) ); + m_currentDataCollector.UniformsList.AddRange( m_currentDataCollector.InstancedPropertiesList ); + } + + //Add Functions + m_currentDataCollector.UniformsList.AddRange( m_currentDataCollector.FunctionsList ); + + // Fill common tags + m_currentDataCollector.IncludesList.AddRange( m_currentDataCollector.PragmasList ); + + validBody = m_currentTemplate.FillTemplateBody( m_currentTemplate.ShaderNameId, ref shaderBody, string.Format( TemplatesManager.NameFormatter, m_shaderName ) ) && validBody; + validBody = m_currentTemplate.FillTemplateBody( TemplatesManager.TemplatePassTag, ref shaderBody, m_currentDataCollector.GrabPassList ) && validBody; + validBody = m_currentTemplate.FillTemplateBody( TemplatesManager.TemplatePragmaTag, ref shaderBody, m_currentDataCollector.IncludesList ) && validBody; + //validBody = m_currentTemplate.FillTemplateBody( TemplatesManager.TemplateTagsTag, ref shaderBody, m_currentDataCollector.TagsList ) && validBody; + validBody = m_currentTemplate.FillTemplateBody( TemplatesManager.TemplatePropertyTag, ref shaderBody, m_currentDataCollector.BuildUnformatedPropertiesStringArr() ) && validBody; + validBody = m_currentTemplate.FillTemplateBody( TemplatesManager.TemplateGlobalsTag, ref shaderBody, m_currentDataCollector.UniformsList ) && validBody; + validBody = m_currentTemplate.FillTemplateBody( m_currentTemplate.VertexDataId, ref shaderBody, m_currentDataCollector.VertexInputList.ToArray() ) && validBody; + validBody = m_currentTemplate.FillTemplateBody( m_currentTemplate.InterpDataId, ref shaderBody, m_currentDataCollector.InterpolatorList.ToArray() ) && validBody; + + if( m_currentTemplate.BlendData.ValidBlendMode ) + { + validBody = m_currentTemplate.FillTemplateBody( m_currentTemplate.BlendData.BlendModeId, ref shaderBody, m_blendOpHelper.CurrentBlendFactor ) && validBody; + } + + if( m_currentTemplate.BlendData.ValidBlendOp ) + { + validBody = m_currentTemplate.FillTemplateBody( m_currentTemplate.BlendData.BlendOpId, ref shaderBody, m_blendOpHelper.CurrentBlendOp ) && validBody; + } + + if( m_currentTemplate.AlphaToMaskData.DataCheck == TemplateDataCheck.Valid ) + { + validBody = m_currentTemplate.FillTemplateBody( m_currentTemplate.AlphaToMaskData.AlphaToMaskId, ref shaderBody, m_alphaToMaskHelper.GenerateShaderData( false ) ) && validBody; + } + + if( m_currentTemplate.DepthData.ValidZWrite ) + { + validBody = m_currentTemplate.FillTemplateBody( m_currentTemplate.DepthData.ZWriteModeId, ref shaderBody, m_depthOphelper.CurrentZWriteMode ) && validBody; + } + + if( m_currentTemplate.DepthData.ValidZTest ) + { + validBody = m_currentTemplate.FillTemplateBody( m_currentTemplate.DepthData.ZTestModeId, ref shaderBody, m_depthOphelper.CurrentZTestMode ) && validBody; + } + + if( m_currentTemplate.DepthData.ValidOffset ) + { + validBody = m_currentTemplate.FillTemplateBody( m_currentTemplate.DepthData.OffsetId, ref shaderBody, m_depthOphelper.CurrentOffset ) && validBody; + } + + if( m_currentTemplate.CullModeData.DataCheck == TemplateDataCheck.Valid ) + { + validBody = m_currentTemplate.FillTemplateBody( m_currentTemplate.CullModeData.CullModeId, ref shaderBody, m_cullModeHelper.GenerateShaderData(false) ) && validBody; + } + + if( m_currentTemplate.ColorMaskData.DataCheck == TemplateDataCheck.Valid ) + { + validBody = m_currentTemplate.FillTemplateBody( m_currentTemplate.ColorMaskData.ColorMaskId, ref shaderBody, m_colorMaskHelper.GenerateShaderData( false ) ) && validBody; + } + + if( m_currentTemplate.StencilData.DataCheck == TemplateDataCheck.Valid ) + { + CullMode cullMode = ( m_currentTemplate.CullModeData.DataCheck == TemplateDataCheck.Valid ) ? m_cullModeHelper.CurrentCullMode : CullMode.Back; + validBody = m_currentTemplate.FillTemplateBody( m_currentTemplate.StencilData.StencilBufferId, ref shaderBody, m_stencilBufferHelper.CreateStencilOp( cullMode ) ) && validBody; + } + + if( m_currentTemplate.TagData.DataCheck == TemplateDataCheck.Valid ) + { + validBody = m_currentTemplate.FillTemplateBody( m_currentTemplate.TagData.TagsId, ref shaderBody, m_tagsHelper.GenerateTags() ) && validBody; + } + + if( m_currentDataCollector.TemplateDataCollectorInstance.HasVertexInputParams ) + { + validBody = m_currentTemplate.FillTemplateBody( TemplatesManager.TemplateInputsVertParamsTag, ref shaderBody, m_currentDataCollector.TemplateDataCollectorInstance.VertexInputParamsStr ) && validBody; + } + + if( m_currentDataCollector.TemplateDataCollectorInstance.HasFragmentInputParams ) + { + validBody = m_currentTemplate.FillTemplateBody( TemplatesManager.TemplateInputsFragParamsTag, ref shaderBody, m_currentDataCollector.TemplateDataCollectorInstance.FragInputParamsStr ) && validBody; + } + + m_currentTemplate.FillEmptyTags( ref shaderBody ); + + //m_currentTemplate.InsertSnippets( ref shaderBody ); + + vertexInstructions.Clear(); + vertexInstructions = null; + + fragmentInstructions.Clear(); + fragmentInstructions = null; + if( validBody ) + { + UpdateShaderAsset( ref pathname, ref shaderBody, isFullPath ); + } + + return m_currentShader; + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + try + { + ShaderName = GetCurrentParam( ref nodeParams ); + if( m_shaderName.Length > 0 ) + ShaderName = UIUtils.RemoveShaderInvalidCharacters( ShaderName ); + + string templateGUID = GetCurrentParam( ref nodeParams ); + string templateShaderName = string.Empty; + if( UIUtils.CurrentShaderVersion() > 13601 ) + { + templateShaderName = GetCurrentParam( ref nodeParams ); + } + + TemplateData template = m_containerGraph.ParentWindow.TemplatesManagerInstance.GetTemplate( templateGUID ) as TemplateData; + if( template != null ) + { + SetTemplate( template, false, true ); + } + else + { + template = m_containerGraph.ParentWindow.TemplatesManagerInstance.GetTemplateByName( templateShaderName ) as TemplateData; + if( template != null ) + { + SetTemplate( template, false, true ); + } + else + { + m_masterNodeCategory = -1; + } + } + + if( UIUtils.CurrentShaderVersion() > 13902 ) + { + //BLEND MODULE + if( m_currentTemplate.BlendData.ValidBlendMode ) + { + m_blendOpHelper.ReadBlendModeFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( m_currentTemplate.BlendData.ValidBlendOp ) + { + m_blendOpHelper.ReadBlendOpFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + //CULL MODE + if( m_currentTemplate.CullModeData.DataCheck == TemplateDataCheck.Valid ) + { + m_cullModeHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + //COLOR MASK + if( m_currentTemplate.ColorMaskData.DataCheck == TemplateDataCheck.Valid ) + { + m_colorMaskHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + //STENCIL BUFFER + if( m_currentTemplate.StencilData.DataCheck == TemplateDataCheck.Valid ) + { + m_stencilBufferHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + } + + if( UIUtils.CurrentShaderVersion() > 14202 ) + { + //DEPTH OPTIONS + if( m_currentTemplate.DepthData.ValidZWrite ) + { + m_depthOphelper.ReadZWriteFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( m_currentTemplate.DepthData.ValidZTest ) + { + m_depthOphelper.ReadZTestFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( m_currentTemplate.DepthData.ValidOffset ) + { + m_depthOphelper.ReadOffsetFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + } + + //TAGS + if( UIUtils.CurrentShaderVersion() > 14301 ) + { + if( m_currentTemplate.TagData.DataCheck == TemplateDataCheck.Valid ) + m_tagsHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( UIUtils.CurrentShaderVersion() > 18302 ) + SamplingMacros = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + else + SamplingMacros = false; + } + catch( Exception e ) + { + Debug.LogException( e, this ); + } + m_containerGraph.CurrentCanvasMode = NodeAvailability.TemplateShader; + m_containerGraph.CurrentPrecision = m_currentPrecisionType; + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_shaderName ); + IOUtils.AddFieldValueToString( ref nodeInfo, ( m_currentTemplate != null ) ? m_currentTemplate.GUID : string.Empty ); + IOUtils.AddFieldValueToString( ref nodeInfo, ( m_currentTemplate != null ) ? m_currentTemplate.DefaultShaderName : string.Empty ); + + //BLEND MODULE + if( m_currentTemplate.BlendData.ValidBlendMode ) + { + m_blendOpHelper.WriteBlendModeToString( ref nodeInfo ); + } + + if( m_currentTemplate.BlendData.ValidBlendOp ) + { + m_blendOpHelper.WriteBlendOpToString( ref nodeInfo ); + } + + //CULL MODULE + if( m_currentTemplate.CullModeData.DataCheck == TemplateDataCheck.Valid ) + { + m_cullModeHelper.WriteToString( ref nodeInfo ); + } + + //COLOR MASK MODULE + if( m_currentTemplate.ColorMaskData.DataCheck == TemplateDataCheck.Valid ) + { + m_colorMaskHelper.WriteToString( ref nodeInfo ); + } + + //STENCIL BUFFER MODULE + if( m_currentTemplate.StencilData.DataCheck == TemplateDataCheck.Valid ) + { + m_stencilBufferHelper.WriteToString( ref nodeInfo ); + } + + //DEPTH MODULE + if( m_currentTemplate.DepthData.ValidZWrite ) + { + m_depthOphelper.WriteZWriteToString( ref nodeInfo ); + } + + if( m_currentTemplate.DepthData.ValidZTest ) + { + m_depthOphelper.WriteZTestToString( ref nodeInfo ); + } + + if( m_currentTemplate.DepthData.ValidOffset ) + { + m_depthOphelper.WriteOffsetToString( ref nodeInfo ); + } + + //TAGS + if( m_currentTemplate.TagData.DataCheck == TemplateDataCheck.Valid ) + { + m_tagsHelper.WriteToString( ref nodeInfo ); + } + + IOUtils.AddFieldValueToString( ref nodeInfo, m_samplingMacros ); + } + + public override void Destroy() + { + base.Destroy(); + m_currentTemplate = null; + m_blendOpHelper = null; + m_alphaToMaskHelper = null; + m_cullModeHelper = null; + m_colorMaskHelper.Destroy(); + m_colorMaskHelper = null; + m_stencilBufferHelper.Destroy(); + m_stencilBufferHelper = null; + m_tagsHelper.Destroy(); + m_tagsHelper = null; + + } + + public TemplateData CurrentTemplate { get { return m_currentTemplate; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMasterNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMasterNode.cs.meta new file mode 100644 index 0000000..b17058f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMasterNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8bbd856408a816448a2686501df37397 +timeCreated: 1493905112 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMenuItems.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMenuItems.cs new file mode 100644 index 0000000..ec2cefb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMenuItems.cs @@ -0,0 +1,55 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +using UnityEditor; + +namespace AmplifyShaderEditor +{ + public class TemplateMenuItems + { + [MenuItem( "Assets/Create/Amplify Shader/Legacy/Unlit", false, 85 )] + public static void ApplyTemplateLegacyUnlit() + { + AmplifyShaderEditorWindow.CreateConfirmationTemplateShader( "0770190933193b94aaa3065e307002fa" ); + } + [MenuItem( "Assets/Create/Amplify Shader/Legacy/Post Process", false, 85 )] + public static void ApplyTemplateLegacyPostProcess() + { + AmplifyShaderEditorWindow.CreateConfirmationTemplateShader( "c71b220b631b6344493ea3cf87110c93" ); + } + [MenuItem( "Assets/Create/Amplify Shader/Deprecated/Legacy/Default Unlit", false, 85 )] + public static void ApplyTemplateDeprecatedLegacyDefaultUnlit() + { + AmplifyShaderEditorWindow.CreateConfirmationTemplateShader( "6e114a916ca3e4b4bb51972669d463bf" ); + } + [MenuItem( "Assets/Create/Amplify Shader/Legacy/Default UI", false, 85 )] + public static void ApplyTemplateLegacyDefaultUI() + { + AmplifyShaderEditorWindow.CreateConfirmationTemplateShader( "5056123faa0c79b47ab6ad7e8bf059a4" ); + } + [MenuItem( "Assets/Create/Amplify Shader/Legacy/Unlit Lightmap", false, 85 )] + public static void ApplyTemplateLegacyUnlitLightmap() + { + AmplifyShaderEditorWindow.CreateConfirmationTemplateShader( "899e609c083c74c4ca567477c39edef0" ); + } + [MenuItem( "Assets/Create/Amplify Shader/Legacy/Default Sprites", false, 85 )] + public static void ApplyTemplateLegacyDefaultSprites() + { + AmplifyShaderEditorWindow.CreateConfirmationTemplateShader( "0f8ba0101102bb14ebf021ddadce9b49" ); + } + [MenuItem( "Assets/Create/Amplify Shader/Legacy/Particles Alpha Blended", false, 85 )] + public static void ApplyTemplateLegacyParticlesAlphaBlended() + { + AmplifyShaderEditorWindow.CreateConfirmationTemplateShader( "0b6a9f8b4f707c74ca64c0be8e590de0" ); + } + [MenuItem( "Assets/Create/Amplify Shader/Legacy/Multi Pass Unlit", false, 85 )] + public static void ApplyTemplateLegacyMultiPassUnlit() + { + AmplifyShaderEditorWindow.CreateConfirmationTemplateShader( "e1de45c0d41f68c41b2cc20c8b9c05ef" ); + } + [MenuItem( "Assets/Create/Amplify Shader/Legacy/Lit", false, 85 )] + public static void ApplyTemplateLegacyLit() + { + AmplifyShaderEditorWindow.CreateConfirmationTemplateShader( "ed95fe726fd7b4644bb42f4d1ddd2bcd" ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMenuItems.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMenuItems.cs.meta new file mode 100644 index 0000000..69a390b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMenuItems.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: da0b931bd234a1e43b65f684d4b59bfb +timeCreated: 1496736284 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateModuleHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateModuleHelper.cs new file mode 100644 index 0000000..f3b7ba9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateModuleHelper.cs @@ -0,0 +1,755 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + + [Serializable] + public class TemplateModulesHelper + { + [SerializeField] + internal bool Foldout = false; + + private bool m_isDirty = false; + + [SerializeField] + private TemplatesBlendModule m_blendOpHelper = new TemplatesBlendModule(); + + [SerializeField] + private TemplatesBlendModule m_blendOpHelper1 = new TemplatesBlendModule(); + + [SerializeField] + private TemplatesBlendModule m_blendOpHelper2 = new TemplatesBlendModule(); + + [SerializeField] + private TemplatesBlendModule m_blendOpHelper3 = new TemplatesBlendModule(); + + [SerializeField] + private TemplateAlphaToMaskModule m_alphaToMaskHelper = new TemplateAlphaToMaskModule(); + + [SerializeField] + private TemplateCullModeModule m_cullModeHelper = new TemplateCullModeModule(); + + [SerializeField] + private TemplateColorMaskModule m_colorMaskHelper = new TemplateColorMaskModule(); + + [SerializeField] + private TemplateColorMaskModule m_colorMaskHelper1 = new TemplateColorMaskModule(); + + [SerializeField] + private TemplateColorMaskModule m_colorMaskHelper2 = new TemplateColorMaskModule(); + + [SerializeField] + private TemplateColorMaskModule m_colorMaskHelper3 = new TemplateColorMaskModule(); + + [SerializeField] + private TemplatesStencilBufferModule m_stencilBufferHelper = new TemplatesStencilBufferModule(); + + [SerializeField] + private TemplateDepthModule m_depthOphelper = new TemplateDepthModule(); + + [SerializeField] + private TemplateTagsModule m_tagsHelper = new TemplateTagsModule(); + + [SerializeField] + private TemplateShaderModelModule m_shaderModelHelper = new TemplateShaderModelModule(); + + [SerializeField] + private TemplateAdditionalIncludesHelper m_additionalIncludes = new TemplateAdditionalIncludesHelper(); + + [SerializeField] + private TemplateAdditionalDefinesHelper m_additionalDefines = new TemplateAdditionalDefinesHelper(); + + [SerializeField] + private TemplateAdditionalPragmasHelper m_additionalPragmas = new TemplateAdditionalPragmasHelper(); + + [SerializeField] + private TemplateAdditionalDirectivesHelper m_additionalDirectives = new TemplateAdditionalDirectivesHelper(" Additional Directives"); + + [SerializeField] + private bool m_hasValidData = false; + + [SerializeField] + private bool m_allModulesMode = false; + + public void CopyFrom( TemplateModulesHelper other ) + { + m_allModulesMode = other.AllModulesMode; + + if( other.BlendOpHelper.IsDirty ) + { + m_blendOpHelper.CopyFrom( other.BlendOpHelper, true ); + } + + if( other.BlendOpHelper1.IsDirty ) + { + m_blendOpHelper1.CopyFrom( other.BlendOpHelper1, true ); + } + + if( other.BlendOpHelper2.IsDirty ) + { + m_blendOpHelper2.CopyFrom( other.BlendOpHelper2, true ); + } + + if( other.BlendOpHelper3.IsDirty ) + { + m_blendOpHelper3.CopyFrom( other.BlendOpHelper3, true ); + } + + if( other.AlphaToMaskHelper.IsDirty ) + { + m_alphaToMaskHelper.CopyFrom( other.AlphaToMaskHelper, true ); + } + + if( other.CullModeHelper.IsDirty ) + { + m_cullModeHelper.CopyFrom( other.CullModeHelper , true ); + } + + if( other.ColorMaskHelper.IsDirty ) + { + m_colorMaskHelper.CopyFrom( other.ColorMaskHelper , true); + } + + if( other.ColorMaskHelper1.IsDirty ) + { + m_colorMaskHelper1.CopyFrom( other.ColorMaskHelper1, true ); + } + + if( other.ColorMaskHelper2.IsDirty ) + { + m_colorMaskHelper2.CopyFrom( other.ColorMaskHelper2, true ); + } + + if( other.ColorMaskHelper3.IsDirty ) + { + m_colorMaskHelper3.CopyFrom( other.ColorMaskHelper3, true ); + } + + if( other.StencilBufferHelper.IsDirty ) + { + m_stencilBufferHelper.CopyFrom( other.StencilBufferHelper,true ); + } + + if( other.DepthOphelper.IsDirty ) + { + m_depthOphelper.CopyFrom( other.DepthOphelper,true ); + } + + if( other.TagsHelper.IsDirty ) + { + m_tagsHelper.CopyFrom( other.TagsHelper ); + } + + if( other.ShaderModelHelper.IsDirty ) + { + m_shaderModelHelper.CopyFrom( other.ShaderModelHelper, true ); + } + } + + public void SyncWith( TemplateModulesHelper other ) + { + + if( m_blendOpHelper.ValidData && other.BlendOpHelper.ValidData ) + { + m_blendOpHelper.CopyFrom( other.BlendOpHelper, false ); + } + + if( m_blendOpHelper1.ValidData && other.BlendOpHelper1.ValidData ) + { + m_blendOpHelper1.CopyFrom( other.BlendOpHelper1, false ); + } + + if( m_blendOpHelper2.ValidData && other.BlendOpHelper2.ValidData ) + { + m_blendOpHelper2.CopyFrom( other.BlendOpHelper2, false ); + } + + if( m_blendOpHelper3.ValidData && other.BlendOpHelper3.ValidData ) + { + m_blendOpHelper3.CopyFrom( other.BlendOpHelper3, false ); + } + + if( m_alphaToMaskHelper.ValidData && other.AlphaToMaskHelper.ValidData ) + { + m_alphaToMaskHelper.CopyFrom( other.AlphaToMaskHelper, false ); + } + + if( m_cullModeHelper.ValidData && other.CullModeHelper.ValidData ) + { + m_cullModeHelper.CopyFrom( other.CullModeHelper, false ); + } + + if( m_colorMaskHelper.ValidData && other.ColorMaskHelper.ValidData ) + { + m_colorMaskHelper.CopyFrom( other.ColorMaskHelper , false ); + } + + if( m_colorMaskHelper1.ValidData && other.ColorMaskHelper1.ValidData ) + { + m_colorMaskHelper1.CopyFrom( other.ColorMaskHelper1, false ); + } + + if( m_colorMaskHelper2.ValidData && other.ColorMaskHelper2.ValidData ) + { + m_colorMaskHelper2.CopyFrom( other.ColorMaskHelper2, false ); + } + + if( m_colorMaskHelper3.ValidData && other.ColorMaskHelper3.ValidData ) + { + m_colorMaskHelper3.CopyFrom( other.ColorMaskHelper3, false ); + } + + if( m_stencilBufferHelper.ValidData && other.StencilBufferHelper.ValidData ) + { + m_stencilBufferHelper.CopyFrom( other.StencilBufferHelper, false ); + } + + if( m_depthOphelper.ValidData && other.DepthOphelper.ValidData ) + { + m_depthOphelper.CopyFrom( other.DepthOphelper, false ); + } + + if( m_shaderModelHelper.ValidData && other.ShaderModelHelper.ValidData ) + { + m_shaderModelHelper.CopyFrom( other.ShaderModelHelper , false); + } + } + + public void FetchDataFromTemplate( TemplateModulesData module ) + { + m_allModulesMode = module.AllModulesMode; + + if( module.PragmaTag.IsValid ) + { + m_hasValidData = true; + //m_additionalPragmas.IsValid = true; + //m_additionalPragmas.FillNativeItems( module.IncludePragmaContainer.PragmasList ); + + //m_additionalIncludes.IsValid = true; + //m_additionalIncludes.FillNativeItems( module.IncludePragmaContainer.IncludesList ); + + //m_additionalDefines.IsValid = true; + //m_additionalDefines.FillNativeItems( module.IncludePragmaContainer.DefinesList ); + + m_additionalDirectives.FillNativeItems( module.IncludePragmaContainer.NativeDirectivesList ); + m_additionalDirectives.IsValid = true; + } + else + { + //m_additionalPragmas.IsValid = false; + //m_additionalIncludes.IsValid = false; + //m_additionalDefines.IsValid = false; + m_additionalDirectives.IsValid = false; + } + + m_blendOpHelper.ConfigureFromTemplateData( module.BlendData ); + if( module.BlendData.DataCheck == TemplateDataCheck.Valid ) + { + m_hasValidData = true; + } + + m_blendOpHelper1.ConfigureFromTemplateData( module.BlendData1 ); + if( module.BlendData1.DataCheck == TemplateDataCheck.Valid ) + { + m_hasValidData = true; + } + + m_blendOpHelper2.ConfigureFromTemplateData( module.BlendData2 ); + if( module.BlendData2.DataCheck == TemplateDataCheck.Valid ) + { + m_hasValidData = true; + } + + m_blendOpHelper3.ConfigureFromTemplateData( module.BlendData3 ); + if( module.BlendData3.DataCheck == TemplateDataCheck.Valid ) + { + m_hasValidData = true; + } + + m_alphaToMaskHelper.ConfigureFromTemplateData( module.AlphaToMaskData ); + if( module.AlphaToMaskData.DataCheck == TemplateDataCheck.Valid ) + { + m_hasValidData = true; + } + + m_cullModeHelper.ConfigureFromTemplateData( module.CullModeData ); + if( module.CullModeData.DataCheck == TemplateDataCheck.Valid ) + { + m_hasValidData = true; + } + + m_colorMaskHelper.ConfigureFromTemplateData( module.ColorMaskData ); + if( module.ColorMaskData.DataCheck == TemplateDataCheck.Valid ) + { + m_hasValidData = true; + } + + m_colorMaskHelper1.ConfigureFromTemplateData( module.ColorMaskData1 ); + if( module.ColorMaskData1.DataCheck == TemplateDataCheck.Valid ) + { + m_hasValidData = true; + } + + m_colorMaskHelper2.ConfigureFromTemplateData( module.ColorMaskData2 ); + if( module.ColorMaskData2.DataCheck == TemplateDataCheck.Valid ) + { + m_hasValidData = true; + } + + m_colorMaskHelper3.ConfigureFromTemplateData( module.ColorMaskData3 ); + if( module.ColorMaskData3.DataCheck == TemplateDataCheck.Valid ) + { + m_hasValidData = true; + } + + m_stencilBufferHelper.ConfigureFromTemplateData( module.StencilData ); + if( module.StencilData.DataCheck == TemplateDataCheck.Valid ) + { + m_hasValidData = true; + } + + m_depthOphelper.ConfigureFromTemplateData( module.DepthData ); + if( module.DepthData.DataCheck == TemplateDataCheck.Valid ) + { + m_hasValidData = true; + } + + m_tagsHelper.ConfigureFromTemplateData( module.TagData ); + if( module.TagData.DataCheck == TemplateDataCheck.Valid ) + { + m_hasValidData = true; + } + + m_shaderModelHelper.ConfigureFromTemplateData( module.ShaderModel ); + if( module.ShaderModel.DataCheck == TemplateDataCheck.Valid ) + { + m_hasValidData = true; + } + } + + public void OnLogicUpdate( TemplateModulesData currentModule ) + { + if( currentModule.TagData.DataCheck == TemplateDataCheck.Valid ) + m_tagsHelper.OnLogicUpdate(); + } + + public void Draw( ParentNode owner, TemplateModulesData currentModule , TemplateModulesHelper parent = null ) + { + if( currentModule.ShaderModel.DataCheck == TemplateDataCheck.Valid ) + m_shaderModelHelper.Draw( owner ); + + m_isDirty = m_shaderModelHelper.IsDirty; + + if( currentModule.CullModeData.DataCheck == TemplateDataCheck.Valid ) + m_cullModeHelper.Draw( owner ); + + m_isDirty = m_isDirty || m_cullModeHelper.IsDirty; + + if( currentModule.ColorMaskData.DataCheck == TemplateDataCheck.Valid ) + m_colorMaskHelper.Draw( owner ); + + m_isDirty = m_isDirty || m_colorMaskHelper.IsDirty; + + if( currentModule.ColorMaskData1.DataCheck == TemplateDataCheck.Valid ) + m_colorMaskHelper1.Draw( owner ); + + m_isDirty = m_isDirty || m_colorMaskHelper1.IsDirty; + + if( currentModule.ColorMaskData2.DataCheck == TemplateDataCheck.Valid ) + m_colorMaskHelper2.Draw( owner ); + + m_isDirty = m_isDirty || m_colorMaskHelper2.IsDirty; + + if( currentModule.ColorMaskData3.DataCheck == TemplateDataCheck.Valid ) + m_colorMaskHelper3.Draw( owner ); + + m_isDirty = m_isDirty || m_colorMaskHelper3.IsDirty; + + if( currentModule.AlphaToMaskData.DataCheck == TemplateDataCheck.Valid ) + m_alphaToMaskHelper.Draw( owner ); + + m_isDirty = m_isDirty || m_alphaToMaskHelper.IsDirty; + + if( currentModule.DepthData.DataCheck == TemplateDataCheck.Valid ) + m_depthOphelper.Draw( owner, false ); + + m_isDirty = m_isDirty || m_depthOphelper.IsDirty; + + if( currentModule.BlendData.DataCheck == TemplateDataCheck.Valid ) + m_blendOpHelper.Draw( owner, false ); + + m_isDirty = m_isDirty || m_blendOpHelper.IsDirty; + + if( currentModule.BlendData1.DataCheck == TemplateDataCheck.Valid ) + m_blendOpHelper1.Draw( owner, false ); + + m_isDirty = m_isDirty || m_blendOpHelper1.IsDirty; + + if( currentModule.BlendData2.DataCheck == TemplateDataCheck.Valid ) + m_blendOpHelper2.Draw( owner, false ); + + m_isDirty = m_isDirty || m_blendOpHelper2.IsDirty; + + if( currentModule.BlendData3.DataCheck == TemplateDataCheck.Valid ) + m_blendOpHelper3.Draw( owner, false ); + + m_isDirty = m_isDirty || m_blendOpHelper3.IsDirty; + + + if( currentModule.StencilData.DataCheck == TemplateDataCheck.Valid ) + { + CullMode cullMode = CullMode.Back; + if( currentModule.CullModeData.DataCheck == TemplateDataCheck.Valid ) + { + cullMode = m_cullModeHelper.CurrentCullMode; + } + else if( parent != null && parent.CullModeHelper.ValidData ) + { + cullMode = parent.CullModeHelper.CurrentCullMode; + } + m_stencilBufferHelper.Draw( owner, cullMode, false ); + } + + m_isDirty = m_isDirty || m_stencilBufferHelper.IsDirty; + + if( currentModule.TagData.DataCheck == TemplateDataCheck.Valid ) + m_tagsHelper.Draw( owner, false ); + + m_isDirty = m_isDirty || m_tagsHelper.IsDirty; + + if( currentModule.PragmaTag.IsValid ) + { + //m_additionalDefines.Draw( owner ); + //m_additionalIncludes.Draw( owner ); + //m_additionalPragmas.Draw( owner ); + m_additionalDirectives.Draw( owner , false); + } + + m_isDirty = m_isDirty || + //m_additionalDefines.IsDirty || + //m_additionalIncludes.IsDirty || + //m_additionalPragmas.IsDirty || + m_additionalDirectives.IsDirty; + } + + public void Destroy() + { + m_shaderModelHelper = null; + m_blendOpHelper = null; + m_blendOpHelper1 = null; + m_blendOpHelper2 = null; + m_blendOpHelper3 = null; + m_cullModeHelper = null; + m_alphaToMaskHelper = null; + m_colorMaskHelper.Destroy(); + m_colorMaskHelper = null; + m_colorMaskHelper1.Destroy(); + m_colorMaskHelper1 = null; + m_colorMaskHelper2.Destroy(); + m_colorMaskHelper2 = null; + m_colorMaskHelper3.Destroy(); + m_colorMaskHelper3 = null; + m_stencilBufferHelper.Destroy(); + m_stencilBufferHelper = null; + m_tagsHelper.Destroy(); + m_tagsHelper = null; + m_additionalDefines.Destroy(); + m_additionalDefines = null; + m_additionalIncludes.Destroy(); + m_additionalIncludes = null; + m_additionalPragmas.Destroy(); + m_additionalPragmas = null; + m_additionalDirectives.Destroy(); + m_additionalDirectives = null; + } + + public string GenerateAllModulesString( bool isSubShader ) + { + string moduleBody = string.Empty; + if( !ShaderModelHelper.IndependentModule ) + { + moduleBody += ShaderModelHelper.GenerateShaderData( isSubShader ) + "\n"; + } + + if( !BlendOpHelper.IndependentModule ) + { + if( BlendOpHelper.BlendModeEnabled ) + moduleBody += BlendOpHelper.CurrentBlendFactor + "\n"; + + if( BlendOpHelper.BlendOpActive ) + moduleBody += BlendOpHelper.CurrentBlendOp + "\n"; + + } + + if( !AlphaToMaskHelper.IndependentModule ) + moduleBody += AlphaToMaskHelper.GenerateShaderData( isSubShader ) + "\n"; + + if( !CullModeHelper.IndependentModule ) + moduleBody += CullModeHelper.GenerateShaderData( isSubShader ) + "\n"; + + if( !ColorMaskHelper.IndependentModule ) + moduleBody += ColorMaskHelper.GenerateShaderData( isSubShader ) + "\n"; + + if( !DepthOphelper.IndependentModule ) + { + moduleBody += DepthOphelper.CurrentZWriteMode; + moduleBody += DepthOphelper.CurrentZTestMode; + if( DepthOphelper.OffsetEnabled ) + moduleBody += DepthOphelper.CurrentOffset; + } + + if( !StencilBufferHelper.IndependentModule && StencilBufferHelper.Active ) + { + CullMode cullMode = ( CullModeHelper.ValidData ) ? CullModeHelper.CurrentCullMode : CullMode.Back; + moduleBody += StencilBufferHelper.CreateStencilOp( cullMode ); + } + + return moduleBody; + } + + public void ReadFromString( ref uint index, ref string[] nodeParams ) + { + try + { + m_blendOpHelper.ReadFromString( ref index, ref nodeParams ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + if( UIUtils.CurrentShaderVersion() > 18103 ) + { + try + { + m_blendOpHelper1.ReadFromString( ref index, ref nodeParams ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + try + { + m_blendOpHelper2.ReadFromString( ref index, ref nodeParams ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + try + { + m_blendOpHelper3.ReadFromString( ref index, ref nodeParams ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + try + { + m_alphaToMaskHelper.ReadFromString( ref index, ref nodeParams ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + try + { + m_cullModeHelper.ReadFromString( ref index, ref nodeParams ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + try + { + m_colorMaskHelper.ReadFromString( ref index, ref nodeParams ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + if( UIUtils.CurrentShaderVersion() > 18103 ) + { + try + { + m_colorMaskHelper1.ReadFromString( ref index, ref nodeParams ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + try + { + m_colorMaskHelper2.ReadFromString( ref index, ref nodeParams ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + try + { + m_colorMaskHelper3.ReadFromString( ref index, ref nodeParams ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + try + { + m_stencilBufferHelper.ReadFromString( ref index, ref nodeParams ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + try + { + m_depthOphelper.ReadFromString( ref index, ref nodeParams ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + try + { + m_tagsHelper.ReadFromString( ref index, ref nodeParams ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + try + { + m_shaderModelHelper.ReadFromString( ref index, ref nodeParams ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + + + if( UIUtils.CurrentShaderVersion() < 15312 ) + { + try + { + m_additionalDefines.ReadFromString( ref index, ref nodeParams ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + try + { + m_additionalPragmas.ReadFromString( ref index, ref nodeParams ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + try + { + m_additionalIncludes.ReadFromString( ref index, ref nodeParams ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + + m_additionalDirectives.AddItems( AdditionalLineType.Include, m_additionalIncludes.ItemsList ); + m_additionalDirectives.AddItems( AdditionalLineType.Define, m_additionalDefines.ItemsList ); + m_additionalDirectives.AddItems( AdditionalLineType.Pragma, m_additionalPragmas.ItemsList ); + + } + else + { + try + { + m_additionalDirectives.ReadFromString( ref index, ref nodeParams ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + } + + public void WriteToString( ref string nodeInfo ) + { + m_blendOpHelper.WriteToString( ref nodeInfo ); + m_blendOpHelper1.WriteToString( ref nodeInfo ); + m_blendOpHelper2.WriteToString( ref nodeInfo ); + m_blendOpHelper3.WriteToString( ref nodeInfo ); + m_alphaToMaskHelper.WriteToString( ref nodeInfo ); + m_cullModeHelper.WriteToString( ref nodeInfo ); + m_colorMaskHelper.WriteToString( ref nodeInfo ); + m_colorMaskHelper1.WriteToString( ref nodeInfo ); + m_colorMaskHelper2.WriteToString( ref nodeInfo ); + m_colorMaskHelper3.WriteToString( ref nodeInfo ); + m_stencilBufferHelper.WriteToString( ref nodeInfo ); + m_depthOphelper.WriteToString( ref nodeInfo ); + m_tagsHelper.WriteToString( ref nodeInfo ); + m_shaderModelHelper.WriteToString( ref nodeInfo ); + + //m_additionalDefines.WriteToString( ref nodeInfo ); + //m_additionalPragmas.WriteToString( ref nodeInfo ); + //m_additionalIncludes.WriteToString( ref nodeInfo ); + + m_additionalDirectives.WriteToString( ref nodeInfo ); + } + + public TemplatesBlendModule BlendOpHelper { get { return m_blendOpHelper; } } + public TemplatesBlendModule BlendOpHelper1 { get { return m_blendOpHelper1; } } + public TemplatesBlendModule BlendOpHelper2 { get { return m_blendOpHelper2; } } + public TemplatesBlendModule BlendOpHelper3 { get { return m_blendOpHelper3; } } + public TemplateAlphaToMaskModule AlphaToMaskHelper { get { return m_alphaToMaskHelper; } } + public TemplateCullModeModule CullModeHelper { get { return m_cullModeHelper; } } + public TemplateColorMaskModule ColorMaskHelper { get { return m_colorMaskHelper; } } + public TemplateColorMaskModule ColorMaskHelper1 { get { return m_colorMaskHelper1; } } + public TemplateColorMaskModule ColorMaskHelper2 { get { return m_colorMaskHelper2; } } + public TemplateColorMaskModule ColorMaskHelper3 { get { return m_colorMaskHelper3; } } + public TemplatesStencilBufferModule StencilBufferHelper { get { return m_stencilBufferHelper; } } + public TemplateDepthModule DepthOphelper { get { return m_depthOphelper; } } + public TemplateTagsModule TagsHelper { get { return m_tagsHelper; } } + public TemplateShaderModelModule ShaderModelHelper { get { return m_shaderModelHelper; } } + //public TemplateAdditionalIncludesHelper AdditionalIncludes { get { return m_additionalIncludes; } } + //public TemplateAdditionalDefinesHelper AdditionalDefines { get { return m_additionalDefines; } } + //public TemplateAdditionalPragmasHelper AdditionalPragmas { get { return m_additionalPragmas; } } + public TemplateAdditionalDirectivesHelper AdditionalDirectives { get { return m_additionalDirectives; } } + public bool AllModulesMode { get { return m_allModulesMode; } } + public bool HasValidData { get { return m_hasValidData; } } + public bool IsDirty + { + get { return m_isDirty; } + set + { + m_isDirty = value; + if( !value ) + { + m_blendOpHelper.IsDirty = false; + m_blendOpHelper1.IsDirty = false; + m_blendOpHelper2.IsDirty = false; + m_blendOpHelper3.IsDirty = false; + m_cullModeHelper.IsDirty = false; + m_alphaToMaskHelper.IsDirty = false; + m_colorMaskHelper.IsDirty = false; + m_colorMaskHelper1.IsDirty = false; + m_colorMaskHelper2.IsDirty = false; + m_colorMaskHelper3.IsDirty = false; + m_stencilBufferHelper.IsDirty = false; + m_tagsHelper.IsDirty = false; + m_shaderModelHelper.IsDirty = false; + //m_additionalDefines.IsDirty = false; + //m_additionalPragmas.IsDirty = false; + //m_additionalIncludes.IsDirty = false; + m_additionalDirectives.IsDirty = false; + } + } + } + // public bool Foldout { get { return m_foldout; } set { m_foldout = value; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateModuleHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateModuleHelper.cs.meta new file mode 100644 index 0000000..95ebce9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateModuleHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 144af5a201bd97542bf3a483976759db +timeCreated: 1518705839 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateModuleParent.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateModuleParent.cs new file mode 100644 index 0000000..a8d4e23 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateModuleParent.cs @@ -0,0 +1,82 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class TemplateModuleParent + { + private const string UnreadableDataMessagePrefix = "Unreadable data on Module "; + protected string m_unreadableMessage; + + [SerializeField] + protected bool m_validData = false; + + [SerializeField] + protected bool m_isDirty = false; + + [SerializeField] + protected string m_moduleName = string.Empty; + + //[SerializeField] + //protected bool m_foldoutValue = false; + + [SerializeField] + protected bool m_independentModule = true; + + [SerializeField] + private bool m_customEdited = false; + + public TemplateModuleParent( string moduleName ) { m_moduleName = moduleName; m_unreadableMessage = UnreadableDataMessagePrefix + moduleName; } + public virtual void Draw( UndoParentNode owner , bool style = true) { } + public virtual void ReadFromString( ref uint index, ref string[] nodeParams ) + { + if( UIUtils.CurrentShaderVersion() > 18805 ) + { + CustomEdited = Convert.ToBoolean( nodeParams[ index++ ] ); + } + } + + public virtual void WriteToString( ref string nodeInfo ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_customEdited ); + } + + public virtual string GenerateShaderData( bool isSubShader ) { return string.Empty; } + public virtual void Destroy() { } + public bool ValidData { get { return m_validData; } } + public bool ValidAndIndependent { get { return m_validData && m_independentModule; } } + + public virtual void ShowUnreadableDataMessage( ParentNode owner ) + { + ShowUnreadableDataMessage(); + } + + public virtual void ShowUnreadableDataMessage() + { + EditorGUILayout.HelpBox( m_unreadableMessage, MessageType.Info ); + } + + public bool IsDirty + { + get { return m_isDirty; } + set { m_isDirty = value; } + } + + public bool IndependentModule + { + get { return m_independentModule; } + set { m_independentModule = value; } + } + + public bool CustomEdited + { + get { return m_customEdited; } + set { m_customEdited = value; } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateModuleParent.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateModuleParent.cs.meta new file mode 100644 index 0000000..a0a1d88 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateModuleParent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3aaabf1f5cb06414a8be17a89487e10f +timeCreated: 1511185965 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateModulesData.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateModulesData.cs new file mode 100644 index 0000000..21b47a0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateModulesData.cs @@ -0,0 +1,800 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Text.RegularExpressions; +using System.Collections.Generic; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + public enum TemplateModuleDataType + { + ModuleShaderModel, + ModuleBlendMode, + ModuleBlendMode1, + ModuleBlendMode2, + ModuleBlendMode3, + ModuleBlendOp, + ModuleBlendOp1, + ModuleBlendOp2, + ModuleBlendOp3, + ModuleAlphaToMask, + ModuleCullMode, + ModuleColorMask, + ModuleColorMask1, + ModuleColorMask2, + ModuleColorMask3, + ModuleStencil, + ModuleZwrite, + ModuleZTest, + ModuleZOffset, + ModuleTag, + ModuleGlobals, + ModuleSRPBatcher, + ModuleFunctions, + ModulePragma, + ModulePragmaBefore, + ModulePass, + ModuleInputVert, + ModuleInputFrag, + PassVertexFunction, + PassFragmentFunction, + PassVertexData, + PassInterpolatorData, + PassNameData, + AllModules, + VControl, + ControlData, + DomainData + //EndPass + } + + public enum TemplateSRPType + { + BuiltIn, + HD, + Lightweight + } + + [Serializable] + public class TemplateModulesData + { + [SerializeField] + private TemplateBlendData m_blendData = new TemplateBlendData(); + + [SerializeField] + private TemplateBlendData m_blendData1 = new TemplateBlendData(); + + [SerializeField] + private TemplateBlendData m_blendData2 = new TemplateBlendData(); + + [SerializeField] + private TemplateBlendData m_blendData3 = new TemplateBlendData(); + + [SerializeField] + private TemplateAlphaToMaskData m_alphaToMaskData = new TemplateAlphaToMaskData(); + + [SerializeField] + private TemplateCullModeData m_cullModeData = new TemplateCullModeData(); + + [SerializeField] + private TemplateColorMaskData m_colorMaskData = new TemplateColorMaskData(); + + [SerializeField] + private TemplateColorMaskData m_colorMaskData1 = new TemplateColorMaskData(); + + [SerializeField] + private TemplateColorMaskData m_colorMaskData2 = new TemplateColorMaskData(); + + [SerializeField] + private TemplateColorMaskData m_colorMaskData3 = new TemplateColorMaskData(); + + [SerializeField] + private TemplateStencilData m_stencilData = new TemplateStencilData(); + + [SerializeField] + private TemplateDepthData m_depthData = new TemplateDepthData(); + + [SerializeField] + private TemplateTagsModuleData m_tagData = new TemplateTagsModuleData(); + + [SerializeField] + private TemplateTagData m_globalsTag = new TemplateTagData( TemplatesManager.TemplateGlobalsTag, true ); + + [SerializeField] + private TemplateTagData m_srpBatcherTag = new TemplateTagData( TemplatesManager.TemplateSRPBatcherTag, true ); + + [SerializeField] + private TemplateTagData m_allModulesTag = new TemplateTagData( TemplatesManager.TemplateAllModulesTag, true ); + + [SerializeField] + private TemplateTagData m_functionsTag = new TemplateTagData( TemplatesManager.TemplateFunctionsTag, true ); + + [SerializeField] + private TemplateTagData m_pragmaTag = new TemplateTagData( TemplatesManager.TemplatePragmaTag, true ); + + [SerializeField] + private TemplateTagData m_pragmaBeforeTag = new TemplateTagData( TemplatesManager.TemplatePragmaBeforeTag, true ); + + [SerializeField] + private TemplateTagData m_passTag = new TemplateTagData( TemplatesManager.TemplatePassTag, true ); + + [SerializeField] + private TemplateTagData m_inputsVertTag = new TemplateTagData( TemplatesManager.TemplateInputsVertParamsTag, false ); + + [SerializeField] + private TemplateTagData m_inputsFragTag = new TemplateTagData( TemplatesManager.TemplateInputsFragParamsTag, false ); + + [SerializeField] + private TemplateShaderModelData m_shaderModel = new TemplateShaderModelData(); + + [SerializeField] + private TemplateSRPType m_srpType = TemplateSRPType.BuiltIn; + + [SerializeField] + private bool m_srpIsPBR = false; + + [SerializeField] + private string m_uniquePrefix; + + [SerializeField] + private TemplateIncludePragmaContainter m_includePragmaContainer = new TemplateIncludePragmaContainter(); + + [SerializeField] + private bool m_allModulesMode = false; + + [SerializeField] + private string m_passUniqueName = string.Empty; + + public void Destroy() + { + m_blendData = null; + m_blendData1 = null; + m_blendData2 = null; + m_blendData3 = null; + m_alphaToMaskData = null; + m_cullModeData = null; + m_colorMaskData = null; + m_colorMaskData1 = null; + m_colorMaskData2 = null; + m_colorMaskData3 = null; + m_stencilData = null; + m_depthData = null; + m_tagData.Destroy(); + m_tagData = null; + m_globalsTag = null; + m_srpBatcherTag = null; + m_allModulesTag = null; + m_functionsTag = null; + m_pragmaTag = null; + m_pragmaBeforeTag = null; + m_passTag = null; + m_inputsVertTag = null; + m_inputsFragTag = null; + m_includePragmaContainer.Destroy(); + m_includePragmaContainer = null; + } + + public void ConfigureCommonTag( TemplateTagData tagData, TemplatePropertyContainer propertyContainer, TemplateIdManager idManager, string uniquePrefix, int offsetIdx, string subBody ) + { + int id = subBody.IndexOf( tagData.Id ); + if ( id >= 0 ) + { + tagData.StartIdx = offsetIdx + id; + idManager.RegisterId( tagData.StartIdx, uniquePrefix + tagData.Id, tagData.Id ); + propertyContainer.AddId( subBody, tagData.Id, tagData.SearchIndentation ); + } + } + + public TemplateModulesData( TemplateOptionsContainer optionsContainer, TemplateIdManager idManager, TemplatePropertyContainer propertyContainer, string uniquePrefix, int offsetIdx, string subBody, bool isSubShader ) + { + if ( string.IsNullOrEmpty( subBody ) ) + return; + + m_uniquePrefix = uniquePrefix; + //PRAGMAS AND INCLUDES + TemplateHelperFunctions.CreatePragmaIncludeList( subBody, m_includePragmaContainer ); + + //COMMON TAGS + ConfigureCommonTag( m_globalsTag, propertyContainer, idManager, uniquePrefix, offsetIdx, subBody ); + ConfigureCommonTag( m_srpBatcherTag, propertyContainer, idManager, uniquePrefix, offsetIdx, subBody ); + ConfigureCommonTag( m_functionsTag, propertyContainer, idManager, uniquePrefix, offsetIdx, subBody ); + ConfigureCommonTag( m_pragmaTag, propertyContainer, idManager, uniquePrefix, offsetIdx, subBody ); + ConfigureCommonTag( m_pragmaBeforeTag, propertyContainer, idManager, uniquePrefix, offsetIdx, subBody ); + if( !TemplateHelperFunctions.GetPassUniqueId( m_passTag, propertyContainer, idManager, uniquePrefix, offsetIdx, subBody, ref m_passUniqueName ) ) + { + ConfigureCommonTag( m_passTag, propertyContainer, idManager, uniquePrefix, offsetIdx, subBody ); + } + ConfigureCommonTag( m_inputsVertTag, propertyContainer, idManager, uniquePrefix, offsetIdx, subBody ); + ConfigureCommonTag( m_inputsFragTag, propertyContainer, idManager, uniquePrefix, offsetIdx, subBody ); + + // If Options are enabled then remove them so they won't influence Regex matches + if( optionsContainer.Enabled && optionsContainer.EndIndex > 0 ) + { + offsetIdx += optionsContainer.EndIndex; + subBody = subBody.Substring( optionsContainer.EndIndex ); + } + //BlEND MODE + { + Match blendModeMatch = Regex.Match( subBody, TemplateHelperFunctions.BlendModePattern1 ); + if( blendModeMatch.Success ) + { + int blendModeIdx = blendModeMatch.Index; + int end = blendModeMatch.Length + blendModeIdx; + string blendParams = subBody.Substring( blendModeIdx, end - blendModeIdx ); + m_blendData1.BlendModeId = blendParams; + m_blendData1.BlendModeStartIndex = offsetIdx + blendModeIdx; + idManager.RegisterId( m_blendData1.BlendModeStartIndex, uniquePrefix + m_blendData1.BlendModeId, m_blendData1.BlendModeId ); + + TemplateHelperFunctions.CreateBlendMode( blendParams, ref m_blendData1, TemplateHelperFunctions.BlendModePattern1 ); + if( m_blendData1.ValidBlendMode ) + { + propertyContainer.AddId( subBody, blendParams, false ); + } + } + } + { + Match blendModeMatch = Regex.Match( subBody, TemplateHelperFunctions.BlendModePattern2 ); + if( blendModeMatch.Success ) + { + int blendModeIdx = blendModeMatch.Index; + int end = blendModeMatch.Length + blendModeIdx; + string blendParams = subBody.Substring( blendModeIdx, end - blendModeIdx ); + m_blendData2.BlendModeId = blendParams; + m_blendData2.BlendModeStartIndex = offsetIdx + blendModeIdx; + idManager.RegisterId( m_blendData2.BlendModeStartIndex, uniquePrefix + m_blendData2.BlendModeId, m_blendData2.BlendModeId ); + + TemplateHelperFunctions.CreateBlendMode( blendParams, ref m_blendData2, TemplateHelperFunctions.BlendModePattern2 ); + if( m_blendData2.ValidBlendMode ) + { + propertyContainer.AddId( subBody, blendParams, false ); + } + } + } + { + Match blendModeMatch = Regex.Match( subBody, TemplateHelperFunctions.BlendModePattern3 ); + if( blendModeMatch.Success ) + { + int blendModeIdx = blendModeMatch.Index; + int end = blendModeMatch.Length + blendModeIdx; + string blendParams = subBody.Substring( blendModeIdx, end - blendModeIdx ); + m_blendData3.BlendModeId = blendParams; + m_blendData3.BlendModeStartIndex = offsetIdx + blendModeIdx; + idManager.RegisterId( m_blendData3.BlendModeStartIndex, uniquePrefix + m_blendData3.BlendModeId, m_blendData3.BlendModeId ); + + TemplateHelperFunctions.CreateBlendMode( blendParams, ref m_blendData3, TemplateHelperFunctions.BlendModePattern3 ); + if( m_blendData3.ValidBlendMode ) + { + propertyContainer.AddId( subBody, blendParams, false ); + } + } + } + { + string pattern = TemplateHelperFunctions.BlendModePattern; + Match blendModeMatch = Regex.Match( subBody, pattern ); + if( !blendModeMatch.Success && !m_blendData1.ValidBlendMode && !m_blendData2.ValidBlendMode && !m_blendData3.ValidBlendMode ) + { + pattern = TemplateHelperFunctions.BlendModePatternFirst; + blendModeMatch = Regex.Match( subBody, pattern ); + } + if( blendModeMatch.Success ) + { + int blendModeIdx = blendModeMatch.Index; + int end = blendModeMatch.Length + blendModeIdx; + string blendParams = subBody.Substring( blendModeIdx, end - blendModeIdx ); + m_blendData.BlendModeId = blendParams; + m_blendData.BlendModeStartIndex = offsetIdx + blendModeIdx; + idManager.RegisterId( m_blendData.BlendModeStartIndex, uniquePrefix + m_blendData.BlendModeId, m_blendData.BlendModeId ); + + TemplateHelperFunctions.CreateBlendMode( blendParams, ref m_blendData, pattern ); + if( m_blendData.ValidBlendMode ) + { + propertyContainer.AddId( subBody, blendParams, false ); + } + + } + } + //BLEND OP + { + Match blendOpMatch = Regex.Match( subBody, TemplateHelperFunctions.BlendOpPattern1 ); + if( blendOpMatch.Success ) + { + int blendOpIdx = blendOpMatch.Index; + int end = blendOpMatch.Length + blendOpIdx; + string blendOpParams = subBody.Substring( blendOpIdx, end - blendOpIdx ); + m_blendData1.BlendOpId = blendOpParams; + m_blendData1.BlendOpStartIndex = offsetIdx + blendOpIdx; + idManager.RegisterId( m_blendData1.BlendOpStartIndex, uniquePrefix + m_blendData1.BlendOpId, m_blendData1.BlendOpId ); + TemplateHelperFunctions.CreateBlendOp( blendOpParams, ref m_blendData1, TemplateHelperFunctions.BlendOpPattern1 ); + if( m_blendData1.ValidBlendOp ) + { + propertyContainer.AddId( subBody, blendOpParams, false ); + } + } + + m_blendData1.DataCheck = ( m_blendData1.ValidBlendMode || m_blendData1.ValidBlendOp ) ? TemplateDataCheck.Valid : TemplateDataCheck.Invalid; + } + { + Match blendOpMatch = Regex.Match( subBody, TemplateHelperFunctions.BlendOpPattern2 ); + if( blendOpMatch.Success ) + { + int blendOpIdx = blendOpMatch.Index; + int end = blendOpMatch.Length + blendOpIdx; + string blendOpParams = subBody.Substring( blendOpIdx, end - blendOpIdx ); + m_blendData2.BlendOpId = blendOpParams; + m_blendData2.BlendOpStartIndex = offsetIdx + blendOpIdx; + idManager.RegisterId( m_blendData2.BlendOpStartIndex, uniquePrefix + m_blendData2.BlendOpId, m_blendData2.BlendOpId ); + TemplateHelperFunctions.CreateBlendOp( blendOpParams, ref m_blendData2, TemplateHelperFunctions.BlendOpPattern2 ); + if( m_blendData2.ValidBlendOp ) + { + propertyContainer.AddId( subBody, blendOpParams, false ); + } + } + + m_blendData2.DataCheck = ( m_blendData2.ValidBlendMode || m_blendData2.ValidBlendOp ) ? TemplateDataCheck.Valid : TemplateDataCheck.Invalid; + } + { + Match blendOpMatch = Regex.Match( subBody, TemplateHelperFunctions.BlendOpPattern3 ); + if( blendOpMatch.Success ) + { + int blendOpIdx = blendOpMatch.Index; + int end = blendOpMatch.Length + blendOpIdx; + string blendOpParams = subBody.Substring( blendOpIdx, end - blendOpIdx ); + m_blendData3.BlendOpId = blendOpParams; + m_blendData3.BlendOpStartIndex = offsetIdx + blendOpIdx; + idManager.RegisterId( m_blendData3.BlendOpStartIndex, uniquePrefix + m_blendData3.BlendOpId, m_blendData3.BlendOpId ); + TemplateHelperFunctions.CreateBlendOp( blendOpParams, ref m_blendData3, TemplateHelperFunctions.BlendOpPattern3 ); + if( m_blendData3.ValidBlendOp ) + { + propertyContainer.AddId( subBody, blendOpParams, false ); + } + } + + m_blendData3.DataCheck = ( m_blendData3.ValidBlendMode || m_blendData3.ValidBlendOp ) ? TemplateDataCheck.Valid : TemplateDataCheck.Invalid; + } + { + string pattern = TemplateHelperFunctions.BlendOpPattern; + Match blendOpMatch = Regex.Match( subBody, pattern ); + if( !blendOpMatch.Success && !m_blendData1.ValidBlendOp && !m_blendData2.ValidBlendOp && !m_blendData3.ValidBlendOp ) + { + pattern = TemplateHelperFunctions.BlendOpPatternFirst; + blendOpMatch = Regex.Match( subBody, pattern ); + } + + if( blendOpMatch.Success ) + { + int blendOpIdx = blendOpMatch.Index; + int end = blendOpMatch.Length + blendOpIdx; + string blendOpParams = subBody.Substring( blendOpIdx, end - blendOpIdx ); + m_blendData.BlendOpId = blendOpParams; + m_blendData.BlendOpStartIndex = offsetIdx + blendOpIdx; + idManager.RegisterId( m_blendData.BlendOpStartIndex, uniquePrefix + m_blendData.BlendOpId, m_blendData.BlendOpId ); + TemplateHelperFunctions.CreateBlendOp( blendOpParams, ref m_blendData, pattern ); + if( m_blendData.ValidBlendOp ) + { + propertyContainer.AddId( subBody, blendOpParams, false ); + } + } + + m_blendData.DataCheck = ( m_blendData.ValidBlendMode || m_blendData.ValidBlendOp ) ? TemplateDataCheck.Valid : TemplateDataCheck.Invalid; + } + + //ALPHA TO MASK + { + Match alphaToMaskMatch = Regex.Match( subBody, TemplateHelperFunctions.AlphaToMaskPattern ); + if( alphaToMaskMatch.Success ) + { + int alphaIdx = alphaToMaskMatch.Index; + int end = subBody.IndexOf( TemplatesManager.TemplateNewLine, alphaIdx ); + string alphaParams = subBody.Substring( alphaIdx, end - alphaIdx ); + m_alphaToMaskData.AlphaToMaskId = alphaParams; + m_alphaToMaskData.StartIdx = offsetIdx + alphaIdx; + idManager.RegisterId( m_alphaToMaskData.StartIdx, uniquePrefix + m_alphaToMaskData.AlphaToMaskId, m_alphaToMaskData.AlphaToMaskId ); + TemplateHelperFunctions.CreateAlphaToMask( alphaParams, ref m_alphaToMaskData ); + if( m_alphaToMaskData.DataCheck == TemplateDataCheck.Valid ) + propertyContainer.AddId( subBody, alphaParams, false, string.Empty ); + } + } + + //CULL MODE + { + Match cullMatch = Regex.Match( subBody, TemplateHelperFunctions.CullWholeWordPattern ); + if( cullMatch.Success ) + { + int cullIdx = cullMatch.Index; + int end = subBody.IndexOf( TemplatesManager.TemplateNewLine, cullIdx ); + string cullParams = subBody.Substring( cullIdx, end - cullIdx ); + m_cullModeData.CullModeId = cullParams; + m_cullModeData.StartIdx = offsetIdx + cullIdx; + idManager.RegisterId( m_cullModeData.StartIdx, uniquePrefix + m_cullModeData.CullModeId, m_cullModeData.CullModeId ); + TemplateHelperFunctions.CreateCullMode( cullParams, ref m_cullModeData ); + if( m_cullModeData.DataCheck == TemplateDataCheck.Valid ) + propertyContainer.AddId( subBody, cullParams, false, string.Empty ); + + } + } + //COLOR MASK + { + Match colorMaskMatch = Regex.Match( subBody, TemplateHelperFunctions.ColorMask1Pattern ); + if( colorMaskMatch.Success ) + { + int colorMaskIdx = colorMaskMatch.Index; + int end = colorMaskMatch.Length + colorMaskIdx;// subBody.IndexOf( TemplatesManager.TemplateNewLine, colorMaskIdx ); + string colorMaskParams = subBody.Substring( colorMaskIdx, end - colorMaskIdx ); + m_colorMaskData1.ColorMaskId = colorMaskParams; + m_colorMaskData1.StartIdx = offsetIdx + colorMaskIdx; + idManager.RegisterId( m_colorMaskData1.StartIdx, uniquePrefix + m_colorMaskData1.ColorMaskId, m_colorMaskData1.ColorMaskId ); + TemplateHelperFunctions.CreateColorMask( colorMaskParams, ref m_colorMaskData1, TemplateHelperFunctions.ColorMask1Pattern ); + if( m_colorMaskData1.DataCheck == TemplateDataCheck.Valid ) + propertyContainer.AddId( subBody, colorMaskParams, false ); + + } + } + { + Match colorMaskMatch = Regex.Match( subBody, TemplateHelperFunctions.ColorMask2Pattern ); + if( colorMaskMatch.Success ) + { + int colorMaskIdx = colorMaskMatch.Index; + int end = colorMaskMatch.Length + colorMaskIdx;// subBody.IndexOf( TemplatesManager.TemplateNewLine, colorMaskIdx ); + string colorMaskParams = subBody.Substring( colorMaskIdx, end - colorMaskIdx ); + m_colorMaskData2.ColorMaskId = colorMaskParams; + m_colorMaskData2.StartIdx = offsetIdx + colorMaskIdx; + idManager.RegisterId( m_colorMaskData2.StartIdx, uniquePrefix + m_colorMaskData2.ColorMaskId, m_colorMaskData2.ColorMaskId ); + TemplateHelperFunctions.CreateColorMask( colorMaskParams, ref m_colorMaskData2, TemplateHelperFunctions.ColorMask2Pattern ); + if( m_colorMaskData2.DataCheck == TemplateDataCheck.Valid ) + propertyContainer.AddId( subBody, colorMaskParams, false ); + + } + } + { + Match colorMaskMatch = Regex.Match( subBody, TemplateHelperFunctions.ColorMask3Pattern ); + if( colorMaskMatch.Success ) + { + int colorMaskIdx = colorMaskMatch.Index; + int end = colorMaskMatch.Length + colorMaskIdx;// subBody.IndexOf( TemplatesManager.TemplateNewLine, colorMaskIdx ); + string colorMaskParams = subBody.Substring( colorMaskIdx, end - colorMaskIdx ); + m_colorMaskData3.ColorMaskId = colorMaskParams; + m_colorMaskData3.StartIdx = offsetIdx + colorMaskIdx; + idManager.RegisterId( m_colorMaskData3.StartIdx, uniquePrefix + m_colorMaskData3.ColorMaskId, m_colorMaskData3.ColorMaskId ); + TemplateHelperFunctions.CreateColorMask( colorMaskParams, ref m_colorMaskData3, TemplateHelperFunctions.ColorMask3Pattern ); + if( m_colorMaskData3.DataCheck == TemplateDataCheck.Valid ) + propertyContainer.AddId( subBody, colorMaskParams, false ); + + } + } + { + string pattern = TemplateHelperFunctions.ColorMaskPattern; + Match colorMaskMatch = Regex.Match( subBody, pattern ); + if( !colorMaskMatch.Success && m_colorMaskData1.DataCheck == TemplateDataCheck.Invalid && m_colorMaskData2.DataCheck == TemplateDataCheck.Invalid && m_colorMaskData3.DataCheck == TemplateDataCheck.Invalid ) + { + pattern = TemplateHelperFunctions.ColorMaskPatternFirst; + colorMaskMatch = Regex.Match( subBody, pattern ); + } + + if( colorMaskMatch.Success ) + { + int colorMaskIdx = colorMaskMatch.Index; + int end = colorMaskMatch.Length + colorMaskIdx; //subBody.IndexOf( TemplatesManager.TemplateNewLine, colorMaskIdx ); + string colorMaskParams = subBody.Substring( colorMaskIdx, end - colorMaskIdx ); + m_colorMaskData.ColorMaskId = colorMaskParams; + m_colorMaskData.StartIdx = offsetIdx + colorMaskIdx; + idManager.RegisterId( m_colorMaskData.StartIdx, uniquePrefix + m_colorMaskData.ColorMaskId, m_colorMaskData.ColorMaskId ); + TemplateHelperFunctions.CreateColorMask( colorMaskParams, ref m_colorMaskData, pattern ); + if( m_colorMaskData.DataCheck == TemplateDataCheck.Valid ) + propertyContainer.AddId( subBody, colorMaskParams, false ); + + } + } + //STENCIL + { + Match stencilMatch = Regex.Match( subBody, TemplateHelperFunctions.StencilWholeWordPattern ); + if( stencilMatch.Success ) + { + int stencilIdx = stencilMatch.Index; + int stencilEndIdx = subBody.IndexOf( "}", stencilIdx ); + if( stencilEndIdx > 0 ) + { + string stencilParams = subBody.Substring( stencilIdx, stencilEndIdx + 1 - stencilIdx ); + m_stencilData.StencilBufferId = stencilParams; + m_stencilData.StartIdx = offsetIdx + stencilIdx; + idManager.RegisterId( m_stencilData.StartIdx, uniquePrefix + m_stencilData.StencilBufferId, m_stencilData.StencilBufferId ); + TemplateHelperFunctions.CreateStencilOps( stencilParams, ref m_stencilData ); + if( m_stencilData.DataCheck == TemplateDataCheck.Valid ) + { + propertyContainer.AddId( subBody, stencilParams, true ); + } + } + } + else + { + int stencilTagIdx = subBody.IndexOf( TemplatesManager.TemplateStencilTag ); + if( stencilTagIdx > -1 ) + { + m_stencilData.SetIndependentDefault(); + m_stencilData.StencilBufferId = TemplatesManager.TemplateStencilTag; + m_stencilData.StartIdx = offsetIdx + stencilTagIdx; + idManager.RegisterId( m_stencilData.StartIdx, uniquePrefix + m_stencilData.StencilBufferId, m_stencilData.StencilBufferId ); + propertyContainer.AddId( subBody, m_stencilData.StencilBufferId, true ); + } + } + } + //ZWRITE + { + Match zWriteMatch = Regex.Match( subBody, TemplateHelperFunctions.ZWriteWholeWordPattern ); + if( zWriteMatch.Success ) + { + int zWriteOpIdx = zWriteMatch.Index; + int zWriteEndIdx = subBody.IndexOf( TemplatesManager.TemplateNewLine, zWriteOpIdx ); + if( zWriteEndIdx > 0 ) + { + m_depthData.ZWriteModeId = subBody.Substring( zWriteOpIdx, zWriteEndIdx + 1 - zWriteOpIdx ); + m_depthData.ZWriteStartIndex = offsetIdx + zWriteOpIdx; + idManager.RegisterId( m_depthData.ZWriteStartIndex, uniquePrefix + m_depthData.ZWriteModeId, m_depthData.ZWriteModeId ); + TemplateHelperFunctions.CreateZWriteMode( m_depthData.ZWriteModeId, ref m_depthData ); + if( m_depthData.DataCheck == TemplateDataCheck.Valid ) + { + propertyContainer.AddId( subBody, m_depthData.ZWriteModeId, true ); + } + } + } + } + + //ZTEST + { + Match zTestMatch = Regex.Match( subBody, TemplateHelperFunctions.ZTestWholeWordPattern ); + if( zTestMatch.Success ) + { + int zTestOpIdx = zTestMatch.Index; + int zTestEndIdx = subBody.IndexOf( TemplatesManager.TemplateNewLine, zTestOpIdx ); + if( zTestEndIdx > 0 ) + { + m_depthData.ZTestModeId = subBody.Substring( zTestOpIdx, zTestEndIdx + 1 - zTestOpIdx ); + m_depthData.ZTestStartIndex = offsetIdx + zTestOpIdx; + idManager.RegisterId( m_depthData.ZTestStartIndex, uniquePrefix + m_depthData.ZTestModeId, m_depthData.ZTestModeId ); + TemplateHelperFunctions.CreateZTestMode( m_depthData.ZTestModeId, ref m_depthData ); + if( m_depthData.DataCheck == TemplateDataCheck.Valid ) + { + propertyContainer.AddId( subBody, m_depthData.ZTestModeId, true ); + } + } + } + } + + //ZOFFSET + { + Match zOffsetMatch = Regex.Match( subBody, TemplateHelperFunctions.ZOffsetWholeWordPattern ); + if( zOffsetMatch.Success ) + { + int zOffsetIdx = zOffsetMatch.Index; + int zOffsetEndIdx = subBody.IndexOf( TemplatesManager.TemplateNewLine, zOffsetIdx ); + if( zOffsetEndIdx > 0 ) + { + m_depthData.OffsetId = subBody.Substring( zOffsetIdx, zOffsetEndIdx + 1 - zOffsetIdx ); + m_depthData.OffsetStartIndex = offsetIdx + zOffsetIdx; + idManager.RegisterId( m_depthData.OffsetStartIndex, uniquePrefix + m_depthData.OffsetId, m_depthData.OffsetId ); + TemplateHelperFunctions.CreateZOffsetMode( m_depthData.OffsetId, ref m_depthData ); + if( m_depthData.DataCheck == TemplateDataCheck.Valid ) + { + propertyContainer.AddId( subBody, m_depthData.OffsetId, true ); + } + } + } + m_depthData.SetDataCheck(); + } + //TAGS + { + Match tagsMatch = Regex.Match( subBody, TemplateHelperFunctions.TagsWholeWordPattern ); + if ( tagsMatch.Success ) + { + int tagsIdx = tagsMatch.Index; + int tagsEndIdx = subBody.IndexOf( "}", tagsIdx ); + if ( tagsEndIdx > -1 ) + { + m_tagData.Reset(); + m_tagData.TagsId = subBody.Substring( tagsIdx, tagsEndIdx + 1 - tagsIdx ); + m_tagData.StartIdx = offsetIdx + tagsIdx; + idManager.RegisterId( m_tagData.StartIdx, uniquePrefix + m_tagData.TagsId, m_tagData.TagsId ); + m_srpType = TemplateHelperFunctions.CreateTags( ref m_tagData, isSubShader ); + + propertyContainer.AddId( subBody, m_tagData.TagsId, false ); + m_tagData.DataCheck = TemplateDataCheck.Valid; + } + else + { + m_tagData.DataCheck = TemplateDataCheck.Invalid; + } + } + else + { + m_tagData.DataCheck = TemplateDataCheck.Invalid; + } + } + + //SHADER MODEL + { + Match match = Regex.Match( subBody, TemplateHelperFunctions.ShaderModelPattern ); + if ( match != null && match.Groups.Count > 1 ) + { + if ( TemplateHelperFunctions.AvailableInterpolators.ContainsKey( match.Groups[ 1 ].Value ) ) + { + m_shaderModel.Id = match.Groups[ 0 ].Value; + m_shaderModel.StartIdx = offsetIdx + match.Index; + m_shaderModel.Value = match.Groups[ 1 ].Value; + m_shaderModel.InterpolatorAmount = TemplateHelperFunctions.AvailableInterpolators[ match.Groups[ 1 ].Value ]; + m_shaderModel.DataCheck = TemplateDataCheck.Valid; + idManager.RegisterId( m_shaderModel.StartIdx, uniquePrefix + m_shaderModel.Id, m_shaderModel.Id ); + } + else + { + m_shaderModel.DataCheck = TemplateDataCheck.Invalid; + } + } + } + + // ALL MODULES + int allModulesIndex = subBody.IndexOf( TemplatesManager.TemplateAllModulesTag ); + if( allModulesIndex > 0 ) + { + //ONLY REGISTER MISSING TAGS + ConfigureCommonTag( m_allModulesTag, propertyContainer, idManager, uniquePrefix, offsetIdx, subBody ); + m_allModulesMode = true; + + m_blendData.SetAllModulesDefault(); + + if( !m_alphaToMaskData.IsValid ) + m_alphaToMaskData.SetAllModulesDefault(); + + if( !m_cullModeData.IsValid ) + m_cullModeData.SetAllModulesDefault(); + + if( !m_colorMaskData.IsValid ) + m_colorMaskData.SetAllModulesDefault(); + + if( !m_stencilData.IsValid ) + m_stencilData.SetAllModulesDefault(); + + if( !m_depthData.IsValid ) + m_depthData.SetAllModulesDefault(); + + if( !m_shaderModel.IsValid ) + m_shaderModel.SetAllModulesDefault(); + } + } + + public void TestPropertyInternalName( string name, ref List availableShaderProperties, ref Dictionary duplicatesHelper ) + { + if( !string.IsNullOrEmpty( name ) && !duplicatesHelper.ContainsKey( name )) + { + TemplateShaderPropertyData newData = new TemplateShaderPropertyData( -1, string.Empty, string.Empty, name, name, WirePortDataType.INT, PropertyType.Property,-1,-1 ); + availableShaderProperties.Add( newData ); + duplicatesHelper.Add( newData.PropertyName , newData ); + } + } + + public void RegisterInternalUnityInlines( ref List availableShaderProperties, ref Dictionary duplicatesHelper ) + { + TestPropertyInternalName( m_depthData.ZWriteInlineValue, ref availableShaderProperties , ref duplicatesHelper); + TestPropertyInternalName( m_depthData.ZTestInlineValue, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_depthData.OffsetFactorInlineValue, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_depthData.OffsetUnitsInlineValue, ref availableShaderProperties, ref duplicatesHelper ); + + TestPropertyInternalName( m_blendData.SourceFactorRGBInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_blendData.DestFactorRGBInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_blendData.SourceFactorAlphaInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_blendData.DestFactorAlphaInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_blendData.BlendOpRGBInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_blendData.BlendOpAlphaInline, ref availableShaderProperties, ref duplicatesHelper ); + + TestPropertyInternalName( m_blendData1.SourceFactorRGBInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_blendData1.DestFactorRGBInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_blendData1.SourceFactorAlphaInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_blendData1.DestFactorAlphaInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_blendData1.BlendOpRGBInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_blendData1.BlendOpAlphaInline, ref availableShaderProperties, ref duplicatesHelper ); + + TestPropertyInternalName( m_blendData2.SourceFactorRGBInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_blendData2.DestFactorRGBInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_blendData2.SourceFactorAlphaInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_blendData2.DestFactorAlphaInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_blendData2.BlendOpRGBInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_blendData2.BlendOpAlphaInline, ref availableShaderProperties, ref duplicatesHelper ); + + TestPropertyInternalName( m_blendData3.SourceFactorRGBInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_blendData3.DestFactorRGBInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_blendData3.SourceFactorAlphaInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_blendData3.DestFactorAlphaInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_blendData3.BlendOpRGBInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_blendData3.BlendOpAlphaInline, ref availableShaderProperties, ref duplicatesHelper ); + + TestPropertyInternalName( m_alphaToMaskData.InlineData, ref availableShaderProperties, ref duplicatesHelper ); + + TestPropertyInternalName( m_stencilData.ReferenceInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_stencilData.ReadMaskInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_stencilData.WriteMaskInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_stencilData.ComparisonFrontInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_stencilData.PassFrontInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_stencilData.FailFrontInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_stencilData.ZFailFrontInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_stencilData.ComparisonBackInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_stencilData.PassBackInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_stencilData.FailBackInline, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_stencilData.ZFailBackInline, ref availableShaderProperties, ref duplicatesHelper ); + + TestPropertyInternalName( m_cullModeData.InlineData, ref availableShaderProperties, ref duplicatesHelper ); + + TestPropertyInternalName( m_colorMaskData.InlineData, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_colorMaskData1.InlineData, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_colorMaskData2.InlineData, ref availableShaderProperties, ref duplicatesHelper ); + TestPropertyInternalName( m_colorMaskData3.InlineData, ref availableShaderProperties, ref duplicatesHelper ); + } + + public void SetPassUniqueNameIfUndefined( string value ) + { + if( string.IsNullOrEmpty( m_passUniqueName ) ) + m_passUniqueName = value; + } + + public bool HasValidData + { + get + { + return m_blendData.DataCheck == TemplateDataCheck.Valid || + m_blendData1.DataCheck == TemplateDataCheck.Valid || + m_blendData2.DataCheck == TemplateDataCheck.Valid || + m_blendData3.DataCheck == TemplateDataCheck.Valid || + m_alphaToMaskData.DataCheck == TemplateDataCheck.Valid || + m_cullModeData.DataCheck == TemplateDataCheck.Valid || + m_colorMaskData.DataCheck == TemplateDataCheck.Valid || + m_colorMaskData1.DataCheck == TemplateDataCheck.Valid || + m_colorMaskData2.DataCheck == TemplateDataCheck.Valid || + m_colorMaskData3.DataCheck == TemplateDataCheck.Valid || + m_stencilData.DataCheck == TemplateDataCheck.Valid || + m_depthData.DataCheck == TemplateDataCheck.Valid || + m_tagData.DataCheck == TemplateDataCheck.Valid || + m_shaderModel.DataCheck == TemplateDataCheck.Valid || + m_globalsTag.IsValid || + m_srpBatcherTag.IsValid || + m_allModulesTag.IsValid || + m_functionsTag.IsValid || + m_pragmaTag.IsValid || + m_pragmaBeforeTag.IsValid || + m_passTag.IsValid || + m_inputsVertTag.IsValid || + m_inputsFragTag.IsValid; + } + } + + public TemplateBlendData BlendData { get { return m_blendData; } } + public TemplateBlendData BlendData1 { get { return m_blendData1; } } + public TemplateBlendData BlendData2 { get { return m_blendData2; } } + public TemplateBlendData BlendData3 { get { return m_blendData3; } } + public TemplateAlphaToMaskData AlphaToMaskData { get { return m_alphaToMaskData; } } + public TemplateCullModeData CullModeData { get { return m_cullModeData; } } + public TemplateColorMaskData ColorMaskData { get { return m_colorMaskData; } } + public TemplateColorMaskData ColorMaskData1 { get { return m_colorMaskData1; } } + public TemplateColorMaskData ColorMaskData2 { get { return m_colorMaskData2; } } + public TemplateColorMaskData ColorMaskData3 { get { return m_colorMaskData3; } } + public TemplateStencilData StencilData { get { return m_stencilData; } } + public TemplateDepthData DepthData { get { return m_depthData; } } + public TemplateTagsModuleData TagData { get { return m_tagData; } } + public TemplateTagData GlobalsTag { get { return m_globalsTag; } } + public TemplateTagData SRPBatcherTag { get { return m_srpBatcherTag; } } + public TemplateTagData AllModulesTag { get { return m_allModulesTag; } } + public TemplateTagData FunctionsTag { get { return m_functionsTag; } } + public TemplateTagData PragmaTag { get { return m_pragmaTag; } } + public TemplateTagData PragmaBeforeTag { get { return m_pragmaBeforeTag; } } + public TemplateTagData PassTag { get { return m_passTag; } } + public TemplateTagData InputsVertTag { get { return m_inputsVertTag; } } + public TemplateTagData InputsFragTag { get { return m_inputsFragTag; } } + public TemplateShaderModelData ShaderModel { get { return m_shaderModel; } } + public TemplateSRPType SRPType { get { return m_srpType; } set { m_srpType = value; } } + public bool SRPIsPBR { get { return m_srpIsPBR; } set { m_srpIsPBR = value; } } + public bool SRPIsPBRHD { get { return m_srpIsPBR && m_srpType == TemplateSRPType.HD; } } + public string UniquePrefix { get { return m_uniquePrefix; } } + public string PassUniqueName { get { return m_passUniqueName; } } + public bool HasPassUniqueName { get { return !string.IsNullOrEmpty( m_passUniqueName ); } } + public TemplateIncludePragmaContainter IncludePragmaContainer { get { return m_includePragmaContainer; } } + public bool AllModulesMode { get { return m_allModulesMode; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateModulesData.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateModulesData.cs.meta new file mode 100644 index 0000000..6471477 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateModulesData.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 122447ac2bc376a448a42a0f5373e63b +timeCreated: 1521718529 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMultiPass.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMultiPass.cs new file mode 100644 index 0000000..3233f0f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMultiPass.cs @@ -0,0 +1,1478 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +using System; +using System.Text.RegularExpressions; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class TemplateUniquePassData + { + public int SubShaderIdx; + public int PassIdx; + } + + [Serializable] + public sealed class TemplateMultiPass : TemplateDataParent + { + [SerializeField] + private List m_availableShaderProperties = new List(); + + [SerializeField] + private List m_subShaders = new List(); + + [SerializeField] + private TemplateTagData m_propertyTag; + + [SerializeField] + private TemplateIdManager m_templateIdManager; + + [SerializeField] + private string m_shaderNameId = string.Empty; + + [SerializeField] + private string m_shaderBody; + + [SerializeField] + private TemplatePropertyContainer m_templateProperties = new TemplatePropertyContainer(); + + [SerializeField] + private TemplateShaderInfo m_shaderData; + + [SerializeField] + private bool m_isSinglePass = false; + + [SerializeField] + private int m_masterNodesRequired = 0; + + [SerializeField] + TemplateInfoContainer m_customInspectorContainer = new TemplateInfoContainer(); + + [SerializeField] + TemplateInfoContainer m_dependenciesContainer = new TemplateInfoContainer(); + + [SerializeField] + TemplateInfoContainer m_fallbackContainer = new TemplateInfoContainer(); + + [SerializeField] + TemplateInfoContainer m_beforePragmaContainer = new TemplateInfoContainer(); + + [SerializeField] + private CustomTemplatePropertyUIEnum m_customTemplatePropertyUI = CustomTemplatePropertyUIEnum.None; + + [SerializeField] + private int m_lodInjectorId = -1; + + [SerializeField] + TemplateShaderModelData m_globalShaderModel = new TemplateShaderModelData(); + + private Dictionary m_passUniqueIdData = new Dictionary(); + + [NonSerialized] + private List m_allShaderProperties; + + public TemplateMultiPass() + { + m_templateType = TemplateDataType.MultiPass; + } + + public TemplateMultiPass( string name, string guid, bool isCommunity ) + { + m_templateType = TemplateDataType.MultiPass; + Init( name, guid, isCommunity ); + } + + public override void Init( string name, string guid, bool isCommunity ) + { + base.Init( name, guid, isCommunity ); + TemplatesManager.CurrTemplateGUIDLoaded = guid; + LoadTemplateBody( guid ); + Name = string.IsNullOrEmpty( name ) ? m_defaultShaderName : name; + } + + void LoadTemplateBody( string guid ) + { + m_passUniqueIdData.Clear(); + m_guid = guid; + string datapath = AssetDatabase.GUIDToAssetPath( guid ); + string shaderBody = string.Empty; + shaderBody = IOUtils.LoadTextFileFromDisk( datapath ); + shaderBody = UIUtils.ForceLFLineEnding( shaderBody ); + + // Insert Before Tag + MatchCollection col = Regex.Matches( shaderBody, TemplateHelperFunctions.BeforePragmaPattern, RegexOptions.Singleline ); + for( int i = col.Count - 1; i >= 0; i-- ) + { + if( col[ i ].Groups.Count == 3 ) + { + shaderBody = shaderBody.Insert( col[ i ].Groups[ 2 ].Index, TemplatesManager.TemplatePragmaBeforeTag + "\n" + col[ i ].Groups[ 1 ].Value ); + } + } + //Detect SRP Batcher + MatchCollection srpMatch = Regex.Matches( shaderBody, TemplateHelperFunctions.SRPBatcherFindTag ); + for( int i = srpMatch.Count - 1; i >= 0; i-- ) + { + if( srpMatch[ i ].Groups.Count == 2 ) + { + shaderBody = shaderBody.Insert( srpMatch[ i ].Groups[ 0 ].Index + srpMatch[ i ].Groups[ 0 ].Length, TemplatesManager.TemplateSRPBatcherTag + srpMatch[ i ].Groups[ 1 ].Value ); + } + } + + + // Detect if template has LOD tag, if not, insert one + // It will be read and processed over the TemplateSubShader constructor + { + Match match = Regex.Match( shaderBody, TemplateHelperFunctions.SubShaderLODPattern ); + if( match == null || ( match != null && !match.Success ) ) + { + MatchCollection subShaderMatch = Regex.Matches( shaderBody, TemplatesManager.TemplateMPSubShaderTag ); + + int subShaderAmount = subShaderMatch.Count; + + for( int i = subShaderAmount - 1; i > -1; i-- ) + { + if( subShaderMatch[ i ].Success ) + { + shaderBody = shaderBody.Insert( subShaderMatch[ i ].Index + subShaderMatch[ i ].Length, "\n\t\t\tLOD 0\n" ); + } + } + } + } + m_shaderData = TemplateShaderInfoUtil.CreateShaderData( shaderBody ); + if( m_shaderData == null ) + { + m_isValid = false; + return; + } + + m_templateIdManager = new TemplateIdManager( shaderBody ); + + try + { + int nameBegin = shaderBody.IndexOf( TemplatesManager.TemplateShaderNameBeginTag ); + if( nameBegin < 0 ) + { + // Not a template + return; + } + + int nameEnd = shaderBody.IndexOf( TemplatesManager.TemplateFullEndTag, nameBegin ); + if( nameEnd < 0 ) + return; + + + m_shaderBody = shaderBody; + int defaultBegin = nameBegin + TemplatesManager.TemplateShaderNameBeginTag.Length; + int defaultLength = nameEnd - defaultBegin; + m_defaultShaderName = shaderBody.Substring( defaultBegin, defaultLength ); + int[] nameIdx = m_defaultShaderName.AllIndexesOf( "\"" ); + nameIdx[ 0 ] += 1; // Ignore the " character from the string + m_defaultShaderName = m_defaultShaderName.Substring( nameIdx[ 0 ], nameIdx[ 1 ] - nameIdx[ 0 ] ); + m_shaderNameId = shaderBody.Substring( nameBegin, nameEnd + TemplatesManager.TemplateFullEndTag.Length - nameBegin ); + m_templateProperties.AddId( shaderBody, m_shaderNameId, false ); + m_templateIdManager.RegisterId( nameBegin, m_shaderNameId, m_shaderNameId ); + shaderBody = shaderBody.Substring( nameEnd + TemplatesManager.TemplateFullEndTag.Length ); + } + catch( Exception e ) + { + Debug.LogException( e ); + m_isValid = false; + } + + m_customTemplatePropertyUI = TemplateHelperFunctions.FetchCustomUI( shaderBody ); + TemplateHelperFunctions.FetchDependencies( m_dependenciesContainer, ref m_shaderBody ); + if( m_dependenciesContainer.IsValid ) + { + int index = m_dependenciesContainer.Id.IndexOf( TemplatesManager.TemplateDependenciesListTag ); + m_templateProperties.AddId( new TemplateProperty( m_dependenciesContainer.Id, m_dependenciesContainer.Id.Substring( 0, index ), true ) ); + m_templateIdManager.RegisterId( m_dependenciesContainer.Index, m_dependenciesContainer.Id, m_dependenciesContainer.Id ); + } + + TemplateHelperFunctions.FetchCustomInspector( m_customInspectorContainer, ref m_shaderBody ); + if( m_customInspectorContainer.IsValid ) + { + int index = m_customInspectorContainer.Id.IndexOf( "CustomEditor" ); + m_templateProperties.AddId( new TemplateProperty( m_customInspectorContainer.Id, m_customInspectorContainer.Id.Substring( 0, index ), true ) ); + m_templateIdManager.RegisterId( m_customInspectorContainer.Index, m_customInspectorContainer.Id, m_customInspectorContainer.Id ); + } + + TemplateHelperFunctions.FetchFallback( m_fallbackContainer, ref m_shaderBody ); + if( m_fallbackContainer.IsValid ) + { + int index = m_fallbackContainer.Id.IndexOf( "Fallback", StringComparison.InvariantCultureIgnoreCase ); + m_templateProperties.AddId( new TemplateProperty( m_fallbackContainer.Id, m_fallbackContainer.Id.Substring( 0, index ), true ) ); + m_templateIdManager.RegisterId( m_fallbackContainer.Index, m_fallbackContainer.Id, m_fallbackContainer.Id ); + } + + m_lodInjectorId = m_shaderBody.IndexOf( TemplatesManager.TemplateLODsTag ); + + // Shader body may have been changed to inject inexisting tags like fallback + m_templateIdManager.ShaderBody = m_shaderBody; + + m_propertyTag = new TemplateTagData( m_shaderData.PropertyStartIdx, TemplatesManager.TemplatePropertyTag, true ); + m_templateIdManager.RegisterId( m_shaderData.PropertyStartIdx, TemplatesManager.TemplatePropertyTag, TemplatesManager.TemplatePropertyTag ); + m_templateProperties.AddId( shaderBody, TemplatesManager.TemplatePropertyTag, true ); + Dictionary duplicatesHelper = new Dictionary(); + TemplateHelperFunctions.CreateShaderPropertiesList( m_shaderData.Properties, ref m_availableShaderProperties, ref duplicatesHelper,-1,-1 ); + for( int i = 0; i < m_availableShaderProperties.Count; i++ ) + { + m_templateIdManager.RegisterId( m_availableShaderProperties[ i ].Index, m_availableShaderProperties[ i ].FullValue, m_availableShaderProperties[ i ].FullValue ); + } + + int subShaderCount = m_shaderData.SubShaders.Count; + + int mainSubShaderIdx = -1; + int mainPassIdx = -1; + + int firstVisibleSubShaderId = -1; + int firstVisiblePassId = -1; + bool foundMainPass = false; + bool foundFirstVisible = false; + + m_templateIdManager.RegisterTag( TemplatesManager.TemplatePassesEndTag ); + m_templateIdManager.RegisterTag( TemplatesManager.TemplateMainPassTag ); + + //SHADER MODEL + { + Match shaderModelMatch = Regex.Match( m_shaderData.Properties, TemplateHelperFunctions.ShaderModelPattern ); + if( shaderModelMatch != null && shaderModelMatch.Success ) + { + if( TemplateHelperFunctions.AvailableInterpolators.ContainsKey( shaderModelMatch.Groups[ 1 ].Value ) ) + { + m_globalShaderModel.Id = shaderModelMatch.Groups[ 0 ].Value; + m_globalShaderModel.StartIdx = shaderModelMatch.Index; + m_globalShaderModel.Value = shaderModelMatch.Groups[ 1 ].Value; + m_globalShaderModel.InterpolatorAmount = TemplateHelperFunctions.AvailableInterpolators[ shaderModelMatch.Groups[ 1 ].Value ]; + m_globalShaderModel.DataCheck = TemplateDataCheck.Valid; + } + else + { + m_globalShaderModel.DataCheck = TemplateDataCheck.Invalid; + } + } + } + // + + + for( int i = 0; i < subShaderCount; i++ ) + { + TemplateSubShader subShader = new TemplateSubShader(this, i, m_templateIdManager, "SubShader" + i, m_shaderData.SubShaders[ i ], ref duplicatesHelper ); + + if( subShader.FoundMainPass ) + { + if( !foundMainPass ) + { + foundMainPass = true; + mainSubShaderIdx = i; + mainPassIdx = subShader.MainPass; + } + } + else if( subShader.MainPass > -1 ) + { + if( !foundFirstVisible ) + { + foundFirstVisible = true; + firstVisibleSubShaderId = i; + firstVisiblePassId = subShader.MainPass; + } + } + + m_subShaders.Add( subShader ); + m_masterNodesRequired += subShader.Passes.Count; + } + + + if( !foundMainPass && foundFirstVisible ) + { + mainSubShaderIdx = firstVisibleSubShaderId; + mainPassIdx = firstVisiblePassId; + } + + for( int subShaderIdx = 0; subShaderIdx < subShaderCount; subShaderIdx++ ) + { + m_subShaders[ subShaderIdx ].Modules.RegisterInternalUnityInlines( ref m_availableShaderProperties , ref duplicatesHelper ); + int passCount = m_subShaders[ subShaderIdx ].Passes.Count; + for( int passIdx = 0; passIdx < passCount; passIdx++ ) + { + m_subShaders[ subShaderIdx ].Passes[ passIdx ].Modules.RegisterInternalUnityInlines( ref m_availableShaderProperties, ref duplicatesHelper ); + m_subShaders[ subShaderIdx ].Passes[ passIdx ].IsMainPass = ( mainSubShaderIdx == subShaderIdx && mainPassIdx == passIdx ); + } + } + + duplicatesHelper.Clear(); + duplicatesHelper = null; + m_isSinglePass = ( m_subShaders.Count == 1 && m_subShaders[ 0 ].PassAmount == 1 ); + + } + + public void ResetState() + { + m_templateIdManager.ResetRegistersState(); + int subshaderCount = m_subShaders.Count; + for( int subShaderIdx = 0; subShaderIdx < subshaderCount; subShaderIdx++ ) + { + m_subShaders[ subShaderIdx ].TemplateProperties.ResetTemplateUsageData(); + int passCount = m_subShaders[ subShaderIdx ].Passes.Count; + for( int passIdx = 0; passIdx < passCount; passIdx++ ) + { + m_subShaders[ subShaderIdx ].Passes[ passIdx ].TemplateProperties.ResetTemplateUsageData(); + } + } + } + + public override void Destroy() + { + m_templateProperties.Destroy(); + m_templateProperties = null; + + m_availableShaderProperties.Clear(); + m_availableShaderProperties = null; + if( m_allShaderProperties != null ) + { + m_allShaderProperties.Clear(); + m_allShaderProperties = null; + } + + int subShaderCount = m_subShaders.Count; + for( int i = 0; i < subShaderCount; i++ ) + { + m_subShaders[ i ].Destroy(); + } + + m_subShaders.Clear(); + m_subShaders = null; + + m_templateIdManager.Destroy(); + m_templateIdManager = null; + } + + public void SetSubShaderData( TemplateModuleDataType type, int subShaderId, string[] list ) + { + string id = GetSubShaderDataId( type, subShaderId, false ); + string body = string.Empty; + FillTemplateBody( subShaderId, -1, id, ref body, list ); + SetSubShaderData( type, subShaderId, body ); + } + + public void SetSubShaderData( TemplateModuleDataType type, int subShaderId, List list ) + { + string id = GetSubShaderDataId( type, subShaderId, false ); + string body = string.Empty; + FillTemplateBody( subShaderId, -1, id, ref body, list ); + SetSubShaderData( type, subShaderId, body ); + } + + public void SetSubShaderData( TemplateModuleDataType type, int subShaderId, string text ) + { + if( subShaderId >= m_subShaders.Count ) + return; + + string prefix = m_subShaders[ subShaderId ].Modules.UniquePrefix; + switch( type ) + { + case TemplateModuleDataType.AllModules: + { + m_templateIdManager.SetReplacementText( prefix + TemplatesManager.TemplateAllModulesTag, text ); + } + break; + case TemplateModuleDataType.ModuleShaderModel: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.ShaderModel.Id, text ); + } + break; + case TemplateModuleDataType.ModuleBlendMode: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.BlendData.BlendModeId, text ); + } + break; + case TemplateModuleDataType.ModuleBlendMode1: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.BlendData1.BlendModeId, text ); + } + break; + case TemplateModuleDataType.ModuleBlendMode2: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.BlendData2.BlendModeId, text ); + } + break; + case TemplateModuleDataType.ModuleBlendMode3: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.BlendData3.BlendModeId, text ); + } + break; + case TemplateModuleDataType.ModuleBlendOp: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.BlendData.BlendOpId, text ); + } + break; + case TemplateModuleDataType.ModuleBlendOp1: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.BlendData1.BlendOpId, text ); + } + break; + case TemplateModuleDataType.ModuleBlendOp2: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.BlendData2.BlendOpId, text ); + } + break; + case TemplateModuleDataType.ModuleBlendOp3: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.BlendData3.BlendOpId, text ); + } + break; + case TemplateModuleDataType.ModuleAlphaToMask: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.AlphaToMaskData.AlphaToMaskId, text ); + } + break; + case TemplateModuleDataType.ModuleCullMode: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.CullModeData.CullModeId, text ); + } + break; + case TemplateModuleDataType.ModuleColorMask: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.ColorMaskData.ColorMaskId, text ); + } + break; + case TemplateModuleDataType.ModuleColorMask1: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.ColorMaskData1.ColorMaskId, text ); + } + break; + case TemplateModuleDataType.ModuleColorMask2: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.ColorMaskData2.ColorMaskId, text ); + } + break; + case TemplateModuleDataType.ModuleColorMask3: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.ColorMaskData3.ColorMaskId, text ); + } + break; + case TemplateModuleDataType.ModuleStencil: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.StencilData.StencilBufferId, text ); + } + break; + case TemplateModuleDataType.ModuleZwrite: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.DepthData.ZWriteModeId, text ); + } + break; + case TemplateModuleDataType.ModuleZTest: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.DepthData.ZTestModeId, text ); + } + break; + case TemplateModuleDataType.ModuleZOffset: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.DepthData.OffsetId, text ); + } + break; + case TemplateModuleDataType.ModuleTag: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.TagData.TagsId, text ); + } + break; + case TemplateModuleDataType.ModuleGlobals: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.GlobalsTag.Id, text ); + } + break; + case TemplateModuleDataType.ModuleSRPBatcher: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.SRPBatcherTag.Id, text ); + } + break; + case TemplateModuleDataType.ModuleFunctions: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.FunctionsTag.Id, text ); + } + break; + case TemplateModuleDataType.ModulePragma: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.PragmaTag.Id, text ); + } + break; + case TemplateModuleDataType.ModulePragmaBefore: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.PragmaBeforeTag.Id, text ); + } + break; + case TemplateModuleDataType.ModulePass: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.PassTag.Id, text ); + } + break; + case TemplateModuleDataType.ModuleInputVert: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.InputsVertTag.Id, text ); + } + break; + case TemplateModuleDataType.ModuleInputFrag: + { + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Modules.InputsFragTag.Id, text ); + } + break; + } + } + + public void SetPropertyData( string[] properties ) + { + string body = string.Empty; + FillTemplateBody( -1, -1, TemplatesManager.TemplatePropertyTag, ref body, properties ); + SetPropertyData( body ); + } + + + public void SetPropertyData( string text ) + { + m_templateIdManager.SetReplacementText( m_propertyTag.Id, text ); + } + + public string GetSubShaderDataId( TemplateModuleDataType type, int subShaderId, bool addPrefix ) + { + if( subShaderId >= m_subShaders.Count ) + return string.Empty; + + string prefix = string.Empty; + switch( type ) + { + case TemplateModuleDataType.AllModules: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + TemplatesManager.TemplateAllModulesTag; + } + case TemplateModuleDataType.ModuleBlendMode: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.BlendData.BlendModeId; + } + case TemplateModuleDataType.ModuleBlendMode1: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.BlendData1.BlendModeId; + } + case TemplateModuleDataType.ModuleBlendMode2: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.BlendData2.BlendModeId; + } + case TemplateModuleDataType.ModuleBlendMode3: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.BlendData3.BlendModeId; + } + case TemplateModuleDataType.ModuleBlendOp: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.BlendData.BlendOpId; + } + case TemplateModuleDataType.ModuleBlendOp1: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.BlendData1.BlendOpId; + } + case TemplateModuleDataType.ModuleBlendOp2: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.BlendData2.BlendOpId; + } + case TemplateModuleDataType.ModuleBlendOp3: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.BlendData3.BlendOpId; + } + case TemplateModuleDataType.ModuleAlphaToMask: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.AlphaToMaskData.AlphaToMaskId; + } + case TemplateModuleDataType.ModuleCullMode: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.CullModeData.CullModeId; + } + case TemplateModuleDataType.ModuleColorMask: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.ColorMaskData.ColorMaskId; + } + case TemplateModuleDataType.ModuleColorMask1: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.ColorMaskData1.ColorMaskId; + } + case TemplateModuleDataType.ModuleColorMask2: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.ColorMaskData2.ColorMaskId; + } + case TemplateModuleDataType.ModuleColorMask3: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.ColorMaskData3.ColorMaskId; + } + case TemplateModuleDataType.ModuleStencil: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.StencilData.StencilBufferId; + } + case TemplateModuleDataType.ModuleZwrite: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.DepthData.ZWriteModeId; + } + case TemplateModuleDataType.ModuleZTest: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.DepthData.ZTestModeId; + } + case TemplateModuleDataType.ModuleZOffset: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.DepthData.OffsetId; + } + case TemplateModuleDataType.ModuleTag: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.TagData.TagsId; + } + case TemplateModuleDataType.ModuleGlobals: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.GlobalsTag.Id; + } + case TemplateModuleDataType.ModuleSRPBatcher: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.SRPBatcherTag.Id; + } + case TemplateModuleDataType.ModuleFunctions: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.FunctionsTag.Id; + } + case TemplateModuleDataType.ModulePragma: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.PragmaTag.Id; + } + case TemplateModuleDataType.ModulePragmaBefore: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.PragmaBeforeTag.Id; + } + case TemplateModuleDataType.ModulePass: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.PassTag.Id; + } + case TemplateModuleDataType.ModuleInputVert: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.InputsVertTag.Id; + } + case TemplateModuleDataType.ModuleInputFrag: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Modules.InputsFragTag.Id; + } + } + return string.Empty; + + } + public string GetPassDataId( TemplateModuleDataType type, int subShaderId, int passId, bool addPrefix ) + { + if( subShaderId >= m_subShaders.Count || passId >= m_subShaders[ subShaderId ].Passes.Count ) + return string.Empty; + + string prefix = string.Empty; + switch( type ) + { + case TemplateModuleDataType.AllModules: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + TemplatesManager.TemplateAllModulesTag; + } + case TemplateModuleDataType.ModuleBlendMode: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.BlendData.BlendModeId; + } + case TemplateModuleDataType.ModuleBlendMode1: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.BlendData1.BlendModeId; + } + case TemplateModuleDataType.ModuleBlendMode2: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.BlendData2.BlendModeId; + } + case TemplateModuleDataType.ModuleBlendMode3: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.BlendData3.BlendModeId; + } + case TemplateModuleDataType.ModuleBlendOp: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.BlendData.BlendOpId; + } + case TemplateModuleDataType.ModuleBlendOp1: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.BlendData1.BlendOpId; + } + case TemplateModuleDataType.ModuleBlendOp2: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.BlendData2.BlendOpId; + } + case TemplateModuleDataType.ModuleBlendOp3: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.BlendData3.BlendOpId; + } + case TemplateModuleDataType.ModuleAlphaToMask: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.AlphaToMaskData.AlphaToMaskId; + } + case TemplateModuleDataType.ModuleCullMode: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.CullModeData.CullModeId; + } + case TemplateModuleDataType.ModuleColorMask: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.ColorMaskData.ColorMaskId; + } + case TemplateModuleDataType.ModuleColorMask1: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.ColorMaskData1.ColorMaskId; + } + case TemplateModuleDataType.ModuleColorMask2: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.ColorMaskData2.ColorMaskId; + } + case TemplateModuleDataType.ModuleColorMask3: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.ColorMaskData3.ColorMaskId; + } + case TemplateModuleDataType.ModuleStencil: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.StencilData.StencilBufferId; + } + case TemplateModuleDataType.ModuleZwrite: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.DepthData.ZWriteModeId; + } + case TemplateModuleDataType.ModuleZTest: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.DepthData.ZTestModeId; + } + case TemplateModuleDataType.ModuleZOffset: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.DepthData.OffsetId; + } + case TemplateModuleDataType.ModuleTag: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.TagData.TagsId; + } + case TemplateModuleDataType.ModuleGlobals: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.GlobalsTag.Id; + } + case TemplateModuleDataType.ModuleSRPBatcher: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.SRPBatcherTag.Id; + } + case TemplateModuleDataType.ModuleFunctions: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.FunctionsTag.Id; + } + case TemplateModuleDataType.ModulePragma: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.PragmaTag.Id; + } + case TemplateModuleDataType.ModulePragmaBefore: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.PragmaBeforeTag.Id; + } + case TemplateModuleDataType.ModulePass: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.PassTag.Id; + } + case TemplateModuleDataType.ModuleInputVert: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.InputsVertTag.Id; + } + case TemplateModuleDataType.ModuleInputFrag: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.InputsFragTag.Id; + } + case TemplateModuleDataType.PassVertexFunction: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].VertexFunctionData.Id; + } + case TemplateModuleDataType.PassFragmentFunction: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].FragmentFunctionData.Id; + } + case TemplateModuleDataType.PassVertexData: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].VertexDataContainer.VertexDataId; + } + case TemplateModuleDataType.PassInterpolatorData: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].InterpolatorDataContainer.InterpDataId; + } + case TemplateModuleDataType.VControl: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].TessVControlTag.Id; + } + case TemplateModuleDataType.ControlData: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].TessControlData.Id; + } + case TemplateModuleDataType.DomainData: + { + prefix = addPrefix ? m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix : string.Empty; + return prefix + m_subShaders[ subShaderId ].Passes[ passId ].TessDomainData.Id; + } + } + return string.Empty; + } + + public void SetPassData( TemplateModuleDataType type, int subShaderId, int passId, string[] list ) + { + //if( list == null || list.Length == 0 ) + // return; + + string id = GetPassDataId( type, subShaderId, passId, false ); + string body = string.Empty; + FillTemplateBody( subShaderId, passId, id, ref body, list ); + SetPassData( type, subShaderId, passId, body ); + } + + public void SetPassData( TemplateModuleDataType type, int subShaderId, int passId, List list ) + { + //if( list == null || list.Count == 0 ) + // return; + + string id = GetPassDataId( type, subShaderId, passId, false ); + string body = string.Empty; + FillTemplateBody( subShaderId, passId, id, ref body, list ); + SetPassData( type, subShaderId, passId, body ); + } + + public void SetPassData( TemplateModuleDataType type, int subShaderId, int passId, string text ) + { + if( subShaderId >= m_subShaders.Count || passId >= m_subShaders[ subShaderId ].Passes.Count ) + return; + + string prefix = string.Empty; + switch( type ) + { + //case TemplateModuleDataType.EndPass: + //{ + // prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix; + // m_templateIdManager.SetReplacementText( prefix + TemplatesManager.TemplateEndPassTag, text ); + //} + //break; + case TemplateModuleDataType.AllModules: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + TemplatesManager.TemplateAllModulesTag, text ); + } + break; + case TemplateModuleDataType.ModuleShaderModel: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.ShaderModel.Id, text ); + } + break; + case TemplateModuleDataType.ModuleBlendMode: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.BlendData.BlendModeId, text ); + } + break; + case TemplateModuleDataType.ModuleBlendMode1: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.BlendData1.BlendModeId, text ); + } + break; + case TemplateModuleDataType.ModuleBlendMode2: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.BlendData2.BlendModeId, text ); + } + break; + case TemplateModuleDataType.ModuleBlendMode3: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.BlendData3.BlendModeId, text ); + } + break; + case TemplateModuleDataType.ModuleBlendOp: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.BlendData.BlendOpId, text ); + } + break; + case TemplateModuleDataType.ModuleBlendOp1: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.BlendData1.BlendOpId, text ); + } + break; + case TemplateModuleDataType.ModuleBlendOp2: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.BlendData2.BlendOpId, text ); + } + break; + case TemplateModuleDataType.ModuleBlendOp3: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.BlendData3.BlendOpId, text ); + } + break; + case TemplateModuleDataType.ModuleAlphaToMask: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.AlphaToMaskData.AlphaToMaskId, text ); + } + break; + case TemplateModuleDataType.ModuleCullMode: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.CullModeData.CullModeId, text ); + } + break; + case TemplateModuleDataType.ModuleColorMask: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.ColorMaskData.ColorMaskId, text ); + } + break; + case TemplateModuleDataType.ModuleColorMask1: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.ColorMaskData1.ColorMaskId, text ); + } + break; + case TemplateModuleDataType.ModuleColorMask2: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.ColorMaskData2.ColorMaskId, text ); + } + break; + case TemplateModuleDataType.ModuleColorMask3: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.ColorMaskData3.ColorMaskId, text ); + } + break; + case TemplateModuleDataType.ModuleStencil: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.StencilData.StencilBufferId, text ); + } + break; + case TemplateModuleDataType.ModuleZwrite: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.DepthData.ZWriteModeId, text ); + } + break; + case TemplateModuleDataType.ModuleZTest: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.DepthData.ZTestModeId, text ); + } + break; + case TemplateModuleDataType.ModuleZOffset: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.DepthData.OffsetId, text ); + } + break; + case TemplateModuleDataType.ModuleTag: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.TagData.TagsId, text ); + } + break; + case TemplateModuleDataType.ModuleGlobals: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.GlobalsTag.Id, text ); + } + break; + case TemplateModuleDataType.ModuleSRPBatcher: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.SRPBatcherTag.Id, text ); + } + break; + case TemplateModuleDataType.ModuleFunctions: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.FunctionsTag.Id, text ); + } + break; + case TemplateModuleDataType.ModulePragma: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.PragmaTag.Id, text ); + } + break; + case TemplateModuleDataType.ModulePragmaBefore: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.PragmaBeforeTag.Id, text ); + } + break; + case TemplateModuleDataType.ModulePass: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.PassTag.Id, text ); + } + break; + case TemplateModuleDataType.ModuleInputVert: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.InputsVertTag.Id, text ); + } + break; + case TemplateModuleDataType.ModuleInputFrag: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].Modules.UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].Modules.InputsFragTag.Id, text ); + } + break; + case TemplateModuleDataType.PassVertexFunction: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].VertexFunctionData.Id, text ); + } + break; + case TemplateModuleDataType.PassFragmentFunction: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].FragmentFunctionData.Id, text ); + } + break; + case TemplateModuleDataType.PassVertexData: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].VertexDataContainer.VertexDataId, text ); + } + break; + case TemplateModuleDataType.PassInterpolatorData: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].InterpolatorDataContainer.InterpDataId, text ); + } + break; + case TemplateModuleDataType.PassNameData: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].PassNameContainer.Id, text ); + } + break; + case TemplateModuleDataType.VControl: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].TessVControlTag.Id, text ); + } + break; + case TemplateModuleDataType.ControlData: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].TessControlData.Id, text ); + } + break; + case TemplateModuleDataType.DomainData: + { + prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].TessDomainData.Id, text ); + } + break; + } + } + + public void SetPassInputData( int subShaderId, int passId, int inputId, string text ) + { + if( subShaderId >= m_subShaders.Count || + passId >= m_subShaders[ subShaderId ].Passes.Count ) + return; + + string prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix; + TemplateInputData inputData = m_subShaders[ subShaderId ].Passes[ passId ].InputDataFromId( inputId ); + if( inputData != null ) + { + m_templateIdManager.SetReplacementText( prefix + inputData.TagId, text ); + } + else + { + Debug.LogErrorFormat( "Unable to find input data for port with id {0} on subshader {1} pass {2}", inputId, subShaderId, passId ); + } + } + + public void SetPassInputDataByArrayIdx( int subShaderId, int passId, int inputId, string text ) + { + if( subShaderId >= m_subShaders.Count || + passId >= m_subShaders[ subShaderId ].Passes.Count || + inputId >= m_subShaders[ subShaderId ].Passes[ passId ].InputDataList.Count ) + return; + + string prefix = m_subShaders[ subShaderId ].Passes[ passId ].UniquePrefix; + m_templateIdManager.SetReplacementText( prefix + m_subShaders[ subShaderId ].Passes[ passId ].InputDataList[ inputId ].TagId, text ); + } + + public TemplateData CreateTemplateData( string name, string guid, int subShaderId, int passId ) + { + if( subShaderId >= m_subShaders.Count || + passId >= m_subShaders[ subShaderId ].Passes.Count ) + return null; + + if( string.IsNullOrEmpty( name ) ) + name = m_defaultShaderName; + + TemplateData templateData = ScriptableObject.CreateInstance(); + templateData.Name = name; + templateData.GUID = guid; + templateData.TemplateBody = m_shaderBody; + templateData.DefaultShaderName = m_defaultShaderName; + templateData.ShaderNameId = m_shaderNameId; + templateData.OrderId = m_orderId; + + templateData.InputDataList = SubShaders[ subShaderId ].Passes[ passId ].InputDataList; + templateData.VertexDataContainer = SubShaders[ subShaderId ].Passes[ passId ].VertexDataContainer; + templateData.InterpolatorDataContainer = SubShaders[ subShaderId ].Passes[ passId ].InterpolatorDataContainer; + templateData.AvailableShaderProperties = m_availableShaderProperties; + templateData.VertexFunctionData = SubShaders[ subShaderId ].Passes[ passId ].VertexFunctionData; + templateData.FragmentFunctionData = SubShaders[ subShaderId ].Passes[ passId ].FragmentFunctionData; + templateData.BlendData = SubShaders[ subShaderId ].Passes[ passId ].Modules.BlendData; + templateData.CullModeData = SubShaders[ subShaderId ].Passes[ passId ].Modules.CullModeData; + templateData.ColorMaskData = SubShaders[ subShaderId ].Passes[ passId ].Modules.ColorMaskData; + templateData.StencilData = SubShaders[ subShaderId ].Passes[ passId ].Modules.StencilData; + templateData.DepthData = SubShaders[ subShaderId ].Passes[ passId ].Modules.DepthData; + templateData.TagData = SubShaders[ subShaderId ].Passes[ passId ].Modules.TagData; + + //templateData.PropertyList = m_pr; + //private Dictionary m_propertyDict = new Dictionary(); + + return templateData; + } + + public bool FillTemplateBody( int subShaderId, int passId, string id, ref string body, List values ) + { + if( values.Count == 0 ) + { + return true; + } + + string[] array = new string[ values.Count ]; + for( int i = 0; i < values.Count; i++ ) + { + array[ i ] = values[ i ].PropertyName; + } + return FillTemplateBody( subShaderId, passId, id, ref body, array ); + } + + public bool FillTemplateBody( int subShaderId, int passId, string id, ref string body, params string[] values ) + { + if( values.Length == 0 ) + { + if( id[ id.Length - 1 ] == '\n' ) + body = "\n"; + + return true; + } + + TemplatePropertyContainer propertyContainer = null; + if( subShaderId >= 0 ) + { + if( passId >= 0 ) + { + propertyContainer = SubShaders[ subShaderId ].Passes[ passId ].TemplateProperties; + } + else + { + propertyContainer = SubShaders[ subShaderId ].TemplateProperties; + } + } + else + { + propertyContainer = m_templateProperties; + } + + propertyContainer.BuildInfo(); + + if( propertyContainer.PropertyDict.ContainsKey( id ) ) + { + string finalValue = propertyContainer.PropertyDict[ id ].UseIndentationAtStart ? propertyContainer.PropertyDict[ id ].Indentation : string.Empty; + for( int i = 0; i < values.Length; i++ ) + { + + if( propertyContainer.PropertyDict[ id ].AutoLineFeed ) + { + string[] valuesArr = values[ i ].Split( '\n' ); + for( int j = 0; j < valuesArr.Length; j++ ) + { + //first value will be automatically indented by the string replace + finalValue += ( ( i == 0 && j == 0 ) ? string.Empty : propertyContainer.PropertyDict[ id ].Indentation ) + valuesArr[ j ]; + finalValue += TemplatesManager.TemplateNewLine; + } + } + else + { + //first value will be automatically indented by the string replace + finalValue += ( i == 0 ? string.Empty : propertyContainer.PropertyDict[ id ].Indentation ) + values[ i ]; + } + } + + body = finalValue; + propertyContainer.PropertyDict[ id ].Used = true; + return true; + } + + if( values.Length > 1 || !string.IsNullOrEmpty( values[ 0 ] ) ) + { + UIUtils.ShowMessage( string.Format( "Attempting to write data into inexistant tag {0}. Please review the template {1} body and consider adding the missing tag.", id, m_defaultShaderName ), MessageSeverity.Error ); + return false; + } + return true; + } + + public bool FillVertexInstructions( int subShaderId, int passId, params string[] values ) + { + TemplateFunctionData vertexFunctionData = SubShaders[ subShaderId ].Passes[ passId ].VertexFunctionData; + if( vertexFunctionData != null && !string.IsNullOrEmpty( vertexFunctionData.Id ) ) + { + string body = string.Empty; + bool isValid = FillTemplateBody( subShaderId, passId, vertexFunctionData.Id, ref body, values ); + SetPassData( TemplateModuleDataType.PassVertexFunction, subShaderId, passId, body ); + return isValid; + } + + if( values.Length > 0 ) + { + UIUtils.ShowMessage( "Attemping to add vertex instructions on a template with no assigned vertex code area", MessageSeverity.Error ); + return false; + } + return true; + } + + public bool FillFragmentInstructions( int subShaderId, int passId, params string[] values ) + { + TemplateFunctionData fragmentFunctionData = SubShaders[ subShaderId ].Passes[ passId ].FragmentFunctionData; + if( fragmentFunctionData != null && !string.IsNullOrEmpty( fragmentFunctionData.Id ) ) + { + string body = string.Empty; + bool isValid = FillTemplateBody( subShaderId, passId, fragmentFunctionData.Id, ref body, values ); + SetPassData( TemplateModuleDataType.PassFragmentFunction, subShaderId, passId, body ); + return isValid; + } + + if( values.Length > 0 ) + { + UIUtils.ShowMessage( "Attemping to add fragment instructions on a template with no assigned vertex code area", MessageSeverity.Error ); + return false; + } + return true; + } + + public void SetShaderName( string name ) + { + m_templateIdManager.SetReplacementText( m_shaderNameId, name ); + } + + public void SetCustomInspector( string customInspector ) + { + if( m_customInspectorContainer.Index > -1 ) + { + m_templateIdManager.SetReplacementText( m_customInspectorContainer.Id, m_templateProperties.PropertyDict[ m_customInspectorContainer.Id ].Indentation + customInspector ); + } + } + + public void SetFallback( string fallback ) + { + if( m_fallbackContainer.Index > -1 ) + { + m_templateIdManager.SetReplacementText( m_fallbackContainer.Id, m_templateProperties.PropertyDict[ m_fallbackContainer.Id ].Indentation + fallback ); + } + } + + public void SetDependencies( string dependencies ) + { + if( m_dependenciesContainer.Index > -1 ) + { + m_templateIdManager.SetReplacementText( m_dependenciesContainer.Id, dependencies ); + } + } + + private void OnEnable() + { + hideFlags = HideFlags.HideAndDontSave; + } + + public override bool Reload() + { + m_propertyTag = null; + m_shaderNameId = string.Empty; + m_shaderBody = string.Empty; + m_isSinglePass = false; + m_masterNodesRequired = 0; + m_beforePragmaContainer.Reset(); + m_customInspectorContainer.Reset(); + m_fallbackContainer.Reset(); + m_dependenciesContainer.Reset(); + m_availableShaderProperties.Clear(); + int count = m_subShaders.Count; + for( int i = 0; i < count; i++ ) + { + m_subShaders[ i ].Destroy(); + } + m_subShaders.Clear(); + + m_templateIdManager.Reset(); + if( m_shaderData != null ) + m_shaderData.Destroy(); + + m_templateProperties.Reset(); + + string oldName = m_defaultShaderName; + LoadTemplateBody( m_guid ); + + if( m_communityTemplate ) + Name = m_defaultShaderName; + + return !oldName.Equals( m_defaultShaderName ); + } + + public bool GetSubShaderandPassFor( string passUniqueId, ref int subShaderId, ref int passId ) + { + if( string.IsNullOrEmpty( passUniqueId ) ) + return false; + + if( m_passUniqueIdData.Count == 0 ) + { + for( int subShaderIdx = 0; subShaderIdx < m_subShaders.Count; subShaderIdx++ ) + { + for( int passIdx = 0; passIdx < m_subShaders[ subShaderIdx ].Passes.Count; passIdx++ ) + { + if( m_subShaders[ subShaderIdx ].Passes[ passIdx ].Modules.HasPassUniqueName ) + { + if( m_passUniqueIdData.ContainsKey( m_subShaders[ subShaderIdx ].Passes[ passIdx ].Modules.PassUniqueName ) ) + { + Debug.LogErrorFormat( "Found duplicate pass name '{0}' over template. Please fix template as it will result in multiple errors.", m_subShaders[ subShaderIdx ].Passes[ passIdx ].Modules.PassUniqueName ); + return false; + } + m_passUniqueIdData.Add( m_subShaders[ subShaderIdx ].Passes[ passIdx ].Modules.PassUniqueName, new TemplateUniquePassData() { PassIdx = passIdx, SubShaderIdx = subShaderIdx } ); + } + } + } + } + + if( m_passUniqueIdData.ContainsKey( passUniqueId ) ) + { + subShaderId = m_passUniqueIdData[ passUniqueId ].SubShaderIdx; + passId = m_passUniqueIdData[ passUniqueId ].PassIdx; + return true; + } + subShaderId = -1; + passId = -1; + return false; + } + + public TemplateShaderPropertyData GetShaderPropertyData( string propertyName ) + { + return m_availableShaderProperties.Find( ( x ) => ( x.PropertyName.Equals( propertyName ) ) ); + } + + public TemplateSRPType SRPtype { get { return m_subShaders[ 0 ].Modules.SRPType; } } + //public bool SRPIsPBRHD { get { return m_subShaders[0].Modules.SRPIsPBRHD ; } } + public List SubShaders { get { return m_subShaders; } } + public List AvailableShaderProperties { get { return m_availableShaderProperties; } } + public List AllShaderProperties + { + get + { + if( m_allShaderProperties == null ) + { + m_allShaderProperties = new List(); + if( AvailableShaderProperties.Count > 0 ) + { + m_allShaderProperties.AddRange( AvailableShaderProperties ); + } + + for( int subShaderIdx = 0; subShaderIdx < SubShaders.Count; subShaderIdx++ ) + { + if( SubShaders[ subShaderIdx ].AvailableShaderGlobals.Count > 0 ) + { + m_allShaderProperties.AddRange( SubShaders[ subShaderIdx ].AvailableShaderGlobals ); + } + + for( int passIdx = 0; passIdx < SubShaders[ subShaderIdx ].Passes.Count; passIdx++ ) + { + if( SubShaders[ subShaderIdx ].Passes[ passIdx ].AvailableShaderGlobals.Count > 0 ) + { + m_allShaderProperties.AddRange( SubShaders[ subShaderIdx ].Passes[ passIdx ].AvailableShaderGlobals ); + } + } + } + } + + + return m_allShaderProperties; + } + } + + public TemplateTagData PropertyTag { get { return m_propertyTag; } } + public TemplateIdManager IdManager { get { return m_templateIdManager; } } + public TemplatePropertyContainer TemplateProperties { get { return m_templateProperties; } } + public TemplateInfoContainer CustomInspectorContainer { get { return m_customInspectorContainer; } } + public TemplateInfoContainer FallbackContainer { get { return m_fallbackContainer; } } + public TemplateInfoContainer BeforePragmaContainer { get { return m_beforePragmaContainer; } } + public bool IsSinglePass { get { return m_isSinglePass; } } + public int MasterNodesRequired { get { return m_masterNodesRequired; } } + public CustomTemplatePropertyUIEnum CustomTemplatePropertyUI { get { return m_customTemplatePropertyUI; } } + public bool CanAddLODs { get { return m_lodInjectorId > -1; } } + public TemplateShaderModelData GlobalShaderModel { get { return m_globalShaderModel; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMultiPass.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMultiPass.cs.meta new file mode 100644 index 0000000..00e2dee --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMultiPass.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4214390aa7f66364bbab454dc15a04ac +timeCreated: 1516981847 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMultiPassMasterNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMultiPassMasterNode.cs new file mode 100644 index 0000000..e9a9429 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMultiPassMasterNode.cs @@ -0,0 +1,3600 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +//#define SHOW_TEMPLATE_HELP_BOX + +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using System.Linq; + +namespace AmplifyShaderEditor +{ + public enum HDSRPMaterialType + { + SubsurfaceScattering, + Standard, + Specular, + Anisotropy, + Iridescence, + Translucent + } + + public enum InvisibilityStatus + { + LockedInvisible, + Invisible, + Visible + } + + public enum SetTemplateSource + { + NewShader, + ShaderLoad, + HotCodeReload + }; + + [Serializable] + [NodeAttributes( "Template Master Node", "Master", "Shader Generated according to template rules", null, KeyCode.None, false )] + public sealed class TemplateMultiPassMasterNode : MasterNode + { + private const double MaxLODEditTimestamp = 1; + + private static int PASS_SELECTOR_VERSION = 16200; + private static int PASS_UNIQUE_ID_VERSION = 16204; + + private const string LodNameId = "LODName"; + private const string LodValueId = "LODValue"; + + private const string LodSubtitle = "LOD( {0} )"; + private const string AdditionalLODsStr = "LODs"; + + private const string SubTitleFormatterStr = "(SubShader {0} Pass {1})"; + private const string NoSubShaderPropertyStr = "No Sub-Shader properties available"; + private const string NoPassPropertyStr = "No Pass properties available"; + + private const string WarningMessage = "Templates is a feature that is still heavily under development and users may experience some problems.\nPlease email support@amplify.pt if any issue occurs."; + private const string OpenTemplateStr = "Edit Template"; + private const string ReloadTemplateStr = "Reload Template"; + private const string CommonPropertiesStr = "Common Properties "; + private const string SubShaderModuleStr = "SubShader "; + private const string PassModuleStr = "Pass "; + + private const string PassNameStr = "Name"; + private const string PassNameFormateStr = "Name \"{0}\""; + private const string SubShaderLODValueLabel = "LOD Value"; + private const string SubShaderLODNameLabel = "LOD Name"; + + + + private bool m_reRegisterTemplateData = false; + private bool m_fireTemplateChange = false; + private bool m_fetchMasterNodeCategory = false; + + [SerializeField] + private string m_templateGUID = "4e1801f860093ba4f9eb58a4b556825b"; + + [SerializeField] + private int m_passIdx = 0; + + //[SerializeField] + //private string m_passIdxStr = string.Empty; + + [SerializeField] + private bool m_passFoldout = false; + + [SerializeField] + private int m_subShaderIdx = 0; + + //[SerializeField] + //private string m_subShaderIdxStr = string.Empty; + + [SerializeField] + private bool m_subStringFoldout = false; + + [SerializeField] + private bool m_lodFoldout = false; + + + [SerializeField] + private string m_mainLODName = string.Empty; + + //[SerializeField] + //private string m_subShaderLODStr; + + //[SerializeField] + //private bool m_mainMPMasterNode = false; + + [NonSerialized] + private TemplateMultiPass m_templateMultiPass = null; + + [NonSerialized] + private TemplateMultiPassMasterNode m_mainMasterNodeRef = null; + + [SerializeField] + private TemplateModulesHelper m_subShaderModule = new TemplateModulesHelper(); + + [SerializeField] + private TemplateModulesHelper m_passModule = new TemplateModulesHelper(); + + [SerializeField] + private UsePassHelper m_usePass; + + [SerializeField] + private string m_passName = string.Empty; + + [SerializeField] + private string m_passUniqueId = string.Empty; + + [SerializeField] + private string m_originalPassName = string.Empty; + + [SerializeField] + private bool m_hasLinkPorts = false; + + [SerializeField] + private InvisibilityStatus m_isInvisible = InvisibilityStatus.Visible; + + [SerializeField] + private int m_invisibleOptions = 0; + + [SerializeField] + private bool m_invalidNode = false; + + [SerializeField] + private FallbackPickerHelper m_fallbackHelper = null; + + [SerializeField] + private DependenciesHelper m_dependenciesHelper = new DependenciesHelper(); + + [SerializeField] + private TemplateOptionsUIHelper m_subShaderOptions = new TemplateOptionsUIHelper( true ); + + [SerializeField] + private TemplateOptionsUIHelper m_passOptions = new TemplateOptionsUIHelper( false ); + + [SerializeField] + private TemplatePassSelectorHelper m_passSelector = new TemplatePassSelectorHelper(); + + [SerializeField] + private TemplateOptionsDefinesContainer m_optionsDefineContainer = new TemplateOptionsDefinesContainer(); + + [SerializeField] + private TerrainDrawInstancedHelper m_drawInstancedHelper = new TerrainDrawInstancedHelper(); + + // HATE THIS BELOW, MUST REMOVE HD SPECIFIC CODE FROM GENERIC MASTER NODE + private const string HDSRPMaterialTypeStr = "Material Type"; + private const string SRPMaterialSubsurfaceScatteringKeyword = "_MATERIAL_FEATURE_SUBSURFACE_SCATTERING 1"; + private const string SRPMaterialTransmissionKeyword = "_MATERIAL_FEATURE_TRANSMISSION 1"; + private const string SRPHDMaterialSpecularKeyword = "_MATERIAL_FEATURE_SPECULAR_COLOR 1"; + //private const string SRPLWMaterialSpecularKeyword = "_SPECULAR_SETUP 1"; + private const string SRPMaterialAnisotropyKeyword = "_MATERIAL_FEATURE_ANISOTROPY 1"; + private const string SRPMaterialIridiscenceKeyword = "_MATERIAL_FEATURE_IRIDESCENCE 1"; + //private const string SRPMaterialNormalMapKeyword = "_NORMALMAP 1"; + //private const string SRPMaterialAlphaTestKeyword = "_ALPHATEST_ON 1"; + //private const string SRPMaterialBlendModeAlphaClipThresholdKeyword = "_AlphaClip 1"; + private const string SRPMaterialTransparentKeyword = "_SURFACE_TYPE_TRANSPARENT 1"; + private const string SRPMaterialBlendModeAddKeyword = "_BLENDMODE_ADD 1"; + private const string SRPMaterialBlendModeAlphaKeyword = "_BLENDMODE_ALPHA 1"; + private const string SRPMaterialClearCoatKeyword = "_MATERIAL_FEATURE_CLEAR_COAT"; + + [NonSerialized] + private bool m_fetchPorts = true; + [NonSerialized] + private InputPort m_specularPort; + [NonSerialized] + private InputPort m_metallicPort; + [NonSerialized] + private InputPort m_coatMaskPort; + [NonSerialized] + private InputPort m_diffusionProfilePort; + [NonSerialized] + private InputPort m_subsurfaceMaskPort; + [NonSerialized] + private InputPort m_thicknessPort; + [NonSerialized] + private InputPort m_anisotropyPort; + [NonSerialized] + private InputPort m_iridescenceThicknessPort; + [NonSerialized] + private InputPort m_iridescenceMaskPort; + [NonSerialized] + private InputPort m_indexOfRefractionPort; + [NonSerialized] + private InputPort m_transmittanceColorPort; + [NonSerialized] + private InputPort m_transmittanceAbsorptionDistancePort; + [NonSerialized] + private InputPort m_transmittanceMaskPort; + + [SerializeField] + private HDSRPMaterialType m_hdSrpMaterialType = HDSRPMaterialType.Standard; + + [NonSerialized] + private bool m_refreshLODValueMasterNodes = false; + [NonSerialized] + private bool m_refocusLODValueMasterNodes = false; + [NonSerialized] + private double m_refreshLODValueMasterNodesTimestamp; + + ////////////////////////////////////////////////////////////////////////// + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_masterNodeCategory = 1;// First Template + m_marginPreviewLeft = 20; + m_shaderNameIsTitle = true; + m_customInspectorName = string.Empty; + m_customPrecision = true; + } + + public override void ReleaseResources() + { + // Internal template resources ( for inline properties) are released by first node on the list + // As it's also registered that way + if( IsLODMainFirstPass ) + m_containerGraph.ClearInternalTemplateNodes(); + + if( !IsLODMainMasterNode ) + return; + TemplateMultiPass template = ( m_templateMultiPass == null ) ? m_containerGraph.ParentWindow.TemplatesManagerInstance.GetTemplate( m_templateGUID ) as TemplateMultiPass : m_templateMultiPass; + //Maintained the logic of being the main master node to unregister since this method is being called + //over the main master node in multiple places + //but it will unregister with unique of the first master node (pass 0) since it was the one + //to register it + int passUniqueId = ( m_passIdx == 0 ) ? UniqueId : ContainerGraph.MultiPassMasterNodes.NodesList[ 0 ].UniqueId; + + if( template != null && template.AvailableShaderProperties != null ) + { + // Unregister old template properties + int oldPropertyCount = template.AvailableShaderProperties.Count; + for( int i = 0; i < oldPropertyCount; i++ ) + { + ContainerGraph.ParentWindow.DuplicatePrevBufferInstance.ReleaseUniformName( passUniqueId, template.AvailableShaderProperties[ i ].PropertyName ); + } + } + } + + public void CopyOptionsFrom( TemplateMultiPassMasterNode origin ) + { + //Copy options + SubShaderOptions.CopyOptionsValuesFrom( origin.SubShaderOptions ); + PassOptions.CopyOptionsValuesFrom( origin.PassOptions ); + + //Copy selected passes + if( IsMainOutputNode ) + m_passSelector.CopyFrom( origin.PassSelector ); + } + + void RegisterProperties() + { + //First pass must be the one to always register properties so all modules + //can extract a valid negative Id when reading inline properties + if( /*!IsLODMainMasterNode*/!IsLODMainFirstPass ) + { + m_reRegisterTemplateData = false; + return; + } + + if( m_templateMultiPass != null ) + { + m_reRegisterTemplateData = false; + // Register old template properties + int newPropertyCount = m_templateMultiPass.AvailableShaderProperties.Count; + for( int i = 0; i < newPropertyCount; i++ ) + { + m_containerGraph.AddInternalTemplateNode( m_templateMultiPass.AvailableShaderProperties[ i ] ); + int nodeId = ContainerGraph.ParentWindow.DuplicatePrevBufferInstance.CheckUniformNameOwner( m_templateMultiPass.AvailableShaderProperties[ i ].PropertyName ); + if( nodeId > -1 ) + { + if( UniqueId != nodeId ) + { + ParentNode node = m_containerGraph.GetNode( nodeId ); + if( node != null ) + { + UIUtils.ShowMessage( string.Format( "Template requires property name {0} which is currently being used by {1}. Please rename it and reload template.", m_templateMultiPass.AvailableShaderProperties[ i ].PropertyName, node.Attributes.Name ) ); + } + else + { + UIUtils.ShowMessage( string.Format( "Template requires property name {0} which is currently being on your graph. Please rename it and reload template.", m_templateMultiPass.AvailableShaderProperties[ i ].PropertyName ) ); + } + } + } + else + { + UIUtils.RegisterUniformName( UniqueId, m_templateMultiPass.AvailableShaderProperties[ i ].PropertyName ); + } + } + } + } + + public override void OnEnable() + { + base.OnEnable(); + m_reRegisterTemplateData = true; + + if( m_usePass == null ) + { + m_usePass = ScriptableObject.CreateInstance(); + m_usePass.Init( " Additional Use Passes" ); + } + + if( m_fallbackHelper == null ) + { + m_fallbackHelper = ScriptableObject.CreateInstance(); + m_fallbackHelper.Init(); + } + } + + protected override void OnUniqueIDAssigned() + { + base.OnUniqueIDAssigned(); + if( UniqueId >= 0 ) + { + if( m_lodIndex == -1 ) + { + m_containerGraph.MultiPassMasterNodes.AddNode( this ); + } + else + { + m_containerGraph.LodMultiPassMasternodes[ m_lodIndex ].AddNode( this ); + } + } + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + m_passOptions.CheckImediateActionsForPort( this, portId ); + } + + public override void OnInputPortDisconnected( int portId ) + { + base.OnInputPortDisconnected( portId ); + m_passOptions.CheckImediateActionsForPort( this, portId ); + } + + public void ForceTemplateRefresh() + { + SetTemplate( null, false, true, m_subShaderIdx, m_passIdx, SetTemplateSource.HotCodeReload ); + } + + public void SetTemplate( TemplateMultiPass template, bool writeDefaultData, bool fetchMasterNodeCategory, int subShaderIdx, int passIdx , SetTemplateSource source ) + { + if( subShaderIdx > -1 ) + m_subShaderIdx = subShaderIdx; + + if( passIdx > -1 ) + m_passIdx = passIdx; + + ReleaseResources(); + bool hotCodeOrRead = ( template == null ); + m_templateMultiPass = ( hotCodeOrRead ) ? m_containerGraph.ParentWindow.TemplatesManagerInstance.GetTemplate( m_templateGUID ) as TemplateMultiPass : template; + if( m_templateMultiPass != null ) + { + + string passName = string.IsNullOrEmpty( m_passUniqueId ) ? ( m_isInvisible == InvisibilityStatus.LockedInvisible ? m_passName : m_originalPassName ) : m_passUniqueId; + int newPassIdx = m_passIdx; + int newSubShaderIdx = m_subShaderIdx; + m_templateMultiPass.GetSubShaderandPassFor( passName, ref newSubShaderIdx, ref newPassIdx ); + if( newPassIdx == -1 || newSubShaderIdx == -1 ) + { + //m_containerGraph.MarkToDelete( this ); + ContainerGraph.ParentWindow.SetOutdatedShaderFromTemplate(); + m_invalidNode = true; + UIUtils.ShowMessage( "Template changed drastically. Removing invalid passes." ); + return; + } + else + { + if( m_passIdx != newPassIdx ) + m_passIdx = newPassIdx; + + if( m_subShaderIdx != newSubShaderIdx ) + m_subShaderIdx = newSubShaderIdx; + } + + m_containerGraph.CurrentSRPType = m_templateMultiPass.SRPtype; + if( m_templateMultiPass.IsSinglePass ) + { + SetAdditonalTitleText( string.Empty ); + } + else if( m_templateMultiPass.SubShaders[ 0 ].MainPass != m_passIdx ) + { + SetAdditonalTitleText( string.Format( SubTitleFormatterStr, m_subShaderIdx, m_passIdx ) ); + } + m_invalidNode = false; + if( m_subShaderIdx >= m_templateMultiPass.SubShaders.Count || + m_passIdx >= m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes.Count ) + { + if( DebugConsoleWindow.DeveloperMode ) + Debug.LogFormat( "Inexisting pass {0}. Cancelling template fetch", m_originalPassName ); + + return; + } + + m_isMainOutputNode = m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].IsMainPass; + if( m_isMainOutputNode ) + { + // We cannot use UIUtils.MasterNodeOnTexture.height since this method can be + // called before UIUtils is initialized + m_insideSize.y = 55; + } + else + { + m_insideSize.y = 0; + } + + //IsMainOutputNode = m_mainMPMasterNode; + if( source != SetTemplateSource.HotCodeReload ) + { + //Only set this if no hotcode reload happens ( via new shader or load ) + m_isInvisible = m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].IsInvisible ? InvisibilityStatus.LockedInvisible : InvisibilityStatus.Visible; + } + else + { + // On hot code reload we only need to verify if template pass visibility data changes + // and change accordingly + if( m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].IsInvisible ) + { + if( m_isInvisible != InvisibilityStatus.LockedInvisible ) + m_isInvisible = InvisibilityStatus.LockedInvisible; + } + else + { + if( m_isInvisible == InvisibilityStatus.LockedInvisible ) + { + m_isInvisible = InvisibilityStatus.Visible; + } + } + } + + m_invisibleOptions = m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].InvisibleOptions; + + m_originalPassName = m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].PassNameContainer.Data; + + if( !hotCodeOrRead ) + { + if( m_templateMultiPass.SubShaders[ m_subShaderIdx ].LODContainer.Index > -1 ) + { + //m_subShaderLODStr = m_templateMultiPass.SubShaders[ m_subShaderIdx ].LODContainer.Id; + ShaderLOD = Convert.ToInt32( m_templateMultiPass.SubShaders[ m_subShaderIdx ].LODContainer.Data ); + } + else + { + ShaderLOD = 0; + } + } + + m_shaderNameIsTitle = IsMainOutputNode; + m_fetchMasterNodeCategory = fetchMasterNodeCategory; + m_templateGUID = m_templateMultiPass.GUID; + UpdatePortInfo(); + + RegisterProperties(); + + // template is null when hot code reloading or loading from file so inspector name shouldn't be changed + if( !hotCodeOrRead ) + { + m_customInspectorName = m_templateMultiPass.CustomInspectorContainer.Data; + if( m_isMainOutputNode ) + { + m_passSelector.Clear(); + m_passSelector.Setup( m_templateMultiPass.SubShaders[ m_subShaderIdx ] ); + } + } + else + { + //Hotcode reload or ReadFromString + // Setup is only made if internal pass array is null + if( m_isMainOutputNode ) + { + m_passSelector.Setup( m_templateMultiPass.SubShaders[ m_subShaderIdx ] ); + } + } + + SetupCustomOptionsFromTemplate( template != null ); + + if( string.IsNullOrEmpty( m_fallbackHelper.RawFallbackShader ) ) + m_fallbackHelper.RawFallbackShader = m_templateMultiPass.FallbackContainer.Data; + + //bool updateInfofromTemplate = UpdatePortInfo(); + //if( updateInfofromTemplate ) + //{ + m_subShaderModule.FetchDataFromTemplate( m_templateMultiPass.SubShaders[ m_subShaderIdx ].Modules ); + m_passModule.FetchDataFromTemplate( m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].Modules ); + //} + + //RegisterProperties(); + if( writeDefaultData ) + { + //ShaderName = m_templateMultiPass.DefaultShaderName; + ShaderName = m_shaderName; + m_passName = m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].PassNameContainer.Data; + if( !m_templateMultiPass.IsSinglePass /*&& !m_shaderNameIsTitle*/ ) + { + if( m_templateMultiPass.SubShaders[ 0 ].MainPass != m_passIdx ) + SetClippedTitle( m_passName ); + } + } + + UpdateSubShaderPassStr(); + + if( m_isMainOutputNode ) + m_fireTemplateChange = true; + } + else + { + m_invalidNode = true; + } + } + + public override void OnRefreshLinkedPortsComplete() + { + if( m_invalidNode ) + return; + + if( m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].Modules.SRPIsPBRHD ) + ConfigHDPorts(); + + SetReadOptions(); + } + + public void SetReadOptions() + { + m_passOptions.SetReadOptions(); + if( m_isMainOutputNode ) + m_subShaderOptions.SetReadOptions(); + } + + bool UpdatePortInfo() + { + List inputDataList = m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].InputDataList; + int count = inputDataList.Count; + if( count != m_inputPorts.Count ) + { + DeleteAllInputConnections( true ); + + for( int i = 0; i < count; i++ ) + { + InputPort port = AddInputPort( inputDataList[ i ].DataType, false, inputDataList[ i ].PortName, inputDataList[ i ].OrderId, inputDataList[ i ].PortCategory, inputDataList[ i ].PortUniqueId ); + port.ExternalLinkId = inputDataList[ i ].LinkId; + m_hasLinkPorts = m_hasLinkPorts || !string.IsNullOrEmpty( inputDataList[ i ].LinkId ); + } + return true; + } + else + { + for( int i = 0; i < count; i++ ) + { + m_inputPorts[ i ].ChangeProperties( inputDataList[ i ].PortName, inputDataList[ i ].DataType, false ); + m_inputPorts[ i ].ExternalLinkId = inputDataList[ i ].LinkId; + } + return false; + } + } + + public void SetPropertyActionFromItem( bool actionFromUser, TemplateModulesHelper module, TemplateActionItem item ) + { + // this was added because when switching templates the m_mainMasterNodeRef was not properly set yet and was causing issues, there's probably a better place for this + if( !m_isMainOutputNode && m_mainMasterNodeRef == null ) + { + m_mainMasterNodeRef = m_containerGraph.CurrentMasterNode as TemplateMultiPassMasterNode; + } + + TemplateModulesHelper subShaderModule = m_isMainOutputNode ? m_subShaderModule : m_mainMasterNodeRef.SubShaderModule; + switch( item.PropertyAction ) + { + case PropertyActionsEnum.CullMode: + { + if( item.CopyFromSubShader ) + { + module.CullModeHelper.CurrentCullMode = subShaderModule.CullModeHelper.CurrentCullMode; + } + else + { + bool performAction = !ContainerGraph.IsLoading || !module.CullModeHelper.CustomEdited; + if( performAction ) + { + module.CullModeHelper.CustomEdited = false; + module.CullModeHelper.CurrentCullMode = item.ActionCullMode; + } + } + + } + break; + case PropertyActionsEnum.ColorMask: + { + if( item.CopyFromSubShader ) + module.ColorMaskHelper.ColorMask = subShaderModule.ColorMaskHelper.ColorMask; + else + { + bool performAction = !ContainerGraph.IsLoading || !module.ColorMaskHelper.CustomEdited; + if( performAction ) + { + module.ColorMaskHelper.CustomEdited = false; + module.ColorMaskHelper.ColorMask = item.ColorMask.GetColorMask( module.ColorMaskHelper.ColorMask ); + } + } + } + break; + case PropertyActionsEnum.ColorMask1: + { + if( item.CopyFromSubShader ) + module.ColorMaskHelper1.ColorMask = subShaderModule.ColorMaskHelper1.ColorMask; + else + { + bool performAction = !ContainerGraph.IsLoading || !module.ColorMaskHelper1.CustomEdited; + if( performAction ) + { + module.ColorMaskHelper1.CustomEdited = false; + module.ColorMaskHelper1.ColorMask = item.ColorMask1.GetColorMask( module.ColorMaskHelper1.ColorMask ); + } + } + } + break; + case PropertyActionsEnum.ColorMask2: + { + if( item.CopyFromSubShader ) + module.ColorMaskHelper2.ColorMask = subShaderModule.ColorMaskHelper2.ColorMask; + else + { + bool performAction = !ContainerGraph.IsLoading || !module.ColorMaskHelper2.CustomEdited; + if( performAction ) + { + module.ColorMaskHelper2.CustomEdited = false; + module.ColorMaskHelper2.ColorMask = item.ColorMask2.GetColorMask( module.ColorMaskHelper2.ColorMask ); + } + } + } + break; + case PropertyActionsEnum.ColorMask3: + { + if( item.CopyFromSubShader ) + module.ColorMaskHelper3.ColorMask = subShaderModule.ColorMaskHelper3.ColorMask; + else + { + bool performAction = !ContainerGraph.IsLoading || !module.ColorMaskHelper3.CustomEdited; + if( performAction ) + { + module.ColorMaskHelper3.CustomEdited = false; + module.ColorMaskHelper3.ColorMask = item.ColorMask3.GetColorMask( module.ColorMaskHelper3.ColorMask ); + } + } + } + break; + case PropertyActionsEnum.ZWrite: + { + if( item.CopyFromSubShader ) + { + module.DepthOphelper.ZWriteModeValue = subShaderModule.DepthOphelper.ZWriteModeValue; + } + else + { + bool performAction = !ContainerGraph.IsLoading || !module.DepthOphelper.CustomEdited; + if( performAction ) + { + module.DepthOphelper.CustomEdited = false; + module.DepthOphelper.ZWriteModeValue = item.ActionZWrite; + } + } + } + break; + case PropertyActionsEnum.ZTest: + { + if( item.CopyFromSubShader ) + { + module.DepthOphelper.ZTestModeValue = subShaderModule.DepthOphelper.ZTestModeValue; + } + else + { + bool performAction = !ContainerGraph.IsLoading || !module.DepthOphelper.CustomEdited; + if( performAction ) + { + module.DepthOphelper.CustomEdited = false; + module.DepthOphelper.ZTestModeValue = item.ActionZTest; + } + } + } + break; + case PropertyActionsEnum.ZOffsetFactor: + { + if( item.CopyFromSubShader ) + { + module.DepthOphelper.OffsetFactorValue = subShaderModule.DepthOphelper.OffsetFactorValue; + } + else + { + bool performAction = !ContainerGraph.IsLoading || !module.DepthOphelper.CustomEdited; + if( performAction ) + { + module.DepthOphelper.CustomEdited = false; + module.DepthOphelper.OffsetFactorValue = item.ActionZOffsetFactor; + } + } + } + break; + case PropertyActionsEnum.ZOffsetUnits: + { + if( item.CopyFromSubShader ) + { + module.DepthOphelper.OffsetUnitsValue = subShaderModule.DepthOphelper.OffsetUnitsValue; + } + else + { + bool performAction = !ContainerGraph.IsLoading || !module.DepthOphelper.CustomEdited; + if( performAction ) + { + module.DepthOphelper.CustomEdited = false; + module.DepthOphelper.OffsetUnitsValue = item.ActionZOffsetUnits; + } + } + } + break; + case PropertyActionsEnum.BlendRGB: + { + if( item.CopyFromSubShader ) + { + module.BlendOpHelper.SourceFactorRGB = subShaderModule.BlendOpHelper.SourceFactorRGB; + module.BlendOpHelper.DestFactorRGB = subShaderModule.BlendOpHelper.DestFactorRGB; + } + else + { + bool performAction = !ContainerGraph.IsLoading || !module.BlendOpHelper.CustomEdited; + if( performAction ) + { + module.BlendOpHelper.CustomEdited = false; + module.BlendOpHelper.SourceFactorRGB = item.ActionBlendRGBSource; + module.BlendOpHelper.DestFactorRGB = item.ActionBlendRGBDest; + } + } + } + break; + case PropertyActionsEnum.BlendRGB1: + { + if( item.CopyFromSubShader ) + { + module.BlendOpHelper1.SourceFactorRGB = subShaderModule.BlendOpHelper1.SourceFactorRGB; + module.BlendOpHelper1.DestFactorRGB = subShaderModule.BlendOpHelper1.DestFactorRGB; + } + else + { + bool performAction = !ContainerGraph.IsLoading || !module.BlendOpHelper1.CustomEdited; + if( performAction ) + { + module.BlendOpHelper1.CustomEdited = false; + module.BlendOpHelper1.SourceFactorRGB = item.ActionBlendRGBSource1; + module.BlendOpHelper1.DestFactorRGB = item.ActionBlendRGBDest1; + } + } + } + break; + case PropertyActionsEnum.BlendRGB2: + { + if( item.CopyFromSubShader ) + { + module.BlendOpHelper2.SourceFactorRGB = subShaderModule.BlendOpHelper2.SourceFactorRGB; + module.BlendOpHelper2.DestFactorRGB = subShaderModule.BlendOpHelper2.DestFactorRGB; + } + else + { + bool performAction = !ContainerGraph.IsLoading || !module.BlendOpHelper2.CustomEdited; + if( performAction ) + { + module.BlendOpHelper2.CustomEdited = false; + module.BlendOpHelper2.SourceFactorRGB = item.ActionBlendRGBSource2; + module.BlendOpHelper2.DestFactorRGB = item.ActionBlendRGBDest2; + } + } + } + break; + case PropertyActionsEnum.BlendRGB3: + { + if( item.CopyFromSubShader ) + { + module.BlendOpHelper3.SourceFactorRGB = subShaderModule.BlendOpHelper3.SourceFactorRGB; + module.BlendOpHelper3.DestFactorRGB = subShaderModule.BlendOpHelper3.DestFactorRGB; + } + else + { + bool performAction = !ContainerGraph.IsLoading || !module.BlendOpHelper3.CustomEdited; + if( performAction ) + { + module.BlendOpHelper3.CustomEdited = false; + module.BlendOpHelper3.SourceFactorRGB = item.ActionBlendRGBSource3; + module.BlendOpHelper3.DestFactorRGB = item.ActionBlendRGBDest3; + } + } + } + break; + case PropertyActionsEnum.BlendAlpha: + { + if( item.CopyFromSubShader ) + { + module.BlendOpHelper.SourceFactorAlpha = subShaderModule.BlendOpHelper.SourceFactorAlpha; + module.BlendOpHelper.DestFactorAlpha = subShaderModule.BlendOpHelper.DestFactorAlpha; + } + else + { + bool performAction = !ContainerGraph.IsLoading || !module.BlendOpHelper.CustomEdited; + if( performAction ) + { + module.BlendOpHelper.CustomEdited = false; + module.BlendOpHelper.CurrentAlphaIndex = 1; + module.BlendOpHelper.SourceFactorAlpha = item.ActionBlendAlphaSource; + module.BlendOpHelper.DestFactorAlpha = item.ActionBlendAlphaDest; + } + } + } + break; + case PropertyActionsEnum.BlendAlpha1: + { + if( item.CopyFromSubShader ) + { + module.BlendOpHelper1.SourceFactorAlpha = subShaderModule.BlendOpHelper1.SourceFactorAlpha; + module.BlendOpHelper1.DestFactorAlpha = subShaderModule.BlendOpHelper1.DestFactorAlpha; + } + else + { + bool performAction = !ContainerGraph.IsLoading || !module.BlendOpHelper1.CustomEdited; + if( performAction ) + { + module.BlendOpHelper1.CustomEdited = false; + module.BlendOpHelper1.CurrentAlphaIndex = 1; + module.BlendOpHelper1.SourceFactorAlpha = item.ActionBlendAlphaSource1; + module.BlendOpHelper1.DestFactorAlpha = item.ActionBlendAlphaDest1; + } + } + } + break; + case PropertyActionsEnum.BlendAlpha2: + { + if( item.CopyFromSubShader ) + { + module.BlendOpHelper2.SourceFactorAlpha = subShaderModule.BlendOpHelper2.SourceFactorAlpha; + module.BlendOpHelper2.DestFactorAlpha = subShaderModule.BlendOpHelper2.DestFactorAlpha; + } + else + { + bool performAction = !ContainerGraph.IsLoading || !module.BlendOpHelper2.CustomEdited; + if( performAction ) + { + module.BlendOpHelper2.CustomEdited = false; + module.BlendOpHelper2.CurrentAlphaIndex = 1; + module.BlendOpHelper2.SourceFactorAlpha = item.ActionBlendAlphaSource2; + module.BlendOpHelper2.DestFactorAlpha = item.ActionBlendAlphaDest2; + } + } + } + break; + case PropertyActionsEnum.BlendAlpha3: + { + if( item.CopyFromSubShader ) + { + module.BlendOpHelper3.SourceFactorAlpha = subShaderModule.BlendOpHelper3.SourceFactorAlpha; + module.BlendOpHelper3.DestFactorAlpha = subShaderModule.BlendOpHelper3.DestFactorAlpha; + } + else + { + bool performAction = !ContainerGraph.IsLoading || !module.BlendOpHelper3.CustomEdited; + if( performAction ) + { + module.BlendOpHelper3.CustomEdited = false; + module.BlendOpHelper3.CurrentAlphaIndex = 1; + module.BlendOpHelper3.SourceFactorAlpha = item.ActionBlendAlphaSource3; + module.BlendOpHelper3.DestFactorAlpha = item.ActionBlendAlphaDest3; + } + } + } + break; + case PropertyActionsEnum.BlendOpRGB: + { + if( item.CopyFromSubShader ) + { + module.BlendOpHelper.BlendOpRGB = subShaderModule.BlendOpHelper.BlendOpRGB; + } + else + { + bool performAction = !ContainerGraph.IsLoading || !module.BlendOpHelper.CustomEdited; + if( performAction ) + { + module.BlendOpHelper.CustomEdited = false; + module.BlendOpHelper.BlendOpRGB = item.ActionBlendOpRGB; + } + } + } + break; + case PropertyActionsEnum.BlendOpAlpha: + { + if( item.CopyFromSubShader ) + { + module.BlendOpHelper.BlendOpAlpha = subShaderModule.BlendOpHelper.BlendOpAlpha; + } + else + { + bool performAction = !ContainerGraph.IsLoading || !module.BlendOpHelper.CustomEdited; + if( performAction ) + { + module.BlendOpHelper.CustomEdited = false; + module.BlendOpHelper.BlendOpAlpha = item.ActionBlendOpAlpha; + } + } + } + break; + case PropertyActionsEnum.StencilReference: + { + if( item.CopyFromSubShader ) + { + module.StencilBufferHelper.ReferenceValue = subShaderModule.StencilBufferHelper.ReferenceValue; + } + else + { + bool performAction = !ContainerGraph.IsLoading || !module.StencilBufferHelper.CustomEdited; + if( performAction ) + { + module.StencilBufferHelper.CustomEdited = false; + module.StencilBufferHelper.ReferenceValue = item.ActionStencilReference; + } + } + } + break; + case PropertyActionsEnum.StencilReadMask: + { + if( item.CopyFromSubShader ) + { + module.StencilBufferHelper.ReadMaskValue = subShaderModule.StencilBufferHelper.ReadMaskValue; + } + else + { bool performAction = !ContainerGraph.IsLoading || !module.StencilBufferHelper.CustomEdited; + if( performAction ) + { + module.StencilBufferHelper.CustomEdited = false; + module.StencilBufferHelper.ReadMaskValue = item.ActionStencilReadMask; + } + } + } + break; + case PropertyActionsEnum.StencilWriteMask: + { + if( item.CopyFromSubShader ) + { + module.StencilBufferHelper.WriteMaskValue = subShaderModule.StencilBufferHelper.WriteMaskValue; + } + else + { + bool performAction = !ContainerGraph.IsLoading || !module.StencilBufferHelper.CustomEdited; + if( performAction ) + { + module.StencilBufferHelper.CustomEdited = false; + module.StencilBufferHelper.WriteMaskValue = item.ActionStencilWriteMask; + } + } + } + break; + case PropertyActionsEnum.StencilComparison: + { + if( item.CopyFromSubShader ) + { + module.StencilBufferHelper.ComparisonFunctionIdxValue = subShaderModule.StencilBufferHelper.ComparisonFunctionIdxValue; + } + else + { + bool performAction = !ContainerGraph.IsLoading || !module.StencilBufferHelper.CustomEdited; + if( performAction ) + { + module.StencilBufferHelper.CustomEdited = false; + module.StencilBufferHelper.ComparisonFunctionIdxValue = item.ActionStencilComparison; + } + } + } + break; + case PropertyActionsEnum.StencilPass: + { + if( item.CopyFromSubShader ) + { + module.StencilBufferHelper.PassStencilOpIdxValue = subShaderModule.StencilBufferHelper.PassStencilOpIdxValue; + } + else + { + bool performAction = !ContainerGraph.IsLoading || !module.StencilBufferHelper.CustomEdited; + if( performAction ) + { + module.StencilBufferHelper.CustomEdited = false; + module.StencilBufferHelper.PassStencilOpIdxValue = item.ActionStencilPass; + } + } + } + break; + case PropertyActionsEnum.StencilFail: + { + if( item.CopyFromSubShader ) + { + module.StencilBufferHelper.FailStencilOpIdxValue = subShaderModule.StencilBufferHelper.FailStencilOpIdxValue; + } + else + { + bool performAction = !ContainerGraph.IsLoading || !module.StencilBufferHelper.CustomEdited; + if( performAction ) + { + module.StencilBufferHelper.CustomEdited = false; + module.StencilBufferHelper.FailStencilOpIdxValue = item.ActionStencilFail; + } + } + } + break; + case PropertyActionsEnum.StencilZFail: + { + if( item.CopyFromSubShader ) + { + module.StencilBufferHelper.ZFailStencilOpIdxValue = subShaderModule.StencilBufferHelper.ZFailStencilOpIdxValue; + } + else + { + bool performAction = !ContainerGraph.IsLoading || !module.StencilBufferHelper.CustomEdited; + if( performAction ) + { + module.StencilBufferHelper.CustomEdited = false; + module.StencilBufferHelper.ZFailStencilOpIdxValue = item.ActionStencilZFail; + } + } + } + break; + case PropertyActionsEnum.RenderType: + { + module.TagsHelper.AddSpecialTag( TemplateSpecialTags.RenderType, item ); + } + break; + case PropertyActionsEnum.RenderQueue: + { + module.TagsHelper.AddSpecialTag( TemplateSpecialTags.Queue, item ); + } + break; + case PropertyActionsEnum.DisableBatching: + { + module.TagsHelper.AddSpecialTag( TemplateSpecialTags.DisableBatching, item ); + } + break; + } + } + + public void OnCustomPassOptionSelected( bool actionFromUser, bool isRefreshing, bool invertAction, TemplateOptionUIItem uiItem, params TemplateActionItem[] validActions ) + { + m_passOptions.OnCustomOptionSelected( actionFromUser, isRefreshing, invertAction, this, uiItem, validActions ); + } + + public void OnCustomSubShaderOptionSelected( bool actionFromUser, bool isRefreshing, bool invertAction, TemplateOptionUIItem uiItem, params TemplateActionItem[] validActions ) + { + if( m_isMainOutputNode ) + m_subShaderOptions.OnCustomOptionSelected( actionFromUser, isRefreshing, invertAction, this, uiItem, validActions ); + } + + void SetupCustomOptionsFromTemplate( bool newTemplate ) + { + m_passOptions.SetupCustomOptionsFromTemplate( this, newTemplate ); + if( m_isMainOutputNode ) + m_subShaderOptions.SetupCustomOptionsFromTemplate( this, newTemplate ); + } + + void SetPassCustomOptionsInfo( TemplateMultiPassMasterNode masterNode ) + { + TemplateMultiPassMasterNode mainMasterNode = masterNode.IsMainOutputNode ? masterNode : ( m_containerGraph.CurrentMasterNode as TemplateMultiPassMasterNode ); + mainMasterNode.SubShaderOptions.SetSubShaderCustomOptionsPortsInfo( masterNode, ref m_currentDataCollector ); + masterNode.PassOptions.SetCustomOptionsInfo( masterNode, ref m_currentDataCollector ); + } + + void RefreshCustomOptionsDict() + { + m_passOptions.RefreshCustomOptionsDict(); + if( m_isMainOutputNode ) + m_subShaderOptions.RefreshCustomOptionsDict(); + } + + void SetCategoryIdxFromTemplate() + { + int templateCount = m_containerGraph.ParentWindow.TemplatesManagerInstance.TemplateCount; + for( int i = 0; i < templateCount; i++ ) + { + int idx = i + 1; + TemplateMultiPass templateData = m_containerGraph.ParentWindow.TemplatesManagerInstance.GetTemplate( i ) as TemplateMultiPass; + if( templateData != null && m_templateMultiPass != null && m_templateMultiPass.GUID.Equals( templateData.GUID ) ) + m_masterNodeCategory = idx; + } + } + + public void CheckTemplateChanges() + { + if( m_invalidNode ) + return; + + if( IsLODMainMasterNode ) + { + if( m_containerGraph.MultiPassMasterNodes.Count != m_templateMultiPass.MasterNodesRequired ) + { + if( m_availableCategories == null ) + RefreshAvailableCategories(); + + if( DebugConsoleWindow.DeveloperMode ) + Debug.Log( "Template Pass amount was changed. Rebuiling master nodes" ); + + m_containerGraph.ParentWindow.ReplaceMasterNode( m_availableCategories[ m_masterNodeCategory ], true ); + } + } + } + + public override void OnNodeLogicUpdate( DrawInfo drawInfo ) + { + if( m_invalidNode ) + { + return; + } + base.OnNodeLogicUpdate( drawInfo ); + + if( m_templateMultiPass == null ) + { + // Hotcode reload has happened + SetTemplate( null, false, true, m_subShaderIdx, m_passIdx , SetTemplateSource.HotCodeReload ); + CheckTemplateChanges(); + } + + if( m_reRegisterTemplateData ) + { + RegisterProperties(); + } + + if( m_fetchMasterNodeCategory ) + { + if( m_availableCategories != null ) + { + m_fetchMasterNodeCategory = false; + SetCategoryIdxFromTemplate(); + } + } + + if( m_fireTemplateChange ) + { + m_fireTemplateChange = false; + m_containerGraph.FireMasterNodeReplacedEvent(); + } + + if( m_subShaderModule.HasValidData ) + { + m_subShaderModule.OnLogicUpdate( m_templateMultiPass.SubShaders[ m_subShaderIdx ].Modules ); + } + + if( m_passModule.HasValidData ) + { + m_passModule.OnLogicUpdate( m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].Modules ); + } + + if( !m_isMainOutputNode && m_mainMasterNodeRef == null ) + { + m_mainMasterNodeRef = m_containerGraph.CurrentMasterNode as TemplateMultiPassMasterNode; + } + + if( m_refreshLODValueMasterNodes && ( EditorApplication.timeSinceStartup - m_refreshLODValueMasterNodesTimestamp ) > MaxLODEditTimestamp ) + { + m_refreshLODValueMasterNodes = false; + m_refocusLODValueMasterNodes = true; + m_containerGraph.SortLODMasterNodes(); + } + } + + public override void Draw( DrawInfo drawInfo ) + { + if( m_isInvisible == InvisibilityStatus.Visible ) + { + base.Draw( drawInfo ); + } + } + + public override void OnNodeLayout( DrawInfo drawInfo ) + { + if( m_invalidNode ) + { + if( m_isMainOutputNode ) + { + string newGUID = string.Empty; + if( m_containerGraph.ParentWindow.TemplatesManagerInstance.CheckIfDeprecated( m_templateGUID, out newGUID ) ) + { + m_shaderModelIdx = 0; + SetMasterNodeCategoryFromGUID( newGUID ); + m_containerGraph.ParentWindow.ReplaceMasterNode( m_availableCategories[m_masterNodeCategory], false ); + } + else + { + UIUtils.ShowMessage( "Invalid current template. Switching to Standard Surface", MessageSeverity.Error ); + m_shaderModelIdx = 0; + m_masterNodeCategory = 0; + m_containerGraph.ParentWindow.ReplaceMasterNode( new MasterNodeCategoriesData( AvailableShaderTypes.SurfaceShader, m_shaderName ), false ); + } + } + return; + } + + if( m_isInvisible != InvisibilityStatus.Visible ) + { + return; + } + + if( !IsMainOutputNode ) + { + if( !IsInvisible && Docking ) + { + m_useSquareNodeTitle = true; + TemplateMultiPassMasterNode master = ContainerGraph.CurrentMasterNode as TemplateMultiPassMasterNode; + m_position = master.TruePosition; + m_position.height = 32; + int masterIndex = ContainerGraph.MultiPassMasterNodes.NodesList.IndexOf( master ); + int index = ContainerGraph.MultiPassMasterNodes.GetNodeRegisterIdx( UniqueId ); + if( index > masterIndex ) + { + int backTracking = 0; + for( int i = index - 1; i > masterIndex; i-- ) + { + if( !ContainerGraph.MultiPassMasterNodes.NodesList[ i ].IsInvisible && ContainerGraph.MultiPassMasterNodes.NodesList[ i ].Docking ) + backTracking++; + } + m_position.y = master.TruePosition.yMax + 1 + 33 * ( backTracking );// ContainerGraph.MultiPassMasterNodes.NodesList[ index - 1 ].TruePosition.yMax; + base.OnNodeLayout( drawInfo ); + } + else + { + int forwardTracking = 1; + for( int i = index + 1; i < masterIndex; i++ ) + { + if( !ContainerGraph.MultiPassMasterNodes.NodesList[ i ].IsInvisible && ContainerGraph.MultiPassMasterNodes.NodesList[ i ].Docking ) + forwardTracking++; + } + m_position.y = master.TruePosition.y - 33 * ( forwardTracking );// ContainerGraph.MultiPassMasterNodes.NodesList[ index - 1 ].TruePosition.yMax; + base.OnNodeLayout( drawInfo ); + } + } + else + { + m_useSquareNodeTitle = false; + base.OnNodeLayout( drawInfo ); + } + } + else + { + base.OnNodeLayout( drawInfo ); + } + } + + public override void OnNodeRepaint( DrawInfo drawInfo ) + { + base.OnNodeRepaint( drawInfo ); + if( m_invalidNode ) + return; + + if( m_isInvisible == InvisibilityStatus.Visible ) + { + if( m_containerGraph.IsInstancedShader ) + { + DrawInstancedIcon( drawInfo ); + } + } + } + + public override void UpdateFromShader( Shader newShader ) + { + if( m_currentMaterial != null && m_currentMaterial.shader != newShader ) + { + m_currentMaterial.shader = newShader; + } + CurrentShader = newShader; + } + + public override void UpdateMasterNodeMaterial( Material material ) + { + m_currentMaterial = material; + FireMaterialChangedEvt(); + } + + void DrawReloadButton() + { + if( GUILayout.Button( ReloadTemplateStr ) && m_templateMultiPass != null ) + { + m_templateMultiPass.Reload(); + } + } + + void DrawOpenTemplateButton() + { + GUILayout.BeginHorizontal(); + { + if( GUILayout.Button( OpenTemplateStr ) && m_templateMultiPass != null ) + { + try + { + string pathname = AssetDatabase.GUIDToAssetPath( m_templateMultiPass.GUID ); + if( !string.IsNullOrEmpty( pathname ) ) + { + Shader selectedTemplate = AssetDatabase.LoadAssetAtPath( pathname ); + if( selectedTemplate != null ) + { + AssetDatabase.OpenAsset( selectedTemplate, 1 ); + } + } + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + + if( GUILayout.Button( "\u25C4", GUILayout.Width( 18 ), GUILayout.Height( 18 ) ) && m_templateMultiPass != null ) + { + try + { + string pathname = AssetDatabase.GUIDToAssetPath( m_templateMultiPass.GUID ); + if( !string.IsNullOrEmpty( pathname ) ) + { + Shader selectedTemplate = AssetDatabase.LoadAssetAtPath( pathname ); + if( selectedTemplate != null ) + { + Event.current.Use(); + Selection.activeObject = selectedTemplate; + EditorGUIUtility.PingObject( Selection.activeObject ); + } + } + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + } + GUILayout.EndHorizontal(); + } + + public override void DrawProperties() + { + base.DrawProperties(); + if( m_invalidNode ) + return; + + NodeUtils.DrawPropertyGroup( ref m_propertiesFoldout, CommonPropertiesStr, DrawCommonProperties ); + NodeUtils.DrawPropertyGroup( ref m_subStringFoldout, SubShaderModuleStr, DrawSubShaderProperties ); + NodeUtils.DrawPropertyGroup( ref m_passFoldout, PassModuleStr, DrawPassProperties ); + + DrawMaterialInputs( UIUtils.MenuItemToolbarStyle, false ); + + if( m_propertyOrderChanged ) + { + List mpNodes = ContainerGraph.MultiPassMasterNodes.NodesList; + int count = mpNodes.Count; + for( int i = 0; i < count; i++ ) + { + if( mpNodes[ i ].UniqueId != UniqueId ) + { + mpNodes[ i ].CopyPropertyListFrom( this ); + } + } + } + +#if SHOW_TEMPLATE_HELP_BOX + EditorGUILayout.HelpBox( WarningMessage, MessageType.Warning ); +#endif + } + + // this will be removed later when PBR options are created + void SetExtraDefine( string define ) + { + List nodes = this.ContainerGraph.MultiPassMasterNodes.NodesList; + int count = nodes.Count; + for( int nodeIdx = 0; nodeIdx < count; nodeIdx++ ) + { + nodes[ nodeIdx ].OptionsDefineContainer.AddDefine( "#define " + define, false ); + } + } + + void AddHDKeywords() + { + if( m_templateMultiPass.CustomTemplatePropertyUI == CustomTemplatePropertyUIEnum.None ) + return; + + if( m_templateMultiPass.SubShaders[ m_subShaderIdx ].Modules.SRPType != TemplateSRPType.HD || + !m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].Modules.SRPIsPBR ) + return; + + switch( m_hdSrpMaterialType ) + { + case HDSRPMaterialType.SubsurfaceScattering: + { + SetExtraDefine( SRPMaterialSubsurfaceScatteringKeyword ); + //m_currentDataCollector.AddToDefines( UniqueId, SRPMaterialSubsurfaceScatteringKeyword ); + if( m_thicknessPort != null && m_thicknessPort.HasOwnOrLinkConnection ) + { + SetExtraDefine( SRPMaterialTransmissionKeyword ); + //m_currentDataCollector.AddToDefines( UniqueId, SRPMaterialTransmissionKeyword ); + } + } + break; + case HDSRPMaterialType.Standard: + break; + case HDSRPMaterialType.Specular: + { + SetExtraDefine( SRPHDMaterialSpecularKeyword ); + //m_currentDataCollector.AddToDefines( UniqueId, SRPHDMaterialSpecularKeyword ); + } + break; + case HDSRPMaterialType.Anisotropy: + { + SetExtraDefine( SRPMaterialAnisotropyKeyword ); + //m_currentDataCollector.AddToDefines( UniqueId, SRPMaterialAnisotropyKeyword ); + } + break; + case HDSRPMaterialType.Iridescence: + { + SetExtraDefine( SRPMaterialIridiscenceKeyword ); + //m_currentDataCollector.AddToDefines( UniqueId, SRPMaterialIridiscenceKeyword ); + } + break; + case HDSRPMaterialType.Translucent: + { + SetExtraDefine( SRPMaterialTransmissionKeyword ); + //m_currentDataCollector.AddToDefines( UniqueId, SRPMaterialTransmissionKeyword ); + } + break; + } + + if( m_coatMaskPort != null && m_coatMaskPort.HasOwnOrLinkConnection ) + { + SetExtraDefine( SRPMaterialClearCoatKeyword ); + //m_currentDataCollector.AddToDefines( UniqueId, SRPMaterialClearCoatKeyword ); + } + } + + void FetchHDPorts() + { + if( m_fetchPorts ) + { + m_fetchPorts = false; + if( m_inputPorts.Count > 4 ) + { + m_specularPort = GetInputPortByUniqueId( 3 ); + m_metallicPort = GetInputPortByUniqueId( 4 ); + m_coatMaskPort = GetInputPortByUniqueId( 11 ); + m_diffusionProfilePort = GetInputPortByUniqueId( 12 ); + m_subsurfaceMaskPort = GetInputPortByUniqueId( 13 ); + m_thicknessPort = GetInputPortByUniqueId( 14 ); + m_anisotropyPort = GetInputPortByUniqueId( 15 ); + m_iridescenceThicknessPort = GetInputPortByUniqueId( 16 ); + m_iridescenceMaskPort = GetInputPortByUniqueId( 17 ); + m_indexOfRefractionPort = GetInputPortByUniqueId( 18 ); + m_transmittanceColorPort = GetInputPortByUniqueId( 19 ); + m_transmittanceAbsorptionDistancePort = GetInputPortByUniqueId( 20 ); + m_transmittanceMaskPort = GetInputPortByUniqueId( 21 ); + } + } + } + + void ConfigHDPorts() + { + if( m_templateMultiPass.CustomTemplatePropertyUI == CustomTemplatePropertyUIEnum.None ) + return; + + if( m_templateMultiPass.SubShaders[ m_subShaderIdx ].Modules.SRPType != TemplateSRPType.HD || + !m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].Modules.SRPIsPBR ) + return; + + FetchHDPorts(); + if( m_inputPorts.Count > 4 ) + { + switch( m_hdSrpMaterialType ) + { + case HDSRPMaterialType.SubsurfaceScattering: + { + m_specularPort.Visible = false; + m_metallicPort.Visible = false; + m_coatMaskPort.Visible = true; + m_diffusionProfilePort.Visible = true; + m_subsurfaceMaskPort.Visible = true; + m_thicknessPort.Visible = true; + m_anisotropyPort.Visible = false; + m_iridescenceThicknessPort.Visible = false; + m_iridescenceMaskPort.Visible = false; + m_indexOfRefractionPort.Visible = false; + m_transmittanceColorPort.Visible = false; + m_transmittanceAbsorptionDistancePort.Visible = false; + m_transmittanceMaskPort.Visible = false; + } + break; + case HDSRPMaterialType.Standard: + { + m_specularPort.Visible = false; + m_metallicPort.Visible = true; + m_coatMaskPort.Visible = true; + m_diffusionProfilePort.Visible = false; + m_subsurfaceMaskPort.Visible = false; + m_thicknessPort.Visible = false; + m_anisotropyPort.Visible = false; + m_iridescenceThicknessPort.Visible = false; + m_iridescenceMaskPort.Visible = false; + m_indexOfRefractionPort.Visible = false; + m_transmittanceColorPort.Visible = false; + m_transmittanceAbsorptionDistancePort.Visible = false; + m_transmittanceMaskPort.Visible = false; + } + break; + case HDSRPMaterialType.Specular: + { + m_specularPort.Visible = true; + m_metallicPort.Visible = false; + m_coatMaskPort.Visible = true; + m_diffusionProfilePort.Visible = false; + m_subsurfaceMaskPort.Visible = false; + m_thicknessPort.Visible = false; + m_anisotropyPort.Visible = false; + m_iridescenceThicknessPort.Visible = false; + m_iridescenceMaskPort.Visible = false; + m_indexOfRefractionPort.Visible = false; + m_transmittanceColorPort.Visible = false; + m_transmittanceAbsorptionDistancePort.Visible = false; + m_transmittanceMaskPort.Visible = false; + } + break; + case HDSRPMaterialType.Anisotropy: + { + m_specularPort.Visible = false; + m_metallicPort.Visible = true; + m_coatMaskPort.Visible = true; + m_diffusionProfilePort.Visible = false; + m_subsurfaceMaskPort.Visible = false; + m_thicknessPort.Visible = false; + m_anisotropyPort.Visible = true; + m_iridescenceThicknessPort.Visible = false; + m_iridescenceMaskPort.Visible = false; + m_indexOfRefractionPort.Visible = false; + m_transmittanceColorPort.Visible = false; + m_transmittanceAbsorptionDistancePort.Visible = false; + m_transmittanceMaskPort.Visible = false; + } + break; + case HDSRPMaterialType.Iridescence: + { + m_specularPort.Visible = false; + m_metallicPort.Visible = true; + m_coatMaskPort.Visible = true; + m_diffusionProfilePort.Visible = false; + m_subsurfaceMaskPort.Visible = false; + m_thicknessPort.Visible = false; + m_anisotropyPort.Visible = false; + m_iridescenceThicknessPort.Visible = true; + m_iridescenceMaskPort.Visible = true; + m_indexOfRefractionPort.Visible = false; + m_transmittanceColorPort.Visible = false; + m_transmittanceAbsorptionDistancePort.Visible = false; + m_transmittanceMaskPort.Visible = false; + } + break; + case HDSRPMaterialType.Translucent: + { + m_specularPort.Visible = false; + m_metallicPort.Visible = false; + m_coatMaskPort.Visible = false; + m_diffusionProfilePort.Visible = true; + m_subsurfaceMaskPort.Visible = false; + m_thicknessPort.Visible = true; + m_anisotropyPort.Visible = false; + m_iridescenceThicknessPort.Visible = false; + m_iridescenceMaskPort.Visible = false; + m_indexOfRefractionPort.Visible = false; + m_transmittanceColorPort.Visible = false; + m_transmittanceAbsorptionDistancePort.Visible = false; + m_transmittanceMaskPort.Visible = false; + } + break; + } + } + m_sizeIsDirty = ( m_isInvisible == InvisibilityStatus.Visible ); + } + + + public void SetShaderLODValueAndLabel( int value ) + { + if( ShaderLOD != value ) + ShaderLOD = value; + + if( ContainerGraph.HasLODs ) + { + SetClippedAdditionalTitle( string.Format( LodSubtitle, ShaderLOD ) ); + } + else + { + SetAdditonalTitleText( string.Empty ); + } + } + + void DrawLODAddRemoveButtons() + { + DrawLODAddRemoveButtons( -2 , true ); + } + + void DrawLODAddRemoveButtons( int index , bool showRemove ) + { + if( GUILayoutButton( string.Empty, UIUtils.PlusStyle, GUILayout.Width( 15 ) ) ) + { + Vector2 minPos = Vec2Position; + //bool newNodePositionMode = false; + //if( newNodePositionMode ) + //{ + // for( int lod = 0; lod < ContainerGraph.LodMultiPassMasternodes.Count; lod++ ) + // { + // if( ContainerGraph.LodMultiPassMasternodes[ lod ].Count != 0 ) + // { + // Vector2 currPos = ContainerGraph.LodMultiPassMasternodes[ lod ].NodesList[ m_passIdx ].Vec2Position; + // if( currPos.y > minPos.y ) + // { + // minPos = currPos; + // } + // } + // else + // { + // if( index < 0 ) + // { + // index = lod; + // } + // break; + // } + // } + //} + //else + //{ + for( int lod = ContainerGraph.LodMultiPassMasternodes.Count - 1 ; lod >= 0; lod-- ) + { + if( ContainerGraph.LodMultiPassMasternodes[ lod ].Count != 0 ) + { + minPos = ContainerGraph.LodMultiPassMasternodes[ lod ].NodesList[ m_passIdx ].Vec2Position; + break; + } + } + //} + + minPos.y += HeightEstimate + 10; + ContainerGraph.CreateLodMasterNodes( m_templateMultiPass, index, minPos ); + } + + if( showRemove && GUILayoutButton( string.Empty, UIUtils.MinusStyle, GUILayout.Width( 15 ) ) ) + { + ContainerGraph.DestroyLodMasterNodes( index ); + } + } + + void SetupLODNodeName() + { + if( IsMainOutputNode ) + { + if( string.IsNullOrEmpty( m_mainLODName ) ) + { + m_shaderNameIsTitle = true; + m_content.text = GenerateClippedTitle( m_croppedShaderName ); + } + else + { + m_shaderNameIsTitle = false; + m_content.text = GenerateClippedTitle( m_mainLODName ); + } + } + else + { + m_shaderNameIsTitle = false; + m_content.text = GenerateClippedTitle( m_passName ); + } + } + + public void DrawLodRowItem(bool listMode) + { + float labelWidthBuffer = EditorGUIUtility.labelWidth; + EditorGUILayout.BeginHorizontal(); + if( listMode ) + { + if( GUILayout.Button( "\u25b6", GUILayout.Width( 18 ), GUILayout.Height( 18 ) ) ) + { + m_containerGraph.ParentWindow.FocusOnNode( this, 1, false, true ); + } + EditorGUI.BeginChangeCheck(); + GUI.SetNextControlName( LodValueId + m_lodIndex ); + m_shaderLOD = EditorGUILayoutIntField( string.Empty, m_shaderLOD, GUILayout.Width( 50 ) ); + } + else + { + EditorGUI.BeginChangeCheck(); + EditorGUIUtility.labelWidth = 45; + GUI.SetNextControlName( LodValueId + m_lodIndex ); + m_shaderLOD = EditorGUILayoutIntField( "LOD", ShaderLOD, GUILayout.Width(100)); + EditorGUIUtility.labelWidth = labelWidthBuffer; + } + + if( EditorGUI.EndChangeCheck() ) + { + m_refreshLODValueMasterNodes = true; + m_refreshLODValueMasterNodesTimestamp = EditorApplication.timeSinceStartup; + + if( ContainerGraph.HasLODs ) + SetClippedAdditionalTitle( string.Format( LodSubtitle, ShaderLOD ) ); + } + + EditorGUI.BeginChangeCheck(); + GUI.SetNextControlName( LodNameId + ShaderLOD ); + if( listMode ) + { + m_mainLODName = EditorGUILayoutTextField( string.Empty, m_mainLODName, GUILayout.Width( 100 ) ); + } + else + { + GUILayout.Space( -15 ); + EditorGUIUtility.labelWidth = 45; + m_mainLODName = EditorGUILayoutTextField( string.Empty, m_mainLODName ); + EditorGUIUtility.labelWidth = labelWidthBuffer; + } + if( EditorGUI.EndChangeCheck() ) + { + // If reorder is scheduled make sure it doesn't happen when editing LOD name + if( m_refreshLODValueMasterNodes ) + m_refreshLODValueMasterNodesTimestamp = EditorApplication.timeSinceStartup; + + SetupLODNodeName(); + } + + if( listMode ) + DrawLODAddRemoveButtons( m_lodIndex, ( m_lodIndex >= 0) ); + + EditorGUILayout.EndHorizontal(); + + if( m_refocusLODValueMasterNodes ) + { + m_refocusLODValueMasterNodes = false; + string focusedControl = GUI.GetNameOfFocusedControl(); + if( focusedControl.Contains( LodValueId ) ) + { + GUI.FocusControl( LodValueId + m_lodIndex ); + TextEditor te = (TextEditor)GUIUtility.GetStateObject( typeof( TextEditor ), GUIUtility.keyboardControl ); + if( te != null ) + { + te.SelectTextEnd(); + } + } + else if( focusedControl.Contains( LodNameId ) ) + { + GUI.FocusControl( LodNameId + m_lodIndex ); + TextEditor te = (TextEditor)GUIUtility.GetStateObject( typeof( TextEditor ), GUIUtility.keyboardControl ); + if( te != null ) + { + te.SelectTextEnd(); + } + } + } + } + + void DrawLOD() + { + if( m_templateMultiPass.CanAddLODs && m_lodIndex == -1 ) + { + EditorGUILayout.Space(); + + DrawLodRowItem(true); + EditorGUILayout.Space(); + + for( int i = 0; i < ContainerGraph.LodMultiPassMasternodes.Count; i++ ) + { + if( ContainerGraph.LodMultiPassMasternodes[ i ].NodesList.Count > 0 ) + { + TemplateMultiPassMasterNode masterNode = m_containerGraph.LodMultiPassMasternodes[ i ].NodesList[ m_passIdx ]; + masterNode.DrawLodRowItem( true ); + EditorGUILayout.Space(); + } + } + EditorGUILayout.Space(); + } + } + + void DrawCommonProperties() + { + if( m_isMainOutputNode ) + { + //if( m_templateMultiPass.CanAddLODs && m_lodIndex == -1 ) + //{ + // if( GUILayoutButton( string.Empty, UIUtils.PlusStyle, GUILayout.Width( 15 ) ) ) + // { + // ContainerGraph.CreateLodMasterNodes( m_templateMultiPass, Vec2Position ); + // } + + + // if( GUILayoutButton( string.Empty, UIUtils.MinusStyle, GUILayout.Width( 15 ) ) ) + // { + // ContainerGraph.DestroyLodMasterNodes(); + // } + + //} + + //EditorGUILayout.LabelField( "LOD: " + m_lodIndex ); + DrawShaderName(); + DrawCurrentShaderType(); + + if( m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].Modules.SRPIsPBRHD ) + { + if( m_templateMultiPass.CustomTemplatePropertyUI == CustomTemplatePropertyUIEnum.HDPBR ) + { + EditorGUI.BeginChangeCheck(); + CurrentHDMaterialType = (HDSRPMaterialType)EditorGUILayoutEnumPopup( HDSRPMaterialTypeStr, m_hdSrpMaterialType ); + if( EditorGUI.EndChangeCheck() ) + ConfigHDPorts(); + } + } + + EditorGUI.BeginChangeCheck(); + DrawPrecisionProperty( false ); + if( EditorGUI.EndChangeCheck() ) + ContainerGraph.CurrentPrecision = m_currentPrecisionType; + + DrawSamplingMacros(); + + m_drawInstancedHelper.Draw( this ); + m_fallbackHelper.Draw( this ); + DrawCustomInspector( m_templateMultiPass.SRPtype != TemplateSRPType.BuiltIn ); + m_subShaderOptions.DrawCustomOptions( this ); + m_dependenciesHelper.Draw( this, true ); + } + //EditorGUILayout.LabelField( m_subShaderIdxStr ); + //EditorGUILayout.LabelField( m_passIdxStr ); + + if( IsLODMainMasterNode && m_templateMultiPass.CanAddLODs ) + { + NodeUtils.DrawNestedPropertyGroup( ref m_lodFoldout, AdditionalLODsStr, DrawLOD, DrawLODAddRemoveButtons ); + } + + DrawOpenTemplateButton(); + if( DebugConsoleWindow.DeveloperMode ) + DrawReloadButton(); + + } + + public void DrawSubShaderProperties() + { + if( !m_isMainOutputNode ) + { + m_mainMasterNodeRef.DrawSubShaderProperties(); + return; + } + + bool noValidData = true; + if( ShaderLOD > 0 ) + { + noValidData = false; + if( m_templateMultiPass.CanAddLODs && m_containerGraph.LodMultiPassMasternodes[0].Count > 0 ) + { + DrawLodRowItem( false ); + } + else + { + ShaderLOD = EditorGUILayoutIntField( SubShaderLODValueLabel, ShaderLOD ); + } + } + + if( m_subShaderModule.HasValidData ) + { + noValidData = false; + m_subShaderModule.Draw( this, m_templateMultiPass.SubShaders[ m_subShaderIdx ].Modules ); + //if( m_subShaderModule.IsDirty ) + //{ + // List mpNodes = UIUtils.CurrentWindow.CurrentGraph.MultiPassMasterNodes.NodesList; + // int count = mpNodes.Count; + // for( int i = 0; i < count; i++ ) + // { + // if( mpNodes[ i ].SubShaderIdx == m_subShaderIdx && mpNodes[ i ].UniqueId != UniqueId ) + // { + // mpNodes[ i ].SubShaderModule.CopyFrom( m_subShaderModule ); + // } + // } + // m_subShaderModule.IsDirty = false; + //} + } + + m_passSelector.Draw( this ); + + if( noValidData ) + { + EditorGUILayout.HelpBox( NoSubShaderPropertyStr, MessageType.Info ); + } + } + + void DrawPassProperties() + { + EditorGUI.BeginChangeCheck(); + m_passName = EditorGUILayoutTextField( PassNameStr, m_passName ); + if( EditorGUI.EndChangeCheck() ) + { + if( m_passName.Length > 0 ) + { + m_passName = UIUtils.RemoveShaderInvalidCharacters( m_passName ); + } + else + { + m_passName = m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].PassNameContainer.Data; + } + //if( !m_templateMultiPass.IsSinglePass ) + // SetClippedTitle( m_passName ); + } + EditorGUILayout.LabelField( Pass.Modules.PassUniqueName ); + if( m_passModule.HasValidData ) + { + m_passModule.Draw( this, m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].Modules, m_subShaderModule ); + } + + m_usePass.Draw( this, false ); + m_passOptions.DrawCustomOptions( this ); + } + + bool CreateInstructionsForList( TemplateData templateData, ref List ports, ref string shaderBody, ref List vertexInstructions, ref List fragmentInstructions ) + { + if( ports.Count == 0 ) + return true; + AddHDKeywords(); + bool isValid = true; + //UIUtils.CurrentWindow.CurrentGraph.ResetNodesLocalVariables(); + for( int i = 0; i < ports.Count; i++ ) + { + TemplateInputData inputData = templateData.InputDataFromId( ports[ i ].PortId ); + if( ports[ i ].HasOwnOrLinkConnection ) + { + //if( m_templateMultiPass.SubShaders[ m_subShaderIdx ].Modules.SRPType == TemplateSRPType.Lightweight ) + //{ + // if( ports[ i ].Name.Contains( "Normal" ) ) + // { + // m_currentDataCollector.AddToDirectives( SRPMaterialNormalMapKeyword, -1, AdditionalLineType.Define ); + // } + + // if( ports[ i ].Name.Contains( "Alpha Clip Threshold" ) ) + // { + // m_currentDataCollector.AddToDirectives( SRPMaterialBlendModeAlphaClipThresholdKeyword, -1, AdditionalLineType.Define ); + // } + + // if( ports[ i ].Name.Contains( "Specular" ) ) + // { + // m_currentDataCollector.AddToDirectives( SRPLWMaterialSpecularKeyword, -1, AdditionalLineType.Define ); + // } + //} + //else if( m_templateMultiPass.SubShaders[ m_subShaderIdx ].Modules.SRPType == TemplateSRPType.HD ) + //{ + // if( ports[ i ].Name.Contains( "Normal" ) ) + // { + // //m_currentDataCollector.AddToDefines( UniqueId, SRPMaterialNormalMapKeyword ); + // } + + // if( ports[ i ].Name.Contains( "Alpha Clip Threshold" ) ) + // { + // //m_currentDataCollector.AddToDefines( UniqueId, SRPMaterialAlphaTestKeyword ); + // } + + //} + + m_currentDataCollector.ResetInstructions(); + m_currentDataCollector.ResetVertexInstructions(); + + m_currentDataCollector.PortCategory = ports[ i ].Category; + string newPortInstruction = ports[ i ].GeneratePortInstructions( ref m_currentDataCollector ); + + if( m_currentDataCollector.DirtySpecialLocalVariables ) + { + string cleanVariables = m_currentDataCollector.SpecialLocalVariables.Replace( "\t", string.Empty ); + m_currentDataCollector.AddInstructions( cleanVariables, false ); + m_currentDataCollector.ClearSpecialLocalVariables(); + } + + if( m_currentDataCollector.DirtyVertexVariables ) + { + string cleanVariables = m_currentDataCollector.VertexLocalVariables.Replace( "\t", string.Empty ); + m_currentDataCollector.AddVertexInstruction( cleanVariables, UniqueId, false ); + m_currentDataCollector.ClearVertexLocalVariables(); + } + + // fill functions + for( int j = 0; j < m_currentDataCollector.InstructionsList.Count; j++ ) + { + fragmentInstructions.Add( m_currentDataCollector.InstructionsList[ j ].PropertyName ); + } + + for( int j = 0; j < m_currentDataCollector.VertexDataList.Count; j++ ) + { + vertexInstructions.Add( m_currentDataCollector.VertexDataList[ j ].PropertyName ); + } + + m_templateMultiPass.SetPassInputData( m_subShaderIdx, m_passIdx, ports[ i ].PortId, newPortInstruction ); + isValid = m_templateMultiPass.FillTemplateBody( m_subShaderIdx, m_passIdx, inputData.TagId, ref shaderBody, newPortInstruction ) && isValid; + } + else + { + m_templateMultiPass.SetPassInputData( m_subShaderIdx, m_passIdx, ports[ i ].PortId, inputData.DefaultValue ); + isValid = m_templateMultiPass.FillTemplateBody( m_subShaderIdx, m_passIdx, inputData.TagId, ref shaderBody, inputData.DefaultValue ) && isValid; + } + } + return isValid; + } + + public string BuildShaderBody( MasterNodeDataCollector inDataCollector, ref MasterNodeDataCollector outDataCollector ) + { + List list = ContainerGraph.MultiPassMasterNodes.NodesList; + int currentSubshader = list[ 0 ].SubShaderIdx; + m_templateMultiPass.SetShaderName( string.Format( TemplatesManager.NameFormatter, m_shaderName ) ); + if( string.IsNullOrEmpty( m_customInspectorName ) ) + { + m_templateMultiPass.SetCustomInspector( string.Empty ); + } + else + { + m_templateMultiPass.SetCustomInspector( CustomInspectorFormatted ); + } + + m_templateMultiPass.SetFallback( m_fallbackHelper.FallbackShader ); + m_templateMultiPass.SetDependencies( m_dependenciesHelper.GenerateDependencies() ); + + if( inDataCollector != null ) + outDataCollector.CopyPropertiesFromDataCollector( inDataCollector ); + + outDataCollector.TemplateDataCollectorInstance.CurrentSRPType = m_templateMultiPass.SRPtype; + + int lastActivePass = m_passSelector.LastActivePass; + int count = list.Count; + bool filledSubshaderData = false; + + bool foundExcludePassName = false; + string excludePassName = string.Empty; + + foundExcludePassName = CheckExcludeAllPassOptions( m_subShaderOptions, out excludePassName ); + for( int i = 0; i < count; i++ ) + { + bool removePass = !m_passSelector.IsVisible( i ) || ( foundExcludePassName && !list[ i ].OriginalPassName.Equals( excludePassName ) ); + + list[ 0 ].CurrentTemplate.IdManager.SetPassIdUsage( i, removePass ); + if( removePass ) + { + if( m_isMainOutputNode ) + { + //Make sure that property change options are set even if the main master node is invisible + CheckPropertyChangesOnOptions( m_subShaderOptions ); + } + continue; + } + + list[ i ].CollectData(); + list[ i ].FillPassData( this, outDataCollector.TemplateDataCollectorInstance ); + + if( list[ i ].SubShaderIdx == currentSubshader ) + { + outDataCollector.CopyPropertiesFromDataCollector( list[ i ].CurrentDataCollector ); + } + else + { + list[ i - 1 ].FillPropertyData( outDataCollector ); + list[ i - 1 ].FillSubShaderData(); + outDataCollector.Destroy(); + outDataCollector = new MasterNodeDataCollector(); + outDataCollector.CopyPropertiesFromDataCollector( list[ i ].CurrentDataCollector ); + + currentSubshader = list[ i ].SubShaderIdx; + } + + // Last element must the one filling subshader data + // as only there all properties are caught + //if( i == ( count - 1 ) ) + if( i == lastActivePass ) + { + list[ i ].FillPropertyData( outDataCollector ); + } + + if( list[ i ].IsMainOutputNode ) + { + filledSubshaderData = true; + list[ i ].FillSubShaderData(); + } + } + + if( !filledSubshaderData ) + { + FillSubShaderData(); + } + outDataCollector.TemplateDataCollectorInstance.BuildCBuffer( -1 ); + + //Fill uniforms is set on last since we need to collect all srp batcher data ( if needed ) + //To set it into each pass + for( int i = 0; i < count; i++ ) + { + bool removePass = !m_passSelector.IsVisible( i ) || ( foundExcludePassName && !list[ i ].OriginalPassName.Equals( excludePassName )); + if( removePass ) + continue; + + list[ i ].FillUniforms( outDataCollector.TemplateDataCollectorInstance ); + } + + return list[ 0 ].CurrentTemplate.IdManager.BuildShader(); + } + + public string BuildLOD( MasterNodeDataCollector inDataCollector, ref MasterNodeDataCollector outDataCollector ) + { + UsageListTemplateMultiPassMasterNodes bufferNodesList = ContainerGraph.MultiPassMasterNodes; + int bufferMasterNodeId = ContainerGraph.CurrentMasterNodeId; + + ContainerGraph.MultiPassMasterNodes = ContainerGraph.LodMultiPassMasternodes[ m_lodIndex ]; + ContainerGraph.CurrentMasterNodeId = UniqueId; + + m_templateMultiPass.ResetState(); + base.Execute( string.Empty, false ); + string shaderBody = BuildShaderBody( inDataCollector, ref outDataCollector ); + + + ContainerGraph.MultiPassMasterNodes = bufferNodesList; + ContainerGraph.CurrentMasterNodeId = bufferMasterNodeId; + return shaderBody; + } + + public override Shader Execute( string pathname, bool isFullPath ) + { + ForceReordering(); + MasterNodeDataCollector overallDataCollector = new MasterNodeDataCollector(); + + //BUILD LOD + string allLodSubShaders = string.Empty; + if( ContainerGraph.HasLODs ) + { + for( int lod = 0; lod < ContainerGraph.LodMultiPassMasternodes.Count; lod++ ) + { + if( ContainerGraph.LodMultiPassMasternodes[ lod ].Count == 0 ) + break; + + TemplateMultiPassMasterNode newMasterNode = ContainerGraph.LodMultiPassMasternodes[ lod ].NodesList.Find( ( x ) => x.IsMainOutputNode ); + string lodSubShaders = newMasterNode.BuildLOD( null, ref overallDataCollector ); + lodSubShaders = TemplateHelperFunctions.GetSubShaderFrom( lodSubShaders ) + "\n"; + allLodSubShaders += lodSubShaders; + } + } + + //BUILD MAIN + m_templateMultiPass.ResetState(); + base.Execute( pathname, isFullPath ); + MasterNodeDataCollector dummy = new MasterNodeDataCollector(); + string shaderBody = BuildShaderBody( overallDataCollector, ref dummy ); + + //COMBINE LOD WITH MAIN + if( !string.IsNullOrEmpty( allLodSubShaders ) ) + shaderBody = shaderBody.Replace( TemplatesManager.TemplateLODsTag, allLodSubShaders ); + + UpdateShaderAsset( ref pathname, ref shaderBody, isFullPath ); + return m_currentShader; + } + + public void CollectData() + { + if( m_inputPorts.Count == 0 ) + return; + + ContainerGraph.ResetNodesLocalVariables(); + m_optionsDefineContainer.RemoveTemporaries(); + m_currentDataCollector = new MasterNodeDataCollector( this ); + m_currentDataCollector.TemplateDataCollectorInstance.SetMultipassInfo( m_templateMultiPass, m_subShaderIdx, m_passIdx, m_templateMultiPass.SubShaders[ m_subShaderIdx ].Modules.SRPType ); + m_currentDataCollector.TemplateDataCollectorInstance.FillSpecialVariables( m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ] ); + SetupNodeCategories(); + if( m_containerGraph.IsInstancedShader ) + { + string blockName = UIUtils.RemoveInvalidCharacters( ContainerGraph.GetMainMasterNodeOfLOD( -1 ).ShaderName ); + m_currentDataCollector.SetupInstancePropertiesBlock( blockName ); + } + TemplateData templateData = m_templateMultiPass.CreateTemplateData( m_shaderName, string.Empty, m_subShaderIdx, m_passIdx ); + m_currentDataCollector.TemplateDataCollectorInstance.BuildFromTemplateData( m_currentDataCollector, templateData ); + + if( m_currentDataCollector.TemplateDataCollectorInstance.InterpData.DynamicMax ) + { + int interpolatorAmount = -1; + if( m_passModule.ShaderModelHelper.ValidData ) + { + interpolatorAmount = m_passModule.ShaderModelHelper.InterpolatorAmount; + } + else + { + TemplateModulesHelper subShaderModule = IsMainOutputNode ? m_subShaderModule : ( m_containerGraph.CurrentMasterNode as TemplateMultiPassMasterNode ).SubShaderModule; + if( subShaderModule.ShaderModelHelper.ValidData ) + { + interpolatorAmount = subShaderModule.ShaderModelHelper.InterpolatorAmount; + } + } + + if( interpolatorAmount > -1 ) + { + m_currentDataCollector.TemplateDataCollectorInstance.InterpData.RecalculateAvailableInterpolators( interpolatorAmount ); + } + } + + //Copy Properties + { + int shaderPropertiesAmount = m_templateMultiPass.AvailableShaderProperties.Count; + for( int i = 0; i < shaderPropertiesAmount; i++ ) + { + m_currentDataCollector.SoftRegisterUniform( m_templateMultiPass.AvailableShaderProperties[ i ] ); + } + } + //Copy Globals from SubShader level + { + int subShaderGlobalAmount = m_templateMultiPass.SubShaders[ m_subShaderIdx ].AvailableShaderGlobals.Count; + for( int i = 0; i < subShaderGlobalAmount; i++ ) + { + m_currentDataCollector.SoftRegisterUniform( m_templateMultiPass.SubShaders[ m_subShaderIdx ].AvailableShaderGlobals[ i ] ); + } + } + //Copy Globals from Pass Level + { + int passGlobalAmount = m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].AvailableShaderGlobals.Count; + for( int i = 0; i < passGlobalAmount; i++ ) + { + m_currentDataCollector.SoftRegisterUniform( m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].AvailableShaderGlobals[ i ] ); + } + } + // Check Current Options for property changes on subshader + if( m_isMainOutputNode ) + { + CheckPropertyChangesOnOptions( m_subShaderOptions ); + } + + // Check Current Options for property changes on pass + CheckPropertyChangesOnOptions( m_passOptions ); + + + //Set SRP info +#if UNITY_2018_3_OR_NEWER + if( m_templateMultiPass.SRPtype != TemplateSRPType.BuiltIn ) + ASEPackageManagerHelper.SetSRPInfoOnDataCollector( ref m_currentDataCollector ); +#endif + RegisterStandaloneFuntions(); + m_containerGraph.CheckPropertiesAutoRegister( ref m_currentDataCollector ); + + //Sort ports by both + List fragmentPorts = new List(); + List vertexPorts = new List(); + + SortInputPorts( ref vertexPorts, ref fragmentPorts ); + + + string shaderBody = templateData.TemplateBody; + + List vertexInstructions = new List(); + List fragmentInstructions = new List(); + + bool validBody = true; + + //validBody = CreateInstructionsForList( templateData, ref fragmentPorts, ref shaderBody, ref vertexInstructions, ref fragmentInstructions ) && validBody; + //ContainerGraph.ResetNodesLocalVariablesIfNot( MasterNodePortCategory.Vertex ); + //validBody = CreateInstructionsForList( templateData, ref vertexPorts, ref shaderBody, ref vertexInstructions, ref fragmentInstructions ) && validBody; + validBody = CreateInstructionsForList( templateData, ref vertexPorts, ref shaderBody, ref vertexInstructions, ref fragmentInstructions ) && validBody; + validBody = CreateInstructionsForList( templateData, ref fragmentPorts, ref shaderBody, ref vertexInstructions, ref fragmentInstructions ) && validBody; + + if( !m_isMainOutputNode && m_mainMasterNodeRef == null ) + { + m_mainMasterNodeRef = m_containerGraph.CurrentMasterNode as TemplateMultiPassMasterNode; + } + + TerrainDrawInstancedHelper drawInstanced = m_isMainOutputNode ? m_drawInstancedHelper : m_mainMasterNodeRef.DrawInstancedHelperInstance; + drawInstanced.UpdateDataCollectorForTemplates( ref m_currentDataCollector, ref vertexInstructions ); + + templateData.ResetTemplateUsageData(); + + // Fill vertex interpolators assignment + for( int i = 0; i < m_currentDataCollector.VertexInterpDeclList.Count; i++ ) + { + vertexInstructions.Add( m_currentDataCollector.VertexInterpDeclList[ i ] ); + } + + vertexInstructions.AddRange( m_currentDataCollector.TemplateDataCollectorInstance.GetInterpUnusedChannels() ); + + //Fill common local variables and operations + validBody = m_templateMultiPass.FillVertexInstructions( m_subShaderIdx, m_passIdx, vertexInstructions.ToArray() ) && validBody; + validBody = m_templateMultiPass.FillFragmentInstructions( m_subShaderIdx, m_passIdx, fragmentInstructions.ToArray() ) && validBody; + + vertexInstructions.Clear(); + vertexInstructions = null; + + fragmentInstructions.Clear(); + fragmentInstructions = null; + + // Add Instanced Properties + if( m_containerGraph.IsInstancedShader ) + { + m_currentDataCollector.OptimizeInstancedProperties(); + m_currentDataCollector.TabifyInstancedVars(); + + //string cbufferBegin = m_currentDataCollector.IsSRP ? + // string.Format( IOUtils.SRPInstancedPropertiesBegin, "UnityPerMaterial" ) : + // string.Format( IOUtils.InstancedPropertiesBegin, m_currentDataCollector.InstanceBlockName ); + //string cBufferEnd = m_currentDataCollector.IsSRP ? ( string.Format( IOUtils.SRPInstancedPropertiesEnd, m_currentDataCollector.InstanceBlockName ) ) : IOUtils.InstancedPropertiesEnd; + string cbufferBegin = m_currentDataCollector.IsSRP ? + string.Format( IOUtils.LWSRPInstancedPropertiesBegin, m_currentDataCollector.InstanceBlockName ) : + string.Format( IOUtils.InstancedPropertiesBegin, m_currentDataCollector.InstanceBlockName ); + string cBufferEnd = m_currentDataCollector.IsSRP ? ( string.Format( IOUtils.LWSRPInstancedPropertiesEnd, m_currentDataCollector.InstanceBlockName ) ) : IOUtils.InstancedPropertiesEnd; + + m_currentDataCollector.InstancedPropertiesList.Insert( 0, new PropertyDataCollector( -1, cbufferBegin ) ); + m_currentDataCollector.InstancedPropertiesList.Add( new PropertyDataCollector( -1, cBufferEnd ) ); + m_currentDataCollector.UniformsList.AddRange( m_currentDataCollector.InstancedPropertiesList ); + } + + if( m_currentDataCollector.DotsPropertiesList.Count > 0 ) + { + m_currentDataCollector.DotsPropertiesList.Insert( 0, new PropertyDataCollector( -1, "UNITY_DOTS_INSTANCING_START(MaterialPropertyMetadata)" ) ); + m_currentDataCollector.DotsPropertiesList.Insert( 0, new PropertyDataCollector( -1, "#ifdef UNITY_DOTS_INSTANCING_ENABLED" ) ); + m_currentDataCollector.DotsPropertiesList.Insert( 0, new PropertyDataCollector( -1, "" ) ); + m_currentDataCollector.DotsPropertiesList.Add( new PropertyDataCollector( -1, "UNITY_DOTS_INSTANCING_END(MaterialPropertyMetadata)" ) ); + m_currentDataCollector.DotsDefinesList.Add( new PropertyDataCollector( -1, "#endif" ) ); + m_currentDataCollector.UniformsList.AddRange( m_currentDataCollector.DotsPropertiesList ); + m_currentDataCollector.UniformsList.AddRange( m_currentDataCollector.DotsDefinesList ); + } + + TemplateShaderModelModule shaderModelModule = m_isMainOutputNode ? m_subShaderModule.ShaderModelHelper : m_mainMasterNodeRef.SubShaderModule.ShaderModelHelper; + string shaderModel = string.Empty; + if( m_passModule.ShaderModelHelper.ValidData ) + { + shaderModel = m_passModule.ShaderModelHelper.CurrentShaderModel; + } + else if( shaderModelModule.ValidData ) + { + shaderModel = shaderModelModule.CurrentShaderModel; + } + else if( m_templateMultiPass.GlobalShaderModel.IsValid ) + { + shaderModel = m_templateMultiPass.GlobalShaderModel.Value; + } + else + { + shaderModel = ( m_templateMultiPass.SRPtype == TemplateSRPType.HD ) ? "4.5" : "3.0"; + } + + m_currentDataCollector.TemplateDataCollectorInstance.CheckInterpolatorOverflow( shaderModel, m_passName ); + } + + public bool CheckExcludeAllPassOptions( TemplateOptionsUIHelper optionsUI, out string passName ) + { + List options = optionsUI.PassCustomOptionsUI; + for( int optionIdx = 0; optionIdx < options.Count; optionIdx++ ) + { + if( options[ optionIdx ].IsVisible ) + { + TemplateActionItem[] actionItems = options[ optionIdx ].CurrentOptionActions.Columns; + for( int actionIdx = 0; actionIdx < actionItems.Length; actionIdx++ ) + { + if( actionItems[ actionIdx ].ActionType == AseOptionsActionType.ExcludeAllPassesBut ) + { + passName = actionItems[ actionIdx ].ActionData; + return true; + } + } + } + } + + passName = string.Empty; + return false; + } + + public void CheckPropertyChangesOnOptions( TemplateOptionsUIHelper optionsUI ) + { + //Only Main LOD master node can change shader properties + if( !IsLODMainMasterNode ) + return; + + List options = optionsUI.PassCustomOptionsUI; + for( int optionIdx = 0; optionIdx < options.Count; optionIdx++ ) + { + if( options[ optionIdx ].IsVisible ) + { + TemplateActionItem[] actionItems = options[ optionIdx ].CurrentOptionActions.Columns; + for( int actionIdx = 0; actionIdx < actionItems.Length; actionIdx++ ) + { + if( actionItems[ actionIdx ].ActionType == AseOptionsActionType.SetShaderProperty && !string.IsNullOrEmpty( actionItems[ actionIdx ].ActionBuffer ) ) + { + TemplateShaderPropertyData data = m_templateMultiPass.GetShaderPropertyData( actionItems[ actionIdx ].ActionData ); + if( data != null ) + { + string newPropertyValue = data.CreatePropertyForValue( actionItems[ actionIdx ].ActionBuffer ); + CurrentTemplate.IdManager.SetReplacementText( data.FullValue, newPropertyValue ); + if( CurrentMaterial != null ) + { + switch( data.PropertyDataType ) + { + case WirePortDataType.FLOAT: + { + float value = 0; + if( actionItems[ actionIdx ].GetFloatValueFromActionBuffer( out value ) ) + { + CurrentMaterial.SetFloat( data.PropertyName, value ); + } + } + break; + case WirePortDataType.INT: + { + int value = 0; + if( actionItems[ actionIdx ].GetIntValueFromActionBuffer( out value ) ) + { + CurrentMaterial.SetInt( data.PropertyName, value ); + } + } + break; + case WirePortDataType.UINT: + case WirePortDataType.FLOAT2: + case WirePortDataType.FLOAT3: + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: + break; + } + + } + } + } + } + + if( options[ optionIdx ].Options.Type == AseOptionsType.Field ) + { + foreach( var item in CurrentTemplate.IdManager.RegisteredTags ) + { + if( item.Output.Equals( options[ optionIdx ].Options.FieldInlineName ) ) + { + var node = options[ optionIdx ].Options.FieldValue.GetPropertyNode(); + if( node != null && ( node.IsConnected || node.AutoRegister || node.UniqueId < -1 ) && options[ optionIdx ].Options.FieldValue.Active ) + { + item.Replacement = node.PropertyName; + } + } + } + } + } + } + } + + public void FillPropertyData( MasterNodeDataCollector dataCollector = null ) + { + MasterNodeDataCollector currDataCollector = ( dataCollector == null ) ? m_currentDataCollector : dataCollector; + +#if UNITY_2019_2_OR_NEWER + // Temporary hack + if( m_templateMultiPass.SRPtype != TemplateSRPType.BuiltIn && ASEPackageManagerHelper.CurrentHDVersion > ASESRPVersions.ASE_SRP_6_9_0 ) + { + if( m_templateMultiPass.AvailableShaderProperties.Find( x => x.PropertyName.Equals( "_AlphaCutoff" ) ) == null ) + { + if( !currDataCollector.ContainsProperty("_AlphaCutoff") ) + { + currDataCollector.AddToProperties( UniqueId, "[HideInInspector] _AlphaCutoff(\"Alpha Cutoff \", Range(0, 1)) = 0.5", -1 ); + } + } + + if( m_templateMultiPass.AvailableShaderProperties.Find( x => x.PropertyName.Equals( "_EmissionColor" ) ) == null ) + { + if( !currDataCollector.ContainsProperty( "_EmissionColor" ) ) + { + currDataCollector.AddToProperties( UniqueId, "[HideInInspector] _EmissionColor(\"Emission Color\", Color) = (1,1,1,1)", -1 ); + } + } + } +#endif + + // here we add ASE attributes to the material properties that allows materials to communicate with ASE + //if( m_templateMultiPass.SRPtype != TemplateSRPType.BuiltIn ) + { + string currentInspector = IsLODMainMasterNode ? m_customInspectorName : ContainerGraph.GetMainMasterNodeOfLOD( -1 ).CurrentInspector; + bool isASENativeInspector = Constants.DefaultCustomInspector.Equals( currentInspector ); + bool isUnityNativeInspector = Constants.UnityNativeInspectors.FindIndex( x => x.Equals( currentInspector ) ) > 0; + + List list = new List( currDataCollector.PropertiesDict.Values ); + list.Sort( ( x, y ) => { return x.OrderIndex.CompareTo( y.OrderIndex ); } ); + if( isUnityNativeInspector ) + { + for( int i = 0; i < list.Count; i++ ) + { + if( !( list[ i ].PropertyName.Contains( "[HideInInspector]" ) || list[ i ].PropertyName.Contains( "//" ) ) ) + { + list[ i ].PropertyName = "[ASEBegin]" + list[ i ].PropertyName; + break; + } + } + } + + if( !isASENativeInspector ) + { + for( int i = list.Count - 1; i >= 0; i-- ) + { + if( !( list[ i ].PropertyName.Contains( "[HideInInspector]" ) || list[ i ].PropertyName.Contains( "//" ) ) ) + { + list[ i ].PropertyName = "[ASEEnd]" + list[ i ].PropertyName; + break; + } + } + } + } + + m_templateMultiPass.SetPropertyData( currDataCollector.BuildUnformatedPropertiesStringArr() ); + } + + public void FillSubShaderData( /*MasterNodeDataCollector dataCollector = null */) + { + //MasterNodeDataCollector currDataCollector = ( dataCollector == null ) ? m_currentDataCollector : dataCollector; + //// SubShader Data + + //m_templateMultiPass.SetPropertyData( currDataCollector.BuildUnformatedPropertiesStringArr() ); + //templateMultiPass.SetSubShaderData( TemplateModuleDataType.ModulePass, m_subShaderIdx, currDataCollector.GrabPassList ); + if( ShaderLOD > -1 ) + { + string lodUniqueId = m_templateMultiPass.SubShaders[ m_subShaderIdx ].UniquePrefix + "Module" + m_templateMultiPass.SubShaders[ m_subShaderIdx ].LODContainer.Id; + m_templateMultiPass.IdManager.SetReplacementText( lodUniqueId, "LOD " + ShaderLOD ); + } + + SetModuleData( m_subShaderModule, true ); + } + + public void FillPassData( TemplateMultiPassMasterNode masterNode, TemplateDataCollector mainTemplateDataCollector ) + { + if( m_isInvisible != InvisibilityStatus.Visible ) + { + if( masterNode.UniqueId != UniqueId ) + { + if( ( m_invisibleOptions & (int)InvisibleOptionsEnum.SyncProperties ) > 0 ) + { + PassModule.SyncWith( masterNode.PassModule ); + } + } + + int inputCount = m_inputPorts.Count; + for( int i = 0; i < inputCount; i++ ) + { + if( m_inputPorts[ i ].HasExternalLink ) + { + TemplateMultiPassMasterNode linkedNode = m_inputPorts[ i ].ExternalLinkNode as TemplateMultiPassMasterNode; + if( linkedNode != null ) + { + SetLinkedModuleData( linkedNode.PassModule ); + } + } + } + } + + SetModuleData( m_passModule, false ); + if( m_currentDataCollector != null ) + { + if( Pass.CustomOptionsContainer.CopyOptionsFromMainPass ) + { + SetPassCustomOptionsInfo( m_containerGraph.CurrentMasterNode as TemplateMultiPassMasterNode ); + } + else + { + SetPassCustomOptionsInfo( this ); + } + + var inputArray = m_currentDataCollector.VertexInputList.ToArray(); + + m_templateMultiPass.SetPassData( TemplateModuleDataType.PassVertexData, m_subShaderIdx, m_passIdx, inputArray ); + m_templateMultiPass.SetPassData( TemplateModuleDataType.PassInterpolatorData, m_subShaderIdx, m_passIdx, m_currentDataCollector.InterpolatorList.ToArray() ); + SetHDInfoOnPass(); + List afterNativesIncludePragmaDefineList = new List(); + afterNativesIncludePragmaDefineList.AddRange( m_currentDataCollector.IncludesList ); + afterNativesIncludePragmaDefineList.AddRange( m_currentDataCollector.DefinesList ); + //includePragmaDefineList.AddRange( m_optionsDefineContainer.DefinesList ); + afterNativesIncludePragmaDefineList.AddRange( m_currentDataCollector.PragmasList ); + CheckSamplingMacrosFlag(); + m_currentDataCollector.AddASEMacros(); + afterNativesIncludePragmaDefineList.AddRange( m_currentDataCollector.AfterNativeDirectivesList ); + + //includePragmaDefineList.AddRange( m_currentDataCollector.MiscList ); + + List beforeNatives = new List(); + beforeNatives.AddRange( m_optionsDefineContainer.DefinesList ); + beforeNatives.AddRange( m_currentDataCollector.BeforeNativeDirectivesList ); + + m_templateMultiPass.SetPassData( TemplateModuleDataType.ModulePragmaBefore, m_subShaderIdx, m_passIdx, beforeNatives ); + m_templateMultiPass.SetPassData( TemplateModuleDataType.ModulePragma, m_subShaderIdx, m_passIdx, afterNativesIncludePragmaDefineList ); + + m_currentDataCollector.TemplateDataCollectorInstance.CloseLateDirectives(); + + //Add Functions + if( m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].Modules.FunctionsTag.IsValid ) + { + m_currentDataCollector.FunctionsList.InsertRange( 0, m_currentDataCollector.TemplateDataCollectorInstance.LateDirectivesList ); + m_templateMultiPass.SetPassData( TemplateModuleDataType.ModuleFunctions, m_subShaderIdx, m_passIdx, m_currentDataCollector.FunctionsList ); + } + else + { + m_currentDataCollector.UniformsList.InsertRange( 0, m_currentDataCollector.TemplateDataCollectorInstance.LateDirectivesList ); + m_currentDataCollector.UniformsList.AddRange( m_currentDataCollector.FunctionsList ); + } + + //copy srp batch if present + //if( m_currentDataCollector.IsSRP ) + //{ + // m_currentDataCollector.UniformsList.AddRange( mainTemplateDataCollector.SrpBatcherPropertiesList ); + //} + //m_templateMultiPass.SetPassData( TemplateModuleDataType.ModuleGlobals, m_subShaderIdx, m_passIdx, m_currentDataCollector.UniformsList ); + + m_templateMultiPass.SetPassData( TemplateModuleDataType.ModuleInputVert, m_subShaderIdx, m_passIdx, m_currentDataCollector.TemplateDataCollectorInstance.VertexInputParamsStr ); + m_templateMultiPass.SetPassData( TemplateModuleDataType.ModuleInputFrag, m_subShaderIdx, m_passIdx, m_currentDataCollector.TemplateDataCollectorInstance.FragInputParamsStr ); + + if( m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].TessVControlTag != null && m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].TessVControlTag.IsValid ) + m_templateMultiPass.SetPassData( TemplateModuleDataType.VControl, m_subShaderIdx, m_passIdx, inputArray ); + + if( m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].TessControlData != null && m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].TessControlData.IsValid ) + m_templateMultiPass.SetPassData( TemplateModuleDataType.ControlData, m_subShaderIdx, m_passIdx, m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].TessControlData.GenerateControl( m_currentDataCollector.TemplateDataCollectorInstance.VertexDataDict, m_currentDataCollector.VertexInputList ) ); + + if( m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].TessDomainData != null && m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].TessDomainData.IsValid ) + m_templateMultiPass.SetPassData( TemplateModuleDataType.DomainData, m_subShaderIdx, m_passIdx, m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].TessDomainData.GenerateDomain( m_currentDataCollector.TemplateDataCollectorInstance.VertexDataDict, m_currentDataCollector.VertexInputList ) ); + + afterNativesIncludePragmaDefineList.Clear(); + afterNativesIncludePragmaDefineList = null; + + beforeNatives.Clear(); + beforeNatives = null; + } + + m_templateMultiPass.SetPassData( TemplateModuleDataType.PassNameData, m_subShaderIdx, m_passIdx, string.Format( PassNameFormateStr, m_passName ) ); + } + + public List CrossCheckSoftRegisteredUniformList( List uniformList ) + { + List newItems = new List(); + for( int i = 0; i < uniformList.Count; i++ ) + { + if( !m_currentDataCollector.CheckIfSoftRegistered( uniformList[ i ].PropertyName ) ) + { + newItems.Add( uniformList[ i ] ); + } + } + return newItems; + } + + public void FillUniforms( TemplateDataCollector mainTemplateDataCollector ) + { + if( m_currentDataCollector.IsSRP ) + { + + if( m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].Modules.SRPBatcherTag.IsValid ) + { + List finalList = CrossCheckSoftRegisteredUniformList( mainTemplateDataCollector.SrpBatcherPropertiesList ); + m_templateMultiPass.SetPassData( TemplateModuleDataType.ModuleSRPBatcher, m_subShaderIdx, m_passIdx, finalList ); + finalList.Clear(); + finalList = null; + } + else + { + List finalList = CrossCheckSoftRegisteredUniformList( mainTemplateDataCollector.FullSrpBatcherPropertiesList ); + m_currentDataCollector.UniformsList.AddRange( finalList ); + finalList.Clear(); + finalList = null; + } + } + m_templateMultiPass.SetPassData( TemplateModuleDataType.ModuleGlobals, m_subShaderIdx, m_passIdx, m_currentDataCollector.UniformsList ); + } + + void SetHDInfoOnPass() + { +#if UNITY_2019_3_OR_NEWER + if( ASEPackageManagerHelper.CurrentHDVersion > ASESRPVersions.ASE_SRP_6_9_1 ) + return; +#endif + + if( m_currentDataCollector.TemplateDataCollectorInstance.CurrentSRPType == TemplateSRPType.HD ) + { + TemplateModulesHelper subShaderHelper = null; + TemplateModulesHelper passHelper = null; + + if( m_isMainOutputNode ) + { + subShaderHelper = m_subShaderModule; + passHelper = m_passModule; + } + else + { + TemplateMultiPassMasterNode masterNode = m_containerGraph.CurrentMasterNode as TemplateMultiPassMasterNode; + if( masterNode != null ) + { + subShaderHelper = masterNode.SubShaderModule; + passHelper = masterNode.PassModule; + } + else + { + subShaderHelper = m_subShaderModule; + passHelper = m_passModule; + } + } + + RenderQueue renderQueue = RenderQueue.Geometry; + RenderType renderType = RenderType.Opaque; + if( passHelper.TagsHelper.HasRenderInfo( ref renderType, ref renderQueue ) || + subShaderHelper.TagsHelper.HasRenderInfo( ref renderType, ref renderQueue ) ) + { + if( renderType == RenderType.Transparent && renderQueue == RenderQueue.Transparent ) + { + SetExtraDefine( SRPMaterialTransparentKeyword ); + //m_currentDataCollector.AddToDefines( UniqueId, SRPMaterialTransparentKeyword ); + TemplatesBlendModule blendOpHelper = passHelper.BlendOpHelper.ValidBlendMode ? passHelper.BlendOpHelper : subShaderHelper.BlendOpHelper; + if( blendOpHelper.IsAdditiveRGB ) + { + SetExtraDefine( SRPMaterialBlendModeAddKeyword ); + //m_currentDataCollector.AddToDefines( UniqueId, SRPMaterialBlendModeAddKeyword ); + } + else if( blendOpHelper.IsAlphaBlendRGB ) + { + SetExtraDefine( SRPMaterialBlendModeAlphaKeyword ); + //m_currentDataCollector.AddToDefines( UniqueId, SRPMaterialBlendModeAlphaKeyword ); + } + } + } + } + } + + void SetLinkedModuleData( TemplateModulesHelper linkedModule ) + { + //if( linkedModule.AdditionalPragmas.ValidData ) + //{ + // linkedModule.AdditionalPragmas.AddToDataCollector( ref m_currentDataCollector, m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].Modules.IncludePragmaContainer ); + //} + + //if( linkedModule.AdditionalIncludes.ValidData ) + //{ + // linkedModule.AdditionalIncludes.AddToDataCollector( ref m_currentDataCollector, m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].Modules.IncludePragmaContainer ); + //} + + //if( linkedModule.AdditionalDefines.ValidData ) + //{ + // linkedModule.AdditionalDefines.AddToDataCollector( ref m_currentDataCollector, m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].Modules.IncludePragmaContainer ); + //} + + if( linkedModule.AdditionalDirectives.ValidData ) + { + linkedModule.AdditionalDirectives.AddAllToDataCollector( ref m_currentDataCollector, m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].Modules.IncludePragmaContainer ); + } + } + + void SetModuleData( TemplateModulesHelper module, bool isSubShader ) + { + if( isSubShader ) + { + + //if ( module.AdditionalPragmas.ValidData ) + //{ + // module.AdditionalPragmas.AddToDataCollector( ref m_currentDataCollector, m_templateMultiPass.SubShaders[ m_subShaderIdx ].Modules.IncludePragmaContainer ); + //} + + //if ( module.AdditionalIncludes.ValidData ) + //{ + // module.AdditionalIncludes.AddToDataCollector( ref m_currentDataCollector, m_templateMultiPass.SubShaders[ m_subShaderIdx ].Modules.IncludePragmaContainer ); + //} + + //if ( module.AdditionalDefines.ValidData ) + //{ + // module.AdditionalDefines.AddToDataCollector( ref m_currentDataCollector, m_templateMultiPass.SubShaders[ m_subShaderIdx ].Modules.IncludePragmaContainer ); + //} + + if( module.AdditionalDirectives.ValidData ) + { + module.AdditionalDirectives.AddAllToDataCollector( ref m_currentDataCollector, m_templateMultiPass.SubShaders[ m_subShaderIdx ].Modules.IncludePragmaContainer ); + } + + if( module.TagsHelper.ValidData ) + { + m_templateMultiPass.SetSubShaderData( TemplateModuleDataType.ModuleTag, m_subShaderIdx, module.TagsHelper.GenerateTags() ); + } + + if( module.AllModulesMode ) + { + string body = module.GenerateAllModulesString( isSubShader ); + m_templateMultiPass.SetSubShaderData( TemplateModuleDataType.AllModules, m_subShaderIdx, body.Split( '\n' ) ); + } + + if( module.ShaderModelHelper.ValidAndIndependent ) + { + m_templateMultiPass.SetSubShaderData( TemplateModuleDataType.ModuleShaderModel, m_subShaderIdx, module.ShaderModelHelper.GenerateShaderData( isSubShader ) ); + } + + if( module.BlendOpHelper.IndependentModule && module.BlendOpHelper.ValidBlendMode ) + { + m_templateMultiPass.SetSubShaderData( TemplateModuleDataType.ModuleBlendMode, m_subShaderIdx, module.BlendOpHelper.CurrentBlendFactor ); + } + + if( module.BlendOpHelper1.IndependentModule && module.BlendOpHelper1.ValidBlendMode ) + { + m_templateMultiPass.SetSubShaderData( TemplateModuleDataType.ModuleBlendMode1, m_subShaderIdx, module.BlendOpHelper1.CurrentBlendFactor ); + } + + if( module.BlendOpHelper2.IndependentModule && module.BlendOpHelper2.ValidBlendMode ) + { + m_templateMultiPass.SetSubShaderData( TemplateModuleDataType.ModuleBlendMode2, m_subShaderIdx, module.BlendOpHelper2.CurrentBlendFactor ); + } + + if( module.BlendOpHelper3.IndependentModule && module.BlendOpHelper3.ValidBlendMode ) + { + m_templateMultiPass.SetSubShaderData( TemplateModuleDataType.ModuleBlendMode3, m_subShaderIdx, module.BlendOpHelper3.CurrentBlendFactor ); + } + + if( module.BlendOpHelper.IndependentModule && module.BlendOpHelper.ValidBlendOp ) + { + m_templateMultiPass.SetSubShaderData( TemplateModuleDataType.ModuleBlendOp, m_subShaderIdx, module.BlendOpHelper.CurrentBlendOp ); + } + + if( module.BlendOpHelper1.IndependentModule && module.BlendOpHelper1.ValidBlendOp ) + { + m_templateMultiPass.SetSubShaderData( TemplateModuleDataType.ModuleBlendOp1, m_subShaderIdx, module.BlendOpHelper1.CurrentBlendOp ); + } + + if( module.BlendOpHelper2.IndependentModule && module.BlendOpHelper2.ValidBlendOp ) + { + m_templateMultiPass.SetSubShaderData( TemplateModuleDataType.ModuleBlendOp2, m_subShaderIdx, module.BlendOpHelper2.CurrentBlendOp ); + } + + if( module.BlendOpHelper3.IndependentModule && module.BlendOpHelper3.ValidBlendOp ) + { + m_templateMultiPass.SetSubShaderData( TemplateModuleDataType.ModuleBlendOp3, m_subShaderIdx, module.BlendOpHelper3.CurrentBlendOp ); + } + + if( module.AlphaToMaskHelper.ValidAndIndependent ) + { + m_templateMultiPass.SetSubShaderData( TemplateModuleDataType.ModuleAlphaToMask, m_subShaderIdx, module.AlphaToMaskHelper.GenerateShaderData( isSubShader ) ); + } + + if( module.CullModeHelper.ValidAndIndependent ) + { + m_templateMultiPass.SetSubShaderData( TemplateModuleDataType.ModuleCullMode, m_subShaderIdx, module.CullModeHelper.GenerateShaderData( isSubShader ) ); + } + + if( module.ColorMaskHelper.ValidAndIndependent ) + { + m_templateMultiPass.SetSubShaderData( TemplateModuleDataType.ModuleColorMask, m_subShaderIdx, module.ColorMaskHelper.GenerateShaderData( isSubShader ) ); + } + + if( module.ColorMaskHelper1.ValidAndIndependent ) + { + m_templateMultiPass.SetSubShaderData( TemplateModuleDataType.ModuleColorMask1, m_subShaderIdx, module.ColorMaskHelper1.GenerateShaderData( isSubShader ) ); + } + + if( module.ColorMaskHelper2.ValidAndIndependent ) + { + m_templateMultiPass.SetSubShaderData( TemplateModuleDataType.ModuleColorMask2, m_subShaderIdx, module.ColorMaskHelper2.GenerateShaderData( isSubShader ) ); + } + + if( module.ColorMaskHelper3.ValidAndIndependent ) + { + m_templateMultiPass.SetSubShaderData( TemplateModuleDataType.ModuleColorMask3, m_subShaderIdx, module.ColorMaskHelper3.GenerateShaderData( isSubShader ) ); + } + + if( module.DepthOphelper.IndependentModule && module.DepthOphelper.ValidZTest ) + { + m_templateMultiPass.SetSubShaderData( TemplateModuleDataType.ModuleZTest, m_subShaderIdx, module.DepthOphelper.CurrentZTestMode ); + } + + if( module.DepthOphelper.IndependentModule && module.DepthOphelper.ValidZWrite ) + { + m_templateMultiPass.SetSubShaderData( TemplateModuleDataType.ModuleZwrite, m_subShaderIdx, module.DepthOphelper.CurrentZWriteMode ); + } + + if( module.DepthOphelper.IndependentModule && module.DepthOphelper.ValidOffset ) + { + m_templateMultiPass.SetSubShaderData( TemplateModuleDataType.ModuleZOffset, m_subShaderIdx, module.DepthOphelper.CurrentOffset ); + } + + if( module.StencilBufferHelper.ValidAndIndependent ) + { + CullMode cullMode = ( module.CullModeHelper.ValidData ) ? module.CullModeHelper.CurrentCullMode : CullMode.Back; + string value = module.StencilBufferHelper.CreateStencilOp( cullMode ); + m_templateMultiPass.SetSubShaderData( TemplateModuleDataType.ModuleStencil, m_subShaderIdx, value.Split( '\n' ) ); + } + + } + else + { + //if ( module.AdditionalPragmas.ValidData ) + //{ + // module.AdditionalPragmas.AddToDataCollector( ref m_currentDataCollector, m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].Modules.IncludePragmaContainer ); + //} + + //if ( module.AdditionalIncludes.ValidData ) + //{ + // module.AdditionalIncludes.AddToDataCollector( ref m_currentDataCollector, m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].Modules.IncludePragmaContainer ); + //} + + //if ( module.AdditionalDefines.ValidData ) + //{ + // module.AdditionalDefines.AddToDataCollector( ref m_currentDataCollector, m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].Modules.IncludePragmaContainer ); + //} + List aboveUsePass = new List(); + List belowUsePass = new List(); + m_usePass.BuildUsePassInfo( m_currentDataCollector, ref aboveUsePass, ref belowUsePass ); + //TODO Must place this on the correct place + aboveUsePass.AddRange( belowUsePass ); + + //adding grab pass after use pass on purpose, so it wont be caught by them + aboveUsePass.AddRange( m_currentDataCollector.GrabPassList ); + + m_templateMultiPass.SetPassData( TemplateModuleDataType.ModulePass, m_subShaderIdx, m_passIdx, aboveUsePass ); + //m_templateMultiPass.SetPassData( TemplateModuleDataType.EndPass, m_subShaderIdx, m_passIdx, bellowUsePass); + + if( module.AdditionalDirectives.ValidData ) + { + module.AdditionalDirectives.AddAllToDataCollector( ref m_currentDataCollector, m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].Modules.IncludePragmaContainer ); + } + + if( module.TagsHelper.ValidData ) + { + m_templateMultiPass.SetPassData( TemplateModuleDataType.ModuleTag, m_subShaderIdx, m_passIdx, module.TagsHelper.GenerateTags() ); + } + + if( module.AllModulesMode ) + { + string body = module.GenerateAllModulesString( isSubShader ); + m_templateMultiPass.SetPassData( TemplateModuleDataType.AllModules, m_subShaderIdx, m_passIdx, body.Split( '\n' ) ); + } + + if( module.ShaderModelHelper.ValidAndIndependent ) + { + m_templateMultiPass.SetPassData( TemplateModuleDataType.ModuleShaderModel, m_subShaderIdx, m_passIdx, module.ShaderModelHelper.GenerateShaderData( isSubShader ) ); + } + + if( module.BlendOpHelper.IndependentModule && module.BlendOpHelper.ValidBlendMode ) + { + m_templateMultiPass.SetPassData( TemplateModuleDataType.ModuleBlendMode, m_subShaderIdx, m_passIdx, module.BlendOpHelper.CurrentBlendFactor ); + } + + if( module.BlendOpHelper1.IndependentModule && module.BlendOpHelper1.ValidBlendMode ) + { + m_templateMultiPass.SetPassData( TemplateModuleDataType.ModuleBlendMode1, m_subShaderIdx, m_passIdx, module.BlendOpHelper1.CurrentBlendFactor ); + } + + if( module.BlendOpHelper2.IndependentModule && module.BlendOpHelper2.ValidBlendMode ) + { + m_templateMultiPass.SetPassData( TemplateModuleDataType.ModuleBlendMode2, m_subShaderIdx, m_passIdx, module.BlendOpHelper2.CurrentBlendFactor ); + } + + if( module.BlendOpHelper3.IndependentModule && module.BlendOpHelper3.ValidBlendMode ) + { + m_templateMultiPass.SetPassData( TemplateModuleDataType.ModuleBlendMode3, m_subShaderIdx, m_passIdx, module.BlendOpHelper3.CurrentBlendFactor ); + } + + if( module.BlendOpHelper.IndependentModule && module.BlendOpHelper.ValidBlendOp ) + { + m_templateMultiPass.SetPassData( TemplateModuleDataType.ModuleBlendOp, m_subShaderIdx, m_passIdx, module.BlendOpHelper.CurrentBlendOp ); + } + + if( module.BlendOpHelper1.IndependentModule && module.BlendOpHelper1.ValidBlendOp ) + { + m_templateMultiPass.SetPassData( TemplateModuleDataType.ModuleBlendOp1, m_subShaderIdx, m_passIdx, module.BlendOpHelper1.CurrentBlendOp ); + } + + if( module.BlendOpHelper2.IndependentModule && module.BlendOpHelper2.ValidBlendOp ) + { + m_templateMultiPass.SetPassData( TemplateModuleDataType.ModuleBlendOp2, m_subShaderIdx, m_passIdx, module.BlendOpHelper2.CurrentBlendOp ); + } + + if( module.BlendOpHelper3.IndependentModule && module.BlendOpHelper3.ValidBlendOp ) + { + m_templateMultiPass.SetPassData( TemplateModuleDataType.ModuleBlendOp3, m_subShaderIdx, m_passIdx, module.BlendOpHelper3.CurrentBlendOp ); + } + + if( module.AlphaToMaskHelper.ValidAndIndependent ) + { + m_templateMultiPass.SetPassData( TemplateModuleDataType.ModuleAlphaToMask, m_subShaderIdx, m_passIdx, module.AlphaToMaskHelper.GenerateShaderData( isSubShader ) ); + } + + if( module.CullModeHelper.ValidAndIndependent ) + { + m_templateMultiPass.SetPassData( TemplateModuleDataType.ModuleCullMode, m_subShaderIdx, m_passIdx, module.CullModeHelper.GenerateShaderData( isSubShader ) ); + } + + if( module.ColorMaskHelper.ValidAndIndependent ) + { + m_templateMultiPass.SetPassData( TemplateModuleDataType.ModuleColorMask, m_subShaderIdx, m_passIdx, module.ColorMaskHelper.GenerateShaderData( isSubShader ) ); + } + + if( module.ColorMaskHelper1.ValidAndIndependent ) + { + m_templateMultiPass.SetPassData( TemplateModuleDataType.ModuleColorMask1, m_subShaderIdx, m_passIdx, module.ColorMaskHelper1.GenerateShaderData( isSubShader ) ); + } + + if( module.ColorMaskHelper2.ValidAndIndependent ) + { + m_templateMultiPass.SetPassData( TemplateModuleDataType.ModuleColorMask2, m_subShaderIdx, m_passIdx, module.ColorMaskHelper2.GenerateShaderData( isSubShader ) ); + } + + if( module.ColorMaskHelper3.ValidAndIndependent ) + { + m_templateMultiPass.SetPassData( TemplateModuleDataType.ModuleColorMask3, m_subShaderIdx, m_passIdx, module.ColorMaskHelper3.GenerateShaderData( isSubShader ) ); + } + + if( module.DepthOphelper.IndependentModule && module.DepthOphelper.ValidZTest ) + { + m_templateMultiPass.SetPassData( TemplateModuleDataType.ModuleZTest, m_subShaderIdx, m_passIdx, module.DepthOphelper.CurrentZTestMode ); + } + + if( module.DepthOphelper.IndependentModule && module.DepthOphelper.ValidZWrite ) + { + m_templateMultiPass.SetPassData( TemplateModuleDataType.ModuleZwrite, m_subShaderIdx, m_passIdx, module.DepthOphelper.CurrentZWriteMode ); + } + + if( module.DepthOphelper.IndependentModule && module.DepthOphelper.ValidOffset ) + { + m_templateMultiPass.SetPassData( TemplateModuleDataType.ModuleZOffset, m_subShaderIdx, m_passIdx, module.DepthOphelper.CurrentOffset ); + } + + if( module.StencilBufferHelper.ValidAndIndependent ) + { + CullMode cullMode = ( module.CullModeHelper.ValidData ) ? module.CullModeHelper.CurrentCullMode : CullMode.Back; + string value = module.StencilBufferHelper.CreateStencilOp( cullMode ); + m_templateMultiPass.SetPassData( TemplateModuleDataType.ModuleStencil, m_subShaderIdx, m_passIdx, value.Split( '\n' ) ); + } + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + return "0"; + } + + public override void Destroy() + { + base.Destroy(); + + m_drawInstancedHelper = null; + + m_optionsDefineContainer.Destroy(); + m_optionsDefineContainer = null; + + m_passSelector.Destroy(); + m_passSelector = null; + + m_subShaderOptions.Destroy(); + m_passOptions.Destroy(); + + m_fallbackHelper.Destroy(); + GameObject.DestroyImmediate( m_fallbackHelper ); + m_fallbackHelper = null; + + m_usePass.Destroy(); + GameObject.DestroyImmediate( m_usePass ); + m_usePass = null; + + m_dependenciesHelper.Destroy(); + m_dependenciesHelper = null; + + m_subShaderModule.Destroy(); + m_subShaderModule = null; + m_passModule.Destroy(); + m_passModule = null; + if( m_lodIndex == -1 ) + { + ContainerGraph.MultiPassMasterNodes.RemoveNode( this ); + } + else + { + ContainerGraph.LodMultiPassMasternodes[ m_lodIndex ].RemoveNode( this ); + } + } + + void UpdateSubShaderPassStr() + { + //m_subShaderIdxStr = SubShaderModuleStr + m_templateMultiPass.SubShaders[ m_subShaderIdx ].Idx; + //m_passIdxStr = PassModuleStr + m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].Idx; + } + + public override void ReadFromString( ref string[] nodeParams ) + { + + base.ReadFromString( ref nodeParams ); + try + { + string currShaderName = GetCurrentParam( ref nodeParams ); + if( currShaderName.Length > 0 ) + currShaderName = UIUtils.RemoveShaderInvalidCharacters( currShaderName ); + + m_templateGUID = GetCurrentParam( ref nodeParams ); + + bool hasUniqueName = false; + if( UIUtils.CurrentShaderVersion() > PASS_UNIQUE_ID_VERSION ) + { + hasUniqueName = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + + if( hasUniqueName ) + m_passUniqueId = GetCurrentParam( ref nodeParams ); + + m_subShaderIdx = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_passIdx = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + if( UIUtils.CurrentShaderVersion() > LOD_SUBSHADER_VERSION ) + { + + if( m_lodIndex != -1 ) + { + m_containerGraph.MultiPassMasterNodes.RemoveNode( this ); + m_containerGraph.LodMultiPassMasternodes[ m_lodIndex ].AddNode( this ); + } + } + + m_passName = GetCurrentParam( ref nodeParams ); + SetTemplate( null, false, true, m_subShaderIdx, m_passIdx, SetTemplateSource.ShaderLoad ); + ////If value gotten from template is > -1 then it contains the LOD field + ////and we can properly write the value + //if( m_subShaderLOD > -1 ) + //{ + // m_subShaderLOD = subShaderLOD; + //} + + // only in here, after SetTemplate, we know if shader name is to be used as title or not + ShaderName = currShaderName; + m_visiblePorts = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_subShaderModule.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + m_passModule.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > 15308 ) + { + m_fallbackHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + m_dependenciesHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( UIUtils.CurrentShaderVersion() > 15402 ) + { + m_usePass.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( UIUtils.CurrentShaderVersion() > 15409 ) + { + m_hdSrpMaterialType = (HDSRPMaterialType)Enum.Parse( typeof( HDSRPMaterialType ), GetCurrentParam( ref nodeParams ) ); + } + + if( UIUtils.CurrentShaderVersion() > 15501 ) + { + if( m_isMainOutputNode && UIUtils.CurrentShaderVersion() > PASS_SELECTOR_VERSION ) + m_subShaderOptions.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + + m_passOptions.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( m_isMainOutputNode && UIUtils.CurrentShaderVersion() > PASS_SELECTOR_VERSION ) + { + m_passSelector.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( m_isMainOutputNode && UIUtils.CurrentShaderVersion() > 16203 ) + { + m_drawInstancedHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( m_isMainOutputNode && UIUtils.CurrentShaderVersion() > LOD_SUBSHADER_VERSION ) + { + m_mainLODName = GetCurrentParam( ref nodeParams ); + SetupLODNodeName(); + } + else + { + m_content.text = GenerateClippedTitle( m_passName ); + } + + if( UIUtils.CurrentShaderVersion() > 18302 ) + SamplingMacros = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + else + SamplingMacros = false; + + //if( m_templateMultiPass != null && !m_templateMultiPass.IsSinglePass ) + //{ + // SetClippedTitle( m_passName ); + //} + } + catch( Exception e ) + { + Debug.LogException( e, this ); + } + + m_containerGraph.CurrentCanvasMode = NodeAvailability.TemplateShader; + m_containerGraph.CurrentPrecision = m_currentPrecisionType; +#if UNITY_2020_2_OR_NEWER + if( m_templateMultiPass.SubShaders[0].Modules.SRPType == TemplateSRPType.HD && ASEPackageManagerHelper.CurrentHDVersion >= ASESRPVersions.ASE_SRP_10_0_0 ) + { + if( Constants.CustomInspectorHD7To10.ContainsKey( m_customInspectorName ) ) + { + UIUtils.ShowMessage( string.Format("Detected obsolete custom inspector \"{0}\" in shader meta. Converting to new one \"{1}\"", m_customInspectorName , Constants.CustomInspectorHD7To10[ m_customInspectorName ] ), MessageSeverity.Warning ); + m_customInspectorName = Constants.CustomInspectorHD7To10[ m_customInspectorName ]; + } + } +#endif + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, ShaderName ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_templateGUID ); + + bool hasUniquePassName = Pass.Modules.HasPassUniqueName; + IOUtils.AddFieldValueToString( ref nodeInfo, hasUniquePassName ); + if( hasUniquePassName ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, Pass.Modules.PassUniqueName ); + } + + IOUtils.AddFieldValueToString( ref nodeInfo, m_subShaderIdx ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_passIdx ); + + IOUtils.AddFieldValueToString( ref nodeInfo, m_passName ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_visiblePorts ); + m_subShaderModule.WriteToString( ref nodeInfo ); + m_passModule.WriteToString( ref nodeInfo ); + m_fallbackHelper.WriteToString( ref nodeInfo ); + m_dependenciesHelper.WriteToString( ref nodeInfo ); + m_usePass.WriteToString( ref nodeInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_hdSrpMaterialType ); + if( m_isMainOutputNode ) + m_subShaderOptions.WriteToString( ref nodeInfo ); + + m_passOptions.WriteToString( ref nodeInfo ); + + if( m_isMainOutputNode ) + { + m_passSelector.WriteToString( ref nodeInfo ); + m_drawInstancedHelper.WriteToString( ref nodeInfo ); + } + + if( m_isMainOutputNode ) + IOUtils.AddFieldValueToString( ref nodeInfo, m_mainLODName ); + + IOUtils.AddFieldValueToString( ref nodeInfo, m_samplingMacros ); + } + + public override void ReadFromDeprecated( ref string[] nodeParams, Type oldType = null ) + { + base.ReadFromString( ref nodeParams ); + try + { + string currShaderName = GetCurrentParam( ref nodeParams ); + if( currShaderName.Length > 0 ) + currShaderName = UIUtils.RemoveShaderInvalidCharacters( currShaderName ); + + string templateGUID = GetCurrentParam( ref nodeParams ); + string templateShaderName = string.Empty; + if( UIUtils.CurrentShaderVersion() > 13601 ) + { + templateShaderName = GetCurrentParam( ref nodeParams ); + } + + TemplateMultiPass template = m_containerGraph.ParentWindow.TemplatesManagerInstance.GetTemplate( templateGUID ) as TemplateMultiPass; + if( template != null ) + { + m_templateGUID = templateGUID; + SetTemplate( null, false, true, 0, 0,SetTemplateSource.ShaderLoad ); + } + else + { + template = m_containerGraph.ParentWindow.TemplatesManagerInstance.GetTemplateByName( templateShaderName ) as TemplateMultiPass; + if( template != null ) + { + m_templateGUID = template.GUID; + SetTemplate( null, false, true, 0, 0, SetTemplateSource.ShaderLoad ); + } + else + { + m_masterNodeCategory = -1; + } + } + + if( m_invalidNode ) + return; + + // only in here, after SetTemplate, we know if shader name is to be used as title or not + ShaderName = currShaderName; + if( UIUtils.CurrentShaderVersion() > 13902 ) + { + + //BLEND MODULE + if( m_templateMultiPass.SubShaders[ 0 ].Modules.BlendData.ValidBlendMode ) + { + m_subShaderModule.BlendOpHelper.ReadBlendModeFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + else if( m_templateMultiPass.SubShaders[ 0 ].Passes[ 0 ].Modules.BlendData.ValidBlendMode ) + { + m_passModule.BlendOpHelper.ReadBlendModeFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( m_templateMultiPass.SubShaders[ 0 ].Modules.BlendData.ValidBlendOp ) + { + m_subShaderModule.BlendOpHelper.ReadBlendOpFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + else if( m_templateMultiPass.SubShaders[ 0 ].Passes[ 0 ].Modules.BlendData.ValidBlendOp ) + { + m_passModule.BlendOpHelper.ReadBlendOpFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + + //CULL MODE + if( m_templateMultiPass.SubShaders[ 0 ].Modules.CullModeData.DataCheck == TemplateDataCheck.Valid ) + { + m_subShaderModule.CullModeHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + else if( m_templateMultiPass.SubShaders[ 0 ].Passes[ 0 ].Modules.CullModeData.DataCheck == TemplateDataCheck.Valid ) + { + m_passModule.CullModeHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + //COLOR MASK + if( m_templateMultiPass.SubShaders[ 0 ].Modules.ColorMaskData.DataCheck == TemplateDataCheck.Valid ) + { + m_subShaderModule.ColorMaskHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + else if( m_templateMultiPass.SubShaders[ 0 ].Passes[ 0 ].Modules.ColorMaskData.DataCheck == TemplateDataCheck.Valid ) + { + m_passModule.ColorMaskHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + //STENCIL BUFFER + if( m_templateMultiPass.SubShaders[ 0 ].Modules.StencilData.DataCheck == TemplateDataCheck.Valid ) + { + m_subShaderModule.StencilBufferHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + else if( m_templateMultiPass.SubShaders[ 0 ].Passes[ 0 ].Modules.StencilData.DataCheck == TemplateDataCheck.Valid ) + { + m_passModule.StencilBufferHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + } + + if( UIUtils.CurrentShaderVersion() > 14202 ) + { + //DEPTH OPTIONS + if( m_templateMultiPass.SubShaders[ 0 ].Modules.DepthData.ValidZWrite ) + { + m_subShaderModule.DepthOphelper.ReadZWriteFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + else if( m_templateMultiPass.SubShaders[ 0 ].Passes[ 0 ].Modules.DepthData.ValidZWrite ) + { + m_passModule.DepthOphelper.ReadZWriteFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( m_templateMultiPass.SubShaders[ 0 ].Modules.DepthData.ValidZTest ) + { + m_subShaderModule.DepthOphelper.ReadZTestFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + else if( m_templateMultiPass.SubShaders[ 0 ].Passes[ 0 ].Modules.DepthData.ValidZTest ) + { + m_subShaderModule.DepthOphelper.ReadZTestFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + if( m_templateMultiPass.SubShaders[ 0 ].Modules.DepthData.ValidOffset ) + { + m_subShaderModule.DepthOphelper.ReadOffsetFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + else if( m_templateMultiPass.SubShaders[ 0 ].Passes[ 0 ].Modules.DepthData.ValidOffset ) + { + m_passModule.DepthOphelper.ReadOffsetFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + + } + + //TAGS + if( UIUtils.CurrentShaderVersion() > 14301 ) + { + if( m_templateMultiPass.SubShaders[ 0 ].Modules.TagData.DataCheck == TemplateDataCheck.Valid ) + { + m_subShaderModule.TagsHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + else if( m_templateMultiPass.SubShaders[ 0 ].Passes[ 0 ].Modules.TagData.DataCheck == TemplateDataCheck.Valid ) + { + m_passModule.TagsHelper.ReadFromString( ref m_currentReadParamIdx, ref nodeParams ); + } + } + + SamplingMacros = false; + } + catch( Exception e ) + { + Debug.LogException( e, this ); + } + m_containerGraph.CurrentCanvasMode = NodeAvailability.TemplateShader; + } + + public void ForceOptionsRefresh() + { + m_passOptions.Refresh(); + if( m_isMainOutputNode ) + m_subShaderOptions.Refresh(); + } + + public void SetPassVisible( string passName, bool visible ) + { + TemplateMultiPassMasterNode node = m_containerGraph.GetMasterNodeOfPass( passName, m_lodIndex ); + if( node != null ) + { + m_passSelector.SetPassVisible( passName, visible ); + node.IsInvisible = !visible; + } + + } + + public override void RefreshExternalReferences() + { + if( m_invalidNode ) + return; + + base.RefreshExternalReferences(); + if( IsLODMainMasterNode ) + { + SetMasterNodeCategoryFromGUID( m_templateGUID ); + } + + CheckTemplateChanges(); + if( m_templateMultiPass != null && m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].Modules.SRPIsPBRHD && UIUtils.CurrentShaderVersion() < 15410 ) + { + FetchHDPorts(); + m_hdSrpMaterialType = ( m_specularPort != null && m_specularPort.HasOwnOrLinkConnection ) ? HDSRPMaterialType.Specular : HDSRPMaterialType.Standard; + ConfigHDPorts(); + } + + if( ContainerGraph.HasLODs ) + { + SetClippedAdditionalTitle( string.Format( LodSubtitle, ShaderLOD ) ); + } + + if( m_isMainOutputNode ) + { + List masterNodes = ( m_lodIndex == -1 ) ? m_containerGraph.MultiPassMasterNodes.NodesList : m_containerGraph.LodMultiPassMasternodes[ m_lodIndex ].NodesList; + masterNodes.Sort( ( x, y ) => ( x.PassIdx.CompareTo( y.PassIdx ) )); + int passAmount = m_templateMultiPass.SubShaders[ m_subShaderIdx ].PassAmount; + if( passAmount != masterNodes.Count ) + { + UIUtils.ShowMessage( "Template master nodes amount was modified. Could not set correctly its visibility options." ); + } + else + { + for( int i = 0; i < passAmount; i++ ) + { + if( i != m_passIdx ) + { + masterNodes[ i ].IsInvisible = !m_passSelector.IsVisible( i ); + } + } + } + } + } + + public override void ReadInputDataFromString( ref string[] nodeParams ) + { + //For a Template Master Node an input port data must be set by its template and not meta data + if( UIUtils.CurrentShaderVersion() > 17007 ) + return; + + int count = 0; + if( UIUtils.CurrentShaderVersion() > 7003 ) + { + try + { + count = Convert.ToInt32( nodeParams[ m_currentReadParamIdx++ ] ); + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + else + { + count = ( m_oldInputCount < 0 ) ? m_inputPorts.Count : m_oldInputCount; + } + + for( int i = 0; i < count && i < nodeParams.Length && m_currentReadParamIdx < nodeParams.Length; i++ ) + { + if( UIUtils.CurrentShaderVersion() < 5003 ) + { + int newId = VersionConvertInputPortId( i ); + if( UIUtils.CurrentShaderVersion() > 23 ) + { + m_currentReadParamIdx++; + } + + m_currentReadParamIdx++; + if( m_inputPorts[ newId ].IsEditable && UIUtils.CurrentShaderVersion() >= 3100 && m_currentReadParamIdx < nodeParams.Length ) + { + m_currentReadParamIdx++; + } + } + else + { + m_currentReadParamIdx++; + m_currentReadParamIdx++; + m_currentReadParamIdx++; + bool isEditable = Convert.ToBoolean( nodeParams[ m_currentReadParamIdx++ ] ); + if( isEditable && m_currentReadParamIdx < nodeParams.Length ) + { + m_currentReadParamIdx++; + } + } + } + } + + //For a Template Master Node an input port data must be set by its template and not meta data + public override void WriteInputDataToString( ref string nodeInfo ) { } + + public override float HeightEstimate + { + get + { + float heightEstimate = 0; + heightEstimate = 32 + Constants.INPUT_PORT_DELTA_Y; + if( m_templateMultiPass != null && !m_templateMultiPass.IsSinglePass ) + { + heightEstimate += 22; + } + float internalPortSize = 0; + for( int i = 0; i < InputPorts.Count; i++ ) + { + if( InputPorts[ i ].Visible ) + internalPortSize += 18 + Constants.INPUT_PORT_DELTA_Y; + } + + return heightEstimate + Mathf.Max( internalPortSize, m_insideSize.y ); + } + } + + public HDSRPMaterialType CurrentHDMaterialType + { + get { return m_hdSrpMaterialType; } + set + { + m_hdSrpMaterialType = value; + if( m_isMainOutputNode ) + { + List mpNodes = ContainerGraph.MultiPassMasterNodes.NodesList; + int count = mpNodes.Count; + for( int i = 0; i < count; i++ ) + { + if( mpNodes[ i ].UniqueId != UniqueId ) + { + mpNodes[ i ].CurrentHDMaterialType = value; + } + } + } + } + } + public TemplateSubShader SubShader { get { return m_templateMultiPass.SubShaders[ m_subShaderIdx ]; } } + public TemplatePass Pass { get { return m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ]; } } + public int SubShaderIdx { get { return m_subShaderIdx; } } + public int PassIdx { get { return m_passIdx; } } + public TemplateMultiPass CurrentTemplate { get { return m_templateMultiPass; } } + public TemplateModulesHelper SubShaderModule { get { return m_subShaderModule; } } + public TemplateModulesHelper PassModule { get { return m_passModule; } } + public string PassName { get { return m_templateMultiPass.SubShaders[ m_subShaderIdx ].Passes[ m_passIdx ].PassNameContainer.Data; } } + public string PassUniqueName + { + get + { + return string.IsNullOrEmpty( m_passUniqueId ) ? m_originalPassName : m_passUniqueId; + } + } + + public string OriginalPassName { get { return m_originalPassName; } } + public bool HasLinkPorts { get { return m_hasLinkPorts; } } + public bool IsInvisible + { + get + { + return m_isInvisible != InvisibilityStatus.Visible; + } + set + { + if( m_isInvisible != InvisibilityStatus.LockedInvisible && !m_isMainOutputNode ) + { + m_isInvisible = value ? InvisibilityStatus.Invisible : InvisibilityStatus.Visible; + if( value ) + { + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + m_inputPorts[ i ].FullDeleteConnections(); + } + } + } + } + } + + public TemplatePassSelectorHelper PassSelector { get { return m_passSelector; } } + public TemplateOptionsUIHelper PassOptions { get { return m_passOptions; } } + public TemplateOptionsUIHelper SubShaderOptions { get { return m_subShaderOptions; } } + public TemplateOptionsDefinesContainer OptionsDefineContainer { get { return m_optionsDefineContainer; } } + public TerrainDrawInstancedHelper DrawInstancedHelperInstance { get { return m_drawInstancedHelper; } } + public bool InvalidNode { get { return m_invalidNode; } } + public override void SetName( string name ) + { + ShaderName = name; + } + public bool IsLODMainFirstPass { get { return m_passIdx == 0 && m_lodIndex == -1; } } + public override AvailableShaderTypes CurrentMasterNodeCategory { get { return AvailableShaderTypes.Template; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMultiPassMasterNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMultiPassMasterNode.cs.meta new file mode 100644 index 0000000..a96d88d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMultiPassMasterNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: fce684c26c654d14e927860863cd99dd +timeCreated: 1517406883 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMultiPassSwitchNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMultiPassSwitchNode.cs new file mode 100644 index 0000000..e8aeadf --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMultiPassSwitchNode.cs @@ -0,0 +1,328 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + + [Serializable] + public class InputSwitchMPHelper + { + public int SubShaderIdx; + public int PassIdx; + public InputSwitchMPHelper( int subShaderIdx, int passIdx ) + { + SubShaderIdx = subShaderIdx; + PassIdx = passIdx; + } + } + + [Serializable] + [NodeAttributes( "Template Multi-Pass Switch", "Logical Operators", "Relays, in compile time, the correct input port according to current analyzed sub-shader/pass." )] + public sealed class TemplateMultiPassSwitchNode : TemplateNodeParent + { + private const string InputLabelStr = "SubShader {0} Pass {1}"; + + [SerializeField] + private List m_inputHelper = new List(); + + [SerializeField] + private int m_inputCountHelper = -1; + + protected override void CommonInit( int uniqueId ) + { + m_createAllOutputs = false; + base.CommonInit( uniqueId ); + } + + public override void OnInputPortConnected( int portId, int otherNodeId, int otherPortId, bool activateNode = true ) + { + base.OnInputPortConnected( portId, otherNodeId, otherPortId, activateNode ); + UpdateConnections(); + } + + public override void OnConnectedOutputNodeChanges( int inputPortId, int otherNodeId, int otherPortId, string name, WirePortDataType type ) + { + base.OnConnectedOutputNodeChanges( inputPortId, otherNodeId, otherPortId, name, type ); + UpdateConnections(); + } + + public override void OnInputPortDisconnected( int portId ) + { + base.OnInputPortDisconnected( portId ); + UpdateConnections(); + } + + private void UpdateConnections() + { + WirePortDataType mainType = WirePortDataType.FLOAT; + + int highest = UIUtils.GetPriority( mainType ); + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + if( m_inputPorts[ i ].IsConnected ) + { + WirePortDataType portType = m_inputPorts[ i ].GetOutputConnection().DataType; + if( UIUtils.GetPriority( portType ) > highest ) + { + mainType = portType; + highest = UIUtils.GetPriority( portType ); + } + } + } + + for( int i = 0; i < m_inputPorts.Count; i++ ) + { + m_inputPorts[ i ].ChangeType( mainType, false ); + } + + m_outputPorts[ 0 ].ChangeType( mainType, false ); + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + + if( m_templateMPData == null ) + { + FetchMultiPassTemplate(); + if( m_inputPorts.Count != m_inputCountHelper ) + { + CreateInputPorts(); + } + else + { + RefreshInputPorts(); + } + } + } + + + public void RefreshInputPorts() + { + if( m_multiPassMode ) + { + m_inputHelper.Clear(); + if( m_templateMPData != null ) + { + int index = 0; + int subShaderCount = m_templateMPData.SubShaders.Count; + for( int subShaderIdx = 0; subShaderIdx < subShaderCount; subShaderIdx++ ) + { + int passCount = m_templateMPData.SubShaders[ subShaderIdx ].Passes.Count; + for( int passIdx = 0; passIdx < passCount; passIdx++ ) + { + if( m_templateMPData.SubShaders[ subShaderIdx ].Passes[ passIdx ].HasValidFunctionBody ) + { + m_inputPorts[ index ].Name = string.Format( InputLabelStr, subShaderIdx, passIdx ); + m_inputHelper.Add( new InputSwitchMPHelper( subShaderIdx, passIdx ) ); + index += 1; + } + } + } + } + } + else + { + m_inputPorts[0].Name = "In"; + } + } + + public int RefreshInputCountHelper() + { + int inputCountHelper = 0; + if( m_multiPassMode ) + { + if( m_templateMPData != null ) + { + int subShaderCount = m_templateMPData.SubShaders.Count; + for( int subShaderIdx = 0; subShaderIdx < subShaderCount; subShaderIdx++ ) + { + int passCount = m_templateMPData.SubShaders[ subShaderIdx ].Passes.Count; + for( int passIdx = 0; passIdx < passCount; passIdx++ ) + { + if( m_templateMPData.SubShaders[ subShaderIdx ].Passes[passIdx].HasValidFunctionBody ) + inputCountHelper += 1; + } + } + } + } + else + { + inputCountHelper += 1; + } + return inputCountHelper; + } + + public void CreateInputPorts() + { + m_inputCountHelper = 0; + DeleteAllInputConnections( true ); + if( m_multiPassMode ) + { + m_inputHelper.Clear(); + if( m_templateMPData != null ) + { + int subShaderCount = m_templateMPData.SubShaders.Count; + for( int subShaderIdx = 0; subShaderIdx < subShaderCount; subShaderIdx++ ) + { + int passCount = m_templateMPData.SubShaders[ subShaderIdx ].Passes.Count; + for( int passIdx = 0; passIdx < passCount; passIdx++ ) + { + if( m_templateMPData.SubShaders[ subShaderIdx ].Passes[ passIdx ].HasValidFunctionBody ) + { + AddInputPort( WirePortDataType.FLOAT, false, string.Format( InputLabelStr, subShaderIdx, passIdx ) ); + m_inputHelper.Add( new InputSwitchMPHelper( subShaderIdx, passIdx ) ); + m_inputCountHelper += 1; + } + } + } + } + } + else + { + AddInputPort( WirePortDataType.FLOAT, false, "In" ); + m_inputCountHelper += 1; + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.MasterNodeCategory != AvailableShaderTypes.Template ) + { + UIUtils.ShowMessage( "Template Multi-Pass Switch Data node is only intended for templates use only" ); + return m_outputPorts[ 0 ].ErrorValue; + } + + int currSubShaderIdx = dataCollector.TemplateDataCollectorInstance.MultipassSubshaderIdx; + int currPassIdx = dataCollector.TemplateDataCollectorInstance.MultipassPassIdx; + + int inputHelperCount = m_inputHelper.Count; + for( int i = 0; i< inputHelperCount; i++ ) + { + if(m_inputHelper[i].SubShaderIdx == currSubShaderIdx && m_inputHelper[ i ].PassIdx == currPassIdx ) + return m_inputPorts[ i ].GeneratePortInstructions( ref dataCollector ); + } + + UIUtils.ShowMessage( "Invalid subshader or pass on Template Multi-Pass Switch Data" ); + return m_outputPorts[ 0 ].ErrorValue; + } + + public override void OnMasterNodeReplaced( MasterNode newMasterNode ) + { + base.OnMasterNodeReplaced( newMasterNode ); + if( newMasterNode.CurrentMasterNodeCategory == AvailableShaderTypes.Template ) + { + FetchMultiPassTemplate( newMasterNode ); + m_inputCountHelper = RefreshInputCountHelper(); + if( m_inputPorts.Count != m_inputCountHelper ) + { + CreateInputPorts(); + } + else + { + RefreshInputPorts(); + } + } + else + { + DeleteAllInputConnections( true ); + } + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_inputCountHelper = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + // Need to add ports here so read internal data is correct + for( int i = 0; i < m_inputCountHelper; i++ ) + { + AddInputPort( WirePortDataType.FLOAT, false, Constants.EmptyPortValue ); + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_inputCountHelper ); + } + + public override void Destroy() + { + base.Destroy(); + m_inputHelper.Clear(); + m_inputHelper = null; + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + FetchMultiPassTemplate(); + + bool create = false; + if( m_inputCountHelper == -1 ) + { + create = true; + } + else + { + int newInputCount = RefreshInputCountHelper(); + if( newInputCount != m_inputCountHelper ) + { + create = true; + } + } + + + if( m_multiPassMode ) + { + if( m_templateMPData != null ) + { + if( create ) + { + CreateInputPorts(); + } + else + { + m_inputHelper.Clear(); + int index = 0; + int subShaderCount = m_templateMPData.SubShaders.Count; + for( int subShaderIdx = 0; subShaderIdx < subShaderCount; subShaderIdx++ ) + { + int passCount = m_templateMPData.SubShaders[ subShaderIdx ].Passes.Count; + for( int passIdx = 0; passIdx < passCount; passIdx++ ) + { + if( m_templateMPData.SubShaders[ subShaderIdx ].Passes[ passIdx ].HasValidFunctionBody ) + { + m_inputPorts[ index ].Name = string.Format( InputLabelStr, subShaderIdx, passIdx ); + m_inputHelper.Add( new InputSwitchMPHelper( subShaderIdx, passIdx )); + index += 1; + } + } + } + + if( index != m_inputCountHelper ) + { + Debug.LogWarning( "Something wrong occured in reading MultiPass Switch node" ); + } + } + } + } + else + { + if( create ) + { + AddInputPort( WirePortDataType.FLOAT, false, "In" ); + } + else + { + m_inputPorts[ 0 ].Name = "In"; + } + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMultiPassSwitchNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMultiPassSwitchNode.cs.meta new file mode 100644 index 0000000..4aafb59 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateMultiPassSwitchNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 58e4eb5fc3fed124384eef956c6c3ee1 +timeCreated: 1519319737 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateNodeParent.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateNodeParent.cs new file mode 100644 index 0000000..272e002 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateNodeParent.cs @@ -0,0 +1,272 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class TemplateNodeParent : ParentNode + { + + + protected const string ErrorMessageStr = "This node can only be used inside a Template category!"; + protected const string DataLabelStr = "Data"; + protected const string SubShaderStr = "SubShader"; + protected const string PassStr = "Pass"; + + [SerializeField] + private int m_subShaderIdx = 0; + + [SerializeField] + private int m_passIdx = 0; + + [SerializeField] + private int m_passLocalArrayIdx = 0; + + [SerializeField] + protected bool m_multiPassMode = false; + + [SerializeField] + protected string[] m_availableSubshaders; + + [SerializeField] + protected string[] m_availablePassesLabels; + + [SerializeField] + protected int[] m_availablePassesValues; + + [NonSerialized] + protected TemplateMultiPass m_templateMPData = null; + protected bool m_createAllOutputs = true; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + AddOutputPort( WirePortDataType.FLOAT, "Out" ); + if( m_createAllOutputs ) + { + AddOutputPort( WirePortDataType.FLOAT, "X" ); + AddOutputPort( WirePortDataType.FLOAT, "Y" ); + AddOutputPort( WirePortDataType.FLOAT, "Z" ); + AddOutputPort( WirePortDataType.FLOAT, "W" ); + } + m_textLabelWidth = 67; + m_hasLeftDropdown = true; + } + + public override void AfterCommonInit() + { + base.AfterCommonInit(); + + if( PaddingTitleLeft == 0 ) + { + PaddingTitleLeft = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + if( PaddingTitleRight == 0 ) + PaddingTitleRight = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + } + } + + protected void ConfigurePorts() + { + switch( m_outputPorts[ 0 ].DataType ) + { + default: + { + for( int i = 1; i < 5; i++ ) + { + m_outputPorts[ i ].Visible = false; + } + } + break; + case WirePortDataType.FLOAT2: + { + for( int i = 1; i < 5; i++ ) + { + m_outputPorts[ i ].Visible = ( i < 3 ); + if( m_outputPorts[ i ].Visible ) + { + m_outputPorts[ i ].Name = Constants.ChannelNamesVector[ i - 1 ]; + } + } + } + break; + case WirePortDataType.FLOAT3: + { + for( int i = 1; i < 5; i++ ) + { + m_outputPorts[ i ].Visible = ( i < 4 ); + if( m_outputPorts[ i ].Visible ) + { + m_outputPorts[ i ].Name = Constants.ChannelNamesVector[ i - 1 ]; + } + } + } + break; + case WirePortDataType.FLOAT4: + { + for( int i = 1; i < 5; i++ ) + { + m_outputPorts[ i ].Visible = true; + m_outputPorts[ i ].Name = Constants.ChannelNamesVector[ i - 1 ]; + } + } + break; + case WirePortDataType.COLOR: + { + for( int i = 1; i < 5; i++ ) + { + m_outputPorts[ i ].Visible = true; + m_outputPorts[ i ].Name = Constants.ChannelNamesColor[ i - 1 ]; + } + } + break; + } + m_sizeIsDirty = true; + } + + protected virtual void OnSubShaderChange() { } + protected virtual void OnPassChange() { } + + protected void DrawSubShaderUI() + { + EditorGUI.BeginChangeCheck(); + m_subShaderIdx = EditorGUILayoutPopup( SubShaderStr, m_subShaderIdx, m_availableSubshaders ); + if( EditorGUI.EndChangeCheck() ) + { + //UpdateSubShaderAmount(); + UpdatePassAmount(); + OnSubShaderChange(); + } + } + + protected void DrawPassUI() + { + EditorGUI.BeginChangeCheck(); + m_passLocalArrayIdx = EditorGUILayoutPopup( PassStr, m_passLocalArrayIdx, m_availablePassesLabels ); + if( EditorGUI.EndChangeCheck() ) + { + m_passIdx = m_availablePassesValues[ m_passLocalArrayIdx ]; + //UpdatePassAmount(); + OnPassChange(); + } + } + + virtual protected void CheckWarningState() + { + if( m_containerGraph.CurrentCanvasMode != NodeAvailability.TemplateShader ) + { + ShowTab( NodeMessageType.Error, ErrorMessageStr ); + } + else + { + m_showErrorMessage = false; + } + } + + protected void FetchMultiPassTemplate( MasterNode masterNode = null ) + { + m_multiPassMode = m_containerGraph.MultiPassMasterNodes.NodesList.Count > 0; + if( m_multiPassMode ) + { + m_templateMPData = ( ( ( masterNode == null ) ? m_containerGraph.CurrentMasterNode : masterNode ) as TemplateMultiPassMasterNode ).CurrentTemplate; + if( m_templateMPData != null ) + { + UpdateSubShaderAmount(); + } + } + } + + protected void UpdateSubShaderAmount() + { + if( m_templateMPData == null ) + m_templateMPData = ( m_containerGraph.CurrentMasterNode as TemplateMultiPassMasterNode ).CurrentTemplate; + + if( m_templateMPData != null ) + { + int subShaderCount = m_templateMPData.SubShaders.Count; + if( m_availableSubshaders == null || subShaderCount != m_availableSubshaders.Length ) + { + m_availableSubshaders = new string[ subShaderCount ]; + for( int i = 0; i < subShaderCount; i++ ) + { + m_availableSubshaders[ i ] = i.ToString(); + } + } + m_subShaderIdx = Mathf.Min( m_subShaderIdx, subShaderCount - 1 ); + UpdatePassAmount(); + } + } + protected virtual bool ValidatePass( int passIdx ) { return true; } + protected void UpdatePassAmount() + { + if( !m_multiPassMode ) + return; + + if( m_templateMPData == null ) + m_templateMPData = ( m_containerGraph.CurrentMasterNode as TemplateMultiPassMasterNode ).CurrentTemplate; + + List passLabels = new List(); + List passValues = new List(); + int minPassIdx = int.MaxValue; + int passCount = m_templateMPData.SubShaders[ m_subShaderIdx ].Passes.Count; + bool resetPassIdx = true; + for( int i = 0; i < passCount; i++ ) + { + if( ValidatePass( i ) ) + { + passLabels.Add( i.ToString() ); + passValues.Add( i ); + minPassIdx = Mathf.Min( minPassIdx, i ); + if( m_passIdx == i ) + resetPassIdx = false; + } + } + m_availablePassesLabels = passLabels.ToArray(); + m_availablePassesValues = passValues.ToArray(); + if( resetPassIdx ) + m_passIdx = minPassIdx; + + RefreshPassLocalArrayIdx(); + } + + void RefreshPassLocalArrayIdx( ) + { + for( int i = 0; i < m_availablePassesValues.Length; i++ ) + { + if( m_availablePassesValues[ i ] == m_passIdx ) + { + m_passLocalArrayIdx = i; + } + } + } + + public override void Destroy() + { + base.Destroy(); + m_templateMPData = null; + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + if( UIUtils.CurrentShaderVersion() > TemplatesManager.MPShaderVersion ) + { + m_subShaderIdx = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + m_passIdx = Convert.ToInt32( GetCurrentParam( ref nodeParams ) ); + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_subShaderIdx ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_passIdx ); + } + public int SubShaderIdx { get { return m_subShaderIdx; } set { m_subShaderIdx = value; } } + public int PassIdx { get { return m_passIdx; } set { m_passIdx = value; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateNodeParent.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateNodeParent.cs.meta new file mode 100644 index 0000000..134dcd6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateNodeParent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b21cb297a12ef0a4281213619e3e76bf +timeCreated: 1519235586 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsData.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsData.cs new file mode 100644 index 0000000..8482ba9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsData.cs @@ -0,0 +1,1162 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Text.RegularExpressions; +using System.Collections.Generic; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + /*ase_pass_options OLDEST + DefineOnConnected:portId:definevalue + DefineOnUnconnected:portId:definevalue + Options:name:defaultOption:opt0:opt1:opt2 + SetVisible:PortId:OptionName:OptionValue + */ + + /*ase_pass_options OLD + Option:Option Name:UI Type:Default:Item0,Item1,Item3...ItemN + Action:Action Type:Action Data:ConditionA && ConditionB || ConditionC: + */ + + /*ase_pass_options:UniqueId:PropagateDataToHiddenPasses + Option:Color Offset:A,B,C:A + A:ShowPort:My Port Name + B,C:HidePort:My Port Name + B:SetDefine:MY_DEFINE + C:SetDefine:MY_COLOR_DEFINE + Option:My Other Option:True,False + True:ShowOption:Color Offset + False:HideOption:Color Offset + Port:My Port Name + On:SetDefine:MY_COLOR_DEFINE + Off:UnsetDefine:MY_COLOR_DEFINE + */ + public enum AseOptionsUIWidget + { + Dropdown, + Toggle, + Float, + FloatRange, + Int, + IntRange + } + + public enum AseOptionsType + { + Option, + Port, + Field + } + + + public enum AseOptionItemSetup + { + None, + InvertActionOnDeselection + } + + public enum AseOptionsActionType + { + ShowOption, + HideOption, + SetOption, + HidePort, + ShowPort, + SetPortName, + SetDefine, + RemoveDefine, + SetUndefine, + RemoveUndefine, + ExcludePass, + IncludePass, + SetPropertyOnPass, + SetPropertyOnSubShader, + SetShaderProperty, + SetMaterialProperty, + ExcludeAllPassesBut + } + + public enum PropertyActionsEnum + { + CullMode, + ColorMask, + ColorMask1, + ColorMask2, + ColorMask3, + ZWrite, + ZTest, + ZOffsetFactor, + ZOffsetUnits, + BlendRGB, + BlendAlpha, + BlendOpRGB, + BlendOpAlpha, + BlendRGB1, + BlendAlpha1, + BlendOpRGB1, + BlendOpAlpha1, + BlendRGB2, + BlendAlpha2, + BlendOpRGB2, + BlendOpAlpha2, + BlendRGB3, + BlendAlpha3, + BlendOpRGB3, + BlendOpAlpha3, + StencilReference, + StencilReadMask, + StencilWriteMask, + StencilComparison, + StencilPass, + StencilFail, + StencilZFail, + RenderType, + RenderQueue, + DisableBatching + } + + public enum AseOptionsSetup + { + CopyOptionsFromMainPass, + Id, + Name + } + + [Serializable] + public class ItemColorMask + { + public bool ValueR = true; + public bool ValueG = true; + public bool ValueB = true; + public bool ValueA = true; + + public bool MaskR = false; + public bool MaskG = false; + public bool MaskB = false; + public bool MaskA = false; + + public bool[] GetColorMask( bool[] input ) + { + bool[] result = { ValueR, ValueG, ValueB, ValueA }; + result[ 0 ] = MaskR ? ValueR : input[ 0 ]; + result[ 1 ] = MaskG ? ValueG : input[ 1 ]; + result[ 2 ] = MaskB ? ValueB : input[ 2 ]; + result[ 3 ] = MaskA ? ValueA : input[ 3 ]; + return result; + } + + public void SetColorMask( int index, string value ) + { + switch( index ) + { + default: + case 0: + { + MaskR = !string.IsNullOrEmpty( value ); + if(MaskR) + ValueR = Convert.ToBoolean( value ); + } + break; + case 1: + { + MaskG = !string.IsNullOrEmpty( value ); + if( MaskG ) + ValueG = Convert.ToBoolean( value ); + } + break; + case 2: + { + MaskB = !string.IsNullOrEmpty( value ); + if( MaskB ) + ValueB = Convert.ToBoolean( value ); + } + break; + case 3: + { + MaskA = !string.IsNullOrEmpty( value ); + if( MaskA ) + ValueA = Convert.ToBoolean( value ); + } + break; + } + } + } + + [Serializable] + public class TemplateActionItem + { + public AseOptionsActionType ActionType; + public string ActionData = string.Empty; + public int ActionDataIdx = -1; + + public string PassName; + public bool AllPasses = false; + + public PropertyActionsEnum PropertyAction; + //CULL + public CullMode ActionCullMode; + //COLOR MASK + public ItemColorMask ColorMask = new ItemColorMask(); + public ItemColorMask ColorMask1 = new ItemColorMask(); + public ItemColorMask ColorMask2 = new ItemColorMask(); + public ItemColorMask ColorMask3 = new ItemColorMask(); + + //DEPTH + public ZWriteMode ActionZWrite; + public ZTestMode ActionZTest; + public float ActionZOffsetFactor; + public float ActionZOffsetUnits; + + //BLEND OPS + public AvailableBlendFactor ActionBlendRGBSource; + public AvailableBlendFactor ActionBlendRGBDest; + public AvailableBlendFactor ActionBlendAlphaSource; + public AvailableBlendFactor ActionBlendAlphaDest; + public AvailableBlendOps ActionBlendOpRGB; + public AvailableBlendOps ActionBlendOpAlpha; + + public AvailableBlendFactor ActionBlendRGBSource1; + public AvailableBlendFactor ActionBlendRGBDest1; + public AvailableBlendFactor ActionBlendAlphaSource1; + public AvailableBlendFactor ActionBlendAlphaDest1; + public AvailableBlendOps ActionBlendOpRGB1; + public AvailableBlendOps ActionBlendOpAlpha1; + + public AvailableBlendFactor ActionBlendRGBSource2; + public AvailableBlendFactor ActionBlendRGBDest2; + public AvailableBlendFactor ActionBlendAlphaSource2; + public AvailableBlendFactor ActionBlendAlphaDest2; + public AvailableBlendOps ActionBlendOpRGB2; + public AvailableBlendOps ActionBlendOpAlpha2; + + public AvailableBlendFactor ActionBlendRGBSource3; + public AvailableBlendFactor ActionBlendRGBDest3; + public AvailableBlendFactor ActionBlendAlphaSource3; + public AvailableBlendFactor ActionBlendAlphaDest3; + public AvailableBlendOps ActionBlendOpRGB3; + public AvailableBlendOps ActionBlendOpAlpha3; + + //STENCIL + public int ActionStencilReference; + public int ActionStencilReadMask; + public int ActionStencilWriteMask; + public int ActionStencilComparison; + public int ActionStencilPass; + public int ActionStencilFail; + public int ActionStencilZFail; + + public bool CopyFromSubShader = false; + + public string ActionBuffer; + public override string ToString() + { + return ActionType + " " + ActionData + " " + ActionDataIdx; + } + + public bool GetIntValueFromActionBuffer( out int result ) + { + return int.TryParse( ActionBuffer, out result ); + } + + public bool GetFloatValueFromActionBuffer( out float result ) + { + return float.TryParse( ActionBuffer, out result ); + } + } + + [Serializable] + public class TemplateActionItemGrid + { + [Serializable] + public class TemplateActionItemRow + { + public TemplateActionItem[] Columns; + } + + public TemplateActionItemRow[] Rows; + + public TemplateActionItemGrid( int rowsCount ) + { + Rows = new TemplateActionItemRow[ rowsCount ]; + } + + public TemplateActionItem this[ int row, int column ] + { + get { return Rows[ row ].Columns[ column ]; } + set { Rows[ row ].Columns[ column ] = value; } + } + + public TemplateActionItem[] this[ int row ] + { + get { return Rows[ row ].Columns; } + + set + { + if( Rows[ row ] == null ) + Rows[ row ] = new TemplateActionItemRow(); + + Rows[ row ].Columns = value; + } + } + } + + [Serializable] + public class TemplateOptionsItem + { + public AseOptionsType Type; + public AseOptionsUIWidget UIWidget; + public AseOptionItemSetup Setup = AseOptionItemSetup.None; + + public string Id = string.Empty; + public string Name = string.Empty; + public string DefaultOption = string.Empty; + public string[] Options = null; + public string[] DisplayOptions = null; + public int DisableIdx = -1; + + [SerializeField] + private float m_defaultFieldValue; + + public float FieldMin; + public float FieldMax; + + public bool FieldInline; + public string FieldInlineName; + public string FieldInlineOutput = string.Empty; + + [SerializeField] + public InlineProperty FieldValue = new InlineProperty(); + + public TemplateActionItemGrid ActionsPerOption = null; + + public int Count = 0; + + [SerializeField] + private int m_defaultOptionIndex = -1; + + ~TemplateOptionsItem() + { + Options = null; + } + + public int OptionIndexFor( string option ) + { + for( int i = 0; i < Options.Length; i++ ) + { + if( Options[ i ].Equals( option ) ) + { + return i; + } + } + Debug.LogWarning( "Couldn't find index for option: " + option ); + return 0; + } + + public int DefaultOptionIndex + { + get + { + if( m_defaultOptionIndex > -1 ) + return m_defaultOptionIndex; + + for( int i = 0; i < Options.Length; i++ ) + { + if( Options[ i ].Equals( DefaultOption ) ) + { + m_defaultOptionIndex = i; + return i; + } + } + Debug.LogWarning( "Couldn't find index for default option: " + DefaultOption ); + return 0; + } + } + + public float DefaultFieldValue + { + get + { + return m_defaultFieldValue; + } + set + { + m_defaultFieldValue = value; + } + } + } + + [Serializable] + public class TemplateOptionsContainer + { + public bool Enabled = false; + public string Body = string.Empty; + public int Index = -1; + public int Id = -1; + public string Name = string.Empty; + public bool CopyOptionsFromMainPass = false; + public TemplateOptionsItem[] Options = null; + ~TemplateOptionsContainer() + { + Options = null; + } + + public void CopyPortOptionsFrom( TemplateOptionsContainer container, string passName ) + { + if( container == null || container.Options == null ) + return; + + List newItems = new List(); + for( int i = 0; i < container.Options.Length; i++ ) + { + if( container.Options[ i ].Type == AseOptionsType.Port && + container.Options[ i ].Id.Equals( passName ) ) + { + newItems.Add( container.Options[ i ] ); + } + } + + if( newItems.Count > 0 ) + { + Enabled = true; + if( Options == null ) + { + Options = newItems.ToArray(); + } + else + { + Array.Resize( ref Options, Options.Length + newItems.Count ); + Array.Copy( newItems.ToArray(), Options, newItems.Count ); + } + } + newItems.Clear(); + newItems = null; + } + + public int EndIndex { get { return Index + Body.Length; } } + } + + public class TemplateOptionsToolsHelper + { + //public const string PassOptionsMainPattern = @"\/\*ase_pass_options:([\w:= ]*)[\n]([\w: \t;\n&|,_\+-]*)\*\/"; + //public const string SubShaderOptionsMainPattern = @"\/\*ase_subshader_options:([\w:= ]*)[\n]([\w: \t;\n&|,_\+-]*)\*\/"; + public const string PassOptionsMainPattern = "\\/\\*ase_pass_options:([\\w:= ]*)[\n]([\\w: \t;\n&|,_\\+\\-\\(\\)\\[\\]\\\"\\=\\/\\.]*)\\*\\/"; + public const string SubShaderOptionsMainPattern = "\\/\\*ase_subshader_options:([\\w:= ]*)[\n]([\\w: \t;\n&|,_\\+\\-\\(\\)\\[\\]\\\"\\=\\/\\.]*)\\*\\/"; + public static readonly char OptionsDataSeparator = ','; + public static Dictionary AseOptionsSetupDict = new Dictionary() + { + { "CopyOptionsFromMainPass",AseOptionsSetup.CopyOptionsFromMainPass}, + { "Id",AseOptionsSetup.Id}, + { "Name",AseOptionsSetup.Name}, + }; + + public static Dictionary AseOptionsUITypeDict = new Dictionary() + { + { "Dropdown",AseOptionsUIWidget.Dropdown }, + { "Toggle", AseOptionsUIWidget.Toggle } + }; + + public static Dictionary AseOptionsActionTypeDict = new Dictionary() + { + {"ShowOption", AseOptionsActionType.ShowOption }, + {"HideOption", AseOptionsActionType.HideOption }, + {"SetOption", AseOptionsActionType.SetOption }, + {"HidePort", AseOptionsActionType.HidePort }, + {"ShowPort", AseOptionsActionType.ShowPort }, + {"SetPortName", AseOptionsActionType.SetPortName }, + {"SetDefine", AseOptionsActionType.SetDefine }, + {"RemoveDefine", AseOptionsActionType.RemoveDefine }, + {"SetUndefine", AseOptionsActionType.SetUndefine }, + {"RemoveUndefine", AseOptionsActionType.RemoveUndefine }, + {"ExcludePass", AseOptionsActionType.ExcludePass }, + {"IncludePass", AseOptionsActionType.IncludePass }, + {"SetPropertyOnPass", AseOptionsActionType.SetPropertyOnPass }, + {"SetPropertyOnSubShader", AseOptionsActionType.SetPropertyOnSubShader }, + {"SetShaderProperty", AseOptionsActionType.SetShaderProperty }, + {"SetMaterialProperty", AseOptionsActionType.SetMaterialProperty }, + {"ExcludeAllPassesBut",AseOptionsActionType.ExcludeAllPassesBut} + }; + + public static Dictionary AseOptionItemSetupDict = new Dictionary + { + {"None", AseOptionItemSetup.None }, + { "InvertActionOnDeselection", AseOptionItemSetup.InvertActionOnDeselection} + }; + + public static bool InvertAction( AseOptionsActionType original, ref AseOptionsActionType inverted ) + { + bool success = true; + switch( original ) + { + case AseOptionsActionType.ShowOption: + inverted = AseOptionsActionType.HideOption; + break; + case AseOptionsActionType.HideOption: + inverted = AseOptionsActionType.ShowOption; + break; + case AseOptionsActionType.HidePort: + inverted = AseOptionsActionType.ShowPort; + break; + case AseOptionsActionType.ShowPort: + inverted = AseOptionsActionType.HidePort; + break; + case AseOptionsActionType.SetDefine: + inverted = AseOptionsActionType.RemoveDefine; + break; + case AseOptionsActionType.RemoveDefine: + inverted = AseOptionsActionType.SetDefine; + break; + case AseOptionsActionType.SetUndefine: + inverted = AseOptionsActionType.RemoveUndefine; + break; + case AseOptionsActionType.RemoveUndefine: + inverted = AseOptionsActionType.SetUndefine; + break; + case AseOptionsActionType.ExcludePass: + inverted = AseOptionsActionType.IncludePass; + break; + case AseOptionsActionType.IncludePass: + inverted = AseOptionsActionType.ExcludePass; + break; + case AseOptionsActionType.SetPortName: + case AseOptionsActionType.SetOption: + case AseOptionsActionType.SetPropertyOnPass: + case AseOptionsActionType.SetPropertyOnSubShader: + success = false; + break; + } + return success; + } + + + public static TemplateOptionsContainer GenerateOptionsContainer( bool isSubShader, string data ) + { + TemplateOptionsContainer optionsContainer = new TemplateOptionsContainer(); + + Match match = Regex.Match( data, isSubShader ? SubShaderOptionsMainPattern : PassOptionsMainPattern ); + optionsContainer.Enabled = match.Success; + if( match.Success ) + { + try + { + optionsContainer.Body = match.Value; + optionsContainer.Index = match.Index; + + List optionItemsList = new List(); + List> actionItemsList = new List>(); + Dictionary optionItemToIndex = new Dictionary(); + TemplateOptionsItem currentOption = null; + + //OPTIONS OVERALL SETUP + string[] setupLines = match.Groups[ 1 ].Value.Split( ':' ); + for( int i = 0; i < setupLines.Length; i++ ) + { + if( AseOptionsSetupDict.ContainsKey( setupLines[ i ] ) ) + { + AseOptionsSetup setup = AseOptionsSetupDict[ setupLines[ i ] ]; + switch( setup ) + { + case AseOptionsSetup.CopyOptionsFromMainPass: optionsContainer.CopyOptionsFromMainPass = true; break; + } + } + else + { + string[] args = setupLines[ i ].Split( '=' ); + if( args.Length > 1 && AseOptionsSetupDict.ContainsKey( args[ 0 ] ) ) + { + AseOptionsSetup setup = AseOptionsSetupDict[ args[ 0 ] ]; + switch( setup ) + { + case AseOptionsSetup.Id: if( !int.TryParse( args[ 1 ], out optionsContainer.Id ) ) optionsContainer.Id = -1; break; + case AseOptionsSetup.Name: optionsContainer.Name = args[ 1 ]; break; + } + } + } + } + + //AVAILABLE OPTIONS + string body = match.Groups[ 2 ].Value.Replace( "\t", string.Empty ); + string[] optionLines = body.Split( '\n' ); + for( int oL = 0; oL < optionLines.Length; oL++ ) + { + string[] optionItems = optionLines[ oL ].Split( ':' ); + if( optionItems.Length > 0 ) + { + string[] itemIds = optionItems[ 0 ].Split( OptionsDataSeparator ); + switch( itemIds[ 0 ] ) + { + case "Option": + { + //Fills previous option with its actions + //actionItemsList is cleared over here + FillOptionAction( currentOption, ref actionItemsList ); + + optionItemToIndex.Clear(); + currentOption = new TemplateOptionsItem(); + currentOption.Type = AseOptionsType.Option; + string[] optionItemSetup = optionItems[ 1 ].Split( OptionsDataSeparator ); + currentOption.Name = optionItemSetup[ 0 ]; + if( optionItemSetup.Length > 1 ) + { + if( AseOptionItemSetupDict.ContainsKey( optionItemSetup[ 1 ] ) ) + currentOption.Setup = AseOptionItemSetupDict[ optionItemSetup[ 1 ] ]; + } + + currentOption.Id = itemIds.Length > 1 ? itemIds[ 1 ] : optionItems[ 1 ]; + currentOption.DisplayOptions = optionItems[ 2 ].Split( OptionsDataSeparator ); + currentOption.DisableIdx = currentOption.DisplayOptions.Length; + optionItems[ 2 ] += ",disable"; + currentOption.Options = optionItems[ 2 ].Split( OptionsDataSeparator ); + currentOption.Count = currentOption.Options.Length; + + for( int opIdx = 0; opIdx < currentOption.Options.Length; opIdx++ ) + { + optionItemToIndex.Add( currentOption.Options[ opIdx ], opIdx ); + actionItemsList.Add( new List() ); + } + + if( optionItems.Length > 3 ) + { + currentOption.DefaultOption = optionItems[ 3 ]; + } + else + { + currentOption.DefaultOption = currentOption.Options[ 0 ]; + } + + if( currentOption.Options.Length == 2 || ( currentOption.Options.Length == 3 && currentOption.Options[ 2 ].Equals( "disable" ) ) ) + { + if( ( currentOption.Options[ 0 ].Equals( "true" ) && currentOption.Options[ 1 ].Equals( "false" ) ) || + ( currentOption.Options[ 0 ].Equals( "false" ) && currentOption.Options[ 1 ].Equals( "true" ) ) ) + { + // Toggle 0 is false and 1 is true + currentOption.Options[ 0 ] = "false"; + currentOption.Options[ 1 ] = "true"; + currentOption.UIWidget = AseOptionsUIWidget.Toggle; + } + } + else if( currentOption.Options.Length > 2 ) + { + currentOption.UIWidget = AseOptionsUIWidget.Dropdown; + } + else + { + Debug.LogWarning( "Detected an option with less than two items:" + optionItems[ 1 ] ); + } + optionItemsList.Add( currentOption ); + } + break; + case "Port": + { + //Fills previous option with its actions + //actionItemsList is cleared over here + FillOptionAction( currentOption, ref actionItemsList ); + + optionItemToIndex.Clear(); + + currentOption = new TemplateOptionsItem(); + currentOption.Type = AseOptionsType.Port; + if( isSubShader && optionItems.Length > 2 ) + { + currentOption.Id = optionItems[ 1 ]; + currentOption.Name = optionItems[ 2 ]; + } + else + { + currentOption.Name = optionItems[ 1 ]; + } + + currentOption.Options = new string[] { "On", "Off" }; + optionItemToIndex.Add( currentOption.Options[ 0 ], 0 ); + optionItemToIndex.Add( currentOption.Options[ 1 ], 1 ); + + actionItemsList.Add( new List() ); + actionItemsList.Add( new List() ); + + optionItemsList.Add( currentOption ); + } + break; + case "Field": + { + //Fills previous option with its actions + //actionItemsList is cleared over here + FillOptionAction( currentOption, ref actionItemsList ); + + optionItemToIndex.Clear(); + currentOption = new TemplateOptionsItem(); + currentOption.Type = AseOptionsType.Field; + + currentOption.Id = optionItems[ 1 ]; + currentOption.Name = optionItems[ 1 ]; + + currentOption.UIWidget = AseOptionsUIWidget.Float; + if( optionItems[ 2 ].Equals( "Int" ) ) + currentOption.UIWidget = AseOptionsUIWidget.Int; + + if( optionItems.Length >= 3 ) + { + currentOption.DefaultFieldValue = Convert.ToSingle( optionItems[ 3 ], System.Globalization.CultureInfo.InvariantCulture ); + } + + if( optionItems.Length >= 6 ) + { + if( currentOption.UIWidget == AseOptionsUIWidget.Int ) + currentOption.UIWidget = AseOptionsUIWidget.Int; + else + currentOption.UIWidget = AseOptionsUIWidget.FloatRange; + + currentOption.FieldMin = Convert.ToSingle( optionItems[ 4 ], System.Globalization.CultureInfo.InvariantCulture ); + currentOption.FieldMax = Convert.ToSingle( optionItems[ 5 ], System.Globalization.CultureInfo.InvariantCulture ); + } + + if( optionItems.Length == 5 || optionItems.Length == 7 ) + { + currentOption.FieldInline = true; + currentOption.FieldInlineName = optionItems[ optionItems.Length - 1 ]; + } + + currentOption.Options = new string[] { "Change", "Inline", "disable" }; + + optionItemToIndex.Add( currentOption.Options[ 0 ], 0 ); + optionItemToIndex.Add( currentOption.Options[ 1 ], 1 ); + optionItemToIndex.Add( currentOption.Options[ 2 ], 2 ); + currentOption.DisableIdx = 2; + + actionItemsList.Add( new List() ); + actionItemsList.Add( new List() ); + actionItemsList.Add( new List() ); + + optionItemsList.Add( currentOption ); + } + break; + default: + { + if( optionItemToIndex.ContainsKey( optionItems[ 0 ] ) ) + { + int idx = 0; + if( currentOption != null && currentOption.UIWidget == AseOptionsUIWidget.Toggle ) + { + idx = ( optionItems[ 0 ].Equals( "true" ) ) ? 1 : 0; + if( optionItems[ 0 ].Equals( "disable" ) ) + idx = 2; + } + else + { + idx = optionItemToIndex[ optionItems[ 0 ] ]; + } + actionItemsList[ idx ].Add( CreateActionItem( isSubShader, optionItems ) ); + } + else + { + //string[] ids = optionItems[ 0 ].Split( ',' ); + if( itemIds.Length > 1 ) + { + for( int i = 0; i < itemIds.Length; i++ ) + { + if( optionItemToIndex.ContainsKey( itemIds[ i ] ) ) + { + int idx = optionItemToIndex[ itemIds[ i ] ]; + actionItemsList[ idx ].Add( CreateActionItem( isSubShader, optionItems ) ); + } + } + } + } + + } + break; + } + } + } + + //Fills last option with its actions + FillOptionAction( currentOption, ref actionItemsList ); + + actionItemsList.Clear(); + actionItemsList = null; + + optionsContainer.Options = optionItemsList.ToArray(); + optionItemsList.Clear(); + optionItemsList = null; + + optionItemToIndex.Clear(); + optionItemToIndex = null; + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + return optionsContainer; + } + + static void FillOptionAction( TemplateOptionsItem currentOption, ref List> actionItemsList ) + { + if( currentOption != null ) + { + int count = actionItemsList.Count; + currentOption.ActionsPerOption = new TemplateActionItemGrid( count ); + for( int i = 0; i < count; i++ ) + { + currentOption.ActionsPerOption[ i ] = actionItemsList[ i ].ToArray(); + actionItemsList[ i ].Clear(); + } + actionItemsList.Clear(); + } + } + + static TemplateActionItem CreateActionItem( bool isSubshader, string[] optionItems ) + { + TemplateActionItem actionItem = new TemplateActionItem(); + try + { + actionItem.ActionType = AseOptionsActionTypeDict[ optionItems[ 1 ] ]; + int optionsIdx = 2; + if( optionItems.Length > 3 ) + { + optionsIdx = 3; + actionItem.PassName = optionItems[ 2 ]; + } + else + { + actionItem.AllPasses = isSubshader; + } + + actionItem.ActionData = optionItems[ optionsIdx ]; + + switch( actionItem.ActionType ) + { + case AseOptionsActionType.ShowOption: + case AseOptionsActionType.HideOption: + { + string[] arr = optionItems[ optionsIdx ].Split( OptionsDataSeparator ); + if( arr.Length > 1 ) + { + actionItem.ActionData = arr[ 0 ]; + if( !int.TryParse( arr[ 1 ], out actionItem.ActionDataIdx ) ) + { + actionItem.ActionDataIdx = -1; + } + } + } + break; + case AseOptionsActionType.SetOption: + { + string[] arr = optionItems[ optionsIdx ].Split( OptionsDataSeparator ); + if( arr.Length > 1 ) + { + actionItem.ActionData = arr[ 0 ]; + if( !int.TryParse( arr[ 1 ], out actionItem.ActionDataIdx ) ) + { + Debug.LogWarning( "SetOption value must be a the selection index" ); + } + } + } + break; + case AseOptionsActionType.HidePort: + case AseOptionsActionType.ShowPort: + { + if( !int.TryParse( actionItem.ActionData, out actionItem.ActionDataIdx ) ) + actionItem.ActionDataIdx = -1; + } + break; + case AseOptionsActionType.SetPortName: + { + string[] arr = optionItems[ optionsIdx ].Split( OptionsDataSeparator ); + if( arr.Length > 1 ) + { + int.TryParse( arr[ 0 ], out actionItem.ActionDataIdx ); + actionItem.ActionData = arr[ 1 ]; + } + } + break; + case AseOptionsActionType.SetDefine: + case AseOptionsActionType.RemoveDefine: + case AseOptionsActionType.SetUndefine: + case AseOptionsActionType.RemoveUndefine: + case AseOptionsActionType.ExcludePass: + case AseOptionsActionType.IncludePass: + case AseOptionsActionType.ExcludeAllPassesBut: + break; + case AseOptionsActionType.SetShaderProperty: + { + int optIndex = optionItems[ optionsIdx ].IndexOf( OptionsDataSeparator ); + if( optIndex > -1 ) + { + actionItem.ActionData = optionItems[ optionsIdx ].Substring( 0, optIndex ); + actionItem.ActionBuffer = optionItems[ optionsIdx ].Substring( optIndex + 1, optionItems[ optionsIdx ].Length - optIndex - 1); + } + }break; + case AseOptionsActionType.SetMaterialProperty: + { + int optIndex = optionItems[ optionsIdx ].IndexOf( OptionsDataSeparator ); + if( optIndex > -1 ) + { + actionItem.ActionData = optionItems[ optionsIdx ].Substring( 0, optIndex ); + } + } + break; + case AseOptionsActionType.SetPropertyOnPass: + case AseOptionsActionType.SetPropertyOnSubShader: + { + string[] arr = optionItems[ optionsIdx ].Split( OptionsDataSeparator ); + actionItem.PropertyAction = (PropertyActionsEnum)Enum.Parse( typeof( PropertyActionsEnum ), arr[ 0 ] ); + if( arr.Length == 1 && actionItem.ActionType == AseOptionsActionType.SetPropertyOnPass ) + { + actionItem.CopyFromSubShader = true; + } + else + { + switch( actionItem.PropertyAction ) + { + case PropertyActionsEnum.CullMode: + { + if( arr.Length > 1 ) + actionItem.ActionCullMode = (CullMode)Enum.Parse( typeof( CullMode ), arr[ 1 ] ); + } + break; + case PropertyActionsEnum.ColorMask: + { + if( arr.Length > 4 ) + { + actionItem.ColorMask.SetColorMask( 0, arr[ 1 ] ); + actionItem.ColorMask.SetColorMask( 1, arr[ 2 ] ); + actionItem.ColorMask.SetColorMask( 2, arr[ 3 ] ); + actionItem.ColorMask.SetColorMask( 3, arr[ 4 ] ); + } + } + break; + case PropertyActionsEnum.ColorMask1: + { + if( arr.Length > 4 ) + { + actionItem.ColorMask1.SetColorMask( 0, arr[ 1 ] ); + actionItem.ColorMask1.SetColorMask( 1, arr[ 2 ] ); + actionItem.ColorMask1.SetColorMask( 2, arr[ 3 ] ); + actionItem.ColorMask1.SetColorMask( 3, arr[ 4 ] ); + } + } + break; + case PropertyActionsEnum.ColorMask2: + { + if( arr.Length > 4 ) + { + actionItem.ColorMask2.SetColorMask( 0, arr[ 1 ] ); + actionItem.ColorMask2.SetColorMask( 1, arr[ 2 ] ); + actionItem.ColorMask2.SetColorMask( 2, arr[ 3 ] ); + actionItem.ColorMask2.SetColorMask( 3, arr[ 4 ] ); + } + } + break; + case PropertyActionsEnum.ColorMask3: + { + if( arr.Length > 4 ) + { + actionItem.ColorMask3.SetColorMask( 0, arr[ 1 ] ); + actionItem.ColorMask3.SetColorMask( 1, arr[ 2 ] ); + actionItem.ColorMask3.SetColorMask( 2, arr[ 3 ] ); + actionItem.ColorMask3.SetColorMask( 3, arr[ 4 ] ); + } + } + break; + case PropertyActionsEnum.ZWrite: + { + if( arr.Length > 1 ) + actionItem.ActionZWrite = (ZWriteMode)Enum.Parse( typeof( ZWriteMode ), arr[ 1 ] ); + } + break; + case PropertyActionsEnum.ZTest: + { + if( arr.Length > 1 ) + actionItem.ActionZTest = (ZTestMode)Enum.Parse( typeof( ZTestMode ), arr[ 1 ] ); + } + break; + case PropertyActionsEnum.ZOffsetFactor: + { + if( arr.Length > 1 ) + actionItem.ActionZOffsetFactor = Convert.ToSingle( arr[ 1 ] ); + } + break; + case PropertyActionsEnum.ZOffsetUnits: + { + if( arr.Length > 1 ) + actionItem.ActionZOffsetUnits = Convert.ToSingle( arr[ 1 ] ); + } + break; + case PropertyActionsEnum.BlendRGB: + { + if( arr.Length > 2 ) + { + actionItem.ActionBlendRGBSource = (AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), arr[ 1 ] ); + actionItem.ActionBlendRGBDest = (AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), arr[ 2 ] ); + } + } + break; + case PropertyActionsEnum.BlendRGB1: + { + if( arr.Length > 2 ) + { + actionItem.ActionBlendRGBSource1 = (AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), arr[ 1 ] ); + actionItem.ActionBlendRGBDest1 = (AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), arr[ 2 ] ); + } + } + break; + case PropertyActionsEnum.BlendRGB2: + { + if( arr.Length > 2 ) + { + actionItem.ActionBlendRGBSource2 = (AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), arr[ 1 ] ); + actionItem.ActionBlendRGBDest2 = (AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), arr[ 2 ] ); + } + } + break; + case PropertyActionsEnum.BlendRGB3: + { + if( arr.Length > 2 ) + { + actionItem.ActionBlendRGBSource3 = (AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), arr[ 1 ] ); + actionItem.ActionBlendRGBDest3 = (AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), arr[ 2 ] ); + } + } + break; + case PropertyActionsEnum.BlendAlpha: + { + if( arr.Length > 2 ) + { + actionItem.ActionBlendAlphaSource = (AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), arr[ 1 ] ); + actionItem.ActionBlendAlphaDest = (AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), arr[ 2 ] ); + } + } + break; + case PropertyActionsEnum.BlendAlpha1: + { + if( arr.Length > 2 ) + { + actionItem.ActionBlendAlphaSource1 = (AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), arr[ 1 ] ); + actionItem.ActionBlendAlphaDest1 = (AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), arr[ 2 ] ); + } + } + break; + case PropertyActionsEnum.BlendAlpha2: + { + if( arr.Length > 2 ) + { + actionItem.ActionBlendAlphaSource2 = (AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), arr[ 1 ] ); + actionItem.ActionBlendAlphaDest2 = (AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), arr[ 2 ] ); + } + } + break; + case PropertyActionsEnum.BlendAlpha3: + { + if( arr.Length > 2 ) + { + actionItem.ActionBlendAlphaSource3 = (AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), arr[ 1 ] ); + actionItem.ActionBlendAlphaDest3 = (AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), arr[ 2 ] ); + } + } + break; + case PropertyActionsEnum.BlendOpRGB: + { + if( arr.Length > 1 ) + { + actionItem.ActionBlendOpRGB = (AvailableBlendOps)Enum.Parse( typeof( AvailableBlendOps ), arr[ 1 ] ); + + } + } + break; + case PropertyActionsEnum.BlendOpAlpha: + { + if( arr.Length > 1 ) + { + actionItem.ActionBlendOpAlpha = (AvailableBlendOps)Enum.Parse( typeof( AvailableBlendOps ), arr[ 1 ] ); + } + } + break; + case PropertyActionsEnum.StencilReference: + { + if( arr.Length > 1 ) + { + int.TryParse( arr[ 1 ], out actionItem.ActionStencilReference ); + } + } + break; + case PropertyActionsEnum.StencilReadMask: + { + if( arr.Length > 1 ) + { + int.TryParse( arr[ 1 ], out actionItem.ActionStencilReadMask ); + } + } + break; + case PropertyActionsEnum.StencilWriteMask: + { + if( arr.Length > 1 ) + { + int.TryParse( arr[ 1 ], out actionItem.ActionStencilWriteMask ); + } + } + break; + case PropertyActionsEnum.StencilComparison: + { + if( arr.Length > 1 ) + actionItem.ActionStencilComparison = StencilBufferOpHelper.StencilComparisonValuesDict[ arr[ 1 ] ]; + } + break; + case PropertyActionsEnum.StencilPass: + { + if( arr.Length > 1 ) + actionItem.ActionStencilPass = StencilBufferOpHelper.StencilOpsValuesDict[ arr[ 1 ] ]; + } + break; + case PropertyActionsEnum.StencilFail: + { + if( arr.Length > 1 ) + actionItem.ActionStencilFail = StencilBufferOpHelper.StencilOpsValuesDict[ arr[ 1 ] ]; + } + break; + case PropertyActionsEnum.StencilZFail: + { + if( arr.Length > 1 ) + actionItem.ActionStencilZFail = StencilBufferOpHelper.StencilOpsValuesDict[ arr[ 1 ] ]; + } + break; + case PropertyActionsEnum.RenderType: + { + if( arr.Length > 1 ) + actionItem.ActionData = arr[ 1 ]; + } + break; + case PropertyActionsEnum.RenderQueue: + { + if( arr.Length > 1 ) + actionItem.ActionData = arr[ 1 ]; + if( arr.Length > 2 ) + { + int.TryParse( arr[ 2 ], out actionItem.ActionDataIdx ); + } + else + { + actionItem.ActionDataIdx = 0; + } + } + break; + case PropertyActionsEnum.DisableBatching: + { + if( arr.Length > 1 ) + actionItem.ActionData = arr[ 1 ]; + } + break; + } + } + } + break; + } + } + catch( Exception e ) + { + Debug.LogException( e ); + } + return actionItem; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsData.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsData.cs.meta new file mode 100644 index 0000000..55c0596 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsData.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 019dfacde4ed75a41851c7f15f69963f +timeCreated: 1533143812 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsDefinesContainer.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsDefinesContainer.cs new file mode 100644 index 0000000..affbd40 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsDefinesContainer.cs @@ -0,0 +1,69 @@ +using UnityEngine; +using System; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class TemplateOptionsDefinesContainer + { + [SerializeField] + private List m_definesList = new List(); + + [NonSerialized] + private Dictionary m_definesDict = new Dictionary(); + + void Refresh() + { + if( m_definesDict.Count != m_definesList.Count ) + { + m_definesDict.Clear(); + for( int i = 0; i < m_definesList.Count; i++ ) + { + m_definesDict.Add( m_definesList[ i ].PropertyName, m_definesList[ i ] ); + } + } + } + + public void RemoveTemporaries() + { + List temporaries = m_definesList.FindAll( ( x ) => ( x.NodeId == 1 ) ); + for( int i = 0; i < temporaries.Count; i++ ) + { + m_definesList.Remove( temporaries[ i ] ); + m_definesDict.Remove( temporaries[ i ].PropertyName ); + } + } + + public void AddDefine( string define , bool temporary ) + { + Refresh(); + if( !m_definesDict.ContainsKey( define ) ) + { + int nodeId = temporary ? 1 : 0; + PropertyDataCollector data = new PropertyDataCollector( nodeId, define ); + m_definesDict.Add( define, data ); + m_definesList.Add( data ); + } + } + + public void RemoveDefine( string define ) + { + Refresh(); + if( m_definesDict.ContainsKey( define ) ) + { + m_definesList.Remove( m_definesDict[define] ); + m_definesDict.Remove( define ); + } + } + + public void Destroy() + { + m_definesDict.Clear(); + m_definesDict = null; + m_definesList.Clear(); + m_definesList = null; + } + public List DefinesList { get { return m_definesList; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsDefinesContainer.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsDefinesContainer.cs.meta new file mode 100644 index 0000000..151a9ab --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsDefinesContainer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0f32755ee64bb1542ad9598810d9faf9 +timeCreated: 1543339825 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsPort.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsPort.cs new file mode 100644 index 0000000..04c1187 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsPort.cs @@ -0,0 +1,174 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + // PORT CONTROLLERS + [Serializable] + public class TemplateOptionPortItem + { + [SerializeField] + private int m_portId = -1; + + [SerializeField] + private TemplateOptionsItem m_options; + + public TemplateOptionPortItem( TemplateMultiPassMasterNode owner, TemplateOptionsItem options ) + { + m_options = options; + InputPort port = owner.InputPorts.Find( x => x.Name.Equals( options.Name ) ); + if( port != null ) + { + m_portId = port.PortId; + } + } + + public void FillDataCollector( TemplateMultiPassMasterNode owner, ref MasterNodeDataCollector dataCollector ) + { + InputPort port = null; + if( m_portId > -1 ) + { + port = owner.GetInputPortByUniqueId( m_portId ); + } + else + { + port = owner.InputPorts.Find( x => x.Name.Equals( m_options.Name ) ); + } + + if( port != null ) + { + int optionId = port.HasOwnOrLinkConnection ? 0 : 1; + for( int i = 0; i < m_options.ActionsPerOption[ optionId ].Length; i++ ) + { + switch( m_options.ActionsPerOption[ optionId ][ i ].ActionType ) + { + case AseOptionsActionType.SetDefine: + { + List nodes = owner.ContainerGraph.GetMultiPassMasterNodes( owner.LODIndex ); + int count = nodes.Count; + for( int nodeIdx = 0; nodeIdx < count; nodeIdx++ ) + { + nodes[ nodeIdx ].OptionsDefineContainer.AddDefine( "#define "+m_options.ActionsPerOption[ optionId ][ i ].ActionData, false ); + } + //dataCollector.AddToDefines( -1, m_options.ActionsPerOption[ optionId ][ i ].ActionData ); + } + break; + case AseOptionsActionType.SetUndefine: + { + List nodes = owner.ContainerGraph.GetMultiPassMasterNodes( owner.LODIndex ); + int count = nodes.Count; + for( int nodeIdx = 0; nodeIdx < count; nodeIdx++ ) + { + nodes[ nodeIdx ].OptionsDefineContainer.AddDefine( "#undef " + m_options.ActionsPerOption[ optionId ][ i ].ActionData, false ); + } + //dataCollector.AddToDefines( -1, m_options.ActionsPerOption[ optionId ][ i ].ActionData, false ); + } + break; + case AseOptionsActionType.SetShaderProperty: + { + TemplateShaderPropertyData data = owner.CurrentTemplate.GetShaderPropertyData( m_options.ActionsPerOption[ optionId ][ i ].ActionData ); + if( data != null ) + { + string newPropertyValue = data.CreatePropertyForValue( m_options.ActionsPerOption[ optionId ][ i ].ActionBuffer ); + owner.CurrentTemplate.IdManager.SetReplacementText( data.FullValue, newPropertyValue ); + } + } + break; + } + } + } + } + + public void SubShaderFillDataCollector( TemplateMultiPassMasterNode owner, ref MasterNodeDataCollector dataCollector ) + { + + //TemplateMultiPassMasterNode targetNode = string.IsNullOrEmpty(m_options.Id) ? owner:owner.ContainerGraph.GetMasterNodeOfPass( m_options.Id , owner.LODIndex ); + TemplateMultiPassMasterNode targetNode = string.IsNullOrEmpty( m_options.Id ) ? + owner.ContainerGraph.GetMainMasterNodeOfLOD( owner.LODIndex ) : + owner.ContainerGraph.GetMasterNodeOfPass( m_options.Id , owner.LODIndex ); + + InputPort port = null; + if( m_portId > -1 ) + { + port = targetNode.GetInputPortByUniqueId( m_portId ); + } + else + { + port = targetNode.InputPorts.Find( x => x.Name.Equals( m_options.Name ) ); + } + + if( port != null ) + { + int optionId = port.HasOwnOrLinkConnection ? 0 : 1; + for( int i = 0; i < m_options.ActionsPerOption[ optionId ].Length; i++ ) + { + if( string.IsNullOrEmpty( m_options.ActionsPerOption[ optionId ][ i ].PassName ) || + m_options.ActionsPerOption[ optionId ][ i ].PassName.Equals( owner.PassName ) ) + { + switch( m_options.ActionsPerOption[ optionId ][ i ].ActionType ) + { + case AseOptionsActionType.SetDefine: + { + owner.OptionsDefineContainer.AddDefine( "#define " + m_options.ActionsPerOption[ optionId ][ i ].ActionData, true ); + } + break; + case AseOptionsActionType.SetUndefine: + { + owner.OptionsDefineContainer.AddDefine( "#undef " + m_options.ActionsPerOption[ optionId ][ i ].ActionData, true ); + } + break; + case AseOptionsActionType.SetShaderProperty: + { + TemplateShaderPropertyData data = owner.CurrentTemplate.GetShaderPropertyData( m_options.ActionsPerOption[ optionId ][ i ].ActionData ); + if( data != null ) + { + string newPropertyValue = data.CreatePropertyForValue( m_options.ActionsPerOption[ optionId ][ i ].ActionBuffer ); + owner.CurrentTemplate.IdManager.SetReplacementText( data.FullValue, newPropertyValue ); + } + } + break; + } + } + } + } + } + + public void CheckImediateActionsForPort( TemplateMultiPassMasterNode owner, int portId ) + { + if( portId != m_portId ) + return; + + InputPort port = null; + if( m_portId > -1 ) + { + port = owner.GetInputPortByUniqueId( m_portId ); + } + else + { + port = owner.InputPorts.Find( x => x.Name.Equals( m_options.Name ) ); + } + + if( port != null ) + { + int optionId = port.HasOwnOrLinkConnection ? 0 : 1; + for( int i = 0; i < m_options.ActionsPerOption[ optionId ].Length; i++ ) + { + switch( m_options.ActionsPerOption[ optionId ][ i ].ActionType ) + { + case AseOptionsActionType.SetPortName: + { + port.Name = m_options.ActionsPerOption[ optionId ][ i ].ActionData; + owner.SizeIsDirty = true; + } + break; + } + } + } + } + public TemplateOptionsItem Options { get { return m_options; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsPort.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsPort.cs.meta new file mode 100644 index 0000000..a9c15d2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsPort.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: fa2d25bd070cde046876bd1fa77bf116 +timeCreated: 1535044953 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsUI.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsUI.cs new file mode 100644 index 0000000..cb3e40b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsUI.cs @@ -0,0 +1,323 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + // UI STRUCTURES + [Serializable] + public class TemplateOptionUIItem + { + public delegate void OnActionPerformed( bool actionFromUser, bool isRefreshing, bool invertAction, TemplateOptionUIItem uiItem, params TemplateActionItem[] validActions ); + public event OnActionPerformed OnActionPerformedEvt; + + [SerializeField] + private bool m_isVisible = true; + + [SerializeField] + private bool m_wasVisible = true; + + [SerializeField] + private int m_currentOption = 0; + + [SerializeField] + private TemplateOptionsItem m_options; + + [SerializeField] + private bool m_checkOnExecute = false; + + [SerializeField] + private bool m_invertActionOnDeselection = false; + + public TemplateOptionUIItem( TemplateOptionsItem options ) + { + m_options = options; + if( m_options.Type == AseOptionsType.Field ) + { + m_options.FieldValue.FloatValue = m_options.DefaultFieldValue; + } + else + { + m_currentOption = m_options.DefaultOptionIndex; + } + m_invertActionOnDeselection = options.Setup == AseOptionItemSetup.InvertActionOnDeselection; + } + + public void CopyValuesFrom( TemplateOptionUIItem origin ) + { + m_isVisible = origin.IsVisible; + m_wasVisible = origin.WasVisible; + m_currentOption = origin.CurrentOption; + m_options.FieldValue.FloatValue = origin.CurrentFieldValue; + m_checkOnExecute = origin.CheckOnExecute; + m_invertActionOnDeselection = origin.InvertActionOnDeselection; + } + + public void Draw( UndoParentNode owner ) + { + if( m_isVisible ) + { + int lastOption = m_currentOption; + EditorGUI.BeginChangeCheck(); + switch( m_options.UIWidget ) + { + case AseOptionsUIWidget.Dropdown: + { + m_currentOption = owner.EditorGUILayoutPopup( m_options.Name, m_currentOption, m_options.DisplayOptions ); + } + break; + case AseOptionsUIWidget.Toggle: + { + m_currentOption = owner.EditorGUILayoutToggle( m_options.Name, m_currentOption == 1 ) ? 1 : 0; + } + break; + case AseOptionsUIWidget.Float: + { + if( m_options.FieldInline ) + { + m_options.FieldValue.FloatField( ref owner, m_options.Name ); + if( m_options.FieldValue.Active ) + m_currentOption = 1; + else + m_currentOption = 0; + } + else + { + m_options.FieldValue.FloatValue = owner.EditorGUILayoutFloatField( m_options.Name, m_options.FieldValue.FloatValue ); + } + } + break; + case AseOptionsUIWidget.Int: + { + if( m_options.FieldInline ) + { + m_options.FieldValue.IntField( ref owner, m_options.Name ); + if( m_options.FieldValue.Active ) + m_currentOption = 1; + else + m_currentOption = 0; + } + else + m_options.FieldValue.FloatValue = owner.EditorGUILayoutIntField( m_options.Name, (int)m_options.FieldValue.FloatValue ); + } + break; + case AseOptionsUIWidget.FloatRange: + { + if( m_options.FieldInline ) + { + m_options.FieldValue.SliderField( ref owner, m_options.Name, m_options.FieldMin, m_options.FieldMax ); + if( m_options.FieldValue.Active ) + m_currentOption = 1; + else + m_currentOption = 0; + } + else + m_options.FieldValue.FloatValue = owner.EditorGUILayoutSlider( m_options.Name, m_options.FieldValue.FloatValue, m_options.FieldMin, m_options.FieldMax ); + } + break; + case AseOptionsUIWidget.IntRange: + { + if( m_options.FieldInline ) + { + m_options.FieldValue.IntSlider( ref owner, m_options.Name, (int)m_options.FieldMin, (int)m_options.FieldMax ); + if( m_options.FieldValue.Active ) + m_currentOption = 1; + else + m_currentOption = 0; + } + else + m_options.FieldValue.FloatValue = owner.EditorGUILayoutIntSlider( m_options.Name, (int)m_options.FieldValue.FloatValue, (int)m_options.FieldMin, (int)m_options.FieldMax ); + } + break; + } + if( EditorGUI.EndChangeCheck() ) + { + if( OnActionPerformedEvt != null ) + { + if( m_invertActionOnDeselection ) + OnActionPerformedEvt( true, false, lastOption != m_options.DisableIdx, this, m_options.ActionsPerOption[ lastOption ] ); + + OnActionPerformedEvt( true, false, false, this, m_options.ActionsPerOption[ m_currentOption ] ); + } + } + } + } + + public void CheckEnDisable( bool actionFromUser ) + { + //string deb = string.Empty;// "-- Checked --" + m_options.Name+" "+ m_isVisible + " "+ m_wasVisible; + if( m_isVisible ) + { + if( !m_wasVisible ) + { + //deb = "-- Enable --" + m_options.Name; + //Debug.Log( deb ); + if( OnActionPerformedEvt != null ) + { + if( m_invertActionOnDeselection ) + { + for( int i = 0; i < m_options.Count; i++ ) + { + if( i != m_currentOption && i != m_options.DisableIdx ) + { + OnActionPerformedEvt( actionFromUser, false, true, this, m_options.ActionsPerOption[ i ] ); + } + } + } + + OnActionPerformedEvt( actionFromUser, false, false, this, m_options.ActionsPerOption[ m_currentOption ] ); + //if( !m_isVisible ) + //OnActionPerformedEvt( isRefreshing, false, this, m_options.ActionsPerOption[ m_options.DisableIdx ] ); + } + } + + m_wasVisible = true; + } + else if( m_wasVisible ) + { + //deb = "-- Disable --" + m_options.Name; + //Debug.Log( deb ); + m_wasVisible = false; + + if( OnActionPerformedEvt != null ) + { + OnActionPerformedEvt( actionFromUser, false, false, this, m_options.ActionsPerOption[ m_options.DisableIdx ] ); + } + } + } + + public void FillDataCollector( ref MasterNodeDataCollector dataCollector ) + { + if( m_isVisible && m_checkOnExecute ) + { + for( int i = 0; i < m_options.ActionsPerOption[ m_currentOption ].Length; i++ ) + { + switch( m_options.ActionsPerOption[ m_currentOption ][ i ].ActionType ) + { + case AseOptionsActionType.SetDefine: + { + dataCollector.AddToDefines( -1, m_options.ActionsPerOption[ m_currentOption ][ i ].ActionData ); + } + break; + case AseOptionsActionType.SetUndefine: + { + dataCollector.AddToDefines( -1, m_options.ActionsPerOption[ m_currentOption ][ i ].ActionData, false ); + } + break; + } + } + } + } + + public void Refresh() + { + if( OnActionPerformedEvt != null ) + { + if( m_invertActionOnDeselection ) + { + for( int i = 0; i < m_options.Count; i++ ) + { + if( i != m_currentOption && i != m_options.DisableIdx ) + { + OnActionPerformedEvt( false, true, true, this, m_options.ActionsPerOption[ i ] ); + } + } + } + + OnActionPerformedEvt( false, true, false, this, m_options.ActionsPerOption[ m_currentOption ] ); + } + } + + public TemplateOptionsItem Options { get { return m_options; } } + + public void Destroy() + { + OnActionPerformedEvt = null; + } + + public bool IsVisible + { + get { return m_isVisible; } + set { m_isVisible = value; } + } + + public bool WasVisible + { + get { return m_wasVisible; } + set { m_wasVisible = value; } + } + + public bool CheckOnExecute + { + get { return m_checkOnExecute; } + set { m_checkOnExecute = value; } + } + + public InlineProperty FieldValue + { + get { return m_options.FieldValue; } + set { m_options.FieldValue = value; } + } + + public float CurrentFieldValue + { + get { return m_options.FieldValue.FloatValue; } + set { m_options.FieldValue.FloatValue = value; } + } + + public int CurrentOption + { + get { return m_currentOption; } + set + { + m_currentOption = Mathf.Clamp( value, 0, m_options.Options.Length - 1 ); + // why refreshing here? + //Refresh(); + } + } + + public int CurrentOptionIdx + { + set + { + m_currentOption = Mathf.Clamp( value, 0, m_options.Options.Length - 1 ); + } + } + public bool EmptyEvent { get { return OnActionPerformedEvt == null; } } + public TemplateActionItemGrid.TemplateActionItemRow CurrentOptionActions + { + get + { + if( m_options.Type == AseOptionsType.Field && + m_currentOption == 1 ) + { + if( m_options.FieldValue.NodeId < -1 ) + { + //This is quite the hack. The bug is related to if a user chooses an inline property on the field option, then the behavior is to comment the original property set on the template + // The problem is that, if the user sets an inline property and select its own internal property from there, then the behavior that will prevail without this hack is to call the actions associated with setting a new inline property + // Which is on all templates to comment the original template internal property leaving the property commented on the final code (This was detected on URP PBR) + PropertyNode node = UIUtils.CurrentWindow.OutsideGraph.GetInternalTemplateNode( m_options.FieldValue.NodeId ) as PropertyNode; + if( node != null ) + { + if( node.PropertyName.Equals( m_options.FieldInlineName ) ) + { + return m_options.ActionsPerOption.Rows[ 0 ]; + } + } + } + else if( m_options.FieldValue.NodeId == -1 ) + { + // If node id is -1 then no node is selected on the inline dropdown then we should also fallback to using its internal property + return m_options.ActionsPerOption.Rows[ 0 ]; + } + } + return m_options.ActionsPerOption.Rows[m_currentOption]; + } + } + public bool InvertActionOnDeselection { get { return m_invertActionOnDeselection; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsUI.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsUI.cs.meta new file mode 100644 index 0000000..b3f1764 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsUI.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 081c72eb35d61c84e9a5c34522c3ff33 +timeCreated: 1534775306 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsUIHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsUIHelper.cs new file mode 100644 index 0000000..a5df79c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsUIHelper.cs @@ -0,0 +1,869 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class TemplateOptionsUIHelper + { + private const string CustomOptionsLabel = " Custom Options"; + + private bool m_isSubShader = false; + + [SerializeField] + private bool m_passCustomOptionsFoldout = true; + + [SerializeField] + private string m_passCustomOptionsLabel = CustomOptionsLabel; + + [SerializeField] + private int m_passCustomOptionsSizeCheck = 0; + + [SerializeField] + private List m_passCustomOptionsUI = new List(); + + [NonSerialized] + private Dictionary m_passCustomOptionsUIDict = new Dictionary(); + + [NonSerialized] + private TemplateMultiPassMasterNode m_owner; + + [NonSerialized] + private string[] m_readOptionNames; + + [NonSerialized] + private string[] m_readOptionSelections; + + [SerializeField] + private List m_passCustomOptionsPorts = new List(); + + public TemplateOptionsUIHelper( bool isSubShader ) + { + m_isSubShader = isSubShader; + } + + public void CopyOptionsValuesFrom( TemplateOptionsUIHelper origin ) + { + for( int i = 0; i < origin.PassCustomOptionsUI.Count; i++ ) + { + m_passCustomOptionsUI[ i ].CopyValuesFrom( origin.PassCustomOptionsUI[ i ] ); + } + } + + public void Destroy() + { + for( int i = 0; i < m_passCustomOptionsUI.Count; i++ ) + { + m_passCustomOptionsUI[ i ].Destroy(); + } + + m_passCustomOptionsUI.Clear(); + m_passCustomOptionsUI = null; + + m_passCustomOptionsUIDict.Clear(); + m_passCustomOptionsUIDict = null; + + m_passCustomOptionsPorts.Clear(); + m_passCustomOptionsPorts = null; + } + + public void DrawCustomOptions( TemplateMultiPassMasterNode owner ) + { + m_owner = owner; + + if( m_passCustomOptionsUI.Count > 0 ) + { + NodeUtils.DrawNestedPropertyGroup( ref m_passCustomOptionsFoldout, m_passCustomOptionsLabel, DrawCustomOptionsBlock ); + } + } + + public void DrawCustomOptionsBlock() + { + float currWidth = EditorGUIUtility.labelWidth; +#if UNITY_2019_3_OR_NEWER + float size = Mathf.Max( UIUtils.CurrentWindow.ParametersWindow.TransformedArea.width * 0.385f, 0 ); +#else + float size = Mathf.Max( UIUtils.CurrentWindow.ParametersWindow.TransformedArea.width * 0.34f, 0 ); +#endif + EditorGUIUtility.labelWidth = size; + for( int i = 0; i < m_passCustomOptionsUI.Count; i++ ) + { + m_passCustomOptionsUI[ i ].Draw( m_owner ); + } + EditorGUILayout.Space(); + EditorGUIUtility.labelWidth = currWidth; + } + + public void OnCustomOptionSelected( bool actionFromUser, bool isRefreshing, bool invertAction, TemplateMultiPassMasterNode owner, TemplateOptionUIItem uiItem, params TemplateActionItem[] validActions ) + { + uiItem.CheckOnExecute = false; + for( int i = 0; i < validActions.Length; i++ ) + { + AseOptionsActionType actionType = validActions[ i ].ActionType; + if( invertAction ) + { + if( !TemplateOptionsToolsHelper.InvertAction( validActions[ i ].ActionType, ref actionType ) ) + { + continue; + } + } + + + switch( actionType ) + { + case AseOptionsActionType.ShowOption: + { + TemplateOptionUIItem item = m_passCustomOptionsUI.Find( x => ( x.Options.Name.Equals( validActions[ i ].ActionData ) ) ); + if( item != null ) + { + if( isRefreshing ) + { + string optionId = validActions[ i ].PassName + validActions[ i ].ActionData + "Option"; + owner.ContainerGraph.ParentWindow.TemplatesManagerInstance.SetOptionsValue( optionId, true ); + } + + // this prevents options from showing up when loading by checking if they were hidden by another option + // it works on the assumption that an option that may possible hide this one is checked first + if( !isRefreshing ) + item.IsVisible = true; + else if( item.WasVisible ) + item.IsVisible = true; + + if( !invertAction && validActions[ i ].ActionDataIdx > -1 ) + item.CurrentOption = validActions[ i ].ActionDataIdx; + + item.CheckEnDisable( actionFromUser ); + } + else + { + Debug.LogFormat( "Could not find Option {0} for action {1}", validActions[ i ].ActionData, validActions[ i ].ActionType ); + } + } + break; + case AseOptionsActionType.HideOption: + { + TemplateOptionUIItem item = m_passCustomOptionsUI.Find( x => ( x.Options.Name.Equals( validActions[ i ].ActionData ) ) ); + if( item != null ) + { + bool flag = false; + if( isRefreshing ) + { + string optionId = validActions[ i ].PassName + validActions[ i ].ActionData + "Option"; + flag = owner.ContainerGraph.ParentWindow.TemplatesManagerInstance.SetOptionsValue( optionId, false ); + } + + item.IsVisible = false || flag; + if( !invertAction && validActions[ i ].ActionDataIdx > -1 ) + item.CurrentOption = validActions[ i ].ActionDataIdx; + + item.CheckEnDisable( actionFromUser ); + } + else + { + Debug.LogFormat( "Could not find Option {0} for action {1}", validActions[ i ].ActionData, validActions[ i ].ActionType ); + } + } + break; + case AseOptionsActionType.SetOption: + { + if( !uiItem.IsVisible ) + break; + + TemplateOptionUIItem item = m_passCustomOptionsUI.Find( x => ( x.Options.Name.Equals( validActions[ i ].ActionData ) ) ); + if( item != null ) + { + item.CurrentOption = validActions[ i ].ActionDataIdx; + item.Refresh(); + } + else + { + Debug.LogFormat( "Could not find Option {0} for action {1}", validActions[ i ].ActionData, validActions[ i ].ActionType ); + } + } + break; + case AseOptionsActionType.HidePort: + { + TemplateMultiPassMasterNode passMasterNode = owner; + if( !string.IsNullOrEmpty( validActions[ i ].PassName ) ) + { + passMasterNode = owner.ContainerGraph.GetMasterNodeOfPass( validActions[ i ].PassName,owner.LODIndex ); + } + + if( passMasterNode != null ) + { + InputPort port = validActions[ i ].ActionDataIdx > -1 ? + passMasterNode.GetInputPortByUniqueId( validActions[ i ].ActionDataIdx ) : + passMasterNode.InputPorts.Find( x => x.Name.Equals( validActions[ i ].ActionData ) ); + if( port != null ) + { + if( isRefreshing ) + { + string optionId = validActions[ i ].PassName + port.Name; + owner.ContainerGraph.ParentWindow.TemplatesManagerInstance.SetOptionsValue( optionId, port.IsConnected ); + port.Visible = port.IsConnected; + } + else + { + port.Visible = false; + } + passMasterNode.SizeIsDirty = true; + } + else + { + Debug.LogFormat( "Could not find port {0},{1} for action {2}", validActions[ i ].ActionDataIdx, validActions[ i ].ActionData, validActions[ i ].ActionType ); + } + } + else + { + Debug.LogFormat( "Could not find pass {0} for action {1} on {2}", validActions[ i ].PassName, validActions[ i ].ActionType, validActions[ i ].ActionData ); + } + } + break; + case AseOptionsActionType.ShowPort: + { + if( !uiItem.IsVisible ) + break; + + TemplateMultiPassMasterNode passMasterNode = owner; + if( !string.IsNullOrEmpty( validActions[ i ].PassName ) ) + { + passMasterNode = owner.ContainerGraph.GetMasterNodeOfPass( validActions[ i ].PassName, owner.LODIndex ); + } + + if( passMasterNode != null ) + { + InputPort port = validActions[ i ].ActionDataIdx > -1 ? + passMasterNode.GetInputPortByUniqueId( validActions[ i ].ActionDataIdx ) : + passMasterNode.InputPorts.Find( x => x.Name.Equals( validActions[ i ].ActionData ) ); + if( port != null ) + { + if( isRefreshing ) + { + string optionId = validActions[ i ].PassName + port.Name; + owner.ContainerGraph.ParentWindow.TemplatesManagerInstance.SetOptionsValue( optionId, true ); + } + + port.Visible = true; + passMasterNode.SizeIsDirty = true; + } + else + { + Debug.LogFormat( "Could not find port {0},{1} for action {2}", validActions[ i ].ActionDataIdx, validActions[ i ].ActionData, validActions[ i ].ActionType ); + } + } + else + { + Debug.LogFormat( "Could not find pass {0} for action {1} on {2}", validActions[ i ].PassName, validActions[ i ].ActionType, validActions[ i ].ActionData ); + } + } + break; + case AseOptionsActionType.SetPortName: + { + if( !uiItem.IsVisible ) + break; + + TemplateMultiPassMasterNode passMasterNode = owner; + if( !string.IsNullOrEmpty( validActions[ i ].PassName ) ) + { + passMasterNode = owner.ContainerGraph.GetMasterNodeOfPass( validActions[ i ].PassName, owner.LODIndex ); + } + + if( passMasterNode != null ) + { + InputPort port = passMasterNode.GetInputPortByUniqueId( validActions[ i ].ActionDataIdx ); + if( port != null ) + { + port.Name = validActions[ i ].ActionData; + passMasterNode.SizeIsDirty = true; + } + else + { + Debug.LogFormat( "Could not find port {0},{1} for action {2}", validActions[ i ].ActionDataIdx, validActions[ i ].ActionData, validActions[ i ].ActionType ); + } + } + else + { + Debug.LogFormat( "Could not find pass {0} for action {1} on {2}", validActions[ i ].PassName, validActions[ i ].ActionType, validActions[ i ].ActionData ); + } + } + break; + case AseOptionsActionType.SetDefine: + { + if( !uiItem.IsVisible ) + { + uiItem.CheckOnExecute = true; + break; + } + + //Debug.Log( "DEFINE " + validActions[ i ].ActionData ); + if( validActions[ i ].AllPasses ) + { + string actionData = validActions[ i ].ActionData; + string defineValue = string.Empty; + if( actionData.StartsWith( "pragma" ) ) + { + defineValue = "#" + actionData; + } + else + { + defineValue = "#define " + validActions[ i ].ActionData; + } + if( isRefreshing ) + { + owner.ContainerGraph.ParentWindow.TemplatesManagerInstance.SetOptionsValue( defineValue, true ); + } + List nodes = owner.ContainerGraph.GetMultiPassMasterNodes( owner.LODIndex ); + int count = nodes.Count; + for( int nodeIdx = 0; nodeIdx < count; nodeIdx++ ) + { + nodes[ nodeIdx ].OptionsDefineContainer.AddDefine( defineValue, false ); + } + } + else if( !string.IsNullOrEmpty( validActions[ i ].PassName ) ) + { + TemplateMultiPassMasterNode passMasterNode = owner.ContainerGraph.GetMasterNodeOfPass( validActions[ i ].PassName, owner.LODIndex ); + if( passMasterNode != null ) + { + string actionData = validActions[ i ].ActionData; + string defineValue = string.Empty; + if( actionData.StartsWith( "pragma" ) ) + { + defineValue = "#" + actionData; + } + else + { + defineValue = "#define " + validActions[ i ].ActionData; + } + if( isRefreshing ) + { + string optionsId = validActions[ i ].PassName + defineValue; + owner.ContainerGraph.ParentWindow.TemplatesManagerInstance.SetOptionsValue( optionsId, true ); + } + passMasterNode.OptionsDefineContainer.AddDefine( defineValue, false ); + } + else + { + Debug.LogFormat( "Could not find pass {0} for action {1} on {2}", validActions[ i ].PassName, validActions[ i ].ActionType, validActions[ i ].ActionData ); + } + } + else + { + uiItem.CheckOnExecute = true; + } + } + break; + case AseOptionsActionType.RemoveDefine: + { + //Debug.Log( "UNDEFINE " + validActions[ i ].ActionData ); + if( validActions[ i ].AllPasses ) + { + string actionData = validActions[ i ].ActionData; + string defineValue = string.Empty; + if( actionData.StartsWith( "pragma" ) ) + { + defineValue = "#" + actionData; + } + else + { + defineValue = "#define " + validActions[ i ].ActionData; + } + + bool flag = false; + if( isRefreshing ) + { + flag = owner.ContainerGraph.ParentWindow.TemplatesManagerInstance.SetOptionsValue( defineValue, false ); + } + + if( !flag ) + { + List nodes = owner.ContainerGraph.GetMultiPassMasterNodes( owner.LODIndex ); + int count = nodes.Count; + for( int nodeIdx = 0; nodeIdx < count; nodeIdx++ ) + { + nodes[ nodeIdx ].OptionsDefineContainer.RemoveDefine( defineValue ); + } + } + } + else if( !string.IsNullOrEmpty( validActions[ i ].PassName ) ) + { + TemplateMultiPassMasterNode passMasterNode = owner.ContainerGraph.GetMasterNodeOfPass( validActions[ i ].PassName, owner.LODIndex ); + if( passMasterNode != null ) + { + string actionData = validActions[ i ].ActionData; + string defineValue = string.Empty; + if( actionData.StartsWith( "pragma" ) ) + { + defineValue = "#" + actionData; + } + else + { + defineValue = "#define " + validActions[ i ].ActionData; + } + bool flag = false; + if( isRefreshing ) + { + string optionId = validActions[ i ].PassName + defineValue; + flag = owner.ContainerGraph.ParentWindow.TemplatesManagerInstance.SetOptionsValue( optionId, false ); + } + if( !flag ) + { + passMasterNode.OptionsDefineContainer.RemoveDefine( defineValue ); + } + } + else + { + Debug.LogFormat( "Could not find pass {0} for action {1} on {2}", validActions[ i ].PassName, validActions[ i ].ActionType, validActions[ i ].ActionData ); + } + } + else + { + uiItem.CheckOnExecute = false; + } + } + break; + case AseOptionsActionType.SetUndefine: + { + if( !uiItem.IsVisible ) + { + uiItem.CheckOnExecute = true; + break; + } + + if( validActions[ i ].AllPasses ) + { + string defineValue = "#undef " + validActions[ i ].ActionData; + if( isRefreshing ) + { + owner.ContainerGraph.ParentWindow.TemplatesManagerInstance.SetOptionsValue( defineValue, true ); + } + List nodes = owner.ContainerGraph.GetMultiPassMasterNodes(owner.LODIndex); + int count = nodes.Count; + for( int nodeIdx = 0; nodeIdx < count; nodeIdx++ ) + { + nodes[ nodeIdx ].OptionsDefineContainer.AddDefine( defineValue, false ); + } + } + else if( !string.IsNullOrEmpty( validActions[ i ].PassName ) ) + { + TemplateMultiPassMasterNode passMasterNode = owner.ContainerGraph.GetMasterNodeOfPass( validActions[ i ].PassName, owner.LODIndex ); + if( passMasterNode != null ) + { + string defineValue = "#undef " + validActions[ i ].ActionData; + if( isRefreshing ) + { + string optionsId = validActions[ i ].PassName + defineValue; + owner.ContainerGraph.ParentWindow.TemplatesManagerInstance.SetOptionsValue( optionsId, true ); + } + passMasterNode.OptionsDefineContainer.AddDefine( defineValue, false ); + } + else + { + Debug.LogFormat( "Could not find pass {0} for action {1} on {2}", validActions[ i ].PassName, validActions[ i ].ActionType, validActions[ i ].ActionData ); + } + } + else + { + uiItem.CheckOnExecute = true; + } + } + break; + case AseOptionsActionType.RemoveUndefine: + { + if( validActions[ i ].AllPasses ) + { + string defineValue = "#undef " + validActions[ i ].ActionData; + bool flag = false; + if( isRefreshing ) + { + flag = owner.ContainerGraph.ParentWindow.TemplatesManagerInstance.SetOptionsValue( defineValue, false ); + } + + if( !flag ) + { + List nodes = owner.ContainerGraph.GetMultiPassMasterNodes( owner.LODIndex ); + int count = nodes.Count; + for( int nodeIdx = 0; nodeIdx < count; nodeIdx++ ) + { + nodes[ nodeIdx ].OptionsDefineContainer.RemoveDefine( defineValue ); + } + } + } + else if( !string.IsNullOrEmpty( validActions[ i ].PassName ) ) + { + TemplateMultiPassMasterNode passMasterNode = owner.ContainerGraph.GetMasterNodeOfPass( validActions[ i ].PassName, owner.LODIndex ); + if( passMasterNode != null ) + { + bool flag = false; + string defineValue = "#undef " + validActions[ i ].ActionData; + if( isRefreshing ) + { + string optionId = validActions[ i ].PassName + defineValue; + flag = owner.ContainerGraph.ParentWindow.TemplatesManagerInstance.SetOptionsValue( optionId, false ); + } + + if( !flag ) + { + passMasterNode.OptionsDefineContainer.RemoveDefine( defineValue ); + } + } + else + { + Debug.LogFormat( "Could not find pass {0} for action {1} on {2}", validActions[ i ].PassName, validActions[ i ].ActionType, validActions[ i ].ActionData ); + } + } + else + { + uiItem.CheckOnExecute = false; + } + } + break; + case AseOptionsActionType.ExcludePass: + { + string optionId = validActions[ i ].ActionData + "Pass"; + bool flag = isRefreshing ? owner.ContainerGraph.ParentWindow.TemplatesManagerInstance.SetOptionsValue( optionId, false ) : false; + if( !flag ) + owner.SetPassVisible( validActions[ i ].ActionData, false ); + } + break; + case AseOptionsActionType.IncludePass: + { + if( !uiItem.IsVisible ) + break; + + string optionId = validActions[ i ].ActionData + "Pass"; + owner.ContainerGraph.ParentWindow.TemplatesManagerInstance.SetOptionsValue( optionId, true ); + owner.SetPassVisible( validActions[ i ].ActionData, true ); + } + break; + case AseOptionsActionType.SetPropertyOnPass: + { + //Debug.Log( "PASSPROP " + validActions[ i ].ActionData ); + //Refresh happens on hotcode reload and shader load and in those situation + // The property own serialization handles its setup + if( isRefreshing ) + continue; + + if( !string.IsNullOrEmpty( validActions[ i ].PassName ) ) + { + TemplateMultiPassMasterNode passMasterNode = owner.ContainerGraph.GetMasterNodeOfPass( validActions[ i ].PassName, owner.LODIndex ); + if( passMasterNode != null ) + { + passMasterNode.SetPropertyActionFromItem( actionFromUser, passMasterNode.PassModule, validActions[ i ] ); + } + else + { + Debug.LogFormat( "Could not find pass {0} for action {1} on {2}", validActions[ i ].PassName, validActions[ i ].ActionType, validActions[ i ].ActionData ); + } + } + else + { + owner.SetPropertyActionFromItem( actionFromUser, owner.PassModule, validActions[ i ] ); + } + } + break; + case AseOptionsActionType.SetPropertyOnSubShader: + { + //Refresh happens on hotcode reload and shader load and in those situation + // The property own serialization handles its setup + if( isRefreshing ) + continue; + + owner.SetPropertyActionFromItem( actionFromUser, owner.SubShaderModule, validActions[ i ] ); + } + break; + case AseOptionsActionType.SetShaderProperty: + { + //This action is only check when shader is compiled over + //the TemplateMultiPassMasterNode via the on CheckPropertyChangesOnOptions() method + } + break; + case AseOptionsActionType.ExcludeAllPassesBut: + { + //This action is only check when shader is compiled over + //the TemplateMultiPassMasterNode via the on CheckExcludeAllPassOptions() method + } + break; + case AseOptionsActionType.SetMaterialProperty: + { + if( isRefreshing ) + continue; + + if( !uiItem.IsVisible ) + break; + + if( owner.ContainerGraph.CurrentMaterial != null ) + { + string prop = validActions[ i ].ActionData; + if( owner.ContainerGraph.CurrentMaterial.HasProperty( prop ) ) + { + if( uiItem.Options.UIWidget == AseOptionsUIWidget.Float || uiItem.Options.UIWidget == AseOptionsUIWidget.FloatRange ) + owner.ContainerGraph.CurrentMaterial.SetFloat( prop, uiItem.CurrentFieldValue ); + else + owner.ContainerGraph.CurrentMaterial.SetInt( prop, (int)uiItem.CurrentFieldValue ); + + if( ASEMaterialInspector.Instance != null ) + ASEMaterialInspector.Instance.Repaint(); + } + } + } + break; + } + } + } + + public void SetupCustomOptionsFromTemplate( TemplateMultiPassMasterNode owner, bool newTemplate ) + { + TemplateOptionsContainer customOptionsContainer = m_isSubShader ? owner.SubShader.CustomOptionsContainer : owner.Pass.CustomOptionsContainer; + + if( !newTemplate && customOptionsContainer.Body.Length == m_passCustomOptionsSizeCheck ) + { + for( int i = 0; i < m_passCustomOptionsUI.Count; i++ ) + { + if( m_passCustomOptionsUI[ i ].EmptyEvent ) + { + if( m_isSubShader ) + { + m_passCustomOptionsUI[ i ].OnActionPerformedEvt += owner.OnCustomSubShaderOptionSelected; + } + else + { + m_passCustomOptionsUI[ i ].OnActionPerformedEvt += owner.OnCustomPassOptionSelected; + } + } + } + return; + } + + m_passCustomOptionsLabel = string.IsNullOrEmpty( customOptionsContainer.Name ) ? CustomOptionsLabel : " " + customOptionsContainer.Name; + + for( int i = 0; i < m_passCustomOptionsUI.Count; i++ ) + { + m_passCustomOptionsUI[ i ].Destroy(); + } + + m_passCustomOptionsUI.Clear(); + m_passCustomOptionsUIDict.Clear(); + m_passCustomOptionsPorts.Clear(); + + if( customOptionsContainer.Enabled ) + { + m_passCustomOptionsSizeCheck = customOptionsContainer.Body.Length; + for( int i = 0; i < customOptionsContainer.Options.Length; i++ ) + { + switch( customOptionsContainer.Options[ i ].Type ) + { + case AseOptionsType.Option: + { + TemplateOptionUIItem item = new TemplateOptionUIItem( customOptionsContainer.Options[ i ] ); + if( m_isSubShader ) + { + item.OnActionPerformedEvt += owner.OnCustomSubShaderOptionSelected; + } + else + { + item.OnActionPerformedEvt += owner.OnCustomPassOptionSelected; + } + + m_passCustomOptionsUI.Add( item ); + m_passCustomOptionsUIDict.Add( customOptionsContainer.Options[ i ].Id, item ); + } + break; + case AseOptionsType.Port: + { + TemplateOptionPortItem item = new TemplateOptionPortItem( owner, customOptionsContainer.Options[ i ] ); + m_passCustomOptionsPorts.Add( item ); + //if( m_isSubShader ) + //{ + // if( string.IsNullOrEmpty( customOptionsContainer.Options[ i ].Id ) ) + // { + // //No pass name selected. inject on all passes + // TemplateOptionPortItem item = new TemplateOptionPortItem( owner, customOptionsContainer.Options[ i ] ); + // m_passCustomOptionsPorts.Add( item ); + // } + // else if( customOptionsContainer.Options[ i ].Id.Equals( owner.PassName ) ) + // { + // TemplateOptionPortItem item = new TemplateOptionPortItem( owner, customOptionsContainer.Options[ i ] ); + // m_passCustomOptionsPorts.Add( item ); + // } + //} + //else + //{ + // TemplateOptionPortItem item = new TemplateOptionPortItem( owner, customOptionsContainer.Options[ i ] ); + // m_passCustomOptionsPorts.Add( item ); + //} + } + break; + case AseOptionsType.Field: + { + TemplateOptionUIItem item = new TemplateOptionUIItem( customOptionsContainer.Options[ i ] ); + if( m_isSubShader ) + { + item.OnActionPerformedEvt += owner.OnCustomSubShaderOptionSelected; + } + else + { + item.OnActionPerformedEvt += owner.OnCustomPassOptionSelected; + } + + m_passCustomOptionsUI.Add( item ); + m_passCustomOptionsUIDict.Add( customOptionsContainer.Options[ i ].Id, item ); + } + break; + } + } + } + else + { + m_passCustomOptionsSizeCheck = 0; + } + } + + public void SetCustomOptionsInfo( TemplateMultiPassMasterNode masterNode, ref MasterNodeDataCollector dataCollector ) + { + if( masterNode == null ) + return; + + for( int i = 0; i < m_passCustomOptionsUI.Count; i++ ) + { + m_passCustomOptionsUI[ i ].FillDataCollector( ref dataCollector ); + } + + for( int i = 0; i < m_passCustomOptionsPorts.Count; i++ ) + { + m_passCustomOptionsPorts[ i ].FillDataCollector( masterNode, ref dataCollector ); + } + } + + public void CheckImediateActionsForPort( TemplateMultiPassMasterNode masterNode , int portId ) + { + for( int i = 0; i < m_passCustomOptionsPorts.Count; i++ ) + { + m_passCustomOptionsPorts[ i ].CheckImediateActionsForPort( masterNode, portId ); + } + } + + public void SetSubShaderCustomOptionsPortsInfo( TemplateMultiPassMasterNode masterNode, ref MasterNodeDataCollector dataCollector ) + { + if( masterNode == null ) + return; + + + //for( int i = 0; i < m_passCustomOptionsPorts.Count; i++ ) + //{ + // if( string.IsNullOrEmpty( m_passCustomOptionsPorts[ i ].Options.Id ) || + // masterNode.PassUniqueName.Equals( m_passCustomOptionsPorts[ i ].Options.Id ) ) + // { + // m_passCustomOptionsPorts[ i ].FillDataCollector( masterNode, ref dataCollector ); + // } + //} + + for( int i = 0; i < m_passCustomOptionsPorts.Count; i++ ) + { + m_passCustomOptionsPorts[ i ].SubShaderFillDataCollector( masterNode, ref dataCollector ); + } + } + + public void RefreshCustomOptionsDict() + { + if( m_passCustomOptionsUIDict.Count != m_passCustomOptionsUI.Count ) + { + m_passCustomOptionsUIDict.Clear(); + int count = m_passCustomOptionsUI.Count; + for( int i = 0; i < count; i++ ) + { + m_passCustomOptionsUIDict.Add( m_passCustomOptionsUI[ i ].Options.Id, m_passCustomOptionsUI[ i ] ); + } + } + } + + public void ReadFromString( ref uint index, ref string[] nodeParams ) + { + RefreshCustomOptionsDict(); + int savedOptions = Convert.ToInt32( nodeParams[ index++ ] ); + + m_readOptionNames = new string[ savedOptions ]; + m_readOptionSelections = new string[ savedOptions ]; + + for( int i = 0; i < savedOptions; i++ ) + { + string optionName = nodeParams[ index++ ]; + string optionSelection = nodeParams[ index++ ]; + m_readOptionNames[ i ] = optionName; + m_readOptionSelections[ i ] = optionSelection; + + } + } + + public void SetReadOptions() + { + if( m_readOptionNames != null && m_readOptionSelections != null ) + { + for( int i = 0; i < m_readOptionNames.Length; i++ ) + { + if( m_passCustomOptionsUIDict.ContainsKey( m_readOptionNames[ i ] ) ) + { + if( m_passCustomOptionsUIDict[ m_readOptionNames[ i ] ].Options.Type == AseOptionsType.Field ) + { + m_passCustomOptionsUIDict[ m_readOptionNames[ i ] ].FieldValue.ReadFromSingle( m_readOptionSelections[ i ] ); + foreach( var item in m_passCustomOptionsUIDict[ m_readOptionNames[ i ] ].Options.ActionsPerOption.Rows ) + { + if( item.Columns.Length>0 && item.Columns[ 0 ].ActionType == AseOptionsActionType.SetMaterialProperty ) + { + if( UIUtils.CurrentWindow.CurrentGraph.CurrentMaterial != null ) + { + if( UIUtils.CurrentWindow.CurrentGraph.CurrentMaterial.HasProperty( item.Columns[ 0 ].ActionData ) ) + { + m_passCustomOptionsUIDict[ m_readOptionNames[ i ] ].CurrentFieldValue = UIUtils.CurrentWindow.CurrentGraph.CurrentMaterial.GetFloat( item.Columns[ 0 ].ActionData ); + } + } + } + } + } + else + m_passCustomOptionsUIDict[ m_readOptionNames[ i ] ].CurrentOptionIdx = Convert.ToInt32( m_readOptionSelections[ i ] ); + } + } + } + } + + public void Refresh() + { + int count = m_passCustomOptionsUI.Count; + for( int i = 0; i < count; i++ ) + { + m_passCustomOptionsUI[ i ].Refresh(); + } + } + + public void CheckDisable() + { + int count = m_passCustomOptionsUI.Count; + for( int i = 0; i < count; i++ ) + { + m_passCustomOptionsUI[ i ].CheckEnDisable(false); + } + } + + public void WriteToString( ref string nodeInfo ) + { + int optionsCount = m_passCustomOptionsUI.Count; + IOUtils.AddFieldValueToString( ref nodeInfo, optionsCount ); + for( int i = 0; i < optionsCount; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_passCustomOptionsUI[ i ].Options.Id ); + if( m_passCustomOptionsUI[ i ].Options.Type == AseOptionsType.Field ) + IOUtils.AddFieldValueToString( ref nodeInfo, m_passCustomOptionsUI[ i ].FieldValue.WriteToSingle() ); + else + IOUtils.AddFieldValueToString( ref nodeInfo, m_passCustomOptionsUI[ i ].CurrentOption ); + } + } + + public List PassCustomOptionsUI { get { return m_passCustomOptionsUI; } } + + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsUIHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsUIHelper.cs.meta new file mode 100644 index 0000000..077260b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateOptionsUIHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 389dcf32e61ce9d47b9a92ab691365d3 +timeCreated: 1544089703 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatePass.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatePass.cs new file mode 100644 index 0000000..833482f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatePass.cs @@ -0,0 +1,637 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +#define CUSTOM_OPTIONS_AVAILABLE +using UnityEngine; +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; + +namespace AmplifyShaderEditor +{ + + [Serializable] + public class TemplatePass + { + private const string DefaultPassNameStr = "SubShader {0} Pass {1}"; + + [SerializeField] + private int m_idx = -1; + + [SerializeField] + private bool m_isInvisible = false; + + [SerializeField] + private int m_invisibleOptions = 0; + + [SerializeField] + private bool m_isMainPass = false; + + [SerializeField] + private TemplateModulesData m_modules; + + [SerializeField] + private List m_inputDataList = new List(); + private Dictionary m_inputDataDict = new Dictionary(); + + [SerializeField] + private TemplateFunctionData m_vertexFunctionData; + + [SerializeField] + private TemplateFunctionData m_fragmentFunctionData; + + [SerializeField] + private VertexDataContainer m_vertexDataContainer; + + [SerializeField] + private TemplateInterpData m_interpolatorDataContainer; + + [SerializeField] + private TemplateTessVControlTag m_tessVControlTag; + + [SerializeField] + private TemplateTessControlData m_tessControlData; + + [SerializeField] + private TemplateTessDomainData m_tessDomainData; + + [SerializeField] + private List m_localVarsList = new List(); + + [SerializeField] + private string m_uniquePrefix; + + [SerializeField] + private TemplatePropertyContainer m_templateProperties = new TemplatePropertyContainer(); + + [SerializeField] + private List m_availableShaderGlobals = new List(); + + [SerializeField] + TemplateInfoContainer m_passNameContainer = new TemplateInfoContainer(); +#if CUSTOM_OPTIONS_AVAILABLE + [SerializeField] + TemplateOptionsContainer m_customOptionsContainer = new TemplateOptionsContainer(); +#endif + public TemplatePass( TemplateMultiPass template, TemplateSubShader subShader, int subshaderIdx, int passIdx, TemplateIdManager idManager, string uniquePrefix, int offsetIdx, TemplatePassInfo passInfo, ref Dictionary duplicatesHelper ) + { + m_idx = passIdx; + + m_uniquePrefix = uniquePrefix; + idManager.RegisterPassId( passInfo.Data ); + m_isMainPass = passInfo.Data.Contains( TemplatesManager.TemplateMainPassTag ); + if( !m_isMainPass ) + { + string id = string.Empty; + int idIndex = 0; + m_isInvisible = TemplateHelperFunctions.FetchInvisibleInfo( passInfo.Data, ref m_invisibleOptions, ref id, ref idIndex ); + if( m_isInvisible ) + { + idManager.RegisterId( idIndex, uniquePrefix + id, id, true ); + } + } + + FetchPassName( offsetIdx, passInfo.Data ); + if( m_passNameContainer.Index > -1 ) + { + idManager.RegisterId( m_passNameContainer.Index, uniquePrefix + m_passNameContainer.Id, m_passNameContainer.Id ); + } + else + { + m_passNameContainer.Data = string.Format( DefaultPassNameStr, subshaderIdx, passIdx ); + } + +#if CUSTOM_OPTIONS_AVAILABLE + m_customOptionsContainer = TemplateOptionsToolsHelper.GenerateOptionsContainer( false, passInfo.Data ); + if( m_customOptionsContainer.Enabled ) + { + idManager.RegisterId( m_customOptionsContainer.Index, uniquePrefix + m_customOptionsContainer.Body, m_customOptionsContainer.Body, true ); + } + //m_customOptionsContainer.CopyPortOptionsFrom( subShader.CustomOptionsContainer, m_passNameContainer.Data ); +#endif + m_modules = new TemplateModulesData( m_customOptionsContainer,idManager, m_templateProperties, uniquePrefix + "Module", offsetIdx, passInfo.Data, false ); + + if( !m_modules.PassTag.IsValid ) + { + m_modules.PassTag.StartIdx = passInfo.GlobalStartIdx; + m_templateProperties.AddId( passInfo.Data, m_modules.PassTag.Id, passInfo.LocalStartIdx, false ); + //m_modules.PassTag.StartIdx -= m_templateProperties.PropertyDict[ m_modules.PassTag.Id ].Indentation.Length; + //m_templateProperties.PropertyDict[ m_modules.PassTag.Id ].UseIndentationAtStart = false; + idManager.RegisterId( m_modules.PassTag.StartIdx, m_modules.UniquePrefix + m_modules.PassTag.Id, string.Empty ); + } + m_modules.SetPassUniqueNameIfUndefined( m_passNameContainer.Data ); + + m_modules.SRPType = subShader.Modules.SRPType; + if( m_modules.SRPType == TemplateSRPType.HD ) + { + m_modules.SRPIsPBR = passInfo.Data.Contains( TemplateHelperFunctions.HDPBRTag ); + + } + + Dictionary ownDuplicatesDict = new Dictionary( duplicatesHelper ); + TemplateHelperFunctions.CreateShaderGlobalsList( passInfo.Data, ref m_availableShaderGlobals, ref ownDuplicatesDict,subshaderIdx,passIdx ); + if( m_modules.SRPType == TemplateSRPType.BuiltIn ) + { + TemplateHelperFunctions.CheckUnityBuiltinGlobalMacros( passInfo.Data, ref m_availableShaderGlobals, ref ownDuplicatesDict, subshaderIdx, passIdx ); + } + + // Vertex and Interpolator data + FetchVertexAndInterpData( template, subShader.Modules, offsetIdx, passInfo.Data ); + if( m_vertexDataContainer != null ) + idManager.RegisterId( m_vertexDataContainer.VertexDataStartIdx, uniquePrefix + m_vertexDataContainer.VertexDataId, m_vertexDataContainer.VertexDataId ); + + if( m_interpolatorDataContainer != null ) + idManager.RegisterId( m_interpolatorDataContainer.InterpDataStartIdx, uniquePrefix + m_interpolatorDataContainer.InterpDataId, m_interpolatorDataContainer.InterpDataId ); + + //Fetch function code areas + FetchCodeAreas( offsetIdx, TemplatesManager.TemplateVertexCodeBeginArea, MasterNodePortCategory.Vertex, passInfo.Data ); + if( m_vertexFunctionData != null ) + idManager.RegisterId( m_vertexFunctionData.Position, uniquePrefix + m_vertexFunctionData.Id, m_vertexFunctionData.Id ); + + FetchCodeAreas( offsetIdx, TemplatesManager.TemplateFragmentCodeBeginArea, MasterNodePortCategory.Fragment, passInfo.Data ); + if( m_fragmentFunctionData != null ) + idManager.RegisterId( m_fragmentFunctionData.Position, uniquePrefix + m_fragmentFunctionData.Id, m_fragmentFunctionData.Id ); + + //Fetching inputs, must be do + if( m_fragmentFunctionData != null ) + FetchInputs( offsetIdx, MasterNodePortCategory.Fragment, passInfo.Data ); + + if( m_vertexFunctionData != null ) + FetchInputs( offsetIdx, MasterNodePortCategory.Vertex, passInfo.Data ); + + FetchTessellationData( template, subShader.Modules, offsetIdx, passInfo.Data ); + if( m_tessVControlTag != null ) + idManager.RegisterId( m_tessVControlTag.StartIdx, uniquePrefix + m_tessVControlTag.Id, m_tessVControlTag.Id ); + + if( m_tessControlData != null ) + idManager.RegisterId( m_tessControlData.StartIdx, uniquePrefix + m_tessControlData.Id, m_tessControlData.Id ); + + if( m_tessDomainData != null ) + idManager.RegisterId( m_tessDomainData.StartIdx, uniquePrefix + m_tessDomainData.Id, m_tessDomainData.Id ); + + TemplateHelperFunctions.FetchInlineVars( passInfo.Data, ref idManager ); + + //Fetch local variables must be done after fetching code areas as it needs them to see is variable is on vertex or fragment + TemplateHelperFunctions.FetchLocalVars( passInfo.Data, ref m_localVarsList, m_vertexFunctionData, m_fragmentFunctionData ); + + int localVarCount = m_localVarsList.Count; + if( localVarCount > 0 ) + { + idManager.RegisterTag( TemplatesManager.TemplateLocalVarTag ); + for( int i = 0; i < localVarCount; i++ ) + { + if( m_localVarsList[ i ].IsSpecialVar ) + { + idManager.RegisterTag( m_localVarsList[ i ].Id ); + } + } + } + + int inputsCount = m_inputDataList.Count; + for( int i = 0; i < inputsCount; i++ ) + { + if( m_inputDataList[ i ] != null ) + idManager.RegisterId( m_inputDataList[ i ].TagGlobalStartIdx, uniquePrefix + m_inputDataList[ i ].TagId, m_inputDataList[ i ].TagId ); + } + + //int passEndIndex = passInfo.Data.LastIndexOf( "}" ); + //if( passEndIndex > 0 ) + //{ + // int identationIndex = -1; + // for( int i = passEndIndex; i >= 0; i-- ) + // { + // if( passInfo.Data[ i ] == TemplatesManager.TemplateNewLine ) + // { + // identationIndex = i + 1; + // break; + // } + + // if( i == 0 ) + // { + // identationIndex = 0; + // } + // } + + // if( identationIndex > -1 ) + // { + // int length = passEndIndex - identationIndex; + // string indentation = ( length > 0 ) ? passInfo.Data.Substring( identationIndex, length ) : string.Empty; + // TemplateProperty templateProperty = new TemplateProperty( TemplatesManager.TemplateEndPassTag, indentation, false ); + // m_templateProperties.AddId( templateProperty ); + // idManager.RegisterId( offsetIdx + passEndIndex, uniquePrefix + TemplatesManager.TemplateEndPassTag, string.Empty ); + // } + //} + + ownDuplicatesDict.Clear(); + ownDuplicatesDict = null; + } + + public void Destroy() + { + m_passNameContainer = null; +#if CUSTOM_OPTIONS_AVAILABLE + m_customOptionsContainer = null; +#endif + if( m_templateProperties != null ) + m_templateProperties.Destroy(); + + m_templateProperties = null; + + if( m_modules != null ) + m_modules.Destroy(); + + m_modules = null; + + if( m_inputDataList != null ) + m_inputDataList.Clear(); + + m_inputDataList = null; + + if( m_inputDataDict != null ) + m_inputDataDict.Clear(); + + m_inputDataDict = null; + + m_vertexFunctionData = null; + m_fragmentFunctionData = null; + + if( m_vertexDataContainer != null ) + m_vertexDataContainer.Destroy(); + + m_vertexDataContainer = null; + + m_tessVControlTag = null; + + m_tessControlData = null; + + m_tessDomainData = null; + + if( m_interpolatorDataContainer != null ) + m_interpolatorDataContainer.Destroy(); + + if( m_localVarsList != null ) + { + m_localVarsList.Clear(); + m_localVarsList = null; + } + + m_interpolatorDataContainer = null; + + if( m_availableShaderGlobals != null ) + m_availableShaderGlobals.Clear(); + + m_availableShaderGlobals = null; + } + + public TemplateInputData InputDataFromId( int id ) + { + if( m_inputDataDict == null ) + m_inputDataDict = new Dictionary(); + + if( m_inputDataDict.Count != m_inputDataList.Count ) + { + m_inputDataDict.Clear(); + for( int i = 0; i < m_inputDataList.Count; i++ ) + { + m_inputDataDict.Add( m_inputDataList[ i ].PortUniqueId, m_inputDataList[ i ] ); + } + } + + if( m_inputDataDict.ContainsKey( id ) ) + return m_inputDataDict[ id ]; + + return null; + } + + void FetchPassName( int offsetIdx, string body ) + { + Match match = Regex.Match( body, TemplateHelperFunctions.PassNamePattern ); + if( match != null && match.Groups.Count > 1 ) + { + m_passNameContainer.Id = match.Groups[ 0 ].Value; + m_passNameContainer.Data = match.Groups[ 1 ].Value; + m_passNameContainer.Index = offsetIdx + match.Index; + } + } + + void FetchTessellationData( TemplateMultiPass template, TemplateModulesData subShaderModule, int offsetIdx, string body ) + { + // Tessellation VControl Tag + try + { + int vcontrolcodeBegin = body.IndexOf( TemplatesManager.TemplateTessVControlTag ); + if( vcontrolcodeBegin > -1 ) + { + m_tessVControlTag = new TemplateTessVControlTag(); + m_tessVControlTag.Id = TemplatesManager.TemplateTessVControlTag; + m_tessVControlTag.StartIdx = offsetIdx + vcontrolcodeBegin; + + m_templateProperties.AddId( body, m_tessVControlTag.Id ); + } + } + catch( Exception e ) + { + Debug.LogException( e ); + } + + // Tessellation Control Data + try + { + int controlCodeBegin = body.IndexOf( TemplatesManager.TemplateTessControlCodeArea ); + if( controlCodeBegin > -1 ) + { + int beginIdx = controlCodeBegin + TemplatesManager.TemplateTessControlCodeArea.Length; + int endIdx = body.IndexOf( TemplatesManager.TemplateEndOfLine, beginIdx ); + int length = endIdx - beginIdx; + + string parameters = body.Substring( beginIdx, length ); + + string[] parametersArr = parameters.Split( IOUtils.FIELD_SEPARATOR ); + + string id = body.Substring( controlCodeBegin, endIdx + TemplatesManager.TemplateEndOfLine.Length - controlCodeBegin ); + string inParameters = parametersArr[ 0 ]; + string outParameters = ( parametersArr.Length > 1 ) ? parametersArr[ 1 ] : string.Empty; + + m_tessControlData = new TemplateTessControlData( offsetIdx + controlCodeBegin, id, inParameters, outParameters ); + + m_templateProperties.AddId( body, id ); + } + } + catch( Exception e ) + { + Debug.LogException( e ); + } + + // Tessellation Domain Data + try + { + int domainCodeBegin = body.IndexOf( TemplatesManager.TemplateTessDomainCodeArea ); + if( domainCodeBegin > -1 ) + { + int beginIdx = domainCodeBegin + TemplatesManager.TemplateTessDomainCodeArea.Length; + int endIdx = body.IndexOf( TemplatesManager.TemplateEndOfLine, beginIdx ); + int length = endIdx - beginIdx; + + string parameters = body.Substring( beginIdx, length ); + + string[] parametersArr = parameters.Split( IOUtils.FIELD_SEPARATOR ); + + string id = body.Substring( domainCodeBegin, endIdx + TemplatesManager.TemplateEndOfLine.Length - domainCodeBegin ); + string inParameters = ( parametersArr.Length > 0 ) ? parametersArr[ 0 ] : string.Empty; + string outParameters = ( parametersArr.Length > 1 ) ? parametersArr[ 1 ] : string.Empty; + string baryParameters = ( parametersArr.Length > 2 ) ? parametersArr[ 2 ] : string.Empty; + + m_tessDomainData = new TemplateTessDomainData( offsetIdx + domainCodeBegin, id, inParameters, outParameters, baryParameters ); + + m_templateProperties.AddId( body, id ); + } + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + + void FetchVertexAndInterpData(TemplateMultiPass template, TemplateModulesData subShaderModule, int offsetIdx, string body ) + { + // Vertex Data + try + { + int vertexDataTagBegin = body.IndexOf( TemplatesManager.TemplateVertexDataTag ); + if( vertexDataTagBegin > -1 ) + { + m_vertexDataContainer = new VertexDataContainer(); + m_vertexDataContainer.VertexDataStartIdx = offsetIdx + vertexDataTagBegin; + int vertexDataTagEnd = body.IndexOf( TemplatesManager.TemplateEndOfLine, vertexDataTagBegin ); + m_vertexDataContainer.VertexDataId = body.Substring( vertexDataTagBegin, vertexDataTagEnd + TemplatesManager.TemplateEndOfLine.Length - vertexDataTagBegin ); + int dataBeginIdx = body.LastIndexOf( '{', vertexDataTagBegin, vertexDataTagBegin ); + int dataEndIdx = body.IndexOf( '}', vertexDataTagEnd ); + string vertexData = body.Substring( dataBeginIdx + 1, dataEndIdx - dataBeginIdx ); + + int parametersBegin = vertexDataTagBegin + TemplatesManager.TemplateVertexDataTag.Length; + string parameters = body.Substring( parametersBegin, vertexDataTagEnd - parametersBegin ); + m_vertexDataContainer.VertexData = TemplateHelperFunctions.CreateVertexDataList( vertexData, parameters ); + m_templateProperties.AddId( body, m_vertexDataContainer.VertexDataId ); + } + } + catch( Exception e ) + { + Debug.LogException( e ); + } + + // Available interpolators + try + { + int interpDataBegin = body.IndexOf( TemplatesManager.TemplateInterpolatorBeginTag ); + if( interpDataBegin > -1 ) + { + int interpDataEnd = body.IndexOf( TemplatesManager.TemplateEndOfLine, interpDataBegin ); + string interpDataId = body.Substring( interpDataBegin, interpDataEnd + TemplatesManager.TemplateEndOfLine.Length - interpDataBegin ); + + int dataBeginIdx = body.LastIndexOf( '{', interpDataBegin, interpDataBegin ); + int dataEndIdx = body.IndexOf( '}', interpDataEnd ); + string interpData = body.Substring( dataBeginIdx + 1, dataEndIdx - dataBeginIdx ); + + int interpolatorAmount = TemplateHelperFunctions.AvailableInterpolators[ "2.5" ]; + + if( m_modules.ShaderModel.IsValid ) + { + interpolatorAmount = m_modules.ShaderModel.InterpolatorAmount; + } + else if( subShaderModule.ShaderModel.IsValid ) + { + interpolatorAmount = subShaderModule.ShaderModel.InterpolatorAmount; + } + else if( template.GlobalShaderModel.IsValid ) + { + interpolatorAmount = template.GlobalShaderModel.InterpolatorAmount; + } + + m_interpolatorDataContainer = TemplateHelperFunctions.CreateInterpDataList( interpData, interpDataId, interpolatorAmount ); + m_interpolatorDataContainer.InterpDataId = interpDataId; + m_interpolatorDataContainer.InterpDataStartIdx = offsetIdx + interpDataBegin; + m_templateProperties.AddId( body, interpDataId ); + + } + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + + void FetchCodeAreas( int offsetIdx, string begin, MasterNodePortCategory category, string body ) + { + int areaBeginIndexes = body.IndexOf( begin ); + if( areaBeginIndexes > -1 ) + { + int beginIdx = areaBeginIndexes + begin.Length; + int endIdx = body.IndexOf( TemplatesManager.TemplateEndOfLine, beginIdx ); + int length = endIdx - beginIdx; + + string parameters = body.Substring( beginIdx, length ); + + string[] parametersArr = parameters.Split( IOUtils.FIELD_SEPARATOR ); + + string id = body.Substring( areaBeginIndexes, endIdx + TemplatesManager.TemplateEndOfLine.Length - areaBeginIndexes ); + string inParameters = parametersArr[ 0 ]; + string outParameters = ( parametersArr.Length > 1 ) ? parametersArr[ 1 ] : string.Empty; + if( category == MasterNodePortCategory.Fragment ) + { + string mainBodyName = string.Empty; + int mainBodyLocalIndex = -1; + + Match mainBodyNameMatch = Regex.Match( body, TemplateHelperFunctions.FragmentPragmaPattern ); + if( mainBodyNameMatch != null && mainBodyNameMatch.Groups.Count == 2 ) + { + mainBodyName = mainBodyNameMatch.Groups[ 1 ].Value; + string pattern = string.Format( TemplateHelperFunctions.FunctionBodyStartPattern, mainBodyName ); + Match mainBodyIdMatch = Regex.Match( body, pattern ); + if( mainBodyIdMatch != null && mainBodyIdMatch.Groups.Count > 0 ) + { + mainBodyLocalIndex = mainBodyIdMatch.Index; + } + + } + + m_fragmentFunctionData = new TemplateFunctionData( mainBodyLocalIndex, mainBodyName, id, offsetIdx + areaBeginIndexes, inParameters, outParameters, category ); + } + else + { + string mainBodyName = string.Empty; + int mainBodyLocalIndex = -1; + + Match mainBodyNameMatch = Regex.Match( body, TemplateHelperFunctions.VertexPragmaPattern ); + if( mainBodyNameMatch != null && mainBodyNameMatch.Groups.Count == 2 ) + { + mainBodyName = mainBodyNameMatch.Groups[ 1 ].Value; + string pattern = string.Format( TemplateHelperFunctions.FunctionBodyStartPattern, mainBodyName ); + Match mainBodyIdMatch = Regex.Match( body, pattern ); + if( mainBodyIdMatch != null && mainBodyIdMatch.Groups.Count > 0 ) + { + mainBodyLocalIndex = mainBodyIdMatch.Index; + } + } + + m_vertexFunctionData = new TemplateFunctionData( mainBodyLocalIndex, mainBodyName, id, offsetIdx + areaBeginIndexes, inParameters, outParameters, category ); + } + m_templateProperties.AddId( body, id, true ); + } + } + + void FetchInputs( int offset, MasterNodePortCategory portCategory, string body ) + { + string beginTag = ( portCategory == MasterNodePortCategory.Fragment ) ? TemplatesManager.TemplateInputsFragBeginTag : TemplatesManager.TemplateInputsVertBeginTag; + int[] inputBeginIndexes = body.AllIndexesOf( beginTag ); + if( inputBeginIndexes != null && inputBeginIndexes.Length > 0 ) + { + for( int i = 0; i < inputBeginIndexes.Length; i++ ) + { + int inputEndIdx = body.IndexOf( TemplatesManager.TemplateEndSectionTag, inputBeginIndexes[ i ] ); + int defaultValueBeginIdx = inputEndIdx + TemplatesManager.TemplateEndSectionTag.Length; + int endLineIdx = body.IndexOf( TemplatesManager.TemplateFullEndTag, defaultValueBeginIdx ); + + string defaultValue = body.Substring( defaultValueBeginIdx, endLineIdx - defaultValueBeginIdx ); + string tagId = body.Substring( inputBeginIndexes[ i ], endLineIdx + TemplatesManager.TemplateFullEndTag.Length - inputBeginIndexes[ i ] ); + + int beginIndex = inputBeginIndexes[ i ] + beginTag.Length; + int length = inputEndIdx - beginIndex; + string inputData = body.Substring( beginIndex, length ); + string[] inputDataArray = inputData.Split( IOUtils.FIELD_SEPARATOR ); + + if( inputDataArray != null && inputDataArray.Length > 0 ) + { + try + { + string portName = inputDataArray[ (int)TemplatePortIds.Name ]; + WirePortDataType dataType = (WirePortDataType)Enum.Parse( typeof( WirePortDataType ), inputDataArray[ (int)TemplatePortIds.DataType ].ToUpper() ); + if( inputDataArray.Length == 3 ) + { + int portOrderId = m_inputDataList.Count; + int portUniqueId = -1; + bool isInt = int.TryParse( inputDataArray[ 2 ], out portUniqueId ); + if( isInt ) + { + if( portUniqueId < 0 ) + portUniqueId = m_inputDataList.Count; + + m_inputDataList.Add( new TemplateInputData( inputBeginIndexes[ i ], offset + inputBeginIndexes[ i ], tagId, portName, defaultValue, dataType, portCategory, portUniqueId, portOrderId, string.Empty ) ); + m_templateProperties.AddId( body, tagId, false ); + } + else + { + portUniqueId = m_inputDataList.Count; + m_inputDataList.Add( new TemplateInputData( inputBeginIndexes[ i ], offset + inputBeginIndexes[ i ], tagId, portName, defaultValue, dataType, portCategory, portUniqueId, portOrderId, inputDataArray[ 2 ] ) ); + m_templateProperties.AddId( body, tagId, false ); + } + } + else + { + int portUniqueIDArrIdx = (int)TemplatePortIds.UniqueId; + int portUniqueId = ( portUniqueIDArrIdx < inputDataArray.Length ) ? Convert.ToInt32( inputDataArray[ portUniqueIDArrIdx ] ) : -1; + if( portUniqueId < 0 ) + portUniqueId = m_inputDataList.Count; + + int portOrderArrayIdx = (int)TemplatePortIds.OrderId; + int portOrderId = ( portOrderArrayIdx < inputDataArray.Length ) ? Convert.ToInt32( inputDataArray[ portOrderArrayIdx ] ) : -1; + if( portOrderId < 0 ) + portOrderId = m_inputDataList.Count; + + int portLinkIdx = (int)TemplatePortIds.Link; + string linkId = ( portLinkIdx < inputDataArray.Length ) ? inputDataArray[ portLinkIdx ] : string.Empty; + m_inputDataList.Add( new TemplateInputData( inputBeginIndexes[ i ], offset + inputBeginIndexes[ i ], tagId, portName, defaultValue, dataType, portCategory, portUniqueId, portOrderId, linkId ) ); + m_templateProperties.AddId( body, tagId, false ); + } + } + catch( Exception e ) + { + Debug.LogException( e ); + } + } + } + } + } + +#if CUSTOM_OPTIONS_AVAILABLE + public TemplateOptionsContainer CustomOptionsContainer { get { return m_customOptionsContainer; } } +#endif + public TemplateModulesData Modules { get { return m_modules; } } + public List InputDataList { get { return m_inputDataList; } } + public TemplateFunctionData VertexFunctionData { get { return m_vertexFunctionData; } } + public TemplateFunctionData FragmentFunctionData { get { return m_fragmentFunctionData; } } + public VertexDataContainer VertexDataContainer { get { return m_vertexDataContainer; } } + public TemplateInterpData InterpolatorDataContainer { get { return m_interpolatorDataContainer; } } + public TemplateTessVControlTag TessVControlTag { get { return m_tessVControlTag; } } + public TemplateTessControlData TessControlData { get { return m_tessControlData; } } + public TemplateTessDomainData TessDomainData { get { return m_tessDomainData; } } + public string UniquePrefix { get { return m_uniquePrefix; } } + public TemplatePropertyContainer TemplateProperties { get { return m_templateProperties; } } + public List AvailableShaderGlobals { get { return m_availableShaderGlobals; } } + public List LocalVarsList { get { return m_localVarsList; } } + public TemplateInfoContainer PassNameContainer { get { return m_passNameContainer; } } + public bool IsMainPass { get { return m_isMainPass; } set { m_isMainPass = value; } } + public bool IsInvisible { get { return m_isInvisible; } } + public int InvisibleOptions { get { return m_invisibleOptions; } } + public int Idx { get { return m_idx; } } + public bool AddToList + { + get + { + if( m_isInvisible ) + { + return ( m_inputDataList.Count > 0 ); + } + + return true; + } + } + public bool HasValidFunctionBody + { + get + { + if( m_fragmentFunctionData != null || m_vertexFunctionData != null ) + return true; + return false; + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatePass.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatePass.cs.meta new file mode 100644 index 0000000..e36dee4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatePass.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1e6749bf88e2d0f4ab5812f084973f4c +timeCreated: 1517831575 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatePassSelectorHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatePassSelectorHelper.cs new file mode 100644 index 0000000..e85a92d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatePassSelectorHelper.cs @@ -0,0 +1,167 @@ +using UnityEditor; +using UnityEngine; +using System; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class PassVisibleOptionsItems + { + public bool Visible; + public string Name; + public int Idx = -1; + } + + [Serializable] + public class TemplatePassSelectorHelper + { + private const string Label = " Available Passes"; + + [SerializeField] + private bool m_foldout; + + [SerializeField] + private PassVisibleOptionsItems[] m_currentPasses; + + [NonSerialized] + private Dictionary m_currentPassesDict; + + [SerializeField] + private int m_mainPassId; + + public void CopyFrom( TemplatePassSelectorHelper from ) + { + for( int i = 0; i < from.AvailablePasses.Length; i++ ) + { + SetPassVisible( from.AvailablePasses[ i ].Name, from.AvailablePasses[ i ].Visible ); + } + } + + public void Setup( TemplateSubShader subShader ) + { + if( m_currentPasses == null ) + { + m_currentPassesDict = new Dictionary(); + m_currentPasses = new PassVisibleOptionsItems[ subShader.Passes.Count ]; + for( int i = 0; i < m_currentPasses.Length; i++ ) + { + if( subShader.Passes[ i ].IsMainPass ) + m_mainPassId = i; + + m_currentPasses[ i ] = new PassVisibleOptionsItems() { Name = subShader.Passes[ i ].PassNameContainer.Data, Visible = true, Idx = i }; + m_currentPassesDict.Add( m_currentPasses[ i ].Name, m_currentPasses[ i ] ); + } + } + } + + public void Clear() + { + m_currentPasses = null; + + if( m_currentPassesDict != null ) + m_currentPassesDict.Clear(); + + m_currentPassesDict = null; + } + + public void Destroy() + { + m_currentPasses = null; + + if( m_currentPassesDict != null ) + m_currentPassesDict.Clear(); + + m_currentPassesDict = null; + } + + public void Draw( TemplateMultiPassMasterNode owner ) + { + if( m_currentPasses.Length < 2 ) + return; + + NodeUtils.DrawNestedPropertyGroup( ref m_foldout, Label, () => + { + for( int i = 0; i < m_currentPasses.Length; i++ ) + { + EditorGUI.BeginChangeCheck(); + m_currentPasses[ i ].Visible = owner.EditorGUILayoutToggleLeft( m_currentPasses[ i ].Name, m_currentPasses[ i ].Visible ); + if( EditorGUI.EndChangeCheck() ) + { + owner.ContainerGraph.GetMultiPassMasterNodes( owner.LODIndex)[ m_currentPasses[ i ].Idx ].IsInvisible = !m_currentPasses[ i ].Visible; + } + + } + EditorGUILayout.Space(); + } ); + } + + public void ReadFromString( ref uint index, ref string[] nodeParams ) + { + int passAmount = Convert.ToInt32( nodeParams[ index++ ] ); + for( int i = 0; i < passAmount; i++ ) + { + bool value = Convert.ToBoolean( nodeParams[ index++ ] ); + if( i < m_currentPasses.Length ) + { + m_currentPasses[ i ].Visible = value; + } + } + } + + public void WriteToString( ref string nodeInfo ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_currentPasses.Length ); + for( int i = 0; i < m_currentPasses.Length; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_currentPasses[ i ].Visible ); + } + } + + public void SetPassVisible( string passName, bool visible ) + { + bool refresh = false; + if( m_currentPassesDict == null ) + { + m_currentPassesDict = new Dictionary(); + refresh = true; + } + else if( m_currentPassesDict.Count != m_currentPasses.Length ) + { + refresh = true; + } + + if( refresh ) + { + for( int i = 0; i < m_currentPasses.Length; i++ ) + { + m_currentPassesDict.Add( m_currentPasses[ i ].Name, m_currentPasses[ i ] ); + } + } + + if( m_currentPassesDict.ContainsKey( passName ) ) + { + m_currentPassesDict[ passName ].Visible = visible; + } + } + + public int LastActivePass + { + get + { + if( m_currentPasses != null ) + { + for( int i = m_currentPasses.Length - 1; i > -1; i-- ) + { + if( m_currentPasses[ i ].Visible ) + return i; + } + } + m_currentPasses[ m_mainPassId ].Visible = true; + return m_mainPassId; + } + } + public bool IsVisible( int passId ) { return m_currentPasses[ passId ].Visible; } + private PassVisibleOptionsItems[] AvailablePasses { get { return m_currentPasses; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatePassSelectorHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatePassSelectorHelper.cs.meta new file mode 100644 index 0000000..2f45a9d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatePassSelectorHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1340693b71fe44846bb72eb1035f138d +timeCreated: 1542731803 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatePostProcessor.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatePostProcessor.cs new file mode 100644 index 0000000..8f6245e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatePostProcessor.cs @@ -0,0 +1,177 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEditor; +using UnityEngine; +using System.IO; +using System.Security.AccessControl; +using System.Security.Principal; +using System.Text.RegularExpressions; +using Debug = UnityEngine.Debug; + +namespace AmplifyShaderEditor +{ + public sealed class TemplatePostProcessor : AssetPostprocessor + { + public static TemplatesManager DummyManager; + public static void Destroy() + { + if( DummyManager != null ) + { + DummyManager.Destroy(); + ScriptableObject.DestroyImmediate( DummyManager ); + DummyManager = null; + } + } + + static void OnPostprocessAllAssets( string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths ) + { + bool containsShaders = false; + for( int i = 0; i < importedAssets.Length; i++ ) + { + if( importedAssets[ i ].EndsWith( ".shader" ) ) + { + containsShaders = true; + break; + } + } + + // leave early if there's no shaders among the imports + if( !containsShaders ) + return; + + TemplatesManager templatesManager; + bool firstTimeDummyFlag = false; + if( UIUtils.CurrentWindow == null ) + { + if( DummyManager == null ) + { + DummyManager = ScriptableObject.CreateInstance(); + DummyManager.hideFlags = HideFlags.HideAndDontSave; + firstTimeDummyFlag = true; + } + templatesManager = DummyManager; + } + else + { + Destroy(); + templatesManager = UIUtils.CurrentWindow.TemplatesManagerInstance; + } + + if( templatesManager == null ) + { + return; + } + + if( !templatesManager.Initialized ) + { + templatesManager.Init(); + } + + bool refreshMenuItems = false; + for( int i = 0; i < importedAssets.Length; i++ ) + { + if( TemplateHelperFunctions.CheckIfTemplate( importedAssets[ i ] ) ) + { + string guid = AssetDatabase.AssetPathToGUID( importedAssets[ i ] ); + TemplateDataParent templateData = templatesManager.GetTemplate( guid ); + if( templateData != null ) + { + refreshMenuItems = templateData.Reload() || refreshMenuItems || firstTimeDummyFlag; + int windowCount = IOUtils.AllOpenedWindows.Count; + AmplifyShaderEditorWindow currWindow = UIUtils.CurrentWindow; + for( int windowIdx = 0; windowIdx < windowCount; windowIdx++ ) + { + if( IOUtils.AllOpenedWindows[ windowIdx ].OutsideGraph.CurrentCanvasMode == NodeAvailability.TemplateShader ) + { + if( IOUtils.AllOpenedWindows[ windowIdx ].OutsideGraph.MultiPassMasterNodes.NodesList[ 0 ].CurrentTemplate == templateData ) + { + UIUtils.CurrentWindow = IOUtils.AllOpenedWindows[ windowIdx ]; + IOUtils.AllOpenedWindows[ windowIdx ].OutsideGraph.ForceMultiPassMasterNodesRefresh(); + } + } + } + UIUtils.CurrentWindow = currWindow; + } + else + { + refreshMenuItems = true; + string name = TemplatesManager.OfficialTemplates.ContainsKey( guid ) ? TemplatesManager.OfficialTemplates[ guid ] : string.Empty; + TemplateMultiPass mp = TemplateMultiPass.CreateInstance(); + mp.Init( name, guid, true ); + templatesManager.AddTemplate( mp ); + } + } + } + + if( deletedAssets.Length > 0 ) + { + if( deletedAssets[ 0 ].IndexOf( Constants.InvalidPostProcessDatapath ) < 0 ) + { + for( int i = 0; i < deletedAssets.Length; i++ ) + { + string guid = AssetDatabase.AssetPathToGUID( deletedAssets[ i ] ); + TemplateDataParent templateData = templatesManager.GetTemplate( guid ); + if( templateData != null ) + { + // Close any window using that template + int windowCount = IOUtils.AllOpenedWindows.Count; + for( int windowIdx = 0; windowIdx < windowCount; windowIdx++ ) + { + TemplateMasterNode masterNode = IOUtils.AllOpenedWindows[ windowIdx ].CurrentGraph.CurrentMasterNode as TemplateMasterNode; + if( masterNode != null && masterNode.CurrentTemplate.GUID.Equals( templateData.GUID ) ) + { + IOUtils.AllOpenedWindows[ windowIdx ].Close(); + } + } + + templatesManager.RemoveTemplate( templateData ); + refreshMenuItems = true; + } + } + } + } + + //for ( int i = 0; i < movedAssets.Length; i++ ) + //{ + // if ( TemplateHelperFunctions.CheckIfTemplate( movedAssets[ i ] ) ) + // { + // refreshMenuItems = true; + // break; + // } + //} + + //for ( int i = 0; i < movedFromAssetPaths.Length; i++ ) + //{ + // if ( TemplateHelperFunctions.CheckIfTemplate( movedFromAssetPaths[ i ] ) ) + // { + // refreshMenuItems = true; + // break; + // } + //} + + if( refreshMenuItems ) + { + //UnityEngine.Debug.Log( "Refresh Menu Items" ); + refreshMenuItems = false; + templatesManager.CreateTemplateMenuItems(); + + AmplifyShaderEditorWindow currWindow = UIUtils.CurrentWindow; + + int windowCount = IOUtils.AllOpenedWindows.Count; + for( int windowIdx = 0; windowIdx < windowCount; windowIdx++ ) + { + UIUtils.CurrentWindow = IOUtils.AllOpenedWindows[ windowIdx ]; + IOUtils.AllOpenedWindows[ windowIdx ].CurrentGraph.ForceCategoryRefresh(); + } + UIUtils.CurrentWindow = currWindow; + } + + // reimport menu items at the end of everything, hopefully preventing import loops + templatesManager.ReimportMenuItems(); + + // destroying the DummyManager, not doing so will create leaks over time + Destroy(); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatePostProcessor.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatePostProcessor.cs.meta new file mode 100644 index 0000000..3598b89 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatePostProcessor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d5f63490d6402e9488add7cbdfdd6872 +timeCreated: 1496739732 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateShaderData.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateShaderData.cs new file mode 100644 index 0000000..6f42c6f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateShaderData.cs @@ -0,0 +1,121 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class TemplatePassInfo + { + public string Modules; + public string Data; + public int GlobalStartIdx = -1; + public int LocalStartIdx = -1; + } + + [Serializable] + public class TemplateSubShaderInfo + { + public string Data; + public string Modules; + public int StartIdx = -1; + public List Passes = new List(); + public void Destroy() + { + Passes.Clear(); + Passes = null; + } + } + + [Serializable] + public class TemplateShaderInfo + { + public string Body; + public string Properties; + public int PropertyStartIdx = -1; + public List SubShaders = new List(); + public void Destroy() + { + int count = SubShaders.Count; + for( int i = 0; i < count; i++ ) + { + SubShaders[ i ].Destroy(); + } + SubShaders.Clear(); + SubShaders = null; + } + } + + public class TemplateShaderInfoUtil + { + public static TemplateShaderInfo CreateShaderData( string body ) + { + int nameBegin = body.IndexOf( TemplatesManager.TemplateShaderNameBeginTag ); + if( nameBegin < 0 ) + { + // Not a template + return null; + } + + TemplateShaderInfo shaderData = null; + //SHADER + MatchCollection shaderMatch = Regex.Matches( body, "\\bShader\\b" ); + if( shaderMatch.Count > 0 ) + { + //SUBSHADER + MatchCollection subShaderMatch = Regex.Matches( body, TemplatesManager.TemplateMPSubShaderTag ); + int subShaderAmount = subShaderMatch.Count; + if( subShaderAmount > 0 ) + { + shaderData = new TemplateShaderInfo(); + shaderData.Body = body; + int length = subShaderMatch[ 0 ].Index - shaderMatch[ 0 ].Groups[ 0 ].Index; + shaderData.Properties = body.Substring( shaderMatch[ 0 ].Index, length ); + shaderData.PropertyStartIdx = body.IndexOf( TemplatesManager.TemplatePropertyTag ); + + for( int subShaderIdx = 0; subShaderIdx < subShaderAmount; subShaderIdx++ ) + { + TemplateSubShaderInfo subShaderData = new TemplateSubShaderInfo(); + int subshaderBeginIndex = subShaderMatch[ subShaderIdx ].Index; + int subShaderEndIndex = ( subShaderIdx == ( subShaderAmount - 1 ) ) ? body.Length - 1 : subShaderMatch[ subShaderIdx + 1 ].Index; + subShaderData.Data = body.Substring( subshaderBeginIndex, subShaderEndIndex - subshaderBeginIndex ); + subShaderData.StartIdx = subshaderBeginIndex; + + //PASS + MatchCollection passMatch = Regex.Matches( subShaderData.Data, TemplatesManager.TemplatePassTagPattern ); + if( passMatch.Count == 0 ) + { + passMatch = Regex.Matches( subShaderData.Data, TemplatesManager.TemplateMPPassTag ); + } + + int passCount = passMatch.Count; + if( passCount > 0 ) + { + int lastPassIndex = subShaderData.Data.LastIndexOf( TemplatesManager.TemplatePassesEndTag ); + if( lastPassIndex < 0 ) + { + lastPassIndex = subShaderData.Data.Length - 1; + } + + subShaderData.Modules = subShaderData.Data.Substring( 0, passMatch[ 0 ].Index ); + for( int passIdx = 0; passIdx < passCount; passIdx++ ) + { + int passBeginIndex = passMatch[ passIdx ].Index; + int passEndIdx = ( passIdx == ( passCount - 1 ) ) ? lastPassIndex : passMatch[ passIdx + 1 ].Index; + TemplatePassInfo passData = new TemplatePassInfo(); + passData.Data = subShaderData.Data.Substring( passBeginIndex, passEndIdx - passBeginIndex ); + passData.GlobalStartIdx = subshaderBeginIndex + passBeginIndex; + passData.LocalStartIdx = passBeginIndex; + subShaderData.Passes.Add( passData ); + } + shaderData.SubShaders.Add( subShaderData ); + } + } + } + } + return shaderData; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateShaderData.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateShaderData.cs.meta new file mode 100644 index 0000000..8ae726e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateShaderData.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 33fdd6a5fbc437a489acf58f5d82885c +timeCreated: 1516879445 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateShaderModelModule.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateShaderModelModule.cs new file mode 100644 index 0000000..e1de14b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateShaderModelModule.cs @@ -0,0 +1,107 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + public sealed class TemplateShaderModelModule : TemplateModuleParent + { + private const string ShaderModelStr = "Shader Model"; + private const string ShaderModelFormatStr = "#pragma target "; + private const string ShaderModelEncapsulateFormatStr = "CGINCLUDE\n#pragma target {0}\nENDCG"; + + [SerializeField] + private int m_shaderModelIdx = 2; + + [SerializeField] + private bool m_encapsulateOnCGInlude = false; + + public TemplateShaderModelModule() : base("Shader Model"){ } + + public override void Draw( UndoParentNode owner, bool style = true ) + { + EditorGUI.BeginChangeCheck(); + m_shaderModelIdx = owner.EditorGUILayoutPopup( ShaderModelStr, m_shaderModelIdx, TemplateHelperFunctions.AvailableShaderModels ); + if( EditorGUI.EndChangeCheck() ) + { + m_isDirty = true; + } + } + + public void CopyFrom( TemplateShaderModelModule other , bool allData ) + { + if( allData ) + { + m_independentModule = other.IndependentModule; + m_encapsulateOnCGInlude = other.EncapsulateOnCGInlude; + } + + m_shaderModelIdx = other.CurrentShaderModelIdx; + } + + public override void ReadFromString( ref uint index, ref string[] nodeParams ) + { + bool validDataOnMeta = m_validData; + if( UIUtils.CurrentShaderVersion() > TemplatesManager.MPShaderVersion ) + { + validDataOnMeta = Convert.ToBoolean( nodeParams[ index++ ] ); + } + + if( validDataOnMeta ) + m_shaderModelIdx = Convert.ToInt32( nodeParams[ index++ ] ); + } + + public override void WriteToString( ref string nodeInfo ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_validData ); + if( m_validData ) + IOUtils.AddFieldValueToString( ref nodeInfo, m_shaderModelIdx ); + } + + public override string GenerateShaderData( bool isSubShader ) + { + if( m_encapsulateOnCGInlude ) + { + return string.Format( ShaderModelEncapsulateFormatStr, TemplateHelperFunctions.AvailableShaderModels[ m_shaderModelIdx ] ); + } + else + { + return ShaderModelFormatStr + TemplateHelperFunctions.AvailableShaderModels[ m_shaderModelIdx ]; + } + } + + public void ConfigureFromTemplateData( TemplateShaderModelData data ) + { + bool newValidData = ( data.DataCheck == TemplateDataCheck.Valid ); + + if( newValidData && m_validData != newValidData ) + { + m_independentModule = data.IndependentModule; + + if( TemplateHelperFunctions.ShaderModelToArrayIdx.ContainsKey( data.Value ) ) + { + m_shaderModelIdx = TemplateHelperFunctions.ShaderModelToArrayIdx[ data.Value ]; + } + m_encapsulateOnCGInlude = data.Encapsulate; + } + + m_validData = newValidData; + } + + public int CurrentShaderModelIdx { get { return m_shaderModelIdx; } } + public string CurrentShaderModel { get { return TemplateHelperFunctions.AvailableShaderModels[ m_shaderModelIdx ]; } } + public bool EncapsulateOnCGInlude { get { return m_encapsulateOnCGInlude; } } + public int InterpolatorAmount + { + get + { + return TemplateHelperFunctions.AvailableInterpolators[ TemplateHelperFunctions.AvailableShaderModels[ m_shaderModelIdx ] ]; + } + } + + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateShaderModelModule.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateShaderModelModule.cs.meta new file mode 100644 index 0000000..9afc9c9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateShaderModelModule.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 33c15b597b8db18499c1b4a76035a552 +timeCreated: 1519899350 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateShaderPropertyData.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateShaderPropertyData.cs new file mode 100644 index 0000000..bb38283 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateShaderPropertyData.cs @@ -0,0 +1,52 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class TemplateShaderPropertyData + { + public string PropertyInspectorName; + public string PropertyName; + public WirePortDataType PropertyDataType; + public PropertyType PropertyType; + + public int Index; + public string FullValue; + public string ReplacementValueHelper; + public string Identation; + + public bool IsMacro; + + public int SubShaderId; + public int PassId; + + public TemplateShaderPropertyData( int index, string fullValue, string identation, string propertyInspectorName, string propertyName, WirePortDataType propertyDataType, PropertyType propertyType,int subShaderId, int passId, bool isMacro = false ) + { + Index = index; + FullValue = fullValue; + Identation = identation; + PropertyInspectorName = string.IsNullOrEmpty( propertyInspectorName )?propertyName: propertyInspectorName; + PropertyName = propertyName; + PropertyDataType = propertyDataType; + PropertyType = propertyType; + int idx = FullValue.LastIndexOf( "=" ); + ReplacementValueHelper = ( idx >= 0 ) ? FullValue.Substring( 0, idx + 1 ) +" ": FullValue + " = "; + IsMacro = isMacro; + SubShaderId = subShaderId; + PassId = passId; + } + + public string CreatePropertyForValue( string value ) + { + return value.Contains( PropertyName ) ? Identation + value : ReplacementValueHelper + value; + } + + public override string ToString() + { + return string.Format( "{0}(\"{1}\", {2})", PropertyName, PropertyInspectorName,UIUtils.WirePortToCgType( PropertyDataType ) ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateShaderPropertyData.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateShaderPropertyData.cs.meta new file mode 100644 index 0000000..411f053 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateShaderPropertyData.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7d16f1d82f69ac945ac524dd877ce7fe +timeCreated: 1496341538 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateShaderPropertyNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateShaderPropertyNode.cs new file mode 100644 index 0000000..96185d4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateShaderPropertyNode.cs @@ -0,0 +1,715 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + public enum ShaderPropertyScope + { + Shader, + SubShader, + Pass + } + + [Serializable] + [NodeAttributes( "Template Parameter", "Constants And Properties", "Select and use one of the pre-existing properties given by the template" )] + public sealed class TemplateShaderPropertyNode : TemplateNodeParent + { + private const string CurrentScopeStr = "Scope"; + private const string WarningStr = "Preview doesn't work with global variables"; + private const string PropertyLabelStr = "Parameter"; + private const string TypeLabelStr = "Type: "; + private const string PropertyNameStr = "Property Name: "; + + private int IntPropertyId; + private int FloatPropertyId; + private int VectorPropertyId; + private int Sampler2DPropertyId; + private int Sampler3DPropertyId; + private int SamplerCubePropertyId; + + [SerializeField] + private int m_currentPropertyIdx = -1; + + [SerializeField] + private string m_propertyName = string.Empty; + + [SerializeField] + private int m_propertyNameId = 0; + + [SerializeField] + private string m_typeName = string.Empty; + + [SerializeField] + private string m_propertyNameLabel = string.Empty; + + private bool m_fetchPropertyId = false; + private bool m_fetchScopeFromProperty = false; + + private List m_shaderProperties = null; + private string[] m_propertyLabels = null; + + private UpperLeftWidgetHelper m_upperLeftWidgetHelper = new UpperLeftWidgetHelper(); + + //Multi-Pass only properties + [SerializeField] + private ShaderPropertyScope m_currentScope = ShaderPropertyScope.Shader; + + [SerializeField] + private bool m_advancedView = false; + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_previewShaderGUID = "4feb2016be0ece148b8bf234508f6aa4"; + m_autoWrapProperties = true; + } + + void FetchScope() + { + int shaderScopeCount = m_templateMPData.AvailableShaderProperties.Count; + for( int i = 0; i < shaderScopeCount; i++ ) + { + if( m_templateMPData.AvailableShaderProperties[ i ].PropertyName.Equals( m_propertyName ) ) + { + m_currentScope = ShaderPropertyScope.Shader; + } + } + + int subShaderScopeCount = m_templateMPData.SubShaders[ SubShaderIdx ].AvailableShaderGlobals.Count; + for( int i = 0; i < subShaderScopeCount; i++ ) + { + if( m_templateMPData.SubShaders[ SubShaderIdx ].AvailableShaderGlobals[ i ].PropertyName.Equals( m_propertyName ) ) + { + m_currentScope = ShaderPropertyScope.SubShader; + } + } + + int passScopeCount = m_templateMPData.SubShaders[ SubShaderIdx ].Passes[ PassIdx ].AvailableShaderGlobals.Count; + for( int i = 0; i < passScopeCount; i++ ) + { + if( m_templateMPData.SubShaders[ SubShaderIdx ].Passes[ PassIdx ].AvailableShaderGlobals[ i ].PropertyName.Equals( m_propertyName ) ) + { + m_currentScope = ShaderPropertyScope.Pass; + } + } + } + + void FetchShaderProperties() + { + if( m_templateMPData == null ) + m_templateMPData = ( m_containerGraph.CurrentMasterNode as TemplateMultiPassMasterNode ).CurrentTemplate; + + if( m_templateMPData != null ) + { + if( m_advancedView ) + { + switch( m_currentScope ) + { + case ShaderPropertyScope.Shader: + m_shaderProperties = m_templateMPData.AvailableShaderProperties; + break; + case ShaderPropertyScope.SubShader: + m_shaderProperties = m_templateMPData.SubShaders[ SubShaderIdx ].AvailableShaderGlobals; + break; + case ShaderPropertyScope.Pass: + m_shaderProperties = m_templateMPData.SubShaders[ SubShaderIdx ].Passes[ PassIdx ].AvailableShaderGlobals; + break; + } + } + else + { + m_shaderProperties = m_templateMPData.AllShaderProperties; + + if( m_currentPropertyIdx < 0 && m_shaderProperties.Count > 0 ) + { + m_currentPropertyIdx = 0; + } + } + } + } + + public override void OnEnable() + { + base.OnEnable(); + IntPropertyId = Shader.PropertyToID( "_IntData" ); + FloatPropertyId = Shader.PropertyToID( "_FloatData" ); + VectorPropertyId = Shader.PropertyToID( "_VectorData" ); + Sampler2DPropertyId = Shader.PropertyToID( "_Sampler2DData" ); + Sampler3DPropertyId = Shader.PropertyToID( "_Sampler3DData" ); + SamplerCubePropertyId = Shader.PropertyToID( "_SamplerCubeData" ); + } + + public override void DrawProperties() + { + base.DrawProperties(); + EditorGUI.BeginChangeCheck(); + m_advancedView = EditorGUILayoutToggle( "Advanced View", m_advancedView ); + if( EditorGUI.EndChangeCheck() ) + { + if( m_advancedView ) + { + if( m_shaderProperties[ m_currentPropertyIdx ].PassId >= 0 ) + { + m_currentScope = ShaderPropertyScope.Pass; + PassIdx = m_shaderProperties[ m_currentPropertyIdx ].PassId; + SubShaderIdx = m_shaderProperties[ m_currentPropertyIdx ].SubShaderId; + } + else if( m_shaderProperties[ m_currentPropertyIdx ].SubShaderId >= 0 ) + { + m_currentScope = ShaderPropertyScope.SubShader; + SubShaderIdx = m_shaderProperties[ m_currentPropertyIdx ].SubShaderId; + PassIdx = 0; + } + else + { + m_currentScope = ShaderPropertyScope.Shader; + SubShaderIdx = 0; + PassIdx = 0; + } + } + + FetchShaderProperties(); + FetchPropertyId(); + } + + if( m_advancedView && m_multiPassMode ) + { + DrawMultipassProperties(); + } + + if( m_currentPropertyIdx > -1 ) + { + + bool hasProperties = ( m_shaderProperties != null && m_shaderProperties.Count > 0 ); + if( hasProperties ) + { + EditorGUI.BeginChangeCheck(); + m_currentPropertyIdx = EditorGUILayoutPopup( PropertyLabelStr, m_currentPropertyIdx, m_propertyLabels ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateFromId(); + } + EditorGUILayout.LabelField( m_typeName ); + if( m_shaderProperties[ m_currentPropertyIdx ].PropertyType != PropertyType.Global ) + { + EditorGUILayout.LabelField( m_propertyNameLabel ); + } + } + } + + } + + void DrawMultipassProperties() + { + EditorGUI.BeginChangeCheck(); + m_currentScope = (ShaderPropertyScope)EditorGUILayoutEnumPopup( CurrentScopeStr, m_currentScope ); + if( EditorGUI.EndChangeCheck() ) + { + FetchShaderProperties(); + FetchPropertyId(); + } + + bool showSubShader = false; + bool showPass = false; + switch( m_currentScope ) + { + case ShaderPropertyScope.SubShader: + { + showSubShader = true; + } + break; + case ShaderPropertyScope.Pass: + { + showSubShader = true; + showPass = true; + } + break; + } + + if( showSubShader ) + { + DrawSubShaderUI(); + } + + if( showPass ) + { + DrawPassUI(); + } + } + + protected override void OnSubShaderChange() + { + FetchShaderProperties(); + FetchPropertyId(); + } + + protected override void OnPassChange() + { + FetchShaderProperties(); + FetchPropertyId(); + } + + override protected void CheckWarningState() + { + if( m_containerGraph.CurrentCanvasMode != NodeAvailability.TemplateShader ) + { + ShowTab( NodeMessageType.Error, ErrorMessageStr ); + } + else + { + if( m_shaderProperties != null && + m_shaderProperties.Count > 0 && + m_shaderProperties.Count > m_currentPropertyIdx && + m_shaderProperties[ m_currentPropertyIdx ].PropertyType == PropertyType.Global && + m_showPreview ) + { + ShowTab( NodeMessageType.Info, WarningStr ); + } + else + { + m_showErrorMessage = false; + } + } + } + + public override void SetPreviewInputs() + { + if( m_containerGraph.CurrentCanvasMode != NodeAvailability.TemplateShader ) + return; + + if( m_shaderProperties == null || m_currentPropertyIdx >= m_shaderProperties.Count || m_currentPropertyIdx < 0 ) + return; + + if( m_shaderProperties[ m_currentPropertyIdx ].PropertyType == PropertyType.Global ) + { + m_additionalContent.text = string.Empty; + PreviewMaterial.SetInt( IntPropertyId, 0 ); + return; + } + + Material currMat = m_containerGraph.CurrentMaterial; + if( currMat != null && currMat.HasProperty( m_propertyNameId ) ) + { + switch( m_shaderProperties[ m_currentPropertyIdx ].PropertyDataType ) + { + case WirePortDataType.INT: + { + int value = currMat.GetInt( m_propertyNameId ); + SetAdditonalTitleText( string.Format( Constants.SubTitleValueFormatStr, GenerateTitle( value ) ) ); + PreviewMaterial.SetInt( IntPropertyId, value ); + } + break; + case WirePortDataType.FLOAT: + { + float value = currMat.GetFloat( m_propertyNameId ); + SetAdditonalTitleText( string.Format( Constants.SubTitleValueFormatStr, GenerateTitle( value ) ) ); + PreviewMaterial.SetFloat( FloatPropertyId, value ); + } + break; + case WirePortDataType.FLOAT4: + { + Vector4 value = currMat.GetVector( m_propertyNameId ); + SetAdditonalTitleText( string.Format( Constants.SubTitleValueFormatStr, GenerateTitle( value.x, value.y, value.z, value.w ) ) ); + PreviewMaterial.SetVector( VectorPropertyId, value ); + } + break; + case WirePortDataType.COLOR: + { + Color value = currMat.GetColor( m_propertyNameId ); + SetAdditonalTitleText( string.Format( Constants.SubTitleValueFormatStr, GenerateTitle( value.r, value.g, value.b, value.a ) ) ); + PreviewMaterial.SetColor( VectorPropertyId, value ); + } + break; + case WirePortDataType.SAMPLER2D: + { + Texture value = currMat.GetTexture( m_propertyNameId ); + if( value ) + SetAdditonalTitleText( string.Format( Constants.SubTitleValueFormatStr, value.name ) ); + else + SetAdditonalTitleText( string.Empty ); + PreviewMaterial.SetTexture( Sampler2DPropertyId, value ); + } + break; + case WirePortDataType.SAMPLER3D: + { + Texture value = currMat.GetTexture( m_propertyNameId ); + if( value ) + SetAdditonalTitleText( string.Format( Constants.SubTitleValueFormatStr, value.name ) ); + else + SetAdditonalTitleText( string.Empty ); + PreviewMaterial.SetTexture( Sampler3DPropertyId, value ); + } + break; + case WirePortDataType.SAMPLERCUBE: + { + Texture value = currMat.GetTexture( m_propertyNameId ); + if( value ) + SetAdditonalTitleText( string.Format( Constants.SubTitleValueFormatStr, value.name ) ); + else + SetAdditonalTitleText( string.Empty ); + PreviewMaterial.SetTexture( SamplerCubePropertyId, value ); + } + break; + case WirePortDataType.SAMPLER2DARRAY: + { + Texture value = currMat.GetTexture( m_propertyNameId ); + if( value ) + SetAdditonalTitleText( string.Format( Constants.SubTitleValueFormatStr, value.name ) ); + else + SetAdditonalTitleText( string.Empty ); + PreviewMaterial.SetTexture( SamplerCubePropertyId, value ); + } + break; + } + } + else + { + SetAdditonalTitleText( string.Empty ); + } + } + + public override void Draw( DrawInfo drawInfo ) + { + if( m_containerGraph.CurrentCanvasMode != NodeAvailability.TemplateShader ) + { + if( !m_showErrorMessage || m_errorMessageTypeIsError == NodeMessageType.Info ) + { + ShowTab( NodeMessageType.Error, ErrorMessageStr ); + } + } + else if( m_showErrorMessage ) + { + if( m_errorMessageTypeIsError == NodeMessageType.Error ) + HideTab(); + } + + base.Draw( drawInfo ); + if( m_containerGraph.CurrentCanvasMode != NodeAvailability.TemplateShader ) + return; + + if( m_shaderProperties == null ) + { + MasterNode masterNode = m_containerGraph.CurrentMasterNode; + if( masterNode.CurrentMasterNodeCategory == AvailableShaderTypes.Template ) + { + if( SetTemplate( masterNode ) ) + { + m_fetchPropertyId = true; + } + } + } + + if( m_fetchScopeFromProperty ) + { + m_fetchScopeFromProperty = false; + FetchScope(); + FetchShaderProperties(); + } + + if( m_fetchPropertyId ) + { + m_fetchPropertyId = false; + FetchPropertyId(); + } + + if( m_currentPropertyIdx > -1 ) + { + EditorGUI.BeginChangeCheck(); + m_currentPropertyIdx = m_upperLeftWidgetHelper.DrawWidget( this, m_currentPropertyIdx, m_propertyLabels ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateFromId(); + } + } + } + + void FetchPropertyId() + { + if( m_shaderProperties != null ) + { + m_currentPropertyIdx = 0; + m_propertyLabels = new string[ m_shaderProperties.Count ]; + for( int i = 0; i < m_shaderProperties.Count; i++ ) + { + if( m_shaderProperties[ i ].PropertyName.Equals( m_propertyName ) ) + { + m_currentPropertyIdx = i; + } + m_propertyLabels[ i ] = m_shaderProperties[ i ].PropertyInspectorName; + } + UpdateFromId(); + } + else + { + m_currentPropertyIdx = -1; + } + } + + void UpdateFromId() + { + + if( m_shaderProperties != null ) + { + if( m_shaderProperties.Count == 0 ) + { + for( int i = 0; i < 4; i++ ) + m_containerGraph.DeleteConnection( false, UniqueId, i, false, true ); + + m_headerColor = UIUtils.GetColorFromCategory( "Default" ); + m_content.text = "None"; + m_additionalContent.text = string.Empty; + m_previewMaterialPassId = 1; + PreviewMaterial.SetFloat( FloatPropertyId, 0 ); + m_showPreview = false; + m_drawPreviewExpander = false; + m_outputPorts[ 0 ].ChangeProperties( "None", WirePortDataType.FLOAT, false ); + ConfigurePorts(); + return; + } + + m_drawPreviewExpander = true; + bool areCompatible = TemplateHelperFunctions.CheckIfCompatibles( m_outputPorts[ 0 ].DataType, m_shaderProperties[ m_currentPropertyIdx ].PropertyDataType ); + switch( m_shaderProperties[ m_currentPropertyIdx ].PropertyDataType ) + { + case WirePortDataType.SAMPLER1D: + case WirePortDataType.SAMPLER2D: + case WirePortDataType.SAMPLER3D: + case WirePortDataType.SAMPLERCUBE: + case WirePortDataType.SAMPLER2DARRAY: + m_outputPorts[ 0 ].ChangeProperties( "Tex", m_shaderProperties[ m_currentPropertyIdx ].PropertyDataType, false ); + m_headerColor = UIUtils.GetColorFromCategory( "Textures" ); + break; + case WirePortDataType.INT: + case WirePortDataType.FLOAT: + m_outputPorts[ 0 ].ChangeProperties( Constants.EmptyPortValue, m_shaderProperties[ m_currentPropertyIdx ].PropertyDataType, false ); + m_headerColor = UIUtils.GetColorFromCategory( "Constants And Properties" ); + break; + case WirePortDataType.FLOAT4: + m_outputPorts[ 0 ].ChangeProperties( "XYZW", m_shaderProperties[ m_currentPropertyIdx ].PropertyDataType, false ); + m_headerColor = UIUtils.GetColorFromCategory( "Constants And Properties" ); + break; + case WirePortDataType.COLOR: + m_outputPorts[ 0 ].ChangeProperties( "RGBA", m_shaderProperties[ m_currentPropertyIdx ].PropertyDataType, false ); + m_headerColor = UIUtils.GetColorFromCategory( "Constants And Properties" ); + break; + default: + case WirePortDataType.OBJECT: + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + m_outputPorts[ 0 ].ChangeProperties( "Out", m_shaderProperties[ m_currentPropertyIdx ].PropertyDataType, false ); + m_headerColor = UIUtils.GetColorFromCategory( "Constants And Properties" ); + break; + } + + if( !areCompatible ) + { + for( int i = 0; i < 4; i++ ) + m_containerGraph.DeleteConnection( false, UniqueId, i, false, true ); + } + + ConfigurePorts(); + + m_propertyName = m_shaderProperties[ m_currentPropertyIdx ].PropertyName; + m_content.text = m_shaderProperties[ m_currentPropertyIdx ].PropertyInspectorName; + m_propertyNameId = Shader.PropertyToID( m_propertyName ); + m_typeName = TypeLabelStr + m_shaderProperties[ m_currentPropertyIdx ].PropertyType.ToString(); + if( m_shaderProperties[ m_currentPropertyIdx ].PropertyType != PropertyType.Global ) + { + m_propertyNameLabel = PropertyNameStr + m_shaderProperties[ m_currentPropertyIdx ].PropertyName; + } + + m_sizeIsDirty = true; + Material currMat = m_containerGraph.CurrentMaterial; + if( currMat != null ) + { + if( m_shaderProperties[ m_currentPropertyIdx ].PropertyType == PropertyType.Global ) + { + m_previewMaterialPassId = 0; + if( !m_showErrorMessage && m_showPreview ) + { + ShowTab( NodeMessageType.Info, WarningStr ); + } + } + else + { + if( m_showErrorMessage && m_errorMessageTypeIsError != NodeMessageType.Error ) + { + HideTab(); + } + switch( m_shaderProperties[ m_currentPropertyIdx ].PropertyDataType ) + { + case WirePortDataType.INT: m_previewMaterialPassId = 0; break; + case WirePortDataType.FLOAT: m_previewMaterialPassId = 1; break; + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: m_previewMaterialPassId = 2; break; + case WirePortDataType.SAMPLER2D: m_previewMaterialPassId = 3; break; + case WirePortDataType.SAMPLER3D: m_previewMaterialPassId = 4; break; + case WirePortDataType.SAMPLERCUBE: m_previewMaterialPassId = 5; break; + default: PreviewMaterial.SetPass( 0 ); break; + } + } + } + + CheckWarningState(); + } + } + + string GenerateTitle( params float[] values ) + { + //string finalResult = "( "; + string finalResult = string.Empty; + if( values.Length == 1 ) + { + finalResult += values[ 0 ].ToString( Mathf.Abs( values[ 0 ] ) > 1000 ? Constants.PropertyBigFloatFormatLabel : Constants.PropertyFloatFormatLabel ); + } + else + { + for( int i = 0; i < values.Length; i++ ) + { + finalResult += values[ i ].ToString( Mathf.Abs( values[ i ] ) > 1000 ? Constants.PropertyBigVectorFormatLabel : Constants.PropertyVectorFormatLabel ); + if( i < ( values.Length - 1 ) ) + finalResult += ","; + } + } + //finalResult += " )"; + return finalResult; + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.MasterNodeCategory != AvailableShaderTypes.Template ) + { + UIUtils.ShowMessage( UniqueId, "Template Parameter node is only intended for templates use only" ); + return m_outputPorts[ outputId ].ErrorValue; + } + + if( m_shaderProperties == null || m_shaderProperties.Count ==0 ) + { + UIUtils.ShowMessage( UniqueId, "Attempting to fetch inexistant parameter on " + m_nodeAttribs.Name +" node"); + return m_outputPorts[ outputId ].ErrorValue; + } + + if( m_multiPassMode ) + { + switch( m_currentScope ) + { + case ShaderPropertyScope.SubShader: + { + if( dataCollector.TemplateDataCollectorInstance.MultipassSubshaderIdx != SubShaderIdx ) + { + UIUtils.ShowMessage( UniqueId, string.Format( "{0} is only intended for subshader {1}", m_propertyLabels[ m_currentPropertyIdx ], SubShaderIdx ) ); + return m_outputPorts[ outputId ].ErrorValue; + } + } + break; + case ShaderPropertyScope.Pass: + { + if( dataCollector.TemplateDataCollectorInstance.MultipassSubshaderIdx != SubShaderIdx || + dataCollector.TemplateDataCollectorInstance.MultipassPassIdx != PassIdx + ) + { + UIUtils.ShowMessage( UniqueId, string.Format( "{0} is only intended for subshader {1} and pass {2}", m_propertyLabels[ m_currentPropertyIdx ], SubShaderIdx, PassIdx ) ); + return m_outputPorts[ outputId ].ErrorValue; + } + } + break; + } + } + + return GetOutputVectorItem( 0, outputId, m_propertyName ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_propertyName = GetCurrentParam( ref nodeParams ); + m_propertyNameId = Shader.PropertyToID( m_propertyName ); + if( UIUtils.CurrentShaderVersion() > TemplatesManager.MPShaderVersion ) + { + m_currentScope = (ShaderPropertyScope)Enum.Parse( typeof( ShaderPropertyScope ), GetCurrentParam( ref nodeParams ) ); + } + else + { + m_fetchScopeFromProperty = true; + } + m_fetchPropertyId = true; + + if( UIUtils.CurrentShaderVersion() > 18502 ) + { + m_advancedView = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) ); + } + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_propertyName ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_currentScope ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_advancedView ); + + } + + public override void OnMasterNodeReplaced( MasterNode newMasterNode ) + { + base.OnMasterNodeReplaced( newMasterNode ); + if( newMasterNode.CurrentMasterNodeCategory == AvailableShaderTypes.Template ) + { + SetTemplate( newMasterNode ); + if( m_fetchScopeFromProperty ) + { + m_fetchScopeFromProperty = false; + FetchScope(); + } + FetchShaderProperties(); + FetchPropertyId(); + //m_containerGraph.DeleteConnection( false, UniqueId, 0, false, true ); + } + } + + bool SetTemplate( MasterNode newMasterNode ) + { + if( m_containerGraph.MultiPassMasterNodes.NodesList.Count > 0 ) + { + m_multiPassMode = true; + TemplateMultiPassMasterNode templateMasterNode = ( newMasterNode as TemplateMultiPassMasterNode ); + if( templateMasterNode != null ) + { + m_templateMPData = templateMasterNode.CurrentTemplate; + UpdateSubShaderAmount(); + FetchShaderProperties(); + return true; + } + } + else + { + m_multiPassMode = false; + TemplateMasterNode templateMasterNode = ( newMasterNode as TemplateMasterNode ); + if( templateMasterNode != null ) + { + m_shaderProperties = templateMasterNode.CurrentTemplate.AvailableShaderProperties; + return true; + } + } + return false; + } + + public override void RefreshExternalReferences() + { + base.RefreshExternalReferences(); + CheckWarningState(); + } + + public override void Destroy() + { + base.Destroy(); + m_propertyLabels = null; + m_shaderProperties = null; + m_upperLeftWidgetHelper = null; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateShaderPropertyNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateShaderPropertyNode.cs.meta new file mode 100644 index 0000000..825090d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateShaderPropertyNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1579d32d6529f33418f210a5bd730436 +timeCreated: 1496398185 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateSubShader.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateSubShader.cs new file mode 100644 index 0000000..523251b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateSubShader.cs @@ -0,0 +1,172 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class TemplateSubShader + { + [SerializeField] + private int m_idx = -1; + + [SerializeField] + private List m_passes = new List(); + + [SerializeField] + private TemplateModulesData m_modules; + + [SerializeField] + private string m_uniquePrefix; + + [SerializeField] + private TemplatePropertyContainer m_templateProperties = new TemplatePropertyContainer(); + + [SerializeField] + private List m_availableShaderGlobals = new List(); + + [SerializeField] + private TemplateInfoContainer m_LODContainer = new TemplateInfoContainer(); + + [SerializeField] + private int m_passAmount = 0; + + [SerializeField] + private int m_mainPass = -1; + + [SerializeField] + private bool m_foundMainPassTag = false; + + [SerializeField] + TemplateOptionsContainer m_customOptionsContainer = new TemplateOptionsContainer(); + + public TemplateSubShader(TemplateMultiPass template, int subShaderIx, TemplateIdManager idManager, string uniquePrefix, TemplateSubShaderInfo subShaderInfo, ref Dictionary duplicatesHelper ) + { + m_idx = subShaderIx; + + m_uniquePrefix = uniquePrefix; + + FetchLOD( subShaderInfo.StartIdx, subShaderInfo.Modules ); + if( m_LODContainer.Index > -1 ) + { + idManager.RegisterId( m_LODContainer.Index, uniquePrefix + "Module" + m_LODContainer.Id, m_LODContainer.Id ); + } + + m_customOptionsContainer = TemplateOptionsToolsHelper.GenerateOptionsContainer( true, subShaderInfo.Data ); + if( m_customOptionsContainer.Enabled ) + { + idManager.RegisterId( m_customOptionsContainer.Index, uniquePrefix + m_customOptionsContainer.Body, m_customOptionsContainer.Body, true ); + } + + m_modules = new TemplateModulesData( m_customOptionsContainer, idManager, m_templateProperties, uniquePrefix + "Module", subShaderInfo.StartIdx, subShaderInfo.Modules, true ); + if( m_modules.SRPType == TemplateSRPType.HD ) + { + m_modules.SRPIsPBR = subShaderInfo.Data.Contains( TemplateHelperFunctions.HDPBRTag ); + } + + Dictionary ownDuplicatesDict = new Dictionary( duplicatesHelper ); + + TemplateHelperFunctions.CreateShaderGlobalsList( subShaderInfo.Modules, ref m_availableShaderGlobals, ref ownDuplicatesDict,subShaderIx,-1 ); + if( m_modules.SRPType == TemplateSRPType.BuiltIn ) + { + TemplateHelperFunctions.CheckUnityBuiltinGlobalMacros( subShaderInfo.Modules, ref m_availableShaderGlobals, ref ownDuplicatesDict,subShaderIx,-1 ); + } + + m_passAmount = subShaderInfo.Passes.Count; + + //if( !m_modules.PassTag.IsValid ) + //{ + // m_modules.PassTag.StartIdx = subShaderData.Passes[ 0 ].GlobalStartIdx; + // m_templateProperties.AddId( subShaderData.Data, m_modules.PassTag.Id, subShaderData.Passes[ 0 ].LocalStartIdx, m_modules.PassTag.SearchIndentation ); + // m_modules.PassTag.StartIdx -= m_templateProperties.PropertyDict[ m_modules.PassTag.Id ].Indentation.Length; + // m_templateProperties.PropertyDict[ m_modules.PassTag.Id ].UseIndentationAtStart = true; + // idManager.RegisterId( m_modules.PassTag.StartIdx, m_modules.UniquePrefix + m_modules.PassTag.Id, string.Empty ); + //} + + int firstVisible = -1; + int currAddedPassIdx = 0; + for( int passIdx = 0; passIdx < m_passAmount; passIdx++ ) + { + TemplatePass newPass = new TemplatePass( template, this,subShaderIx, passIdx, idManager, uniquePrefix + "Pass" + passIdx, subShaderInfo.Passes[ passIdx ].GlobalStartIdx, subShaderInfo.Passes[ passIdx ], ref ownDuplicatesDict ); + if( newPass.AddToList ) + { + if( newPass.IsMainPass && m_mainPass < 0 ) + { + m_mainPass = currAddedPassIdx; + m_foundMainPassTag = true; + } + else if(!newPass.IsInvisible && firstVisible < 0 ) + { + firstVisible = currAddedPassIdx; + } + + m_passes.Add( newPass ); + currAddedPassIdx++; + } + else + { + newPass.Destroy(); + newPass = null; + } + + } + + if( m_mainPass < 0 ) + { + // If no main pass was set then choose the first visible one + m_mainPass = ( firstVisible < 0 ) ? 0 : firstVisible; + m_passes[ m_mainPass ].IsMainPass = true; + } + + ownDuplicatesDict.Clear(); + ownDuplicatesDict = null; + } + + public void Destroy() + { + m_LODContainer = null; + + m_customOptionsContainer = null; + + m_templateProperties.Destroy(); + m_templateProperties = null; + + m_passes.Clear(); + m_passes = null; + + m_modules.Destroy(); + m_modules = null; + + m_availableShaderGlobals.Clear(); + m_availableShaderGlobals = null; + + } + + void FetchLOD( int offsetIdx, string body ) + { + Match match = Regex.Match( body, TemplateHelperFunctions.SubShaderLODPattern ); + if( match != null && match.Groups.Count > 1 ) + { + m_LODContainer.Id = match.Groups[ 0 ].Value; + m_LODContainer.Data = match.Groups[ 1 ].Value; + m_LODContainer.Index = offsetIdx + match.Index; + } + } + + public List Passes { get { return m_passes; } } + public TemplateModulesData Modules { get { return m_modules; } } + public string UniquePrefix { get { return m_uniquePrefix; } } + public TemplatePropertyContainer TemplateProperties { get { return m_templateProperties; } } + public List AvailableShaderGlobals { get { return m_availableShaderGlobals; } } + public TemplateInfoContainer LODContainer { get { return m_LODContainer; } } + public int PassAmount { get { return m_passAmount; } } + public bool FoundMainPass { get { return m_foundMainPassTag; } } + public int MainPass { get { return m_mainPass; } } + public int Idx { get { return m_idx; } } + public TemplateOptionsContainer CustomOptionsContainer { get { return m_customOptionsContainer; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateSubShader.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateSubShader.cs.meta new file mode 100644 index 0000000..41a7886 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateSubShader.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f4ff24a5a4c92f745a159f247574c07a +timeCreated: 1517854017 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateTagsModule.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateTagsModule.cs new file mode 100644 index 0000000..4bd19c6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateTagsModule.cs @@ -0,0 +1,465 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class TemplateTagsModule : TemplateModuleParent + { + private const string CustomTagsStr = "Tags"; + private const string TagNameStr = "Name"; + private const string TagValueStr = "Value"; + private const string QueueIndexStr = "Index"; + private const string QueueLabelStr = "Queue"; + private const string RenderTypeLabelStr = "Type"; + private const string CustomRenderTypeLabelStr = "Custom"; + + private const float ShaderKeywordButtonLayoutWidth = 15; + private UndoParentNode m_currentOwner; + + private double m_tagNameCheckTimestamp = 0; + private bool m_tagNameCheckFlag = true; + private int m_tagNameCheckItemId = 0; + private const double TagNameCheckMaxInterval = 1.5; + + [SerializeField] + private bool m_foldout = false; + + [SerializeField] + private List m_availableTags = new List(); + + private Dictionary m_availableTagsDict = new Dictionary(); + + public TemplateTagsModule() : base( "Tags" ) { } + + public void CopyFrom( TemplateTagsModule other ) + { + m_availableTags.Clear(); + m_availableTagsDict.Clear(); + + int count = other.AvailableTags.Count; + for( int i = 0; i < count; i++ ) + { + CustomTagData newData = new CustomTagData( other.AvailableTags[ i ] ); + m_availableTags.Add( newData ); + m_availableTagsDict.Add( newData.TagName, newData ); + } + } + + public void ConfigureFromTemplateData( TemplateTagsModuleData tagsData ) + { + bool newValidData = tagsData.DataCheck == TemplateDataCheck.Valid; + if( newValidData && newValidData != m_validData ) + { + m_availableTags.Clear(); + m_availableTagsDict.Clear(); + int count = tagsData.Tags.Count; + for( int i = 0; i < count; i++ ) + { + CustomTagData tagData = new CustomTagData( tagsData.Tags[ i ].Name, tagsData.Tags[ i ].Value, i ); + m_availableTags.Add( tagData ); + m_availableTagsDict.Add( tagsData.Tags[ i ].Name, tagData ); + } + } + m_validData = newValidData; + } + + public override void ShowUnreadableDataMessage( ParentNode owner ) + { + //bool foldout = owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedCustomTags; + NodeUtils.DrawPropertyGroup( ref m_foldout, CustomTagsStr, base.ShowUnreadableDataMessage ); + //owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedCustomTags = foldout; + } + + public void OnLogicUpdate() + { + if( m_tagNameCheckFlag && ( EditorApplication.timeSinceStartup - m_tagNameCheckTimestamp ) > TagNameCheckMaxInterval ) + { + m_tagNameCheckFlag = false; + if( m_tagNameCheckItemId < m_availableTags.Count ) + { + if( m_availableTags[ m_tagNameCheckItemId ].TagName.Equals( Constants.RenderQueueHelperStr ) ) + { + m_availableTags[ m_tagNameCheckItemId ].SpecialTag = TemplateSpecialTags.Queue; + } + else if( m_availableTags[ m_tagNameCheckItemId ].TagName.Equals( Constants.RenderTypeHelperStr ) ) + { + m_availableTags[ m_tagNameCheckItemId ].SpecialTag = TemplateSpecialTags.RenderType; + } + else if( m_availableTags[ m_tagNameCheckItemId ].TagName.Equals( Constants.DisableBatchingHelperStr ) ) + { + m_availableTags[ m_tagNameCheckItemId ].SpecialTag = TemplateSpecialTags.DisableBatching; + } + else + { + m_availableTags[ m_tagNameCheckItemId ].SpecialTag = TemplateSpecialTags.None; + } + } + } + } + + public override void Draw( UndoParentNode owner, bool style = true ) + { + m_currentOwner = owner; + //bool foldout = owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedCustomTags; + if( style ) + { + NodeUtils.DrawPropertyGroup( ref m_foldout, CustomTagsStr, DrawMainBody, DrawButtons ); + } + else + { + NodeUtils.DrawNestedPropertyGroup( ref m_foldout, CustomTagsStr, DrawMainBody, DrawButtons ); + } + //owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedCustomTags = foldout; + } + + void DrawButtons() + { + EditorGUILayout.Separator(); + + // Add tag + if( GUILayout.Button( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + m_availableTags.Add( new CustomTagData() ); + EditorGUI.FocusTextInControl( null ); + } + + //Remove tag + if( GUILayout.Button( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + if( m_availableTags.Count > 0 ) + { + m_availableTags.RemoveAt( m_availableTags.Count - 1 ); + EditorGUI.FocusTextInControl( null ); + } + } + } + + void DrawMainBody() + { + EditorGUI.BeginChangeCheck(); + { + EditorGUILayout.Separator(); + int itemCount = m_availableTags.Count; + + if( itemCount == 0 ) + { + EditorGUILayout.HelpBox( "Your list is Empty!\nUse the plus button to add one.", MessageType.Info ); + } + + int markedToDelete = -1; + float originalLabelWidth = EditorGUIUtility.labelWidth; + for( int i = 0; i < itemCount; i++ ) + { + m_availableTags[ i ].TagFoldout = m_currentOwner.EditorGUILayoutFoldout( m_availableTags[ i ].TagFoldout, string.Format( "[{0}] - {1}", i, m_availableTags[ i ].TagName ) ); + if( m_availableTags[ i ].TagFoldout ) + { + EditorGUI.indentLevel += 1; + EditorGUIUtility.labelWidth = 70; + //Tag Name + EditorGUI.BeginChangeCheck(); + m_availableTags[ i ].TagName = m_currentOwner.EditorGUILayoutTextField( TagNameStr, m_availableTags[ i ].TagName ); + if( EditorGUI.EndChangeCheck() ) + { + m_availableTags[ i ].TagName = UIUtils.RemoveShaderInvalidCharacters( m_availableTags[ i ].TagName ); + m_tagNameCheckFlag = true; + m_tagNameCheckItemId = i; + m_tagNameCheckTimestamp = EditorApplication.timeSinceStartup; + } + + //Tag Value + switch( m_availableTags[ i ].SpecialTag ) + { + case TemplateSpecialTags.DisableBatching: + { + m_availableTags[ i ].Batching = (DisableBatching)m_currentOwner.EditorGUILayoutEnumPopup( RenderTypeLabelStr, m_availableTags[ i ].Batching ); + m_availableTags[ i ].TagValue = m_availableTags[ i ].Batching.ToString(); + } + break; + case TemplateSpecialTags.RenderType: + { + m_availableTags[ i ].RenderType = (RenderType)m_currentOwner.EditorGUILayoutEnumPopup( RenderTypeLabelStr, m_availableTags[ i ].RenderType ); + if( m_availableTags[ i ].RenderType == RenderType.Custom ) + { + m_availableTags[ i ].TagValue = m_currentOwner.EditorGUILayoutTextField( CustomRenderTypeLabelStr, m_availableTags[ i ].TagValue ); + } + } + break; + case TemplateSpecialTags.Queue: + { + + EditorGUI.BeginChangeCheck(); + m_availableTags[ i ].RenderQueue = (RenderQueue)m_currentOwner.EditorGUILayoutEnumPopup( QueueLabelStr, m_availableTags[ i ].RenderQueue, GUILayout.MinWidth( 150 ) ); + m_availableTags[ i ].RenderQueueOffset = m_currentOwner.EditorGUILayoutIntField( QueueIndexStr, m_availableTags[ i ].RenderQueueOffset ); + if( EditorGUI.EndChangeCheck() ) + { + m_availableTags[ i ].BuildQueueTagValue(); + } + + } + break; + case TemplateSpecialTags.None: + { + EditorGUI.BeginChangeCheck(); + m_availableTags[ i ].TagValue = m_currentOwner.EditorGUILayoutTextField( TagValueStr, m_availableTags[ i ].TagValue ); + if( EditorGUI.EndChangeCheck() ) + { + m_availableTags[ i ].TagValue = UIUtils.RemoveShaderInvalidCharacters( m_availableTags[ i ].TagValue ); + } + } + break; + + } + + EditorGUIUtility.labelWidth = originalLabelWidth; + + EditorGUILayout.BeginHorizontal(); + { + GUILayout.Label( " " ); + // Add new port + if( m_currentOwner.GUILayoutButton( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + m_availableTags.Insert( i + 1, new CustomTagData() ); + EditorGUI.FocusTextInControl( null ); + } + + //Remove port + if( m_currentOwner.GUILayoutButton( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ShaderKeywordButtonLayoutWidth ) ) ) + { + markedToDelete = i; + } + } + EditorGUILayout.EndHorizontal(); + + EditorGUI.indentLevel -= 1; + } + + } + if( markedToDelete > -1 ) + { + if( m_availableTags.Count > markedToDelete ) + { + m_availableTags.RemoveAt( markedToDelete ); + EditorGUI.FocusTextInControl( null ); + } + } + EditorGUILayout.Separator(); + } + if( EditorGUI.EndChangeCheck() ) + { + m_isDirty = true; + } + } + + //Method used by template options + // As such. Render Queue will have value and offset separated by , + public void AddSpecialTag( TemplateSpecialTags tag, TemplateActionItem item ) + { + if( tag == TemplateSpecialTags.None ) + return; + + int count = m_availableTags.Count; + for( int i = 0; i < count; i++ ) + { + if( m_availableTags[ i ].SpecialTag == tag ) + { + switch( tag ) + { + case TemplateSpecialTags.DisableBatching: + { + m_availableTags[ i ].Batching = TemplateHelperFunctions.StringToDisableBatching[ item.ActionData ]; + return; + } + case TemplateSpecialTags.RenderType: + { + m_availableTags[ i ].RenderType = TemplateHelperFunctions.StringToRenderType[ item.ActionData ]; + return; + } + case TemplateSpecialTags.Queue: + { + + m_availableTags[ i ].RenderQueue = TemplateHelperFunctions.StringToRenderQueue[ item.ActionData ]; + m_availableTags[ i ].RenderQueueOffset = item.ActionDataIdx; + m_availableTags[ i ].BuildQueueTagValue(); + return; + } + } + } + } + + CustomTagData data = new CustomTagData(); + switch( tag ) + { + case TemplateSpecialTags.DisableBatching: + { + data.SpecialTag = TemplateSpecialTags.DisableBatching; + data.TagName = "DisableBatching"; + data.Batching = TemplateHelperFunctions.StringToDisableBatching[ item.ActionData ]; + } + break; + case TemplateSpecialTags.RenderType: + { + data.SpecialTag = TemplateSpecialTags.RenderType; + data.TagName = "RenderType"; + data.RenderType = TemplateHelperFunctions.StringToRenderType[ item.ActionData ]; + } + break; + case TemplateSpecialTags.Queue: + { + data.SpecialTag = TemplateSpecialTags.Queue; + data.TagName = "Queue"; + data.RenderQueue = TemplateHelperFunctions.StringToRenderQueue[ item.ActionData ]; + data.RenderQueueOffset = item.ActionDataIdx; + data.BuildQueueTagValue(); + } + break; + } + m_availableTags.Add( data ); + } + + void AddTagFromRead( string data ) + { + string[] arr = data.Split( IOUtils.VALUE_SEPARATOR ); + if( arr.Length > 1 ) + { + string name = arr[ 0 ]; + string value = arr[ 1 ]; + + if( !m_availableTagsDict.ContainsKey( name ) ) + { + CustomTagData tagData = new CustomTagData( data, m_availableTags.Count - 1 ); + m_availableTags.Add( tagData ); + m_availableTagsDict.Add( name, tagData ); + } + else + { + if( m_availableTagsDict[ name ].TagId > -1 && + m_availableTagsDict[ name ].TagId < m_availableTags.Count ) + { + if( arr.Length == 4 ) + { + m_availableTags[ m_availableTagsDict[ name ].TagId ].SetTagValue( value, arr[ 3 ] ); + } + else + { + m_availableTags[ m_availableTagsDict[ name ].TagId ].SetTagValue( value ); + } + + } + else + { + int count = m_availableTags.Count; + for( int i = 0; i < count; i++ ) + { + if( m_availableTags[ i ].TagName.Equals( name ) ) + { + m_availableTags[ i ].SetTagValue( value ); + } + } + } + } + } + } + + public override void ReadFromString( ref uint index, ref string[] nodeParams ) + { + bool validDataOnMeta = m_validData; + if( UIUtils.CurrentShaderVersion() > TemplatesManager.MPShaderVersion ) + { + validDataOnMeta = Convert.ToBoolean( nodeParams[ index++ ] ); + } + + if( validDataOnMeta ) + { + int count = Convert.ToInt32( nodeParams[ index++ ] ); + for( int i = 0; i < count; i++ ) + { + AddTagFromRead( nodeParams[ index++ ] ); + } + } + } + + public override void WriteToString( ref string nodeInfo ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_validData ); + if( m_validData ) + { + int tagsCount = m_availableTags.Count; + IOUtils.AddFieldValueToString( ref nodeInfo, tagsCount ); + for( int i = 0; i < tagsCount; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_availableTags[ i ].ToString() ); + } + } + } + + public string GenerateTags() + { + int tagsCount = m_availableTags.Count; + if( tagsCount == 0 ) + return string.Empty; + + string result = "Tags { "; + + for( int i = 0; i < tagsCount; i++ ) + { + if( m_availableTags[ i ].IsValid ) + { + result += m_availableTags[ i ].GenerateTag(); + if( i < tagsCount - 1 ) + { + result += " "; + } + } + } + + result += " }"; + + return result; + } + + public override void Destroy() + { + m_availableTags.Clear(); + m_availableTags = null; + m_currentOwner = null; + m_availableTagsDict.Clear(); + m_availableTagsDict = null; + } + + public List AvailableTags { get { return m_availableTags; } } + + public bool HasRenderInfo( ref RenderType renderType, ref RenderQueue renderQueue ) + { + if( !m_validData ) + return false; + + bool foundRenderType = false; + bool foundRenderQueue = false; + int count = m_availableTags.Count; + for( int i = 0; i < count; i++ ) + { + if( m_availableTags[ i ].TagName.Equals( Constants.RenderTypeHelperStr ) ) + { + if( TemplateHelperFunctions.StringToRenderType.ContainsKey( m_availableTags[ i ].TagValue ) ) + { + renderType = TemplateHelperFunctions.StringToRenderType[ m_availableTags[ i ].TagValue ]; + foundRenderType = true; + } + } + else if( m_availableTags[ i ].TagName.Equals( Constants.RenderQueueHelperStr ) ) + { + string value = m_availableTags[ i ].TagValue.Split( '+' )[ 0 ].Split( '-' )[ 0 ]; + if( TemplateHelperFunctions.StringToRenderQueue.ContainsKey( value ) ) + { + renderQueue = TemplateHelperFunctions.StringToRenderQueue[ value ]; + foundRenderQueue = true; + } + } + } + return foundRenderType && foundRenderQueue; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateTagsModule.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateTagsModule.cs.meta new file mode 100644 index 0000000..b5888f7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateTagsModule.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 905b4a4de4a974a489d7a8aac14e4fcb +timeCreated: 1516719540 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateVertexData.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateVertexData.cs new file mode 100644 index 0000000..3b82e04 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateVertexData.cs @@ -0,0 +1,190 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class TemplateVertexData + { + [SerializeField] + private TemplateSemantics m_semantics = TemplateSemantics.NONE; + [SerializeField] + private WirePortDataType m_dataType = WirePortDataType.OBJECT; + [SerializeField] + private string m_varName = string.Empty; + [SerializeField] + private TemplateInfoOnSematics m_dataInfo = TemplateInfoOnSematics.NONE; + [SerializeField] + private string m_dataSwizzle = string.Empty; + [SerializeField] + private bool m_available = false; + [SerializeField] + private string m_varNameWithSwizzle = string.Empty; + [SerializeField] + private bool m_isSingleComponent = true; + [SerializeField] + private bool m_excludeStructPrefix = false; + [SerializeField] + private string[] m_components = { "0", "0", "0", "0" }; + [SerializeField] + private bool[] m_componentUsage = { false, false,false,false }; + + public TemplateVertexData( TemplateSemantics semantics, WirePortDataType dataType, string varName ) + { + m_semantics = semantics; + m_dataType = dataType; + m_varName = varName; + m_varNameWithSwizzle = varName; + } + + public TemplateVertexData( TemplateSemantics semantics, WirePortDataType dataType, string varName, string dataSwizzle ) + { + m_semantics = semantics; + m_dataType = dataType; + m_varName = varName; + m_dataSwizzle = dataSwizzle; + m_varNameWithSwizzle = varName + dataSwizzle; + } + + public TemplateVertexData( TemplateVertexData other ) + { + m_semantics = other.m_semantics; + m_dataType = other.m_dataType; + m_varName = other.m_varName; + m_dataInfo = other.m_dataInfo; + m_dataSwizzle = other.m_dataSwizzle; + m_available = other.m_available; + m_varNameWithSwizzle = other.m_varNameWithSwizzle; + m_isSingleComponent = other.IsSingleComponent; + m_excludeStructPrefix = other.ExcludeStructPrefix; + for( int i = 0; i < 4; i++ ) + { + m_components[ i ] = other.Components[ i ]; + } + } + + public void RegisterComponent( char channelId, string value ) + { + int channelIdInt = -1; + switch( channelId ) + { + case 'r': + case 'x': channelIdInt = 0; break; + case 'g': + case 'y': channelIdInt = 1; break; + case 'b': + case 'z': channelIdInt = 2; break; + case 'a': + case 'w': channelIdInt = 3; break; + } + + if( channelId < 0 ) + { + Debug.LogWarning( "Attempting to create interpolated data from invalid channel " + channelId ); + return; + } + + RegisterComponent( channelIdInt, value ); + } + + public void RegisterComponent( int channelId, string value ) + { + channelId = Mathf.Clamp( channelId, 0, 3 ); + m_components[ channelId ] = value; + m_componentUsage[ channelId ] = true; + m_isSingleComponent = false; + } + + public void BuildVar( PrecisionType precisionType = PrecisionType.Float ) + { + if( m_isSingleComponent ) + return; + WirePortDataType dataType = WirePortDataType.FLOAT; + if( m_componentUsage[ 3 ] ) + { + dataType = WirePortDataType.FLOAT4; + } + else if( m_componentUsage[ 2 ] ) + { + dataType = WirePortDataType.FLOAT3; + } + else if( m_componentUsage[ 1 ] ) + { + dataType = WirePortDataType.FLOAT2; + } + + string newVar = UIUtils.PrecisionWirePortToCgType( precisionType, dataType ); + newVar += "( "; + switch( dataType ) + { + default: newVar += "0"; break; + case WirePortDataType.INT: + case WirePortDataType.FLOAT: + { + newVar += "{0}."+Components[ 0 ]; + } + break; + case WirePortDataType.FLOAT2: + { + newVar += "{0}." + Components[ 0 ] + ", " + + "{0}." + Components[ 1 ]; + } + break; + case WirePortDataType.FLOAT3: + { + newVar += "{0}." + Components[ 0 ] + ", " + + "{0}." + Components[ 1 ] + ", " + + "{0}." + Components[ 2 ]; + } + break; + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: + { + newVar += "{0}." + Components[ 0 ] + ", " + + "{0}." + Components[ 1 ] + ", " + + "{0}." + Components[ 2 ] + ", " + + "{0}." + Components[ 3 ]; + } + break; + + } + newVar += " )"; + m_varName = newVar; + m_varNameWithSwizzle = newVar; + } + + public bool ExcludeStructPrefix { get { return m_excludeStructPrefix; } set { m_excludeStructPrefix = value; } } + public bool IsSingleComponent { get { return m_isSingleComponent; } } + public string[] Components { get { return m_components; } } + public TemplateSemantics Semantics { get { return m_semantics; } } + public WirePortDataType DataType { get { return m_dataType; } } + public string VarName { get { return m_varName; } set { m_varName = value; m_varNameWithSwizzle = value + m_dataSwizzle; } } + public string DataSwizzle { get { return m_dataSwizzle; } set { m_dataSwizzle = value; m_varNameWithSwizzle = m_varName + value; } } + public TemplateInfoOnSematics DataInfo { get { return m_dataInfo; } set { m_dataInfo = value; } } + public bool Available { get { return m_available; } set { m_available = value; } } + public string VarNameWithSwizzle { get { return m_varNameWithSwizzle; } } + public WirePortDataType SwizzleType + { + get + { + if ( string.IsNullOrEmpty( m_dataSwizzle ) ) + return m_dataType; + + WirePortDataType newType = m_dataType; + switch ( m_dataSwizzle.Length ) + { + case 2: newType = WirePortDataType.FLOAT;break; + case 3: newType = WirePortDataType.FLOAT2; break; + case 4: newType = WirePortDataType.FLOAT3; break; + case 5: newType = WirePortDataType.FLOAT4; break; + } + + return newType; + } + } + + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateVertexData.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateVertexData.cs.meta new file mode 100644 index 0000000..d457534 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateVertexData.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d11e7a9026804bd46962c527fe30d933 +timeCreated: 1496053368 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateVertexDataNode.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateVertexDataNode.cs new file mode 100644 index 0000000..187c32f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateVertexDataNode.cs @@ -0,0 +1,278 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + [Serializable] + [NodeAttributes( "Template Vertex Data", "Vertex Data", "Select and use available vertex data from the template" )] + public class TemplateVertexDataNode : TemplateNodeParent + { + private List m_interpolatorData = null; + + [SerializeField] + private int m_currentDataIdx = -1; + + [SerializeField] + private string m_dataName = string.Empty; + [SerializeField] + private string m_inVarName = string.Empty; + + private string[] m_dataLabels = null; + + private bool m_fetchDataId = false; + private UpperLeftWidgetHelper m_upperLeftWidgetHelper = new UpperLeftWidgetHelper(); + + protected override void CommonInit( int uniqueId ) + { + base.CommonInit( uniqueId ); + m_autoWrapProperties = true; + } + + void FetchDataId() + { + if( m_interpolatorData != null ) + { + m_currentDataIdx = 0; + int count = m_interpolatorData.Count; + m_dataLabels = new string[ count ]; + for( int i = 0; i < count; i++ ) + { + m_dataLabels[ i ] = m_interpolatorData[ i ].VarName; + if( m_interpolatorData[ i ].VarName.Equals( m_dataName ) ) + { + m_currentDataIdx = i; + } + } + UpdateFromId(); + } + else + { + m_currentDataIdx = -1; + } + } + + void UpdateFromId() + { + if( m_interpolatorData != null ) + { + if( m_interpolatorData.Count == 0 ) + { + for( int i = 0; i < 4; i++ ) + m_containerGraph.DeleteConnection( false, UniqueId, i, false, true ); + + m_headerColor = UIUtils.GetColorFromCategory( "Default" ); + m_content.text = "None"; + m_additionalContent.text = string.Empty; + m_outputPorts[ 0 ].ChangeProperties( "None", WirePortDataType.OBJECT, false ); + ConfigurePorts(); + return; + } + + bool areCompatible = TemplateHelperFunctions.CheckIfCompatibles( m_outputPorts[ 0 ].DataType, m_interpolatorData[ m_currentDataIdx ].DataType ); + switch( m_interpolatorData[ m_currentDataIdx ].DataType ) + { + default: + case WirePortDataType.INT: + case WirePortDataType.FLOAT: + m_outputPorts[ 0 ].ChangeProperties( Constants.EmptyPortValue, m_interpolatorData[ m_currentDataIdx ].DataType, false ); + break; + case WirePortDataType.FLOAT2: + m_outputPorts[ 0 ].ChangeProperties( "XY", m_interpolatorData[ m_currentDataIdx ].DataType, false ); + break; + case WirePortDataType.FLOAT3: + m_outputPorts[ 0 ].ChangeProperties( "XYZ", m_interpolatorData[ m_currentDataIdx ].DataType, false ); + break; + case WirePortDataType.FLOAT4: + m_outputPorts[ 0 ].ChangeProperties( "XYZW", m_interpolatorData[ m_currentDataIdx ].DataType, false ); + break; + case WirePortDataType.COLOR: + m_outputPorts[ 0 ].ChangeProperties( "RGBA", m_interpolatorData[ m_currentDataIdx ].DataType, false ); + break; + } + + ConfigurePorts(); + + if( !areCompatible ) + { + m_containerGraph.DeleteConnection( false, UniqueId, 0, false, true ); + } + + m_dataName = m_interpolatorData[ m_currentDataIdx ].VarName; + m_content.text = m_dataName; + m_sizeIsDirty = true; + CheckWarningState(); + } + } + + public override void DrawProperties() + { + base.DrawProperties(); + if( m_multiPassMode ) + { + DrawMultipassProperties(); + } + + if( m_currentDataIdx > -1 ) + { + EditorGUI.BeginChangeCheck(); + m_currentDataIdx = EditorGUILayoutPopup( DataLabelStr, m_currentDataIdx, m_dataLabels ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateFromId(); + } + } + } + protected override void OnSubShaderChange() + { + FetchInterpolator(); + FetchDataId(); + } + + protected override void OnPassChange() + { + FetchInterpolator(); + FetchDataId(); + } + + void DrawMultipassProperties() + { + DrawSubShaderUI(); + DrawPassUI(); + } + + public override void Draw( DrawInfo drawInfo ) + { + base.Draw( drawInfo ); + if( m_containerGraph.CurrentCanvasMode != NodeAvailability.TemplateShader ) + return; + + if( m_interpolatorData == null || m_interpolatorData.Count == 0 ) + { + MasterNode masterNode = m_containerGraph.CurrentMasterNode; + FetchInterpolator( masterNode ); + } + + if( m_fetchDataId ) + { + m_fetchDataId = false; + FetchDataId(); + } + + if( m_currentDataIdx > -1 ) + { + EditorGUI.BeginChangeCheck(); + m_currentDataIdx = m_upperLeftWidgetHelper.DrawWidget( this, m_currentDataIdx, m_dataLabels ); + if( EditorGUI.EndChangeCheck() ) + { + UpdateFromId(); + } + } + } + + public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar ) + { + if( dataCollector.MasterNodeCategory != AvailableShaderTypes.Template ) + { + UIUtils.ShowMessage( UniqueId, "Template Vertex Data node is only intended for templates use only" ); + return m_outputPorts[ 0 ].ErrorValue; + } + + if( dataCollector.IsFragmentCategory ) + { + UIUtils.ShowMessage( UniqueId, "Template Vertex Data node node is only intended for vertex use use only" ); + return m_outputPorts[ 0 ].ErrorValue; + } + + if( m_multiPassMode ) + { + if( dataCollector.TemplateDataCollectorInstance.MultipassSubshaderIdx != SubShaderIdx || + dataCollector.TemplateDataCollectorInstance.MultipassPassIdx != PassIdx + ) + { + UIUtils.ShowMessage( UniqueId, string.Format( "{0} is only intended for subshader {1} and pass {2}", m_dataLabels[ m_currentDataIdx ], SubShaderIdx, PassIdx ) ); + return m_outputPorts[ outputId ].ErrorValue; + } + } + + return GetOutputVectorItem( 0, outputId, m_inVarName + m_dataName ); + } + + public override void ReadFromString( ref string[] nodeParams ) + { + base.ReadFromString( ref nodeParams ); + m_dataName = GetCurrentParam( ref nodeParams ); + m_fetchDataId = true; + } + + public override void WriteToString( ref string nodeInfo, ref string connectionsInfo ) + { + base.WriteToString( ref nodeInfo, ref connectionsInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_dataName ); + } + + protected override bool ValidatePass( int passIdx ) + { + return ( m_templateMPData.SubShaders[ SubShaderIdx ].Passes[ passIdx ].VertexFunctionData != null && + m_templateMPData.SubShaders[ SubShaderIdx ].Passes[ passIdx ].VertexDataContainer != null ); + } + + void FetchInterpolator( MasterNode masterNode = null ) + { + FetchMultiPassTemplate( masterNode ); + if( m_multiPassMode ) + { + if( m_templateMPData != null ) + { + m_inVarName = m_templateMPData.SubShaders[ SubShaderIdx ].Passes[ PassIdx ].VertexFunctionData.InVarName + "."; + m_interpolatorData = m_templateMPData.SubShaders[ SubShaderIdx ].Passes[ PassIdx ].VertexDataContainer.VertexData; + m_fetchDataId = true; + } + } + else + { + if( masterNode == null ) + masterNode = m_containerGraph.CurrentMasterNode; + + TemplateData currentTemplate = ( masterNode as TemplateMasterNode ).CurrentTemplate; + if( currentTemplate != null ) + { + m_inVarName = currentTemplate.VertexFunctionData.InVarName + "."; + m_interpolatorData = currentTemplate.VertexDataList; + m_fetchDataId = true; + } + else + { + m_interpolatorData = null; + m_currentDataIdx = -1; + } + } + } + + public override void OnMasterNodeReplaced( MasterNode newMasterNode ) + { + base.OnMasterNodeReplaced( newMasterNode ); + if( newMasterNode.CurrentMasterNodeCategory == AvailableShaderTypes.Template ) + { + FetchInterpolator( newMasterNode ); + } + else + { + m_interpolatorData = null; + m_currentDataIdx = -1; + } + } + + public override void Destroy() + { + base.Destroy(); + m_dataLabels = null; + m_interpolatorData = null; + m_upperLeftWidgetHelper = null; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateVertexDataNode.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateVertexDataNode.cs.meta new file mode 100644 index 0000000..e697d68 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplateVertexDataNode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5eb32f2452052fb43b6b93c9baa8f02f +timeCreated: 1506610215 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatesBlendModule.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatesBlendModule.cs new file mode 100644 index 0000000..fa435aa --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatesBlendModule.cs @@ -0,0 +1,756 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + [Serializable] + public sealed class TemplatesBlendModule : TemplateModuleParent + { + private const string AlphaToMaskStr = "Alpha To Coverage"; + private const string BlendModeStr = " Blend Mode"; + + private const string BlendModesRGBStr = "Blend RGB"; + private const string BlendModesAlphaStr = "Blend Alpha"; + + private const string BlendOpsRGBStr = "Blend Op RGB"; + private const string BlendOpsAlphaStr = "Blend Op Alpha"; + + private const string SourceFactorStr = "Src"; + private const string DstFactorStr = "Dst"; + + private const string AlphaToMaskFormat = "AlphaToMask {0}"; + private const string BlendFactorOff = "Blend Off"; + private const string SingleBlendFactorStr = "Blend{0} {1} {2}"; + private const string SeparateBlendFactorStr = "Blend{0} {1} {2}, {3} {4}"; + + private const string SingleBlendOpStr = "BlendOp{0} {1}"; + private const string SeparateBlendOpStr = "BlendOp{0} {1}, {2}"; + private const string BlendOpOffStr = "BlendOp Off"; + + + private string[] m_commonBlendTypesArr; + private List m_commonBlendTypes = new List + { + new CommonBlendTypes("", AvailableBlendFactor.Zero, AvailableBlendFactor.Zero ), + new CommonBlendTypes("Custom", AvailableBlendFactor.Zero, AvailableBlendFactor.Zero ) , + new CommonBlendTypes("Alpha Blend", AvailableBlendFactor.SrcAlpha, AvailableBlendFactor.OneMinusSrcAlpha ) , + new CommonBlendTypes("Premultiplied", AvailableBlendFactor.One, AvailableBlendFactor.OneMinusSrcAlpha ), + new CommonBlendTypes("Additive", AvailableBlendFactor.One, AvailableBlendFactor.One ), + new CommonBlendTypes("Soft Additive", AvailableBlendFactor.OneMinusDstColor, AvailableBlendFactor.One ), + new CommonBlendTypes("Multiplicative", AvailableBlendFactor.DstColor, AvailableBlendFactor.Zero ), + new CommonBlendTypes("2x Multiplicative", AvailableBlendFactor.DstColor, AvailableBlendFactor.SrcColor ), + new CommonBlendTypes("Particle Additive", AvailableBlendFactor.SrcAlpha, AvailableBlendFactor.One ) + }; + + [SerializeField] + private string m_target = string.Empty; + + [SerializeField] + private bool m_validBlendMode = false; + + [SerializeField] + private bool m_validBlendOp = false; + + [SerializeField] + private bool m_blendModeEnabled = false; + + // Blend Factor + // RGB + [SerializeField] + private int m_currentRGBIndex = 0; + + [SerializeField] + private AvailableBlendFactor m_sourceFactorRGB = AvailableBlendFactor.Zero; + [SerializeField] + private InlineProperty m_sourceFactorRGBInline = new InlineProperty(); + + [SerializeField] + private AvailableBlendFactor m_destFactorRGB = AvailableBlendFactor.Zero; + [SerializeField] + private InlineProperty m_destFactorRGBInline = new InlineProperty(); + + //Alpha + [SerializeField] + private int m_currentAlphaIndex = 0; + + [SerializeField] + private AvailableBlendFactor m_sourceFactorAlpha = AvailableBlendFactor.Zero; + [SerializeField] + private InlineProperty m_sourceFactorAlphaInline = new InlineProperty(); + + [SerializeField] + private AvailableBlendFactor m_destFactorAlpha = AvailableBlendFactor.Zero; + [SerializeField] + private InlineProperty m_destFactorAlphaInline = new InlineProperty(); + + //Blend Ops + [SerializeField] + private bool m_blendOpEnabled = false; + + [SerializeField] + private AvailableBlendOps m_blendOpRGB = AvailableBlendOps.OFF; + + [SerializeField] + private InlineProperty m_blendOpRGBInline = new InlineProperty(); + + [SerializeField] + private AvailableBlendOps m_blendOpAlpha = AvailableBlendOps.OFF; + + [SerializeField] + private InlineProperty m_blendOpAlphaInline = new InlineProperty(); + + public TemplatesBlendModule() : base( "Blend Mode and Ops" ) + { + m_commonBlendTypesArr = new string[ m_commonBlendTypes.Count ]; + for( int i = 0; i < m_commonBlendTypesArr.Length; i++ ) + { + m_commonBlendTypesArr[ i ] = m_commonBlendTypes[ i ].Name; + } + } + + public void CopyFrom( TemplatesBlendModule other, bool allData ) + { + if( allData ) + { + m_independentModule = other.IndependentModule; + m_validBlendMode = other.ValidBlendMode; + m_target = other.Target; + m_validBlendOp = other.ValidBlendOp; + } + m_blendModeEnabled = other.BlendModeEnabled; + m_currentRGBIndex = other.CurrentRGBIndex; + m_sourceFactorRGB = other.SourceFactorRGB; + m_destFactorRGB = other.DestFactorRGB; + m_currentAlphaIndex = other.CurrentAlphaIndex; + m_sourceFactorAlpha = other.SourceFactorAlpha; + m_destFactorAlpha = other.DestFactorAlpha; + m_blendOpEnabled = other.BlendOpEnabled; + m_blendOpRGB = other.BlendOpRGB; + m_blendOpAlpha = other.BlendOpAlpha; + m_sourceFactorRGBInline = other.SourceFactorRGBInline; + m_destFactorRGBInline = other.DestFactorRGBInline; + m_sourceFactorAlphaInline = other.SourceFactorAlphaInline; + m_destFactorAlphaInline = other.DestFactorAlphaInline; + m_blendOpRGBInline = other.BlendOpRGBInline; + m_blendOpAlphaInline = other.BlendOpAlphaInline; + } + + public void ConfigureFromTemplateData( TemplateBlendData blendData ) + { + if( blendData.ValidBlendMode ) + { + if( m_validBlendMode != blendData.ValidBlendMode ) + { + m_blendModeEnabled = true; + m_independentModule = blendData.IndependentModule; + if( string.IsNullOrEmpty( blendData.SourceFactorRGBInline ) ) + { + m_sourceFactorRGB = blendData.SourceFactorRGB; + m_sourceFactorRGBInline.ResetProperty(); + } + else + { + m_sourceFactorRGBInline.SetInlineByName( blendData.SourceFactorRGBInline ); + } + + if( string.IsNullOrEmpty( blendData.DestFactorRGBInline ) ) + { + m_destFactorRGB = blendData.DestFactorRGB; + m_destFactorRGBInline.ResetProperty(); + } + else + { + m_destFactorRGBInline.SetInlineByName( blendData.DestFactorRGBInline ); + } + + if( string.IsNullOrEmpty( blendData.SourceFactorAlphaInline ) ) + { + m_sourceFactorAlpha = blendData.SourceFactorAlpha; + m_sourceFactorAlphaInline.ResetProperty(); + } + else + { + m_sourceFactorAlphaInline.SetInlineByName( blendData.SourceFactorAlphaInline ); + } + if( string.IsNullOrEmpty( blendData.DestFactorAlphaInline ) ) + { + m_destFactorAlpha = blendData.DestFactorAlpha; + m_destFactorAlphaInline.ResetProperty(); + } + else + { + m_destFactorAlphaInline.SetInlineByName( blendData.DestFactorAlphaInline ); + } + + if( blendData.SeparateBlendFactors ) + { + if( blendData.BlendModeOff ) + { + m_currentRGBIndex = 0; + } + else + { + CheckRGBIndex(); + } + CheckAlphaIndex(); + } + else + { + if( blendData.BlendModeOff ) + { + m_currentRGBIndex = 0; + } + else + { + CheckRGBIndex(); + } + m_currentAlphaIndex = 0; + } + } + } + else + { + m_blendModeEnabled = false; + } + + if( blendData.ValidBlendOp ) + { + if( m_validBlendOp != blendData.ValidBlendOp ) + { + m_blendOpEnabled = true; + if( string.IsNullOrEmpty( blendData.BlendOpRGBInline ) ) + { + m_blendOpRGB = blendData.BlendOpRGB; + m_blendOpRGBInline.ResetProperty(); + } + else + { + m_blendOpRGBInline.SetInlineByName( blendData.BlendOpRGBInline ); + } + + if( string.IsNullOrEmpty( blendData.BlendOpAlphaInline ) ) + { + m_blendOpAlpha = blendData.BlendOpAlpha; + m_blendOpAlphaInline.ResetProperty(); + } + else + { + m_blendOpAlphaInline.SetInlineByName( blendData.BlendOpAlphaInline ); + } + } + } + else + { + m_blendOpEnabled = false; + } + + m_target = blendData.Target; + m_validBlendMode = blendData.ValidBlendMode; + m_validBlendOp = blendData.ValidBlendOp; + m_validData = m_validBlendMode || m_validBlendOp; + } + + public override void ShowUnreadableDataMessage( ParentNode owner ) + { + bool foldout = owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedBlendModeModule; + NodeUtils.DrawPropertyGroup( ref foldout, BlendModeStr, base.ShowUnreadableDataMessage ); + owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedBlendModeModule = foldout; + } + + public override void Draw( UndoParentNode owner, bool style = true ) + { + bool foldout = owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedBlendModeModule; + if( style ) + { + NodeUtils.DrawPropertyGroup( ref foldout, BlendModeStr + Target, () => + { + DrawBlock( owner, style ); + } ); + } + else + { + NodeUtils.DrawNestedPropertyGroup( ref foldout, BlendModeStr + Target, () => + { + DrawBlock( owner, style ); + } ); + } + owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedBlendModeModule = foldout; + } + + void DrawBlock( UndoParentNode owner, bool style ) + { + EditorGUI.BeginChangeCheck(); + { + var cache = EditorGUIUtility.labelWidth; + EditorGUIUtility.labelWidth = EditorGUIUtility.labelWidth - 20; + + if( m_blendModeEnabled ) + { + // RGB + EditorGUI.BeginChangeCheck(); + m_currentRGBIndex = owner.EditorGUILayoutPopup( BlendModesRGBStr, m_currentRGBIndex, m_commonBlendTypesArr ); + if( EditorGUI.EndChangeCheck() ) + { + if( m_currentRGBIndex > 1 ) + { + m_sourceFactorRGB = m_commonBlendTypes[ m_currentRGBIndex ].SourceFactor; + m_sourceFactorRGBInline.IntValue = (int)m_sourceFactorRGB; + m_sourceFactorRGBInline.SetInlineNodeValue(); + + m_destFactorRGB = m_commonBlendTypes[ m_currentRGBIndex ].DestFactor; + m_destFactorRGBInline.IntValue = (int)m_destFactorRGB; + m_destFactorRGBInline.SetInlineNodeValue(); + } + } + EditorGUI.BeginDisabledGroup( m_currentRGBIndex == 0 ); + + EditorGUI.BeginChangeCheck(); + float cached = EditorGUIUtility.labelWidth; + if( style ) + { + EditorGUIUtility.labelWidth = 40; + } + else + { + EditorGUIUtility.labelWidth = 25; + } + + EditorGUILayout.BeginHorizontal(); + //m_sourceFactorRGB = (AvailableBlendFactor)owner.EditorGUILayoutEnumPopup( SourceFactorStr, m_sourceFactorRGB ); + m_sourceFactorRGBInline.CustomDrawer( ref owner, ( x ) => { m_sourceFactorRGB = (AvailableBlendFactor)x.EditorGUILayoutEnumPopup( SourceFactorStr, m_sourceFactorRGB ); }, SourceFactorStr ); + if( style ) + { + EditorGUI.indentLevel--; + EditorGUIUtility.labelWidth = 25; + } + //m_destFactorRGB = (AvailableBlendFactor)owner.EditorGUILayoutEnumPopup( DstFactorStr, m_destFactorRGB ); + m_destFactorRGBInline.CustomDrawer( ref owner, ( x ) => { m_destFactorRGB = (AvailableBlendFactor)x.EditorGUILayoutEnumPopup( DstFactorStr, m_destFactorRGB ); }, DstFactorStr ); + if( style ) + EditorGUI.indentLevel++; + + EditorGUILayout.EndHorizontal(); + + EditorGUIUtility.labelWidth = cached; + if( EditorGUI.EndChangeCheck() ) + { + CheckRGBIndex(); + } + EditorGUI.EndDisabledGroup(); + } + + if( m_blendOpEnabled ) + { + // Both these tests should be removed on a later stage + // ASE v154dev004 changed AvailableBlendOps.OFF value from -1 to 0 + // If importing the new package into an already opened ASE window makes + // hotcode to preserve the -1 value on these variables + if( (int)m_blendOpRGB == -1 ) + m_blendOpRGB = AvailableBlendOps.OFF; + + //m_blendOpRGB = (AvailableBlendOps)owner.EditorGUILayoutEnumPopup( BlendOpsRGBStr, m_blendOpRGB ); + m_blendOpRGBInline.CustomDrawer( ref owner, ( x ) => { m_blendOpRGB = (AvailableBlendOps)x.EditorGUILayoutPopup( BlendOpsRGBStr, (int)m_blendOpRGB, BlendOpsHelper.BlendOpsLabels ); }, BlendOpsRGBStr ); + } + + if( m_blendModeEnabled ) + { + // Alpha + EditorGUILayout.Separator(); + + EditorGUI.BeginChangeCheck(); + m_currentAlphaIndex = owner.EditorGUILayoutPopup( BlendModesAlphaStr, m_currentAlphaIndex, m_commonBlendTypesArr ); + if( EditorGUI.EndChangeCheck() ) + { + if( m_currentAlphaIndex > 0 ) + { + m_sourceFactorAlpha = m_commonBlendTypes[ m_currentAlphaIndex ].SourceFactor; + m_sourceFactorAlphaInline.IntValue = (int)m_sourceFactorAlpha; + m_sourceFactorAlphaInline.SetInlineNodeValue(); + + m_destFactorAlpha = m_commonBlendTypes[ m_currentAlphaIndex ].DestFactor; + m_destFactorAlphaInline.IntValue = (int)m_destFactorAlpha; + m_destFactorAlphaInline.SetInlineNodeValue(); + } + } + EditorGUI.BeginDisabledGroup( m_currentAlphaIndex == 0 ); + + EditorGUI.BeginChangeCheck(); + float cached = EditorGUIUtility.labelWidth; + if( style ) + { + EditorGUIUtility.labelWidth = 40; + } + else + { + EditorGUIUtility.labelWidth = 25; + } + EditorGUILayout.BeginHorizontal(); + //m_sourceFactorAlpha = (AvailableBlendFactor)owner.EditorGUILayoutEnumPopup( SourceFactorStr, m_sourceFactorAlpha ); + m_sourceFactorAlphaInline.CustomDrawer( ref owner, ( x ) => { m_sourceFactorAlpha = (AvailableBlendFactor)x.EditorGUILayoutEnumPopup( SourceFactorStr, m_sourceFactorAlpha ); }, SourceFactorStr ); + if( style ) + { + EditorGUI.indentLevel--; + EditorGUIUtility.labelWidth = 25; + } + //m_destFactorAlpha = (AvailableBlendFactor)owner.EditorGUILayoutEnumPopup( DstFactorStr, m_destFactorAlpha ); + m_destFactorAlphaInline.CustomDrawer( ref owner, ( x ) => { m_destFactorAlpha = (AvailableBlendFactor)x.EditorGUILayoutEnumPopup( DstFactorStr, m_destFactorAlpha ); }, DstFactorStr ); + if( style ) + EditorGUI.indentLevel++; + EditorGUILayout.EndHorizontal(); + EditorGUIUtility.labelWidth = cached; + + if( EditorGUI.EndChangeCheck() ) + { + CheckAlphaIndex(); + } + + EditorGUI.EndDisabledGroup(); + //EditorGUILayout.Separator(); + } + + if( m_blendOpEnabled ) + { + if( (int)m_blendOpAlpha == -1 ) + m_blendOpAlpha = AvailableBlendOps.OFF; + + //m_blendOpAlpha = (AvailableBlendOps)owner.EditorGUILayoutEnumPopup( BlendOpsAlphaStr, m_blendOpAlpha ); + m_blendOpAlphaInline.CustomDrawer( ref owner, ( x ) => { m_blendOpAlpha = (AvailableBlendOps)x.EditorGUILayoutPopup( BlendOpsAlphaStr, (int)m_blendOpAlpha, BlendOpsHelper.BlendOpsLabels ); }, BlendOpsAlphaStr ); + } + + EditorGUIUtility.labelWidth = cache; + } + + if( EditorGUI.EndChangeCheck() ) + { + m_isDirty = true; + CustomEdited = true; + } + } + + void CheckRGBIndex() + { + int count = m_commonBlendTypes.Count; + m_currentRGBIndex = 1; + for( int i = 1; i < count; i++ ) + { + if( m_commonBlendTypes[ i ].SourceFactor == m_sourceFactorRGB && m_commonBlendTypes[ i ].DestFactor == m_destFactorRGB ) + { + m_currentRGBIndex = i; + return; + } + } + + } + + void CheckAlphaIndex() + { + int count = m_commonBlendTypes.Count; + m_currentAlphaIndex = 1; + for( int i = 1; i < count; i++ ) + { + if( m_commonBlendTypes[ i ].SourceFactor == m_sourceFactorAlpha && m_commonBlendTypes[ i ].DestFactor == m_destFactorAlpha ) + { + m_currentAlphaIndex = i; + if( m_currentAlphaIndex > 0 && m_currentRGBIndex == 0 ) + m_currentRGBIndex = 1; + return; + } + } + + if( m_currentAlphaIndex > 0 && m_currentRGBIndex == 0 ) + m_currentRGBIndex = 1; + } + + public void ReadAlphaToMaskFromString( ref uint index, ref string[] nodeParams ) + { + //TODO: we should send this data to the alpha to mask module instead + if( UIUtils.CurrentShaderVersion() > 16102 && UIUtils.CurrentShaderVersion() <= 18103) + { + bool validAlphaToMask = Convert.ToBoolean( nodeParams[ index++ ] ); + if( validAlphaToMask ) + { + /*bool alphaToMaskValue = */Convert.ToBoolean( nodeParams[ index++ ] ); + } + } + } + + public void ReadBlendModeFromString( ref uint index, ref string[] nodeParams ) + { + bool validDataOnMeta = m_validBlendMode; + if( UIUtils.CurrentShaderVersion() > TemplatesManager.MPShaderVersion ) + { + validDataOnMeta = Convert.ToBoolean( nodeParams[ index++ ] ); + } + + if( validDataOnMeta ) + { + if( UIUtils.CurrentShaderVersion() < 15304 ) + { + m_currentRGBIndex = Convert.ToInt32( nodeParams[ index++ ] ); + m_sourceFactorRGB = (AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), nodeParams[ index++ ] ); + m_destFactorRGB = (AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), nodeParams[ index++ ] ); + + m_currentAlphaIndex = Convert.ToInt32( nodeParams[ index++ ] ); + m_sourceFactorAlpha = (AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), nodeParams[ index++ ] ); + m_destFactorAlpha = (AvailableBlendFactor)Enum.Parse( typeof( AvailableBlendFactor ), nodeParams[ index++ ] ); + } + else + { + m_currentRGBIndex = Convert.ToInt32( nodeParams[ index++ ] ); + m_sourceFactorRGBInline.ReadFromString( ref index, ref nodeParams ); + m_sourceFactorRGB = (AvailableBlendFactor)m_sourceFactorRGBInline.IntValue; + m_destFactorRGBInline.ReadFromString( ref index, ref nodeParams ); + m_destFactorRGB = (AvailableBlendFactor)m_destFactorRGBInline.IntValue; + + m_currentAlphaIndex = Convert.ToInt32( nodeParams[ index++ ] ); + m_sourceFactorAlphaInline.ReadFromString( ref index, ref nodeParams ); + m_sourceFactorAlpha = (AvailableBlendFactor)m_sourceFactorAlphaInline.IntValue; + m_destFactorAlphaInline.ReadFromString( ref index, ref nodeParams ); + m_destFactorAlpha = (AvailableBlendFactor)m_destFactorAlphaInline.IntValue; + } + } + } + + public void ReadBlendOpFromString( ref uint index, ref string[] nodeParams ) + { + bool validDataOnMeta = m_validBlendOp; + if( UIUtils.CurrentShaderVersion() > TemplatesManager.MPShaderVersion ) + { + validDataOnMeta = Convert.ToBoolean( nodeParams[ index++ ] ); + } + + if( validDataOnMeta ) + { + if( UIUtils.CurrentShaderVersion() < 15304 ) + { + m_blendOpRGB = (AvailableBlendOps)Enum.Parse( typeof( AvailableBlendOps ), nodeParams[ index++ ] ); + m_blendOpAlpha = (AvailableBlendOps)Enum.Parse( typeof( AvailableBlendOps ), nodeParams[ index++ ] ); + } + else + { + m_blendOpRGBInline.ReadFromString( ref index, ref nodeParams ); + m_blendOpAlphaInline.ReadFromString( ref index, ref nodeParams ); + + if( UIUtils.CurrentShaderVersion() < 15404 ) + { + // Now BlendOps enum starts at 0 and not -1 + m_blendOpRGBInline.FloatValue += 1; + m_blendOpAlphaInline.FloatValue += 1; + } + + m_blendOpRGB = (AvailableBlendOps)m_blendOpRGBInline.IntValue; + m_blendOpAlpha = (AvailableBlendOps)m_blendOpAlphaInline.IntValue; + } + //m_blendOpEnabled = ( m_blendOpRGB != AvailableBlendOps.OFF ); + } + } + + public void WriteBlendModeToString( ref string nodeInfo ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_validBlendMode ); + if( m_validBlendMode ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_currentRGBIndex ); + if( !m_sourceFactorRGBInline.IsValid ) m_sourceFactorRGBInline.IntValue = (int)m_sourceFactorRGB; + m_sourceFactorRGBInline.WriteToString( ref nodeInfo ); + + if( !m_destFactorRGBInline.IsValid ) m_destFactorRGBInline.IntValue = (int)m_destFactorRGB; + m_destFactorRGBInline.WriteToString( ref nodeInfo ); + + IOUtils.AddFieldValueToString( ref nodeInfo, m_currentAlphaIndex ); + if( !m_sourceFactorAlphaInline.IsValid ) m_sourceFactorAlphaInline.IntValue = (int)m_sourceFactorAlpha; + m_sourceFactorAlphaInline.WriteToString( ref nodeInfo ); + + if( !m_destFactorAlphaInline.IsValid ) m_destFactorAlphaInline.IntValue = (int)m_destFactorAlpha; + m_destFactorAlphaInline.WriteToString( ref nodeInfo ); + } + } + + public void WriteBlendOpToString( ref string nodeInfo ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_validBlendOp ); + if( m_validBlendOp ) + { + if( !m_blendOpRGBInline.IsValid ) m_blendOpRGBInline.IntValue = (int)m_blendOpRGB; + m_blendOpRGBInline.WriteToString( ref nodeInfo ); + + if( !m_blendOpAlphaInline.IsValid ) m_blendOpAlphaInline.IntValue = (int)m_blendOpAlpha; + m_blendOpAlphaInline.WriteToString( ref nodeInfo ); + } + } + + public override void ReadFromString( ref uint index, ref string[] nodeParams ) + { + base.ReadFromString( ref index, ref nodeParams ); + ReadBlendModeFromString( ref index, ref nodeParams ); + ReadBlendOpFromString( ref index, ref nodeParams ); + ReadAlphaToMaskFromString( ref index, ref nodeParams ); + } + + public override void WriteToString( ref string nodeInfo ) + { + base.WriteToString( ref nodeInfo ); + WriteBlendModeToString( ref nodeInfo ); + WriteBlendOpToString( ref nodeInfo ); + } + + public override void Destroy() + { + base.Destroy(); + m_sourceFactorRGBInline = null; + m_destFactorRGBInline = null; + m_sourceFactorAlphaInline = null; + m_destFactorAlphaInline = null; + m_blendOpRGBInline = null; + m_blendOpAlphaInline = null; + } + + public string CurrentBlendFactorSingle + { + get + { + return ( m_currentRGBIndex > 0 ) ? string.Format( SingleBlendFactorStr, m_target, m_sourceFactorRGBInline.GetValueOrProperty( m_sourceFactorRGB.ToString() ), m_destFactorRGBInline.GetValueOrProperty( m_destFactorRGB.ToString() ) ) : BlendFactorOff; + } + } + + public string CurrentBlendFactorSeparate + { + get + { + return string.Format( SeparateBlendFactorStr, m_target, + m_sourceFactorRGBInline.GetValueOrProperty( ( m_currentRGBIndex > 0 ? m_sourceFactorRGB.ToString() : AvailableBlendFactor.One.ToString() ) ), + m_destFactorRGBInline.GetValueOrProperty( m_currentRGBIndex > 0 ? m_destFactorRGB.ToString() : AvailableBlendFactor.Zero.ToString() ), + m_sourceFactorAlphaInline.GetValueOrProperty( m_sourceFactorAlpha.ToString() ), + m_destFactorAlphaInline.GetValueOrProperty( m_destFactorAlpha.ToString() ) ); + } + } + + public string CurrentBlendFactor + { + get + { + return ( ( m_currentAlphaIndex > 0 ) ? CurrentBlendFactorSeparate : CurrentBlendFactorSingle ); + } + } + + + public string CurrentBlendOpSingle + { + get + { + return ( m_blendOpRGB != AvailableBlendOps.OFF || m_blendOpRGBInline.IsValid ) ? string.Format( SingleBlendOpStr, Target, m_blendOpRGBInline.GetValueOrProperty( m_blendOpRGB.ToString() ) ) : string.Empty; + } + } + + public string CurrentBlendOpSeparate + { + get + { + return string.Format( SeparateBlendOpStr, Target, m_blendOpRGBInline.GetValueOrProperty( ( m_currentRGBIndex > 0 && m_blendOpRGB != AvailableBlendOps.OFF ) ? m_blendOpRGB.ToString() : AvailableBlendOps.Add.ToString() ), m_blendOpAlphaInline.GetValueOrProperty( m_blendOpAlpha.ToString() ) ); + } + } + + public string CurrentBlendOp { get { return ( ( m_blendOpAlpha != AvailableBlendOps.OFF || m_blendOpAlphaInline.IsValid ) ? CurrentBlendOpSeparate : CurrentBlendOpSingle ); } } + public bool Active { get { return m_blendModeEnabled && ( m_currentRGBIndex > 0 || m_currentAlphaIndex > 0 ); } } + public bool BlendOpActive + { + get + { + return m_blendOpEnabled && + ( + m_blendOpRGBInline.Active || + m_blendOpAlphaInline.Active || + ( !m_blendOpRGBInline.Active && m_blendOpRGB != AvailableBlendOps.OFF ) || + ( !m_blendOpAlphaInline.Active && m_blendOpAlpha != AvailableBlendOps.OFF ) ); + } + } + + public string Target { get { return m_target; } } + public bool ValidBlendMode { get { return m_validBlendMode; } } + public bool ValidBlendOp { get { return m_validBlendOp; } } + public int CurrentRGBIndex { get { return m_currentRGBIndex; } } + + public AvailableBlendFactor SourceFactorRGB + { + get { return m_sourceFactorRGB; } + set + { + m_sourceFactorRGB = value; + m_sourceFactorRGBInline.IntValue = (int)m_sourceFactorRGB; + m_sourceFactorRGBInline.Active = false; + } + + } + public AvailableBlendFactor DestFactorRGB + { + get { return m_destFactorRGB; } + set + { + m_destFactorRGB = value; + m_destFactorRGBInline.IntValue = (int)value; + } + } + + public int CurrentAlphaIndex { get { return m_currentAlphaIndex; } set { m_currentAlphaIndex = value; } } + + public AvailableBlendFactor SourceFactorAlpha + { + get { return m_sourceFactorAlpha; } + set + { + m_sourceFactorAlpha = value; + m_sourceFactorAlphaInline.IntValue = (int)value; + m_sourceFactorAlphaInline.Active = false; + } + } + + public AvailableBlendFactor DestFactorAlpha + { + get { return m_destFactorAlpha; } + set + { + m_destFactorAlpha = value; + m_destFactorAlphaInline.IntValue = (int)value; + m_destFactorAlphaInline.Active = false; + + } + } + + public bool BlendModeEnabled { get { return m_blendModeEnabled; } } + public bool BlendOpEnabled { get { return m_blendOpEnabled; } } + public AvailableBlendOps BlendOpRGB + { + get { return m_blendOpRGB; } + set + { + m_blendOpRGB = value; + m_blendOpRGBInline.IntValue = (int)value; + m_blendOpRGBInline.Active = false; + } + } + + public AvailableBlendOps BlendOpAlpha + { + get { return m_blendOpAlpha; } + set + { + m_blendOpAlpha = value; + m_blendOpAlphaInline.IntValue = (int)value; + m_blendOpAlphaInline.Active = false; + } + } + + public InlineProperty SourceFactorRGBInline { get { return m_sourceFactorRGBInline; } } + public InlineProperty DestFactorRGBInline { get { return m_destFactorRGBInline; } } + public InlineProperty SourceFactorAlphaInline { get { return m_sourceFactorAlphaInline; } } + public InlineProperty DestFactorAlphaInline { get { return m_destFactorAlphaInline; } } + public InlineProperty BlendOpRGBInline { get { return m_blendOpRGBInline; } } + public InlineProperty BlendOpAlphaInline { get { return m_blendOpAlphaInline; } } + public bool IsAdditiveRGB { get { return m_validBlendMode && m_blendModeEnabled && ( m_currentRGBIndex > 0 ) && ( m_sourceFactorRGB == AvailableBlendFactor.One ) && ( m_destFactorRGB == AvailableBlendFactor.One ); } } + public bool IsAlphaBlendRGB { get { return m_validBlendMode && m_blendModeEnabled && ( m_currentRGBIndex > 0 ) && ( m_sourceFactorRGB == AvailableBlendFactor.SrcAlpha ) && ( m_destFactorRGB == AvailableBlendFactor.OneMinusSrcAlpha ); } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatesBlendModule.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatesBlendModule.cs.meta new file mode 100644 index 0000000..b4eeb76 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatesBlendModule.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7c88941c5badfb7428059cc3ff0c0df9 +timeCreated: 1510933946 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatesManager.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatesManager.cs new file mode 100644 index 0000000..b7356c1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatesManager.cs @@ -0,0 +1,936 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEditor; +using System.Collections.Generic; +using UnityEngine; +using System.Text.RegularExpressions; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class TemplateInputData + { + public string PortName; + public WirePortDataType DataType; + public MasterNodePortCategory PortCategory; + public int PortUniqueId; + public int OrderId; + public int TagGlobalStartIdx; + public int TagLocalStartIdx; + public string TagId; + public string DefaultValue; + public string LinkId; + + public TemplateInputData( int tagLocalStartIdx, int tagGlobalStartIdx, string tagId, string portName, string defaultValue, WirePortDataType dataType, MasterNodePortCategory portCategory, int portUniqueId, int orderId, string linkId ) + { + DefaultValue = defaultValue; + PortName = portName; + DataType = dataType; + PortCategory = portCategory; + PortUniqueId = portUniqueId; + OrderId = orderId; + TagId = tagId; + TagGlobalStartIdx = tagGlobalStartIdx; + TagLocalStartIdx = tagLocalStartIdx; + LinkId = linkId; + } + + public TemplateInputData( TemplateInputData other ) + { + DefaultValue = other.DefaultValue; + PortName = other.PortName; + DataType = other.DataType; + PortCategory = other.PortCategory; + PortUniqueId = other.PortUniqueId; + OrderId = other.OrderId; + TagId = other.TagId; + TagGlobalStartIdx = other.TagGlobalStartIdx; + LinkId = other.LinkId; + } + } + + + + [Serializable] + public class TemplatePropertyContainer + { + [SerializeField] + private List m_propertyList = new List(); + private Dictionary m_propertyDict = new Dictionary(); + + + public void AddId( TemplateProperty templateProperty ) + { + BuildInfo(); + m_propertyList.Add( templateProperty ); + m_propertyDict.Add( templateProperty.Id, templateProperty ); + } + + public void AddId( string body, string ID, bool searchIndentation = true ) + { + AddId( body, ID, searchIndentation, string.Empty ); + } + + public void AddId( string body, string ID, bool searchIndentation, string customIndentation ) + { + BuildInfo(); + + int propertyIndex = body.IndexOf( ID ); + if( propertyIndex > -1 ) + { + if( searchIndentation ) + { + int identationIndex = -1; + for( int i = propertyIndex; i >= 0; i-- ) + { + if( body[ i ] == TemplatesManager.TemplateNewLine ) + { + identationIndex = i + 1; + break; + } + + if( i == 0 ) + { + identationIndex = 0; + } + } + if( identationIndex > -1 ) + { + int length = propertyIndex - identationIndex; + string indentation = ( length > 0 ) ? body.Substring( identationIndex, length ) : string.Empty; + TemplateProperty templateProperty = new TemplateProperty( ID, indentation, false ); + m_propertyList.Add( templateProperty ); + m_propertyDict.Add( templateProperty.Id, templateProperty ); + } + else + { + TemplateProperty templateProperty = new TemplateProperty( ID, string.Empty, false ); + m_propertyList.Add( templateProperty ); + m_propertyDict.Add( templateProperty.Id, templateProperty ); + } + } + else + { + TemplateProperty templateProperty = new TemplateProperty( ID, customIndentation, true ); + m_propertyList.Add( templateProperty ); + m_propertyDict.Add( templateProperty.Id, templateProperty ); + } + } + } + + + public void AddId( string body, string ID, int propertyIndex, bool searchIndentation ) + { + AddId( body, ID, propertyIndex, searchIndentation, string.Empty ); + } + + public void AddId( string body, string ID, int propertyIndex, bool searchIndentation, string customIndentation ) + { + if( body == null || string.IsNullOrEmpty( body ) ) + return; + + BuildInfo(); + if( searchIndentation && propertyIndex > -1 && propertyIndex < body.Length ) + { + int indentationIndex = -1; + for( int i = propertyIndex; i > 0; i-- ) + { + if( body[ i ] == TemplatesManager.TemplateNewLine ) + { + indentationIndex = i + 1; + break; + } + } + + if( indentationIndex > -1 ) + { + int length = propertyIndex - indentationIndex; + string indentation = ( length > 0 ) ? body.Substring( indentationIndex, length ) : string.Empty; + TemplateProperty templateProperty = new TemplateProperty( ID, indentation, false ); + m_propertyList.Add( templateProperty ); + m_propertyDict.Add( templateProperty.Id, templateProperty ); + } + } + else + { + TemplateProperty templateProperty = new TemplateProperty( ID, customIndentation, true ); + m_propertyList.Add( templateProperty ); + m_propertyDict.Add( templateProperty.Id, templateProperty ); + } + + } + public void BuildInfo() + { + if( m_propertyDict == null ) + { + m_propertyDict = new Dictionary(); + } + + if( m_propertyList.Count != m_propertyDict.Count ) + { + m_propertyDict.Clear(); + for( int i = 0; i < m_propertyList.Count; i++ ) + { + m_propertyDict.Add( m_propertyList[ i ].Id, m_propertyList[ i ] ); + } + } + } + + public void ResetTemplateUsageData() + { + BuildInfo(); + for( int i = 0; i < m_propertyList.Count; i++ ) + { + m_propertyList[ i ].Used = false; + } + } + + public void Reset() + { + m_propertyList.Clear(); + m_propertyDict.Clear(); + } + + public void Destroy() + { + m_propertyList.Clear(); + m_propertyList = null; + m_propertyDict.Clear(); + m_propertyDict = null; + } + + + public Dictionary PropertyDict + { + get + { + BuildInfo(); + return m_propertyDict; + } + } + public List PropertyList { get { return m_propertyList; } } + } + + [Serializable] + public class TemplateProperty + { + public bool UseIndentationAtStart = false; + public string Indentation; + public bool UseCustomIndentation; + public string Id; + public bool AutoLineFeed; + public bool Used; + + public TemplateProperty( string id, string indentation, bool useCustomIndentation ) + { + Id = id; + Indentation = indentation; + UseCustomIndentation = useCustomIndentation; + AutoLineFeed = !string.IsNullOrEmpty( indentation ); + Used = false; + } + } + + [Serializable] + public class TemplateTessVControlTag + { + public string Id; + public int StartIdx; + + public TemplateTessVControlTag() + { + StartIdx = -1; + } + + public bool IsValid { get { return StartIdx >= 0; } } + } + + [Serializable] + public class TemplateTessControlData + { + public string Id; + public int StartIdx; + public string InVarType; + public string InVarName; + public string OutVarType; + public string OutVarName; + + public bool IsValid { get { return StartIdx >= 0; } } + + public TemplateTessControlData() + { + StartIdx = -1; + } + + public TemplateTessControlData( int startIdx, string id, string inVarInfo, string outVarInfo ) + { + StartIdx = startIdx; + Id = id; + string[] inVarInfoArr = inVarInfo.Split( IOUtils.VALUE_SEPARATOR ); + if( inVarInfoArr.Length > 1 ) + { + InVarType = inVarInfoArr[ 1 ]; + InVarName = inVarInfoArr[ 0 ]; + } + + string[] outVarInfoArr = outVarInfo.Split( IOUtils.VALUE_SEPARATOR ); + if( outVarInfoArr.Length > 1 ) + { + OutVarType = outVarInfoArr[ 1 ]; + OutVarName = outVarInfoArr[ 0 ]; + } + } + + public string[] GenerateControl( Dictionary vertexData, List inputList ) + { + List value = new List(); + if( vertexData != null && vertexData.Count > 0 ) + { + foreach( var item in vertexData ) + { + if( inputList.FindIndex( x => { return x.Contains( item.Value.VarName ); } ) > -1 ) + value.Add( string.Format( "{0}.{1} = {2}.{1};", OutVarName, item.Value.VarName, InVarName ) ); + } + } + return value.ToArray(); + } + } + + [Serializable] + public class TemplateTessDomainData + { + public string Id; + public int StartIdx; + public string InVarType; + public string InVarName; + public string OutVarType; + public string OutVarName; + public string BaryVarType; + public string BaryVarName; + + public bool IsValid { get { return StartIdx >= 0; } } + + public TemplateTessDomainData() + { + StartIdx = -1; + } + + public TemplateTessDomainData( int startIdx, string id, string inVarInfo, string outVarInfo, string baryVarInfo ) + { + StartIdx = startIdx; + Id = id; + string[] inVarInfoArr = inVarInfo.Split( IOUtils.VALUE_SEPARATOR ); + if( inVarInfoArr.Length > 1 ) + { + InVarType = inVarInfoArr[ 1 ]; + InVarName = inVarInfoArr[ 0 ]; + } + + string[] outVarInfoArr = outVarInfo.Split( IOUtils.VALUE_SEPARATOR ); + if( outVarInfoArr.Length > 1 ) + { + OutVarType = outVarInfoArr[ 1 ]; + OutVarName = outVarInfoArr[ 0 ]; + } + + string[] baryVarInfoArr = baryVarInfo.Split( IOUtils.VALUE_SEPARATOR ); + if( baryVarInfoArr.Length > 1 ) + { + BaryVarType = baryVarInfoArr[ 1 ]; + BaryVarName = baryVarInfoArr[ 0 ]; + } + } + + public string[] GenerateDomain( Dictionary vertexData, List inputList ) + { + List value = new List(); + if( vertexData != null && vertexData.Count > 0 ) + { + foreach( var item in vertexData ) + { + //o.ase_normal = patch[0].ase_normal * bary.x + patch[1].ase_normal * bary.y + patch[2].ase_normal * bary.z; + if( inputList.FindIndex( x => { return x.Contains( item.Value.VarName ); } ) > -1 ) + value.Add( string.Format( "{0}.{1} = {2}[0].{1} * {3}.x + {2}[1].{1} * {3}.y + {2}[2].{1} * {3}.z;", OutVarName, item.Value.VarName, InVarName, BaryVarName ) ); + } + } + return value.ToArray(); + } + } + + [Serializable] + public class TemplateFunctionData + { + public int MainBodyLocalIdx; + public string MainBodyName; + + public string Id; + public int Position; + public string InVarType; + public string InVarName; + public string OutVarType; + public string OutVarName; + public MasterNodePortCategory Category; + public TemplateFunctionData( int mainBodyLocalIdx, string mainBodyName, string id, int position, string inVarInfo, string outVarInfo, MasterNodePortCategory category ) + { + MainBodyLocalIdx = mainBodyLocalIdx; + MainBodyName = mainBodyName; + Id = id; + Position = position; + { + string[] inVarInfoArr = inVarInfo.Split( IOUtils.VALUE_SEPARATOR ); + if( inVarInfoArr.Length > 1 ) + { + InVarType = inVarInfoArr[ 1 ]; + InVarName = inVarInfoArr[ 0 ]; + } + } + { + string[] outVarInfoArr = outVarInfo.Split( IOUtils.VALUE_SEPARATOR ); + if( outVarInfoArr.Length > 1 ) + { + OutVarType = outVarInfoArr[ 1 ]; + OutVarName = outVarInfoArr[ 0 ]; + } + } + Category = category; + } + } + + [Serializable] + public class TemplateTagData + { + public int StartIdx = -1; + public string Id; + public bool SearchIndentation; + public string CustomIndentation; + + + public TemplateTagData( int startIdx, string id, bool searchIndentation ) + { + StartIdx = startIdx; + Id = id; + SearchIndentation = searchIndentation; + CustomIndentation = string.Empty; + } + + public TemplateTagData( string id, bool searchIndentation ) + { + Id = id; + SearchIndentation = searchIndentation; + CustomIndentation = string.Empty; + } + + public TemplateTagData( string id, bool searchIndentation, string customIndentation ) + { + Id = id; + SearchIndentation = searchIndentation; + CustomIndentation = customIndentation; + } + + public bool IsValid { get { return StartIdx >= 0; } } + } + + public enum TemplatePortIds + { + Name = 0, + DataType, + UniqueId, + OrderId, + Link + } + + public enum TemplateCommonTagId + { + Property = 0, + Global = 1, + Function = 2, + Tag = 3, + Pragmas = 4, + Pass = 5, + Params_Vert = 6, + Params_Frag = 7 + //CullMode = 8, + //BlendMode = 9, + //BlendOp = 10, + //ColorMask = 11, + //StencilOp = 12 + } + + [Serializable] + public class TemplatesManager : ScriptableObject + { + public static int MPShaderVersion = 14503; + + public static readonly string TemplateShaderNameBeginTag = "/*ase_name*/"; + public static readonly string TemplateStencilTag = "/*ase_stencil*/\n"; + public static readonly string TemplateAllModulesTag = "/*ase_all_modules*/\n"; + public static readonly string TemplateMPSubShaderTag = "\\bSubShader\\b\\s*{"; + //public static readonly string TemplateMPPassTag = "^\\s*Pass\b\\s*{";//"\\bPass\\b\\s*{"; + public static readonly string TemplateMPPassTag = "\\bPass\\b\\s*{"; + public static readonly string TemplateLocalVarTag = "/*ase_local_var*/"; + public static readonly string TemplateDependenciesListTag = "/*ase_dependencies_list*/"; + public static readonly string TemplatePragmaBeforeTag = "/*ase_pragma_before*/"; + public static readonly string TemplatePragmaTag = "/*ase_pragma*/"; + public static readonly string TemplatePassTag = "/*ase_pass*/"; + public static readonly string TemplatePassesEndTag = "/*ase_pass_end*/"; + public static readonly string TemplateLODsTag = "/*ase_lod*/"; + //public static readonly string TemplatePassTagPattern = @"\s\/\*ase_pass\*\/"; + public static readonly string TemplatePassTagPattern = @"\s\/\*ase_pass[:\*]+"; + public static readonly string TemplatePropertyTag = "/*ase_props*/"; + public static readonly string TemplateGlobalsTag = "/*ase_globals*/"; + public static readonly string TemplateSRPBatcherTag = "/*ase_srp_batcher*/\n"; + public static readonly string TemplateInterpolatorBeginTag = "/*ase_interp("; + public static readonly string TemplateVertexDataTag = "/*ase_vdata:"; + + public static readonly string TemplateTessVControlTag = "/*ase_vcontrol*/"; + public static readonly string TemplateTessControlCodeArea = "/*ase_control_code:"; + public static readonly string TemplateTessDomainCodeArea = "/*ase_domain_code:"; + + //public static readonly string TemplateExcludeFromGraphTag = "/*ase_hide_pass*/"; + public static readonly string TemplateMainPassTag = "/*ase_main_pass*/"; + + public static readonly string TemplateFunctionsTag = "/*ase_funcs*/\n"; + //public static readonly string TemplateTagsTag = "/*ase_tags*/"; + + //public static readonly string TemplateCullModeTag = "/*ase_cull_mode*/"; + //public static readonly string TemplateBlendModeTag = "/*ase_blend_mode*/"; + //public static readonly string TemplateBlendOpTag = "/*ase_blend_op*/"; + //public static readonly string TemplateColorMaskTag = "/*ase_color_mask*/"; + //public static readonly string TemplateStencilOpTag = "/*ase_stencil*/"; + + public static readonly string TemplateCodeSnippetAttribBegin = "#CODE_SNIPPET_ATTRIBS_BEGIN#"; + public static readonly string TemplateCodeSnippetAttribEnd = "#CODE_SNIPPET_ATTRIBS_END#\n"; + public static readonly string TemplateCodeSnippetEnd = "#CODE_SNIPPET_END#\n"; + + public static readonly char TemplateNewLine = '\n'; + + // INPUTS AREA + public static readonly string TemplateInputsVertBeginTag = "/*ase_vert_out:"; + public static readonly string TemplateInputsFragBeginTag = "/*ase_frag_out:"; + public static readonly string TemplateInputsVertParamsTag = "/*ase_vert_input*/"; + public static readonly string TemplateInputsFragParamsTag = "/*ase_frag_input*/"; + + + // CODE AREA + public static readonly string TemplateVertexCodeBeginArea = "/*ase_vert_code:"; + public static readonly string TemplateFragmentCodeBeginArea = "/*ase_frag_code:"; + + + public static readonly string TemplateEndOfLine = "*/\n"; + public static readonly string TemplateEndSectionTag = "*/"; + public static readonly string TemplateFullEndTag = "/*end*/"; + + public static readonly string NameFormatter = "\"{0}\""; + + public static readonly TemplateTagData[] CommonTags = { new TemplateTagData( TemplatePropertyTag,true), + new TemplateTagData( TemplateGlobalsTag,true), + new TemplateTagData( TemplateSRPBatcherTag,true), + new TemplateTagData( TemplateFunctionsTag,true), + //new TemplateTagData( TemplateTagsTag,false," "), + new TemplateTagData( TemplatePragmaBeforeTag,true), + new TemplateTagData( TemplatePragmaTag,true), + new TemplateTagData( TemplatePassTag,true), + new TemplateTagData( TemplateInputsVertParamsTag,false), + new TemplateTagData( TemplateInputsFragParamsTag,false), + new TemplateTagData( TemplateLODsTag,true) + //new TemplateTagData( TemplateCullModeTag,false), + //new TemplateTagData( TemplateBlendModeTag,false), + //new TemplateTagData( TemplateBlendOpTag,false), + //new TemplateTagData( TemplateColorMaskTag,false), + //new TemplateTagData( TemplateStencilOpTag,true), + }; + public static string LightweigthPBRGUID = "1976390536c6c564abb90fe41f6ee334"; + public static string LightweigthUnlitGUID = "e2514bdcf5e5399499a9eb24d175b9db"; + public static string UniversalPBRGUID = "94348b07e5e8bab40bd6c8a1e3df54cd"; + public static string UniversalUnlitGUID = "2992e84f91cbeb14eab234972e07ea9d"; + + public static string HDNewLitGUID = "53b46d85872c5b24c8f4f0a1c3fe4c87"; + public static string HDNewPBRGUID = "41e04be03f2c20941bc749271be1c937"; + public static string HDNewUnlitGUID = "7f5cb9c3ea6481f469fdd856555439ef"; + public static string HDLitGUID = "091c43ba8bd92c9459798d59b089ce4e"; + public static string HDPBRGUID = "bb308bce79762c34e823049efce65141"; + public static string HDUnlitGUID = "dfe2f27ac20b08c469b2f95c236be0c3"; + + public static Dictionary DeprecatedTemplates = new Dictionary() + { + { HDLitGUID, HDNewLitGUID}, + { HDUnlitGUID,HDNewUnlitGUID}, + { HDPBRGUID,HDNewLitGUID}, + { HDNewPBRGUID,HDNewLitGUID} + }; + + public static Dictionary OfficialTemplates = new Dictionary() + { + { "0770190933193b94aaa3065e307002fa","Legacy/Unlit"}, + { "32139be9c1eb75640a847f011acf3bcf","Legacy/Post-Processing Stack"}, + { "6ce779933eb99f049b78d6163735e06f","Legacy/Custom RT Init"}, + { "32120270d1b3a8746af2aca8bc749736","Legacy/Custom RT Update"}, + { LightweigthPBRGUID,"LW/PBR"}, + { LightweigthUnlitGUID,"LW/Unlit"}, + { UniversalPBRGUID,"Universal/PBR"}, + { UniversalUnlitGUID,"Universal/Unlit"}, + { "53b46d85872c5b24c8f4f0a1c3fe4c87","HD/Lit"}, + { HDLitGUID,"Deprecated/HD/Lit"}, + { HDPBRGUID,"Deprecated/HD/PBR"}, + { HDUnlitGUID,"Deprecated/HD/Unlit"}, + { "c71b220b631b6344493ea3cf87110c93","Legacy/Post Process" }, + { "6e114a916ca3e4b4bb51972669d463bf","Deprecated/Legacy/Default Unlit" }, + { "5056123faa0c79b47ab6ad7e8bf059a4","Legacy/Default UI" }, + { "899e609c083c74c4ca567477c39edef0","Legacy/Unlit Lightmap" }, + { "0f8ba0101102bb14ebf021ddadce9b49","Legacy/Default Sprites" }, + { "0b6a9f8b4f707c74ca64c0be8e590de0","Legacy/Particles Alpha Blended" }, + { "e1de45c0d41f68c41b2cc20c8b9c05ef","Legacy/Multi Pass Unlit" } + }; + + public static readonly string TemplateMenuItemsFileGUID = "da0b931bd234a1e43b65f684d4b59bfb"; + + private Dictionary m_availableTemplates = new Dictionary(); + + [SerializeField] + private List m_sortedTemplates = new List(); + + [SerializeField] + public string[] AvailableTemplateNames; + + [SerializeField] + public bool Initialized = false; + + private Dictionary m_optionsInitialSetup = new Dictionary(); + + public static string CurrTemplateGUIDLoaded = string.Empty; + + public static bool IsTestTemplate { get { return CurrTemplateGUIDLoaded.Equals( "a95a019bbc760714bb8228af04c291d1" ); } } + public static bool ShowDebugMessages = false; + public void RefreshAvailableTemplates() + { + if( m_availableTemplates.Count != m_sortedTemplates.Count ) + { + m_availableTemplates.Clear(); + int count = m_sortedTemplates.Count; + for( int i = 0; i < count; i++ ) + { + m_availableTemplates.Add( m_sortedTemplates[ i ].GUID, m_sortedTemplates[ i ] ); + } + } + } + + public void Init() + { + if( !Initialized ) + { + if( ShowDebugMessages ) + Debug.Log( "Initialize" ); + + string templateMenuItems = IOUtils.LoadTextFileFromDisk( AssetDatabase.GUIDToAssetPath( TemplateMenuItemsFileGUID ) ); + bool refreshTemplateMenuItems = false; + + foreach( KeyValuePair kvp in OfficialTemplates ) + { + if( !string.IsNullOrEmpty( AssetDatabase.GUIDToAssetPath( kvp.Key ) ) ) + { + TemplateMultiPass template = ScriptableObject.CreateInstance(); + template.Init( kvp.Value, kvp.Key, false ); + AddTemplate( template ); + if( !refreshTemplateMenuItems && templateMenuItems.IndexOf( kvp.Value ) < 0 ) + refreshTemplateMenuItems = true; + } + } + + // Search for other possible templates on the project + string[] allShaders = AssetDatabase.FindAssets( "t:shader" ); + for( int i = 0; i < allShaders.Length; i++ ) + { + if( !m_availableTemplates.ContainsKey( allShaders[ i ] ) ) + { + CheckAndLoadTemplate( allShaders[ i ] ); + } + } + + // TODO: Sort list alphabeticaly + AvailableTemplateNames = new string[ m_sortedTemplates.Count + 1 ]; + AvailableTemplateNames[ 0 ] = "Custom"; + for( int i = 0; i < m_sortedTemplates.Count; i++ ) + { + m_sortedTemplates[ i ].OrderId = i; + AvailableTemplateNames[ i + 1 ] = m_sortedTemplates[ i ].Name; + } + + if( refreshTemplateMenuItems ) + CreateTemplateMenuItems(); + + Initialized = true; + } + } + + //[MenuItem( "Window/Amplify Shader Editor/Create Menu Items", false, 1000 )] + //public static void ForceCreateTemplateMenuItems() + //{ + // UIUtils.CurrentWindow.TemplatesManagerInstance.CreateTemplateMenuItems(); + //} + + public void CreateTemplateMenuItems() + { + if( m_sortedTemplates == null || m_sortedTemplates.Count == 0 ) + return; + + // change names for duplicates + for( int i = 0; i < m_sortedTemplates.Count; i++ ) + { + for( int j = 0; j < i; j++ ) + { + if( m_sortedTemplates[ i ].Name == m_sortedTemplates[ j ].Name ) + { + var match = Regex.Match( m_sortedTemplates[ i ].Name, @".+(\d+)" ); + if( match.Success ) + { + string strNumber = match.Groups[ 1 ].Value; + int number = int.Parse( strNumber ) + 1; + string firstPart = m_sortedTemplates[ i ].Name.Substring( 0, match.Groups[ 1 ].Index ); + string secondPart = m_sortedTemplates[ i ].Name.Substring( match.Groups[ 1 ].Index + strNumber.Length ); + m_sortedTemplates[ i ].Name = firstPart + number + secondPart; + } + else + { + m_sortedTemplates[ i ].Name += " 1"; + } + } + } + } + + System.Text.StringBuilder fileContents = new System.Text.StringBuilder(); + fileContents.Append( "// Amplify Shader Editor - Visual Shader Editing Tool\n" ); + fileContents.Append( "// Copyright (c) Amplify Creations, Lda \n" ); + fileContents.Append( "using UnityEditor;\n" ); + fileContents.Append( "\n" ); + fileContents.Append( "namespace AmplifyShaderEditor\n" ); + fileContents.Append( "{\n" ); + fileContents.Append( "\tpublic class TemplateMenuItems\n" ); + fileContents.Append( "\t{\n" ); + int fixedPriority = 85; + for( int i = 0; i < m_sortedTemplates.Count; i++ ) + { + fileContents.AppendFormat( "\t\t[MenuItem( \"Assets/Create/Amplify Shader/{0}\", false, {1} )]\n", m_sortedTemplates[ i ].Name, fixedPriority ); + string itemName = UIUtils.RemoveInvalidCharacters( m_sortedTemplates[ i ].Name ); + fileContents.AppendFormat( "\t\tpublic static void ApplyTemplate{0}()\n", itemName/*i*/ ); + fileContents.Append( "\t\t{\n" ); + //fileContents.AppendFormat( "\t\t\tAmplifyShaderEditorWindow.CreateNewTemplateShader( \"{0}\" );\n", m_sortedTemplates[ i ].GUID ); + fileContents.AppendFormat( "\t\t\tAmplifyShaderEditorWindow.CreateConfirmationTemplateShader( \"{0}\" );\n", m_sortedTemplates[ i ].GUID ); + fileContents.Append( "\t\t}\n" ); + } + fileContents.Append( "\t}\n" ); + fileContents.Append( "}\n" ); + string filePath = AssetDatabase.GUIDToAssetPath( TemplateMenuItemsFileGUID ); + IOUtils.SaveTextfileToDisk( fileContents.ToString(), filePath, false ); + m_filepath = filePath; + //AssetDatabase.ImportAsset( filePath ); + } + + string m_filepath = string.Empty; + + public void ReimportMenuItems() + { + if( !string.IsNullOrEmpty( m_filepath ) ) + { + AssetDatabase.ImportAsset( m_filepath ); + m_filepath = string.Empty; + } + } + + public int GetIdForTemplate( TemplateData templateData ) + { + if( templateData == null ) + return -1; + + for( int i = 0; i < m_sortedTemplates.Count; i++ ) + { + if( m_sortedTemplates[ i ].GUID.Equals( templateData.GUID ) ) + return m_sortedTemplates[ i ].OrderId; + } + return -1; + } + + + + public void AddTemplate( TemplateDataParent templateData ) + { + if( templateData == null || !templateData.IsValid ) + return; + RefreshAvailableTemplates(); + if( !m_availableTemplates.ContainsKey( templateData.GUID ) ) + { + m_sortedTemplates.Add( templateData ); + m_availableTemplates.Add( templateData.GUID, templateData ); + } + } + + public void RemoveTemplate( string guid ) + { + TemplateDataParent templateData = GetTemplate( guid ); + if( templateData != null ) + { + RemoveTemplate( templateData ); + } + } + + public void RemoveTemplate( TemplateDataParent templateData ) + { + RefreshAvailableTemplates(); + + if( m_availableTemplates != null ) + m_availableTemplates.Remove( templateData.GUID ); + + m_sortedTemplates.Remove( templateData ); + templateData.Destroy(); + } + + public void Destroy() + { + if( TemplatesManager.ShowDebugMessages ) + Debug.Log( "Destroy Manager" ); + if( m_availableTemplates != null ) + { + foreach( KeyValuePair kvp in m_availableTemplates ) + { + kvp.Value.Destroy(); + } + m_availableTemplates.Clear(); + m_availableTemplates = null; + } + int count = m_sortedTemplates.Count; + + for( int i = 0; i < count; i++ ) + { + ScriptableObject.DestroyImmediate( m_sortedTemplates[ i ] ); + } + + m_sortedTemplates.Clear(); + m_sortedTemplates = null; + + AvailableTemplateNames = null; + Initialized = false; + } + + public TemplateDataParent GetTemplate( int id ) + { + if( id < m_sortedTemplates.Count ) + return m_sortedTemplates[ id ]; + + return null; + } + + public TemplateDataParent GetTemplate( string guid ) + { + RefreshAvailableTemplates(); + if( m_availableTemplates == null && m_sortedTemplates != null ) + { + m_availableTemplates = new Dictionary(); + for( int i = 0; i < m_sortedTemplates.Count; i++ ) + { + m_availableTemplates.Add( m_sortedTemplates[ i ].GUID, m_sortedTemplates[ i ] ); + } + } + + if( m_availableTemplates.ContainsKey( guid ) ) + return m_availableTemplates[ guid ]; + + return null; + } + + + public TemplateDataParent GetTemplateByName( string name ) + { + RefreshAvailableTemplates(); + if( m_availableTemplates == null && m_sortedTemplates != null ) + { + m_availableTemplates = new Dictionary(); + for( int i = 0; i < m_sortedTemplates.Count; i++ ) + { + m_availableTemplates.Add( m_sortedTemplates[ i ].GUID, m_sortedTemplates[ i ] ); + } + } + + foreach( KeyValuePair kvp in m_availableTemplates ) + { + if( kvp.Value.DefaultShaderName.Equals( name ) ) + { + return kvp.Value; + } + } + return null; + } + + public TemplateDataParent CheckAndLoadTemplate( string guid ) + { + TemplateDataParent templateData = GetTemplate( guid ); + if( templateData == null ) + { + string datapath = AssetDatabase.GUIDToAssetPath( guid ); + string body = IOUtils.LoadTextFileFromDisk( datapath ); + + if( body.IndexOf( TemplatesManager.TemplateShaderNameBeginTag ) > -1 ) + { + templateData = ScriptableObject.CreateInstance(); + templateData.Init( string.Empty, guid, true ); + if( templateData.IsValid ) + { + AddTemplate( templateData ); + return templateData; + } + } + } + + return null; + } + + private void OnEnable() + { + if( !Initialized ) + { + Init(); + } + else + { + RefreshAvailableTemplates(); + } + hideFlags = HideFlags.HideAndDontSave; + if( ShowDebugMessages ) + Debug.Log( "On Enable Manager: " + this.GetInstanceID() ); + } + + public void ResetOptionsSetupData() + { + if( ShowDebugMessages ) + Debug.Log( "Reseting options setup data" ); + m_optionsInitialSetup.Clear(); + } + + public bool SetOptionsValue( string optionId, bool value ) + { + if( m_optionsInitialSetup.ContainsKey( optionId ) ) + { + m_optionsInitialSetup[ optionId ] = m_optionsInitialSetup[ optionId ] || value; + } + else + { + m_optionsInitialSetup.Add( optionId, value ); + } + return m_optionsInitialSetup[ optionId ]; + } + + public bool CheckIfDeprecated( string guid , out string newGUID ) + { + if( DeprecatedTemplates.ContainsKey( guid ) ) + { + UIUtils.ShowMessage( "Shader using deprecated template which no longer exists on ASE. Pointing to new correct one, options and connections to master node were reset." ); + newGUID = DeprecatedTemplates[ guid ]; + return true; + } + newGUID = string.Empty; + return false; + } + + public int TemplateCount { get { return m_sortedTemplates.Count; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatesManager.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatesManager.cs.meta new file mode 100644 index 0000000..b49d069 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatesManager.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9f0aacdb47cf3b94ebbe9e72af9d3cf1 +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatesStencilBufferModule.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatesStencilBufferModule.cs new file mode 100644 index 0000000..a8dd4d3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatesStencilBufferModule.cs @@ -0,0 +1,669 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + + [Serializable] + public sealed class TemplatesStencilBufferModule : TemplateModuleParent + { + private const string FoldoutLabelStr = " Stencil Buffer"; + private GUIContent ReferenceValueContent = new GUIContent( "Reference", "The value to be compared against (if Comparison is anything else than always) and/or the value to be written to the buffer (if either Pass, Fail or ZFail is set to replace)" ); + private GUIContent ReadMaskContent = new GUIContent( "Read Mask", "An 8 bit mask as an 0-255 integer, used when comparing the reference value with the contents of the buffer (referenceValue & readMask) comparisonFunction (stencilBufferValue & readMask)" ); + private GUIContent WriteMaskContent = new GUIContent( "Write Mask", "An 8 bit mask as an 0-255 integer, used when writing to the buffer" ); + private const string ComparisonStr = "Comparison"; + private const string PassStr = "Pass"; + private const string FailStr = "Fail"; + private const string ZFailStr = "ZFail"; + + private const string ComparisonFrontStr = "Comp. Front"; + private const string PassFrontStr = "Pass Front"; + private const string FailFrontStr = "Fail Front"; + private const string ZFailFrontStr = "ZFail Front"; + + private const string ComparisonBackStr = "Comp. Back"; + private const string PassBackStr = "Pass Back"; + private const string FailBackStr = "Fail Back"; + private const string ZFailBackStr = "ZFail Back"; + + private Dictionary m_comparisonDict = new Dictionary(); + private Dictionary m_stencilOpsDict = new Dictionary(); + + [SerializeField] + private bool m_active = true; + + [SerializeField] + private InlineProperty m_reference = new InlineProperty(); + + // Read Mask + private const int ReadMaskDefaultValue = 255; + [SerializeField] + private InlineProperty m_readMask = new InlineProperty( ReadMaskDefaultValue ); + + //Write Mask + private const int WriteMaskDefaultValue = 255; + [SerializeField] + private InlineProperty m_writeMask = new InlineProperty( WriteMaskDefaultValue ); + + //Comparison Function + private const int ComparisonDefaultValue = 0; + [SerializeField] + private InlineProperty m_comparisonFunctionFrontIdx = new InlineProperty( ComparisonDefaultValue ); + + [SerializeField] + private InlineProperty m_comparisonFunctionBackIdx = new InlineProperty( ComparisonDefaultValue ); + + //Pass Stencil Op + private const int PassStencilOpDefaultValue = 0; + [SerializeField] + private InlineProperty m_passStencilOpFrontIdx = new InlineProperty( PassStencilOpDefaultValue ); + + [SerializeField] + private InlineProperty m_passStencilOpBackIdx = new InlineProperty( PassStencilOpDefaultValue ); + + //Fail Stencil Op + private const int FailStencilOpDefaultValue = 0; + + [SerializeField] + private InlineProperty m_failStencilOpFrontIdx = new InlineProperty( FailStencilOpDefaultValue ); + + [SerializeField] + private InlineProperty m_failStencilOpBackIdx = new InlineProperty( FailStencilOpDefaultValue ); + + //ZFail Stencil Op + private const int ZFailStencilOpDefaultValue = 0; + [SerializeField] + private InlineProperty m_zFailStencilOpFrontIdx = new InlineProperty( ZFailStencilOpDefaultValue ); + + [SerializeField] + private InlineProperty m_zFailStencilOpBackIdx = new InlineProperty( ZFailStencilOpDefaultValue ); + + public TemplatesStencilBufferModule() : base("Stencil Buffer") + { + for( int i = 0; i < StencilBufferOpHelper.StencilComparisonValues.Length; i++ ) + { + m_comparisonDict.Add( StencilBufferOpHelper.StencilComparisonValues[ i ].ToLower(), i ); + } + + for( int i = 0; i < StencilBufferOpHelper.StencilOpsValues.Length; i++ ) + { + m_stencilOpsDict.Add( StencilBufferOpHelper.StencilOpsValues[ i ].ToLower(), i ); + } + } + + public void CopyFrom( TemplatesStencilBufferModule other , bool allData ) + { + if( allData ) + m_independentModule = other.IndependentModule; + + m_active = other.Active; + m_reference.CopyFrom( other.Reference ); + m_readMask.CopyFrom( other.ReadMask ); + m_writeMask.CopyFrom( other.WriteMask ); + m_comparisonFunctionFrontIdx.CopyFrom( other.ComparisonFunctionIdx ); + m_comparisonFunctionBackIdx.CopyFrom( other.ComparisonFunctionBackIdx ); + m_passStencilOpFrontIdx.CopyFrom( other.PassStencilOpIdx ); + m_passStencilOpBackIdx.CopyFrom( other.PassStencilOpBackIdx ); + m_failStencilOpFrontIdx.CopyFrom( other.FailStencilOpIdx ); + m_failStencilOpBackIdx.CopyFrom( other.FailStencilOpBackIdx ); + m_zFailStencilOpFrontIdx.CopyFrom( other.ZFailStencilOpIdx ); + m_zFailStencilOpBackIdx.CopyFrom( other.ZFailStencilOpBackIdx ); + } + + public void ConfigureFromTemplateData( TemplateStencilData stencilData ) + { + bool newValidData = ( stencilData.DataCheck == TemplateDataCheck.Valid ); + if( newValidData && m_validData != newValidData ) + { + m_active = stencilData.Active; + m_independentModule = stencilData.IndependentModule; + if( string.IsNullOrEmpty( stencilData.ReferenceInline ) ) + { + m_reference.IntValue = stencilData.Reference; + m_reference.ResetProperty(); + } + else + { + m_reference.SetInlineByName( stencilData.ReferenceInline ); + } + + if( string.IsNullOrEmpty( stencilData.ReadMaskInline ) ) + { + m_readMask.IntValue = stencilData.ReadMask; + m_readMask.ResetProperty(); + } + else + { + m_readMask.SetInlineByName( stencilData.ReadMaskInline ); + } + + if( string.IsNullOrEmpty( stencilData.WriteMaskInline ) ) + { + m_writeMask.IntValue = stencilData.WriteMask; + m_writeMask.ResetProperty(); + } + else + { + m_writeMask.SetInlineByName( stencilData.WriteMaskInline ); + } + + if( string.IsNullOrEmpty( stencilData.ComparisonFrontInline ) ) + { + if( !string.IsNullOrEmpty( stencilData.ComparisonFront ) ) + { + m_comparisonFunctionFrontIdx.IntValue = m_comparisonDict[ stencilData.ComparisonFront.ToLower() ]; + } + else + { + m_comparisonFunctionFrontIdx.IntValue = m_comparisonDict[ "always" ]; + } + m_comparisonFunctionFrontIdx.ResetProperty(); + } + else + { + m_comparisonFunctionFrontIdx.SetInlineByName( stencilData.ComparisonFrontInline ); + } + + if( string.IsNullOrEmpty( stencilData.PassFrontInline ) ) + { + if( !string.IsNullOrEmpty( stencilData.PassFront ) ) + { + m_passStencilOpFrontIdx.IntValue = m_stencilOpsDict[ stencilData.PassFront.ToLower() ]; + } + else + { + m_passStencilOpFrontIdx.IntValue = m_stencilOpsDict[ "keep" ]; + } + m_passStencilOpFrontIdx.ResetProperty(); + } + else + { + m_passStencilOpFrontIdx.SetInlineByName( stencilData.PassFrontInline ); + } + + if( string.IsNullOrEmpty( stencilData.FailFrontInline ) ) + { + if( !string.IsNullOrEmpty( stencilData.FailFront ) ) + { + m_failStencilOpFrontIdx.IntValue = m_stencilOpsDict[ stencilData.FailFront.ToLower() ]; + } + else + { + m_failStencilOpFrontIdx.IntValue = m_stencilOpsDict[ "keep" ]; + } + m_failStencilOpFrontIdx.ResetProperty(); + } + else + { + m_failStencilOpFrontIdx.SetInlineByName( stencilData.FailFrontInline ); + } + + if( string.IsNullOrEmpty( stencilData.ZFailFrontInline ) ) + { + if( !string.IsNullOrEmpty( stencilData.ZFailFront ) ) + { + m_zFailStencilOpFrontIdx.IntValue = m_stencilOpsDict[ stencilData.ZFailFront.ToLower() ]; + } + else + { + m_zFailStencilOpFrontIdx.IntValue = m_stencilOpsDict[ "keep" ]; + } + m_zFailStencilOpFrontIdx.ResetProperty(); + } + else + { + m_zFailStencilOpFrontIdx.SetInlineByName( stencilData.ZFailFrontInline ); + } + + if( string.IsNullOrEmpty( stencilData.ComparisonBackInline ) ) + { + if( !string.IsNullOrEmpty( stencilData.ComparisonBack ) ) + { + m_comparisonFunctionBackIdx.IntValue = m_comparisonDict[ stencilData.ComparisonBack.ToLower() ]; + } + else + { + m_comparisonFunctionBackIdx.IntValue = m_comparisonDict[ "always" ]; + } + m_comparisonFunctionBackIdx.ResetProperty(); + } + else + { + m_comparisonFunctionBackIdx.SetInlineByName( stencilData.ComparisonBackInline ); + } + + if( string.IsNullOrEmpty( stencilData.PassBackInline ) ) + { + + if( !string.IsNullOrEmpty( stencilData.PassBack ) ) + { + m_passStencilOpBackIdx.IntValue = m_stencilOpsDict[ stencilData.PassBack.ToLower() ]; + } + else + { + m_passStencilOpBackIdx.IntValue = m_stencilOpsDict[ "keep" ]; + } + m_passStencilOpBackIdx.ResetProperty(); + } + else + { + m_passStencilOpBackIdx.SetInlineByName( stencilData.PassBackInline ); + } + + if( string.IsNullOrEmpty( stencilData.FailBackInline ) ) + { + if( !string.IsNullOrEmpty( stencilData.FailBack ) ) + { + m_failStencilOpBackIdx.IntValue = m_stencilOpsDict[ stencilData.FailBack.ToLower() ]; + } + else + { + m_failStencilOpBackIdx.IntValue = m_stencilOpsDict[ "keep" ]; + } + m_failStencilOpBackIdx.ResetProperty(); + } + else + { + m_failStencilOpBackIdx.SetInlineByName( stencilData.FailBackInline ); + } + + + if( string.IsNullOrEmpty( stencilData.ZFailBackInline ) ) + { + if( !string.IsNullOrEmpty( stencilData.ZFailBack ) ) + { + m_zFailStencilOpBackIdx.IntValue = m_stencilOpsDict[ stencilData.ZFailBack.ToLower() ]; + } + else + { + m_zFailStencilOpBackIdx.IntValue = m_stencilOpsDict[ "keep" ]; + } + m_zFailStencilOpBackIdx.ResetProperty(); + } + else + { + m_zFailStencilOpBackIdx.SetInlineByName( stencilData.ZFailBackInline ); + } + } + m_validData = newValidData; + } + + public string CreateStencilOp( CullMode cullMode ) + { + if( !m_active ) + return string.Empty; + + string result = "Stencil\n{\n"; + result += string.Format( "\tRef {0}\n", m_reference.GetValueOrProperty() ); + if( m_readMask.IsValid || m_readMask.IntValue != ReadMaskDefaultValue ) + { + result += string.Format( "\tReadMask {0}\n", m_readMask.GetValueOrProperty() ); + } + + if( m_writeMask.IsValid || m_writeMask.IntValue != WriteMaskDefaultValue ) + { + result += string.Format( "\tWriteMask {0}\n", m_writeMask.GetValueOrProperty() ); + } + + if( cullMode == CullMode.Off && + ( m_comparisonFunctionBackIdx.IsValid || m_comparisonFunctionBackIdx.IntValue != ComparisonDefaultValue || + m_passStencilOpBackIdx.IsValid || m_passStencilOpBackIdx.IntValue != PassStencilOpDefaultValue || + m_failStencilOpBackIdx.IsValid || m_failStencilOpBackIdx.IntValue != FailStencilOpDefaultValue || + m_zFailStencilOpBackIdx.IsValid || m_zFailStencilOpBackIdx.IntValue != ZFailStencilOpDefaultValue ) ) + { + if( m_comparisonFunctionFrontIdx.IsValid || m_comparisonFunctionFrontIdx.IntValue != ComparisonDefaultValue ) + result += string.Format( "\tCompFront {0}\n", m_comparisonFunctionFrontIdx.GetValueOrProperty( StencilBufferOpHelper.StencilComparisonValues[ m_comparisonFunctionFrontIdx.IntValue ] ) ); + + if( m_passStencilOpFrontIdx.IsValid || m_passStencilOpFrontIdx.IntValue != PassStencilOpDefaultValue ) + result += string.Format( "\tPassFront {0}\n", m_passStencilOpFrontIdx.GetValueOrProperty( StencilBufferOpHelper.StencilOpsValues[ m_passStencilOpFrontIdx.IntValue ] ) ); + + if( m_failStencilOpFrontIdx.IsValid || m_failStencilOpFrontIdx.IntValue != FailStencilOpDefaultValue ) + result += string.Format( "\tFailFront {0}\n", m_failStencilOpFrontIdx.GetValueOrProperty( StencilBufferOpHelper.StencilOpsValues[ m_failStencilOpFrontIdx.IntValue ] ) ); + + if( m_zFailStencilOpFrontIdx.IsValid || m_zFailStencilOpFrontIdx.IntValue != ZFailStencilOpDefaultValue ) + result += string.Format( "\tZFailFront {0}\n", m_zFailStencilOpFrontIdx.GetValueOrProperty( StencilBufferOpHelper.StencilOpsValues[ m_zFailStencilOpFrontIdx.IntValue ] ) ); + + if( m_comparisonFunctionBackIdx.IsValid || m_comparisonFunctionBackIdx.IntValue != ComparisonDefaultValue ) + result += string.Format( "\tCompBack {0}\n", m_comparisonFunctionBackIdx.GetValueOrProperty( StencilBufferOpHelper.StencilComparisonValues[ m_comparisonFunctionBackIdx.IntValue ] ) ); + + if( m_passStencilOpBackIdx.IsValid || m_passStencilOpBackIdx.IntValue != PassStencilOpDefaultValue ) + result += string.Format( "\tPassBack {0}\n", m_passStencilOpBackIdx.GetValueOrProperty( StencilBufferOpHelper.StencilOpsValues[ m_passStencilOpBackIdx.IntValue ] ) ); + + if( m_failStencilOpBackIdx.IsValid || m_failStencilOpBackIdx.IntValue != FailStencilOpDefaultValue ) + result += string.Format( "\tFailBack {0}\n", m_failStencilOpBackIdx.GetValueOrProperty( StencilBufferOpHelper.StencilOpsValues[ m_failStencilOpBackIdx.IntValue ] )); + + if( m_zFailStencilOpBackIdx.IsValid || m_zFailStencilOpBackIdx.IntValue != ZFailStencilOpDefaultValue ) + result += string.Format( "\tZFailBack {0}\n", m_zFailStencilOpBackIdx.GetValueOrProperty( StencilBufferOpHelper.StencilOpsValues[ m_zFailStencilOpBackIdx.IntValue ] )); + } + else + { + if( m_comparisonFunctionFrontIdx.IsValid || m_comparisonFunctionFrontIdx.IntValue != ComparisonDefaultValue ) + result += string.Format( "\tComp {0}\n", m_comparisonFunctionFrontIdx.GetValueOrProperty(StencilBufferOpHelper.StencilComparisonValues[ m_comparisonFunctionFrontIdx.IntValue ] )); + if( m_passStencilOpFrontIdx.IsValid || m_passStencilOpFrontIdx.IntValue != PassStencilOpDefaultValue ) + result += string.Format( "\tPass {0}\n", m_passStencilOpFrontIdx.GetValueOrProperty( StencilBufferOpHelper.StencilOpsValues[ m_passStencilOpFrontIdx.IntValue ] )); + if( m_failStencilOpFrontIdx.IsValid || m_failStencilOpFrontIdx.IntValue != FailStencilOpDefaultValue ) + result += string.Format( "\tFail {0}\n", m_failStencilOpFrontIdx.GetValueOrProperty( StencilBufferOpHelper.StencilOpsValues[ m_failStencilOpFrontIdx.IntValue ] )); + if( m_zFailStencilOpFrontIdx.IsValid || m_zFailStencilOpFrontIdx.IntValue != ZFailStencilOpDefaultValue ) + result += string.Format( "\tZFail {0}\n", m_zFailStencilOpFrontIdx.GetValueOrProperty(StencilBufferOpHelper.StencilOpsValues[ m_zFailStencilOpFrontIdx.IntValue ] )); + } + + result += "}"; + return result; + } + + public override void ShowUnreadableDataMessage( ParentNode owner ) + { + bool foldout = owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedStencilOptions; + NodeUtils.DrawPropertyGroup( ref foldout, FoldoutLabelStr, base.ShowUnreadableDataMessage ); + owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedStencilOptions = foldout; + } + + public void Draw( UndoParentNode owner, CullMode cullMode , bool style = true ) + { + bool foldout = owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedStencilOptions; + if( style ) + { + NodeUtils.DrawPropertyGroup( ref foldout, FoldoutLabelStr, () => + { + DrawBlock( owner, cullMode ); + } ); + } + else + { + NodeUtils.DrawNestedPropertyGroup( owner, ref foldout, ref m_active, FoldoutLabelStr, () => + { + DrawBlock( owner, cullMode ); + } ); + } + owner.ContainerGraph.ParentWindow.InnerWindowVariables.ExpandedStencilOptions = foldout; + } + + void DrawBlock( UndoParentNode owner, CullMode cullMode ) + { + bool guiEnabled = GUI.enabled; + GUI.enabled = m_active; + EditorGUI.BeginChangeCheck(); + { + var cache = EditorGUIUtility.labelWidth; + EditorGUIUtility.labelWidth = EditorGUIUtility.labelWidth - 20; + m_reference.IntSlider( ref owner, ReferenceValueContent, 0, 255 ); + m_readMask.IntSlider( ref owner, ReadMaskContent, 0, 255 ); + m_writeMask.IntSlider( ref owner, WriteMaskContent, 0, 255 ); + if( cullMode == CullMode.Off ) + { + m_comparisonFunctionFrontIdx.EnumTypePopup( ref owner, ComparisonFrontStr, StencilBufferOpHelper.StencilComparisonLabels ); + m_passStencilOpFrontIdx.EnumTypePopup( ref owner, PassFrontStr, StencilBufferOpHelper.StencilOpsLabels ); + m_failStencilOpFrontIdx.EnumTypePopup( ref owner, FailFrontStr, StencilBufferOpHelper.StencilOpsLabels ); + m_zFailStencilOpFrontIdx.EnumTypePopup( ref owner, ZFailFrontStr, StencilBufferOpHelper.StencilOpsLabels ); + EditorGUILayout.Separator(); + m_comparisonFunctionBackIdx.EnumTypePopup( ref owner, ComparisonBackStr, StencilBufferOpHelper.StencilComparisonLabels ); + m_passStencilOpBackIdx.EnumTypePopup( ref owner, PassBackStr, StencilBufferOpHelper.StencilOpsLabels ); + m_failStencilOpBackIdx.EnumTypePopup( ref owner, FailBackStr, StencilBufferOpHelper.StencilOpsLabels ); + m_zFailStencilOpBackIdx.EnumTypePopup( ref owner, ZFailBackStr, StencilBufferOpHelper.StencilOpsLabels ); + } + else + { + m_comparisonFunctionFrontIdx.EnumTypePopup( ref owner, ComparisonStr, StencilBufferOpHelper.StencilComparisonLabels ); + m_passStencilOpFrontIdx.EnumTypePopup( ref owner, PassFrontStr, StencilBufferOpHelper.StencilOpsLabels ); + m_failStencilOpFrontIdx.EnumTypePopup( ref owner, FailFrontStr, StencilBufferOpHelper.StencilOpsLabels ); + m_zFailStencilOpFrontIdx.EnumTypePopup( ref owner, ZFailFrontStr, StencilBufferOpHelper.StencilOpsLabels ); + } + + EditorGUIUtility.labelWidth = cache; + } + if( EditorGUI.EndChangeCheck() ) + { + m_isDirty = true; + CustomEdited = true; + } + GUI.enabled = guiEnabled; + } + + public override void ReadFromString( ref uint index, ref string[] nodeParams ) + { + base.ReadFromString( ref index, ref nodeParams ); + bool validDataOnMeta = m_validData; + if( UIUtils.CurrentShaderVersion() > TemplatesManager.MPShaderVersion ) + { + validDataOnMeta = Convert.ToBoolean( nodeParams[ index++ ] ); + } + + if( validDataOnMeta ) + { + if( UIUtils.CurrentShaderVersion() > 15307 ) + { + m_active = Convert.ToBoolean( nodeParams[ index++ ] ); + } + + if( UIUtils.CurrentShaderVersion() < 15304 ) + { + m_reference.IntValue = Convert.ToInt32( nodeParams[ index++ ] ); + m_readMask.IntValue = Convert.ToInt32( nodeParams[ index++ ] ); + m_writeMask.IntValue = Convert.ToInt32( nodeParams[ index++ ] ); + m_comparisonFunctionFrontIdx.IntValue = Convert.ToInt32( nodeParams[ index++ ] ); + m_passStencilOpFrontIdx.IntValue = Convert.ToInt32( nodeParams[ index++ ] ); + m_failStencilOpFrontIdx.IntValue = Convert.ToInt32( nodeParams[ index++ ] ); + m_zFailStencilOpFrontIdx.IntValue = Convert.ToInt32( nodeParams[ index++ ] ); + m_comparisonFunctionBackIdx.IntValue = Convert.ToInt32( nodeParams[ index++ ] ); + m_passStencilOpBackIdx.IntValue = Convert.ToInt32( nodeParams[ index++ ] ); + m_failStencilOpBackIdx.IntValue = Convert.ToInt32( nodeParams[ index++ ] ); + m_zFailStencilOpBackIdx.IntValue = Convert.ToInt32( nodeParams[ index++ ] ); + } + else + { + m_reference.ReadFromString( ref index, ref nodeParams ); + m_readMask.ReadFromString( ref index, ref nodeParams ); + m_writeMask.ReadFromString( ref index, ref nodeParams ); + m_comparisonFunctionFrontIdx.ReadFromString( ref index, ref nodeParams ); + m_passStencilOpFrontIdx.ReadFromString( ref index, ref nodeParams ); + m_failStencilOpFrontIdx.ReadFromString( ref index, ref nodeParams ); + m_zFailStencilOpFrontIdx.ReadFromString( ref index, ref nodeParams ); + m_comparisonFunctionBackIdx.ReadFromString( ref index, ref nodeParams ); + m_passStencilOpBackIdx.ReadFromString( ref index, ref nodeParams ); + m_failStencilOpBackIdx.ReadFromString( ref index, ref nodeParams ); + m_zFailStencilOpBackIdx.ReadFromString( ref index, ref nodeParams ); + } + + } + } + + public override void WriteToString( ref string nodeInfo ) + { + base.WriteToString( ref nodeInfo ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_validData ); + if( m_validData ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_active ); + m_reference.WriteToString( ref nodeInfo ); + m_readMask.WriteToString( ref nodeInfo ); + m_writeMask.WriteToString( ref nodeInfo ); + m_comparisonFunctionFrontIdx.WriteToString( ref nodeInfo ); + m_passStencilOpFrontIdx.WriteToString( ref nodeInfo ); + m_failStencilOpFrontIdx.WriteToString( ref nodeInfo ); + m_zFailStencilOpFrontIdx.WriteToString( ref nodeInfo ); + m_comparisonFunctionBackIdx.WriteToString( ref nodeInfo ); + m_passStencilOpBackIdx.WriteToString( ref nodeInfo ); + m_failStencilOpBackIdx.WriteToString( ref nodeInfo ); + m_zFailStencilOpBackIdx.WriteToString( ref nodeInfo ); + } + } + + public override void Destroy() + { + m_comparisonDict.Clear(); + m_comparisonDict = null; + + m_stencilOpsDict.Clear(); + m_stencilOpsDict = null; + + m_reference = null; + m_readMask = null; + m_writeMask = null; + m_comparisonFunctionFrontIdx = null; + m_passStencilOpFrontIdx = null; + m_failStencilOpFrontIdx = null; + m_zFailStencilOpFrontIdx = null; + m_comparisonFunctionBackIdx = null; + m_passStencilOpBackIdx = null; + m_failStencilOpBackIdx = null; + m_zFailStencilOpBackIdx = null; + } + public bool Active { get { return m_active; } } + public InlineProperty Reference { get { return m_reference; } } + public InlineProperty ReadMask { get { return m_readMask; } } + public InlineProperty WriteMask { get { return m_writeMask; } } + public InlineProperty ComparisonFunctionIdx { get { return m_comparisonFunctionFrontIdx; } } + public InlineProperty ComparisonFunctionBackIdx { get { return m_comparisonFunctionBackIdx; } } + public InlineProperty PassStencilOpIdx { get { return m_passStencilOpFrontIdx; } } + public InlineProperty PassStencilOpBackIdx { get { return m_passStencilOpBackIdx; } } + public InlineProperty FailStencilOpIdx { get { return m_failStencilOpFrontIdx; } } + public InlineProperty FailStencilOpBackIdx { get { return m_failStencilOpBackIdx; } } + public InlineProperty ZFailStencilOpIdx { get { return m_zFailStencilOpFrontIdx; } } + public InlineProperty ZFailStencilOpBackIdx { get { return m_zFailStencilOpBackIdx; } } + + + public int ReferenceValue + { + set + { + m_reference.IntValue = value; + m_reference.Active = false; + } + get + { + return m_reference.IntValue; + } + } + + public int ReadMaskValue + { + set + { + m_readMask.IntValue = value; + m_reference.Active = false; + } + get + { + return m_readMask.IntValue; + } + } + + public int WriteMaskValue + { + set + { + m_writeMask.IntValue = value; + m_writeMask.Active = false; + } + get + { + return m_writeMask.IntValue; + } + } + + public int ComparisonFunctionIdxValue + { + set + { + m_comparisonFunctionFrontIdx.IntValue = value; + m_comparisonFunctionFrontIdx.Active = false; + } + get + { + return m_comparisonFunctionFrontIdx.IntValue; + } + } + + public int ComparisonFunctionBackIdxValue + { + set + { + m_comparisonFunctionBackIdx.IntValue = value; + m_comparisonFunctionBackIdx.Active = false; + } + get + { + return m_comparisonFunctionBackIdx.IntValue; + } + } + + public int PassStencilOpIdxValue + { + set + { + m_passStencilOpFrontIdx.IntValue = value; + m_passStencilOpFrontIdx.Active = false; + } + get + { + return m_passStencilOpFrontIdx.IntValue; + } + } + + public int PassStencilOpBackIdxValue + { + set + { + m_passStencilOpBackIdx.IntValue = value; + m_passStencilOpBackIdx.Active = false; + } + get + { + return m_passStencilOpBackIdx.IntValue; + } + } + + public int FailStencilOpIdxValue + { + set + { + m_failStencilOpFrontIdx.IntValue = value; + m_failStencilOpFrontIdx.Active = false; + } + get + { + return m_failStencilOpFrontIdx.IntValue; + } + } + public int FailStencilOpBackIdxValue + { + set + { + m_failStencilOpBackIdx.IntValue = value; + m_failStencilOpBackIdx.Active = false; + } + get + { + return m_failStencilOpBackIdx.IntValue; + } + } + + public int ZFailStencilOpIdxValue + { + set + { + m_zFailStencilOpFrontIdx.IntValue = value; + m_zFailStencilOpFrontIdx.Active = false; + } + get + { + return m_zFailStencilOpFrontIdx.IntValue; + } + } + + public int ZFailStencilOpBackIdxValue + { + set + { + m_zFailStencilOpBackIdx.IntValue = value; + m_zFailStencilOpBackIdx.Active = false; + } + get + { + return m_zFailStencilOpBackIdx.IntValue; + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatesStencilBufferModule.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatesStencilBufferModule.cs.meta new file mode 100644 index 0000000..552dbaf --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Templates/TemplatesStencilBufferModule.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: fa41b984209fa624aa1fdea5949d9d59 +timeCreated: 1511548974 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils.meta new file mode 100644 index 0000000..f81a149 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 77f9dcd6b7a403a47b926073779ee42f +folderAsset: yes +timeCreated: 1481126944 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ASEPPSHelperTool.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ASEPPSHelperTool.cs new file mode 100644 index 0000000..782980f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ASEPPSHelperTool.cs @@ -0,0 +1,464 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +using System; +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +//using UnityEngine.Rendering.PostProcessing; + + +namespace AmplifyShaderEditor +{ + public enum ASEPostProcessEvent + { + BeforeTransparent = 0, + BeforeStack = 1, + AfterStack = 2 + } + + [Serializable] + public class ASEPPSHelperBuffer + { + public string Name; + public string Tooltip; + } + + [Serializable] + public class ASEPPSHelperTool : EditorWindow + { + private const string PPSFullTemplate = + "// Amplify Shader Editor - Visual Shader Editing Tool\n" + + "// Copyright (c) Amplify Creations, Lda \n" + + "#if UNITY_POST_PROCESSING_STACK_V2\n" + + "using System;\n" + + "using UnityEngine;\n" + + "using UnityEngine.Rendering.PostProcessing;\n" + + "\n" + + "[Serializable]\n" + + "[PostProcess( typeof( /*PPSRendererClass*/ ), PostProcessEvent./*PPSEventType*/, \"/*PPSMenuEntry*/\", /*AllowInSceneView*/ )]\n" + + "public sealed class /*PPSSettingsClass*/ : PostProcessEffectSettings\n" + + "{\n" + + "/*PPSPropertiesDeclaration*/" + + "}\n" + + "\n" + + "public sealed class /*PPSRendererClass*/ : PostProcessEffectRenderer\n" + + "{\n" + + "\tpublic override void Render( PostProcessRenderContext context )\n" + + "\t{\n" + + "\t\tvar sheet = context.propertySheets.Get( Shader.Find( \"/*PPSShader*/\" ) );\n" + + "/*PPSPropertySet*/" + + "\t\tcontext.command.BlitFullscreenTriangle( context.source, context.destination, sheet, 0 );\n" + + "\t}\n" + + "}\n" + + "#endif\n"; + + private const string PPSEventType = "/*PPSEventType*/"; + private const string PPSRendererClass = "/*PPSRendererClass*/"; + private const string PPSSettingsClass = "/*PPSSettingsClass*/"; + private const string PPSMenuEntry = "/*PPSMenuEntry*/"; + private const string PPSAllowInSceneView = "/*AllowInSceneView*/"; + private const string PPSShader = "/*PPSShader*/"; + private const string PPSPropertiesDecl = "/*PPSPropertiesDeclaration*/"; + private const string PPSPropertySet = "/*PPSPropertySet*/"; + + public static readonly string PPSPropertySetFormat = "\t\tsheet.properties.{0}( \"{1}\", settings.{1} );\n"; + public static readonly string PPSPropertySetNullPointerCheckFormat = "\t\tif(settings.{1}.value != null) sheet.properties.{0}( \"{1}\", settings.{1} );\n"; + public static readonly string PPSPropertyDecFormat = + "\t[{0}Tooltip( \"{1}\" )]\n" + + "\tpublic {2} {3} = new {2} {{ {4} }};\n"; + public static readonly Dictionary WireToPPSType = new Dictionary() + { + { WirePortDataType.FLOAT,"FloatParameter"}, + { WirePortDataType.FLOAT2,"Vector4Parameter"}, + { WirePortDataType.FLOAT3,"Vector4Parameter"}, + { WirePortDataType.FLOAT4,"Vector4Parameter"}, + { WirePortDataType.COLOR,"ColorParameter"}, + { WirePortDataType.SAMPLER1D,"TextureParameter"}, + { WirePortDataType.SAMPLER2D,"TextureParameter"}, + { WirePortDataType.SAMPLER3D,"TextureParameter"}, + { WirePortDataType.SAMPLERCUBE,"TextureParameter"}, + { WirePortDataType.SAMPLER2DARRAY,"TextureParameter"} + }; + + public static readonly Dictionary WireToPPSValueSet = new Dictionary() + { + { WirePortDataType.FLOAT,"SetFloat"}, + { WirePortDataType.FLOAT2,"SetVector"}, + { WirePortDataType.FLOAT3,"SetVector"}, + { WirePortDataType.FLOAT4,"SetVector"}, + { WirePortDataType.COLOR,"SetColor"}, + { WirePortDataType.SAMPLER1D, "SetTexture"}, + { WirePortDataType.SAMPLER2D, "SetTexture"}, + { WirePortDataType.SAMPLER3D, "SetTexture"}, + { WirePortDataType.SAMPLERCUBE,"SetTexture"}, + { WirePortDataType.SAMPLER2DARRAY,"SetTexture"} + }; + + public static readonly Dictionary ShaderPropertyToPPSType = new Dictionary() + { + { UnityEditor.ShaderUtil.ShaderPropertyType.Float,"FloatParameter"}, + { UnityEditor.ShaderUtil.ShaderPropertyType.Range,"FloatParameter"}, + { UnityEditor.ShaderUtil.ShaderPropertyType.Vector,"Vector4Parameter"}, + { UnityEditor.ShaderUtil.ShaderPropertyType.Color,"ColorParameter"}, + { UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv,"TextureParameter"} + }; + + + public static readonly Dictionary ShaderPropertyToPPSSet = new Dictionary() + { + { UnityEditor.ShaderUtil.ShaderPropertyType.Float,"SetFloat"}, + { UnityEditor.ShaderUtil.ShaderPropertyType.Range,"SetFloat"}, + { UnityEditor.ShaderUtil.ShaderPropertyType.Vector,"SetVector"}, + { UnityEditor.ShaderUtil.ShaderPropertyType.Color,"SetColor"}, + { UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv,"SetTexture"} + }; + + private Dictionary m_excludedProperties = new Dictionary + { + { "_texcoord",true }, + { "__dirty",true} + }; + + private Material m_dummyMaterial = null; + + private DragAndDropTool m_dragAndDropTool; + private Rect m_draggableArea; + + [SerializeField] + private string m_rendererClassName = "PPSRenderer"; + + [SerializeField] + private string m_settingsClassName = "PPSSettings"; + + [SerializeField] + private string m_folderPath = "Assets/"; + + [SerializeField] + private string m_menuEntry = string.Empty; + + [SerializeField] + private bool m_allowInSceneView = true; + + [SerializeField] + private ASEPostProcessEvent m_eventType = ASEPostProcessEvent.AfterStack; + + [SerializeField] + private Shader m_currentShader = null; + + [SerializeField] + private List m_tooltips = new List(); + + [SerializeField] + private bool m_tooltipsFoldout = true; + + private GUIStyle m_contentStyle = null; + private GUIStyle m_pathButtonStyle = null; + private GUIContent m_pathButtonContent = new GUIContent(); + private Vector2 m_scrollPos = Vector2.zero; + + [MenuItem( "Window/Amplify Shader Editor/Post-Processing Stack Tool", false, 1001 )] + static void ShowWindow() + { + ASEPPSHelperTool window = EditorWindow.GetWindow(); + window.titleContent.text = "Post-Processing Stack Tool"; + window.minSize = new Vector2( 302, 350 ); + window.Show(); + } + + void FetchTooltips() + { + m_tooltips.Clear(); + int propertyCount = UnityEditor.ShaderUtil.GetPropertyCount( m_currentShader ); + for( int i = 0; i < propertyCount; i++ ) + { + //UnityEditor.ShaderUtil.ShaderPropertyType type = UnityEditor.ShaderUtil.GetPropertyType( m_currentShader, i ); + string name = UnityEditor.ShaderUtil.GetPropertyName( m_currentShader, i ); + string description = UnityEditor.ShaderUtil.GetPropertyDescription( m_currentShader, i ); + + if( m_excludedProperties.ContainsKey( name )) + continue; + + m_tooltips.Add( new ASEPPSHelperBuffer { Name = name, Tooltip = description } ); + } + } + + void OnGUI() + { + if( m_pathButtonStyle == null ) + m_pathButtonStyle = "minibutton"; + + m_scrollPos = EditorGUILayout.BeginScrollView( m_scrollPos, GUILayout.Height( position.height ) ); + + EditorGUILayout.BeginVertical( m_contentStyle ); + EditorGUI.BeginChangeCheck(); + m_currentShader = EditorGUILayout.ObjectField( "Shader", m_currentShader, typeof( Shader ), false ) as Shader; + if( EditorGUI.EndChangeCheck() ) + { + GetInitialInfo( m_currentShader ); + } + + EditorGUILayout.Separator(); + EditorGUILayout.LabelField( "Path and Filename" ); + EditorGUILayout.BeginHorizontal(); + m_pathButtonContent.text = m_folderPath; + Vector2 buttonSize = m_pathButtonStyle.CalcSize( m_pathButtonContent ); + if( GUILayout.Button( m_pathButtonContent, m_pathButtonStyle, GUILayout.MaxWidth( Mathf.Min( position.width * 0.5f, buttonSize.x ) ) ) ) + { + string folderpath = EditorUtility.OpenFolderPanel( "Save Texture Array to folder", "Assets/", "" ); + folderpath = FileUtil.GetProjectRelativePath( folderpath ); + if( string.IsNullOrEmpty( folderpath ) ) + m_folderPath = "Assets/"; + else + m_folderPath = folderpath + "/"; + } + + m_settingsClassName = EditorGUILayout.TextField( m_settingsClassName, GUILayout.ExpandWidth( true ) ); + + EditorGUILayout.LabelField( ".cs", GUILayout.MaxWidth( 40 ) ); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.HelpBox( "The path for the generated script should be outside of Amplify Shader Editor folder structure due to use of Assembly Definition files which will conflict and prevent to compile correctly.", MessageType.Warning ); + + EditorGUILayout.Separator(); + + m_menuEntry = EditorGUILayout.TextField( "Name", m_menuEntry ); + + EditorGUILayout.Separator(); + + m_allowInSceneView = EditorGUILayout.Toggle( "Allow In Scene View", m_allowInSceneView ); + + EditorGUILayout.Separator(); + + m_eventType = (ASEPostProcessEvent)EditorGUILayout.EnumPopup( "Event Type", m_eventType ); + + EditorGUILayout.Separator(); + + m_tooltipsFoldout = EditorGUILayout.Foldout( m_tooltipsFoldout, "Tooltips" ); + if( m_tooltipsFoldout ) + { + EditorGUI.indentLevel++; + for( int i = 0; i < m_tooltips.Count; i++ ) + { + m_tooltips[ i ].Tooltip = EditorGUILayout.TextField( m_tooltips[ i ].Name, m_tooltips[ i ].Tooltip ); + } + EditorGUI.indentLevel--; + } + + EditorGUILayout.Separator(); + + if( GUILayout.Button( "Build" ) ) + { + System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture; + string propertiesDecl = string.Empty; + string propertiesSet = string.Empty; + GetShaderInfoFromShaderAsset( ref propertiesDecl, ref propertiesSet ); + string template = PPSFullTemplate; + template = template.Replace( PPSRendererClass, m_rendererClassName ); + template = template.Replace( PPSSettingsClass, m_settingsClassName ); + template = template.Replace( PPSEventType, m_eventType.ToString() ); + template = template.Replace( PPSPropertiesDecl, propertiesDecl ); + template = template.Replace( PPSPropertySet, propertiesSet ); + template = template.Replace( PPSMenuEntry, m_menuEntry ); + template = template.Replace( PPSAllowInSceneView, m_allowInSceneView?"true":"false" ); + template = template.Replace( PPSShader, m_currentShader.name ); + string path = m_folderPath + m_settingsClassName + ".cs"; + IOUtils.SaveTextfileToDisk( template, path, false ); + System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture; + AssetDatabase.Refresh(); + } + + EditorGUILayout.EndVertical(); + EditorGUILayout.EndScrollView(); + m_draggableArea.size = position.size; + m_dragAndDropTool.TestDragAndDrop( m_draggableArea ); + } + + public void GetShaderInfoFromASE( ref string propertiesDecl, ref string propertiesSet ) + { + List properties = UIUtils.CurrentWindow.OutsideGraph.PropertyNodes.NodesList; + int propertyCount = properties.Count; + for( int i = 0; i < propertyCount; i++ ) + { + properties[ i ].GeneratePPSInfo( ref propertiesDecl, ref propertiesSet ); + } + } + + public void GetShaderInfoFromShaderAsset( ref string propertiesDecl, ref string propertiesSet ) + { + bool fetchInitialInfo = false; + if( m_currentShader == null ) + { + Material mat = Selection.activeObject as Material; + if( mat != null ) + { + m_currentShader = mat.shader; + } + else + { + m_currentShader = Selection.activeObject as Shader; + } + fetchInitialInfo = true; + } + + if( m_currentShader != null ) + { + if( fetchInitialInfo ) + GetInitialInfo( m_currentShader ); + + if( m_dummyMaterial == null ) + { + m_dummyMaterial = new Material( m_currentShader ); + } + else + { + m_dummyMaterial.shader = m_currentShader; + } + + int propertyCount = UnityEditor.ShaderUtil.GetPropertyCount( m_currentShader ); + //string allProperties = string.Empty; + int validIds = 0; + for( int i = 0; i < propertyCount; i++ ) + { + UnityEditor.ShaderUtil.ShaderPropertyType type = UnityEditor.ShaderUtil.GetPropertyType( m_currentShader, i ); + string name = UnityEditor.ShaderUtil.GetPropertyName( m_currentShader, i ); + //string description = UnityEditor.ShaderUtil.GetPropertyDescription( m_currentShader, i ); + if( m_excludedProperties.ContainsKey( name )) + continue; + + string defaultValue = string.Empty; + bool nullPointerCheck = false; + switch( type ) + { + case UnityEditor.ShaderUtil.ShaderPropertyType.Color: + { + Color value = m_dummyMaterial.GetColor( name ); + defaultValue = string.Format( "value = new Color({0}f,{1}f,{2}f,{3}f)", value.r, value.g, value.b, value.a ); + } + break; + case UnityEditor.ShaderUtil.ShaderPropertyType.Vector: + { + Vector4 value = m_dummyMaterial.GetVector( name ); + defaultValue = string.Format( "value = new Vector4({0}f,{1}f,{2}f,{3}f)", value.x, value.y, value.z, value.w ); + } + break; + case UnityEditor.ShaderUtil.ShaderPropertyType.Float: + { + float value = m_dummyMaterial.GetFloat( name ); + defaultValue = "value = " + value + "f"; + } + break; + case UnityEditor.ShaderUtil.ShaderPropertyType.Range: + { + float value = m_dummyMaterial.GetFloat( name ); + defaultValue = "value = " + value + "f"; + } + break; + case UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv: + { + nullPointerCheck = true; + } + break; + } + + propertiesDecl += string.Format( PPSPropertyDecFormat, string.Empty, m_tooltips[ validIds ].Tooltip, ShaderPropertyToPPSType[ type ], name, defaultValue ); + propertiesSet += string.Format( nullPointerCheck ? PPSPropertySetNullPointerCheckFormat : PPSPropertySetFormat, ShaderPropertyToPPSSet[ type ], name ); + validIds++; + } + + } + } + + private void GetInitialInfo() + { + MasterNode masterNode = UIUtils.CurrentWindow.OutsideGraph.CurrentMasterNode; + m_menuEntry = masterNode.ShaderName.Replace( "Hidden/", string.Empty ).Replace( ".shader", string.Empty ); + string name = m_menuEntry; + m_rendererClassName = name + "PPSRenderer"; + m_settingsClassName = name + "PPSSettings"; + m_folderPath = "Assets/"; + } + + private void GetInitialInfo( Shader shader ) + { + if( shader == null ) + { + m_scrollPos = Vector2.zero; + m_menuEntry = string.Empty; + m_rendererClassName = "PPSRenderer"; + m_settingsClassName = "PPSSettings"; + m_folderPath = "Assets/"; + m_tooltips.Clear(); + return; + } + + m_menuEntry = shader.name.Replace( "Hidden/", string.Empty ).Replace( ".shader", string.Empty ); + m_menuEntry = UIUtils.RemoveInvalidCharacters( m_menuEntry ); + string name = m_menuEntry.Replace( "/", string.Empty ); + m_rendererClassName = name + "PPSRenderer"; + m_settingsClassName = name + "PPSSettings"; + m_folderPath = AssetDatabase.GetAssetPath( shader ); + m_folderPath = m_folderPath.Replace( System.IO.Path.GetFileName( m_folderPath ), string.Empty ); + + FetchTooltips(); + } + + public void OnValidObjectsDropped( UnityEngine.Object[] droppedObjs ) + { + for( int objIdx = 0; objIdx < droppedObjs.Length; objIdx++ ) + { + Material mat = droppedObjs[ objIdx ] as Material; + if( mat != null ) + { + m_currentShader = mat.shader; + GetInitialInfo( mat.shader ); + return; + } + else + { + Shader shader = droppedObjs[ objIdx ] as Shader; + if( shader != null ) + { + m_currentShader = shader; + GetInitialInfo( shader ); + return; + } + } + } + } + + private void OnEnable() + { + m_draggableArea = new Rect( 0, 0, 1, 1 ); + m_dragAndDropTool = new DragAndDropTool(); + m_dragAndDropTool.OnValidDropObjectEvt += OnValidObjectsDropped; + + if( m_contentStyle == null ) + { + m_contentStyle = new GUIStyle( GUIStyle.none ); + m_contentStyle.margin = new RectOffset( 6, 4, 5, 5 ); + } + + m_pathButtonStyle = null; + + //GetInitialInfo(); + } + + private void OnDestroy() + { + if( m_dummyMaterial != null ) + { + GameObject.DestroyImmediate( m_dummyMaterial ); + m_dummyMaterial = null; + } + + m_dragAndDropTool.Destroy(); + m_dragAndDropTool = null; + + m_tooltips.Clear(); + m_tooltips = null; + + m_contentStyle = null; + m_pathButtonStyle = null; + m_currentShader = null; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ASEPPSHelperTool.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ASEPPSHelperTool.cs.meta new file mode 100644 index 0000000..581a622 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ASEPPSHelperTool.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ccaa3765dae023d4b8657544c1aeef4a +timeCreated: 1550254201 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ASEPackageManagerHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ASEPackageManagerHelper.cs new file mode 100644 index 0000000..60d523d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ASEPackageManagerHelper.cs @@ -0,0 +1,679 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +#if UNITY_2018_3_OR_NEWER +using System; +using UnityEngine; +using UnityEditor; +using UnityEditor.PackageManager.Requests; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +namespace AmplifyShaderEditor +{ + public enum ASESRPVersions + { + ASE_SRP_3_0_0 = 030000, + ASE_SRP_3_1_0 = 030100, + ASE_SRP_3_3_0 = 030300, + ASE_SRP_4_1_0 = 040100, + ASE_SRP_4_2_0 = 040200, + ASE_SRP_4_3_0 = 040300, + ASE_SRP_4_6_0 = 040600, + ASE_SRP_4_8_0 = 040800, + ASE_SRP_4_9_0 = 040900, + ASE_SRP_4_10_0 = 041000, + ASE_SRP_5_7_2 = 050702, + ASE_SRP_5_8_2 = 050802, + ASE_SRP_5_9_0 = 050900, + ASE_SRP_5_10_0 = 051000, + ASE_SRP_5_13_0 = 051300, + ASE_SRP_5_16_1 = 051601, + ASE_SRP_6_9_0 = 060900, + ASE_SRP_6_9_1 = 060901, + ASE_SRP_6_9_2 = 060902, + ASE_SRP_7_0_1 = 070001, + ASE_SRP_7_1_1 = 070101, + ASE_SRP_7_1_2 = 070102, + ASE_SRP_7_1_5 = 070105, + ASE_SRP_7_1_6 = 070106, + ASE_SRP_7_1_7 = 070107, + ASE_SRP_7_1_8 = 070108, + ASE_SRP_7_2_0 = 070200, + ASE_SRP_7_2_1 = 070201, + ASE_SRP_7_3_1 = 070301, + ASE_SRP_7_4_1 = 070401, + ASE_SRP_7_4_2 = 070402, + ASE_SRP_7_4_3 = 070403, + ASE_SRP_7_5_1 = 070501, + ASE_SRP_7_5_2 = 070502, + ASE_SRP_7_5_3 = 070503, + ASE_SRP_8_2_0 = 080200, + ASE_SRP_8_3_1 = 080301, + ASE_SRP_9_0_0 = 090000, + ASE_SRP_10_0_0 = 100000, + ASE_SRP_10_1_0 = 100100, + ASE_SRP_10_2_2 = 100202, + ASE_SRP_10_3_1 = 100301, + ASE_SRP_10_3_2 = 100302, + ASE_SRP_RECENT = 999999 + } + + public enum ASEImportState + { + None, + Lightweight, + HD, + Both + } + + public static class AssetDatabaseEX + { + private static System.Type type = null; + public static System.Type Type { get { return ( type == null ) ? type = System.Type.GetType( "UnityEditor.AssetDatabase, UnityEditor" ) : type; } } + + public static void ImportPackageImmediately( string packagePath ) + { + AssetDatabaseEX.Type.InvokeMember( "ImportPackageImmediately", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { packagePath } ); + } + } + + + [Serializable] + public static class ASEPackageManagerHelper + { + private static string LightweightNewVersionDetected = "A new Lighweight RP version was detected and new templates are being imported.\n" + + "Please hit the Update button on your ASE canvas to recompile your shader under the newest version."; + + private static string HDNewVersionDetected = "A new HD RP version was detected and new templates are being imported.\n" + + "Please hit the Update button on your ASE canvas to recompile your shader under the newest version."; + + private static string HDPackageId = "com.unity.render-pipelines.high-definition"; + private static string LWPackageId = "com.unity.render-pipelines.lightweight"; + private static string UniversalPackageId = "com.unity.render-pipelines.universal"; + private static string HDEditorPrefsId = "ASEHDEditorPrefsId"; + private static string LWEditorPrefsId = "ASELightweigthEditorPrefsId "; + + private static string URPTemplateVersion = "ASEURPtemplate" + Application.productName; + private static string HDRPTemplateVersion = "ASEHDRPtemplate" + Application.productName; + + private static string SPKeywordFormat = "ASE_SRP_VERSION {0}"; + private static ListRequest m_packageListRequest = null; + private static UnityEditor.PackageManager.PackageInfo m_lwPackageInfo; + private static UnityEditor.PackageManager.PackageInfo m_hdPackageInfo; + + // V4.8.0 and bellow + // HD + private static readonly string[] GetNormalWSFunc = + { + "inline void GetNormalWS( FragInputs input, float3 normalTS, out float3 normalWS, float3 doubleSidedConstants )\n", + "{\n", + "\tGetNormalWS( input, normalTS, normalWS );\n", + "}\n" + }; + + // v4.6.0 and below + private static readonly string[] BuildWordTangentFunc = + { + "float3x3 BuildWorldToTangent(float4 tangentWS, float3 normalWS)\n", + "{\n", + "\tfloat3 unnormalizedNormalWS = normalWS;\n", + "\tfloat renormFactor = 1.0 / length(unnormalizedNormalWS);\n", + "\tfloat3x3 worldToTangent = CreateWorldToTangent(unnormalizedNormalWS, tangentWS.xyz, tangentWS.w > 0.0 ? 1.0 : -1.0);\n", + "\tworldToTangent[0] = worldToTangent[0] * renormFactor;\n", + "\tworldToTangent[1] = worldToTangent[1] * renormFactor;\n", + "\tworldToTangent[2] = worldToTangent[2] * renormFactor;\n", + "\treturn worldToTangent;\n", + "}\n" + }; + + private static bool m_lateImport = false; + private static string m_latePackageToImport; + + private static bool m_requireUpdateList = false; + private static ASEImportState m_importingPackage = ASEImportState.None; + + + private static ASESRPVersions m_currentHDVersion = ASESRPVersions.ASE_SRP_RECENT; + private static ASESRPVersions m_currentLWVersion = ASESRPVersions.ASE_SRP_RECENT; + + private static int m_urpTemplateVersion = 18; + private static int m_hdrpTemplateVersion = 14; + + private static Dictionary m_srpVersionConverter = new Dictionary() + { + {"3.0.0-preview", ASESRPVersions.ASE_SRP_3_0_0}, + {"3.1.0-preview", ASESRPVersions.ASE_SRP_3_1_0}, + {"3.3.0-preview", ASESRPVersions.ASE_SRP_3_3_0}, + {"4.1.0-preview", ASESRPVersions.ASE_SRP_4_1_0}, + {"4.2.0-preview", ASESRPVersions.ASE_SRP_4_2_0}, + {"4.3.0-preview", ASESRPVersions.ASE_SRP_4_3_0}, + {"4.6.0-preview", ASESRPVersions.ASE_SRP_4_6_0}, + {"4.8.0-preview", ASESRPVersions.ASE_SRP_4_8_0}, + {"4.9.0-preview", ASESRPVersions.ASE_SRP_4_9_0}, + {"4.10.0-preview", ASESRPVersions.ASE_SRP_4_10_0}, + {"5.7.2-preview", ASESRPVersions.ASE_SRP_5_7_2}, + {"5.7.2", ASESRPVersions.ASE_SRP_5_7_2}, + {"5.8.2-preview", ASESRPVersions.ASE_SRP_5_8_2}, + {"5.8.2", ASESRPVersions.ASE_SRP_5_8_2}, + {"5.9.0-preview", ASESRPVersions.ASE_SRP_5_9_0}, + {"5.9.0", ASESRPVersions.ASE_SRP_5_9_0}, + {"5.10.0-preview", ASESRPVersions.ASE_SRP_5_10_0}, + {"5.10.0", ASESRPVersions.ASE_SRP_5_10_0}, + {"5.13.0-preview", ASESRPVersions.ASE_SRP_5_13_0}, + {"5.13.0", ASESRPVersions.ASE_SRP_5_13_0}, + {"5.16.1-preview", ASESRPVersions.ASE_SRP_5_16_1}, + {"5.16.1", ASESRPVersions.ASE_SRP_5_16_1}, + {"6.9.0", ASESRPVersions.ASE_SRP_6_9_0}, + {"6.9.0-preview", ASESRPVersions.ASE_SRP_6_9_0}, + {"6.9.1", ASESRPVersions.ASE_SRP_6_9_1}, + {"6.9.1-preview", ASESRPVersions.ASE_SRP_6_9_1}, + {"6.9.2", ASESRPVersions.ASE_SRP_6_9_2}, + {"6.9.2-preview", ASESRPVersions.ASE_SRP_6_9_2}, + {"7.0.1", ASESRPVersions.ASE_SRP_7_0_1}, + {"7.0.1-preview", ASESRPVersions.ASE_SRP_7_0_1}, + {"7.1.1", ASESRPVersions.ASE_SRP_7_1_1}, + {"7.1.1-preview", ASESRPVersions.ASE_SRP_7_1_1}, + {"7.1.2", ASESRPVersions.ASE_SRP_7_1_2}, + {"7.1.2-preview", ASESRPVersions.ASE_SRP_7_1_2}, + {"7.1.5", ASESRPVersions.ASE_SRP_7_1_5}, + {"7.1.5-preview", ASESRPVersions.ASE_SRP_7_1_5}, + {"7.1.6", ASESRPVersions.ASE_SRP_7_1_6}, + {"7.1.6-preview", ASESRPVersions.ASE_SRP_7_1_6}, + {"7.1.7", ASESRPVersions.ASE_SRP_7_1_7}, + {"7.1.7-preview", ASESRPVersions.ASE_SRP_7_1_7}, + {"7.1.8", ASESRPVersions.ASE_SRP_7_1_8}, + {"7.1.8-preview", ASESRPVersions.ASE_SRP_7_1_8}, + {"7.2.0", ASESRPVersions.ASE_SRP_7_2_0}, + {"7.2.0-preview", ASESRPVersions.ASE_SRP_7_2_0}, + {"7.2.1", ASESRPVersions.ASE_SRP_7_2_1}, + {"7.2.1-preview", ASESRPVersions.ASE_SRP_7_2_1}, + {"7.3.1", ASESRPVersions.ASE_SRP_7_3_1}, + {"7.3.1-preview", ASESRPVersions.ASE_SRP_7_3_1}, + {"7.4.1", ASESRPVersions.ASE_SRP_7_4_1}, + {"7.4.1-preview", ASESRPVersions.ASE_SRP_7_4_1}, + {"7.4.2", ASESRPVersions.ASE_SRP_7_4_2}, + {"7.4.2-preview", ASESRPVersions.ASE_SRP_7_4_2}, + {"7.4.3", ASESRPVersions.ASE_SRP_7_4_3}, + {"7.4.3-preview", ASESRPVersions.ASE_SRP_7_4_3}, + {"7.5.1", ASESRPVersions.ASE_SRP_7_5_1}, + {"7.5.1-preview", ASESRPVersions.ASE_SRP_7_5_1}, + {"7.5.2", ASESRPVersions.ASE_SRP_7_5_2}, + {"7.5.2-preview", ASESRPVersions.ASE_SRP_7_5_2}, + {"7.5.3", ASESRPVersions.ASE_SRP_7_5_3}, + {"7.5.3-preview", ASESRPVersions.ASE_SRP_7_5_3}, + {"8.2.0", ASESRPVersions.ASE_SRP_8_2_0}, + {"8.2.0-preview", ASESRPVersions.ASE_SRP_8_2_0}, + {"8.3.1", ASESRPVersions.ASE_SRP_8_3_1}, + {"8.3.1-preview", ASESRPVersions.ASE_SRP_8_3_1}, + {"9.0.0", ASESRPVersions.ASE_SRP_9_0_0}, + {"9.0.0-preview.13", ASESRPVersions.ASE_SRP_9_0_0}, + {"9.0.0-preview.14", ASESRPVersions.ASE_SRP_9_0_0}, + {"9.0.0-preview.33", ASESRPVersions.ASE_SRP_9_0_0}, + {"9.0.0-preview.35", ASESRPVersions.ASE_SRP_9_0_0}, + {"9.0.0-preview.54", ASESRPVersions.ASE_SRP_9_0_0}, + {"9.0.0-preview.55", ASESRPVersions.ASE_SRP_9_0_0}, + {"9.0.0-preview.71", ASESRPVersions.ASE_SRP_9_0_0}, + {"10.0.0-preview.26", ASESRPVersions.ASE_SRP_10_0_0}, + {"10.0.0-preview.27", ASESRPVersions.ASE_SRP_10_0_0}, + {"10.1.0", ASESRPVersions.ASE_SRP_10_1_0}, + {"10.2.2", ASESRPVersions.ASE_SRP_10_2_2}, + {"10.3.1", ASESRPVersions.ASE_SRP_10_3_1}, + {"10.3.2", ASESRPVersions.ASE_SRP_10_3_2}, + }; + + + + private static Dictionary m_srpToASEPackageLW = new Dictionary() + { + {ASESRPVersions.ASE_SRP_3_0_0, "b53d2f3b156ff104f90d4d7693d769c8"}, + {ASESRPVersions.ASE_SRP_3_1_0, "b53d2f3b156ff104f90d4d7693d769c8"}, + {ASESRPVersions.ASE_SRP_3_3_0, "b53d2f3b156ff104f90d4d7693d769c8"}, + {ASESRPVersions.ASE_SRP_4_1_0, "3e8eabcfae1e5aa4397de89fedeb48db"}, + {ASESRPVersions.ASE_SRP_4_2_0, "3e8eabcfae1e5aa4397de89fedeb48db"}, + {ASESRPVersions.ASE_SRP_4_3_0, "3e8eabcfae1e5aa4397de89fedeb48db"}, + {ASESRPVersions.ASE_SRP_4_6_0, "3e8eabcfae1e5aa4397de89fedeb48db"}, + {ASESRPVersions.ASE_SRP_4_8_0, "3e8eabcfae1e5aa4397de89fedeb48db"}, + {ASESRPVersions.ASE_SRP_4_9_0, "3e8eabcfae1e5aa4397de89fedeb48db"}, + {ASESRPVersions.ASE_SRP_4_10_0, "3e8eabcfae1e5aa4397de89fedeb48db"}, + {ASESRPVersions.ASE_SRP_5_7_2, "4c816894a3147d343891060451241bfe"}, + {ASESRPVersions.ASE_SRP_5_8_2, "4c816894a3147d343891060451241bfe"}, + {ASESRPVersions.ASE_SRP_5_9_0, "4c816894a3147d343891060451241bfe"}, + {ASESRPVersions.ASE_SRP_5_10_0, "4c816894a3147d343891060451241bfe"}, + {ASESRPVersions.ASE_SRP_5_13_0, "4c816894a3147d343891060451241bfe"}, + {ASESRPVersions.ASE_SRP_5_16_1, "4c816894a3147d343891060451241bfe"}, + {ASESRPVersions.ASE_SRP_6_9_0, "4c816894a3147d343891060451241bfe"}, + {ASESRPVersions.ASE_SRP_6_9_1, "4c816894a3147d343891060451241bfe"}, + {ASESRPVersions.ASE_SRP_6_9_2, "4c816894a3147d343891060451241bfe"}, + {ASESRPVersions.ASE_SRP_7_0_1, "f54faaaf4faf8784183ede7f87dfeb23"}, + {ASESRPVersions.ASE_SRP_7_1_1, "f54faaaf4faf8784183ede7f87dfeb23"}, + {ASESRPVersions.ASE_SRP_7_1_2, "f54faaaf4faf8784183ede7f87dfeb23"}, + {ASESRPVersions.ASE_SRP_7_1_5, "f54faaaf4faf8784183ede7f87dfeb23"}, + {ASESRPVersions.ASE_SRP_7_1_6, "f54faaaf4faf8784183ede7f87dfeb23"}, + {ASESRPVersions.ASE_SRP_7_1_7, "f54faaaf4faf8784183ede7f87dfeb23"}, + {ASESRPVersions.ASE_SRP_7_1_8, "f54faaaf4faf8784183ede7f87dfeb23"}, + {ASESRPVersions.ASE_SRP_7_2_0, "f54faaaf4faf8784183ede7f87dfeb23"}, + {ASESRPVersions.ASE_SRP_7_2_1, "f54faaaf4faf8784183ede7f87dfeb23"}, + {ASESRPVersions.ASE_SRP_7_3_1, "f54faaaf4faf8784183ede7f87dfeb23"}, + {ASESRPVersions.ASE_SRP_7_4_1, "f54faaaf4faf8784183ede7f87dfeb23"}, + {ASESRPVersions.ASE_SRP_7_4_2, "f54faaaf4faf8784183ede7f87dfeb23"}, + {ASESRPVersions.ASE_SRP_7_4_3, "f54faaaf4faf8784183ede7f87dfeb23"}, + {ASESRPVersions.ASE_SRP_7_5_1, "f54faaaf4faf8784183ede7f87dfeb23"}, + {ASESRPVersions.ASE_SRP_7_5_2, "f54faaaf4faf8784183ede7f87dfeb23"}, + {ASESRPVersions.ASE_SRP_7_5_3, "f54faaaf4faf8784183ede7f87dfeb23"}, + {ASESRPVersions.ASE_SRP_8_2_0, "f54faaaf4faf8784183ede7f87dfeb23"}, + {ASESRPVersions.ASE_SRP_8_3_1, "f54faaaf4faf8784183ede7f87dfeb23"}, + {ASESRPVersions.ASE_SRP_9_0_0, "f54faaaf4faf8784183ede7f87dfeb23"}, + {ASESRPVersions.ASE_SRP_10_0_0, "57fcea0ed8b5eb347923c4c21fa31b57"}, + {ASESRPVersions.ASE_SRP_10_1_0, "57fcea0ed8b5eb347923c4c21fa31b57"}, + {ASESRPVersions.ASE_SRP_10_2_2, "57fcea0ed8b5eb347923c4c21fa31b57"}, + {ASESRPVersions.ASE_SRP_10_3_1, "57fcea0ed8b5eb347923c4c21fa31b57"}, + {ASESRPVersions.ASE_SRP_10_3_2, "57fcea0ed8b5eb347923c4c21fa31b57"}, + {ASESRPVersions.ASE_SRP_RECENT, "57fcea0ed8b5eb347923c4c21fa31b57"} + }; + + private static Dictionary m_srpToASEPackageHD = new Dictionary() + { + {ASESRPVersions.ASE_SRP_3_0_0, "4dc1afbcc68875c4780502f5e6b80158"}, + {ASESRPVersions.ASE_SRP_3_1_0, "4dc1afbcc68875c4780502f5e6b80158"}, + {ASESRPVersions.ASE_SRP_3_3_0, "4dc1afbcc68875c4780502f5e6b80158"}, + {ASESRPVersions.ASE_SRP_4_1_0, "5d615bf612f33364e96fb9fd2959ae9c"}, + {ASESRPVersions.ASE_SRP_4_2_0, "5d615bf612f33364e96fb9fd2959ae9c"}, + {ASESRPVersions.ASE_SRP_4_3_0, "5d615bf612f33364e96fb9fd2959ae9c"}, + {ASESRPVersions.ASE_SRP_4_6_0, "5d615bf612f33364e96fb9fd2959ae9c"}, + {ASESRPVersions.ASE_SRP_4_8_0, "5d615bf612f33364e96fb9fd2959ae9c"}, + {ASESRPVersions.ASE_SRP_4_9_0, "5d615bf612f33364e96fb9fd2959ae9c"}, + {ASESRPVersions.ASE_SRP_4_10_0, "5d615bf612f33364e96fb9fd2959ae9c"}, + {ASESRPVersions.ASE_SRP_5_7_2, "f51b7b861facbc3429fcc5f1f6f91183"}, + {ASESRPVersions.ASE_SRP_5_8_2, "2d7fe4f7c19e90f41b893bc01fc17230"}, + {ASESRPVersions.ASE_SRP_5_9_0, "2d7fe4f7c19e90f41b893bc01fc17230"}, + {ASESRPVersions.ASE_SRP_5_10_0, "2d7fe4f7c19e90f41b893bc01fc17230"}, + {ASESRPVersions.ASE_SRP_5_13_0, "2d7fe4f7c19e90f41b893bc01fc17230"}, + {ASESRPVersions.ASE_SRP_5_16_1, "2d7fe4f7c19e90f41b893bc01fc17230"}, + {ASESRPVersions.ASE_SRP_6_9_0, "e137dba02f4d0f542ab09dcedea27314"}, + {ASESRPVersions.ASE_SRP_6_9_1, "e137dba02f4d0f542ab09dcedea27314"}, + {ASESRPVersions.ASE_SRP_6_9_2, "e137dba02f4d0f542ab09dcedea27314"}, + {ASESRPVersions.ASE_SRP_7_0_1, "e137dba02f4d0f542ab09dcedea27314"}, + {ASESRPVersions.ASE_SRP_7_1_1, "e137dba02f4d0f542ab09dcedea27314"}, + {ASESRPVersions.ASE_SRP_7_1_2, "e137dba02f4d0f542ab09dcedea27314"}, + {ASESRPVersions.ASE_SRP_7_1_5, "e137dba02f4d0f542ab09dcedea27314"}, + {ASESRPVersions.ASE_SRP_7_1_6, "e137dba02f4d0f542ab09dcedea27314"}, + {ASESRPVersions.ASE_SRP_7_1_7, "e137dba02f4d0f542ab09dcedea27314"}, + {ASESRPVersions.ASE_SRP_7_1_8, "3aeabe705b70b154ea99893f91351100"}, + {ASESRPVersions.ASE_SRP_7_2_0, "3aeabe705b70b154ea99893f91351100"}, + {ASESRPVersions.ASE_SRP_7_2_1, "3aeabe705b70b154ea99893f91351100"}, + {ASESRPVersions.ASE_SRP_7_3_1, "3aeabe705b70b154ea99893f91351100"}, + {ASESRPVersions.ASE_SRP_7_4_1, "3aeabe705b70b154ea99893f91351100"}, + {ASESRPVersions.ASE_SRP_7_4_2, "3aeabe705b70b154ea99893f91351100"}, + {ASESRPVersions.ASE_SRP_7_4_3, "3aeabe705b70b154ea99893f91351100"}, + {ASESRPVersions.ASE_SRP_7_5_1, "3aeabe705b70b154ea99893f91351100"}, + {ASESRPVersions.ASE_SRP_7_5_2, "3aeabe705b70b154ea99893f91351100"}, + {ASESRPVersions.ASE_SRP_7_5_3, "3aeabe705b70b154ea99893f91351100"}, + {ASESRPVersions.ASE_SRP_8_2_0, "3aeabe705b70b154ea99893f91351100"}, + {ASESRPVersions.ASE_SRP_8_3_1, "3aeabe705b70b154ea99893f91351100"}, + {ASESRPVersions.ASE_SRP_9_0_0, "3aeabe705b70b154ea99893f91351100"}, + {ASESRPVersions.ASE_SRP_10_0_0, "9a5e61a8b3421b944863d0946e32da0a"}, + {ASESRPVersions.ASE_SRP_10_1_0, "9a5e61a8b3421b944863d0946e32da0a"}, + {ASESRPVersions.ASE_SRP_10_2_2, "9a5e61a8b3421b944863d0946e32da0a"}, + {ASESRPVersions.ASE_SRP_10_3_1, "9a5e61a8b3421b944863d0946e32da0a"}, + {ASESRPVersions.ASE_SRP_10_3_2, "9a5e61a8b3421b944863d0946e32da0a"}, + {ASESRPVersions.ASE_SRP_RECENT, "9a5e61a8b3421b944863d0946e32da0a"} + + }; + + private static Shader m_lateShader; + private static Material m_lateMaterial; + private static AmplifyShaderFunction m_lateShaderFunction; + + + public static void RequestInfo() + { + if( !m_requireUpdateList && m_importingPackage == ASEImportState.None ) + { + m_requireUpdateList = true; + m_packageListRequest = UnityEditor.PackageManager.Client.List( true ); + } + } + + static void FailedPackageImport( string packageName, string errorMessage ) + { + FinishImporter(); + } + + static void CancelledPackageImport( string packageName ) + { + FinishImporter(); + } + + static void CompletedPackageImport( string packageName ) + { + FinishImporter(); + } + + public static void CheckLatePackageImport() + { + if( !Application.isPlaying && m_lateImport && !string.IsNullOrEmpty( m_latePackageToImport ) ) + { + m_lateImport = false; + StartImporting( m_latePackageToImport ); + m_latePackageToImport = string.Empty; + } + } + + public static void StartImporting( string packagePath ) + { + if( !Preferences.GlobalAutoSRP ) + { + m_importingPackage = ASEImportState.None; + return; + } + + if( Application.isPlaying ) + { + if( !m_lateImport ) + { + m_lateImport = true; + m_latePackageToImport = packagePath; + Debug.LogWarning( "Amplify Shader Editor requires the \""+ packagePath +"\" package to be installed in order to continue. Please exit Play mode to proceed." ); + } + return; + } + + AssetDatabase.importPackageCancelled += CancelledPackageImport; + AssetDatabase.importPackageCompleted += CompletedPackageImport; + AssetDatabase.importPackageFailed += FailedPackageImport; + AssetDatabase.ImportPackage( packagePath, false ); + //AssetDatabaseEX.ImportPackageImmediately( packagePath ); + } + + public static void FinishImporter() + { + m_importingPackage = ASEImportState.None; + AssetDatabase.importPackageCancelled -= CancelledPackageImport; + AssetDatabase.importPackageCompleted -= CompletedPackageImport; + AssetDatabase.importPackageFailed -= FailedPackageImport; + } + + public static void SetupLateShader( Shader shader ) + { + if( shader == null ) + return; + + //If a previous delayed object is pending discard it and register the new one + // So the last selection will be the choice of opening + //This can happen when trying to open an ASE canvas while importing templates or in play mode + if( m_lateShader != null ) + { + EditorApplication.delayCall -= LateShaderOpener; + } + + RequestInfo(); + m_lateShader = shader; + EditorApplication.delayCall += LateShaderOpener; + } + + public static void LateShaderOpener() + { + Preferences.LoadDefaults(); + Update(); + if( IsProcessing ) + { + EditorApplication.delayCall += LateShaderOpener; + } + else + { + AmplifyShaderEditorWindow.ConvertShaderToASE( m_lateShader ); + m_lateShader = null; + } + } + + public static void SetupLateMaterial( Material material ) + { + if( material == null ) + return; + + //If a previous delayed object is pending discard it and register the new one + // So the last selection will be the choice of opening + //This can happen when trying to open an ASE canvas while importing templates or in play mode + if( m_lateMaterial != null ) + { + EditorApplication.delayCall -= LateMaterialOpener; + } + + RequestInfo(); + m_lateMaterial = material; + EditorApplication.delayCall += LateMaterialOpener; + } + + public static void LateMaterialOpener() + { + Preferences.LoadDefaults(); + Update(); + if( IsProcessing ) + { + EditorApplication.delayCall += LateMaterialOpener; + } + else + { + AmplifyShaderEditorWindow.LoadMaterialToASE( m_lateMaterial ); + m_lateMaterial = null; + } + } + + public static void SetupLateShaderFunction( AmplifyShaderFunction shaderFunction ) + { + if( shaderFunction == null ) + return; + + //If a previous delayed object is pending discard it and register the new one + // So the last selection will be the choice of opening + //This can happen when trying to open an ASE canvas while importing templates or in play mode + if( m_lateShaderFunction != null ) + { + EditorApplication.delayCall -= LateShaderFunctionOpener; + } + + RequestInfo(); + m_lateShaderFunction = shaderFunction; + EditorApplication.delayCall += LateShaderFunctionOpener; + } + + public static void LateShaderFunctionOpener() + { + Preferences.LoadDefaults(); + Update(); + if( IsProcessing ) + { + EditorApplication.delayCall += LateShaderFunctionOpener; + } + else + { + AmplifyShaderEditorWindow.LoadShaderFunctionToASE( m_lateShaderFunction, false ); + m_lateShaderFunction = null; + } + } + + public static void Update() + { + //if( Application.isPlaying ) + // return; + + CheckLatePackageImport(); + //if( m_lwPackageInfo != null ) + //{ + // if( m_srpVersionConverter[ m_lwPackageInfo.version ] != m_currentLWVersion ) + // { + // m_currentLWVersion = m_srpVersionConverter[ m_lwPackageInfo.version ]; + // EditorPrefs.SetInt( LWEditorPrefsId, (int)m_currentLWVersion ); + // m_importingPackage = ASEImportState.Lightweight; + // string packagePath = AssetDatabase.GUIDToAssetPath( m_srpToASEPackageLW[ m_currentLWVersion ] ); + // StartImporting( packagePath ); + // } + //} + + //if( m_hdPackageInfo != null ) + //{ + // if( m_srpVersionConverter[ m_hdPackageInfo.version ] != m_currentHDVersion ) + // { + // m_currentHDVersion = m_srpVersionConverter[ m_hdPackageInfo.version ]; + // EditorPrefs.SetInt( HDEditorPrefsId, (int)m_currentHDVersion ); + // m_importingPackage = ASEImportState.HD; + // string packagePath = AssetDatabase.GUIDToAssetPath( m_srpToASEPackageHD[ m_currentHDVersion ] ); + // StartImporting( packagePath ); + // } + //} + + if( m_requireUpdateList && m_importingPackage == ASEImportState.None ) + { + if( m_packageListRequest != null && m_packageListRequest.IsCompleted ) + { + m_requireUpdateList = false; + foreach( UnityEditor.PackageManager.PackageInfo pi in m_packageListRequest.Result ) + { + if( pi.name.Equals( LWPackageId ) ) + { + m_currentLWVersion = ASESRPVersions.ASE_SRP_RECENT; + m_lwPackageInfo = pi; + ASESRPVersions oldVersion = (ASESRPVersions)EditorPrefs.GetInt( LWEditorPrefsId ); + if( m_srpVersionConverter.ContainsKey( pi.version ) ) + { + m_currentLWVersion = m_srpVersionConverter[ pi.version ]; + } + else + { + m_currentLWVersion = ASESRPVersions.ASE_SRP_RECENT; + } + + EditorPrefs.SetInt( LWEditorPrefsId, (int)m_currentLWVersion ); + bool foundNewVersion = oldVersion != m_currentLWVersion; + if( !File.Exists( AssetDatabase.GUIDToAssetPath( TemplatesManager.LightweigthPBRGUID ) ) || + !File.Exists( AssetDatabase.GUIDToAssetPath( TemplatesManager.LightweigthUnlitGUID ) ) || + foundNewVersion + ) + { + if( foundNewVersion ) + Debug.Log( LightweightNewVersionDetected ); + + m_importingPackage = ASEImportState.Lightweight; + string guid = m_srpToASEPackageLW.ContainsKey( m_currentLWVersion ) ? m_srpToASEPackageLW[ m_currentLWVersion ] : m_srpToASEPackageLW[ ASESRPVersions.ASE_SRP_RECENT ]; + string packagePath = AssetDatabase.GUIDToAssetPath( guid ); + StartImporting( packagePath ); + } + } + + if( pi.name.Equals( UniversalPackageId ) ) + { + m_currentLWVersion = ASESRPVersions.ASE_SRP_RECENT; + m_lwPackageInfo = pi; + ASESRPVersions oldVersion = (ASESRPVersions)EditorPrefs.GetInt( LWEditorPrefsId ); + if( m_srpVersionConverter.ContainsKey( pi.version ) ) + { + m_currentLWVersion = m_srpVersionConverter[ pi.version ]; + } + else + { + m_currentLWVersion = ASESRPVersions.ASE_SRP_RECENT; + } + + EditorPrefs.SetInt( LWEditorPrefsId, (int)m_currentLWVersion ); + bool foundNewVersion = oldVersion != m_currentLWVersion; + + int urpVersion = EditorPrefs.GetInt( URPTemplateVersion, m_urpTemplateVersion ); + if( urpVersion < m_urpTemplateVersion ) + foundNewVersion = true; + EditorPrefs.SetInt( URPTemplateVersion, m_urpTemplateVersion ); + + if( !File.Exists( AssetDatabase.GUIDToAssetPath( TemplatesManager.UniversalPBRGUID ) ) || + !File.Exists( AssetDatabase.GUIDToAssetPath( TemplatesManager.UniversalUnlitGUID ) ) || + foundNewVersion + ) + { + if( foundNewVersion ) + Debug.Log( LightweightNewVersionDetected ); + + m_importingPackage = ASEImportState.Lightweight; + string guid = m_srpToASEPackageLW.ContainsKey( m_currentLWVersion ) ? m_srpToASEPackageLW[ m_currentLWVersion ] : m_srpToASEPackageLW[ ASESRPVersions.ASE_SRP_RECENT ]; + string packagePath = AssetDatabase.GUIDToAssetPath( guid ); + StartImporting( packagePath ); + } + + } + + if( pi.name.Equals( HDPackageId ) ) + { + m_currentHDVersion = ASESRPVersions.ASE_SRP_RECENT; + m_hdPackageInfo = pi; + ASESRPVersions oldVersion = (ASESRPVersions)EditorPrefs.GetInt( HDEditorPrefsId ); + if( m_srpVersionConverter.ContainsKey( pi.version ) ) + { + m_currentHDVersion = m_srpVersionConverter[ pi.version ]; + } + else + { + m_currentHDVersion = ASESRPVersions.ASE_SRP_RECENT; + } + + EditorPrefs.SetInt( HDEditorPrefsId, (int)m_currentHDVersion ); + bool foundNewVersion = oldVersion != m_currentHDVersion; + + int hdrpVersion = EditorPrefs.GetInt( HDRPTemplateVersion, m_hdrpTemplateVersion ); + if( hdrpVersion < m_hdrpTemplateVersion ) + foundNewVersion = true; + EditorPrefs.SetInt( HDRPTemplateVersion, m_hdrpTemplateVersion ); + +#if UNITY_2019_3_OR_NEWER + if( !File.Exists( AssetDatabase.GUIDToAssetPath( TemplatesManager.HDNewLitGUID ) ) || + !File.Exists( AssetDatabase.GUIDToAssetPath( TemplatesManager.HDNewPBRGUID ) ) || + !File.Exists( AssetDatabase.GUIDToAssetPath( TemplatesManager.HDNewUnlitGUID ) ) || +#else + if( !File.Exists( AssetDatabase.GUIDToAssetPath( TemplatesManager.HDLitGUID ) ) || + !File.Exists( AssetDatabase.GUIDToAssetPath( TemplatesManager.HDPBRGUID ) ) || + !File.Exists( AssetDatabase.GUIDToAssetPath( TemplatesManager.HDUnlitGUID ) ) || +#endif + foundNewVersion + ) + { + if( foundNewVersion ) + Debug.Log( HDNewVersionDetected ); + + m_importingPackage = m_importingPackage == ASEImportState.Lightweight ? ASEImportState.Both : ASEImportState.HD; + string guid = m_srpToASEPackageHD.ContainsKey( m_currentHDVersion ) ? m_srpToASEPackageHD[ m_currentHDVersion ] : m_srpToASEPackageHD[ ASESRPVersions.ASE_SRP_RECENT ]; + string packagePath = AssetDatabase.GUIDToAssetPath( guid ); + StartImporting( packagePath ); + } + + } + } + } + } + } + + public static void SetSRPInfoOnDataCollector( ref MasterNodeDataCollector dataCollector ) + { + Preferences.LoadDefaults(); + if( m_requireUpdateList ) + Update(); + + if( dataCollector.CurrentSRPType == TemplateSRPType.HD ) + { + dataCollector.AddToDirectives( string.Format( SPKeywordFormat, (int)m_currentHDVersion ) ,-1, AdditionalLineType.Define ); + if( m_currentHDVersion < ASESRPVersions.ASE_SRP_4_9_0 ) + { + dataCollector.AddFunction( GetNormalWSFunc[ 0 ], GetNormalWSFunc, false ); + } + + if( m_currentHDVersion < ASESRPVersions.ASE_SRP_4_8_0 ) + { + dataCollector.AddFunction( BuildWordTangentFunc[ 0 ], BuildWordTangentFunc, false ); + } + } + + if( dataCollector.CurrentSRPType == TemplateSRPType.Lightweight ) + dataCollector.AddToDirectives( string.Format( SPKeywordFormat, (int)m_currentLWVersion ), -1, AdditionalLineType.Define ); + } + public static ASESRPVersions CurrentHDVersion { get { return m_currentHDVersion; } } + public static ASESRPVersions CurrentLWVersion { get { return m_currentLWVersion; } } + public static bool CheckImporter { get { return m_importingPackage != ASEImportState.None; } } + public static bool IsProcessing { get { return m_requireUpdateList && m_importingPackage == ASEImportState.None; } } + } +} +#endif diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ASEPackageManagerHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ASEPackageManagerHelper.cs.meta new file mode 100644 index 0000000..67f628a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ASEPackageManagerHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f48de3e34ed250945ba8c16d98b8ca0e +timeCreated: 1548881060 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ASEStartScreen.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ASEStartScreen.cs new file mode 100644 index 0000000..c11cf8b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ASEStartScreen.cs @@ -0,0 +1,495 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; +using UnityEngine.Networking; +using System.Collections; + +namespace AmplifyShaderEditor +{ + public class ASEStartScreen : EditorWindow + { + [MenuItem( "Window/Amplify Shader Editor/Start Screen", false, 1999 )] + public static void Init() + { + ASEStartScreen window = (ASEStartScreen)GetWindow( typeof( ASEStartScreen ), true, "Amplify Shader Editor Start Screen" ); + window.minSize = new Vector2( 650, 500 ); + window.maxSize = new Vector2( 650, 500 ); + window.Show(); + } + + private static readonly string ChangeLogGUID = "580cccd3e608b7f4cac35ea46d62d429"; + private static readonly string ResourcesGUID = "c0a0a980c9ba86345bc15411db88d34f"; + private static readonly string BuiltInGUID = "e00e6f90ab8233e46a41c5e33917c642"; + private static readonly string UniversalGUID = "a9d68dd8913f05d4d9ce75e7b40c6044"; + private static readonly string HighDefinitionGUID = "d1c0b77896049554fa4b635531caf741"; + private static readonly string OLDHighDefinitionGUID = "dff05fea7446d7b4e9029bfab77455d2"; + private static readonly string LightWeightGUID = "6ecbfd0a046659943a69328c98ff0442"; + private static readonly string OLDLightWeightGUID = "f7c4e22642de60d448f4e4809190f7b1"; + + private static readonly string IconGUID = "2c6536772776dd84f872779990273bfc"; + + public static readonly string ChangelogURL = "http://amplify.pt/Banner/ASEchangelog.json"; + + private static readonly string ManualURL = "http://wiki.amplify.pt/index.php?title=Unity_Products:Amplify_Shader_Editor/Manual"; + private static readonly string BasicURL = "http://wiki.amplify.pt/index.php?title=Unity_Products:Amplify_Shader_Editor/Tutorials#Official_-_Basics"; + private static readonly string BeginnerURL = "http://wiki.amplify.pt/index.php?title=Unity_Products:Amplify_Shader_Editor/Tutorials#Official_-_Beginner_Series"; + private static readonly string NodesURL = "http://wiki.amplify.pt/index.php?title=Unity_Products:Amplify_Shader_Editor/Nodes"; + private static readonly string SRPURL = "http://wiki.amplify.pt/index.php?title=Unity_Products:Amplify_Shader_Editor/Scriptable_Rendering_Pipeline"; + private static readonly string FunctionsURL = "http://wiki.amplify.pt/index.php?title=Unity_Products:Amplify_Shader_Editor/Manual#Shader_Functions"; + private static readonly string TemplatesURL = "http://wiki.amplify.pt/index.php?title=Unity_Products:Amplify_Shader_Editor/Templates"; + private static readonly string APIURL = "http://wiki.amplify.pt/index.php?title=Unity_Products:Amplify_Shader_Editor/API"; + + private static readonly string DiscordURL = "https://discordapp.com/invite/EdrVAP5"; + private static readonly string ForumURL = "https://forum.unity.com/threads/best-tool-asset-store-award-amplify-shader-editor-node-based-shader-creation-tool.430959/"; + + private static readonly string SiteURL = "http://amplify.pt/download/"; + private static readonly string StoreURL = "https://assetstore.unity.com/packages/tools/visual-scripting/amplify-shader-editor-68570"; + + private static readonly GUIContent SamplesTitle = new GUIContent( "Shader Samples", "Import samples according to you project rendering pipeline" ); + private static readonly GUIContent ResourcesTitle = new GUIContent( "Learning Resources", "Check the online wiki for various topics about how to use ASE with node examples and explanations" ); + private static readonly GUIContent CommunityTitle = new GUIContent( "Community", "Need help? Reach us through our discord server or the offitial support Unity forum" ); + private static readonly GUIContent UpdateTitle = new GUIContent( "Latest Update", "Check the lastest additions, improvements and bug fixes done to ASE" ); + private static readonly GUIContent ASETitle = new GUIContent( "Amplify Shader Editor", "Are you using the latest version? Now you know" ); + + private static readonly string DownArrow = "\u25BC"; +#if UNITY_2019_3_OR_NEWER + private int DownButtonSize = 22; +#else + private int DownButtonSize = 21; +#endif + + Vector2 m_scrollPosition = Vector2.zero; + Preferences.ShowOption m_startup = Preferences.ShowOption.Never; + bool m_showLWRP = false; + bool m_showHDRP = false; + + [NonSerialized] + Texture packageIcon = null; + [NonSerialized] + Texture textIcon = null; + [NonSerialized] + Texture webIcon = null; + + GUIContent HDRPbutton = null; + GUIContent HDRPOLDbutton = null; + GUIContent URPbutton = null; + GUIContent LWRPbutton = null; + GUIContent LWRPOLDbutton = null; + GUIContent BuiltInbutton = null; + + GUIContent Manualbutton = null; + GUIContent Basicbutton = null; + GUIContent Beginnerbutton = null; + GUIContent Nodesbutton = null; + GUIContent SRPusebutton = null; + GUIContent Functionsbutton = null; + GUIContent Templatesbutton = null; + GUIContent APIbutton = null; + + GUIContent DiscordButton = null; + GUIContent ForumButton = null; + + GUIContent ASEIcon = null; + RenderTexture rt; + + [NonSerialized] + GUIStyle m_buttonStyle = null; + [NonSerialized] + GUIStyle m_buttonLeftStyle = null; + [NonSerialized] + GUIStyle m_buttonRightStyle = null; + [NonSerialized] + GUIStyle m_minibuttonStyle = null; + [NonSerialized] + GUIStyle m_labelStyle = null; + [NonSerialized] + GUIStyle m_linkStyle = null; + + private ChangeLogInfo m_changeLog; + private bool m_infoDownloaded = false; + private string m_newVersion = string.Empty; + + private void OnEnable() + { + rt = new RenderTexture( 16, 16, 0 ); + rt.Create(); + + m_startup = (Preferences.ShowOption)EditorPrefs.GetInt( Preferences.PrefStartUp, 0 ); + + if( textIcon == null ) + { + Texture icon = EditorGUIUtility.IconContent( "TextAsset Icon" ).image; + var cache = RenderTexture.active; + RenderTexture.active = rt; + Graphics.Blit( icon, rt ); + RenderTexture.active = cache; + textIcon = rt; + + Manualbutton = new GUIContent( " Manual", textIcon ); + Basicbutton = new GUIContent( " Basic use tutorials", textIcon ); + Beginnerbutton = new GUIContent( " Beginner Series", textIcon ); + Nodesbutton = new GUIContent( " Node List", textIcon ); + SRPusebutton = new GUIContent( " SRP HD/URP/LW use", textIcon ); + Functionsbutton = new GUIContent( " Shader Functions", textIcon ); + Templatesbutton = new GUIContent( " Shader Templates", textIcon ); + APIbutton = new GUIContent( " Node API", textIcon ); + } + + if( packageIcon == null ) + { + packageIcon = EditorGUIUtility.IconContent( "BuildSettings.Editor.Small" ).image; + HDRPbutton = new GUIContent( " HDRP Samples", packageIcon ); + HDRPOLDbutton = new GUIContent( " HDRP Samples 6.X.X", packageIcon ); + URPbutton = new GUIContent( " URP Samples", packageIcon ); + LWRPbutton = new GUIContent( " LWRP Samples 6.X.X", packageIcon ); + LWRPOLDbutton = new GUIContent( " LWRP Samples 3.X.X", packageIcon ); + BuiltInbutton = new GUIContent( " Built-In Samples", packageIcon ); + } + + if( webIcon == null ) + { + webIcon = EditorGUIUtility.IconContent( "BuildSettings.Web.Small" ).image; + DiscordButton = new GUIContent( " Discord", webIcon ); + ForumButton = new GUIContent( " Unity Forum", webIcon ); + } + + if( m_changeLog == null ) + { + var changelog = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( ChangeLogGUID ) ); + string lastUpdate = string.Empty; + if(changelog != null ) + { + lastUpdate = changelog.text.Substring( 0, changelog.text.IndexOf( "\nv", 50 ) );// + "\n..."; + lastUpdate = lastUpdate.Replace( " *", " \u25CB" ); + lastUpdate = lastUpdate.Replace( "* ", "\u2022 " ); + } + m_changeLog = new ChangeLogInfo( VersionInfo.FullNumber, lastUpdate ); + } + + if( ASEIcon == null ) + { + ASEIcon = new GUIContent( AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( IconGUID ) ) ); + } + } + + private void OnDisable() + { + if( rt != null ) + { + rt.Release(); + DestroyImmediate( rt ); + } + } + + public void OnGUI() + { + if( !m_infoDownloaded ) + { + m_infoDownloaded = true; + + StartBackgroundTask( StartRequest( ChangelogURL, () => + { + var temp = ChangeLogInfo.CreateFromJSON( www.downloadHandler.text ); + if( temp != null && temp.Version >= m_changeLog.Version ) + { + m_changeLog = temp; + } + // improve this later + int major = m_changeLog.Version / 10000; + int minor = ( m_changeLog.Version / 1000 ) - major * 10; + int release = ( m_changeLog.Version / 100 ) - major * 100 - minor * 10; + int revision = ( ( m_changeLog.Version / 10 ) - major * 1000 - minor * 100 - release * 10 ) + ( m_changeLog.Version - major * 10000 - minor * 1000 - release * 100 ); + m_newVersion = major + "." + minor + "." + release + "r" + revision; + Repaint(); + } ) ); + } + + if( m_buttonStyle == null ) + { + m_buttonStyle = new GUIStyle( GUI.skin.button ); + m_buttonStyle.alignment = TextAnchor.MiddleLeft; + } + + if( m_buttonLeftStyle == null ) + { + m_buttonLeftStyle = new GUIStyle( "ButtonLeft" ); + m_buttonLeftStyle.alignment = TextAnchor.MiddleLeft; + m_buttonLeftStyle.margin = m_buttonStyle.margin; + m_buttonLeftStyle.margin.right = 0; + } + + if( m_buttonRightStyle == null ) + { + m_buttonRightStyle = new GUIStyle( "ButtonRight" ); + m_buttonRightStyle.alignment = TextAnchor.MiddleLeft; + m_buttonRightStyle.margin = m_buttonStyle.margin; + m_buttonRightStyle.margin.left = 0; + } + + if( m_minibuttonStyle == null ) + { + m_minibuttonStyle = new GUIStyle( "MiniButton" ); + m_minibuttonStyle.alignment = TextAnchor.MiddleLeft; + m_minibuttonStyle.margin = m_buttonStyle.margin; + m_minibuttonStyle.margin.left = 20; + m_minibuttonStyle.normal.textColor = m_buttonStyle.normal.textColor; + m_minibuttonStyle.hover.textColor = m_buttonStyle.hover.textColor; + } + + if( m_labelStyle == null ) + { + m_labelStyle = new GUIStyle( "BoldLabel" ); + m_labelStyle.margin = new RectOffset( 4, 4, 4, 4 ); + m_labelStyle.padding = new RectOffset( 2, 2, 2, 2 ); + m_labelStyle.fontSize = 13; + } + + if( m_linkStyle == null ) + { + var inv = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "1004d06b4b28f5943abdf2313a22790a" ) ); // find a better solution for transparent buttons + m_linkStyle = new GUIStyle(); + m_linkStyle.normal.textColor = new Color( 0.2980392f, 0.4901961f, 1f ); + m_linkStyle.hover.textColor = Color.white; + m_linkStyle.active.textColor = Color.grey; + m_linkStyle.margin.top = 3; + m_linkStyle.margin.bottom = 2; + m_linkStyle.hover.background = inv; + m_linkStyle.active.background = inv; + } + + EditorGUILayout.BeginHorizontal( GUIStyle.none, GUILayout.ExpandWidth( true ) ); + { + // left column + EditorGUILayout.BeginVertical( GUILayout.Width( 175 ) ); + { + GUILayout.Label( SamplesTitle, m_labelStyle ); + EditorGUILayout.BeginHorizontal(); + if( GUILayout.Button( HDRPbutton, m_buttonLeftStyle ) ) + ImportSample( HDRPbutton.text, HighDefinitionGUID ); + + if( GUILayout.Button( DownArrow, m_buttonRightStyle, GUILayout.Width( DownButtonSize ), GUILayout.Height( DownButtonSize ) ) ) + { + m_showHDRP = !m_showHDRP; + m_showLWRP = false; + } + EditorGUILayout.EndHorizontal(); + if( m_showHDRP ) + { + if( GUILayout.Button( HDRPOLDbutton, m_minibuttonStyle ) ) + ImportSample( HDRPOLDbutton.text, OLDHighDefinitionGUID ); + } + EditorGUILayout.BeginHorizontal(); + if( GUILayout.Button( URPbutton, m_buttonLeftStyle ) ) + ImportSample( URPbutton.text, UniversalGUID ); + + if( GUILayout.Button( DownArrow, m_buttonRightStyle, GUILayout.Width( DownButtonSize ), GUILayout.Height( DownButtonSize ) ) ) + { + m_showLWRP = !m_showLWRP; + m_showHDRP = false; + } + EditorGUILayout.EndHorizontal(); + if( m_showLWRP ) + { + EditorGUILayout.BeginVertical(); + if( GUILayout.Button( LWRPbutton, m_minibuttonStyle ) ) + ImportSample( LWRPbutton.text, LightWeightGUID ); + if( GUILayout.Button( LWRPOLDbutton, m_minibuttonStyle ) ) + ImportSample( LWRPOLDbutton.text, OLDLightWeightGUID ); + EditorGUILayout.EndVertical(); + } + if( GUILayout.Button( BuiltInbutton, m_buttonStyle ) ) + ImportSample( BuiltInbutton.text, BuiltInGUID ); + + GUILayout.Space( 10 ); + + GUILayout.Label( ResourcesTitle, m_labelStyle ); + if( GUILayout.Button( Manualbutton, m_buttonStyle ) ) + Application.OpenURL( ManualURL ); + + if( GUILayout.Button( Basicbutton, m_buttonStyle ) ) + Application.OpenURL( BasicURL ); + + if( GUILayout.Button( Beginnerbutton, m_buttonStyle ) ) + Application.OpenURL( BeginnerURL ); + + if( GUILayout.Button( Nodesbutton, m_buttonStyle ) ) + Application.OpenURL( NodesURL ); + + if( GUILayout.Button( SRPusebutton, m_buttonStyle ) ) + Application.OpenURL( SRPURL ); + + if( GUILayout.Button( Functionsbutton, m_buttonStyle ) ) + Application.OpenURL( FunctionsURL ); + + if( GUILayout.Button( Templatesbutton, m_buttonStyle ) ) + Application.OpenURL( TemplatesURL ); + + if( GUILayout.Button( APIbutton, m_buttonStyle ) ) + Application.OpenURL( APIURL ); + } + EditorGUILayout.EndVertical(); + + // right column + EditorGUILayout.BeginVertical( GUILayout.Width( 650 - 175 - 9 ), GUILayout.ExpandHeight( true ) ); + { + GUILayout.Label( CommunityTitle, m_labelStyle ); + EditorGUILayout.BeginHorizontal( GUILayout.ExpandWidth( true ) ); + { + if( GUILayout.Button( DiscordButton, GUILayout.ExpandWidth( true ) ) ) + { + Application.OpenURL( DiscordURL ); + } + if( GUILayout.Button( ForumButton, GUILayout.ExpandWidth( true ) ) ) + { + Application.OpenURL( ForumURL ); + } + } + EditorGUILayout.EndHorizontal(); + GUILayout.Label( UpdateTitle, m_labelStyle ); + m_scrollPosition = GUILayout.BeginScrollView( m_scrollPosition, "ProgressBarBack", GUILayout.ExpandHeight( true ), GUILayout.ExpandWidth( true ) ); + GUILayout.Label( m_changeLog.LastUpdate, "WordWrappedMiniLabel", GUILayout.ExpandHeight( true ) ); + GUILayout.EndScrollView(); + + EditorGUILayout.BeginHorizontal( GUILayout.ExpandWidth( true ) ); + { + EditorGUILayout.BeginVertical(); + GUILayout.Label( ASETitle, m_labelStyle ); + + GUILayout.Label( "Installed Version: " + VersionInfo.StaticToString() ); + + if( m_changeLog.Version > VersionInfo.FullNumber ) + { + var cache = GUI.color; + GUI.color = Color.red; + GUILayout.Label( "New version available: " + m_newVersion, "BoldLabel" ); + GUI.color = cache; + } + else + { + var cache = GUI.color; + GUI.color = Color.green; + GUILayout.Label( "You are using the latest version", "BoldLabel" ); + GUI.color = cache; + } + + EditorGUILayout.BeginHorizontal(); + GUILayout.Label( "Download links:" ); + if( GUILayout.Button( "Amplify", m_linkStyle ) ) + Application.OpenURL( SiteURL ); + GUILayout.Label( "-" ); + if( GUILayout.Button( "Asset Store", m_linkStyle ) ) + Application.OpenURL( StoreURL ); + EditorGUILayout.EndHorizontal(); + GUILayout.Space( 7 ); + EditorGUILayout.EndVertical(); + + GUILayout.FlexibleSpace(); + EditorGUILayout.BeginVertical(); + GUILayout.Space( 7 ); + GUILayout.Label( ASEIcon ); + EditorGUILayout.EndVertical(); + } + EditorGUILayout.EndHorizontal(); + } + EditorGUILayout.EndVertical(); + } + EditorGUILayout.EndHorizontal(); + + + EditorGUILayout.BeginHorizontal( "ProjectBrowserBottomBarBg", GUILayout.ExpandWidth( true ), GUILayout.Height(22) ); + { + GUILayout.FlexibleSpace(); + EditorGUI.BeginChangeCheck(); + var cache = EditorGUIUtility.labelWidth; + EditorGUIUtility.labelWidth = 100; + m_startup = (Preferences.ShowOption)EditorGUILayout.EnumPopup( "Show At Startup", m_startup, GUILayout.Width( 220 ) ); + EditorGUIUtility.labelWidth = cache; + if( EditorGUI.EndChangeCheck() ) + { + EditorPrefs.SetInt( Preferences.PrefStartUp, (int)m_startup ); + } + } + EditorGUILayout.EndHorizontal(); + + // Find a better way to update link buttons without repainting the window + Repaint(); + } + + void ImportSample( string pipeline, string guid ) + { + if( EditorUtility.DisplayDialog( "Import Sample", "This will import the samples for" + pipeline.Replace( " Samples", "" ) + ", please make sure the pipeline is properly installed and/or selected before importing the samples.\n\nContinue?", "Yes", "No" ) ) + { + AssetDatabase.ImportPackage( AssetDatabase.GUIDToAssetPath( ResourcesGUID ), false ); + AssetDatabase.ImportPackage( AssetDatabase.GUIDToAssetPath( guid ), false ); + } + } + + UnityWebRequest www; + + IEnumerator StartRequest( string url, Action success = null ) + { + using( www = UnityWebRequest.Get( url ) ) + { +#if UNITY_2017_2_OR_NEWER + yield return www.SendWebRequest(); +#else + yield return www.Send(); +#endif + + while( www.isDone == false ) + yield return null; + + if( success != null ) + success(); + } + } + + public static void StartBackgroundTask( IEnumerator update, Action end = null ) + { + EditorApplication.CallbackFunction closureCallback = null; + + closureCallback = () => + { + try + { + if( update.MoveNext() == false ) + { + if( end != null ) + end(); + EditorApplication.update -= closureCallback; + } + } + catch( Exception ex ) + { + if( end != null ) + end(); + Debug.LogException( ex ); + EditorApplication.update -= closureCallback; + } + }; + + EditorApplication.update += closureCallback; + } + } + + [Serializable] + internal class ChangeLogInfo + { + public int Version; + public string LastUpdate; + + public static ChangeLogInfo CreateFromJSON( string jsonString ) + { + return JsonUtility.FromJson( jsonString ); + } + + public ChangeLogInfo( int version, string lastUpdate ) + { + Version = version; + LastUpdate = lastUpdate; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ASEStartScreen.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ASEStartScreen.cs.meta new file mode 100644 index 0000000..b9441e3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ASEStartScreen.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3e7433fb42db4d9428571bfcd0da64f3 +timeCreated: 1585827066 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ASETextureArrayCreator.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ASETextureArrayCreator.cs new file mode 100644 index 0000000..db01c9c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ASETextureArrayCreator.cs @@ -0,0 +1,813 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda +//#define NEW_TEXTURE_3D_METHOD + +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +using UnityEditorInternal; +using System; +using System.IO; + +namespace AmplifyShaderEditor +{ + [CustomEditor( typeof( TextureArrayCreatorAsset ) )] + public class TextureArrayCreatorAssetEditor : Editor + { + private string[] m_sizesStr = { "32", "64", "128", "256", "512", "1024", "2048", "4096", "8192" }; + private int[] m_sizes = { 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192 }; + + private const string ArrayFilename = "NewTextureArray"; + private const string Texture3DFilename = "NewTexture3D"; + + private GUIContent m_pathButtonContent = new GUIContent(); + private GUIStyle m_pathButtonStyle = null; + + public TextureArrayCreatorAsset Instance; + + private DragAndDropTool m_dragAndDropTool; + + SerializedObject m_so; + SerializedProperty m_selectedSize; + SerializedProperty m_lockRatio; + SerializedProperty m_sizeX; + SerializedProperty m_sizeY; + SerializedProperty m_tex3DMode; + SerializedProperty m_linearMode; + SerializedProperty m_mipMaps; + SerializedProperty m_wrapMode; + SerializedProperty m_filterMode; + SerializedProperty m_anisoLevel; + SerializedProperty m_selectedFormatEnum; + SerializedProperty m_quality; + SerializedProperty m_folderPath; + SerializedProperty m_fileName; + SerializedProperty m_filenameChanged; + SerializedProperty m_allTextures; + + [SerializeField] + private ReorderableList m_listTextures = null; + + [SerializeField] + private int m_previewSize; + + public void OnEnable() + { + Instance = (TextureArrayCreatorAsset)target; + + m_so = serializedObject; + m_selectedSize = m_so.FindProperty( "m_selectedSize" ); + m_lockRatio = m_so.FindProperty( "m_lockRatio" ); + m_sizeX = m_so.FindProperty( "m_sizeX" ); + m_sizeY = m_so.FindProperty( "m_sizeY" ); + m_tex3DMode = m_so.FindProperty( "m_tex3DMode" ); + m_linearMode = m_so.FindProperty( "m_linearMode" ); + m_mipMaps = m_so.FindProperty( "m_mipMaps" ); + m_wrapMode = m_so.FindProperty( "m_wrapMode" ); + m_filterMode = m_so.FindProperty( "m_filterMode" ); + m_anisoLevel = m_so.FindProperty( "m_anisoLevel" ); + m_selectedFormatEnum = m_so.FindProperty( "m_selectedFormatEnum" ); + m_quality = m_so.FindProperty( "m_quality" ); + m_folderPath = m_so.FindProperty( "m_folderPath" ); + m_fileName = m_so.FindProperty( "m_fileName" ); + m_filenameChanged = m_so.FindProperty( "m_filenameChanged" ); + m_allTextures = m_so.FindProperty( "m_allTextures" ); + + if( m_listTextures == null ) + { + m_listTextures = new ReorderableList( m_so, m_allTextures, true, true, true, true ); + m_listTextures.elementHeight = 16; + + m_listTextures.drawElementCallback = ( Rect rect, int index, bool isActive, bool isFocused ) => + { + m_allTextures.GetArrayElementAtIndex( index ).objectReferenceValue = (Texture2D)EditorGUI.ObjectField( rect, "Texture " + index, m_allTextures.GetArrayElementAtIndex( index ).objectReferenceValue, typeof( Texture2D ), false ); + }; + + m_listTextures.drawHeaderCallback = ( Rect rect ) => + { + m_previewSize = EditorGUI.IntSlider( rect, "Texture List", m_previewSize, 16, 64 ); + if( (float)m_previewSize != m_listTextures.elementHeight ) + m_listTextures.elementHeight = m_previewSize; + }; + + m_listTextures.onAddCallback = ( list ) => + { + m_allTextures.InsertArrayElementAtIndex( m_allTextures.arraySize ); + m_allTextures.GetArrayElementAtIndex( m_allTextures.arraySize - 1 ).objectReferenceValue = null; + }; + + m_listTextures.onRemoveCallback = ( list ) => + { + m_allTextures.GetArrayElementAtIndex( list.index ).objectReferenceValue = null; + m_allTextures.DeleteArrayElementAtIndex( list.index ); + }; + } + + m_dragAndDropTool = new DragAndDropTool(); + m_dragAndDropTool.OnValidDropObjectEvt += OnValidObjectsDropped; + } + + public void OnValidObjectsDropped( UnityEngine.Object[] droppedObjs ) + { + for( int objIdx = 0; objIdx < droppedObjs.Length; objIdx++ ) + { + Texture2D tex = droppedObjs[ objIdx ] as Texture2D; + if( tex != null ) + { + m_allTextures.InsertArrayElementAtIndex( m_allTextures.arraySize ); + m_allTextures.GetArrayElementAtIndex( m_allTextures.arraySize - 1 ).objectReferenceValue = tex; + m_so.ApplyModifiedProperties(); + } + else + { + DefaultAsset asset = droppedObjs[ objIdx ] as DefaultAsset; + if( asset != null ) + { + string path = AssetDatabase.GetAssetPath( asset ); + if( AssetDatabase.IsValidFolder( path ) ) + { + string[] pathArr = { path }; + string[] texInDir = AssetDatabase.FindAssets( "t:Texture2D", pathArr ); + for( int texIdx = 0; texIdx < texInDir.Length; texIdx++ ) + { + Texture2D internalTex = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( texInDir[ texIdx ] ) ); + if( internalTex != null ) + { + m_allTextures.InsertArrayElementAtIndex( m_allTextures.arraySize ); + m_allTextures.GetArrayElementAtIndex( m_allTextures.arraySize - 1 ).objectReferenceValue = internalTex; + m_so.ApplyModifiedProperties(); + } + } + } + } + } + } + + Instance.AllTextures.Sort( ( x, y ) => string.Compare( x.name, y.name ) ); + m_so.Update(); + } + + private void OnDestroy() + { + m_dragAndDropTool.Destroy(); + m_dragAndDropTool = null; + } + + public override void OnInspectorGUI() + { + m_so.Update(); + + if( m_pathButtonStyle == null ) + m_pathButtonStyle = "minibutton"; + + EditorGUILayout.BeginHorizontal(); + var cache = EditorGUIUtility.labelWidth; + EditorGUILayout.PrefixLabel( "Size" ); + EditorGUIUtility.labelWidth = 16; + if( m_lockRatio.boolValue ) + { + m_selectedSize.intValue = EditorGUILayout.Popup( "X", m_selectedSize.intValue, m_sizesStr ); + EditorGUI.BeginDisabledGroup( m_lockRatio.boolValue ); + EditorGUILayout.Popup( "Y", m_selectedSize.intValue, m_sizesStr ); + EditorGUI.EndDisabledGroup(); + } + else + { + EditorGUILayout.PropertyField( m_sizeX, new GUIContent( "X" ) ); + EditorGUILayout.PropertyField( m_sizeY, new GUIContent( "Y" ) ); + } + EditorGUIUtility.labelWidth = 100; +#if UNITY_2017_1_OR_NEWER + m_lockRatio.boolValue = GUILayout.Toggle( m_lockRatio.boolValue, "L", "minibutton", GUILayout.Width( 18 ) ); +#else + GUILayout.Toggle( m_lockRatio.boolValue, "L", "minibutton", GUILayout.Width( 18 ) ); + m_lockRatio.boolValue = true; +#endif + if( m_lockRatio.boolValue ) + { + m_sizeX.intValue = m_sizes[ m_selectedSize.intValue ]; + m_sizeY.intValue = m_sizes[ m_selectedSize.intValue ]; + } + EditorGUIUtility.labelWidth = cache; + EditorGUILayout.EndHorizontal(); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.PropertyField( m_tex3DMode, new GUIContent( "Texture 3D" ) ); + if( EditorGUI.EndChangeCheck() ) + { + if( !m_filenameChanged.boolValue ) + { + m_fileName.stringValue = m_tex3DMode.boolValue ? Texture3DFilename : ArrayFilename; + } + } + EditorGUILayout.PropertyField( m_linearMode, new GUIContent( "Linear" ) ); + EditorGUILayout.PropertyField( m_mipMaps ); + EditorGUILayout.PropertyField( m_wrapMode ); + EditorGUILayout.PropertyField( m_filterMode ); + m_anisoLevel.intValue = EditorGUILayout.IntSlider( "Aniso Level", m_anisoLevel.intValue, 0, 16 ); + EditorGUILayout.PropertyField( m_selectedFormatEnum, new GUIContent( "Format" ) ); + + if( m_selectedFormatEnum.intValue == (int)TextureFormat.DXT1Crunched ) + { + m_selectedFormatEnum.intValue = (int)TextureFormat.DXT1; + Debug.Log( "Texture Array does not support crunched DXT1 format. Changing to DXT1..." ); + } + else if( m_selectedFormatEnum.intValue == (int)TextureFormat.DXT5Crunched ) + { + m_selectedFormatEnum.intValue = (int)TextureFormat.DXT5; + Debug.Log( "Texture Array does not support crunched DXT5 format. Changing to DXT5..." ); + } + + m_quality.intValue = EditorGUILayout.IntSlider( "Format Quality", m_quality.intValue, 0, 100 ); + EditorGUILayout.Separator(); + + EditorGUILayout.LabelField( "Path and Name" ); + EditorGUILayout.BeginHorizontal(); + m_pathButtonContent.text = m_folderPath.stringValue; + Vector2 buttonSize = m_pathButtonStyle.CalcSize( m_pathButtonContent ); + if( GUILayout.Button( m_pathButtonContent, m_pathButtonStyle, GUILayout.MaxWidth( Mathf.Min( Screen.width * 0.5f, buttonSize.x ) ) ) ) + { + string folderpath = EditorUtility.OpenFolderPanel( "Save Texture Array to folder", "Assets/", "" ); + folderpath = FileUtil.GetProjectRelativePath( folderpath ); + if( string.IsNullOrEmpty( folderpath ) ) + m_folderPath.stringValue = "Assets/"; + else + m_folderPath.stringValue = folderpath + "/"; + } + EditorGUI.BeginChangeCheck(); + m_fileName.stringValue = EditorGUILayout.TextField( m_fileName.stringValue, GUILayout.ExpandWidth( true ) ); + if( EditorGUI.EndChangeCheck() ) + { + m_filenameChanged.boolValue = m_fileName.stringValue == ArrayFilename ? false : true; + } + EditorGUILayout.LabelField( ".asset", GUILayout.MaxWidth( 40 ) ); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.Separator(); + + if( GUILayout.Button( "Clear" ) ) + { + m_allTextures.ClearArray(); + } + + if( m_listTextures != null ) + m_listTextures.DoLayoutList(); + + EditorGUILayout.Separator(); + + m_dragAndDropTool.TestDragAndDrop( new Rect( 0, 0, Screen.width, Screen.height ) ); + + m_so.ApplyModifiedProperties(); + } + } + + public class ASETextureArrayCreator : EditorWindow + { + [MenuItem( "Window/Amplify Shader Editor/Texture Array Creator", false, 1001 )] + static void ShowWindow() + { + ASETextureArrayCreator window = EditorWindow.GetWindow(); + window.titleContent.text = "Texture Array"; + window.minSize = new Vector2( 302, 350 ); + window.Show(); + } + + private const string ClearButtonStr = "Clear"; + private const string TextureFilter = "t:Texture2D"; + private const string BuildArrayMessage = "Build Array"; + private const string BuildTexture3DMessage = "Build Texture 3D"; + private const string ArrayFilename = "NewTextureArray"; + private const string Texture3DFilename = "NewTexture3D"; + + TextureArrayCreatorAssetEditor m_editor; + + [SerializeField] + private TextureArrayCreatorAsset m_asset; + + [SerializeField] + private TextureArrayCreatorAsset m_dummyAsset; + + private static List UncompressedFormats = new List() + { + TextureFormat.RGBAFloat, + TextureFormat.RGBAHalf, + TextureFormat.ARGB32, + TextureFormat.RGBA32, + TextureFormat.RGB24, + TextureFormat.Alpha8 + }; + + private GUIStyle m_contentStyle = null; + + private Vector2 m_scrollPos; + private Texture m_lastSaved; + private string m_message = string.Empty; + + private void OnEnable() + { + if( m_contentStyle == null ) + { + m_contentStyle = new GUIStyle( GUIStyle.none ); + m_contentStyle.margin = new RectOffset( 6, 4, 5, 5 ); + } + } + + private void OnDestroy() + { + DestroyImmediate( m_editor ); + if( m_dummyAsset != null && m_dummyAsset != m_asset ) + DestroyImmediate( m_dummyAsset ); + } + + void OnGUI() + { + TextureArrayCreatorAsset currentAsset = null; + if( m_asset != null ) + { + currentAsset = m_asset; + } + else + { + if( m_dummyAsset == null ) + { + m_dummyAsset = ScriptableObject.CreateInstance(); + m_dummyAsset.name = "Dummy"; + } + currentAsset = m_dummyAsset; + } + + m_scrollPos = EditorGUILayout.BeginScrollView( m_scrollPos, GUILayout.Height( position.height ) ); + float cachedWidth = EditorGUIUtility.labelWidth; + EditorGUIUtility.labelWidth = 100; + EditorGUILayout.BeginVertical( m_contentStyle ); + + string buildButtonStr = currentAsset.Tex3DMode ? BuildTexture3DMessage : BuildArrayMessage; + // build button + EditorGUILayout.BeginHorizontal(); + EditorGUI.BeginDisabledGroup( currentAsset.AllTextures.Count <= 0 ); + if( GUILayout.Button( buildButtonStr, "prebutton", GUILayout.Height( 20 ) ) ) + { + bool showWarning = false; + for( int i = 0; i < currentAsset.AllTextures.Count; i++ ) + { + if( currentAsset.AllTextures[ i ].width != currentAsset.SizeX || currentAsset.AllTextures[ i ].height != currentAsset.SizeY ) + { + showWarning = true; + } + } + + if( !showWarning ) + { + m_message = string.Empty; + if( currentAsset.Tex3DMode ) + BuildTexture3D( currentAsset ); + else + BuildArray( currentAsset ); + } + else if( EditorUtility.DisplayDialog( "Warning!", "Some textures need to be resized to fit the selected size. Do you want to continue?", "Yes", "No" ) ) + { + m_message = string.Empty; + if( currentAsset.Tex3DMode ) + BuildTexture3D( currentAsset ); + else + BuildArray( currentAsset ); + } + } + EditorGUI.EndDisabledGroup(); + EditorGUI.BeginDisabledGroup( m_lastSaved == null ); + GUIContent icon = EditorGUIUtility.IconContent( "icons/d_ViewToolZoom.png" ); + if( GUILayout.Button( icon, "prebutton", GUILayout.Width( 28 ), GUILayout.Height( 20 ) ) ) + { + EditorGUIUtility.PingObject( m_lastSaved ); + } + EditorGUI.EndDisabledGroup(); + EditorGUILayout.EndHorizontal(); + + // message + if( !string.IsNullOrEmpty( m_message ) ) + if( GUILayout.Button( "BUILD REPORT (click to hide):\n\n" + m_message, "helpbox" ) ) + m_message = string.Empty; + + // asset + EditorGUILayout.BeginHorizontal(); + m_asset = EditorGUILayout.ObjectField( "Asset Preset", m_asset, typeof( TextureArrayCreatorAsset ), false ) as TextureArrayCreatorAsset; + if( GUILayout.Button( m_asset != null ? "Save" : "Create", "minibutton", GUILayout.Width( 50 ) ) ) + { + string defaultName = "ArrayPreset"; + if( m_asset != null ) + defaultName = m_asset.name; + + string path = EditorUtility.SaveFilePanelInProject( "Save as", defaultName, "asset", string.Empty ); + if( !string.IsNullOrEmpty( path ) ) + { + TextureArrayCreatorAsset outfile = AssetDatabase.LoadMainAssetAtPath( path ) as TextureArrayCreatorAsset; + if( outfile != null ) + { + EditorUtility.CopySerialized( currentAsset, outfile ); + AssetDatabase.SaveAssets(); + Selection.activeObject = outfile; + EditorGUIUtility.PingObject( outfile ); + } + else + { + if( m_asset != null ) + { + currentAsset = ScriptableObject.CreateInstance(); + EditorUtility.CopySerialized( m_asset, currentAsset ); + } + AssetDatabase.CreateAsset( currentAsset, path ); + Selection.activeObject = currentAsset; + EditorGUIUtility.PingObject( currentAsset ); + m_asset = currentAsset; + } + } + } + EditorGUILayout.EndHorizontal(); + EditorGUILayout.Separator(); + + if( Event.current.type == EventType.Layout ) + { + if( m_editor == null ) + { + m_editor = Editor.CreateEditor( currentAsset, typeof( TextureArrayCreatorAssetEditor ) ) as TextureArrayCreatorAssetEditor; + } + else + { + if( m_editor.Instance != currentAsset ) + { + DestroyImmediate( m_editor ); + m_editor = Editor.CreateEditor( currentAsset, typeof( TextureArrayCreatorAssetEditor ) ) as TextureArrayCreatorAssetEditor; + } + } + } + if( m_editor != null ) + m_editor.OnInspectorGUI(); + + GUILayout.Space( 20 ); + EditorGUILayout.EndVertical(); + EditorGUIUtility.labelWidth = cachedWidth; + EditorGUILayout.EndScrollView(); + } + + private void CopyToArray( ref Texture2D from, ref Texture2DArray to, int arrayIndex, int mipLevel, bool compressed = true ) + { + if( compressed ) + { + Graphics.CopyTexture( from, 0, mipLevel, to, arrayIndex, mipLevel ); + } + else + { + to.SetPixels( from.GetPixels(), arrayIndex, mipLevel ); + to.Apply(); + } + } + +#if NEW_TEXTURE_3D_METHOD + private void BuildTexture3D( TextureArrayCreatorAsset asset ) + { + int sizeX = asset.SizeX; + int sizeY = asset.SizeY; + + Texture3D texture3D = new Texture3D( sizeX, sizeY, asset.AllTextures.Count, asset.SelectedFormatEnum, asset.MipMaps ); + texture3D.wrapMode = asset.WrapMode; + texture3D.filterMode = asset.FilterMode; + texture3D.anisoLevel = asset.AnisoLevel; + //texture3D.Apply( false ); + RenderTexture cache = RenderTexture.active; + RenderTexture rt = new RenderTexture( sizeX, sizeY, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Default ); + rt.Create(); + List textures = new List( asset.AllTextures.Count ); + + for( int i = 0; i < asset.AllTextures.Count; i++ ) + { + // build report + int widthChanges = asset.AllTextures[ i ].width < sizeX ? -1 : asset.AllTextures[ i ].width > sizeX ? 1 : 0; + int heightChanges = asset.AllTextures[ i ].height < sizeY ? -1 : asset.AllTextures[ i ].height > sizeY ? 1 : 0; + if( ( widthChanges < 0 && heightChanges <= 0 ) || ( widthChanges <= 0 && heightChanges < 0 ) ) + m_message += asset.AllTextures[ i ].name + " was upscaled\n"; + else if( ( widthChanges > 0 && heightChanges >= 0 ) || ( widthChanges >= 0 && heightChanges > 0 ) ) + m_message += asset.AllTextures[ i ].name + " was downscaled\n"; + else if( ( widthChanges > 0 && heightChanges < 0 ) || ( widthChanges < 0 && heightChanges > 0 ) ) + m_message += asset.AllTextures[ i ].name + " changed dimensions\n"; + + // blit image to upscale or downscale the image to any size + RenderTexture.active = rt; + + bool cachedsrgb = GL.sRGBWrite; + GL.sRGBWrite = !asset.LinearMode; + Graphics.Blit( asset.AllTextures[ i ], rt ); + GL.sRGBWrite = cachedsrgb; + + textures.Add( new Texture2D( sizeX, sizeY, TextureFormat.ARGB32, asset.MipMaps, asset.LinearMode ) ); + textures[ i ].ReadPixels( new Rect( 0, 0, sizeX, sizeY ), 0, 0, asset.MipMaps ); + RenderTexture.active = null; + + bool isCompressed = UncompressedFormats.FindIndex( x => x.Equals( asset.SelectedFormatEnum ) ) < 0; + if( isCompressed ) + { + EditorUtility.CompressTexture( textures[ i ], asset.SelectedFormatEnum, asset.Quality ); + // t2d.Apply( false ); + } + textures[ i ].Apply( false ); + } + + rt.Release(); + RenderTexture.active = cache; + + if( m_message.Length > 0 ) + m_message = m_message.Substring( 0, m_message.Length - 1 ); + + int sizeZ = textures.Count; + Color[] colors = new Color[ sizeX * sizeY * sizeZ ]; + int idx = 0; + for( int z = 0; z < sizeZ; z++ ) + { + for( int y = 0; y < sizeY; y++ ) + { + for( int x = 0; x < sizeX; x++, idx++ ) + { + colors[ idx ] = textures[ z ].GetPixel(x,y); + } + } + } + + texture3D.SetPixels( colors ); + texture3D.Apply(); + + string path = asset.FolderPath + asset.FileName + ".asset"; + Texture3D outfile = AssetDatabase.LoadMainAssetAtPath( path ) as Texture3D; + if( outfile != null ) + { + EditorUtility.CopySerialized( texture3D, outfile ); + AssetDatabase.SaveAssets(); + EditorGUIUtility.PingObject( outfile ); + m_lastSaved = outfile; + } + else + { + AssetDatabase.CreateAsset( texture3D, path ); + EditorGUIUtility.PingObject( texture3D ); + m_lastSaved = texture3D; + } + } +#else + private void BuildTexture3D( TextureArrayCreatorAsset asset ) + { + int sizeX = asset.SizeX; + int sizeY = asset.SizeY; + int numLevels = 1 + (int)Mathf.Floor( Mathf.Log( Mathf.Max( sizeX, sizeY ), 2 ) ); + int mipCount = asset.MipMaps ? numLevels : 1; + + Texture3D texture3D = new Texture3D( sizeX, sizeY, asset.AllTextures.Count, asset.SelectedFormatEnum, asset.MipMaps ); + texture3D.wrapMode = asset.WrapMode; + texture3D.filterMode = asset.FilterMode; + texture3D.anisoLevel = asset.AnisoLevel; + texture3D.Apply( false ); + RenderTexture cache = RenderTexture.active; + RenderTexture rt = new RenderTexture( sizeX, sizeY, 0, RenderTextureFormat.ARGBFloat, RenderTextureReadWrite.Default ); + rt.Create(); + List> mipColor = new List>(); + if( asset.MipMaps ) + { + for( int i = 0; i < mipCount; i++ ) + { + mipColor.Add( new List() ); + } + } + else + { + mipColor.Add( new List() ); + } + + for( int i = 0; i < asset.AllTextures.Count; i++ ) + { + // build report + int widthChanges = asset.AllTextures[ i ].width < sizeX ? -1 : asset.AllTextures[ i ].width > sizeX ? 1 : 0; + int heightChanges = asset.AllTextures[ i ].height < sizeY ? -1 : asset.AllTextures[ i ].height > sizeY ? 1 : 0; + if( ( widthChanges < 0 && heightChanges <= 0 ) || ( widthChanges <= 0 && heightChanges < 0 ) ) + m_message += asset.AllTextures[ i ].name + " was upscaled\n"; + else if( ( widthChanges > 0 && heightChanges >= 0 ) || ( widthChanges >= 0 && heightChanges > 0 ) ) + m_message += asset.AllTextures[ i ].name + " was downscaled\n"; + else if( ( widthChanges > 0 && heightChanges < 0 ) || ( widthChanges < 0 && heightChanges > 0 ) ) + m_message += asset.AllTextures[ i ].name + " changed dimensions\n"; + + // blit image to upscale or downscale the image to any size + RenderTexture.active = rt; + + bool cachedsrgb = GL.sRGBWrite; + GL.sRGBWrite = !asset.LinearMode; + Graphics.Blit( asset.AllTextures[ i ], rt ); + GL.sRGBWrite = cachedsrgb; + + bool isCompressed = UncompressedFormats.FindIndex( x => x.Equals( asset.SelectedFormatEnum ) ) < 0; + TextureFormat validReadPixelsFormat = isCompressed ? TextureFormat.RGBAFloat : asset.SelectedFormatEnum; + Texture2D t2d = new Texture2D( sizeX, sizeY, validReadPixelsFormat, asset.MipMaps, asset.LinearMode ); + t2d.ReadPixels( new Rect( 0, 0, sizeX, sizeY ), 0, 0, asset.MipMaps ); + RenderTexture.active = null; + + if( isCompressed ) + { + EditorUtility.CompressTexture( t2d, asset.SelectedFormatEnum, asset.Quality ); + // t2d.Apply( false ); + } + t2d.Apply( false ); + + if( asset.MipMaps ) + { + for( int mip = 0; mip < mipCount; mip++ ) + { + mipColor[ mip ].AddRange( t2d.GetPixels( mip ) ); + } + } + else + { + mipColor[ 0 ].AddRange( t2d.GetPixels( 0 ) ); + } + } + + rt.Release(); + RenderTexture.active = cache; + + if( m_message.Length > 0 ) + m_message = m_message.Substring( 0, m_message.Length - 1 ); + + for( int i = 0; i < mipCount; i++ ) + { + texture3D.SetPixels( mipColor[ i ].ToArray(), i ); + } + + texture3D.Apply( false ); + + string path = asset.FolderPath + asset.FileName + ".asset"; + Texture3D outfile = AssetDatabase.LoadMainAssetAtPath( path ) as Texture3D; + if( outfile != null ) + { + EditorUtility.CopySerialized( texture3D, outfile ); + AssetDatabase.SaveAssets(); + EditorGUIUtility.PingObject( outfile ); + m_lastSaved = outfile; + } + else + { + AssetDatabase.CreateAsset( texture3D, path ); + EditorGUIUtility.PingObject( texture3D ); + m_lastSaved = texture3D; + } + } +#endif + private void BuildTexture3DAutoMips( TextureArrayCreatorAsset asset ) + { + int sizeX = asset.SizeX; + int sizeY = asset.SizeY; + + Texture3D texture3D = new Texture3D( sizeX, sizeY, asset.AllTextures.Count, asset.SelectedFormatEnum, asset.MipMaps ); + texture3D.wrapMode = asset.WrapMode; + texture3D.filterMode = asset.FilterMode; + texture3D.anisoLevel = asset.AnisoLevel; + texture3D.Apply( false ); + RenderTexture cache = RenderTexture.active; + RenderTexture rt = new RenderTexture( sizeX, sizeY, 0, RenderTextureFormat.ARGBFloat, RenderTextureReadWrite.Default ); + rt.Create(); + List texColors = new List(); + + for( int i = 0; i < asset.AllTextures.Count; i++ ) + { + // build report + int widthChanges = asset.AllTextures[ i ].width < sizeX ? -1 : asset.AllTextures[ i ].width > sizeX ? 1 : 0; + int heightChanges = asset.AllTextures[ i ].height < sizeY ? -1 : asset.AllTextures[ i ].height > sizeY ? 1 : 0; + if( ( widthChanges < 0 && heightChanges <= 0 ) || ( widthChanges <= 0 && heightChanges < 0 ) ) + m_message += asset.AllTextures[ i ].name + " was upscaled\n"; + else if( ( widthChanges > 0 && heightChanges >= 0 ) || ( widthChanges >= 0 && heightChanges > 0 ) ) + m_message += asset.AllTextures[ i ].name + " was downscaled\n"; + else if( ( widthChanges > 0 && heightChanges < 0 ) || ( widthChanges < 0 && heightChanges > 0 ) ) + m_message += asset.AllTextures[ i ].name + " changed dimensions\n"; + + // blit image to upscale or downscale the image to any size + RenderTexture.active = rt; + + bool cachedsrgb = GL.sRGBWrite; + GL.sRGBWrite = !asset.LinearMode; + Graphics.Blit( asset.AllTextures[ i ], rt ); + GL.sRGBWrite = cachedsrgb; + + bool isCompressed = UncompressedFormats.FindIndex( x => x.Equals( asset.SelectedFormatEnum ) ) < 0; + TextureFormat validReadPixelsFormat = isCompressed ? TextureFormat.RGBAFloat : asset.SelectedFormatEnum; + Texture2D t2d = new Texture2D( sizeX, sizeY, validReadPixelsFormat, asset.MipMaps, asset.LinearMode ); + t2d.ReadPixels( new Rect( 0, 0, sizeX, sizeY ), 0, 0, asset.MipMaps ); + RenderTexture.active = null; + + if( isCompressed ) + { + EditorUtility.CompressTexture( t2d, asset.SelectedFormatEnum, asset.Quality ); + t2d.Apply( false ); + } + texColors.AddRange( t2d.GetPixels() ); + } + + rt.Release(); + RenderTexture.active = cache; + + if( m_message.Length > 0 ) + m_message = m_message.Substring( 0, m_message.Length - 1 ); + + texture3D.SetPixels( texColors.ToArray() ); + texture3D.Apply(); + + string path = asset.FolderPath + asset.FileName + ".asset"; + Texture3D outfile = AssetDatabase.LoadMainAssetAtPath( path ) as Texture3D; + if( outfile != null ) + { + EditorUtility.CopySerialized( texture3D, outfile ); + AssetDatabase.SaveAssets(); + EditorGUIUtility.PingObject( outfile ); + m_lastSaved = outfile; + } + else + { + AssetDatabase.CreateAsset( texture3D, path ); + EditorGUIUtility.PingObject( texture3D ); + m_lastSaved = texture3D; + } + } + + private void BuildArray( TextureArrayCreatorAsset asset ) + { + int sizeX = asset.SizeX; + int sizeY = asset.SizeY; + + Texture2DArray textureArray = new Texture2DArray( sizeX, sizeY, asset.AllTextures.Count, asset.SelectedFormatEnum, asset.MipMaps, asset.LinearMode ); + textureArray.wrapMode = asset.WrapMode; + textureArray.filterMode = asset.FilterMode; + textureArray.anisoLevel = asset.AnisoLevel; + textureArray.Apply( false ); + RenderTexture cache = RenderTexture.active; + RenderTexture rt = new RenderTexture( sizeX, sizeY, 0, RenderTextureFormat.ARGBFloat, RenderTextureReadWrite.Default ); + rt.Create(); + for( int i = 0; i < asset.AllTextures.Count; i++ ) + { + // build report + int widthChanges = asset.AllTextures[ i ].width < sizeX ? -1 : asset.AllTextures[ i ].width > sizeX ? 1 : 0; + int heightChanges = asset.AllTextures[ i ].height < sizeY ? -1 : asset.AllTextures[ i ].height > sizeY ? 1 : 0; + if( ( widthChanges < 0 && heightChanges <= 0 ) || ( widthChanges <= 0 && heightChanges < 0 ) ) + m_message += asset.AllTextures[ i ].name + " was upscaled\n"; + else if( ( widthChanges > 0 && heightChanges >= 0 ) || ( widthChanges >= 0 && heightChanges > 0 ) ) + m_message += asset.AllTextures[ i ].name + " was downscaled\n"; + else if( ( widthChanges > 0 && heightChanges < 0 ) || ( widthChanges < 0 && heightChanges > 0 ) ) + m_message += asset.AllTextures[ i ].name + " changed dimensions\n"; + + // blit image to upscale or downscale the image to any size + RenderTexture.active = rt; + + bool cachedsrgb = GL.sRGBWrite; + GL.sRGBWrite = !asset.LinearMode; + Graphics.Blit( asset.AllTextures[ i ], rt ); + GL.sRGBWrite = cachedsrgb; + + bool isCompressed = UncompressedFormats.FindIndex( x => x.Equals( asset.SelectedFormatEnum ) ) < 0; + TextureFormat validReadPixelsFormat = isCompressed ? TextureFormat.RGBAFloat : asset.SelectedFormatEnum; + Texture2D t2d = new Texture2D( sizeX, sizeY, validReadPixelsFormat, asset.MipMaps, asset.LinearMode ); + t2d.ReadPixels( new Rect( 0, 0, sizeX, sizeY ), 0, 0, asset.MipMaps ); + RenderTexture.active = null; + + if( isCompressed ) + { + EditorUtility.CompressTexture( t2d, asset.SelectedFormatEnum, asset.Quality ); + t2d.Apply( false ); + } + + if( asset.MipMaps ) + { + int maxSize = Mathf.Max( sizeX, sizeY ); + int numLevels = 1 + (int)Mathf.Floor( Mathf.Log( maxSize, 2 ) ); + for( int mip = 0; mip < numLevels; mip++ ) + { + CopyToArray( ref t2d, ref textureArray, i, mip, isCompressed ); + } + } + else + { + CopyToArray( ref t2d, ref textureArray, i, 0, isCompressed ); + } + } + + rt.Release(); + RenderTexture.active = cache; + if( m_message.Length > 0 ) + m_message = m_message.Substring( 0, m_message.Length - 1 ); + + string path = asset.FolderPath + asset.FileName + ".asset"; + Texture2DArray outfile = AssetDatabase.LoadMainAssetAtPath( path ) as Texture2DArray; + if( outfile != null ) + { + EditorUtility.CopySerialized( textureArray, outfile ); + AssetDatabase.SaveAssets(); + EditorGUIUtility.PingObject( outfile ); + m_lastSaved = outfile; + } + else + { + AssetDatabase.CreateAsset( textureArray, path ); + EditorGUIUtility.PingObject( textureArray ); + m_lastSaved = textureArray; + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ASETextureArrayCreator.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ASETextureArrayCreator.cs.meta new file mode 100644 index 0000000..7a01b4f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ASETextureArrayCreator.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 436dc8bc09773454db57b9fbf799ec9d +timeCreated: 1504633068 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/CustomMaterialInspector.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/CustomMaterialInspector.cs new file mode 100644 index 0000000..b4584fe --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/CustomMaterialInspector.cs @@ -0,0 +1,543 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System; +using System.Reflection; +using AmplifyShaderEditor; + + +public static class MaterialPropertyHandlerEx +{ + private static System.Type type = null; + public static System.Type Type { get { return ( type == null ) ? type = System.Type.GetType( "UnityEditor.MaterialPropertyHandler, UnityEditor" ) : type; } } + public static object GetHandler( Shader shader, string name ) + { + return MaterialPropertyHandlerEx.Type.InvokeMember( "GetHandler", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { shader, name } ); + } + + public static void OnGUI( object obj, ref Rect position, MaterialProperty prop, GUIContent label, MaterialEditor editor ) + { + Type.InvokeMember( "OnGUI", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod, null, obj, new object[] { position, prop, label, editor } ); + } + + public static float GetPropertyHeight( object obj, MaterialProperty prop, string label, MaterialEditor editor ) + { + return (float)Type.InvokeMember( "GetPropertyHeight", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod, null, obj, new object[] { prop, label, editor } ); + } + + public static object PropertyDrawer( object obj ) + { + return Type.InvokeMember( "propertyDrawer", BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty, null, obj, new object[] {} ); + } +} + +internal class ASEMaterialInspector : ShaderGUI +{ + private const string CopyButtonStr = "Copy Values"; + private const string PasteButtonStr = "Paste Values"; + private const string PreviewModelPref = "ASEMI_PREVIEWMODEL"; + + private static MaterialEditor m_instance = null; + private static bool m_refreshOnUndo = false; + + private bool m_initialized = false; + private double m_lastRenderedTime; + private PreviewRenderUtility m_previewRenderUtility; + private Mesh m_targetMesh; + private Vector2 m_previewDir = new Vector2( 120f, -20f ); + private int m_selectedMesh = 0; + + + // Reflection Fields + private Type m_modelInspectorType = null; + private MethodInfo m_renderMeshMethod = null; + private Type m_previewGUIType = null; + private MethodInfo m_dragMethod = null; + private FieldInfo m_selectedField = null; + private FieldInfo m_infoField = null; + +#if UNITY_2020_1_OR_NEWER + private Type m_previewSettingsType = null; + object m_previewSettingsInstance; + FieldInfo previewDirInfo; + FieldInfo shadedMaterialInfo; + FieldInfo activeMaterialInfo; +#endif + +#if UNITY_2018_2_OR_NEWER + public override void OnClosed( Material material ) + { + base.OnClosed( material ); + CleanUp(); + } +#endif + + void CleanUp() + { + if( m_previewRenderUtility != null ) + { + m_previewRenderUtility.Cleanup(); + m_previewRenderUtility = null; + } + } + + void UndoRedoPerformed() + { + m_refreshOnUndo = true; + } + + ~ASEMaterialInspector() + { + Undo.undoRedoPerformed -= UndoRedoPerformed; + CleanUp(); + } + public override void OnGUI( MaterialEditor materialEditor, MaterialProperty[] properties ) + { + IOUtils.Init(); + Material mat = materialEditor.target as Material; + + if( mat == null ) + return; + + m_instance = materialEditor; + + if( !m_initialized ) + { + Init(); + m_initialized = true; + Undo.undoRedoPerformed += UndoRedoPerformed; + } + + if( Event.current.type == EventType.Repaint && + mat.HasProperty( IOUtils.DefaultASEDirtyCheckId ) && + mat.GetInt( IOUtils.DefaultASEDirtyCheckId ) == 1 ) + { + mat.SetInt( IOUtils.DefaultASEDirtyCheckId, 0 ); + UIUtils.ForceUpdateFromMaterial(); + //Event.current.Use(); + } + + if( materialEditor.isVisible ) + { + GUILayout.BeginVertical(); + { + GUILayout.Space( 3 ); + if( GUILayout.Button( "Open in Shader Editor" ) ) + { +#if UNITY_2018_3_OR_NEWER + ASEPackageManagerHelper.SetupLateMaterial( mat ); + +#else + AmplifyShaderEditorWindow.LoadMaterialToASE( mat ); +#endif + } + + GUILayout.BeginHorizontal(); + { + if( GUILayout.Button( CopyButtonStr ) ) + { + System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture; + + Shader shader = mat.shader; + int propertyCount = UnityEditor.ShaderUtil.GetPropertyCount( shader ); + string allProperties = string.Empty; + for( int i = 0; i < propertyCount; i++ ) + { + UnityEditor.ShaderUtil.ShaderPropertyType type = UnityEditor.ShaderUtil.GetPropertyType( shader, i ); + string name = UnityEditor.ShaderUtil.GetPropertyName( shader, i ); + string valueStr = string.Empty; + switch( type ) + { + case UnityEditor.ShaderUtil.ShaderPropertyType.Color: + { + Color value = mat.GetColor( name ); + valueStr = value.r.ToString() + IOUtils.VECTOR_SEPARATOR + + value.g.ToString() + IOUtils.VECTOR_SEPARATOR + + value.b.ToString() + IOUtils.VECTOR_SEPARATOR + + value.a.ToString(); + } + break; + case UnityEditor.ShaderUtil.ShaderPropertyType.Vector: + { + Vector4 value = mat.GetVector( name ); + valueStr = value.x.ToString() + IOUtils.VECTOR_SEPARATOR + + value.y.ToString() + IOUtils.VECTOR_SEPARATOR + + value.z.ToString() + IOUtils.VECTOR_SEPARATOR + + value.w.ToString(); + } + break; + case UnityEditor.ShaderUtil.ShaderPropertyType.Float: + { + float value = mat.GetFloat( name ); + valueStr = value.ToString(); + } + break; + case UnityEditor.ShaderUtil.ShaderPropertyType.Range: + { + float value = mat.GetFloat( name ); + valueStr = value.ToString(); + } + break; + case UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv: + { + Texture value = mat.GetTexture( name ); + valueStr = AssetDatabase.GetAssetPath( value ); + Vector2 offset = mat.GetTextureOffset( name ); + Vector2 scale = mat.GetTextureScale( name ); + valueStr += IOUtils.VECTOR_SEPARATOR + scale.x.ToString() + + IOUtils.VECTOR_SEPARATOR + scale.y.ToString() + + IOUtils.VECTOR_SEPARATOR + offset.x.ToString() + + IOUtils.VECTOR_SEPARATOR + offset.y.ToString(); + } + break; + } + + allProperties += name + IOUtils.FIELD_SEPARATOR + type + IOUtils.FIELD_SEPARATOR + valueStr; + + if( i < ( propertyCount - 1 ) ) + { + allProperties += IOUtils.LINE_TERMINATOR; + } + } + EditorPrefs.SetString( IOUtils.MAT_CLIPBOARD_ID, allProperties ); + System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture; + } + + if( GUILayout.Button( PasteButtonStr ) ) + { + System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture; + string propertiesStr = EditorPrefs.GetString( IOUtils.MAT_CLIPBOARD_ID, string.Empty ); + if( !string.IsNullOrEmpty( propertiesStr ) ) + { + string[] propertyArr = propertiesStr.Split( IOUtils.LINE_TERMINATOR ); + bool validData = true; + try + { + for( int i = 0; i < propertyArr.Length; i++ ) + { + string[] valuesArr = propertyArr[ i ].Split( IOUtils.FIELD_SEPARATOR ); + if( valuesArr.Length != 3 ) + { + Debug.LogWarning( "Material clipboard data is corrupted" ); + validData = false; + break; + } + else if( mat.HasProperty( valuesArr[ 0 ] ) ) + { + UnityEditor.ShaderUtil.ShaderPropertyType type = (UnityEditor.ShaderUtil.ShaderPropertyType)Enum.Parse( typeof( UnityEditor.ShaderUtil.ShaderPropertyType ), valuesArr[ 1 ] ); + switch( type ) + { + case UnityEditor.ShaderUtil.ShaderPropertyType.Color: + { + string[] colorVals = valuesArr[ 2 ].Split( IOUtils.VECTOR_SEPARATOR ); + if( colorVals.Length != 4 ) + { + Debug.LogWarning( "Material clipboard data is corrupted" ); + validData = false; + break; + } + else + { + mat.SetColor( valuesArr[ 0 ], new Color( Convert.ToSingle( colorVals[ 0 ] ), + Convert.ToSingle( colorVals[ 1 ] ), + Convert.ToSingle( colorVals[ 2 ] ), + Convert.ToSingle( colorVals[ 3 ] ) ) ); + } + } + break; + case UnityEditor.ShaderUtil.ShaderPropertyType.Vector: + { + string[] vectorVals = valuesArr[ 2 ].Split( IOUtils.VECTOR_SEPARATOR ); + if( vectorVals.Length != 4 ) + { + Debug.LogWarning( "Material clipboard data is corrupted" ); + validData = false; + break; + } + else + { + mat.SetVector( valuesArr[ 0 ], new Vector4( Convert.ToSingle( vectorVals[ 0 ] ), + Convert.ToSingle( vectorVals[ 1 ] ), + Convert.ToSingle( vectorVals[ 2 ] ), + Convert.ToSingle( vectorVals[ 3 ] ) ) ); + } + } + break; + case UnityEditor.ShaderUtil.ShaderPropertyType.Float: + { + mat.SetFloat( valuesArr[ 0 ], Convert.ToSingle( valuesArr[ 2 ] ) ); + } + break; + case UnityEditor.ShaderUtil.ShaderPropertyType.Range: + { + mat.SetFloat( valuesArr[ 0 ], Convert.ToSingle( valuesArr[ 2 ] ) ); + } + break; + case UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv: + { + string[] texVals = valuesArr[ 2 ].Split( IOUtils.VECTOR_SEPARATOR ); + if( texVals.Length != 5 ) + { + Debug.LogWarning( "Material clipboard data is corrupted" ); + validData = false; + break; + } + else + { + mat.SetTexture( valuesArr[ 0 ], AssetDatabase.LoadAssetAtPath( texVals[ 0 ] ) ); + mat.SetTextureScale( valuesArr[ 0 ], new Vector2( Convert.ToSingle( texVals[ 1 ] ), Convert.ToSingle( texVals[ 2 ] ) ) ); + mat.SetTextureOffset( valuesArr[ 0 ], new Vector2( Convert.ToSingle( texVals[ 3 ] ), Convert.ToSingle( texVals[ 4 ] ) ) ); + } + } + break; + } + } + } + } + catch( Exception e ) + { + Debug.LogException( e ); + validData = false; + } + + + if( validData ) + { + materialEditor.PropertiesChanged(); + UIUtils.CopyValuesFromMaterial( mat ); + } + else + { + EditorPrefs.SetString( IOUtils.MAT_CLIPBOARD_ID, string.Empty ); + } + } + System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture; + } + } + GUILayout.EndHorizontal(); + GUILayout.Space( 5 ); + } + GUILayout.EndVertical(); + } + EditorGUI.BeginChangeCheck(); + //base.OnGUI( materialEditor, properties ); + + // Draw custom properties instead of calling BASE to use single line texture properties + materialEditor.SetDefaultGUIWidths(); + + if( m_infoField == null ) + { + m_infoField = typeof( MaterialEditor ).GetField( "m_InfoMessage", BindingFlags.Instance | BindingFlags.NonPublic ); + } + + string info = m_infoField.GetValue( materialEditor ) as string; + if( !string.IsNullOrEmpty( info ) ) + { + EditorGUILayout.HelpBox( info, MessageType.Info ); + } + else + { + GUIUtility.GetControlID( "EditorTextField".GetHashCode(), FocusType.Passive, new Rect( 0f, 0f, 0f, 0f ) ); + } + + for( int i = 0; i < properties.Length; i++ ) + { + if( ( properties[ i ].flags & ( MaterialProperty.PropFlags.HideInInspector | MaterialProperty.PropFlags.PerRendererData ) ) == MaterialProperty.PropFlags.None ) + { + // Removed no scale offset one line texture property for consistency :( sad face + //if( ( properties[ i ].flags & MaterialProperty.PropFlags.NoScaleOffset ) == MaterialProperty.PropFlags.NoScaleOffset ) + //{ + // object obj = MaterialPropertyHandlerEx.GetHandler( mat.shader, properties[ i ].name ); + // if( obj != null ) + // { + // float height = MaterialPropertyHandlerEx.GetPropertyHeight( obj, properties[ i ], properties[ i ].displayName, materialEditor ); + // //Rect rect = (Rect)materialEditor.GetType().InvokeMember( "GetPropertyRect", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, null, materialEditor, new object[] { properties[ i ], properties[ i ].displayName, true } ); + // Rect rect = EditorGUILayout.GetControlRect( true, height, EditorStyles.layerMaskField ); + // MaterialPropertyHandlerEx.OnGUI( obj, ref rect, properties[ i ], new GUIContent( properties[ i ].displayName ), materialEditor ); + + // if( MaterialPropertyHandlerEx.PropertyDrawer( obj ) != null ) + // continue; + + // rect = EditorGUILayout.GetControlRect( true, height, EditorStyles.layerMaskField ); + // materialEditor.TexturePropertyMiniThumbnail( rect, properties[ i ], properties[ i ].displayName, string.Empty ); + // } + // else + // { + // materialEditor.TexturePropertySingleLine( new GUIContent( properties[ i ].displayName ), properties[ i ] ); + // } + //} + //else + //{ + float propertyHeight = materialEditor.GetPropertyHeight( properties[ i ], properties[ i ].displayName ); + Rect controlRect = EditorGUILayout.GetControlRect( true, propertyHeight, EditorStyles.layerMaskField, new GUILayoutOption[ 0 ] ); + materialEditor.ShaderProperty( controlRect, properties[ i ], properties[ i ].displayName ); + //} + } + } + + EditorGUILayout.Space(); + materialEditor.RenderQueueField(); +#if UNITY_5_6_OR_NEWER + materialEditor.EnableInstancingField(); +#endif +#if UNITY_5_6_2 || UNITY_5_6_3 || UNITY_5_6_4 || UNITY_2017_1_OR_NEWER + materialEditor.DoubleSidedGIField(); +#endif + materialEditor.LightmapEmissionProperty(); + if( m_refreshOnUndo || EditorGUI.EndChangeCheck() ) + { + m_refreshOnUndo = false; + + string isEmissive = mat.GetTag( "IsEmissive", false, "false" ); + if( isEmissive.Equals( "true" ) ) + { + mat.globalIlluminationFlags &= (MaterialGlobalIlluminationFlags)3; + } + else + { + mat.globalIlluminationFlags |= MaterialGlobalIlluminationFlags.EmissiveIsBlack; + } + + UIUtils.CopyValuesFromMaterial( mat ); + } + + if( materialEditor.RequiresConstantRepaint() && m_lastRenderedTime + 0.032999999821186066 < EditorApplication.timeSinceStartup ) + { + this.m_lastRenderedTime = EditorApplication.timeSinceStartup; + materialEditor.Repaint(); + } + } + + private void Init() + { + string guid = EditorPrefs.GetString( PreviewModelPref, "" ); + if( !string.IsNullOrEmpty( guid ) ) + { + m_targetMesh = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( guid ) ); + } + } + + public override void OnMaterialPreviewSettingsGUI( MaterialEditor materialEditor ) + { + + base.OnMaterialPreviewSettingsGUI( materialEditor ); + + if( UnityEditor.ShaderUtil.hardwareSupportsRectRenderTexture ) + { + EditorGUI.BeginChangeCheck(); + m_targetMesh = (Mesh)EditorGUILayout.ObjectField( m_targetMesh, typeof( Mesh ), false, GUILayout.MaxWidth( 120 ) ); + if( EditorGUI.EndChangeCheck() ) + { + if( m_targetMesh != null ) + { + EditorPrefs.SetString( PreviewModelPref, AssetDatabase.AssetPathToGUID( AssetDatabase.GetAssetPath( m_targetMesh ) ) ); + } + else + { + EditorPrefs.SetString( PreviewModelPref, "" ); + } + } + + if( m_selectedField == null ) + { + m_selectedField = typeof( MaterialEditor ).GetField( "m_SelectedMesh", BindingFlags.Instance | BindingFlags.NonPublic ); + } + + m_selectedMesh = (int)m_selectedField.GetValue( materialEditor ); + + if( m_selectedMesh != 0 ) + { + if( m_targetMesh != null ) + { + m_targetMesh = null; + EditorPrefs.SetString( PreviewModelPref, "" ); + } + } + } + } + + public override void OnMaterialInteractivePreviewGUI( MaterialEditor materialEditor, Rect r, GUIStyle background ) + { + if( Event.current.type == EventType.DragExited ) + { + if( DragAndDrop.objectReferences.Length > 0 ) + { + GameObject dropped = DragAndDrop.objectReferences[ 0 ] as GameObject; + if( dropped != null ) + { + m_targetMesh = AssetDatabase.LoadAssetAtPath( AssetDatabase.GetAssetPath( dropped ) ); + EditorPrefs.SetString( PreviewModelPref, AssetDatabase.AssetPathToGUID( AssetDatabase.GetAssetPath( m_targetMesh ) ) ); + } + } + } + + if( m_targetMesh == null ) + { + base.OnMaterialInteractivePreviewGUI( materialEditor, r, background ); + return; + } + + Material mat = materialEditor.target as Material; + + if( m_previewRenderUtility == null ) + { + m_previewRenderUtility = new PreviewRenderUtility(); +#if UNITY_2017_1_OR_NEWER + m_previewRenderUtility.cameraFieldOfView = 30f; +#else + m_previewRenderUtility.m_CameraFieldOfView = 30f; +#endif + } + + if( m_previewGUIType == null ) + { + m_previewGUIType = Type.GetType( "PreviewGUI, UnityEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" ); + m_dragMethod = m_previewGUIType.GetMethod( "Drag2D", BindingFlags.Static | BindingFlags.Public ); + } + + if( m_modelInspectorType == null ) + { + m_modelInspectorType = Type.GetType( "UnityEditor.ModelInspector, UnityEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" ); + m_renderMeshMethod = m_modelInspectorType.GetMethod( "RenderMeshPreview", BindingFlags.Static | BindingFlags.NonPublic ); + } + + m_previewDir = (Vector2)m_dragMethod.Invoke( m_previewGUIType, new object[] { m_previewDir, r } ); + +#if UNITY_2020_1_OR_NEWER + if( m_previewSettingsType == null ) + { + m_previewSettingsType = m_modelInspectorType.GetNestedType( "PreviewSettings",BindingFlags.NonPublic); + } + + if( m_previewSettingsInstance == null ) + { + m_previewSettingsInstance = Activator.CreateInstance( m_previewSettingsType ); + previewDirInfo = m_previewSettingsType.GetField( "previewDir", BindingFlags.Instance | BindingFlags.Public ); + shadedMaterialInfo = m_previewSettingsType.GetField( "shadedPreviewMaterial", BindingFlags.Instance | BindingFlags.Public ); + activeMaterialInfo = m_previewSettingsType.GetField( "activeMaterial", BindingFlags.Instance | BindingFlags.Public ); + } + + shadedMaterialInfo.SetValue( m_previewSettingsInstance, mat ); + activeMaterialInfo.SetValue( m_previewSettingsInstance, mat ); + previewDirInfo.SetValue( m_previewSettingsInstance, m_previewDir ); + + if( Event.current.type == EventType.Repaint ) + { + m_previewRenderUtility.BeginPreview( r, background ); + m_renderMeshMethod.Invoke( m_modelInspectorType, new object[] { m_targetMesh, m_previewRenderUtility, m_previewSettingsInstance, -1 } ); + m_previewRenderUtility.EndAndDrawPreview( r ); + } +#else + if( Event.current.type == EventType.Repaint ) + { + m_previewRenderUtility.BeginPreview( r, background ); + m_renderMeshMethod.Invoke( m_modelInspectorType, new object[] { m_targetMesh, m_previewRenderUtility, mat, null, m_previewDir, -1 } ); + m_previewRenderUtility.EndAndDrawPreview( r ); + } +#endif + } + + public static MaterialEditor Instance { get { return m_instance; } set { m_instance = value; } } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/CustomMaterialInspector.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/CustomMaterialInspector.cs.meta new file mode 100644 index 0000000..c587b4c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/CustomMaterialInspector.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a1c012872b428594f95e585bd19e5347 +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/CustomShaderInspector.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/CustomShaderInspector.cs new file mode 100644 index 0000000..95310d4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/CustomShaderInspector.cs @@ -0,0 +1,969 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Reflection; +using System.Globalization; +using UnityEngine; +using AmplifyShaderEditor; + +namespace UnityEditor +{ + [CustomEditor( typeof( Shader ) )] + internal class CustomShaderInspector : Editor + { + internal class Styles + { + public static Texture2D errorIcon = EditorGUIUtilityEx.LoadIcon( "console.erroricon.sml" ); + + public static Texture2D warningIcon = EditorGUIUtilityEx.LoadIcon( "console.warnicon.sml" ); + #if UNITY_2020_1_OR_NEWER + public static GUIContent togglePreprocess = EditorGUIUtilityEx.TextContent( "Preprocess only|Show preprocessor output instead of compiled shader code" ); + #if UNITY_2020_2_OR_NEWER + public static GUIContent toggleStripLineDirective = EditorGUIUtility.TrTextContent( "Strip #line directives", "Strip #line directives from preprocessor output" ); + #endif + #endif + public static GUIContent showSurface = EditorGUIUtilityEx.TextContent( "Show generated code|Show generated code of a surface shader" ); + + public static GUIContent showFF = EditorGUIUtilityEx.TextContent( "Show generated code|Show generated code of a fixed function shader" ); + + public static GUIContent showCurrent = new GUIContent( "Compile and show code | ▾" ); + + public static GUIStyle messageStyle = "CN StatusInfo"; + + public static GUIStyle evenBackground = "CN EntryBackEven"; + + public static GUIContent no = EditorGUIUtilityEx.TextContent( "no" ); + + public static GUIContent builtinShader = EditorGUIUtilityEx.TextContent( "Built-in shader" ); + + public static GUIContent arrayValuePopupButton = EditorGUIUtilityEx.TextContent( "..." ); + } +#if UNITY_2020_1_OR_NEWER + private static bool s_PreprocessOnly = false; +#if UNITY_2020_2_OR_NEWER + private static bool s_StripLineDirectives = true; +#endif +#endif + private const float kSpace = 5f; + + const float kValueFieldWidth = 200.0f; + const float kArrayValuePopupBtnWidth = 25.0f; + + private static readonly string[] kPropertyTypes = new string[] + { + "Color: ", + "Vector: ", + "Float: ", + "Range: ", + "Texture: " + }; + + private static readonly string[] kTextureTypes = new string[] + { + "No Texture?: ", + "1D?: ", + "2D: ", + "3D: ", + "Cube: ", + "2DArray: ", + "Any texture: " + }; + + private static readonly int kErrorViewHash = "ShaderErrorView".GetHashCode(); + + private Vector2 m_ScrollPosition = Vector2.zero; + + private PreviewRenderUtility m_previewRenderUtility; + private Material m_material; + private Mesh m_previewMesh; + private Vector2 m_mouseDelta; + private Transform m_cameraTransform; + + private static int m_sliderHashCode = -1; + private const float MaxDeltaY = 90; + private const int DefaultMouseSpeed = 1; + private const int ShiftMouseSpeed = 3; + private const float DeltaMultiplier = 135f; + private void ValidateData() + { + if ( m_previewRenderUtility == null ) + { + m_previewRenderUtility = new PreviewRenderUtility(); +#if UNITY_2017_1_OR_NEWER + m_cameraTransform = m_previewRenderUtility.camera.transform; +#else + m_cameraTransform = m_previewRenderUtility.m_Camera.transform; +#endif + m_cameraTransform.position = new Vector3( 0, 0, -4 ); + m_cameraTransform.rotation = Quaternion.identity; + } + + if ( m_material == null ) + { + m_material = new Material( target as Shader ); + m_material.hideFlags = HideFlags.DontSave; + } + + if ( m_previewMesh == null ) + { + m_previewMesh = Resources.GetBuiltinResource( "Sphere.fbx" ); + } + + if ( m_sliderHashCode < 0 ) + { + "Slider".GetHashCode(); + } + } + + public override bool HasPreviewGUI() + { + ValidateData(); + return true; + } + + public static Vector2 CheckMouseMovement( Vector2 scrollPosition, Rect position ) + { + int controlID = GUIUtility.GetControlID( m_sliderHashCode, FocusType.Passive ); + Event current = Event.current; + switch ( current.GetTypeForControl( controlID ) ) + { + case EventType.MouseDown: + { + if ( position.Contains( current.mousePosition ) && position.width > 50f ) + { + GUIUtility.hotControl = controlID; + current.Use(); + EditorGUIUtility.SetWantsMouseJumping( 1 ); + } + } + break; + case EventType.MouseUp: + { + if ( GUIUtility.hotControl == controlID ) + { + GUIUtility.hotControl = 0; + } + EditorGUIUtility.SetWantsMouseJumping( 0 ); + } + break; + case EventType.MouseDrag: + { + if ( GUIUtility.hotControl == controlID ) + { + scrollPosition -= DeltaMultiplier * current.delta * ( float ) ( ( current.shift ) ? ShiftMouseSpeed : DefaultMouseSpeed ) / Mathf.Min( position.width, position.height ); + scrollPosition.y = Mathf.Clamp( scrollPosition.y, -MaxDeltaY, MaxDeltaY ); + current.Use(); + } + } + break; + } + return scrollPosition; + } + + public override void OnPreviewGUI( Rect r, GUIStyle background ) + { + m_mouseDelta = CheckMouseMovement( m_mouseDelta, r ); + + if ( Event.current.type == EventType.Repaint ) + { + m_previewRenderUtility.BeginPreview( r, background ); + + Texture resultRender = m_previewRenderUtility.EndPreview(); + m_previewRenderUtility.DrawMesh( m_previewMesh, Matrix4x4.identity, m_material, 0 ); + m_cameraTransform.rotation = Quaternion.Euler( new Vector3( -m_mouseDelta.y, -m_mouseDelta.x, 0 ) ); + m_cameraTransform.position = m_cameraTransform.forward * -8f; +#if UNITY_2017_1_OR_NEWER + m_previewRenderUtility.camera.Render(); +#else + m_previewRenderUtility.m_Camera.Render(); +#endif + GUI.DrawTexture( r, resultRender, ScaleMode.StretchToFill, false ); + } + } + + void OnDestroy() + { + CleanUp(); + } + + public void OnDisable() + { + CleanUp(); + if( m_SrpCompatibilityCheckMaterial != null ) + { + GameObject.DestroyImmediate( m_SrpCompatibilityCheckMaterial ); + } + } + + void CleanUp() + { + if( m_previewRenderUtility != null ) + { + m_previewRenderUtility.Cleanup(); + m_previewRenderUtility = null; + } + + if( m_previewMesh != null ) + { + Resources.UnloadAsset( m_previewMesh ); + m_previewMesh = null; + } + + if( m_previewRenderUtility != null ) + { + m_previewRenderUtility.Cleanup(); + m_previewRenderUtility = null; + } + m_material = null; + } + + private Material m_SrpCompatibilityCheckMaterial = null; + public Material srpCompatibilityCheckMaterial + { + get + { + if( m_SrpCompatibilityCheckMaterial == null ) + { + m_SrpCompatibilityCheckMaterial = new Material( target as Shader ); + } + return m_SrpCompatibilityCheckMaterial; + } + } + + public virtual void OnEnable() + { + Shader s = this.target as Shader; + if( s!= null ) + ShaderUtilEx.FetchCachedErrors( s ); + } + + private static string GetPropertyType( Shader s, int index ) + { + UnityEditor.ShaderUtil.ShaderPropertyType propertyType = UnityEditor.ShaderUtil.GetPropertyType( s, index ); + if ( propertyType == UnityEditor.ShaderUtil.ShaderPropertyType.TexEnv ) + { + return CustomShaderInspector.kTextureTypes[ ( int ) UnityEditor.ShaderUtil.GetTexDim( s, index ) ]; + } + return CustomShaderInspector.kPropertyTypes[ ( int ) propertyType ]; + } + + public override void OnInspectorGUI() + { + Shader shader = this.target as Shader; + if ( shader == null ) + { + return; + } + + GUI.enabled = true; + + GUILayout.Space( 3 ); + GUILayout.BeginHorizontal(); + { + if ( GUILayout.Button( "Open in Shader Editor" ) ) + { +#if UNITY_2018_3_OR_NEWER + ASEPackageManagerHelper.SetupLateShader( shader ); +#else + AmplifyShaderEditorWindow.ConvertShaderToASE( shader ); +#endif + } + + if ( GUILayout.Button( "Open in Text Editor" ) ) + { + if( UIUtils.IsUnityNativeShader( shader ) ) + { + Debug.LogWarningFormat( "Action not allowed. Attempting to load the native {0} shader into Text Editor", shader.name ); + } + else + { + AssetDatabase.OpenAsset( shader, 1 ); + } + } + } + GUILayout.EndHorizontal(); + + GUILayout.Space( 5 ); + EditorGUI.indentLevel = 0; + this.ShowShaderCodeArea( shader ); + if ( shader.isSupported ) + { + EditorGUILayout.LabelField( "Cast shadows", ( !ShaderUtilEx.HasShadowCasterPass( shader ) ) ? "no" : "yes", new GUILayoutOption[ 0 ] ); + EditorGUILayout.LabelField( "Render queue", ShaderUtilEx.GetRenderQueue( shader ).ToString( System.Globalization.CultureInfo.InvariantCulture ), new GUILayoutOption[ 0 ] ); + EditorGUILayout.LabelField( "LOD", ShaderUtilEx.GetLOD( shader ).ToString( System.Globalization.CultureInfo.InvariantCulture ), new GUILayoutOption[ 0 ] ); + EditorGUILayout.LabelField( "Ignore projector", ( !ShaderUtilEx.DoesIgnoreProjector( shader ) ) ? "no" : "yes", new GUILayoutOption[ 0 ] ); + string label; + switch ( ShaderEx.GetDisableBatching( shader ) ) + { + case DisableBatchingType.False: + label = "no"; + break; + case DisableBatchingType.True: + label = "yes"; + break; + case DisableBatchingType.WhenLODFading: + label = "when LOD fading is on"; + break; + default: + label = "unknown"; + break; + } + EditorGUILayout.LabelField( "Disable batching", label, new GUILayoutOption[ 0 ] ); +#if UNITY_2019_3_OR_NEWER + ShowKeywords( shader ); + srpCompatibilityCheckMaterial.SetPass( 0 ); +#endif + +#if UNITY_2018_3_OR_NEWER + int shaderActiveSubshaderIndex = ShaderUtilEx.GetShaderActiveSubshaderIndex( shader ); + int sRPBatcherCompatibilityCode = ShaderUtilEx.GetSRPBatcherCompatibilityCode( shader, shaderActiveSubshaderIndex ); + string label2 = ( sRPBatcherCompatibilityCode != 0 ) ? "not compatible" : "compatible"; + EditorGUILayout.LabelField( "SRP Batcher", label2 ); + if( sRPBatcherCompatibilityCode != 0 ) + { + EditorGUILayout.HelpBox( ShaderUtilEx.GetSRPBatcherCompatibilityIssueReason( shader, shaderActiveSubshaderIndex, sRPBatcherCompatibilityCode ), MessageType.Info ); + } +#endif + CustomShaderInspector.ShowShaderProperties( shader ); + } + } +#if UNITY_2019_3_OR_NEWER + private void ShowKeywords( Shader s ) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.PrefixLabel( "Keywords", EditorStyles.miniButton ); + + Rect buttonRect = GUILayoutUtility.GetRect( Styles.arrayValuePopupButton, GUI.skin.button, GUILayout.MinWidth( kValueFieldWidth ) ); + buttonRect.width = kArrayValuePopupBtnWidth; + if( GUI.Button( buttonRect, Styles.arrayValuePopupButton, EditorStyles.miniButton ) ) + { + var globalKeywords = ShaderUtilEx.GetShaderGlobalKeywords( s ); + var localKeywords = ShaderUtilEx.GetShaderLocalKeywords( s ); + PopupWindow.Show( buttonRect, new KeywordsPopup( globalKeywords, localKeywords, 150.0f ) ); + } + + EditorGUILayout.EndHorizontal(); + } +#endif + private void ShowShaderCodeArea( Shader s ) + { + CustomShaderInspector.ShowSurfaceShaderButton( s ); + CustomShaderInspector.ShowFixedFunctionShaderButton( s ); + this.ShowCompiledCodeButton( s ); + this.ShowShaderErrors( s ); + } + + private static void ShowShaderProperties( Shader s ) + { + GUILayout.Space( 5f ); + GUILayout.Label( "Properties:", EditorStyles.boldLabel, new GUILayoutOption[ 0 ] ); + int propertyCount = UnityEditor.ShaderUtil.GetPropertyCount( s ); + for ( int i = 0; i < propertyCount; i++ ) + { + string propertyName = UnityEditor.ShaderUtil.GetPropertyName( s, i ); + string label = CustomShaderInspector.GetPropertyType( s, i ) + UnityEditor.ShaderUtil.GetPropertyDescription( s, i ); + EditorGUILayout.LabelField( propertyName, label, new GUILayoutOption[ 0 ] ); + } + } + + internal static void ShaderErrorListUI( UnityEngine.Object shader, ShaderError[] errors, ref Vector2 scrollPosition ) + { + int num = errors.Length; + GUILayout.Space( 5f ); + GUILayout.Label( string.Format( "Errors ({0}):", num ), EditorStyles.boldLabel, new GUILayoutOption[ 0 ] ); + int controlID = GUIUtility.GetControlID( CustomShaderInspector.kErrorViewHash, FocusType.Passive ); + float minHeight = Mathf.Min( ( float ) num * 20f + 40f, 150f ); + scrollPosition = GUILayout.BeginScrollView( scrollPosition, GUISkinEx.GetCurrentSkin().box, new GUILayoutOption[] + { + GUILayout.MinHeight(minHeight) + } ); + EditorGUIUtility.SetIconSize( new Vector2( 16f, 16f ) ); + float height = CustomShaderInspector.Styles.messageStyle.CalcHeight( EditorGUIUtilityEx.TempContent( CustomShaderInspector.Styles.errorIcon ), 100f ); + Event current = Event.current; + for ( int i = 0; i < num; i++ ) + { + Rect controlRect = EditorGUILayout.GetControlRect( false, height, new GUILayoutOption[ 0 ] ); + string message = errors[ i ].message; + string platform = errors[ i ].platform; + bool flag = errors[ i ].warning != 0; + string lastPathNameComponent = FileUtilEx.GetLastPathNameComponent( errors[ i ].file ); + int line = errors[ i ].line; + if ( current.type == EventType.MouseDown && current.button == 0 && controlRect.Contains( current.mousePosition ) ) + { + GUIUtility.keyboardControl = controlID; + if ( current.clickCount == 2 ) + { + string file = errors[ i ].file; + UnityEngine.Object @object = ( !string.IsNullOrEmpty( file ) ) ? AssetDatabase.LoadMainAssetAtPath( file ) : null; + AssetDatabase.OpenAsset( @object ?? shader, line ); + GUIUtility.ExitGUI(); + } + current.Use(); + } + if ( current.type == EventType.ContextClick && controlRect.Contains( current.mousePosition ) ) + { + current.Use(); + GenericMenu genericMenu = new GenericMenu(); + int errorIndex = i; + genericMenu.AddItem( new GUIContent( "Copy error text" ), false, delegate + { + string text = errors[ errorIndex ].message; + if ( !string.IsNullOrEmpty( errors[ errorIndex ].messageDetails ) ) + { + text += '\n'; + text += errors[ errorIndex ].messageDetails; + } + EditorGUIUtility.systemCopyBuffer = text; + } ); + genericMenu.ShowAsContext(); + } + if ( current.type == EventType.Repaint && ( i & 1 ) == 0 ) + { + GUIStyle evenBackground = CustomShaderInspector.Styles.evenBackground; + evenBackground.Draw( controlRect, false, false, false, false ); + } + Rect rect = controlRect; + rect.xMin = rect.xMax; + if ( line > 0 ) + { + GUIContent content; + if ( string.IsNullOrEmpty( lastPathNameComponent ) ) + { + content = EditorGUIUtilityEx.TempContent( line.ToString( System.Globalization.CultureInfo.InvariantCulture ) ); + } + else + { + content = EditorGUIUtilityEx.TempContent( lastPathNameComponent + ":" + line.ToString( System.Globalization.CultureInfo.InvariantCulture ) ); + } + Vector2 vector = EditorStyles.miniLabel.CalcSize( content ); + rect.xMin -= vector.x; + GUI.Label( rect, content, EditorStyles.miniLabel ); + rect.xMin -= 2f; + if ( rect.width < 30f ) + { + rect.xMin = rect.xMax - 30f; + } + } + Rect position = rect; + position.width = 0f; + if ( platform.Length > 0 ) + { + GUIContent content2 = EditorGUIUtilityEx.TempContent( platform ); + Vector2 vector2 = EditorStyles.miniLabel.CalcSize( content2 ); + position.xMin -= vector2.x; + Color contentColor = GUI.contentColor; + GUI.contentColor = new Color( 1f, 1f, 1f, 0.5f ); + GUI.Label( position, content2, EditorStyles.miniLabel ); + GUI.contentColor = contentColor; + position.xMin -= 2f; + } + Rect position2 = controlRect; + position2.xMax = position.xMin; + GUI.Label( position2, EditorGUIUtilityEx.TempContent( message, ( !flag ) ? CustomShaderInspector.Styles.errorIcon : CustomShaderInspector.Styles.warningIcon ), CustomShaderInspector.Styles.messageStyle ); + } + EditorGUIUtility.SetIconSize( Vector2.zero ); + GUILayout.EndScrollView(); + } + +#if UNITY_2019_3_OR_NEWER + ShaderMessage[] m_ShaderMessages; +#endif + private void ShowShaderErrors( Shader s ) + { +#if UNITY_2019_3_OR_NEWER + if( Event.current.type == EventType.Layout ) + { + int n = ShaderUtil.GetShaderMessageCount( s ); + m_ShaderMessages = null; + if( n >= 1 ) + { + m_ShaderMessages = ShaderUtil.GetShaderMessages( s ); + } + } + + if( m_ShaderMessages == null ) + return; + + ShaderInspectorEx.ShaderErrorListUI( s, m_ShaderMessages, ref this.m_ScrollPosition ); +#else + int shaderErrorCount = ShaderUtilEx.GetShaderErrorCount( s ); + if ( shaderErrorCount < 1 ) + { + return; + } + CustomShaderInspector.ShaderErrorListUI( s, ShaderUtilEx.GetShaderErrors( s ), ref this.m_ScrollPosition ); +#endif + } + + private void ShowCompiledCodeButton( Shader s ) + { +#if UNITY_2020_1_OR_NEWER + using( new EditorGUI.DisabledScope( !EditorSettings.cachingShaderPreprocessor ) ) + { + s_PreprocessOnly = EditorGUILayout.Toggle( Styles.togglePreprocess, s_PreprocessOnly ); +#if UNITY_2020_2_OR_NEWER + if( s_PreprocessOnly ) + { + s_StripLineDirectives = EditorGUILayout.Toggle( Styles.toggleStripLineDirective, s_StripLineDirectives ); + } +#endif + } +#endif + EditorGUILayout.BeginHorizontal( new GUILayoutOption[ 0 ] ); + EditorGUILayout.PrefixLabel( "Compiled code", EditorStyles.miniButton ); + bool hasCode = ShaderUtilEx.HasShaderSnippets( s ) || ShaderUtilEx.HasSurfaceShaders( s ) || ShaderUtilEx.HasFixedFunctionShaders( s ); + if( hasCode ) + { + GUIContent showCurrent = Styles.showCurrent; + Rect rect = GUILayoutUtility.GetRect( showCurrent, EditorStyles.miniButton, new GUILayoutOption[] + { + GUILayout.ExpandWidth(false) + } ); + Rect position = new Rect( rect.xMax - 16f, rect.y, 16f, rect.height ); + if( EditorGUIEx.ButtonMouseDown( position, GUIContent.none, FocusType.Passive, GUIStyle.none ) ) + { + Rect last = GUILayoutUtilityEx.TopLevel_GetLast(); + PopupWindow.Show( last, (PopupWindowContent)Activator.CreateInstance( System.Type.GetType( "UnityEditor.ShaderInspectorPlatformsPopup, UnityEditor" ), new object[] { s } ) ); + GUIUtility.ExitGUI(); + } + if( GUI.Button( rect, showCurrent, EditorStyles.miniButton ) ) + { +#if UNITY_2020_1 + ShaderUtilEx.OpenCompiledShader( s, ShaderInspectorPlatformsPopupEx.GetCurrentMode(), ShaderInspectorPlatformsPopupEx.GetCurrentPlatformMask(), ShaderInspectorPlatformsPopupEx.GetCurrentVariantStripping() == 0, s_PreprocessOnly ); +#elif UNITY_2020_2_OR_NEWER + ShaderUtilEx.OpenCompiledShader( s, ShaderInspectorPlatformsPopupEx.GetCurrentMode(), ShaderInspectorPlatformsPopupEx.GetCurrentPlatformMask(), ShaderInspectorPlatformsPopupEx.GetCurrentVariantStripping() == 0, s_PreprocessOnly, s_StripLineDirectives ); +#else + ShaderUtilEx.OpenCompiledShader( s, ShaderInspectorPlatformsPopupEx.GetCurrentMode(), ShaderInspectorPlatformsPopupEx.GetCurrentPlatformMask(), ShaderInspectorPlatformsPopupEx.GetCurrentVariantStripping() == 0 ); +#endif + GUIUtility.ExitGUI(); + } + } + else + { + GUILayout.Button( "none (precompiled shader)", GUI.skin.label, new GUILayoutOption[ 0 ] ); + } + EditorGUILayout.EndHorizontal(); + } + + private static void ShowSurfaceShaderButton( Shader s ) + { + bool flag = ShaderUtilEx.HasSurfaceShaders( s ); + EditorGUILayout.BeginHorizontal( new GUILayoutOption[ 0 ] ); + EditorGUILayout.PrefixLabel( "Surface shader", EditorStyles.miniButton ); + if ( flag ) + { + if ( !( AssetImporter.GetAtPath( AssetDatabase.GetAssetPath( s ) ) == null ) ) + { + if ( GUILayout.Button( CustomShaderInspector.Styles.showSurface, EditorStyles.miniButton, new GUILayoutOption[] + { + GUILayout.ExpandWidth(false) + } ) ) + { + ShaderUtilEx.OpenParsedSurfaceShader( s ); + GUIUtility.ExitGUI(); + } + } + else + { + GUILayout.Button( CustomShaderInspector.Styles.builtinShader, GUI.skin.label, new GUILayoutOption[ 0 ] ); + } + } + else + { + GUILayout.Button( CustomShaderInspector.Styles.no, GUI.skin.label, new GUILayoutOption[ 0 ] ); + } + EditorGUILayout.EndHorizontal(); + } + + private static void ShowFixedFunctionShaderButton( Shader s ) + { + bool flag = ShaderUtilEx.HasFixedFunctionShaders( s ); + EditorGUILayout.BeginHorizontal( new GUILayoutOption[ 0 ] ); + EditorGUILayout.PrefixLabel( "Fixed function", EditorStyles.miniButton ); + if ( flag ) + { + if ( !( AssetImporter.GetAtPath( AssetDatabase.GetAssetPath( s ) ) == null ) ) + { + if ( GUILayout.Button( CustomShaderInspector.Styles.showFF, EditorStyles.miniButton, new GUILayoutOption[] + { + GUILayout.ExpandWidth(false) + } ) ) + { + ShaderUtilEx.OpenGeneratedFixedFunctionShader( s ); + GUIUtility.ExitGUI(); + } + } + else + { + GUILayout.Button( CustomShaderInspector.Styles.builtinShader, GUI.skin.label, new GUILayoutOption[ 0 ] ); + } + } + else + { + GUILayout.Button( CustomShaderInspector.Styles.no, GUI.skin.label, new GUILayoutOption[ 0 ] ); + } + EditorGUILayout.EndHorizontal(); + } + } + + internal class KeywordsPopup : PopupWindowContent + { + private Vector2 m_ScrollPos = Vector2.zero; + private string[] m_GlobalKeywords; + private string[] m_LocalKeywords; + private bool m_GlobalKeywordsExpended; + private bool m_LocalKeywordsExpended; + private float m_WindowWidth; + + private static readonly GUIStyle m_Style = EditorStyles.miniLabel; + + public KeywordsPopup( string[] globalKeywords, string[] localKeywords, float windowWidth ) + { + m_GlobalKeywords = globalKeywords; + m_LocalKeywords = localKeywords; + m_GlobalKeywordsExpended = true; + m_LocalKeywordsExpended = true; + m_WindowWidth = windowWidth; + } + + public override Vector2 GetWindowSize() + { + var numValues = m_GlobalKeywords.Length + m_LocalKeywords.Length + 2; + var lineHeight = m_Style.lineHeight + m_Style.padding.vertical + m_Style.margin.top; + return new Vector2( m_WindowWidth, Math.Min( lineHeight * numValues, 250.0f ) ); + } + + public override void OnGUI( Rect rect ) + { + m_ScrollPos = EditorGUILayout.BeginScrollView( m_ScrollPos ); + + m_GlobalKeywordsExpended = KeywordsFoldout( m_GlobalKeywordsExpended, "Global Keywords", m_GlobalKeywords ); + m_LocalKeywordsExpended = KeywordsFoldout( m_LocalKeywordsExpended, "Local Keywords", m_LocalKeywords ); + + EditorGUILayout.EndScrollView(); + } + + private bool KeywordsFoldout( bool expended, string name, string[] values ) + { + expended = EditorGUILayout.Foldout( expended, name, true, m_Style ); + + if( expended ) + { + EditorGUI.indentLevel++; + for( int i = 0; i < values.Length; ++i ) + { + EditorGUILayout.LabelField( values[ i ], m_Style ); + } + EditorGUI.indentLevel--; + } + + return expended; + } + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // UNITY EDITOR EXTENSIONS + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + public enum DisableBatchingType + { + False, + True, + WhenLODFading + } + + public struct ShaderError + { + public string message; + public string messageDetails; + public string platform; + public string file; + public int line; + public int warning; + } + + public static class EditorGUIUtilityEx + { + private static System.Type type = null; + public static System.Type Type { get { return ( type == null ) ? type = System.Type.GetType( "UnityEditor.EditorGUIUtility, UnityEditor" ) : type; } } + + public static Texture2D LoadIcon( string icon ) + { + return ( Texture2D ) EditorGUIUtilityEx.Type.InvokeMember( "LoadIcon", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { icon } ); + } + + public static GUIContent TextContent( string t ) + { + return ( GUIContent ) EditorGUIUtilityEx.Type.InvokeMember( "TextContent", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { t } ); + } + + internal static GUIContent TempContent( string t ) + { + return ( GUIContent ) EditorGUIUtilityEx.Type.InvokeMember( "TempContent", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { t } ); + } + + internal static GUIContent TempContent( Texture i ) + { + return ( GUIContent ) EditorGUIUtilityEx.Type.InvokeMember( "TempContent", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { i } ); + } + + internal static GUIContent TempContent( string t, Texture i ) + { + return ( GUIContent ) EditorGUIUtilityEx.Type.InvokeMember( "TempContent", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { t, i } ); + } + } + + public static class GUILayoutUtilityEx + { + private static System.Type type = null; + public static System.Type Type { get { return ( type == null ) ? type = System.Type.GetType( "UnityEngine.GUILayoutUtility, UnityEngine" ) : type; } } + + public static Rect TopLevel_GetLast() + { + System.Type guiLayoutGroup = System.Type.GetType( "UnityEngine.GUILayoutGroup, UnityEngine" ); + var topLevel = GUILayoutUtilityEx.Type.GetProperty( "topLevel", BindingFlags.NonPublic | BindingFlags.Static ).GetValue( null, null ); + return ( Rect ) guiLayoutGroup.InvokeMember( "GetLast", BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod, null, topLevel, new object[] { } ); + } + } + + public static class ShaderEx + { + private static System.Type type = null; + public static System.Type Type { get { return ( type == null ) ? type = System.Type.GetType( "UnityEngine.Shader, UnityEngine" ) : type; } } + + public static DisableBatchingType GetDisableBatching( Shader s ) + { + return ( DisableBatchingType ) ShaderEx.Type.GetProperty( "disableBatching", BindingFlags.NonPublic | BindingFlags.Instance ).GetValue( s, new object[ 0 ] ); + } + } + + public static class ShaderUtilEx + { + private static System.Type type = null; + public static System.Type Type { get { return ( type == null ) ? type = System.Type.GetType( "UnityEditor.ShaderUtil, UnityEditor" ) : type; } } + + public static void OpenParsedSurfaceShader( Shader s ) + { + ShaderUtilEx.Type.InvokeMember( "OpenParsedSurfaceShader", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { s } ); + } + + public static void OpenGeneratedFixedFunctionShader( Shader s ) + { + ShaderUtilEx.Type.InvokeMember( "OpenGeneratedFixedFunctionShader", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { s } ); + } + +#if UNITY_2020_1 + public static void OpenCompiledShader( Shader shader, int mode, int customPlatformsMask, bool includeAllVariants, bool preprocessOnly ) + { + ShaderUtilEx.Type.InvokeMember( "OpenCompiledShader", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { shader, mode, customPlatformsMask, includeAllVariants, preprocessOnly } ); + } +#elif UNITY_2020_2_OR_NEWER + public static void OpenCompiledShader( Shader shader, int mode, int customPlatformsMask, bool includeAllVariants, bool preprocessOnly, bool stripLineDirectives ) + { + ShaderUtilEx.Type.InvokeMember( "OpenCompiledShader", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { shader, mode, customPlatformsMask, includeAllVariants, preprocessOnly, stripLineDirectives } ); + } +#else + public static void OpenCompiledShader( Shader shader, int mode, int customPlatformsMask, bool includeAllVariants ) + { + ShaderUtilEx.Type.InvokeMember( "OpenCompiledShader", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { shader, mode, customPlatformsMask, includeAllVariants } ); + } +#endif + public static void FetchCachedErrors( Shader s ) + { +#if UNITY_2019_3_OR_NEWER + ShaderUtilEx.Type.InvokeMember( "FetchCachedMessages", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { s } ); +#else + ShaderUtilEx.Type.InvokeMember( "FetchCachedErrors", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { s } ); +#endif + } + + public static string[] GetShaderGlobalKeywords( Shader s ) + { + return ShaderUtilEx.Type.InvokeMember( "GetShaderGlobalKeywords", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { s } ) as string[]; + } + + public static string[] GetShaderLocalKeywords( Shader s ) + { + return ShaderUtilEx.Type.InvokeMember( "GetShaderLocalKeywords", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { s } ) as string[]; + } + + public static int GetShaderErrorCount( Shader s ) + { +#if UNITY_2019_3_OR_NEWER + return ShaderUtil.GetShaderMessageCount( s ); +#else + return ( int ) ShaderUtilEx.Type.InvokeMember( "GetShaderErrorCount", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { s } ); +#endif + } + + public static int GetAvailableShaderCompilerPlatforms() + { + return (int)ShaderUtilEx.Type.InvokeMember( "GetAvailableShaderCompilerPlatforms", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { } ); + } + + public static ShaderError[] GetShaderErrors( Shader s ) + { + System.Type shaderErrorType = System.Type.GetType( "UnityEditor.ShaderError, UnityEditor" ); + var errorList = ( System.Collections.IList ) ShaderUtilEx.Type.InvokeMember( "GetShaderErrors", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { s } ); + + FieldInfo messageField = shaderErrorType.GetField( "message", BindingFlags.Public | BindingFlags.Instance ); + FieldInfo messageDetailsField = shaderErrorType.GetField( "messageDetails", BindingFlags.Public | BindingFlags.Instance ); + FieldInfo platformField = shaderErrorType.GetField( "platform", BindingFlags.Public | BindingFlags.Instance ); + FieldInfo fileField = shaderErrorType.GetField( "file", BindingFlags.Public | BindingFlags.Instance ); + FieldInfo lineField = shaderErrorType.GetField( "line", BindingFlags.Public | BindingFlags.Instance ); + FieldInfo warningField = shaderErrorType.GetField( "warning", BindingFlags.Public | BindingFlags.Instance ); + + ShaderError[] errors = new ShaderError[ errorList.Count ]; + for ( int i = 0; i < errorList.Count; i++ ) + { + errors[ i ].message = ( string ) messageField.GetValue( errorList[ i ] ); + errors[ i ].messageDetails = ( string ) messageDetailsField.GetValue( errorList[ i ] ); + errors[ i ].platform = ( string ) platformField.GetValue( errorList[ i ] ); + errors[ i ].file = ( string ) fileField.GetValue( errorList[ i ] ); + errors[ i ].line = ( int ) lineField.GetValue( errorList[ i ] ); + errors[ i ].warning = ( int ) warningField.GetValue( errorList[ i ] ); + } + return errors; + } + + public static bool HasShaderSnippets( Shader s ) + { + return ( bool ) ShaderUtilEx.Type.InvokeMember( "HasShaderSnippets", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { s } ); + } + + public static bool HasSurfaceShaders( Shader s ) + { + return ( bool ) ShaderUtilEx.Type.InvokeMember( "HasSurfaceShaders", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { s } ); + } + + public static bool HasFixedFunctionShaders( Shader s ) + { + return ( bool ) ShaderUtilEx.Type.InvokeMember( "HasFixedFunctionShaders", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { s } ); + } + + public static bool HasShadowCasterPass( Shader s ) + { + return ( bool ) ShaderUtilEx.Type.InvokeMember( "HasShadowCasterPass", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { s } ); + } + + public static int GetRenderQueue( Shader s ) + { + return ( int ) ShaderUtilEx.Type.InvokeMember( "GetRenderQueue", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { s } ); + } + + public static int GetLOD( Shader s ) + { + return ( int ) ShaderUtilEx.Type.InvokeMember( "GetLOD", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { s } ); + } + + public static bool DoesIgnoreProjector( Shader s ) + { + return ( bool ) ShaderUtilEx.Type.InvokeMember( "DoesIgnoreProjector", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { s } ); + } + +#if UNITY_2018_3_OR_NEWER + public static int GetShaderActiveSubshaderIndex( Shader s ) + { + return (int)ShaderUtilEx.Type.InvokeMember( "GetShaderActiveSubshaderIndex", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { s } ); + } + + public static int GetSRPBatcherCompatibilityCode( Shader s, int subShaderIdx ) + { + return (int)ShaderUtilEx.Type.InvokeMember( "GetSRPBatcherCompatibilityCode", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { s, subShaderIdx } ); + } + + public static string GetSRPBatcherCompatibilityIssueReason( Shader s, int subShaderIdx, int err ) + { + return (string)ShaderUtilEx.Type.InvokeMember( "GetSRPBatcherCompatibilityIssueReason", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { s, subShaderIdx, err } ); + } +#endif + } + + public static class FileUtilEx + { + private static System.Type type = null; + public static System.Type Type { get { return ( type == null ) ? type = System.Type.GetType( "UnityEditor.FileUtil, UnityEditor" ) : type; } } + + public static string GetLastPathNameComponent( string path ) + { + return ( string ) FileUtilEx.Type.InvokeMember( "GetLastPathNameComponent", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { path } ); + } + } + + public static class ShaderInspectorEx + { + private static System.Type type = null; + public static System.Type Type { get { return ( type == null ) ? type = System.Type.GetType( "UnityEditor.ShaderInspector, UnityEditor" ) : type; } } + +#if UNITY_2019_3_OR_NEWER + public static void ShaderErrorListUI( UnityEngine.Object shader, ShaderMessage[] messages, ref Vector2 scrollPosition ) + { + Type.InvokeMember( "ShaderErrorListUI", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { shader, messages, scrollPosition } ); + } +#endif + } + + public static class GUISkinEx + { + private static System.Type type = null; + public static System.Type Type { get { return ( type == null ) ? type = System.Type.GetType( "UnityEngine.GUISkin, UnityEngine" ) : type; } } + + public static GUISkin GetCurrentSkin() + { + return ( GUISkin ) GUISkinEx.Type.GetField( "current", BindingFlags.NonPublic | BindingFlags.Static ).GetValue( null ); + } + } + + public static class EditorGUIEx + { + public static System.Type Type = typeof( EditorGUI ); + + public static bool ButtonMouseDown( Rect position, GUIContent content, FocusType focusType, GUIStyle style ) + { +#if UNITY_5_6_OR_NEWER + return EditorGUI.DropdownButton( position, content, focusType, style ); +#else + return ( bool ) EditorGUIEx.Type.InvokeMember( "ButtonMouseDown", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { position, content, focusType, style } ); +#endif + } + + public static float kObjectFieldMiniThumbnailHeight + { + get + { + return (float)EditorGUIEx.Type.InvokeMember( "kObjectFieldMiniThumbnailHeight", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.GetField, null, null, new object[] {} ); + } + } + + public static float kSingleLineHeight + { + get + { + return (float)EditorGUIEx.Type.InvokeMember( "kSingleLineHeight", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.GetField, null, null, new object[] { } ); + } + } + + } + + public static class ShaderInspectorPlatformsPopupEx + { + private static System.Type type = null; + public static System.Type Type { get { return ( type == null ) ? type = System.Type.GetType( "UnityEditor.ShaderInspectorPlatformsPopup, UnityEditor" ) : type; } } + + public static int GetCurrentMode() + { + return ( int ) ShaderInspectorPlatformsPopupEx.Type.GetProperty( "currentMode", BindingFlags.Public | BindingFlags.Static ).GetValue( null, null ); + } + + public static int GetCurrentPlatformMask() + { + return ( int ) ShaderInspectorPlatformsPopupEx.Type.GetProperty( "currentPlatformMask", BindingFlags.Public | BindingFlags.Static ).GetValue( null, null ); + } + + public static int GetCurrentVariantStripping() + { + return ( int ) ShaderInspectorPlatformsPopupEx.Type.GetProperty( "currentVariantStripping", BindingFlags.Public | BindingFlags.Static ).GetValue( null, null ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/CustomShaderInspector.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/CustomShaderInspector.cs.meta new file mode 100644 index 0000000..0685175 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/CustomShaderInspector.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 641dff721f3c24c4188f01fea49484cb +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/CustomTexture2DArrayInspector.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/CustomTexture2DArrayInspector.cs new file mode 100644 index 0000000..b43ee4e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/CustomTexture2DArrayInspector.cs @@ -0,0 +1,132 @@ +#if !UNITY_2019_1_OR_NEWER +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [CustomEditor( typeof( Texture2DArray ) )] + public class CustomTexture2DArrayInspector : Editor + { + Texture2DArray m_target; + [SerializeField] + float m_index; + Shader m_textureArrayPreview; + Material m_previewMaterial; + GUIStyle slider = null; + GUIStyle thumb = null; + GUIContent m_allButton = null; + [SerializeField] + bool m_seeAll; + void OnEnable() + { + m_target = ( target as Texture2DArray ); + m_textureArrayPreview = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "610c24aad350fba4583068c6c22fa428" ) ); + m_previewMaterial = new Material( m_textureArrayPreview ); + slider = null; + thumb = null; + } + + public override void OnPreviewGUI( Rect r, GUIStyle background ) + { + base.OnPreviewGUI( r, background ); + m_previewMaterial.SetTexture( "_MainTex", m_target ); + m_previewMaterial.SetFloat( "_Index", m_index ); + EditorGUI.DrawPreviewTexture( r, m_target, m_previewMaterial, ScaleMode.ScaleToFit, 1f ); + } + + private void OnDisable() + { + DestroyImmediate( m_previewMaterial ); + m_previewMaterial = null; + } + + public override void OnInspectorGUI() + { + if( slider == null ) + slider = "preSlider"; + + if( thumb == null ) + thumb = "preSliderThumb"; + + if( m_allButton == null ) + m_allButton = EditorGUIUtility.IconContent( "PreTextureMipMapLow" ); + + base.OnInspectorGUI(); + } + + public override bool HasPreviewGUI() + { + return true; + } + + public override void OnPreviewSettings() + { + base.OnPreviewSettings(); + m_seeAll = GUILayout.Toggle( m_seeAll, m_allButton, "preButton" ); + EditorGUI.BeginDisabledGroup( m_seeAll ); + m_index = Mathf.Round( GUILayout.HorizontalSlider( m_index, 0, m_target.depth - 1, slider, thumb ) ); + EditorGUI.EndDisabledGroup(); + } + + public override void OnInteractivePreviewGUI( Rect r, GUIStyle background ) + { + //base.OnInteractivePreviewGUI( r, background ); + if( m_seeAll ) + { + int columns = Mathf.CeilToInt( Mathf.Sqrt( m_target.depth ) ); + float sizeX = r.width / columns - 20; + float centerY = ( columns * columns ) - m_target.depth; + int rows = columns; + if( centerY >= columns ) + rows--; + float sizeY = ( r.height - 16 ) / rows - 15; + + if( centerY >= columns ) + centerY = sizeY * 0.5f; + else + centerY = 0; + + Rect smallRect = r; + if( rows > 1 ) + smallRect.y += ( 15 / ( rows - 1 ) ); + else + smallRect.y += 15; + smallRect.x = r.x + 10; + smallRect.width = sizeX; + smallRect.height = sizeY; + + for( int i = 0; i < m_target.depth; i++ ) + { + m_previewMaterial.SetTexture( "_MainTex", m_target ); + m_previewMaterial.SetFloat( "_Index", i ); + EditorGUI.DrawPreviewTexture( smallRect, m_target, m_previewMaterial, ScaleMode.ScaleToFit, 1 ); + Rect dropRect = smallRect; + + float diff = smallRect.height - smallRect.width; + if( diff > 0 ) + dropRect.y -= diff * 0.5f; + dropRect.y += 16; + EditorGUI.DropShadowLabel( dropRect, "[" + i + "]" ); + + smallRect.x += sizeX + 20; + if( ( ( i + 1 ) % ( columns ) ) == 0 ) + { + smallRect.x = r.x + 10; + smallRect.height = sizeY; + smallRect.y += sizeY + 30; + } + } + } + else + { + m_previewMaterial.SetTexture( "_MainTex", m_target ); + m_previewMaterial.SetFloat( "_Index", m_index ); + EditorGUI.DrawPreviewTexture( r, m_target, m_previewMaterial, ScaleMode.ScaleToFit, 1f ); + EditorGUI.DropShadowLabel( r, "[" + m_index + "]" ); + } + } + } +} +#endif diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/CustomTexture2DArrayInspector.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/CustomTexture2DArrayInspector.cs.meta new file mode 100644 index 0000000..7149ec0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/CustomTexture2DArrayInspector.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 871ecf36e52b267449b9047596793d6f +timeCreated: 1517913060 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/EditorVariablesManager.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/EditorVariablesManager.cs new file mode 100644 index 0000000..7b9c67c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/EditorVariablesManager.cs @@ -0,0 +1,254 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEditor; +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + public class EditorVariable + { + protected string m_labelName; + protected string m_name; + protected T m_value; + protected T m_defaultValue; + + public EditorVariable( string name, string labelName, T defaultValue ) { m_name = name; m_labelName = labelName; m_defaultValue = defaultValue; m_value = defaultValue; } + public string Name { get { return m_name; } } + + public virtual T Value + { + get { return m_value; } + set + { + m_value = value; + } + } + public string LabelName { get { return m_labelName; } } + } + + public sealed class EditorVariableFloat : EditorVariable + { + public EditorVariableFloat( string name, string labelName, float defaultValue ) : base( name, labelName, defaultValue ) + { + m_value = EditorPrefs.GetFloat( name, m_defaultValue ); + } + + public override float Value + { + get { return m_value; } + set + { + if( m_value != value ) + { + m_value = value; + EditorPrefs.SetFloat( m_name, m_value ); + } + } + } + } + + public sealed class EditorVariableBool : EditorVariable + { + public EditorVariableBool( string name, string labelName, bool defaultValue ) : base( name, labelName, defaultValue ) + { + m_value = EditorPrefs.GetBool( name, m_defaultValue ); + } + + public override bool Value + { + get { return m_value; } + set + { + if( m_value != value ) + { + m_value = value; + EditorPrefs.SetBool( m_name, m_value ); + } + } + } + } + + public sealed class EditorVariableInt : EditorVariable + { + public EditorVariableInt( string name, string labelName, int defaultValue ) : base( name, labelName, defaultValue ) + { + m_value = EditorPrefs.GetInt( name, m_defaultValue ); + } + + public override int Value + { + get { return m_value; } + set + { + if( m_value != value ) + { + m_value = value; + EditorPrefs.SetInt( m_name, m_value ); + } + } + } + } + + public sealed class EditorVariableString : EditorVariable + { + public EditorVariableString( string name, string labelName, string defaultValue ) : base( name, labelName, defaultValue ) + { + m_value = EditorPrefs.GetString( name, m_defaultValue ); + } + + public override string Value + { + get { return m_value; } + set + { + if( !m_value.Equals( value ) ) + { + m_value = value; + EditorPrefs.SetString( m_name, m_value ); + } + } + } + } + + public class EditorVariablesManager + { + public static EditorVariableBool LiveMode = new EditorVariableBool( "ASELiveMode", "LiveMode", false ); + public static EditorVariableBool OutlineActiveMode = new EditorVariableBool( "ASEOutlineActiveMode", " Outline", false ); + public static EditorVariableBool NodeParametersMaximized = new EditorVariableBool( "ASENodeParametersVisible", " NodeParameters", true ); + public static EditorVariableBool NodePaletteMaximized = new EditorVariableBool( "ASENodePaletteVisible", " NodePalette", true ); + public static EditorVariableBool ExpandedRenderingPlatforms = new EditorVariableBool( "ASEExpandedRenderingPlatforms", " ExpandedRenderingPlatforms", false ); + public static EditorVariableBool ExpandedRenderingOptions = new EditorVariableBool( "ASEExpandedRenderingOptions", " ExpandedRenderingPlatforms", false ); + public static EditorVariableBool ExpandedGeneralShaderOptions = new EditorVariableBool( "ASEExpandedGeneralShaderOptions", " ExpandedGeneralShaderOptions", false ); + public static EditorVariableBool ExpandedBlendOptions = new EditorVariableBool( "ASEExpandedBlendOptions", " ExpandedBlendOptions", false ); + public static EditorVariableBool ExpandedStencilOptions = new EditorVariableBool( "ASEExpandedStencilOptions", " ExpandedStencilOptions", false ); + public static EditorVariableBool ExpandedVertexOptions = new EditorVariableBool( "ASEExpandedVertexOptions", " ExpandedVertexOptions", false ); + public static EditorVariableBool ExpandedFunctionInputs = new EditorVariableBool( "ASEExpandedFunctionInputs", " ExpandedFunctionInputs", false ); + public static EditorVariableBool ExpandedFunctionSwitches = new EditorVariableBool( "ASEExpandedFunctionSwitches", " ExpandedFunctionSwitches", false ); + public static EditorVariableBool ExpandedFunctionOutputs = new EditorVariableBool( "ASEExpandedFunctionOutputs", " ExpandedFunctionOutputs", false ); + public static EditorVariableBool ExpandedAdditionalIncludes = new EditorVariableBool( "ASEExpandedAdditionalIncludes", " ExpandedAdditionalIncludes", false ); + public static EditorVariableBool ExpandedAdditionalDefines = new EditorVariableBool( "ASEExpandedAdditionalDefines", " ExpandedAdditionalDefines", false ); + public static EditorVariableBool ExpandedAdditionalDirectives = new EditorVariableBool( "ASEExpandedAdditionalDirectives", " ExpandedAdditionalDirectives", false ); + public static EditorVariableBool ExpandedCustomTags = new EditorVariableBool( "ASEExpandedCustomTags", " ExpandedCustomTags", false ); + public static EditorVariableBool ExpandedAdditionalSurfaceOptions = new EditorVariableBool( "ASEExpandedAdditionalSurfaceOptions", " ExpandedAdditionalSurfaceOptions", false ); + public static EditorVariableBool ExpandedAdditionalPragmas = new EditorVariableBool( "ASEExpandedAdditionalPragmas", " ExpandedAdditionalPragmas", false ); + public static EditorVariableBool ExpandedDependencies = new EditorVariableBool( "ASEExpandedDependencies", " ExpandedDependencies", false ); + public static EditorVariableBool ExpandedDepth = new EditorVariableBool( "ASEExpandedDepth", " ExpandedDepth", false ); + public static EditorVariableBool ExpandedTesselation = new EditorVariableBool( "ASEExpandedTesselation", " ExpandedTesselation", false ); + public static EditorVariableBool ExpandedProperties = new EditorVariableBool( "ASEExpandedProperties", " ExpandedProperties", false ); + public static EditorVariableBool ExpandedUsePass = new EditorVariableBool( "ASEUsePass", " UsePass", false ); + //Templates + public static EditorVariableBool ExpandedBlendModeModule = new EditorVariableBool( "ASEExpandedBlendModeModule", " ExpandedBlendModeModule", false ); + } + + [Serializable] + public class InnerWindowEditorVariables + { + [SerializeField] + private bool m_liveMode = false; + [SerializeField] + private bool m_outlineActiveMode = false; + [SerializeField] + private bool m_nodeParametersMaximized = false; + [SerializeField] + private bool m_nodePaletteMaximized = false; + [SerializeField] + private bool m_expandedRenderingPlatforms = false; + [SerializeField] + private bool m_expandedRenderingOptions = false; + [SerializeField] + private bool m_expandedGeneralShaderOptions = false; + [SerializeField] + private bool m_expandedBlendOptions = false; + [SerializeField] + private bool m_expandedStencilOptions = false; + [SerializeField] + private bool m_expandedVertexOptions = false; + [SerializeField] + private bool m_expandedFunctionInputs = false; + [SerializeField] + private bool m_expandedFunctionSwitches = false; + [SerializeField] + private bool m_expandedFunctionOutputs = false; + [SerializeField] + private bool m_expandedAdditionalIncludes = false; + [SerializeField] + private bool m_expandedAdditionalDefines = false; + [SerializeField] + private bool m_expandedAdditionalDirectives = false; + [SerializeField] + private bool m_expandedCustomTags = false; + [SerializeField] + private bool m_expandedAdditionalSurfaceOptions = false; + [SerializeField] + private bool m_expandedAdditionalPragmas = false; + [SerializeField] + private bool m_expandedDependencies = false; + [SerializeField] + private bool m_expandedBlendModeModule = false; + [SerializeField] + private bool m_expandedDepth = false; + [SerializeField] + private bool m_expandedTesselation = false; + [SerializeField] + private bool m_expandedProperties = false; + [SerializeField] + private bool m_expandedUsePass = false; + + public void Initialize() + { + m_liveMode = EditorVariablesManager.LiveMode.Value; + m_outlineActiveMode = EditorVariablesManager.OutlineActiveMode.Value; + m_nodeParametersMaximized = EditorVariablesManager.NodeParametersMaximized.Value; + m_nodePaletteMaximized = EditorVariablesManager.NodePaletteMaximized.Value; + m_expandedRenderingPlatforms = EditorVariablesManager.ExpandedRenderingPlatforms.Value; + m_expandedRenderingOptions = EditorVariablesManager.ExpandedRenderingOptions.Value; + m_expandedGeneralShaderOptions = EditorVariablesManager.ExpandedGeneralShaderOptions.Value; + m_expandedBlendOptions = EditorVariablesManager.ExpandedBlendOptions.Value; + m_expandedStencilOptions = EditorVariablesManager.ExpandedStencilOptions.Value; + m_expandedVertexOptions = EditorVariablesManager.ExpandedVertexOptions.Value; + m_expandedFunctionInputs = EditorVariablesManager.ExpandedFunctionInputs.Value; + m_expandedFunctionSwitches = EditorVariablesManager.ExpandedFunctionSwitches.Value; + m_expandedFunctionOutputs = EditorVariablesManager.ExpandedFunctionOutputs.Value; + m_expandedAdditionalIncludes = EditorVariablesManager.ExpandedAdditionalIncludes.Value; + m_expandedAdditionalDefines = EditorVariablesManager.ExpandedAdditionalDefines.Value; + m_expandedAdditionalDirectives = EditorVariablesManager.ExpandedAdditionalDirectives.Value; + m_expandedCustomTags = EditorVariablesManager.ExpandedCustomTags.Value; + m_expandedAdditionalSurfaceOptions = EditorVariablesManager.ExpandedAdditionalSurfaceOptions.Value; + m_expandedAdditionalPragmas = EditorVariablesManager.ExpandedAdditionalPragmas.Value; + m_expandedDependencies = EditorVariablesManager.ExpandedDependencies.Value; + m_expandedBlendModeModule = EditorVariablesManager.ExpandedBlendModeModule.Value; + m_expandedDepth = EditorVariablesManager.ExpandedDepth.Value; + m_expandedTesselation = EditorVariablesManager.ExpandedTesselation.Value; + m_expandedProperties = EditorVariablesManager.ExpandedProperties.Value; + m_expandedUsePass = EditorVariablesManager.ExpandedUsePass.Value; + } + + public bool LiveMode{ get { return m_liveMode; } set { m_liveMode = value; EditorVariablesManager.LiveMode.Value = value; } } + public bool OutlineActiveMode { get { return m_outlineActiveMode; } set { m_outlineActiveMode = value; EditorVariablesManager.OutlineActiveMode.Value = value; } } + public bool NodeParametersMaximized { get { return m_nodeParametersMaximized; } set { m_nodeParametersMaximized = value; EditorVariablesManager.NodeParametersMaximized.Value = value; } } + public bool NodePaletteMaximized { get { return m_nodePaletteMaximized; } set { m_nodePaletteMaximized = value; EditorVariablesManager.NodePaletteMaximized.Value = value; } } + public bool ExpandedRenderingPlatforms { get { return m_expandedRenderingPlatforms; } set { m_expandedRenderingPlatforms = value; EditorVariablesManager.ExpandedRenderingPlatforms.Value = value; } } + public bool ExpandedRenderingOptions { get { return m_expandedRenderingOptions; } set { m_expandedRenderingOptions = value; EditorVariablesManager.ExpandedRenderingOptions.Value = value; } } + public bool ExpandedGeneralShaderOptions { get { return m_expandedGeneralShaderOptions; } set { m_expandedGeneralShaderOptions = value; EditorVariablesManager.ExpandedGeneralShaderOptions.Value = value; } } + public bool ExpandedBlendOptions { get { return m_expandedBlendOptions; } set { m_expandedBlendOptions = value; EditorVariablesManager.ExpandedBlendOptions.Value = value; } } + public bool ExpandedStencilOptions { get { return m_expandedStencilOptions; } set { m_expandedStencilOptions = value; EditorVariablesManager.ExpandedStencilOptions.Value = value; } } + public bool ExpandedVertexOptions { get { return m_expandedVertexOptions; } set { m_expandedVertexOptions = value; EditorVariablesManager.ExpandedVertexOptions.Value = value; } } + public bool ExpandedFunctionInputs { get { return m_expandedFunctionInputs; } set { m_expandedFunctionInputs = value; EditorVariablesManager.ExpandedFunctionInputs.Value = value; } } + public bool ExpandedFunctionSwitches { get { return m_expandedFunctionSwitches; } set { m_expandedFunctionSwitches = value; EditorVariablesManager.ExpandedFunctionSwitches.Value = value; } } + public bool ExpandedFunctionOutputs { get { return m_expandedFunctionOutputs; } set { m_expandedFunctionOutputs = value; EditorVariablesManager.ExpandedFunctionOutputs.Value = value; } } + public bool ExpandedAdditionalIncludes { get { return m_expandedAdditionalIncludes; } set { m_expandedAdditionalIncludes = value; EditorVariablesManager.ExpandedAdditionalIncludes.Value = value; } } + public bool ExpandedAdditionalDefines { get { return m_expandedAdditionalDefines; } set { m_expandedAdditionalDefines = value; EditorVariablesManager.ExpandedAdditionalDefines.Value = value; } } + public bool ExpandedAdditionalDirectives { get { return m_expandedAdditionalDirectives; } set { m_expandedAdditionalDirectives = value; EditorVariablesManager.ExpandedAdditionalDirectives.Value = value; } } + public bool ExpandedCustomTags { get { return m_expandedCustomTags; } set { m_expandedCustomTags = value; EditorVariablesManager.ExpandedCustomTags.Value = value; } } + public bool ExpandedAdditionalSurfaceOptions { get { return m_expandedAdditionalSurfaceOptions; } set { m_expandedAdditionalSurfaceOptions = value; EditorVariablesManager.ExpandedAdditionalSurfaceOptions.Value = value; } } + public bool ExpandedAdditionalPragmas { get { return m_expandedAdditionalPragmas; } set { m_expandedAdditionalPragmas = value; EditorVariablesManager.ExpandedAdditionalPragmas.Value = value; } } + public bool ExpandedDependencies { get { return m_expandedDependencies; } set { m_expandedDependencies = value; EditorVariablesManager.ExpandedDependencies.Value = value; } } + public bool ExpandedBlendModeModule { get { return m_expandedBlendModeModule; } set { m_expandedBlendModeModule = value; EditorVariablesManager.ExpandedBlendModeModule.Value = value; } } + public bool ExpandedDepth { get { return m_expandedDepth; } set { m_expandedDepth = value; EditorVariablesManager.ExpandedDepth.Value = value; } } + public bool ExpandedTesselation { get { return m_expandedTesselation; } set { m_expandedTesselation = value; EditorVariablesManager.ExpandedTesselation.Value = value; } } + public bool ExpandedProperties { get { return m_expandedProperties; } set { m_expandedProperties = value; EditorVariablesManager.ExpandedProperties.Value = value; } } + public bool ExpandedUsePass { get { return m_expandedUsePass; } set { m_expandedUsePass = value; EditorVariablesManager.ExpandedUsePass.Value = value; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/EditorVariablesManager.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/EditorVariablesManager.cs.meta new file mode 100644 index 0000000..73d074d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/EditorVariablesManager.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d402e3c7d578ee046a5d0826b9a41c27 +timeCreated: 1487245046 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/GeneratorUtils.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/GeneratorUtils.cs new file mode 100644 index 0000000..79f69d9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/GeneratorUtils.cs @@ -0,0 +1,1365 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +namespace AmplifyShaderEditor +{ + public static class GeneratorUtils + { + public const string ObjectScaleStr = "ase_objectScale"; + public const string ParentObjectScaleStr = "ase_parentObjectScale"; + public const string ScreenDepthStr = "ase_screenDepth"; + public const string ViewPositionStr = "ase_viewPos"; + public const string WorldViewDirectionStr = "ase_worldViewDir"; + public const string TangentViewDirectionStr = "ase_tanViewDir"; + public const string NormalizedViewDirStr = "ase_normViewDir"; + public const string ClipPositionStr = "ase_clipPos"; + public const string VertexPosition3Str = "ase_vertex3Pos"; + public const string VertexPosition4Str = "ase_vertex4Pos"; + public const string VertexNormalStr = "ase_vertexNormal"; + public const string VertexTangentStr = "ase_vertexTangent"; + public const string VertexTangentSignStr = "ase_vertexTangentSign"; + public const string VertexBitangentStr = "ase_vertexBitangent"; + public const string ScreenPositionStr = "ase_screenPos"; + public const string NormalizedScreenPosFormat = "{0} / {0}.w"; + public const string ScreenPositionNormalizedStr = "ase_screenPosNorm"; + public const string GrabScreenPositionStr = "ase_grabScreenPos"; + public const string GrabScreenPositionNormalizedStr = "ase_grabScreenPosNorm"; + public const string WorldPositionStr = "ase_worldPos"; + public const string RelativeWorldPositionStr = "ase_relWorldPos"; + public const string VFaceStr = "ase_vface"; + public const string ShadowCoordsStr = "ase_shadowCoords"; + public const string WorldLightDirStr = "ase_worldlightDir"; + public const string ObjectLightDirStr = "ase_objectlightDir"; + public const string WorldNormalStr = "ase_worldNormal"; + public const string NormalizedWorldNormalStr = "ase_normWorldNormal"; + public const string WorldReflectionStr = "ase_worldReflection"; + public const string WorldTangentStr = "ase_worldTangent"; + public const string WorldBitangentStr = "ase_worldBitangent"; + public const string WorldToTangentStr = "ase_worldToTangent"; + public const string ObjectToTangentStr = "ase_objectToTangent"; + public const string TangentToWorldPreciseStr = "ase_tangentToWorldPrecise"; + public const string TangentToWorldFastStr = "ase_tangentToWorldFast"; + public const string TangentToObjectStr = "ase_tangentToObject"; + public const string TangentToObjectFastStr = "ase_tangentToObjectFast"; + private const string Float3Format = "float3 {0} = {1};"; + private const string Float4Format = "float4 {0} = {1};"; + private const string GrabFunctionHeader = "inline float4 ASE_ComputeGrabScreenPos( float4 pos )"; + private const string GrabFunctionCall = "ASE_ComputeGrabScreenPos( {0} )"; + private const string Identity4x4 = "ase_identity4x4"; + private static readonly string[] GrabFunctionBody = { + "#if UNITY_UV_STARTS_AT_TOP", + "float scale = -1.0;", + "#else", + "float scale = 1.0;", + "#endif", + "float4 o = pos;", + "o.y = pos.w * 0.5f;", + "o.y = ( pos.y - o.y ) * _ProjectionParams.x * scale + o.y;", + "return o;" + }; + + // MATRIX IDENTITY + static public string GenerateIdentity4x4( ref MasterNodeDataCollector dataCollector, int uniqueId ) + { + dataCollector.AddLocalVariable( uniqueId, "float4x4 ase_identity4x4 = float4x4(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1);" ); + return Identity4x4; + } + + + // OBJECT SCALE + static public string GenerateObjectScale( ref MasterNodeDataCollector dataCollector, int uniqueId ) + { + if( dataCollector.IsTemplate ) + return dataCollector.TemplateDataCollectorInstance.GenerateObjectScale( ref dataCollector, uniqueId ); + + //string value= "1/float3( length( unity_WorldToObject[ 0 ].xyz ), length( unity_WorldToObject[ 1 ].xyz ), length( unity_WorldToObject[ 2 ].xyz ) );"; + string value = "float3( length( unity_ObjectToWorld[ 0 ].xyz ), length( unity_ObjectToWorld[ 1 ].xyz ), length( unity_ObjectToWorld[ 2 ].xyz ) )"; + dataCollector.AddLocalVariable( uniqueId, PrecisionType.Float, WirePortDataType.FLOAT3, ObjectScaleStr, value ); + return ObjectScaleStr; + } + + static public string GenerateRotationIndependentObjectScale( ref MasterNodeDataCollector dataCollector, int uniqueId ) + { + if( dataCollector.IsTemplate ) + return dataCollector.TemplateDataCollectorInstance.GenerateRotationIndependentObjectScale( ref dataCollector, uniqueId ); + + string value = "(1.0/float3( length( unity_WorldToObject[ 0 ].xyz ), length( unity_WorldToObject[ 1 ].xyz ), length( unity_WorldToObject[ 2 ].xyz ) ))"; + dataCollector.AddLocalVariable( uniqueId, PrecisionType.Float, WirePortDataType.FLOAT3, ParentObjectScaleStr, value ); + return ParentObjectScaleStr; + } + + // WORLD POSITION + static public string GenerateWorldPosition( ref MasterNodeDataCollector dataCollector, int uniqueId ) + { + PrecisionType precision = PrecisionType.Float; + if( dataCollector.IsTemplate ) + return dataCollector.TemplateDataCollectorInstance.GetWorldPos(); + + dataCollector.AddToInput( -1, SurfaceInputs.WORLD_POS, precision ); + + string result = Constants.InputVarStr + ".worldPos"; + + if( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + result = "mul( unity_ObjectToWorld, " + Constants.VertexShaderInputStr + ".vertex )"; + + //dataCollector.AddToLocalVariables( dataCollector.PortCategory, uniqueId, string.Format( Float3Format, WorldPositionStr, result ) ); + dataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT3, WorldPositionStr, result ); + + return WorldPositionStr; + } + + // WORLD REFLECTION + static public string GenerateWorldReflection( ref MasterNodeDataCollector dataCollector, int uniqueId, bool normalize = false ) + { + if( dataCollector.IsTemplate ) + return dataCollector.TemplateDataCollectorInstance.GetWorldReflection( UIUtils.CurrentWindow.CurrentGraph.CurrentPrecision, true, MasterNodePortCategory.Fragment, normalize ); + + string precisionType = UIUtils.PrecisionWirePortToCgType( UIUtils.CurrentWindow.CurrentGraph.CurrentPrecision, WirePortDataType.FLOAT3 ); + string result = string.Empty; + if( !dataCollector.DirtyNormal ) + result = Constants.InputVarStr + ".worldRefl"; + else + result = "WorldReflectionVector( " + Constants.InputVarStr + ", " + precisionType + "( 0, 0, 1 ) )"; + + if( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + result = "UnityObjectToWorldNormal( " + Constants.VertexShaderInputStr + ".normal )"; + if( normalize ) + { + result = string.Format( "normalize( {0} )", result ); + } + + dataCollector.AddToLocalVariables( dataCollector.PortCategory, uniqueId, string.Concat( precisionType, " ", WorldReflectionStr, " = ", result, ";" ) ); + return WorldReflectionStr; + } + + // WORLD NORMAL + static public string GenerateWorldNormal( ref MasterNodeDataCollector dataCollector, int uniqueId, PrecisionType precisionType, string normal, string outputId ) + { + if( dataCollector.IsTemplate ) + return dataCollector.TemplateDataCollectorInstance.GetWorldNormal( uniqueId, precisionType, normal, outputId ); + + string tanToWorld = GenerateTangentToWorldMatrixFast( ref dataCollector, uniqueId, precisionType ); + return string.Format( "mul({0},{1})", tanToWorld, normal ); + + } + static public string GenerateWorldNormal( ref MasterNodeDataCollector dataCollector, int uniqueId, bool normalize = false ) + { + PrecisionType precision = UIUtils.CurrentWindow.CurrentGraph.CurrentPrecision; + + if( dataCollector.IsTemplate ) + return dataCollector.TemplateDataCollectorInstance.GetWorldNormal( precision, true, MasterNodePortCategory.Fragment, normalize ); + + string precisionType = UIUtils.PrecisionWirePortToCgType( precision, WirePortDataType.FLOAT3 ); + string result = string.Empty; + if( !dataCollector.DirtyNormal ) + result = Constants.InputVarStr + ".worldNormal"; + else + result = "WorldNormalVector( " + Constants.InputVarStr + ", " + precisionType + "( 0, 0, 1 ) )"; + + if( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + result = "UnityObjectToWorldNormal( " + Constants.VertexShaderInputStr + ".normal )"; + + dataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT3, WorldNormalStr, result ); + if( normalize ) + { + dataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT3, NormalizedWorldNormalStr, "normalize( " + WorldNormalStr + " )" ); + return NormalizedWorldNormalStr; + } + return WorldNormalStr; + } + + // WORLD TANGENT + static public string GenerateWorldTangent( ref MasterNodeDataCollector dataCollector, int uniqueId ) + { + if( dataCollector.IsTemplate ) + return dataCollector.TemplateDataCollectorInstance.GetWorldTangent( UIUtils.CurrentWindow.CurrentGraph.CurrentPrecision ); + + string precisionType = UIUtils.PrecisionWirePortToCgType( UIUtils.CurrentWindow.CurrentGraph.CurrentPrecision, WirePortDataType.FLOAT3 ); + string result = "WorldNormalVector( " + Constants.InputVarStr + ", " + precisionType + "( 1, 0, 0 ) )"; + + if( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + result = "UnityObjectToWorldDir( " + Constants.VertexShaderInputStr + ".tangent.xyz )"; + dataCollector.AddLocalVariable( uniqueId, UIUtils.CurrentWindow.CurrentGraph.CurrentPrecision, WirePortDataType.FLOAT3, WorldTangentStr, result ); + //dataCollector.AddToLocalVariables( dataCollector.PortCategory, uniqueId, string.Concat( precisionType, " ", WorldTangentStr, " = ", result, ";" ) ); + return WorldTangentStr; + } + + // WORLD BITANGENT + static public string GenerateWorldBitangent( ref MasterNodeDataCollector dataCollector, int uniqueId ) + { + if( dataCollector.IsTemplate ) + return dataCollector.TemplateDataCollectorInstance.GetWorldBinormal( UIUtils.CurrentWindow.CurrentGraph.CurrentPrecision ); + + string precisionType = UIUtils.PrecisionWirePortToCgType( UIUtils.CurrentWindow.CurrentGraph.CurrentPrecision, WirePortDataType.FLOAT3 ); + string result = "WorldNormalVector( " + Constants.InputVarStr + ", " + precisionType + "( 0, 1, 0 ) )"; + + if( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) + { + string worldNormal = GenerateWorldNormal( ref dataCollector, uniqueId ); + string worldTangent = GenerateWorldTangent( ref dataCollector, uniqueId ); + dataCollector.AddToVertexLocalVariables( uniqueId, string.Format( "half tangentSign = {0}.tangent.w * unity_WorldTransformParams.w;", Constants.VertexShaderInputStr ) ); + result = "cross( " + worldNormal + ", " + worldTangent + " ) * tangentSign"; + } + + dataCollector.AddToLocalVariables( dataCollector.PortCategory, uniqueId, string.Concat( precisionType, " ", WorldBitangentStr, " = ", result, ";" ) ); + return WorldBitangentStr; + } + + // OBJECT TO TANGENT MATRIX + static public string GenerateObjectToTangentMatrix( ref MasterNodeDataCollector dataCollector, int uniqueId, PrecisionType precision ) + { + string normal = GenerateVertexNormal( ref dataCollector, uniqueId, precision ); + string tangent = GenerateVertexTangent( ref dataCollector, uniqueId, precision, WirePortDataType.FLOAT3 ); + string bitangen = GenerateVertexBitangent( ref dataCollector, uniqueId, precision ); + dataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT3x3, ObjectToTangentStr, "float3x3( " + tangent + ", " + bitangen + ", " + normal + " )" ); + return ObjectToTangentStr; + } + + // TANGENT TO OBJECT + //static public string GenerateTangentToObjectMatrixFast( ref MasterNodeDataCollector dataCollector, int uniqueId, PrecisionType precision ) + //{ + // string normal = GenerateVertexNormal( ref dataCollector, uniqueId, precision ); + // string tangent = GenerateVertexTangent( ref dataCollector, uniqueId, precision ); + // string bitangent = GenerateVertexBitangent( ref dataCollector, uniqueId, precision ); + + // string result = string.Format( "float3x3({0}.x,{1}.x,{2}.x,{0}.y,{1}.y,{2}.y,{0}.z,{1}.z,{2}.z)",tangent,bitangent,normal ); + // dataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT3x3, TangentToObjectFastStr, result ); + // return TangentToObjectFastStr; + //} + + //static public string GenerateTangentToObjectMatrixPrecise( ref MasterNodeDataCollector dataCollector, int uniqueId, PrecisionType precision ) + //{ + // string objectToTangent = GenerateObjectToTangentMatrix( ref dataCollector, uniqueId, precision ); + // Add3x3InverseFunction( ref dataCollector, UIUtils.PrecisionWirePortToCgType( precision, WirePortDataType.FLOAT ) ); + // dataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT3x3, TangentToObjectStr, string.Format( Inverse3x3Header, objectToTangent ) ); + // return TangentToObjectStr; + //} + + // WORLD TO TANGENT MATRIX + static public string GenerateWorldToTangentMatrix( ref MasterNodeDataCollector dataCollector, int uniqueId, PrecisionType precision ) + { + if( dataCollector.IsTemplate ) + return dataCollector.TemplateDataCollectorInstance.GetWorldToTangentMatrix( precision ); + + if( dataCollector.IsFragmentCategory ) + { + dataCollector.ForceNormal = true; + + dataCollector.AddToInput( -1, SurfaceInputs.WORLD_NORMAL, precision ); + dataCollector.AddToInput( -1, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + } + + string worldNormal = GenerateWorldNormal( ref dataCollector, uniqueId ); + string worldTangent = GenerateWorldTangent( ref dataCollector, uniqueId ); + string worldBitangent = GenerateWorldBitangent( ref dataCollector, uniqueId ); + + dataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT3x3, WorldToTangentStr, "float3x3( " + worldTangent + ", " + worldBitangent + ", " + worldNormal + " )" ); + return WorldToTangentStr; + } + + // TANGENT TO WORLD + static public string GenerateTangentToWorldMatrixFast( ref MasterNodeDataCollector dataCollector, int uniqueId, PrecisionType precision ) + { + if( dataCollector.IsTemplate ) + return dataCollector.TemplateDataCollectorInstance.GetTangentToWorldMatrixFast( precision ); + + if( dataCollector.IsFragmentCategory ) + { + dataCollector.ForceNormal = true; + + dataCollector.AddToInput( -1, SurfaceInputs.WORLD_NORMAL, precision ); + dataCollector.AddToInput( -1, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + } + + string worldNormal = GenerateWorldNormal( ref dataCollector, uniqueId ); + string worldTangent = GenerateWorldTangent( ref dataCollector, uniqueId ); + string worldBitangent = GenerateWorldBitangent( ref dataCollector, uniqueId ); + + string result = string.Format( "float3x3({0}.x,{1}.x,{2}.x,{0}.y,{1}.y,{2}.y,{0}.z,{1}.z,{2}.z)", worldTangent, worldBitangent, worldNormal ); + dataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT3x3, TangentToWorldFastStr, result ); + return TangentToWorldFastStr; + } + + static public string GenerateTangentToWorldMatrixPrecise( ref MasterNodeDataCollector dataCollector, int uniqueId, PrecisionType precision ) + { + if( dataCollector.IsTemplate ) + return dataCollector.TemplateDataCollectorInstance.GetTangentToWorldMatrixPrecise( precision ); + + if( dataCollector.IsFragmentCategory ) + { + dataCollector.ForceNormal = true; + + dataCollector.AddToInput( -1, SurfaceInputs.WORLD_NORMAL, precision ); + dataCollector.AddToInput( -1, SurfaceInputs.INTERNALDATA, addSemiColon: false ); + } + + string worldToTangent = GenerateWorldToTangentMatrix( ref dataCollector, uniqueId, precision ); + Add3x3InverseFunction( ref dataCollector, UIUtils.PrecisionWirePortToCgType( precision, WirePortDataType.FLOAT ) ); + dataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT3x3, TangentToWorldPreciseStr, string.Format( Inverse3x3Header, worldToTangent ) ); + return TangentToWorldPreciseStr; + } + + // SAMPLER STATES + static public string GenerateSamplerState( ref MasterNodeDataCollector dataCollector, int uniqueId, string propertyName, bool returnPropertyName = false ) + { + + string sampler = string.Format( Constants.SamplerFormat, propertyName ); + string samplerDecl = string.Empty; + + ParentGraph outsideGraph = UIUtils.CurrentWindow.OutsideGraph; +#if !UNITY_2018_1_OR_NEWER + if( outsideGraph.IsStandardSurface ) + return string.Empty; +#endif + if( outsideGraph.IsSRP ) + //if( dataCollector.IsSRP ) + samplerDecl = string.Format( Constants.SamplerDeclSRPFormat, sampler ) + ";"; + else + samplerDecl = string.Format( Constants.SamplerDeclFormat, sampler ) + ";"; + dataCollector.AddToUniforms( uniqueId, samplerDecl ); + + if( returnPropertyName ) + return propertyName; + else + return sampler; + } + + public static string GetPropertyFromSamplerState( string sampler ) + { + if( sampler.StartsWith( "sampler" ) ) + return sampler.Remove( 0, 7 ); + else + return sampler; + } + + public static string GetSamplerDeclaraction( string texture, WirePortDataType type, string termination = "" ) + { + return GetSamplerDeclaraction( texture, Constants.WireToTexture[ type ], termination ); + } + + public static string GetSamplerDeclaraction( string sampler, TextureType type, string termination = "" ) + { + ParentGraph outsideGraph = UIUtils.CurrentWindow.OutsideGraph; +#if UNITY_2018_1_OR_NEWER + if( outsideGraph.SamplingMacros || type == TextureType.Texture2DArray ) +#else + if( ( outsideGraph.SamplingMacros || type == TextureType.Texture2DArray ) && !outsideGraph.IsStandardSurface /*) || type == TextureType.Texture2DArray*/ ) +#endif + { + if( outsideGraph.IsSRP ) + return string.Format( Constants.SamplerDeclSRPFormat, sampler ) + termination; + else + return string.Format( Constants.SamplerDeclFormat, sampler ) + termination; + } + + // we don't use sampler states when macros are not available + return string.Empty; + } + + // PROPERTY MACRO + public static string GetPropertyDeclaraction( string texture, WirePortDataType type, string termination = "" ) + { + return GetPropertyDeclaraction( texture, Constants.WireToTexture[ type ], termination ); + } + + public static string GetPropertyDeclaraction( string texture, TextureType type, string termination = "" ) + { + if( type == TextureType.Texture1D ) + return "sampler1D " + texture + termination; + + ParentGraph outsideGraph = UIUtils.CurrentWindow.OutsideGraph; +#if UNITY_2018_1_OR_NEWER + if( outsideGraph.SamplingMacros || type == TextureType.Texture2DArray ) +#else + if( ( outsideGraph.SamplingMacros || type == TextureType.Texture2DArray ) && !outsideGraph.IsStandardSurface ) +#endif + { + if( outsideGraph.IsSRP ) + return string.Format( Constants.TexDeclarationNoSamplerSRPMacros[ type ], texture ) + termination; + else + return string.Format( Constants.TexDeclarationNoSamplerStandardMacros[ type ], texture ) + termination; + } + + return UIUtils.TextureTypeToCgType( type )+ " " + texture + termination; + } + + // SAMPLING CALL + public static string GenerateSamplingCall( ref MasterNodeDataCollector dataCollector, WirePortDataType type, string property, string samplerState, string uv, MipType mip = MipType.Auto, params string[] mipData ) + { + ParentGraph ousideGraph = UIUtils.CurrentWindow.OutsideGraph; + string result = string.Empty; + string mipSuffix = string.Empty; + + //samplerState = GetPropertyFromSamplerState( samplerState ); + TextureType textureType = Constants.WireToTexture[ type ]; + + bool usingMacro = false; +#if UNITY_2018_1_OR_NEWER + if( ousideGraph.SamplingMacros || textureType == TextureType.Texture2DArray ) +#else + if( ( ousideGraph.SamplingMacros && !ousideGraph.IsStandardSurface ) || textureType == TextureType.Texture2DArray ) +#endif + usingMacro = true; + + switch( mip ) + { + default: + case MipType.Auto: + break; + case MipType.MipLevel: + mipSuffix = usingMacro ? "_LOD" : "lod"; + break; + case MipType.MipBias: + mipSuffix = usingMacro ? "_BIAS" : "bias"; + break; + case MipType.Derivative: + mipSuffix = usingMacro ? "_GRAD" : "grad"; + break; + } + + string mipParams = string.Empty; + if( mip != MipType.Auto ) + { + for( int i = 0; i < mipData.Length; i++ ) + { + mipParams += ", " + mipData[ i ]; + } + } + + if( usingMacro ) + { + if( ousideGraph.IsSRP ) + { + if( textureType == TextureType.Texture3D && ( mip == MipType.MipBias || mip == MipType.Derivative ) ) + AddCustom3DSRPMacros( ref dataCollector ); + // srp macro + result = string.Format( Constants.TexSampleSRPMacros[ textureType ], mipSuffix, property, samplerState, uv + mipParams ); + } + else + { + AddCustomStandardSamplingMacros( ref dataCollector, type, mip ); +#if !UNITY_2018_1_OR_NEWER + if( ousideGraph.IsStandardSurface ) + result = string.Format( Constants.TexSampleStandardMacros[ textureType ], mipSuffix, property, samplerState, uv + mipParams ); + else +#endif + result = string.Format( Constants.TexSampleSamplerStandardMacros[ textureType ], mipSuffix, property, samplerState, uv + mipParams ); + + } + } + else + { + //no macro : builtin and srp + string uvs = uv + mipParams; + string emptyParam = ", 0"; + if( textureType == TextureType.Texture3D || textureType == TextureType.Cube ) + emptyParam = string.Empty; + + if( ( mip == MipType.MipBias || mip == MipType.MipLevel ) ) + uvs = "float4(" + uv + emptyParam + mipParams + ")"; + + result = string.Format( Constants.TexSampleStandard[ textureType ], mipSuffix, property, uvs ); + } + return result; + } + + // AUTOMATIC UVS + static public string GenerateAutoUVs( ref MasterNodeDataCollector dataCollector, int uniqueId, int index, string propertyName = null, WirePortDataType size = WirePortDataType.FLOAT2, string scale = null, string offset = null, string outputId = null ) + { + string result = string.Empty; + string varName = string.Empty; + string indexStr = index > 0 ? ( index + 1 ).ToString() : ""; + string sizeDif = string.Empty; + if( size == WirePortDataType.FLOAT3 ) + sizeDif = "3"; + else if( size == WirePortDataType.FLOAT4 ) + sizeDif = "4"; + + if( !dataCollector.IsTemplate && index > 3 ) + { + string texCoordNameIn = TemplateHelperFunctions.BaseInterpolatorName + index; + string texCoordNameOut = TemplateHelperFunctions.BaseInterpolatorName + ( index + 1 ).ToString(); + if( dataCollector.IsFragmentCategory ) + { + + GenerateValueInVertex( ref dataCollector, uniqueId, size, PrecisionType.Float, Constants.VertexShaderInputStr + "." + texCoordNameIn, texCoordNameOut, true ); + result = Constants.InputVarStr + "." + texCoordNameOut; + } + else + { + result = Constants.VertexShaderInputStr + "." + texCoordNameIn; + } + + if( !string.IsNullOrEmpty( propertyName ) ) + { + + varName = "uv" + indexStr + ( size != WirePortDataType.FLOAT2 ? "s" + sizeDif : "" ) + propertyName; + dataCollector.AddToUniforms( uniqueId, "uniform float4 " + propertyName + "_ST;" ); + if( size > WirePortDataType.FLOAT2 ) + { + dataCollector.UsingHigherSizeTexcoords = true; + dataCollector.AddToLocalVariables( dataCollector.PortCategory, uniqueId, PrecisionType.Float, size, varName, result ); + dataCollector.AddToLocalVariables( dataCollector.PortCategory, uniqueId, varName + ".xy = " + result + ".xy * " + propertyName + "_ST.xy + " + propertyName + "_ST.zw;" ); + } + else + { + dataCollector.AddToLocalVariables( dataCollector.PortCategory, uniqueId, PrecisionType.Float, size, varName, result + " * " + propertyName + "_ST.xy + " + propertyName + "_ST.zw" ); + } + + result = varName; + } + + switch( size ) + { + default: + case WirePortDataType.FLOAT2: + { + result += ".xy"; + } + break; + case WirePortDataType.FLOAT3: + { + result += ".xyz"; + } + break; + case WirePortDataType.FLOAT4: break; + } + + return result; + } + + if( dataCollector.PortCategory == MasterNodePortCategory.Fragment || dataCollector.PortCategory == MasterNodePortCategory.Debug ) + { + string dummyPropUV = "_tex" + sizeDif + "coord" + indexStr; + string dummyUV = "uv" + indexStr + dummyPropUV; + + dataCollector.AddToProperties( uniqueId, "[HideInInspector] " + dummyPropUV + "( \"\", 2D ) = \"white\" {}", 100 ); + dataCollector.AddToInput( uniqueId, dummyUV, size ); + + result = Constants.InputVarStr + "." + dummyUV; + } + else + { + result = Constants.VertexShaderInputStr + ".texcoord"; + if( index > 0 ) + { + result += index.ToString(); + } + + switch( size ) + { + default: + case WirePortDataType.FLOAT2: + { + result += ".xy"; + } + break; + case WirePortDataType.FLOAT3: + { + result += ".xyz"; + } + break; + case WirePortDataType.FLOAT4: break; + } + } + + varName = "uv" + indexStr + ( size != WirePortDataType.FLOAT2 ? "s" + sizeDif : "" ) + "_TexCoord" + outputId; + + if( !string.IsNullOrEmpty( propertyName ) ) + { + string finalVarName = "uv" + indexStr + ( size != WirePortDataType.FLOAT2 ? "s" + sizeDif : "" ) + propertyName; + + dataCollector.AddToUniforms( uniqueId, "uniform float4 " + propertyName + "_ST;" ); + if( size > WirePortDataType.FLOAT2 ) + { + dataCollector.UsingHigherSizeTexcoords = true; + dataCollector.AddToLocalVariables( dataCollector.PortCategory, uniqueId, PrecisionType.Float, size, finalVarName, result ); + dataCollector.AddToLocalVariables( dataCollector.PortCategory, uniqueId, finalVarName + ".xy = " + result + ".xy * " + propertyName + "_ST.xy + " + propertyName + "_ST.zw;" ); + } + else + { + dataCollector.AddToLocalVariables( dataCollector.PortCategory, uniqueId, PrecisionType.Float, size, finalVarName, result + " * " + propertyName + "_ST.xy + " + propertyName + "_ST.zw" ); + } + + result = finalVarName; + } + else if( !string.IsNullOrEmpty( scale ) || !string.IsNullOrEmpty( offset ) ) + { + if( size > WirePortDataType.FLOAT2 ) + { + dataCollector.UsingHigherSizeTexcoords = true; + dataCollector.AddToLocalVariables( dataCollector.PortCategory, uniqueId, PrecisionType.Float, size, varName, result ); + dataCollector.AddToLocalVariables( dataCollector.PortCategory, uniqueId, varName + ".xy = " + result + ".xy" + ( string.IsNullOrEmpty( scale ) ? "" : " * " + scale ) + ( string.IsNullOrEmpty( offset ) ? "" : " + " + offset ) + ";" ); + } + else + { + dataCollector.AddToLocalVariables( dataCollector.PortCategory, uniqueId, PrecisionType.Float, size, varName, result + ( string.IsNullOrEmpty( scale ) ? "" : " * " + scale ) + ( string.IsNullOrEmpty( offset ) ? "" : " + " + offset ) ); + } + + result = varName; + } + else if( dataCollector.PortCategory == MasterNodePortCategory.Fragment ) + { + if( size > WirePortDataType.FLOAT2 ) + dataCollector.UsingHigherSizeTexcoords = true; + } + + return result; + } + + // SCREEN POSITION NORMALIZED + static public string GenerateScreenPositionNormalizedForValue( string customVertexPos, string outputId, ref MasterNodeDataCollector dataCollector, int uniqueId, PrecisionType precision, bool addInput = true ) + { + string stringPosVar = GenerateScreenPositionForValue( customVertexPos, outputId, ref dataCollector, uniqueId, precision, addInput ); + string varName = ScreenPositionNormalizedStr + uniqueId; + + // TODO: check later if precision can be half + dataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT4, varName, string.Format( NormalizedScreenPosFormat, stringPosVar ) ); + dataCollector.AddLocalVariable( uniqueId, varName + ".z = ( UNITY_NEAR_CLIP_VALUE >= 0 ) ? " + varName + ".z : " + varName + ".z * 0.5 + 0.5;" ); + + return varName; + } + + static public string GenerateScreenPositionNormalized( ref MasterNodeDataCollector dataCollector, int uniqueId, PrecisionType precision, bool addInput = true, string customScreenPos = null ) + { + string stringPosVar = string.IsNullOrEmpty( customScreenPos ) ? GenerateScreenPosition( ref dataCollector, uniqueId, precision, addInput ) : customScreenPos; + + // TODO: check later if precision can be half + dataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT4, ScreenPositionNormalizedStr, string.Format( NormalizedScreenPosFormat, stringPosVar ) ); + dataCollector.AddLocalVariable( uniqueId, ScreenPositionNormalizedStr + ".z = ( UNITY_NEAR_CLIP_VALUE >= 0 ) ? " + ScreenPositionNormalizedStr + ".z : " + ScreenPositionNormalizedStr + ".z * 0.5 + 0.5;" ); + + return ScreenPositionNormalizedStr; + } + + // SCREEN POSITION + static public string GenerateScreenPositionForValue( string customVertexPosition, string outputId, ref MasterNodeDataCollector dataCollector, int uniqueId, PrecisionType precision, bool addInput = true ) + { + // overriding precision + precision = PrecisionType.Float; + + if( dataCollector.IsTemplate ) + return dataCollector.TemplateDataCollectorInstance.GetScreenPosForValue( precision, customVertexPosition, outputId ); + + + string value = GenerateVertexScreenPositionForValue( customVertexPosition, outputId, ref dataCollector, uniqueId, precision ); + string screenPosVarName = "screenPosition" + outputId; + dataCollector.AddToInput( uniqueId, screenPosVarName, WirePortDataType.FLOAT4, precision ); + dataCollector.AddToVertexLocalVariables( uniqueId, Constants.VertexShaderOutputStr + "." + screenPosVarName + " = " + value + ";" ); + + string screenPosVarNameOnFrag = ScreenPositionStr + outputId; + string globalResult = Constants.InputVarStr + "." + screenPosVarName; + dataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT4, screenPosVarNameOnFrag, globalResult ); + return screenPosVarNameOnFrag; + + } + + static public string GenerateScreenPosition( ref MasterNodeDataCollector dataCollector, int uniqueId, PrecisionType precision, bool addInput = true ) + { + // overriding precision + precision = PrecisionType.Float; + + if( dataCollector.UsingCustomScreenPos && dataCollector.IsFragmentCategory ) + { + string value = GenerateVertexScreenPosition( ref dataCollector, uniqueId, precision ); + dataCollector.AddToInput( uniqueId, "screenPosition", WirePortDataType.FLOAT4, precision ); + dataCollector.AddToVertexLocalVariables( uniqueId, Constants.VertexShaderOutputStr + ".screenPosition = " + value + ";" ); + + string globalResult = Constants.InputVarStr + ".screenPosition"; + dataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT4, ScreenPositionStr, globalResult ); + return ScreenPositionStr; + } + else + { + if( !dataCollector.IsFragmentCategory ) + return GenerateVertexScreenPosition( ref dataCollector, uniqueId, precision ); + + if( dataCollector.IsTemplate ) + return dataCollector.TemplateDataCollectorInstance.GetScreenPos( precision ); + } + + + if( addInput ) + dataCollector.AddToInput( uniqueId, SurfaceInputs.SCREEN_POS, precision ); + + string result = Constants.InputVarStr + ".screenPos"; + dataCollector.AddLocalVariable( uniqueId, string.Format( "float4 {0} = float4( {1}.xyz , {1}.w + 0.00000000001 );", ScreenPositionStr, result ) ); + + return ScreenPositionStr; + } + + // GRAB SCREEN POSITION + static public string GenerateGrabScreenPosition( ref MasterNodeDataCollector dataCollector, int uniqueId, PrecisionType precision, bool addInput = true, string customScreenPos = null ) + { + // overriding precision + precision = PrecisionType.Float; + + string screenPos = string.Empty; + if( string.IsNullOrEmpty( customScreenPos ) ) + screenPos = GenerateScreenPosition( ref dataCollector, uniqueId, precision, addInput ); + else + screenPos = customScreenPos; + + string computeBody = string.Empty; + IOUtils.AddFunctionHeader( ref computeBody, GrabFunctionHeader ); + foreach( string line in GrabFunctionBody ) + IOUtils.AddFunctionLine( ref computeBody, line ); + IOUtils.CloseFunctionBody( ref computeBody ); + string functionResult = dataCollector.AddFunctions( GrabFunctionCall, computeBody, screenPos ); + + dataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT4, GrabScreenPositionStr, functionResult ); + return GrabScreenPositionStr; + } + + // GRAB SCREEN POSITION NORMALIZED + static public string GenerateGrabScreenPositionNormalized( ref MasterNodeDataCollector dataCollector, int uniqueId, PrecisionType precision, bool addInput = true, string customScreenPos = null ) + { + string stringPosVar = GenerateGrabScreenPosition( ref dataCollector, uniqueId, precision, addInput, customScreenPos ); + + dataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT4, GrabScreenPositionNormalizedStr, string.Format( NormalizedScreenPosFormat, stringPosVar ) ); + return GrabScreenPositionNormalizedStr; + } + + // SCREEN POSITION ON VERT + static public string GenerateVertexScreenPositionForValue( string customVertexPosition, string outputId, ref MasterNodeDataCollector dataCollector, int uniqueId, PrecisionType precision ) + { + // overriding precision + precision = PrecisionType.Float; + + if( dataCollector.IsTemplate ) + return dataCollector.TemplateDataCollectorInstance.GetScreenPosForValue( precision, customVertexPosition, outputId ); + + string screenPosVarName = ScreenPositionStr + outputId; + string value = string.Format( "ComputeScreenPos( UnityObjectToClipPos( {0} ) )", customVertexPosition ); + dataCollector.AddToVertexLocalVariables( uniqueId, precision, WirePortDataType.FLOAT4, screenPosVarName, value ); + return screenPosVarName; + } + + static public string GenerateVertexScreenPosition( ref MasterNodeDataCollector dataCollector, int uniqueId, PrecisionType precision ) + { + // overriding precision + precision = PrecisionType.Float; + + if( dataCollector.IsTemplate ) + return dataCollector.TemplateDataCollectorInstance.GetScreenPos( precision ); + + string value = string.Format( "ComputeScreenPos( UnityObjectToClipPos( {0}.vertex ) )", Constants.VertexShaderInputStr ); + dataCollector.AddToVertexLocalVariables( uniqueId, precision, WirePortDataType.FLOAT4, ScreenPositionStr, value ); + return ScreenPositionStr; + } + + // VERTEX POSITION + static public string GenerateVertexPosition( ref MasterNodeDataCollector dataCollector, int uniqueId, WirePortDataType size ) + { + // overriding precision + var precision = PrecisionType.Float; + + if( dataCollector.IsTemplate ) + return dataCollector.TemplateDataCollectorInstance.GetVertexPosition( size, precision ); + + string value = Constants.VertexShaderInputStr + ".vertex"; + if( size == WirePortDataType.FLOAT3 ) + value += ".xyz"; + + if( dataCollector.PortCategory == MasterNodePortCategory.Fragment || dataCollector.PortCategory == MasterNodePortCategory.Debug ) + { + dataCollector.AddToInput( uniqueId, SurfaceInputs.WORLD_POS ); + dataCollector.AddToIncludes( uniqueId, Constants.UnityShaderVariables ); + + value = "mul( unity_WorldToObject, float4( " + Constants.InputVarStr + ".worldPos , 1 ) )"; + } + string varName = VertexPosition4Str; + if( size == WirePortDataType.FLOAT3 ) + varName = VertexPosition3Str; + + dataCollector.AddLocalVariable( uniqueId, precision, size, varName, value ); + return varName; + } + + // VERTEX NORMAL + static public string GenerateVertexNormal( ref MasterNodeDataCollector dataCollector, int uniqueId, PrecisionType precision ) + { + if( dataCollector.MasterNodeCategory == AvailableShaderTypes.Template ) + { + return dataCollector.TemplateDataCollectorInstance.GetVertexNormal( UIUtils.CurrentWindow.CurrentGraph.CurrentPrecision ); + } + + string value = Constants.VertexShaderInputStr + ".normal.xyz"; + if( dataCollector.PortCategory == MasterNodePortCategory.Fragment || dataCollector.PortCategory == MasterNodePortCategory.Debug ) + { + GenerateWorldNormal( ref dataCollector, uniqueId ); + dataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT3, VertexNormalStr, "mul( unity_WorldToObject, float4( " + WorldNormalStr + ", 0 ) )" ); + //dataCollector.AddToLocalVariables( uniqueId, precision, WirePortDataType.FLOAT3, VertexNormalStr, "mul( unity_WorldToObject, float4( " + WorldNormalStr + ", 0 ) )" ); + } + else + { + dataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT3, VertexNormalStr, value ); + } + return VertexNormalStr; + } + + // VERTEX TANGENT + static public string GenerateVertexTangent( ref MasterNodeDataCollector dataCollector, int uniqueId, PrecisionType precision, WirePortDataType size ) + { + if( dataCollector.MasterNodeCategory == AvailableShaderTypes.Template ) + { + return dataCollector.TemplateDataCollectorInstance.GetVertexTangent( size,UIUtils.CurrentWindow.CurrentGraph.CurrentPrecision ); + } + + if( dataCollector.PortCategory == MasterNodePortCategory.Fragment || dataCollector.PortCategory == MasterNodePortCategory.Debug ) + { + GenerateWorldTangent( ref dataCollector, uniqueId ); + dataCollector.AddToLocalVariables( uniqueId, precision, WirePortDataType.FLOAT4, VertexTangentStr, "mul( unity_WorldToObject, float4( " + WorldTangentStr + ", 0 ) )" ); + } + else + { + string value = Constants.VertexShaderInputStr + ".tangent"; + dataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT4, VertexTangentStr, value ); + } + + return ( size == WirePortDataType.FLOAT4 ) ? VertexTangentStr : VertexTangentStr + ".xyz"; + } + + // VERTEX TANGENT SIGN + static public string GenerateVertexTangentSign( ref MasterNodeDataCollector dataCollector, int uniqueId, PrecisionType precision ) + { + if( dataCollector.MasterNodeCategory == AvailableShaderTypes.Template ) + { + return dataCollector.TemplateDataCollectorInstance.GetTangentSign( UIUtils.CurrentWindow.CurrentGraph.CurrentPrecision ); + } + + string value = Constants.VertexShaderInputStr + ".tangent.w"; + if( dataCollector.IsFragmentCategory ) + { + dataCollector.AddToInput( uniqueId, VertexTangentSignStr, WirePortDataType.FLOAT, PrecisionType.Half ); + dataCollector.AddToVertexLocalVariables( uniqueId, Constants.VertexShaderOutputStr + "." + VertexTangentSignStr + " = " + Constants.VertexShaderInputStr + ".tangent.w;" ); + return Constants.InputVarStr + "." + VertexTangentSignStr; + } + else + { + dataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT, VertexTangentSignStr, value ); + } + return VertexTangentSignStr; + } + + // VERTEX BITANGENT + static public string GenerateVertexBitangent( ref MasterNodeDataCollector dataCollector, int uniqueId, PrecisionType precision ) + { + if( dataCollector.MasterNodeCategory == AvailableShaderTypes.Template ) + { + return dataCollector.TemplateDataCollectorInstance.GetVertexBitangent( UIUtils.CurrentWindow.CurrentGraph.CurrentPrecision ); + } + + if( dataCollector.PortCategory == MasterNodePortCategory.Fragment || dataCollector.PortCategory == MasterNodePortCategory.Debug ) + { + GenerateWorldBitangent( ref dataCollector, uniqueId ); + dataCollector.AddToLocalVariables( uniqueId, precision, WirePortDataType.FLOAT3, VertexBitangentStr, "mul( unity_WorldToObject, float4( " + WorldBitangentStr + ", 0 ) )" ); + } + else + { + GenerateVertexNormal( ref dataCollector, uniqueId, precision ); + GenerateVertexTangent( ref dataCollector, uniqueId, precision, WirePortDataType.FLOAT3 ); + dataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT3, VertexBitangentStr, "cross( " + VertexNormalStr + ", " + VertexTangentStr + ") * " + Constants.VertexShaderInputStr + ".tangent.w * unity_WorldTransformParams.w" ); + } + return VertexBitangentStr; + } + + // VERTEX POSITION ON FRAG + static public string GenerateVertexPositionOnFrag( ref MasterNodeDataCollector dataCollector, int uniqueId, PrecisionType precision ) + { + dataCollector.AddToInput( uniqueId, SurfaceInputs.WORLD_POS ); + dataCollector.AddToIncludes( uniqueId, Constants.UnityShaderVariables ); + + string value = "mul( unity_WorldToObject, float4( " + Constants.InputVarStr + ".worldPos , 1 ) )"; + + dataCollector.AddToLocalVariables( uniqueId, precision, WirePortDataType.FLOAT4, VertexPosition4Str, value ); + return VertexPosition4Str; + } + + // CLIP POSITION ON FRAG + static public string GenerateClipPositionOnFrag( ref MasterNodeDataCollector dataCollector, int uniqueId, PrecisionType precision ) + { + if( dataCollector.IsTemplate ) + return dataCollector.TemplateDataCollectorInstance.GetClipPos(); + + string vertexName = GenerateVertexPositionOnFrag( ref dataCollector, uniqueId, precision ); + string value = string.Format( "ComputeScreenPos( UnityObjectToClipPos( {0} ) )", vertexName ); + dataCollector.AddToLocalVariables( uniqueId, precision, WirePortDataType.FLOAT4, ClipPositionStr, value ); + return ClipPositionStr; + } + + // VIEW DIRECTION + static public string GenerateViewDirection( ref MasterNodeDataCollector dataCollector, int uniqueId, ViewSpace space = ViewSpace.World ) + { + PrecisionType precision = UIUtils.CurrentWindow.CurrentGraph.CurrentPrecision; + if( dataCollector.IsTemplate ) + return ( space == ViewSpace.Tangent ) ? dataCollector.TemplateDataCollectorInstance.GetTangentViewDir( precision ) : dataCollector.TemplateDataCollectorInstance.GetViewDir(); + + string worldPos = GenerateWorldPosition( ref dataCollector, uniqueId ); + string safeNormalizeInstruction = string.Empty; + if( dataCollector.SafeNormalizeViewDir ) + { + if( dataCollector.IsTemplate && dataCollector.IsSRP ) + { + safeNormalizeInstruction = "SafeNormalize"; + } + else + { + if( dataCollector.IsTemplate ) + dataCollector.AddToIncludes( -1, Constants.UnityBRDFLib ); + safeNormalizeInstruction = "Unity_SafeNormalize"; + } + } + dataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT3, WorldViewDirectionStr, ( dataCollector.SafeNormalizeViewDir ? safeNormalizeInstruction : "normalize" ) + "( UnityWorldSpaceViewDir( " + worldPos + " ) )" ); + + if( space == ViewSpace.Tangent ) + { + string worldToTangent = GenerateWorldToTangentMatrix( ref dataCollector, uniqueId, precision ); + dataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT3, TangentViewDirectionStr, "mul( " + worldToTangent + ", " + WorldViewDirectionStr + " )" ); + return TangentViewDirectionStr; + } + else + { + return WorldViewDirectionStr; + } + } + + // VIEW POS + static public string GenerateViewPositionOnFrag( ref MasterNodeDataCollector dataCollector, int uniqueId, PrecisionType precision ) + { + // overriding precision + precision = PrecisionType.Float; + + if( dataCollector.IsTemplate ) + UnityEngine.Debug.LogWarning( "View Pos not implemented on Templates" ); + + string vertexName = GenerateVertexPositionOnFrag( ref dataCollector, uniqueId, precision ); + string value = string.Format( "UnityObjectToViewPos( {0} )", vertexName ); + dataCollector.AddToLocalVariables( uniqueId, precision, WirePortDataType.FLOAT3, ViewPositionStr, value ); + return ViewPositionStr; + } + + // SCREEN DEPTH + static public string GenerateScreenDepthOnFrag( ref MasterNodeDataCollector dataCollector, int uniqueId, PrecisionType precision ) + { + // overriding precision + precision = PrecisionType.Float; + + if( dataCollector.IsTemplate ) + UnityEngine.Debug.LogWarning( "Screen Depth not implemented on Templates" ); + + string viewPos = GenerateViewPositionOnFrag( ref dataCollector, uniqueId, precision ); + string value = string.Format( "-{0}.z", viewPos ); + dataCollector.AddToLocalVariables( uniqueId, precision, WirePortDataType.FLOAT, ScreenDepthStr, value ); + return ScreenDepthStr; + } + + // LIGHT DIRECTION WORLD + static public string GenerateWorldLightDirection( ref MasterNodeDataCollector dataCollector, int uniqueId, PrecisionType precision ) + { + dataCollector.AddToIncludes( uniqueId, Constants.UnityCgLibFuncs ); + string worldPos = GeneratorUtils.GenerateWorldPosition( ref dataCollector, uniqueId ); + dataCollector.AddLocalVariable( uniqueId, "#if defined(LIGHTMAP_ON) && UNITY_VERSION < 560 //aseld" ); + dataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT3, WorldLightDirStr, "0" ); + dataCollector.AddLocalVariable( uniqueId, "#else //aseld" ); + dataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT3, WorldLightDirStr, ( dataCollector.SafeNormalizeLightDir ? "Unity_SafeNormalize" : "normalize" ) + "( UnityWorldSpaceLightDir( " + worldPos + " ) )" ); + dataCollector.AddLocalVariable( uniqueId, "#endif //aseld" ); + return WorldLightDirStr; + } + + private static readonly string[] SafeNormalizeBuiltin = + { + "inline float{0} ASESafeNormalize(float{0} inVec)\n", + "{\n", + "\tfloat dp3 = max( 0.001f , dot( inVec , inVec ) );\n", + "\treturn inVec* rsqrt( dp3);\n", + "}\n" + }; + + private static readonly string[] SafeNormalizeSRP = + { + "real{0} ASESafeNormalize(float{0} inVec)\n", + "{\n", + "\treal dp3 = max(FLT_MIN, dot(inVec, inVec));\n", + "\treturn inVec* rsqrt( dp3);\n", + "}\n", + }; + + static public string NormalizeValue( ref MasterNodeDataCollector dataCollector , bool safeNormalize , WirePortDataType dataType, string value ) + { + string normalizeInstruction = string.Empty; + if( safeNormalize ) + { + string[] finalFunction = null; + string[] funcVersion = dataCollector.IsSRP ? SafeNormalizeSRP : SafeNormalizeBuiltin; + + finalFunction = new string[ funcVersion.Length ]; + + switch( dataType ) + { + case WirePortDataType.FLOAT: + finalFunction[0] = string.Format( funcVersion[ 0 ] , string.Empty ); + break; + case WirePortDataType.FLOAT2: + finalFunction[ 0 ] = string.Format( funcVersion[ 0 ] , "2" ); + break; + case WirePortDataType.FLOAT3: + finalFunction[ 0 ] = string.Format( funcVersion[ 0 ] , "3" ); + break; + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: + finalFunction[ 0 ] = string.Format( funcVersion[ 0 ] , "4" ); + break; + default: + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + case WirePortDataType.INT: + case WirePortDataType.OBJECT: + case WirePortDataType.SAMPLER1D: + case WirePortDataType.SAMPLER2D: + case WirePortDataType.SAMPLER3D: + case WirePortDataType.SAMPLERCUBE: + case WirePortDataType.UINT: + case WirePortDataType.SAMPLER2DARRAY: + case WirePortDataType.SAMPLERSTATE:return value; + } + + for( int i = 1 ; i < funcVersion.Length ; i++ ) + { + finalFunction[ i ] = funcVersion[ i ]; + } + dataCollector.AddFunction( finalFunction[ 0 ] , finalFunction , false ); + normalizeInstruction = "ASESafeNormalize"; + } + else + { + normalizeInstruction = "normalize"; + } + + return normalizeInstruction = normalizeInstruction + "( " + value + " )"; + + } + // LIGHT DIRECTION Object + static public string GenerateObjectLightDirection( ref MasterNodeDataCollector dataCollector, int uniqueId, PrecisionType precision, string vertexPos ) + { + dataCollector.AddToIncludes( uniqueId, Constants.UnityCgLibFuncs ); + dataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT3, ObjectLightDirStr, "normalize( ObjSpaceLightDir( " + vertexPos + " ) )" ); + return ObjectLightDirStr; + } + + // UNPACK NORMALS + public static string GenerateUnpackNormalStr( ref MasterNodeDataCollector dataCollector, PrecisionType precision, int uniqueId, string outputId, string src, bool applyScale, string scale ) + { + string funcName; + if( dataCollector.IsTemplate && dataCollector.IsSRP ) + { +#if UNITY_2018_3_OR_NEWER + if( ASEPackageManagerHelper.CurrentHDVersion > ASESRPVersions.ASE_SRP_7_2_1 ) + { + if( applyScale ) + { + dataCollector.AddLocalVariable( uniqueId, precision, WirePortDataType.FLOAT3, "unpack" + outputId, "UnpackNormalScale( " + src + ", " + scale + " )" ); + dataCollector.AddLocalVariable( uniqueId, "unpack" + outputId + ".z = lerp( 1, unpack" + outputId + ".z, saturate(" + scale + ") );" ); + funcName = "unpack" + outputId; + } + else + { + funcName = "UnpackNormalScale( " + src + ", " + scale + " )"; + } + } + else +#endif + { + if( dataCollector.TemplateDataCollectorInstance.IsHDRP ) + funcName = "UnpackNormalmapRGorAG( " + src + ", " + scale + " )"; + else + funcName = "UnpackNormalScale( " + src + ", " + scale + " )"; + } + } + else + { + funcName = applyScale ? "UnpackScaleNormal( " + src + ", " + scale + " )" : "UnpackNormal( " + src + " )"; + } + return funcName; + } + + //MATRIX INVERSE + // 3x3 + public static string Inverse3x3Header = "Inverse3x3( {0} )"; + public static string[] Inverse3x3Function = + { + "{0}3x3 Inverse3x3({0}3x3 input)\n", + "{\n", + "\t{0}3 a = input._11_21_31;\n", + "\t{0}3 b = input._12_22_32;\n", + "\t{0}3 c = input._13_23_33;\n", + "\treturn {0}3x3(cross(b,c), cross(c,a), cross(a,b)) * (1.0 / dot(a,cross(b,c)));\n", + "}\n" + }; + + public static bool[] Inverse3x3FunctionFlags = + { + true, + false, + true, + true, + true, + true, + false + }; + + public static void Add3x3InverseFunction( ref MasterNodeDataCollector dataCollector, string precisionString ) + { + if( !dataCollector.HasFunction( Inverse3x3Header ) ) + { + //Hack to be used util indent is properly used + int currIndent = UIUtils.ShaderIndentLevel; + if( dataCollector.IsTemplate ) + { + UIUtils.ShaderIndentLevel = 0; + } + else + { + UIUtils.ShaderIndentLevel = 1; + UIUtils.ShaderIndentLevel++; + } + string finalFunction = string.Empty; + for( int i = 0; i < Inverse3x3Function.Length; i++ ) + { + finalFunction += UIUtils.ShaderIndentTabs + ( Inverse3x3FunctionFlags[ i ] ? string.Format( Inverse3x3Function[ i ], precisionString ) : Inverse3x3Function[ i ] ); + } + + + UIUtils.ShaderIndentLevel = currIndent; + + dataCollector.AddFunction( Inverse3x3Header, finalFunction ); + } + } + + public static string GenerateValueInVertex( ref MasterNodeDataCollector dataCollector, int uniqueId, WirePortDataType dataType, PrecisionType currentPrecisionType, string dataValue, string dataName, bool createInterpolator ) + { + if( !dataCollector.IsFragmentCategory ) + return dataValue; + + //TEMPLATES + if( dataCollector.IsTemplate ) + { + if( createInterpolator && dataCollector.TemplateDataCollectorInstance.HasCustomInterpolatedData( dataName ) ) + return dataName; + + MasterNodePortCategory category = dataCollector.PortCategory; + dataCollector.PortCategory = MasterNodePortCategory.Vertex; + + dataCollector.PortCategory = category; + + if( createInterpolator ) + { + dataCollector.TemplateDataCollectorInstance.RegisterCustomInterpolatedData( dataName, dataType, currentPrecisionType, dataValue ); + } + else + { + dataCollector.AddToVertexLocalVariables( -1, currentPrecisionType, dataType, dataName, dataValue ); + } + + return dataName; + } + + //SURFACE + { + if( dataCollector.TesselationActive ) + { + UIUtils.ShowMessage( "Unable to use Vertex to Frag when Tessellation is active" ); + switch( dataType ) + { + case WirePortDataType.FLOAT2: + { + return "(0).xx"; + } + case WirePortDataType.FLOAT3: + { + return "(0).xxx"; + } + case WirePortDataType.FLOAT4: + case WirePortDataType.COLOR: + { + return "(0).xxxx"; + } + } + return "0"; + } + + if( createInterpolator ) + dataCollector.AddToInput( uniqueId, dataName, dataType, currentPrecisionType ); + + MasterNodePortCategory portCategory = dataCollector.PortCategory; + dataCollector.PortCategory = MasterNodePortCategory.Vertex; + if( createInterpolator ) + { + dataCollector.AddLocalVariable( uniqueId, Constants.VertexShaderOutputStr + "." + dataName, dataValue + ";" ); + } + else + { + dataCollector.AddLocalVariable( uniqueId, currentPrecisionType, dataType, dataName, dataValue ); + } + dataCollector.PortCategory = portCategory; + return createInterpolator ? Constants.InputVarStr + "." + dataName : dataName; + } + } + + public static void AddCustomStandardSamplingMacros( ref MasterNodeDataCollector dataCollector, TextureType type, MipType mip ) + { + AddCustomStandardSamplingMacros( ref dataCollector, Constants.TextureToWire[ type ], mip ); + } + + public static void AddCustomStandardSamplingMacros( ref MasterNodeDataCollector dataCollector, WirePortDataType type, MipType mip ) + { + MacrosMask result = MacrosMask.NONE; + switch( mip ) + { + default: + case MipType.Auto: + result |= MacrosMask.AUTO; + break; + case MipType.MipLevel: + result |= MacrosMask.LOD; + break; + case MipType.MipBias: + result |= MacrosMask.BIAS; + break; + case MipType.Derivative: + result |= MacrosMask.GRAD; + break; + } + + switch( type ) + { + default: + case WirePortDataType.SAMPLER2D: + dataCollector.Using2DMacrosMask |= result; + break; + case WirePortDataType.SAMPLER3D: + dataCollector.Using3DMacrosMask |= result; + break; + case WirePortDataType.SAMPLERCUBE: + dataCollector.UsingCUBEMacrosMask |= result; + break; + case WirePortDataType.SAMPLER2DARRAY: + dataCollector.Using2DArrayMacrosMask |= result; + break; + } + } + + public static void AddCustom3DSRPMacros( ref MasterNodeDataCollector dataCollector ) + { + // add just once + if( dataCollector.UsingExtra3DSRPMacros ) + return; + + dataCollector.UsingExtra3DSRPMacros = true; + for( int i = 0; i < Constants.CustomSRPSamplingMacros.Length; i++ ) + dataCollector.AddToDirectives( Constants.CustomSRPSamplingMacros[ i ] ); + } + + public static void AddCustomArraySamplingMacros( ref MasterNodeDataCollector dataCollector ) + { + // add just once + if( dataCollector.UsingArrayDerivatives ) + return; + + dataCollector.UsingArrayDerivatives = true; + for( int i = 0; i < Constants.CustomArraySamplingMacros.Length; i++ ) + dataCollector.AddToDirectives( Constants.CustomArraySamplingMacros[ i ] ); + } + + /*public static void AddCustomASEMacros( ref MasterNodeDataCollector dataCollector ) + { + string varPrefix = dataCollector.IsSRP ? varPrefix = "TEXTURE" : "UNITY_DECLARE_TEX"; + + if( dataCollector.IsSRP ) + { + for( int i = 0; i < Constants.CustomASESRPArgsMacros.Length; i++ ) + { + dataCollector.AddToDirectives( Constants.CustomASESRPArgsMacros[ i ] ); + } + + for( int i = 0; i < Constants.CustomSRPSamplingMacros.Length; i++ ) + { + dataCollector.AddToDirectives( Constants.CustomSRPSamplingMacros[ i ] ); + } + } + else + { + + for( int i = 0; i < Constants.CustomASEStandardArgsMacros.Length; i++ ) + { + dataCollector.AddToDirectives( Constants.CustomASEStandardArgsMacros[ i ] ); + } + + for( int i = 0; i < Constants.CustomStandardSamplingMacros.Length; i++ ) + { + dataCollector.AddToDirectives( Constants.CustomStandardSamplingMacros[ i ] ); + } + } + + for( int i = 0; i < Constants.CustomASEDeclararionMacros.Length; i++ ) + { + string value = string.Format( Constants.CustomASEDeclararionMacros[ i ], varPrefix ); + dataCollector.AddToDirectives( value ); + } + + string samplePrefix = string.Empty; + string samplerArgs = string.Empty; + string samplerDecl = string.Empty; + + if( dataCollector.IsSRP ) + { + samplePrefix = "SAMPLE_TEXTURE"; + samplerArgs = "samplerName,"; + + for( int i = 0; i < Constants.CustomASESamplingMacros.Length; i++ ) + { + string value = string.Format( Constants.CustomASESamplingMacros[ i ], samplerArgs, samplePrefix, samplerDecl ); + dataCollector.AddToDirectives( value ); + } + } + else + { + samplePrefix = "UNITY_SAMPLE_TEX"; + samplerArgs = "samplerName,"; + samplerDecl = "_SAMPLER"; + dataCollector.AddToDirectives( Constants.CustomASEStandarSamplingMacrosHelper[ 0 ] ); + for( int i = 0; i < Constants.CustomASESamplingMacros.Length; i++ ) + { + string value = string.Format( Constants.CustomASESamplingMacros[ i ], samplerArgs, samplePrefix, samplerDecl ); + dataCollector.AddToDirectives( value ); + } + dataCollector.AddToDirectives( Constants.CustomASEStandarSamplingMacrosHelper[ 1 ] ); + samplerArgs = string.Empty; + samplerDecl = string.Empty; + for( int i = 0; i < Constants.CustomASESamplingMacros.Length; i++ ) + { + string value = string.Format( Constants.CustomASESamplingMacros[ i ], samplerArgs, samplePrefix, samplerDecl ); + dataCollector.AddToDirectives( value ); + } + dataCollector.AddToDirectives( Constants.CustomASEStandarSamplingMacrosHelper[ 2 ] ); + } + }*/ + + public static void RegisterUnity2019MatrixDefines( ref MasterNodeDataCollector dataCollector ) + { +#if UNITY_2019_1_OR_NEWER + if( dataCollector.IsSRP && dataCollector.TemplateDataCollectorInstance.IsHDRP && ASEPackageManagerHelper.CurrentHDVersion >= ASESRPVersions.ASE_SRP_5_13_0 ) + { + //dataCollector.AddToDefines( -1, "unity_CameraProjection UNITY_MATRIX_P" ); + //dataCollector.AddToDefines( -1, "unity_CameraInvProjection UNITY_MATRIX_I_P" ); + //dataCollector.AddToDefines( -1, "unity_WorldToCamera UNITY_MATRIX_V" ); + //dataCollector.AddToDefines( -1, "unity_CameraToWorld UNITY_MATRIX_I_V" ); + + dataCollector.AddToUniforms( -1, "float4x4 unity_CameraProjection;" ); + dataCollector.AddToUniforms( -1, "float4x4 unity_CameraInvProjection;" ); + dataCollector.AddToUniforms( -1, "float4x4 unity_WorldToCamera;" ); + dataCollector.AddToUniforms( -1, "float4x4 unity_CameraToWorld;" ); + } +#endif + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/GeneratorUtils.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/GeneratorUtils.cs.meta new file mode 100644 index 0000000..190ac10 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/GeneratorUtils.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7ab31d77d200c7a4ca43f4bf159de6b3 +timeCreated: 1490798546 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/GenericMessage.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/GenericMessage.cs new file mode 100644 index 0000000..3a699c6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/GenericMessage.cs @@ -0,0 +1,117 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEditor; +using UnityEngine; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + public enum MessageSeverity + { + Normal, + Warning, + Error + } + public class GenericMessageData + { + public string message; + public MessageSeverity severity; + public bool console; + public GenericMessageData( string msg, MessageSeverity svrty, bool csle ) + { + message = msg; + severity = svrty; + console = csle; + } + } + + class GenericMessageUI + { + public delegate void OnMessageDisplay( string message, MessageSeverity severity, bool console ); + public event OnMessageDisplay OnMessageDisplayEvent; + + private const double MESSAGE_TIME = 2; + private double m_currentMessageStartTime; + private Queue m_messageQueue; + private bool m_displayingMessage; + + public GenericMessageUI() + { + m_messageQueue = new Queue(); + m_displayingMessage = false; + m_currentMessageStartTime = EditorApplication.timeSinceStartup; + } + + public void Destroy() + { + m_messageQueue.Clear(); + OnMessageDisplayEvent = null; + } + + public void AddToQueue( string message, MessageSeverity severity, bool console ) + { + m_messageQueue.Enqueue( new GenericMessageData( message, severity, console ) ); + } + + public void Log( string message ) + { + m_messageQueue.Enqueue( new GenericMessageData( message, MessageSeverity.Normal, true ) ); + Debug.Log( message ); + } + + public void LogError( string message ) + { + m_messageQueue.Enqueue( new GenericMessageData( message, MessageSeverity.Error, true ) ); + Debug.LogError( message ); + } + + public void LogWarning( string message ) + { + m_messageQueue.Enqueue( new GenericMessageData( message, MessageSeverity.Warning, true ) ); + Debug.LogWarning( message ); + } + + public void CheckForMessages() + { + if ( m_displayingMessage ) + { + double timeLeft = EditorApplication.timeSinceStartup - m_currentMessageStartTime; + if ( timeLeft > MESSAGE_TIME ) + { + m_displayingMessage = false; + } + } + + if ( !m_displayingMessage ) + { + if ( m_messageQueue.Count > 0 ) + { + m_displayingMessage = true; + GenericMessageData data = m_messageQueue.Dequeue(); + m_currentMessageStartTime = EditorApplication.timeSinceStartup; + + if ( OnMessageDisplayEvent != null ) + OnMessageDisplayEvent( data.message, data.severity, data.console ); + } + } + } + + public void CleanUpMessageStack() + { + m_displayingMessage = false; + m_messageQueue.Clear(); + } + + public void StartMessageCounter() + { + m_displayingMessage = true; + m_currentMessageStartTime = EditorApplication.timeSinceStartup; + } + + public bool DisplayingMessage + { + get { return ( m_displayingMessage || m_messageQueue.Count > 0 ); } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/GenericMessage.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/GenericMessage.cs.meta new file mode 100644 index 0000000..1385370 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/GenericMessage.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 87cfef50a69ad24479fb8b472dac6d6e +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/IOUtils.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/IOUtils.cs new file mode 100644 index 0000000..3038550 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/IOUtils.cs @@ -0,0 +1,843 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.IO; +using System.Security.Cryptography; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using System.Threading; +using UnityEditor.VersionControl; + +namespace AmplifyShaderEditor +{ + public enum ShaderLoadResult + { + LOADED, + TEMPLATE_LOADED, + FILE_NOT_FOUND, + ASE_INFO_NOT_FOUND, + UNITY_NATIVE_PATHS + } + + public class Worker + { + public static readonly object locker = new object(); + public void DoWork() + { + while ( IOUtils.ActiveThread ) + { + if ( IOUtils.SaveInThreadFlag ) + { + IOUtils.SaveInThreadFlag = false; + lock ( locker ) + { + IOUtils.SaveInThreadShaderBody = IOUtils.ShaderCopywriteMessage + IOUtils.SaveInThreadShaderBody; + // Add checksum + string checksum = IOUtils.CreateChecksum( IOUtils.SaveInThreadShaderBody ); + IOUtils.SaveInThreadShaderBody += IOUtils.CHECKSUM + IOUtils.VALUE_SEPARATOR + checksum; + + // Write to disk + StreamWriter fileWriter = new StreamWriter( IOUtils.SaveInThreadPathName ); + try + { + fileWriter.Write( IOUtils.SaveInThreadShaderBody ); + Debug.Log( "Saving complete" ); + } + catch ( Exception e ) + { + Debug.LogException( e ); + } + finally + { + fileWriter.Close(); + } + } + } + } + Debug.Log( "Thread closed" ); + } + } + + public static class IOUtils + { + public delegate void OnShaderAction( Shader shader, bool isTemplate, string type ); + public static OnShaderAction OnShaderSavedEvent; + public static OnShaderAction OnShaderTypeChangedEvent; + + public static readonly string ShaderCopywriteMessage = "// Made with Amplify Shader Editor\n// Available at the Unity Asset Store - http://u3d.as/y3X \n"; + public static readonly string GrabPassEmpty = "\t\tGrabPass{ }\n"; + public static readonly string GrabPassBegin = "\t\tGrabPass{ \""; + public static readonly string GrabPassEnd = "\" }\n"; + public static readonly string PropertiesBegin = "\tProperties\n\t{\n"; + public static readonly string PropertiesEnd = "\t}\n"; + public static readonly string PropertiesElement = "\t\t{0}\n"; + public static readonly string PropertiesElementsRaw = "{0}\n"; + + public static readonly string PragmaTargetHeader = "\t\t#pragma target {0}\n"; + public static readonly string InstancedPropertiesHeader = "multi_compile_instancing"; + public static readonly string VirtualTexturePragmaHeader = "multi_compile _ _VT_SINGLE_MODE"; + + public static readonly string InstancedPropertiesBegin = "UNITY_INSTANCING_CBUFFER_START({0})"; + public static readonly string InstancedPropertiesEnd = "UNITY_INSTANCING_CBUFFER_END"; + public static readonly string InstancedPropertiesElement = "UNITY_DEFINE_INSTANCED_PROP({0}, {1})"; + public static readonly string InstancedPropertiesData = "UNITY_ACCESS_INSTANCED_PROP({0})"; + + public static readonly string DotsInstancedPropertiesData = "\tUNITY_DOTS_INSTANCED_PROP({0}, {1})"; + public static readonly string DotsInstancedDefinesData = "#define {1} UNITY_ACCESS_DOTS_INSTANCED_PROP_FROM_MACRO({0} , Metadata_{1})"; + + public static readonly string LWSRPInstancedPropertiesBegin = "UNITY_INSTANCING_BUFFER_START({0})"; + public static readonly string LWSRPInstancedPropertiesEnd = "UNITY_INSTANCING_BUFFER_END({0})"; + public static readonly string LWSRPInstancedPropertiesElement = "UNITY_DEFINE_INSTANCED_PROP({0}, {1})"; + public static readonly string LWSRPInstancedPropertiesData = "UNITY_ACCESS_INSTANCED_PROP({0},{1})"; + + public static readonly string SRPCBufferPropertiesBegin = "CBUFFER_START( UnityPerMaterial )";//"CBUFFER_START({0})"; + public static readonly string SRPCBufferPropertiesEnd = "CBUFFER_END"; + + + public static readonly string InstancedPropertiesBeginTabs = "\t\t"+ InstancedPropertiesBegin + "\n"; + public static readonly string InstancedPropertiesEndTabs = "\t\t"+ InstancedPropertiesEnd + "\n"; + public static readonly string InstancedPropertiesElementTabs = "\t\t\t"+ InstancedPropertiesElement + "\n"; + + public static readonly string MetaBegin = "defaultTextures:"; + public static readonly string MetaEnd = "userData:"; + public static readonly string ShaderBodyBegin = "/*ASEBEGIN"; + public static readonly string ShaderBodyEnd = "ASEEND*/"; + //public static readonly float CurrentVersionFlt = 0.4f; + //public static readonly string CurrentVersionStr = "Version=" + CurrentVersionFlt; + + public static readonly string CHECKSUM = "//CHKSM"; + public static readonly string LAST_OPENED_OBJ_ID = "ASELASTOPENOBJID"; + + public static readonly string MAT_CLIPBOARD_ID = "ASEMATCLIPBRDID"; + public static readonly char FIELD_SEPARATOR = ';'; + public static readonly char VALUE_SEPARATOR = '='; + public static readonly char LINE_TERMINATOR = '\n'; + public static readonly char VECTOR_SEPARATOR = ','; + public static readonly char FLOAT_SEPARATOR = '.'; + public static readonly char CLIPBOARD_DATA_SEPARATOR = '|'; + public static readonly char MATRIX_DATA_SEPARATOR = '|'; + public readonly static string NO_TEXTURES = ""; + public static readonly string SaveShaderStr = "Please enter shader name to save"; + public static readonly string FloatifyStr = ".0"; + + // Node parameter names + public const string NodeParam = "Node"; + public const string NodePosition = "Position"; + public const string NodeId = "Id"; + public const string NodeType = "Type"; + public const string WireConnectionParam = "WireConnection"; + + public static readonly uint NodeTypeId = 1; + + public static readonly int InNodeId = 1; + public static readonly int InPortId = 2; + public static readonly int OutNodeId = 3; + public static readonly int OutPortId = 4; + + public readonly static string DefaultASEDirtyCheckName = "__dirty"; + public readonly static string DefaultASEDirtyCheckProperty = "[HideInInspector] " + DefaultASEDirtyCheckName + "( \"\", Int ) = 1"; + public readonly static string DefaultASEDirtyCheckUniform = "uniform int " + DefaultASEDirtyCheckName + " = 1;"; + + public readonly static string MaskClipValueName = "_Cutoff"; + public readonly static string MaskClipValueProperty = MaskClipValueName + "( \"{0}\", Float ) = {1}"; + public readonly static string MaskClipValueUniform = "uniform float " + MaskClipValueName + " = {0};"; + + public readonly static string ChromaticAberrationProperty = "_ChromaticAberration"; + + //public static readonly string ASEFolderGUID = "daca988099666ec40aaa2cde22bb4935"; + //public static string ASEResourcesPath = "/Plugins/EditorResources/"; + //public static string ASEFolderPath; + + //public static bool IsShaderFunctionWindow = false; + + + public static int DefaultASEDirtyCheckId; + + // this is to be used in combination with AssetDatabase.GetAssetPath, both of these include the Assets/ path so we need to remove from one of them + public static string dataPath; + + + public static string EditorResourcesGUID = "0932db7ec1402c2489679c4b72eab5eb"; + public static string GraphBgTextureGUID = "881c304491028ea48b5027ac6c62cf73"; + public static string GraphFgTextureGUID = "8c4a7fca2884fab419769ccc0355c0c1"; + public static string WireTextureGUID = "06e687f68dd96f0448c6d8217bbcf608"; + public static string MasterNodeOnTextureGUID = "26c64fcee91024a49980ea2ee9d1a2fb"; + public static string MasterNodeOffTextureGUID = "712aee08d999c16438e2d694f42428e8"; + public static string GPUInstancedOnTextureGUID = "4b0c2926cc71c5846ae2a29652d54fb6"; + public static string GPUInstancedOffTextureGUID = "486c7766baaf21b46afb63c1121ef03e"; + public static string MainSkinGUID = "57482289c346f104a8162a3a79aaff9d"; + + public static string UpdateOutdatedGUID = "cce638be049286c41bcbd0a26c356b18"; + public static string UpdateOFFGUID = "99d70ac09b4db9742b404c3f92d8564b"; + public static string UpdateUpToDatedGUID = "ce30b12fbb3223746bcfef9ea82effe3"; + public static string LiveOffGUID = "bb16faf366bcc6c4fbf0d7666b105354"; + public static string LiveOnGUID = "6a0ae1d7892333142aeb09585572202c"; + public static string LivePendingGUID = "e3182200efb67114eb5050f8955e1746"; + public static string CleanupOFFGUID = "f62c0c3a5ddcd844e905fb2632fdcb15"; + public static string CleanUpOnGUID = "615d853995cf2344d8641fd19cb09b5d"; + public static string TakeScreenshotOFFGUID = "7587de2e3bec8bf4d973109524ccc6b1"; + public static string TakeScreenshotONGUID = "7587de2e3bec8bf4d973109524ccc6b1"; + public static string ShareOFFGUID = "bc5bd469748466a459badfab23915cb0"; + public static string ShareONGUID = "bc5bd469748466a459badfab23915cb0"; + public static string OpenSourceCodeOFFGUID = "f7e8834b42791124095a8b7f2d4daac2"; + public static string OpenSourceCodeONGUID = "8b114792ff84f6546880c031eda42bc0"; + public static string FocusNodeGUID = "da673e6179c67d346abb220a6935e359"; + public static string FitViewGUID = "1def740f2314c6b4691529cadeee2e9c"; + public static string ShowInfoWindowGUID = "77af20044e9766840a6be568806dc22e"; + public static string ShowTipsWindowGUID = "066674048bbb1e64e8cdcc6c3b4abbeb"; + public static string ShowConsoleWindowGUID = "9a81d7df8e62c044a9d1cada0c8a2131"; + + + public static Dictionary NodeTypeReplacer = new Dictionary() + { + {"AmplifyShaderEditor.RotateAboutAxis", "AmplifyShaderEditor.RotateAboutAxisNode"}, + {"GlobalArrayNode", "AmplifyShaderEditor.GlobalArrayNode"}, + {"AmplifyShaderEditor.SimpleMaxOp", "AmplifyShaderEditor.SimpleMaxOpNode"}, + {"AmplifyShaderEditor.SimpleMinNode", "AmplifyShaderEditor.SimpleMinOpNode"}, + {"AmplifyShaderEditor.TFHCRemap", "AmplifyShaderEditor.TFHCRemapNode"}, + {"AmplifyShaderEditor.TFHCPixelateUV", "AmplifyShaderEditor.TFHCPixelate"}, + {"AmplifyShaderEditor.VirtualTexturePropertyNode", "AmplifyShaderEditor.VirtualTextureObject"} + }; + + private static readonly string AmplifyShaderEditorDefineSymbol = "AMPLIFY_SHADER_EDITOR"; + + ///////////////////////////////////////////////////////////////////////////// + // THREAD IO UTILS + public static bool SaveInThreadFlag = false; + public static string SaveInThreadShaderBody; + public static string SaveInThreadPathName; + public static Thread SaveInThreadMainThread; + public static bool ActiveThread = true; + private static bool UseSaveThread = false; + + private static bool Initialized = false; + + public static bool FunctionNodeChanged = false; + + public static List AllOpenedWindows = new List(); + + public static void StartSaveThread( string shaderBody, string pathName ) + { + if( Provider.enabled && Provider.isActive ) + { + Asset loadedAsset = Provider.GetAssetByPath( FileUtil.GetProjectRelativePath( pathName ) ); + if( loadedAsset != null ) + { + //Task statusTask = Provider.Status( loadedAsset ); + //statusTask.Wait(); + //if( Provider.CheckoutIsValid( statusTask.assetList[ 0 ] ) ) + { + Task checkoutTask = Provider.Checkout( loadedAsset, CheckoutMode.Both ); + checkoutTask.Wait(); + } + } + } + + if( UseSaveThread ) + { + if ( !SaveInThreadFlag ) + { + if ( SaveInThreadMainThread == null ) + { + Worker worker = new Worker(); + SaveInThreadMainThread = new Thread( worker.DoWork ); + SaveInThreadMainThread.Start(); + Debug.Log( "Thread created" ); + } + + SaveInThreadShaderBody = shaderBody; + SaveInThreadPathName = pathName; + SaveInThreadFlag = true; + } + } + else + { + SaveTextfileToDisk( shaderBody, pathName ); + } + } + + //////////////////////////////////////////////////////////////////////////// + public static void SetAmplifyDefineSymbolOnBuildTargetGroup( BuildTargetGroup targetGroup ) + { + string currData = PlayerSettings.GetScriptingDefineSymbolsForGroup( targetGroup ); + if ( !currData.Contains( AmplifyShaderEditorDefineSymbol ) ) + { + if ( string.IsNullOrEmpty( currData ) ) + { + PlayerSettings.SetScriptingDefineSymbolsForGroup( targetGroup, AmplifyShaderEditorDefineSymbol ); + } + else + { + if ( !currData[ currData.Length - 1 ].Equals( ';' ) ) + { + currData += ';'; + } + currData += AmplifyShaderEditorDefineSymbol; + PlayerSettings.SetScriptingDefineSymbolsForGroup( targetGroup, currData ); + } + } + } + + public static void RemoveAmplifyDefineSymbolOnBuildTargetGroup( BuildTargetGroup targetGroup ) + { + string currData = PlayerSettings.GetScriptingDefineSymbolsForGroup( targetGroup ); + if( currData.Contains( AmplifyShaderEditorDefineSymbol ) ) + { + currData = currData.Replace( AmplifyShaderEditorDefineSymbol + ";", "" ); + currData = currData.Replace( ";" + AmplifyShaderEditorDefineSymbol, "" ); + currData = currData.Replace( AmplifyShaderEditorDefineSymbol, "" ); + PlayerSettings.SetScriptingDefineSymbolsForGroup( targetGroup, currData ); + } + } + + public static void Init() + { + if ( !Initialized ) + { + Initialized = true; + if( EditorPrefs.GetBool( Preferences.PrefDefineSymbol, true ) ) + SetAmplifyDefineSymbolOnBuildTargetGroup( EditorUserBuildSettings.selectedBuildTargetGroup ); + //Array BuildTargetGroupValues = Enum.GetValues( typeof( BuildTargetGroup )); + //for ( int i = 0; i < BuildTargetGroupValues.Length; i++ ) + //{ + // if( i != 0 && i != 15 && i != 16 ) + // SetAmplifyDefineSymbolOnBuildTargetGroup( ( BuildTargetGroup ) BuildTargetGroupValues.GetValue( i ) ); + //} + + DefaultASEDirtyCheckId = Shader.PropertyToID( DefaultASEDirtyCheckName ); + dataPath = Application.dataPath.Remove( Application.dataPath.Length - 6 ); + + + //ASEFolderPath = AssetDatabase.GUIDToAssetPath( ASEFolderGUID ); + //ASEResourcesPath = ASEFolderPath + ASEResourcesPath; + } + } + + + public static void DumpTemplateManagers() + { + for( int i = 0; i < AllOpenedWindows.Count; i++ ) + { + if( AllOpenedWindows[ i ].TemplatesManagerInstance != null ) + { + Debug.Log( AllOpenedWindows[ i ].titleContent.text + ": " + AllOpenedWindows[ i ].TemplatesManagerInstance.GetInstanceID() ); + } + } + } + + public static TemplatesManager FirstValidTemplatesManager + { + get + { + for( int i = 0; i < AllOpenedWindows.Count; i++ ) + { + if( AllOpenedWindows[ i ].TemplatesManagerInstance != null ) + { + return AllOpenedWindows[ i ].TemplatesManagerInstance; + } + } + return null; + } + } + + public static void UpdateSFandRefreshWindows( AmplifyShaderFunction function ) + { + for( int i = 0; i < AllOpenedWindows.Count; i++ ) + { + AllOpenedWindows[ i ].LateRefreshAvailableNodes(); + if( AllOpenedWindows[ i ].IsShaderFunctionWindow ) + { + if( AllOpenedWindows[ i ].OpenedShaderFunction == function ) + { + AllOpenedWindows[ i ].UpdateTabTitle(); + } + } + } + } + + public static void UpdateIO() + { + int windowCount = AllOpenedWindows.Count; + if ( windowCount == 0 ) + { + EditorApplication.update -= IOUtils.UpdateIO; + return; + } + + for ( int i = 0; i < AllOpenedWindows.Count; i++ ) + { + if ( AllOpenedWindows[i] == EditorWindow.focusedWindow ) + { + UIUtils.CurrentWindow = AllOpenedWindows[ i ]; + } + + if( FunctionNodeChanged ) + AllOpenedWindows[ i ].CheckFunctions = true; + + if ( AllOpenedWindows[ i ] == null ) + { + AllOpenedWindows.RemoveAt( i ); + i--; + } + } + + if ( FunctionNodeChanged ) + FunctionNodeChanged = false; + } + + public static void Destroy() + { + ActiveThread = false; + if ( SaveInThreadMainThread != null ) + { + SaveInThreadMainThread.Abort(); + SaveInThreadMainThread = null; + } + } + + public static void GetShaderName( out string shaderName, out string fullPathname, string defaultName, string customDatapath ) + { + string currDatapath = String.IsNullOrEmpty( customDatapath ) ? Application.dataPath : customDatapath; + fullPathname = EditorUtility.SaveFilePanelInProject( "Select Shader to save", defaultName, "shader", SaveShaderStr, currDatapath ); + if ( !String.IsNullOrEmpty( fullPathname ) ) + { + shaderName = fullPathname.Remove( fullPathname.Length - 7 ); // -7 remove .shader extension + string[] subStr = shaderName.Split( '/' ); + if ( subStr.Length > 0 ) + { + shaderName = subStr[ subStr.Length - 1 ]; // Remove pathname + } + } + else + { + shaderName = string.Empty; + } + } + + public static void AddTypeToString( ref string myString, string typeName ) + { + myString += typeName; + } + + public static void AddFieldToString( ref string myString, string fieldName, object fieldValue ) + { + myString += FIELD_SEPARATOR + fieldName + VALUE_SEPARATOR + fieldValue; + } + + public static void AddFieldValueToString( ref string myString, object fieldValue ) + { + myString += FIELD_SEPARATOR + fieldValue.ToString(); + } + + public static void AddLineTerminator( ref string myString ) + { + myString += LINE_TERMINATOR; + } + + public static string CreateChecksum( string buffer ) + { + SHA1 sha1 = SHA1.Create(); + byte[] buf = System.Text.Encoding.UTF8.GetBytes( buffer ); + byte[] hash = sha1.ComputeHash( buf, 0, buf.Length ); + string hashstr = BitConverter.ToString( hash ).Replace( "-", "" ); + return hashstr; + } + + public static void SaveTextfileToDisk( string shaderBody, string pathName, bool addAdditionalInfo = true ) + { + + if ( addAdditionalInfo ) + { + shaderBody = ShaderCopywriteMessage + shaderBody; + // Add checksum + string checksum = CreateChecksum( shaderBody ); + shaderBody += CHECKSUM + VALUE_SEPARATOR + checksum; + } + + // Write to disk + StreamWriter fileWriter = new StreamWriter( pathName ); + try + { + fileWriter.Write( shaderBody ); + } + catch ( Exception e ) + { + Debug.LogException( e ); + } + finally + { + fileWriter.Close(); + } + } + + public static string AddAdditionalInfo( string shaderBody ) + { + shaderBody = ShaderCopywriteMessage + shaderBody; + string checksum = CreateChecksum( shaderBody ); + shaderBody += CHECKSUM + VALUE_SEPARATOR + checksum; + return shaderBody; + } + + public static string LoadTextFileFromDisk( string pathName ) + { + string result = string.Empty; + if ( !string.IsNullOrEmpty( pathName ) && File.Exists( pathName ) ) + { + + StreamReader fileReader = null; + try + { + fileReader = new StreamReader( pathName ); + result = fileReader.ReadToEnd(); + } + catch ( Exception e ) + { + Debug.LogException( e ); + } + finally + { + if( fileReader != null) + fileReader.Close(); + } + } + return result; + } + + public static bool IsASEShader( Shader shader ) + { + string datapath = AssetDatabase.GetAssetPath( shader ); + if ( UIUtils.IsUnityNativeShader( datapath ) ) + { + return false; + } + + string buffer = LoadTextFileFromDisk( datapath ); + if ( String.IsNullOrEmpty( buffer ) || !IOUtils.HasValidShaderBody( ref buffer ) ) + { + return false; + } + return true; + } + + public static bool IsShaderFunction( string functionInfo ) + { + string buffer = functionInfo; + if ( String.IsNullOrEmpty( buffer ) || !IOUtils.HasValidShaderBody( ref buffer ) ) + { + return false; + } + return true; + } + + public static bool HasValidShaderBody( ref string shaderBody ) + { + int shaderBodyBeginId = shaderBody.IndexOf( ShaderBodyBegin ); + if ( shaderBodyBeginId > -1 ) + { + int shaderBodyEndId = shaderBody.IndexOf( ShaderBodyEnd ); + return ( shaderBodyEndId > -1 && shaderBodyEndId > shaderBodyBeginId ); + } + return false; + } + + public static int[] AllIndexesOf( this string str, string substr, bool ignoreCase = false ) + { + if ( string.IsNullOrEmpty( str ) || string.IsNullOrEmpty( substr ) ) + { + throw new ArgumentException( "String or substring is not specified." ); + } + + List indexes = new List(); + int index = 0; + + while ( ( index = str.IndexOf( substr, index, ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal ) ) != -1 ) + { + indexes.Add( index++ ); + } + + return indexes.ToArray(); + } + + public static void AddFunctionHeader( ref string function, string header ) + { + function += "\t\t" + header + "\n\t\t{\n"; + } + + public static void AddSingleLineFunction( ref string function, string header ) + { + function += "\t\t" + header; + } + + public static void AddFunctionLine( ref string function, string line ) + { + function += "\t\t\t" + line + "\n"; + } + + public static void CloseFunctionBody( ref string function ) + { + function += "\t\t}\n"; + } + + public static string CreateFullFunction( string header, params string[] functionLines ) + { + string result = string.Empty; + AddFunctionHeader( ref result, header ); + for ( int i = 0; i > functionLines.Length; i++ ) + { + AddFunctionLine( ref result, functionLines[ i ] ); + } + CloseFunctionBody( ref result ); + return result; + } + + public static string CreateCodeComments( bool forceForwardSlash, params string[] comments ) + { + string finalComment = string.Empty; + if ( comments.Length == 1 ) + { + finalComment = "//" + comments[ 0 ]; + } + else + { + if ( forceForwardSlash ) + { + for ( int i = 0; i < comments.Length; i++ ) + { + finalComment += "//" + comments[ i ]; + if ( i < comments.Length - 1 ) + { + finalComment += "\n\t\t\t"; + } + } + } + else + { + finalComment = "/*"; + for ( int i = 0; i < comments.Length; i++ ) + { + if ( i != 0 ) + finalComment += "\t\t\t"; + finalComment += comments[ i ]; + if ( i < comments.Length - 1 ) + finalComment += "\n"; + } + finalComment += "*/"; + } + } + return finalComment; + } + + public static string GetUVChannelDeclaration( string uvName, int channelId, int set ) + { + string uvSetStr = ( set == 0 ) ? "uv" : "uv" + Constants.AvailableUVSetsStr[ set ]; + return "float2 " + uvSetStr + uvName /*+ " : TEXCOORD" + channelId*/; + } + + public static string GetUVChannelName( string uvName, int set ) + { + string uvSetStr = ( set == 0 ) ? "uv" : "uv" + Constants.AvailableUVSetsStr[ set ]; + return uvSetStr + uvName; + } + + public static string GetVertexUVChannelName( int set ) + { + string uvSetStr = ( set == 0 ) ? "texcoord" : ( "texcoord" + set.ToString() ); + return uvSetStr; + } + + public static string Floatify( float value ) + { + return ( value % 1 ) != 0 ? value.ToString() : ( value.ToString() + FloatifyStr ); + } + + public static string Vector2ToString( Vector2 data ) + { + return data.x.ToString() + VECTOR_SEPARATOR + data.y.ToString(); + } + + public static string Vector3ToString( Vector3 data ) + { + return data.x.ToString() + VECTOR_SEPARATOR + data.y.ToString() + VECTOR_SEPARATOR + data.z.ToString(); + } + + public static string Vector4ToString( Vector4 data ) + { + return data.x.ToString() + VECTOR_SEPARATOR + data.y.ToString() + VECTOR_SEPARATOR + data.z.ToString() + VECTOR_SEPARATOR + data.w.ToString(); + } + + public static string ColorToString( Color data ) + { + return data.r.ToString() + VECTOR_SEPARATOR + data.g.ToString() + VECTOR_SEPARATOR + data.b.ToString() + VECTOR_SEPARATOR + data.a.ToString(); + } + + public static string Matrix3x3ToString( Matrix4x4 matrix ) + { + return matrix[ 0, 0 ].ToString() + IOUtils.VECTOR_SEPARATOR + matrix[ 0, 1 ].ToString() + IOUtils.VECTOR_SEPARATOR + matrix[ 0, 2 ].ToString() + IOUtils.VECTOR_SEPARATOR + + matrix[ 1, 0 ].ToString() + IOUtils.VECTOR_SEPARATOR + matrix[ 1, 1 ].ToString() + IOUtils.VECTOR_SEPARATOR + matrix[ 1, 2 ].ToString() + IOUtils.VECTOR_SEPARATOR + + matrix[ 2, 0 ].ToString() + IOUtils.VECTOR_SEPARATOR + matrix[ 2, 1 ].ToString() + IOUtils.VECTOR_SEPARATOR + matrix[ 2, 2 ].ToString(); + } + + public static string Matrix4x4ToString( Matrix4x4 matrix ) + { + return matrix[ 0, 0 ].ToString() + IOUtils.VECTOR_SEPARATOR + matrix[ 0, 1 ].ToString() + IOUtils.VECTOR_SEPARATOR + matrix[ 0, 2 ].ToString() + IOUtils.VECTOR_SEPARATOR + matrix[ 0, 3 ].ToString() + IOUtils.VECTOR_SEPARATOR + + matrix[ 1, 0 ].ToString() + IOUtils.VECTOR_SEPARATOR + matrix[ 1, 1 ].ToString() + IOUtils.VECTOR_SEPARATOR + matrix[ 1, 2 ].ToString() + IOUtils.VECTOR_SEPARATOR + matrix[ 1, 3 ].ToString() + IOUtils.VECTOR_SEPARATOR + + matrix[ 2, 0 ].ToString() + IOUtils.VECTOR_SEPARATOR + matrix[ 2, 1 ].ToString() + IOUtils.VECTOR_SEPARATOR + matrix[ 2, 2 ].ToString() + IOUtils.VECTOR_SEPARATOR + matrix[ 2, 3 ].ToString() + IOUtils.VECTOR_SEPARATOR + + matrix[ 3, 0 ].ToString() + IOUtils.VECTOR_SEPARATOR + matrix[ 3, 1 ].ToString() + IOUtils.VECTOR_SEPARATOR + matrix[ 3, 2 ].ToString() + IOUtils.VECTOR_SEPARATOR + matrix[ 3, 3 ].ToString(); + } + + public static Vector2 StringToVector2( string data ) + { + string[] parsedData = data.Split( VECTOR_SEPARATOR ); + if ( parsedData.Length >= 2 ) + { + return new Vector2( Convert.ToSingle( parsedData[ 0 ] ), + Convert.ToSingle( parsedData[ 1 ] ) ); + } + return Vector2.zero; + } + + public static Vector3 StringToVector3( string data ) + { + string[] parsedData = data.Split( VECTOR_SEPARATOR ); + if ( parsedData.Length >= 3 ) + { + return new Vector3( Convert.ToSingle( parsedData[ 0 ] ), + Convert.ToSingle( parsedData[ 1 ] ), + Convert.ToSingle( parsedData[ 2 ] ) ); + } + return Vector3.zero; + } + + public static Vector4 StringToVector4( string data ) + { + string[] parsedData = data.Split( VECTOR_SEPARATOR ); + if ( parsedData.Length >= 4 ) + { + return new Vector4( Convert.ToSingle( parsedData[ 0 ] ), + Convert.ToSingle( parsedData[ 1 ] ), + Convert.ToSingle( parsedData[ 2 ] ), + Convert.ToSingle( parsedData[ 3 ] ) ); + } + return Vector4.zero; + } + + public static Color StringToColor( string data ) + { + string[] parsedData = data.Split( VECTOR_SEPARATOR ); + if ( parsedData.Length >= 4 ) + { + return new Color( Convert.ToSingle( parsedData[ 0 ] ), + Convert.ToSingle( parsedData[ 1 ] ), + Convert.ToSingle( parsedData[ 2 ] ), + Convert.ToSingle( parsedData[ 3 ] ) ); + } + return Color.white; + } + + public static Matrix4x4 StringToMatrix3x3( string data ) + { + string[] parsedData = data.Split( VECTOR_SEPARATOR ); + if ( parsedData.Length == 9 ) + { + Matrix4x4 matrix = new Matrix4x4(); + matrix[ 0, 0 ] = Convert.ToSingle( parsedData[ 0 ] ); + matrix[ 0, 1 ] = Convert.ToSingle( parsedData[ 1 ] ); + matrix[ 0, 2 ] = Convert.ToSingle( parsedData[ 2 ] ); + + matrix[ 1, 0 ] = Convert.ToSingle( parsedData[ 3 ] ); + matrix[ 1, 1 ] = Convert.ToSingle( parsedData[ 4 ] ); + matrix[ 1, 2 ] = Convert.ToSingle( parsedData[ 5 ] ); + + matrix[ 2, 0 ] = Convert.ToSingle( parsedData[ 6 ] ); + matrix[ 2, 1 ] = Convert.ToSingle( parsedData[ 7 ] ); + matrix[ 2, 2 ] = Convert.ToSingle( parsedData[ 8 ] ); + return matrix; + } + return Matrix4x4.identity; + } + + public static Matrix4x4 StringToMatrix4x4( string data ) + { + string[] parsedData = data.Split( VECTOR_SEPARATOR ); + if ( parsedData.Length == 16 ) + { + Matrix4x4 matrix = new Matrix4x4(); + matrix[ 0, 0 ] = Convert.ToSingle( parsedData[ 0 ] ); + matrix[ 0, 1 ] = Convert.ToSingle( parsedData[ 1 ] ); + matrix[ 0, 2 ] = Convert.ToSingle( parsedData[ 2 ] ); + matrix[ 0, 3 ] = Convert.ToSingle( parsedData[ 3 ] ); + + matrix[ 1, 0 ] = Convert.ToSingle( parsedData[ 4 ] ); + matrix[ 1, 1 ] = Convert.ToSingle( parsedData[ 5 ] ); + matrix[ 1, 2 ] = Convert.ToSingle( parsedData[ 6 ] ); + matrix[ 1, 3 ] = Convert.ToSingle( parsedData[ 7 ] ); + + matrix[ 2, 0 ] = Convert.ToSingle( parsedData[ 8 ] ); + matrix[ 2, 1 ] = Convert.ToSingle( parsedData[ 9 ] ); + matrix[ 2, 2 ] = Convert.ToSingle( parsedData[ 10 ] ); + matrix[ 2, 3 ] = Convert.ToSingle( parsedData[ 11 ] ); + + matrix[ 3, 0 ] = Convert.ToSingle( parsedData[ 12 ] ); + matrix[ 3, 1 ] = Convert.ToSingle( parsedData[ 13 ] ); + matrix[ 3, 2 ] = Convert.ToSingle( parsedData[ 14 ] ); + matrix[ 3, 3 ] = Convert.ToSingle( parsedData[ 15 ] ); + return matrix; + } + return Matrix4x4.identity; + } + + public static void SaveTextureToDisk( Texture2D tex, string pathname ) + { + byte[] rawData = tex.GetRawTextureData(); + Texture2D newTex = new Texture2D( tex.width, tex.height, tex.format, tex.mipmapCount > 1, false ); + newTex.LoadRawTextureData( rawData ); + newTex.Apply(); + byte[] pngData = newTex.EncodeToPNG(); + File.WriteAllBytes( pathname, pngData ); + } + + //public static void SaveObjToList( string newObj ) + //{ + // Debug.Log( UIUtils.CurrentWindow.Lastpath ); + // UIUtils.CurrentWindow.Lastpath = newObj; + // string lastOpenedObj = EditorPrefs.GetString( IOUtils.LAST_OPENED_OBJ_ID ); + // string[] allLocations = lastOpenedObj.Split( ':' ); + + // string lastLocation = allLocations[ allLocations.Length - 1 ]; + + // string resave = string.Empty; + // for ( int i = 0; i < allLocations.Length; i++ ) + // { + // if ( string.IsNullOrEmpty( allLocations[ i ] ) ) + // continue; + + // resave += allLocations[ i ]; + // resave += ":"; + // } + + // resave += newObj; + // EditorPrefs.SetString( IOUtils.LAST_OPENED_OBJ_ID, resave ); + //} + + //public static void DeleteObjFromList( string newObj ) + //{ + // string lastOpenedObj = EditorPrefs.GetString( IOUtils.LAST_OPENED_OBJ_ID ); + // string[] allLocations = lastOpenedObj.Split( ':' ); + + // string resave = string.Empty; + // for ( int i = 0; i < allLocations.Length; i++ ) + // { + // if ( string.IsNullOrEmpty( allLocations[ i ] ) || newObj.Equals( allLocations[ i ] ) ) + // continue; + + // resave += allLocations[ i ]; + // if ( i < allLocations.Length - 1 ) + // resave += ":"; + // } + + // EditorPrefs.SetString( IOUtils.LAST_OPENED_OBJ_ID, resave ); + //} + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/IOUtils.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/IOUtils.cs.meta new file mode 100644 index 0000000..08f1751 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/IOUtils.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d39b4c96fb4d7f847b3a21c377d4188d +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/InlineProperty.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/InlineProperty.cs new file mode 100644 index 0000000..e0d866e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/InlineProperty.cs @@ -0,0 +1,322 @@ +using UnityEngine; +using UnityEditor; +using System; + +namespace AmplifyShaderEditor +{ + [System.Serializable] + public class InlineProperty + { + [SerializeField] + private float m_value = 0; + + [SerializeField] + private bool m_active = false; + + [SerializeField] + private int m_nodeId = -1; + + [SerializeField] + private string m_nodePropertyName = string.Empty; + + public InlineProperty() { } + + public InlineProperty( float val ) + { + m_value = val; + } + + public InlineProperty( int val ) + { + m_value = val; + } + + public void ResetProperty() + { + m_nodeId = -1; + m_active = false; + } + + public void CopyFrom( InlineProperty other ) + { + m_value = other.m_value; + m_active = other.m_active; + m_nodeId = other.m_nodeId; + } + + public void SetInlineByName( string propertyName ) + { + m_nodeId = UIUtils.GetNodeIdByName( propertyName ); + m_nodePropertyName = propertyName; + m_active = m_nodeId != -1; + } + + public void IntField( ref UndoParentNode owner, string content ) + { + if( !m_active ) + { + EditorGUILayout.BeginHorizontal(); + m_value = owner.EditorGUILayoutIntField( content, (int)m_value ); + if( GUILayout.Button( UIUtils.FloatIntIconON, UIUtils.FloatIntPickerONOFF, GUILayout.Width( 15 ), GUILayout.Height( 15 ) ) ) + m_active = !m_active; + EditorGUILayout.EndHorizontal(); + } + else + { + DrawPicker( ref owner, content ); + } + } + + public void IntSlider( ref UndoParentNode owner, GUIContent content, int min, int max ) + { + if( !m_active ) + { + EditorGUILayout.BeginHorizontal(); + m_value = owner.EditorGUILayoutIntSlider( content, (int)m_value, min, max ); + if( GUILayout.Button( UIUtils.FloatIntIconON, UIUtils.FloatIntPickerONOFF, GUILayout.Width( 15 ), GUILayout.Height( 15 ) ) ) + m_active = !m_active; + EditorGUILayout.EndHorizontal(); + } + else + { + DrawPicker( ref owner, content ); + } + } + + public void IntSlider( ref UndoParentNode owner, string content, int min, int max ) + { + if( !m_active ) + { + EditorGUILayout.BeginHorizontal(); + m_value = owner.EditorGUILayoutIntSlider( content, (int)m_value, min, max ); + if( GUILayout.Button( UIUtils.FloatIntIconON, UIUtils.FloatIntPickerONOFF, GUILayout.Width( 15 ), GUILayout.Height( 15 ) ) ) + m_active = !m_active; + EditorGUILayout.EndHorizontal(); + } + else + { + DrawPicker( ref owner, content ); + } + } + + public void EnumTypePopup( ref UndoParentNode owner, string content, string[] displayOptions ) + { + if( !m_active ) + { + EditorGUILayout.BeginHorizontal(); + m_value = owner.EditorGUILayoutPopup( content, (int)m_value, displayOptions ); + if( GUILayout.Button( UIUtils.FloatIntIconON, UIUtils.FloatIntPickerONOFF, GUILayout.Width( 15 ), GUILayout.Height( 15 ) ) ) + m_active = !m_active; + EditorGUILayout.EndHorizontal(); + + } + else + { + DrawPicker( ref owner, content ); + } + } + + public void FloatField( ref UndoParentNode owner, string content ) + { + if( !m_active ) + { + EditorGUILayout.BeginHorizontal(); + m_value = owner.EditorGUILayoutFloatField( content, m_value ); + if( GUILayout.Button( UIUtils.FloatIntIconON, UIUtils.FloatIntPickerONOFF, GUILayout.Width( 15 ), GUILayout.Height( 15 ) ) ) + m_active = !m_active; + EditorGUILayout.EndHorizontal(); + } + else + { + DrawPicker( ref owner, content ); + } + } + + public void SliderField( ref UndoParentNode owner, string content, float min, float max ) + { + if( !m_active ) + { + EditorGUILayout.BeginHorizontal(); + m_value = owner.EditorGUILayoutSlider( content, m_value, min, max ); + if( GUILayout.Button( UIUtils.FloatIntIconON, UIUtils.FloatIntPickerONOFF, GUILayout.Width( 15 ), GUILayout.Height( 15 ) ) ) + m_active = !m_active; + EditorGUILayout.EndHorizontal(); + } + else + { + DrawPicker( ref owner, content ); + } + } + + public void RangedFloatField( ref UndoParentNode owner, string content, float min, float max ) + { + if( !m_active ) + { + EditorGUILayout.BeginHorizontal(); + m_value = owner.EditorGUILayoutRangedFloatField( content, m_value, min, max ); + if( GUILayout.Button( UIUtils.FloatIntIconON, UIUtils.FloatIntPickerONOFF, GUILayout.Width( 15 ), GUILayout.Height( 15 ) ) ) + m_active = !m_active; + EditorGUILayout.EndHorizontal(); + } + else + { + DrawPicker( ref owner, content ); + } + } + + + public void CustomDrawer( ref UndoParentNode owner, DrawPropertySection Drawer, string content ) + { + if( !m_active ) + { + EditorGUILayout.BeginHorizontal(); + Drawer( owner ); + if( GUILayout.Button( UIUtils.FloatIntIconON, UIUtils.FloatIntPickerONOFF, GUILayout.Width( 15 ), GUILayout.Height( 15 ) ) ) + m_active = !m_active; + EditorGUILayout.EndHorizontal(); + } + else + { + DrawPicker( ref owner, content ); + } + } + + public delegate void DrawPropertySection( UndoParentNode owner ); + + private void DrawPicker( ref UndoParentNode owner, GUIContent content ) + { + DrawPicker( ref owner, content.text ); + } + + private void DrawPicker( ref UndoParentNode owner, string content ) + { + EditorGUILayout.BeginHorizontal(); + string[] intArraysNames = owner.ContainerGraph.ParentWindow.CurrentGraph.FloatIntNodes.NodesArr; + int[] intIds = owner.ContainerGraph.ParentWindow.CurrentGraph.FloatIntNodes.NodeIds; + m_nodeId = owner.EditorGUILayoutIntPopup( content, m_nodeId, intArraysNames, intIds ); + if( GUILayout.Button( UIUtils.FloatIntIconOFF, UIUtils.FloatIntPickerONOFF, GUILayout.Width( 15 ), GUILayout.Height( 15 ) ) ) + m_active = !m_active; + EditorGUILayout.EndHorizontal(); + } + + public string GetValueOrProperty( bool parentesis = true ) + { + if( m_active ) + { + PropertyNode node = GetPropertyNode(); + if( node != null ) + { + return parentesis ? "[" + node.PropertyName + "]" : node.PropertyName; + } + else + { + m_active = false; + m_nodeId = -1; + return m_value.ToString(); + } + } + else + { + return m_value.ToString(); + } + } + + public string GetValueOrProperty( string defaultValue, bool parentesis = true ) + { + if( m_active ) + { + PropertyNode node = GetPropertyNode(); + if( node != null ) + { + return parentesis ? "[" + node.PropertyName + "]" : node.PropertyName; + } + else if( !string.IsNullOrEmpty( defaultValue ) ) + { + m_active = false; + m_nodeId = -1; + return defaultValue; + } + else + { + m_active = false; + m_nodeId = -1; + return m_value.ToString(); + } + } + else + { + return defaultValue; + } + } + + public void ReadFromString( ref uint index, ref string[] nodeParams, bool isInt = true ) + { + m_value = isInt ? Convert.ToInt32( nodeParams[ index++ ] ) : Convert.ToSingle( nodeParams[ index++ ] ); + m_active = Convert.ToBoolean( nodeParams[ index++ ] ); + m_nodeId = Convert.ToInt32( nodeParams[ index++ ] ); + } + + public void ReadFromSingle( string singleLine ) + { + string[] data = singleLine.Split( IOUtils.VECTOR_SEPARATOR ); + m_value = Convert.ToSingle( data[ 0 ], System.Globalization.CultureInfo.InvariantCulture ); + m_active = Convert.ToBoolean( data[ 1 ] ); + m_nodeId = Convert.ToInt32( data[ 2 ] ); + } + + public void WriteToString( ref string nodeInfo ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_value ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_active ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_nodeId ); + } + + public string WriteToSingle() + { + return m_value.ToString( System.Globalization.CultureInfo.InvariantCulture ) + IOUtils.VECTOR_SEPARATOR + m_active + IOUtils.VECTOR_SEPARATOR + m_nodeId; + } + + public void SetInlineNodeValue() + { + if( IsValid ) + { + RangedFloatNode fnode = UIUtils.GetNode( m_nodeId ) as RangedFloatNode; + if( fnode != null ) + { + fnode.Value = m_value; + fnode.SetMaterialValueFromInline( m_value ); + } + else + { + IntNode inode = UIUtils.GetNode( m_nodeId ) as IntNode; + inode.Value = (int)m_value; + inode.SetMaterialValueFromInline( (int)m_value ); + } + } + } + + public bool IsValid { get { return m_active && m_nodeId != -1; } } + + public PropertyNode GetPropertyNode() + { + if( m_nodeId >= 0 ) + return UIUtils.GetNode( m_nodeId ) as PropertyNode; + + if( m_nodeId < -1 ) + { + if(!string.IsNullOrEmpty(m_nodePropertyName)) + return UIUtils.GetInternalTemplateNode( m_nodePropertyName ); + + + return UIUtils.GetInternalTemplateNode( m_nodeId ); + } + + return null; + } + + public int IntValue { get { return (int)m_value; } set { m_value = value; } } + public float FloatValue { get { return m_value; } set { m_value = value; } } + public bool Active { get { return m_active; } set { m_active = value; } } + public int NodeId { get { return m_nodeId; } set { m_nodeId = value; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/InlineProperty.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/InlineProperty.cs.meta new file mode 100644 index 0000000..7c5e45d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/InlineProperty.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f4f4421f529503243bfef5076ae82512 +timeCreated: 1519298230 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/InvalidDataChecker.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/InvalidDataChecker.cs new file mode 100644 index 0000000..b5540b2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/InvalidDataChecker.cs @@ -0,0 +1,172 @@ +using UnityEditor; +using UnityEngine; +using System; +using System.Collections; +using UnityEngine.Networking; + +namespace AmplifyShaderEditor +{ + [InitializeOnLoad] + public class InvalidDataChecker + { + private static string[] m_invalidData = { "674ea7bed6b1cd94b8057074298096db", //"/Samples", + "2738539936eacef409be91f148b2a4a0", //"/Resources", + "c880e50f07f2be9499d414ac6f9f3a7a", //"/Templates", + "563f992b9989cf547ac59bf748442c17"};//"/Textures"}; + //private static string m_ASEFolderPath; + private static string m_invalidDataCollected = string.Empty; + static InvalidDataChecker() + { + bool foundInvalidData = false; + //m_ASEFolderPath = AssetDatabase.GUIDToAssetPath( IOUtils.ASEFolderGUID ); + int count = 0; + for ( int i = 0; i < m_invalidData.Length; i++ ) + { + //m_invalidData[ i ] = m_ASEFolderPath + m_invalidData[ i ]; + m_invalidData[ i ] = AssetDatabase.GUIDToAssetPath( m_invalidData[ i ] ); + if ( AssetDatabase.IsValidFolder( m_invalidData[ i ] ) ) + { + foundInvalidData = true; + m_invalidDataCollected += m_invalidData[ i ]+"\n"; + count += 1; + } + } + if ( count < 5 ) + { + for ( ; count < 5; count++ ) + { + m_invalidDataCollected += "\n"; + } + } + + if ( foundInvalidData ) + { + InvalidDataPopUp window = ( InvalidDataPopUp ) EditorWindow.GetWindow( typeof( InvalidDataPopUp ), true, "Found Invalid Data" ); + window.minSize = new Vector2( 502, 265 ); + window.maxSize = new Vector2( 502, 265 ); + window.Show(); + } + + EditorApplication.update += Update; + } + + static void Update() + { + EditorApplication.update -= Update; + + if( !EditorApplication.isPlayingOrWillChangePlaymode ) + { + Preferences.ShowOption show = Preferences.ShowOption.Never; + if( !EditorPrefs.HasKey( Preferences.PrefStartUp ) ) + { + show = Preferences.ShowOption.Always; + EditorPrefs.SetInt( Preferences.PrefStartUp, 0 ); + } + else + { + if( Time.realtimeSinceStartup < 10 ) + { + show = (Preferences.ShowOption) EditorPrefs.GetInt( Preferences.PrefStartUp, 0 ); + // check version here + if( show == Preferences.ShowOption.OnNewVersion ) + { + ASEStartScreen.StartBackgroundTask( StartRequest( ASEStartScreen.ChangelogURL, () => + { + var changeLog = ChangeLogInfo.CreateFromJSON( www.downloadHandler.text ); + if( changeLog != null ) + { + if( changeLog.Version > VersionInfo.FullNumber ) + ASEStartScreen.Init(); + } + } ) ); + } + } + } + + if( show == Preferences.ShowOption.Always ) + ASEStartScreen.Init(); + } + } + + static UnityWebRequest www; + + static IEnumerator StartRequest( string url, Action success = null ) + { + using( www = UnityWebRequest.Get( url ) ) + { +#if UNITY_2017_2_OR_NEWER + yield return www.SendWebRequest(); +#else + yield return www.Send(); +#endif + + while( www.isDone == false ) + yield return null; + + if( success != null ) + success(); + } + } + + public static void CleanInvalidData() + { + for ( int i = 0; i < m_invalidData.Length; i++ ) + { + if ( FileUtil.DeleteFileOrDirectory( m_invalidData[ i ] ) ) + { + Debug.Log( "Removed invalid " + m_invalidData[ i ] ); + if ( FileUtil.DeleteFileOrDirectory( m_invalidData[ i ] + ".meta" ) ) + { + Debug.Log( "Removed invalid " + m_invalidData[ i ] + ".meta" ); + } + } + } + AssetDatabase.Refresh(); + } + + public static string InvalidDataCollected { get { return m_invalidDataCollected; } } + } + + public class InvalidDataPopUp : EditorWindow + { + private readonly GUIContent m_buttonContent = new GUIContent( "Remove Invalid Data" ); + private Vector2 m_scrollPosition = Vector2.zero; + public void OnGUI() + { + GUILayout.BeginVertical(); + { + GUIStyle labelStyle = new GUIStyle( EditorStyles.label ); + labelStyle.alignment = TextAnchor.MiddleCenter; + labelStyle.wordWrap = true; + GUILayout.Label( "\nAmplify Shader Editor " + VersionInfo.StaticToString(), labelStyle, GUILayout.ExpandWidth( true ) ); + GUILayout.Space( 5 ); + GUILayout.Label( "Invalid/Legacy Data was found on your previous ASE folder which needs to be removed in order for it to work correctly." , labelStyle, GUILayout.ExpandWidth( true ) ); + GUILayout.Space( 5 ); + GUILayout.Label( "Below are the detected files/folders which require to be removed.", labelStyle, GUILayout.ExpandWidth( true ) ); + GUILayout.Space( 5 ); + + m_scrollPosition = GUILayout.BeginScrollView( m_scrollPosition ,GUILayout.Height(85)); + + GUILayout.TextArea( InvalidDataChecker.InvalidDataCollected ); + GUILayout.EndScrollView(); + + + GUILayout.Label( "VERY IMPORTANT: If you have assets of yours inside these folders you need to move them to another location before hitting the button below or they will be PERMANENTLY DELETED", labelStyle, GUILayout.ExpandWidth( true ) ); + GUILayout.Space( 5 ); + + GUILayout.BeginHorizontal(); + { + GUILayout.Space( 151 ); + if ( GUILayout.Button( m_buttonContent, GUILayout.Width( 200 ) ) ) + { + InvalidDataChecker.CleanInvalidData(); + Close(); + } + } + GUILayout.EndHorizontal(); + } + GUILayout.EndVertical(); + + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/InvalidDataChecker.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/InvalidDataChecker.cs.meta new file mode 100644 index 0000000..daaec41 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/InvalidDataChecker.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c71b815458d61e24184a60dbce19573d +timeCreated: 1481126959 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/NodeExporterUtils.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/NodeExporterUtils.cs new file mode 100644 index 0000000..0f2ca73 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/NodeExporterUtils.cs @@ -0,0 +1,284 @@ +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + public enum DebugScreenShotNodeState + { + CreateNode, + FocusOnNode, + TakeScreenshot, + WaitFrame, + DeleteNode + }; + + public enum DebugUndoNodeState + { + CreateNode, + FocusOnNode, + WaitFrameCreate, + DeleteNode, + WaitFrameDelete, + UndoNode, + WaitFrameUndo, + PrepareForNext + }; + + + public class NodeExporterUtils + { + //Auto-Screenshot nodes + private RenderTexture m_screenshotRT; + private Texture2D m_screenshotTex2D; + private List m_screenshotList = new List(); + private DebugScreenShotNodeState m_screenShotState; + private bool m_takingShots = false; + + private DebugUndoNodeState m_undoState; + private bool m_testingUndo = false; + + + private AmplifyShaderEditorWindow m_window; + private ParentNode m_node; + + + private string m_pathname; + + public NodeExporterUtils( AmplifyShaderEditorWindow window ) + { + m_window = window; + Undo.undoRedoPerformed += OnUndoRedoPerformed; + } + + public void OnUndoRedoPerformed() + { + if( m_testingUndo && m_undoState == DebugUndoNodeState.WaitFrameUndo ) + { + m_undoState = DebugUndoNodeState.PrepareForNext; + } + } + + public void CalculateShaderInstructions( Shader shader ) + { + //Type shaderutilType = Type.GetType( "UnityEditor.ShaderUtil, UnityEditor" ); + //shaderutilType.InvokeMember( "OpenCompiledShader", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[] { shader, mode, customPlatformsMask, includeAllVariants } ); + } + + public void ActivateAutoScreenShot( string pathname, int from, int to ) + { + + m_pathname = pathname; + if( !System.IO.Directory.Exists( m_pathname ) ) + { + System.IO.Directory.CreateDirectory( m_pathname ); + } + + m_screenshotRT = new RenderTexture( (int)m_window.position.width, (int)m_window.position.height, 0 ); + m_screenshotTex2D = new Texture2D( (int)m_window.position.width, (int)m_window.position.height, TextureFormat.RGB24, false ); + + RenderTexture.active = m_screenshotRT; + m_window.CurrentPaletteWindow.FillList( ref m_screenshotList, true ); + m_window.CurrentGraph.ClearGraph(); + if( m_window.IsShaderFunctionWindow ) + { + m_window.CurrentGraph.CurrentOutputNode.Vec2Position = new Vector2( 1500, 0 ); + } + else + { + m_window.CurrentGraph.CurrentMasterNode.Vec2Position = new Vector2( 1500, 0 ); + } + m_window.ResetCameraSettings(); + + m_takingShots = true; + m_screenShotState = DebugScreenShotNodeState.CreateNode; + + } + + public void ActivateNodesURL( int from , int to ) + { + m_window.CurrentPaletteWindow.FillList( ref m_screenshotList, true ); + + if( to < 0 || to > m_screenshotList.Count ) + to = m_screenshotList.Count; + + if( from >= to ) + return; + + for( int i = from; i < to; i++ ) + { + if( m_screenshotList[ i ].NodeType != typeof( FunctionNode ) ) + { + Application.OpenURL( m_screenshotList[ i ].NodeAttributes.NodeUrl ); + } + } + } + + public void ActivateAutoUndo() + { + m_window.CurrentPaletteWindow.FillList( ref m_screenshotList, true ); + m_window.CurrentGraph.ClearGraph(); + m_window.CurrentGraph.CurrentMasterNode.Vec2Position = new Vector2( 1500, 0 ); + m_window.ResetCameraSettings(); + + m_testingUndo = true; + m_undoState = DebugUndoNodeState.CreateNode; + } + + + public void Update() + { + if( m_testingUndo ) + { + if( Event.current.type == EventType.Repaint ) + { + m_window.Focus(); + switch( m_undoState ) + { + case DebugUndoNodeState.CreateNode: + { + m_window.CurrentGraph.DeSelectAll(); + m_node = m_window.CreateNode( m_screenshotList[ 0 ].NodeType, Vector2.zero, null, true ); + m_node.RefreshExternalReferences(); + m_undoState = DebugUndoNodeState.FocusOnNode; + Debug.Log( "Created " + m_node.Attributes.Name ); + } + break; + case DebugUndoNodeState.FocusOnNode: + { + m_window.FocusOnPoint( m_node.TruePosition.center, 1, false ); + m_undoState = DebugUndoNodeState.WaitFrameCreate; + Debug.Log( "Focused " + m_node.Attributes.Name ); + } + break; + case DebugUndoNodeState.WaitFrameCreate: + { + m_undoState = DebugUndoNodeState.DeleteNode; + Debug.Log( "Waiting on Create" ); + } + break; + case DebugUndoNodeState.DeleteNode: + { + Debug.Log( "Deleting " + m_node.Attributes.Name ); + m_window.DeleteSelectedNodeWithRepaint(); + m_undoState = DebugUndoNodeState.WaitFrameDelete; + } + break; + case DebugUndoNodeState.WaitFrameDelete: + { + m_undoState = DebugUndoNodeState.UndoNode; + Debug.Log( "Waiting on Delete" ); + } + break; + case DebugUndoNodeState.UndoNode: + { + Debug.Log( "Performing Undo" ); + m_undoState = DebugUndoNodeState.WaitFrameUndo; + Undo.PerformUndo(); + } + break; + case DebugUndoNodeState.WaitFrameUndo: { } break; + case DebugUndoNodeState.PrepareForNext: + { + m_screenshotList.RemoveAt( 0 ); + Debug.Log( "Undo Performed. Nodes Left " + m_screenshotList.Count ); + m_testingUndo = m_screenshotList.Count > 0; + if( m_testingUndo ) + { + m_undoState = DebugUndoNodeState.CreateNode; + Debug.Log( "Going to next node" ); + } + else + { + Debug.Log( "Finished Undo Test" ); + } + } + break; + + } + } + } + + + if( m_takingShots ) + { + m_window.Focus(); + switch( m_screenShotState ) + { + case DebugScreenShotNodeState.CreateNode: + { + m_node = m_window.CreateNode( m_screenshotList[ 0 ].NodeType, Vector2.zero, null, false ); + m_node.RefreshExternalReferences(); + m_screenShotState = DebugScreenShotNodeState.FocusOnNode; + + + } + break; + case DebugScreenShotNodeState.FocusOnNode: + { + //m_window.FocusOnNode( m_node, 1, false ); + m_window.FocusOnPoint( m_node.TruePosition.center, 1, false ); + m_screenShotState = DebugScreenShotNodeState.TakeScreenshot; + } + break; + case DebugScreenShotNodeState.TakeScreenshot: + { + if( m_screenshotRT != null && Event.current.type == EventType.Repaint ) + { + m_screenshotTex2D.ReadPixels( new Rect( 0, 0, m_screenshotRT.width, m_screenshotRT.height ), 0, 0 ); + m_screenshotTex2D.Apply(); + + byte[] bytes = m_screenshotTex2D.EncodeToPNG(); + string pictureFilename = UIUtils.ReplaceInvalidStrings( m_screenshotList[ 0 ].Name ); + pictureFilename = UIUtils.RemoveInvalidCharacters( pictureFilename ); + + System.IO.File.WriteAllBytes( m_pathname + pictureFilename + ".png", bytes ); + m_screenShotState = DebugScreenShotNodeState.WaitFrame; + } + } + break; + case DebugScreenShotNodeState.WaitFrame: { Debug.Log( "Wait Frame" ); m_screenShotState = DebugScreenShotNodeState.DeleteNode; } break; + case DebugScreenShotNodeState.DeleteNode: + { + m_window.DestroyNode( m_node ); + m_screenshotList.RemoveAt( 0 ); + m_takingShots = m_screenshotList.Count > 0; + Debug.Log( "Destroy Node " + m_screenshotList.Count ); + + if( m_takingShots ) + { + m_screenShotState = DebugScreenShotNodeState.CreateNode; + } + else + { + RenderTexture.active = null; + m_screenshotRT.Release(); + UnityEngine.Object.DestroyImmediate( m_screenshotRT ); + m_screenshotRT = null; + UnityEngine.Object.DestroyImmediate( m_screenshotTex2D ); + m_screenshotTex2D = null; + } + } + break; + }; + } + } + + public void Destroy() + { + m_window = null; + if( m_screenshotRT != null ) + { + m_screenshotRT.Release(); + UnityEngine.Object.DestroyImmediate( m_screenshotRT ); + m_screenshotRT = null; + } + + if( m_screenshotTex2D != null ) + { + UnityEngine.Object.DestroyImmediate( m_screenshotTex2D ); + m_screenshotTex2D = null; + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/NodeExporterUtils.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/NodeExporterUtils.cs.meta new file mode 100644 index 0000000..acdf759 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/NodeExporterUtils.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f9b3f6c515f0e16469de89d9e22263c5 +timeCreated: 1486374353 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/Preferences.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/Preferences.cs new file mode 100644 index 0000000..c4ee66f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/Preferences.cs @@ -0,0 +1,163 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + public class Preferences + { + public enum ShowOption + { + Always = 0, + OnNewVersion = 1, + Never = 2 + } + + private static readonly GUIContent StartUp = new GUIContent( "Show start screen on Unity launch", "You can set if you want to see the start screen everytime Unity launchs, only just when there's a new version available or never." ); + public static readonly string PrefStartUp = "ASELastSession" + Application.productName; + public static ShowOption GlobalStartUp = ShowOption.Always; + + private static readonly GUIContent AutoSRP = new GUIContent( "Auto import SRP shader templates", "By default Amplify Shader Editor checks for your SRP version and automatically imports the correct corresponding shader templates.\nTurn this OFF if you prefer to import them manually." ); + public static readonly string PrefAutoSRP = "ASEAutoSRP" + Application.productName; + public static bool GlobalAutoSRP = true; + + private static readonly GUIContent DefineSymbol = new GUIContent( "Add Amplify Shader Editor define symbol", "Turning it OFF will disable the automatic insertion of the define symbol and remove it from the list while turning it ON will do the opposite.\nThis is used for compatibility with other plugins, if you are not sure if you need this leave it ON." ); + public static readonly string PrefDefineSymbol = "ASEDefineSymbol" + Application.productName; + public static bool GlobalDefineSymbol = true; + + private static readonly GUIContent ClearLog = new GUIContent( "Clear Log on Update", "Clears the previously generated log each time the Update button is pressed" ); + public static readonly string PrefClearLog = "ASEClearLog" + Application.productName; + public static bool GlobalClearLog = true; + + private static readonly GUIContent UpdateOnSceneSave = new GUIContent( "Update on Scene save (Ctrl+S)" , "ASE is aware of Ctrl+S and will use it to save shader" ); + public static readonly string PrefUpdateOnSceneSave = "ASEUpdateOnSceneSave" + Application.productName; + public static bool GlobalUpdateOnSceneSave = true; + +#if UNITY_2019_4_OR_NEWER + private static readonly GUIContent ShowAsyncMsg = new GUIContent( "Show Shader Async. Compilation Message", "Shows message on ASE log if Asynchronous Shader Compilation is detected" ); + public static readonly string PrefShowAsyncMsg = "ASEShowAsync" + Application.productName; + public static bool GlobalShowAsyncMsg = true; +#endif + private static bool PrefsLoaded = false; + +#if UNITY_2019_1_OR_NEWER + [SettingsProvider] + public static SettingsProvider ImpostorsSettings() + { + var provider = new SettingsProvider( "Preferences/Amplify Shader Editor", SettingsScope.User ) + { + guiHandler = ( string searchContext ) => + { + PreferencesGUI(); + }, + + keywords = new HashSet( new[] { "start", "screen", "import", "shader", "templates", "macros", "macros", "define", "symbol" } ), + + }; + return provider; + } +#else + [PreferenceItem( "Amplify Shader Editor" )] +#endif + public static void PreferencesGUI() + { + if( !PrefsLoaded ) + { + LoadDefaults(); + PrefsLoaded = true; + } + + var cache = EditorGUIUtility.labelWidth; + EditorGUIUtility.labelWidth = 250; + EditorGUI.BeginChangeCheck(); + GlobalStartUp = (ShowOption)EditorGUILayout.EnumPopup( StartUp, GlobalStartUp ); + if( EditorGUI.EndChangeCheck() ) + { + EditorPrefs.SetInt( PrefStartUp, (int)GlobalStartUp ); + } + + EditorGUI.BeginChangeCheck(); + GlobalAutoSRP = EditorGUILayout.Toggle( AutoSRP, GlobalAutoSRP ); + if( EditorGUI.EndChangeCheck() ) + { + EditorPrefs.SetBool( PrefAutoSRP, GlobalAutoSRP ); + } + + EditorGUI.BeginChangeCheck(); + GlobalDefineSymbol = EditorGUILayout.Toggle( DefineSymbol, GlobalDefineSymbol ); + if( EditorGUI.EndChangeCheck() ) + { + EditorPrefs.SetBool( PrefDefineSymbol, GlobalDefineSymbol ); + if( GlobalDefineSymbol ) + IOUtils.SetAmplifyDefineSymbolOnBuildTargetGroup( EditorUserBuildSettings.selectedBuildTargetGroup ); + else + IOUtils.RemoveAmplifyDefineSymbolOnBuildTargetGroup( EditorUserBuildSettings.selectedBuildTargetGroup ); + } + + EditorGUI.BeginChangeCheck(); + GlobalClearLog = EditorGUILayout.Toggle( ClearLog, GlobalClearLog ); + if( EditorGUI.EndChangeCheck() ) + { + EditorPrefs.SetBool( PrefClearLog, GlobalClearLog ); + } + + EditorGUI.BeginChangeCheck(); + GlobalUpdateOnSceneSave = EditorGUILayout.Toggle( UpdateOnSceneSave , GlobalUpdateOnSceneSave ); + if( EditorGUI.EndChangeCheck() ) + { + EditorPrefs.SetBool( PrefUpdateOnSceneSave , GlobalUpdateOnSceneSave ); + } + +#if UNITY_2019_4_OR_NEWER + EditorGUI.BeginChangeCheck(); + GlobalShowAsyncMsg = EditorGUILayout.Toggle( ShowAsyncMsg, GlobalShowAsyncMsg); + if( EditorGUI.EndChangeCheck() ) + { + EditorPrefs.SetBool( PrefShowAsyncMsg, GlobalShowAsyncMsg ); + } +#endif + EditorGUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + if( GUILayout.Button( "Reset and Forget All" ) ) + { + EditorPrefs.DeleteKey( PrefStartUp ); + GlobalStartUp = ShowOption.Always; + + EditorPrefs.DeleteKey( PrefAutoSRP ); + GlobalAutoSRP = true; + + EditorPrefs.DeleteKey( PrefDefineSymbol ); + GlobalDefineSymbol = true; + IOUtils.SetAmplifyDefineSymbolOnBuildTargetGroup( EditorUserBuildSettings.selectedBuildTargetGroup ); + + EditorPrefs.DeleteKey( PrefClearLog ); + GlobalClearLog = true; + + EditorPrefs.DeleteKey( PrefUpdateOnSceneSave ); + GlobalUpdateOnSceneSave = true; + +#if UNITY_2019_4_OR_NEWER + EditorPrefs.DeleteKey( PrefShowAsyncMsg ); + GlobalShowAsyncMsg = true; +#endif + } + EditorGUILayout.EndHorizontal(); + EditorGUIUtility.labelWidth = cache; + } + + public static void LoadDefaults() + { + GlobalStartUp = (ShowOption)EditorPrefs.GetInt( PrefStartUp, 0 ); + GlobalAutoSRP = EditorPrefs.GetBool( PrefAutoSRP, true ); + GlobalDefineSymbol = EditorPrefs.GetBool( PrefDefineSymbol, true ); + GlobalClearLog = EditorPrefs.GetBool( PrefClearLog, true ); + GlobalUpdateOnSceneSave = EditorPrefs.GetBool( PrefUpdateOnSceneSave , true ); +#if UNITY_2019_4_OR_NEWER + GlobalShowAsyncMsg = EditorPrefs.GetBool( PrefShowAsyncMsg, true ); +#endif + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/Preferences.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/Preferences.cs.meta new file mode 100644 index 0000000..33cf46b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/Preferences.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d036571a581792b44951e3723aef2c01 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/RectExtension.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/RectExtension.cs new file mode 100644 index 0000000..f803ac2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/RectExtension.cs @@ -0,0 +1,40 @@ +using UnityEngine; + +namespace AmplifyShaderEditor +{ + public static class RectExtension + { + private static Rect ValidateBoundaries( this Rect thisRect ) + { + if ( thisRect.yMin > thisRect.yMax ) + { + float yMin = thisRect.yMin; + thisRect.yMin = thisRect.yMax; + thisRect.yMax = yMin; + } + + if ( thisRect.xMin > thisRect.xMax ) + { + float xMin = thisRect.xMin; + thisRect.xMin = thisRect.xMax; + thisRect.xMax = xMin; + } + return thisRect; + } + + public static bool Includes( this Rect thisRect , Rect other ) + { + thisRect = thisRect.ValidateBoundaries(); + other = other.ValidateBoundaries(); + + if ( other.xMin >= thisRect.xMin && other.xMax <= thisRect.xMax ) + { + if ( other.yMin >= thisRect.yMin && other.yMax <= thisRect.yMax ) + { + return true; + } + } + return false; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/RectExtension.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/RectExtension.cs.meta new file mode 100644 index 0000000..8225869 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/RectExtension.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e5a7e5c0308e038448cd1a235bf840ca +timeCreated: 1501521591 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/SamplerStateAutoGenerator.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/SamplerStateAutoGenerator.cs new file mode 100644 index 0000000..8be253c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/SamplerStateAutoGenerator.cs @@ -0,0 +1,203 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + public enum InlineSamplerFilteringMode + { + Point, + Linear, + Trilinear + }; + + public enum InlineSamplerWrapMode + { + Clamp, + Repeat, + Mirror, + MirrorOnce + }; + + public enum InlineSamplerWrapCoordinates + { + All, + U, + V, + W + }; + + [Serializable] + public class InlineSamplerWrapOptions + { + public InlineSamplerWrapMode WrapMode = InlineSamplerWrapMode.Clamp; + public InlineSamplerWrapCoordinates Coordinates = InlineSamplerWrapCoordinates.All; + public string InlineValue + { + get + { + string name = "_"+WrapMode.ToString(); + if( Coordinates != InlineSamplerWrapCoordinates.All ) + name += Coordinates.ToString(); + name += "_"; + return name; + } + } + } + + [Serializable] + public class SamplerStateAutoGenerator + { + private const int MaxCount = 3; + private const float ButtonLayoutWidth = 15; + private const string AdditionalWrapsStr = "Additional Wraps"; + private const string InlineSamplerStateStr = "Inline Sampler State"; + + [SerializeField] + private InlineSamplerFilteringMode m_filterMode = InlineSamplerFilteringMode.Point; + + [SerializeField] + private InlineSamplerWrapOptions m_mainWrapMode = new InlineSamplerWrapOptions(); + + [SerializeField] + private List m_additionalWrapOptions = new List(); + + [SerializeField] + private bool m_visibleWrapsFoldout = false; + + [SerializeField] + private bool m_visibleMainFoldout = false; + + [NonSerialized] + private UndoParentNode m_owner; + + public void Destroy() + { + m_mainWrapMode = null; + m_additionalWrapOptions.Clear(); + m_additionalWrapOptions = null; + } + + public string AddToDataCollector( ref MasterNodeDataCollector dataCollector ) + { + string inlineSampler = "sampler_"; + + inlineSampler += m_filterMode.ToString(); + inlineSampler += m_mainWrapMode.InlineValue; + + int count = m_additionalWrapOptions.Count; + for( int i = 0; i < count; i++ ) + { + inlineSampler += m_additionalWrapOptions[ i ].InlineValue; + } + return inlineSampler; + } + + void DrawAddRemoveButtons() + { + int count = m_additionalWrapOptions.Count; + if( count < MaxCount && m_owner.GUILayoutButton( string.Empty, UIUtils.PlusStyle, GUILayout.Width( ButtonLayoutWidth ) ) ) + { + m_additionalWrapOptions.Add( new InlineSamplerWrapOptions() ); + EditorGUI.FocusTextInControl( null ); + } + + if( count > 0 && m_owner.GUILayoutButton( string.Empty, UIUtils.MinusStyle, GUILayout.Width( ButtonLayoutWidth ) ) ) + { + m_additionalWrapOptions.RemoveAt( count - 1 ); + EditorGUI.FocusTextInControl( null ); + } + } + + public void Draw( UndoParentNode owner ) + { + m_owner = owner; + NodeUtils.DrawNestedPropertyGroup( ref m_visibleMainFoldout, InlineSamplerStateStr, DrawMain ); + } + + void DrawMain() + { + m_filterMode = (InlineSamplerFilteringMode)m_owner.EditorGUILayoutEnumPopup( m_filterMode ); + + EditorGUILayout.BeginHorizontal(); + m_mainWrapMode.WrapMode = (InlineSamplerWrapMode)m_owner.EditorGUILayoutEnumPopup( m_mainWrapMode.WrapMode ); + m_mainWrapMode.Coordinates = (InlineSamplerWrapCoordinates)m_owner.EditorGUILayoutEnumPopup( m_mainWrapMode.Coordinates ); + EditorGUILayout.EndHorizontal(); + NodeUtils.DrawNestedPropertyGroup( ref m_visibleWrapsFoldout, AdditionalWrapsStr, DrawAdditionalWrapModes, DrawAddRemoveButtons ); + } + + void DrawAdditionalWrapModes() + { + EditorGUILayout.Space(); + int count = m_additionalWrapOptions.Count; + for( int i = 0; i < count; i++ ) + { + float maxWidth = 90; + EditorGUILayout.BeginHorizontal(); + m_additionalWrapOptions[ i ].WrapMode = (InlineSamplerWrapMode)m_owner.EditorGUILayoutEnumPopup( m_additionalWrapOptions[ i ].WrapMode ,GUILayout.MaxWidth( maxWidth ) ); + m_additionalWrapOptions[ i ].Coordinates = (InlineSamplerWrapCoordinates)m_owner.EditorGUILayoutEnumPopup( m_additionalWrapOptions[ i ].Coordinates, GUILayout.MaxWidth( maxWidth ) ); + EditorGUILayout.EndHorizontal(); + } + } + + public void ReadFromString( ref uint index, ref string[] nodeParams ) + { +#if UNITY_2019_3_OR_NEWER + Enum.TryParse( nodeParams[ index++ ], out m_filterMode ); + Enum.TryParse( nodeParams[ index++ ], out m_mainWrapMode.Coordinates ); + + int count = 0; + int.TryParse( nodeParams[ index++ ], out count ); + for( int i = 0; i < count; i++ ) + { + InlineSamplerWrapOptions option = new InlineSamplerWrapOptions(); + + Enum.TryParse( nodeParams[ index++ ], out option.WrapMode ); + Enum.TryParse( nodeParams[ index++ ], out option.Coordinates ); + + m_additionalWrapOptions.Add( option ); + } +#else + m_filterMode =(InlineSamplerFilteringMode) Enum.Parse( typeof( InlineSamplerFilteringMode ), nodeParams[ index++ ] ); + m_mainWrapMode.Coordinates = (InlineSamplerWrapCoordinates)Enum.Parse( typeof( InlineSamplerWrapCoordinates ),nodeParams[ index++ ] ); + + int count = 0; + int.TryParse( nodeParams[ index++ ], out count ); + for( int i = 0; i < count; i++ ) + { + InlineSamplerWrapOptions option = new InlineSamplerWrapOptions(); + + option.WrapMode = ( InlineSamplerWrapMode)Enum.Parse(typeof( InlineSamplerWrapMode ), nodeParams[ index++ ] ); + option.Coordinates = ( InlineSamplerWrapCoordinates)Enum.Parse(typeof( InlineSamplerWrapCoordinates ), nodeParams[ index++ ] ); + + m_additionalWrapOptions.Add( option ); + } +#endif + + } + + public void WriteToString( ref string nodeInfo ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_filterMode ); + + IOUtils.AddFieldValueToString( ref nodeInfo, m_mainWrapMode.WrapMode ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_mainWrapMode.Coordinates ); + + int count = m_additionalWrapOptions.Count; + IOUtils.AddFieldValueToString( ref nodeInfo, count ); + if( count > 0 ) + { + for( int i = 0; i < count; i++ ) + { + IOUtils.AddFieldValueToString( ref nodeInfo, m_additionalWrapOptions[i].WrapMode ); + IOUtils.AddFieldValueToString( ref nodeInfo, m_additionalWrapOptions[i].Coordinates ); + } + } + + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/SamplerStateAutoGenerator.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/SamplerStateAutoGenerator.cs.meta new file mode 100644 index 0000000..896ea53 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/SamplerStateAutoGenerator.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: fe831fe9de481bc4b9df1c1142bb9aa5 +timeCreated: 1580322794 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ShortcutsManager.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ShortcutsManager.cs new file mode 100644 index 0000000..3e48aa8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ShortcutsManager.cs @@ -0,0 +1,215 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + public class ShortcutItem + { + public delegate void ShortcutFunction(); + public ShortcutFunction MyKeyDownFunctionPtr; + public ShortcutFunction MyKeyUpFunctionPtr; + public string Name; + public string Description; + + public ShortcutItem( string name, string description ) + { + Name = name; + Description = description; + } + + public ShortcutItem( string name, string description, ShortcutFunction myKeyDownFunctionPtr, ShortcutFunction myKeyUpFunctionPtr = null ) + { + Name = name; + Description = description; + MyKeyDownFunctionPtr = myKeyDownFunctionPtr; + MyKeyUpFunctionPtr = myKeyUpFunctionPtr; + } + + public void Destroy() + { + MyKeyDownFunctionPtr = null; + MyKeyUpFunctionPtr = null; + } + } + + public class ShortcutsManager + { + public static readonly KeyCode ScrollUpKey = KeyCode.PageUp; + public static readonly KeyCode ScrollDownKey = KeyCode.PageDown; + + + private const string ItemWikiFormat = "*[{0}]: {1}\n"; + private Dictionary> m_editorShortcutsDict = new Dictionary>(); + private Dictionary m_editorNoModifiersShortcutsDict = new Dictionary(); + private List m_editorShortcutsList = new List(); + + private Dictionary m_nodesShortcutsDict = new Dictionary(); + private List m_nodesShortcutsList = new List(); + + public void DumpShortcutsToDisk( string pathname ) + { + if ( !System.IO.Directory.Exists( pathname ) ) + { + System.IO.Directory.CreateDirectory( pathname ); + } + + string list = "=== Full Shortcut List ===\n"; + list += "==== Editor ====\n"; + for ( int i = 0; i < m_editorShortcutsList.Count; i++ ) + { + list += string.Format( ItemWikiFormat, m_editorShortcutsList[ i ].Name, m_editorShortcutsList[ i ].Description ); + } + list += "\n"; + list += "==== Nodes ====\n"; + for ( int i = 0; i < m_nodesShortcutsList.Count; i++ ) + { + list += string.Format( ItemWikiFormat, m_nodesShortcutsList[ i ].Name, m_nodesShortcutsList[ i ].Description ); + } + + string shortcutsPathnames = pathname + "KeyboardShortcuts.txt"; + Debug.Log( " Creating shortcuts file at " + shortcutsPathnames ); + IOUtils.SaveTextfileToDisk( list, shortcutsPathnames, false ); + } + + public void RegisterNodesShortcuts( KeyCode key, string nodeName ) + { + if ( m_nodesShortcutsDict.ContainsKey( key ) ) + { + if ( DebugConsoleWindow.DeveloperMode ) + { + Debug.Log( "Attempting to register an already used node shortcut key " + key ); + } + return; + } + m_nodesShortcutsDict.Add( key, new ShortcutItem( key.ToString(), nodeName ) ); + m_nodesShortcutsList.Add( m_nodesShortcutsDict[ key ] ); + } + + public void RegisterEditorShortcut( bool showOnList, EventModifiers modifiers, KeyCode key, string description, ShortcutItem.ShortcutFunction myKeyDownFunctionPtr, ShortcutItem.ShortcutFunction myKeyUpFunctionPtr = null ) + { + if ( m_editorShortcutsDict.ContainsKey( key ) ) + { + if ( m_editorShortcutsDict[ key ].ContainsKey( modifiers ) ) + { + if ( DebugConsoleWindow.DeveloperMode ) + { + Debug.Log( "Attempting to register an already used editor shortcut key " + key ); + } + return; + } + } + else + { + m_editorShortcutsDict.Add( key, new Dictionary() ); + } + ShortcutItem item = new ShortcutItem( ( ( modifiers == EventModifiers.None || modifiers == EventModifiers.FunctionKey ) ? key.ToString() : modifiers + " + " + key ), description, myKeyDownFunctionPtr, myKeyUpFunctionPtr ); + m_editorShortcutsDict[ key ].Add( modifiers, item ); + if ( showOnList ) + m_editorShortcutsList.Add( item ); + } + + public void RegisterEditorShortcut( bool showOnList, KeyCode key, string description, ShortcutItem.ShortcutFunction myKeyDownFunctionPtr, ShortcutItem.ShortcutFunction myKeyUpFunctionPtr = null ) + { + if ( m_editorNoModifiersShortcutsDict.ContainsKey( key ) ) + { + if ( DebugConsoleWindow.DeveloperMode ) + { + Debug.Log( "Attempting to register an already used editor shortcut key " + key ); + } + return; + } + + ShortcutItem item = new ShortcutItem( key.ToString(), description, myKeyDownFunctionPtr, myKeyUpFunctionPtr ); + m_editorNoModifiersShortcutsDict.Add( key, item ); + if ( showOnList ) + m_editorShortcutsList.Add( item ); + } + + public bool ActivateShortcut( EventModifiers modifiers, KeyCode key, bool isKeyDown ) + { + if ( m_editorShortcutsDict.ContainsKey( key ) ) + { + if ( isKeyDown ) + { + if ( m_editorShortcutsDict[ key ].ContainsKey( modifiers ) ) + { + if ( m_editorShortcutsDict[ key ][ modifiers ].MyKeyDownFunctionPtr != null ) + { + m_editorShortcutsDict[ key ][ modifiers ].MyKeyDownFunctionPtr(); + return true; + } + } + } + else + { + if ( m_editorShortcutsDict[ key ].ContainsKey( modifiers ) ) + { + if ( m_editorShortcutsDict[ key ][ modifiers ].MyKeyUpFunctionPtr != null ) + { + m_editorShortcutsDict[ key ][ modifiers ].MyKeyUpFunctionPtr(); + return true; + } + } + } + } + + if ( modifiers == EventModifiers.None && m_editorNoModifiersShortcutsDict.ContainsKey( key ) ) + { + if ( isKeyDown ) + { + if ( m_editorNoModifiersShortcutsDict[ key ].MyKeyDownFunctionPtr != null ) + { + m_editorNoModifiersShortcutsDict[ key ].MyKeyDownFunctionPtr(); + return true; + } + } + else + { + if ( m_editorNoModifiersShortcutsDict[ key ].MyKeyUpFunctionPtr != null ) + { + m_editorNoModifiersShortcutsDict[ key ].MyKeyUpFunctionPtr(); + return true; + } + } + } + + return false; + } + + public void Destroy() + { + foreach ( KeyValuePair kvp in m_editorNoModifiersShortcutsDict ) + { + kvp.Value.Destroy(); + } + m_editorNoModifiersShortcutsDict.Clear(); + m_editorNoModifiersShortcutsDict = null; + + foreach ( KeyValuePair> kvpKey in m_editorShortcutsDict ) + { + foreach ( KeyValuePair kvpMod in kvpKey.Value ) + { + kvpMod.Value.Destroy(); + } + kvpKey.Value.Clear(); + } + m_editorShortcutsDict.Clear(); + m_editorShortcutsDict = null; + + m_editorShortcutsList.Clear(); + m_editorShortcutsList = null; + + m_nodesShortcutsDict.Clear(); + m_nodesShortcutsDict = null; + + m_nodesShortcutsList.Clear(); + m_nodesShortcutsList = null; + } + + public List AvailableEditorShortcutsList { get { return m_editorShortcutsList; } } + public List AvailableNodesShortcutsList { get { return m_nodesShortcutsList; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ShortcutsManager.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ShortcutsManager.cs.meta new file mode 100644 index 0000000..d08579e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/ShortcutsManager.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 15917e71489c3ca4dbc5fdef9bb37433 +timeCreated: 1487952057 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/TextureArrayCreatorAsset.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/TextureArrayCreatorAsset.cs new file mode 100644 index 0000000..f7c2c78 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/TextureArrayCreatorAsset.cs @@ -0,0 +1,75 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using System.Collections.Generic; +using UnityEngine; + +[Serializable] +public class TextureArrayCreatorAsset : ScriptableObject +{ +#pragma warning disable + [SerializeField] + private int m_selectedSize = 4; + + [SerializeField] + private bool m_lockRatio = true; + + [SerializeField] + private int m_sizeX = 512; + + [SerializeField] + private int m_sizeY = 512; + + [SerializeField] + private bool m_tex3DMode = false; + + [SerializeField] + private bool m_linearMode = false; + + [SerializeField] + private bool m_mipMaps = true; + + [SerializeField] + private TextureWrapMode m_wrapMode = TextureWrapMode.Repeat; + + [SerializeField] + private FilterMode m_filterMode = FilterMode.Bilinear; + + [SerializeField] + private int m_anisoLevel = 1; + + [SerializeField] + private TextureFormat m_selectedFormatEnum = TextureFormat.ARGB32; + + [SerializeField] + private int m_quality = 100; + + [SerializeField] + private string m_folderPath = "Assets/"; + + [SerializeField] + private string m_fileName = "NewTextureArray"; + + [SerializeField] + private bool m_filenameChanged = false; + + [SerializeField] + private List m_allTextures = new List(); + + public int SelectedSize { get { return m_selectedSize; } } + public int SizeX { get { return m_sizeX; } } + public int SizeY { get { return m_sizeY; } } + public bool Tex3DMode { get { return m_tex3DMode; } } + public bool LinearMode { get { return m_linearMode; } } + public bool MipMaps { get { return m_mipMaps; } } + public TextureWrapMode WrapMode { get { return m_wrapMode; } } + public FilterMode FilterMode { get { return m_filterMode; } } + public int AnisoLevel { get { return m_anisoLevel; } } + public TextureFormat SelectedFormatEnum { get { return m_selectedFormatEnum; } } + public int Quality { get { return m_quality; } } + public string FolderPath { get { return m_folderPath; } } + public string FileName { get { return m_fileName; } } + public List AllTextures { get { return m_allTextures; } } +#pragma warning restore +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/TextureArrayCreatorAsset.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/TextureArrayCreatorAsset.cs.meta new file mode 100644 index 0000000..bd40c30 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/TextureArrayCreatorAsset.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 47f91343d4ad12542b3eb9511e2b310c +timeCreated: 1596799060 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/TipsWindow.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/TipsWindow.cs new file mode 100644 index 0000000..1d88835 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/TipsWindow.cs @@ -0,0 +1,148 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System.IO; +using System.Reflection; +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class TipsWindow : MenuParent + { + private static bool m_showWindow = false; + private bool m_dontShowAtStart = false; + + private static List AllTips = new List() { + "You can press W to toggle between a flat and color coded Wires and ports.", + "You can press CTRL+W to toggle between multiline or singleline Wire connections.", + "You can press P to globally open all node Previews.", + "You can press F to Focus your selection, single tap centers the selection while double tap it to also zooms on in.", + "You can press CTRL+F to open a search bar and Find a node by it's title", + "You can press SPACE to open a context menu to add a new node and press TAB or SHIFT+TAB tocycle between the found nodes", + "You can remove a node without breaking the graph connections by pressing ALT and then dragging the node out", + "You can switch two input connections holding CTRL while dragging one input connection into the other", + }; + + int m_currentTip = 0; + + public TipsWindow( AmplifyShaderEditorWindow parentWindow ) : base( parentWindow, 0, 0, 0, 64, "Tips", MenuAnchor.TOP_LEFT, MenuAutoSize.NONE ) + { + //m_dontShowAtStart = EditorPrefs.GetBool( "DontShowTipAtStart", false ); + } + + public override void Draw( Rect parentPosition, Vector2 mousePosition, int mouseButtonId, bool hasKeyboadFocus ) + { + base.Draw( parentPosition, mousePosition, mouseButtonId, hasKeyboadFocus ); + + DrawWindow( mousePosition ); + } + + public void DrawWindow( Vector2 mousePosition ) + { + if( !m_showWindow ) + return; + + Rect windowRect = new Rect( 0, 0, Screen.width, Screen.height ); + Vector2 center = windowRect.center; + windowRect.size = new Vector2( 300, 200 ); + windowRect.center = center; + Color temp = GUI.color; + GUI.color = Color.white; + GUI.Label( windowRect, string.Empty, GUI.skin.FindStyle( "flow node 0" ) ); + + if( Event.current.type == EventType.MouseDown && !windowRect.Contains( mousePosition ) ) + m_showWindow = false; + + Rect titleRect = windowRect; + titleRect.height = 35; + GUI.Label( titleRect, "Quick Tip!", GUI.skin.FindStyle( "TL Selection H2" ) ); + Rect button = titleRect; + button.size = new Vector2( 14, 14 ); + button.y += 2; + button.x = titleRect.xMax - 16; + if( GUI.Button( button, string.Empty, GUI.skin.FindStyle( "WinBtnClose" ) ) ) + CloseWindow(); + + button.y += 100; + if( GUI.Button( button, ">" ) ) + { + m_currentTip++; + if( m_currentTip >= AllTips.Count ) + m_currentTip = 0; + } + + Rect textRect = windowRect; + textRect.yMin = titleRect.yMax; + GUI.Label( textRect, AllTips[ m_currentTip ], GUI.skin.FindStyle( "WordWrappedLabel" ) ); + + Rect footerRect = windowRect; + footerRect.yMin = footerRect.yMax - 18; + footerRect.x += 3; + GUI.Label( footerRect, (m_currentTip + 1) + " of " + AllTips.Count + " tips" ); + footerRect.x += 170; + EditorGUI.BeginChangeCheck(); + m_dontShowAtStart = GUI.Toggle( footerRect, m_dontShowAtStart, "Don't show at start" ); + if( EditorGUI.EndChangeCheck() ) + { + EditorPrefs.SetBool( "DontShowTipAtStart", m_dontShowAtStart ); + } + GUI.color = temp; + + if( Event.current.type == EventType.MouseDown && windowRect.Contains( mousePosition ) ) + { + Event.current.Use(); + ParentWindow.MouseInteracted = true; + } + } + + public override void Destroy() + { + base.Destroy(); + } + + public static void ShowWindow( bool toggle = true ) + { + if( toggle ) + m_showWindow = !m_showWindow; + else + m_showWindow = true; + + //Test(); + //ExportCompiledShaders(); + } + + //public static void Test() + //{ + // Shader shader = UIUtils.CurrentWindow.CurrentGraph.CurrentShader; + // int mode = EditorPrefs.GetInt( "ShaderInspectorPlatformMode", 1 ); + // int mask = EditorPrefs.GetInt( "ShaderInspectorPlatformMask", 524287 ); + // bool strip = EditorPrefs.GetInt( "ShaderInspectorVariantStripping", 1 ) == 0; + // ShaderUtilEx.OpenCompiledShader( shader, mode, mask, strip ); + //} + + //public static void ExportCompiledShaders() + //{ + // Shader shader = UIUtils.CurrentWindow.CurrentGraph.CurrentShader; + // string shaderPath = AssetDatabase.GetAssetPath( shader ); + // SerializedObject so = new SerializedObject( shader ); + // SerializedProperty prop = so.FindProperty( "m_Script" ); + // var compiledShaderString = prop.stringValue; + // Directory.CreateDirectory( Application.dataPath + "/../ShaderSource/" ); + // if( compiledShaderString == null ) + // return; + // var outputPath = Application.dataPath + "/../ShaderSource/" + Path.GetFileNameWithoutExtension( shaderPath ) + "_compiled.shader"; + // var sw = File.CreateText( outputPath ); + // sw.Write( compiledShaderString ); + // sw.Close(); + //} + + public static void CloseWindow() + { + m_showWindow = false; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/TipsWindow.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/TipsWindow.cs.meta new file mode 100644 index 0000000..3d59829 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/TipsWindow.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 565dc3c9725b0db49b7d5ea17d151682 +timeCreated: 1504704078 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/UIUtils.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/UIUtils.cs new file mode 100644 index 0000000..983ff82 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/UIUtils.cs @@ -0,0 +1,3071 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +using System.IO; + +using System.Globalization; +using System.Text.RegularExpressions; + +namespace AmplifyShaderEditor +{ + public enum ASEColorSpace + { + Auto, + Gamma, + Linear + } + + public enum SurfaceInputs + { + DEPTH = 0, + UV_COORDS, + UV2_COORDS, + VIEW_DIR, + COLOR, + SCREEN_POS, + WORLD_POS, + WORLD_REFL, + WORLD_NORMAL, + VFACE, + INTERNALDATA + } + + public enum CustomStyle + { + NodeWindowOff = 0, + NodeWindowOn, + NodeTitle, + NodeHeader, + CommentaryHeader, + ShaderLibraryTitle, + ShaderLibraryAddToList, + ShaderLibraryRemoveFromList, + ShaderLibraryOpenListed, + ShaderLibrarySelectionAsTemplate, + ShaderLibraryItem, + CommentaryTitle, + PortEmptyIcon, + PortFullIcon, + InputPortlabel, + OutputPortLabel, + CommentaryResizeButton, + CommentaryResizeButtonInv, + CommentaryBackground, + MinimizeButton, + MaximizeButton, + NodePropertiesTitle, + ShaderModeTitle, + MaterialModeTitle, + ShaderNoMaterialModeTitle, + PropertyValuesTitle, + ShaderModeNoShader, + MainCanvasTitle, + ShaderBorder, + MaterialBorder, + SamplerTextureRef, + SamplerTextureIcon, + CustomExpressionAddItem, + CustomExpressionRemoveItem, + CustomExpressionSmallAddItem, + CustomExpressionSmallRemoveItem, + ResetToDefaultInspectorButton, + SliderStyle, + ObjectPicker, + NodePropertyPicker, + NodePreviewExpander, + NodePreviewCollapser, + SamplerButton, + SamplerFrame, + CommentarySuperTitle, + MiniButtonTopLeft, + MiniButtonTopMid, + MiniButtonTopRight, + ShaderFunctionBorder, + ShaderFunctionMode, + RightShaderMode, + FlatBackground, + DocumentationLink, + GraphButtonIcon, + GraphButton, + NodeWindowOffSquare, + NodeHeaderSquare, + NodeWindowOnSquare, + ConsoleLogMessage, + ConsoleLogCircle + } + + public enum MasterNodePortCategory + { + Vertex = 1 << 0, + Fragment = 1 << 1, + Tessellation = 1 << 2, + Debug = 1 << 3 + } + + public enum PortGenType + { + NonCustomLighting, + //Normal = 1 << 1, + //Emission = 1 << 2, + //Metallic = 1 << 3, + //Specular = 1 << 4, + CustomLighting + } + + public struct NodeData + { + public MasterNodePortCategory Category; + public int OrderIndex; + public int GraphDepth; + public NodeData( MasterNodePortCategory category ) + { + Category = category; + OrderIndex = 0; + GraphDepth = -1; + } + } + + public struct NodeCastInfo + { + public int NodeId; + public int PortId; + public NodeCastInfo( int nodeId, int portId ) + { + NodeId = nodeId; + PortId = portId; + } + public override string ToString() + { + return NodeId.ToString() + PortId.ToString(); + } + }; + + public struct ButtonClickId + { + public const int LeftMouseButton = 0; + public const int RightMouseButton = 1; + public const int MiddleMouseButton = 2; + } + + public enum ASESelectionMode + { + Shader = 0, + Material, + ShaderFunction + } + + public enum DrawOrder + { + Background, + Default + } + + public enum NodeConnectionStatus + { + Not_Connected = 0, + Connected, + Error, + Island + } + + public enum InteractionMode + { + Target, + Other, + Both + } + + public enum FunctionNodeCategories + { + Custom, + CameraAndScreen, + ConstantsAndProperties, + Functions, + ImageEffects, + Light, + LogicalOperators, + MathOperators, + MatrixOperators, + Miscellaneous, + ObjectTransform, + SurfaceData, + Textures, + Time, + TrigonometryOperators, + UVCoordinates, + VectorOperators, + VertexData + } + + public enum TransformSpaceFrom + { + Object = 0, + World, + View, + Tangent + } + + public enum TransformSpaceTo + { + Object = 0, + World, + View, + Tangent, + Clip + } + + public class UIUtils + { + public static string NewTemplateGUID; + public static int SerializeHelperCounter = 0; + public static bool IgnoreDeselectAll = false; + + public static bool DirtyMask = true; + public static bool Initialized = false; + public static float HeaderMaxHeight; + public static float CurrentHeaderHeight; + public static GUISkin MainSkin = null; + public static GUIStyle PlusStyle; + public static GUIStyle MinusStyle; + public static GUIStyle RangedFloatSliderStyle; + public static GUIStyle RangedFloatSliderThumbStyle; + public static GUIStyle SwitchNodePopUp; + public static GUIStyle PropertyPopUp; + public static GUIStyle ObjectField; + public static GUIStyle PreviewExpander; + public static GUIStyle PreviewCollapser; + public static GUIStyle ObjectFieldThumb; + public static GUIStyle ObjectFieldThumbOverlay; + public static GUIStyle InspectorPopdropdownStyle; + public static GUIStyle InspectorPopdropdownFallback; + public static GUIStyle BoldErrorStyle; + public static GUIStyle BoldWarningStyle; + public static GUIStyle BoldInfoStyle; + public static GUIStyle Separator; + public static GUIStyle ToolbarMainTitle; + public static GUIStyle ToolbarSearchTextfield; + public static GUIStyle ToolbarSearchCancelButton; + public static GUIStyle MiniButtonTopLeft; + public static GUIStyle MiniButtonTopMid; + public static GUIStyle MiniButtonTopRight; + + public static GUIStyle CommentaryTitle; + public static GUIStyle StickyNoteText; + public static GUIStyle InputPortLabel; + public static GUIStyle OutputPortLabel; + + public static GUIStyle MiniObjectFieldThumbOverlay; + public static GUIStyle MiniSamplerButton; + + public static GUIStyle NodeWindowOffSquare; + public static GUIStyle NodeHeaderSquare; + public static GUIStyle NodeWindowOnSquare; + public static GUIStyle InternalDataOnPort; + public static GUIStyle InternalDataBackground; + + public static GUIStyle GraphButtonIcon; + public static GUIStyle GraphButton; + public static GUIStyle GraphDropDown; + + public static GUIStyle EmptyStyle = new GUIStyle(); + + public static GUIStyle ConsoleLogLabel; + public static GUIStyle ConsoleLogMessage; + public static GUIStyle ConsoleLogCircle; + + public static GUIStyle TooltipBox; + public static GUIStyle Box; + public static GUIStyle Button; + public static GUIStyle TextArea; + public static GUIStyle Label; + public static GUIStyle Toggle; + public static GUIStyle Textfield; + + public static GUIStyle UnZoomedNodeTitleStyle; + public static GUIStyle UnZoomedPropertyValuesTitleStyle; + public static GUIStyle UnZoomedInputPortStyle; + public static GUIStyle UnZoomedOutputPortPortStyle; + + // Node Property Menu items + public static GUIStyle MenuItemToggleStyle; + public static GUIStyle MenuItemEnableStyle; + public static GUIStyle MenuItemBackgroundStyle; + public static GUIStyle MenuItemToolbarStyle; + public static GUIStyle MenuItemInspectorDropdownStyle; + + public static GUIStyle FloatIntPickerONOFF; + + public static bool UsingProSkin = false; + + public static Texture ShaderIcon { get { return EditorGUIUtility.IconContent( "Shader Icon" ).image; } } + public static Texture MaterialIcon { get { return EditorGUIUtility.IconContent( "Material Icon" ).image; } } + + //50be8291f9514914aa55c66c49da67cf + public static Texture ShaderFunctionIcon { get { return AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "50be8291f9514914aa55c66c49da67cf" ) ); } } + + public static Texture2D WireNodeSelection = null; + public static Texture2D SliderButton = null; + + public static Texture2D SmallErrorIcon = null; + public static Texture2D SmallWarningIcon = null; + public static Texture2D SmallInfoIcon = null; + + public static Texture2D CheckmarkIcon = null; + public static Texture2D PopupIcon = null; + + public static Texture2D MasterNodeOnTexture = null; + public static Texture2D MasterNodeOffTexture = null; + + public static Texture2D GPUInstancedOnTexture = null; + public static Texture2D GPUInstancedOffTexture = null; + + public static GUIContent LockIconOpen = null; + public static GUIContent LockIconClosed = null; + + public static GUIContent FloatIntIconON = null; + public static GUIContent FloatIntIconOFF = null; + + public static bool ShowContextOnPick = true; + + private static AmplifyShaderEditorWindow m_currentWindow = null; + public static AmplifyShaderEditorWindow CurrentWindow + { + get + { + if( m_currentWindow == null ) + { + for( int i = 0; i < IOUtils.AllOpenedWindows.Count; i++ ) + { + if( IOUtils.AllOpenedWindows[ i ] != null ) + { + m_currentWindow = IOUtils.AllOpenedWindows[ i ]; + } + else + { + //Debug.Log("No Window Found!"); + } + } + } + return m_currentWindow; + } + set { m_currentWindow = value; } + } + + public static Vector2 PortsSize; + public static Vector3 PortsDelta; + public static Vector3 ScaledPortsDelta; + + public static RectOffset RectOffsetZero; + public static RectOffset RectOffsetOne; + public static RectOffset RectOffsetTwo; + public static RectOffset RectOffsetThree; + public static RectOffset RectOffsetFour; + public static RectOffset RectOffsetFive; + public static RectOffset RectOffsetSix; + + public static Material LinearMaterial = null; + public static Shader IntShader = null; + public static Shader FloatShader = null; + public static Shader Vector2Shader = null; + public static Shader Vector3Shader = null; + public static Shader Vector4Shader = null; + public static Shader ColorShader = null; + public static Shader Texture2DShader = null; + public static Shader MaskingShader = null; + + public static bool InhibitMessages = false; + + + private static int m_shaderIndentLevel = 0; + private static string m_shaderIndentTabs = string.Empty; + + //Label Vars + + private static TextAnchor m_alignment; + private static TextClipping m_clipping; + private static bool m_wordWrap; + private static int m_fontSize; + private static Color m_fontColor; + private static FontStyle m_fontStyle; + + + private static string NumericNamePattern = @"^\d"; + private static System.Globalization.TextInfo m_textInfo; + private static string m_latestOpenedFolder = string.Empty; + private static Dictionary m_undoHelper = new Dictionary(); + + private static Dictionary AvailableKeywordsDict = new Dictionary(); + public static readonly string[] AvailableKeywords = + { + "Custom", + "ETC1_EXTERNAL_ALPHA", + "PIXELSNAP_ON", + "UNITY_PASS_FORWARDBASE", + "UNITY_PASS_FORWARDADD", + "UNITY_PASS_DEFERRED", + "UNITY_PASS_SHADOWCASTER", + "UNITY_INSTANCING_ENABLED", + "DIRECTIONAL_COOKIE" + + }; + + private static Dictionary AvailableURPKeywordsDict = new Dictionary(); + public static readonly string[] AvailableURPKeywords = + { + "Custom", + "ETC1_EXTERNAL_ALPHA", + "PIXELSNAP_ON", + "SHADERPASS_EXTRA_PREPASS", + "SHADERPASS_FORWARD", + "SHADERPASS_SHADOWCASTER", + "SHADERPASS_DEPTHONLY", + "SHADERPASS_META", + "SHADERPASS_2D", + "UNITY_INSTANCING_ENABLED", + "DIRECTIONAL_COOKIE" + }; + + //private static Dictionary URPToBultinKeywordsDict = new Dictionary() + //{ + // {"SHADERPASS_FORWARD","UNITY_PASS_FORWARDBASE"}, + // {"SHADERPASS_SHADOWCASTER","UNITY_PASS_SHADOWCASTER"} + //}; + + //private static Dictionary BultinToURPKeywordsDict = new Dictionary() + //{ + // {"UNITY_PASS_FORWARDBASE","SHADERPASS_FORWARD"}, + // {"UNITY_PASS_SHADOWCASTER","SHADERPASS_SHADOWCASTER"} + //}; + + public static readonly string[] CategoryPresets = + { + "", + "Camera And Screen", + "Constants And Properties", + "Functions", + "Image Effects", + "Light", + "Logical Operators", + "Math Operators", + "Matrix Operators", + "Miscellaneous", + "Object Transform", + "Surface Data", + "Textures", + "Time", + "Trigonometry Operators", + "UV Coordinates", + "Vector Operators", + "Vertex Data" + }; + + private static Dictionary m_portCategoryToArrayIdx = new Dictionary + { + { MasterNodePortCategory.Vertex,0}, + { MasterNodePortCategory.Tessellation,0}, + { MasterNodePortCategory.Fragment,1}, + { MasterNodePortCategory.Debug,1} + }; + + private static Dictionary m_reservedPropertyNames = new Dictionary + { + { "UNITY_MATRIX_MVP", string.Empty}, + { "UNITY_MATRIX_MV", string.Empty}, + { "UNITY_MATRIX_V", string.Empty}, + { "UNITY_MATRIX_P", string.Empty}, + { "UNITY_MATRIX_VP", string.Empty}, + { "UNITY_MATRIX_T_MV", string.Empty}, + { "UNITY_MATRIX_IT_MV", string.Empty}, + { "UNITY_MATRIX_TEXTURE0", string.Empty}, + { "UNITY_MATRIX_TEXTURE1", string.Empty}, + { "UNITY_MATRIX_TEXTURE2", string.Empty}, + { "UNITY_MATRIX_TEXTURE3", string.Empty}, + { "_Object2World", string.Empty}, + { "_WorldSpaceCameraPos", string.Empty}, + { "unity_Scale", string.Empty}, + { "_ModelLightColor", string.Empty}, + { "_SpecularLightColor", string.Empty}, + { "_ObjectSpaceLightPos", string.Empty}, + { "_Light2World", string.Empty}, + { "_World2Light", string.Empty}, + { "_Object2Light", string.Empty}, + { "_Time", string.Empty}, + { "_SinTime", string.Empty}, + { "_CosTime", string.Empty}, + { "unity_DeltaTime", string.Empty}, + { "_ProjectionParams", string.Empty}, + { "_ScreenParams", string.Empty} + }; + + private static Dictionary m_exampleMaterialIDs = new Dictionary() + { + //Community + {"2Sided", "8ebbbf2c99a544ca780a2573ef1450fc" }, + {"DissolveBurn", "f144f2d7ff3daf349a2b7f0fd81ec8ac" }, + {"MourEnvironmentGradient", "b64adae401bc073408ac7bff0993c107" }, + {"ForceShield", "0119aa6226e2a4cfdb6c9a5ba9df7820" }, + {"HighlightAnimated", "3d232e7526f6e426cab994cbec1fc287" }, + {"Hologram", "b422c600f1c3941b8bc7e95db33476ad" }, + {"LowPolyWater", "0557703d3791a4286a62f8ee709d5bef"}, + //Official + {"AnimatedFire", "63ea5eae6d954a14292033589d0d4275" }, + {"AnimatedFire-ShaderFunction", "9c6c9fcb82afe874a825a9e680e694b2" }, + {"BurnEffect", "0b019675a8064414b97862a02f644166" }, + {"CubemapReflections", "2c299f827334e9c459a60931aea62260" }, + {"DitheringFade", "610507217b7dcad4d97e6e03e9844171" }, + {"DoubleLayerCustomSurface", "846aec4914103104d99e9e31a217b548" }, + {"NormalExtrusion", "70a5800fbba039f46b438a2055bc6c71" }, + {"MatcapSample", "da8aaaf01fe8f2b46b2fbcb803bd7af4" }, + {"ParallaxMappingIterations", "a0cea9c3f318ac74d89cd09134aad000" }, + {"SandPOM", "905481dc696211145b88dc4bac2545f3" }, + {"ParallaxWindow", "63ad0e7afb1717b4e95adda8904ab0c3" }, + {"LocalPosCutoff", "fed8c9d33a691084c801573feeed5a62" }, + {"ImprovedReadFromAtlasTiled", "941b31b251ea8e74f9198d788a604c9b" }, + {"ReadFromAtlasTiled", "2d5537aa702f24645a1446dc3be92bbf" }, + {"ReflectRefractSoapBubble", "a844987c9f2e7334abaa34f12feda3b9" }, + {"RimLight", "e2d3a4d723cf1dc4eab1d919f3324dbc" }, + {"RefractedShadows", "11818aa28edbeb04098f3b395a5bfc1d" }, + {"TextureArray", "0f572993ab788a346aea45f2f797b7fa" }, + {"ObjectNormalRefraction", "f1a0a645876302547b608ce881c94e6d" }, + {"ShaderBallInterior", "e47ee174f55b6144b9c1a942bb23d82a" }, + {"ScreenSpaceCurvature", "2e794cb9b3900b043a37ba28cdc2f907" }, + {"ScreenSpaceDetail", "3a0163d12fede4d47a1f818a66a115de" }, + {"SimpleNoise", "cc167bc6c2063a14f84a5a77be541194" }, + {"SimpleBlur", "1d283ff911af20e429180bb15d023661" }, + {"SimpleGPUInstancing", "9d609a7c8d00c7c4c9bdcdcdba154b81" }, + {"SimpleLambert", "54b29030f7d7ffe4b84f2f215dede5ac" }, + {"SimpleRefraction", "58c94d2f48acdc049a53b4ca53d6d98a" }, + {"SimpleTexture", "9661085a7d249a54c95078ac8e7ff004" }, + {"SnowAccum", "e3bd639f50ae1a247823079047a8dc01" }, + {"StencilDiffuse01", "9f47f529fdeddd948a2d2722f73e6ac4" }, + {"StencilMask01", "6f870834077d59b44ac421c36f619d59" }, + {"StencilDiffuse02", "11cdb862d5ba68c4eae526765099305b" }, + {"StencilMask02", "344696733b065c646b18c1aa2eacfdb7" }, + {"StencilDiffuse03", "75e851f6c686a5f42ab900222b29355b" }, + {"StencilMask03", "c7b3018ad495c6b479f2e3f8564aa6dc" }, + {"SubstanceExample", "a515e243b476d7e4bb37eb9f82c87a12" }, + {"AnimatedRefraction", "e414af1524d258047bb6b82b8860062c" }, + {"Tessellation", "efb669a245f17384c88824d769d0087c" }, + {"Translucency", "842ba3dcdd461ea48bdcfcea316cbcc4" }, + {"Transmission", "1b21506b7afef734facfc42c596caa7b" }, + {"Transparency", "e323a62068140c2408d5601877e8de2c" }, + {"TriplanarProjection", "663d512de06d4e24db5205c679f394cb" }, + {"TwoSideWithFace", "c953c4b601ba78e4f870d24d038b67f6" }, + {"Ground", "48df9bdf7b922d94bb3167e6db39c943" }, + {"WaterSample", "288137d67ce790e41903020c572ab4d7" }, + {"WorldPosSlices", "013cc03f77f3d034692f902db8928787" } + }; + + private static Dictionary m_textureTypeToCgType = new Dictionary() + { + {TextureType.Texture1D, "sampler1D" }, + {TextureType.Texture2D, "sampler2D" }, + {TextureType.Texture3D, "sampler3D" }, + {TextureType.Cube , "samplerCUBE"}, + {TextureType.Texture2DArray, "sampler2DArray" }, + {TextureType.ProceduralTexture, "sampler2D" } + }; + + + private static Dictionary m_nodeCategoryToColor = new Dictionary() + { + { "Master", new Color( 0.6f, 0.52f, 0.43f, 1.0f )}, + { "Default", new Color( 0.26f, 0.35f, 0.44f, 1.0f )}, + { "Vertex Data", new Color( 0.8f, 0.07f, 0.18f, 1.0f)},//new Color( 0.75f, 0.10f, 0.30f, 1.0f )}, + { "Math Operators", new Color( 0.26f, 0.35f, 0.44f, 1.0f )},//new Color( 0.10f, 0.27f, 0.45f, 1.0f) }, + { "Logical Operators", new Color( 0.0f, 0.55f, 0.45f, 1.0f)},//new Color( 0.11f, 0.28f, 0.47f, 1.0f) }, + { "Trigonometry Operators", new Color( 0.1f, 0.20f, 0.35f, 1.0f)},//new Color( 0.8f, 0.07f, 0.18f, 1.0f)}, + { "Image Effects", new Color( 0.5f, 0.2f, 0.90f, 1.0f)},//new Color( 0.12f, 0.47f, 0.88f, 1.0f)}, + { "Miscellaneous", new Color( 0.49f, 0.32f, 0.60f, 1.0f)}, + { "Camera And Screen", new Color( 0.75f, 0.10f, 0.30f, 1.0f )},//new Color( 0.17f, 0.22f, 0.07f, 1.0f) }, + { "Constants And Properties", new Color( 0.42f, 0.70f, 0.22f, 1.0f) }, + { "Surface Data", new Color( 0.92f, 0.73f, 0.03f, 1.0f)}, + { "Matrix Transform", new Color( 0.09f, 0.43f, 0.2f, 1.0f) }, + { "Time", new Color( 0.25f, 0.25f, 0.25f, 1.0f)},//new Color( 0.89f, 0.59f, 0.0f, 1.0f) }, + { "Functions", new Color( 1.00f, 0.4f, 0.0f, 1.0f) }, + { "Vector Operators", new Color( 0.22f, 0.20f, 0.45f, 1.0f)}, + { "Matrix Operators", new Color( 0.45f, 0.9f, 0.20f, 1.0f) }, + { "Light", new Color( 1.0f, 0.9f, 0.0f, 1.0f) }, + { "Textures", new Color( 0.15f, 0.40f, 0.8f, 1.0f)}, + { "Commentary", new Color( 0.7f, 0.7f, 0.7f, 1.0f)}, + { "UV Coordinates", new Color( 0.89f, 0.59f, 0.0f, 1.0f) }, + { "Object Transform", new Color( 0.15f, 0.4f, 0.49f, 1.0f)}, + { "Vertex Transform", new Color( 0.15f, 0.4f, 0.49f, 1.0f)} + }; + + private static Dictionary> m_toolButtonTooltips = new Dictionary> + { + { ToolButtonType.New, new List() { "Create new shader." } }, + { ToolButtonType.Open, new List() { "Open existing shader." } }, + { ToolButtonType.Save, new List() { "No changes to save.", "Save current changes." } }, + { ToolButtonType.Library, new List() { "Lists custom shader selection." } }, + { ToolButtonType.Options, new List() { "Open Options menu." } }, + { ToolButtonType.Update, new List() { "Open or create a new shader first.", "Click to enable to update current shader.", "Shader up-to-date." } }, + { ToolButtonType.Live, new List() { "Open or create a new shader first.", "Click to enable live shader preview", "Click to enable live shader and material preview." , "Live preview active, click to disable." } }, + { ToolButtonType.TakeScreenshot, new List() { "Take screenshot", "Take screenshot" }}, + { ToolButtonType.Share, new List() { "Share selection", "Share selection" }}, + { ToolButtonType.CleanUnusedNodes, new List() { "No unconnected nodes to clean.", "Remove all nodes not connected( directly or indirectly) to the master node." }}, + { ToolButtonType.Help, new List() { "Show help window." } }, + { ToolButtonType.FocusOnMasterNode,new List() { "Focus on active master node." } }, + { ToolButtonType.FocusOnSelection, new List() { "Focus on selection fit to screen ( if none selected )." } } + }; + + private static Color[] m_dataTypeToColorMonoMode = { new Color( 0.5f, 0.5f, 0.5f, 1.0f ), Color.white }; + private static Dictionary m_dataTypeToColor = new Dictionary( new WirePortDataTypeComparer() ) + { + { WirePortDataType.OBJECT, Color.white}, + { WirePortDataType.SAMPLERSTATE,Color.white}, + { WirePortDataType.FLOAT, Color.gray}, + { WirePortDataType.FLOAT2, new Color(1f,1f,0f,1f)}, + { WirePortDataType.FLOAT3, new Color(0.5f,0.5f,1f,1f)}, + { WirePortDataType.FLOAT4, new Color(1f,0,1f,1f)}, + { WirePortDataType.FLOAT3x3, new Color(0.5f,1f,0.5f,1f)}, + { WirePortDataType.FLOAT4x4, new Color(0.5f,1f,0.5f,1f)}, + { WirePortDataType.COLOR, new Color(1f,0,1f,1f)}, + { WirePortDataType.INT, Color.white}, + { WirePortDataType.SAMPLER1D, new Color(1f,0.5f,0f,1f)}, + { WirePortDataType.SAMPLER2D, new Color(1f,0.5f,0f,1f)}, + { WirePortDataType.SAMPLER3D, new Color(1f,0.5f,0f,1f)}, + { WirePortDataType.SAMPLERCUBE, new Color(1f,0.5f,0f,1f)}, + { WirePortDataType.SAMPLER2DARRAY, new Color(1f,0.5f,0f,1f)} + }; + + private static Dictionary m_dataTypeToName = new Dictionary() + { + { WirePortDataType.OBJECT, "Generic Object"}, + { WirePortDataType.FLOAT, "Float"}, + { WirePortDataType.FLOAT2, "Vector2"}, + { WirePortDataType.FLOAT3, "Vector3"}, + { WirePortDataType.FLOAT4, "Vector4"}, + { WirePortDataType.FLOAT3x3, "3x3 Matrix"}, + { WirePortDataType.FLOAT4x4, "4x4 Matrix"}, + { WirePortDataType.COLOR, "Color"}, + { WirePortDataType.INT, "Int"}, + { WirePortDataType.SAMPLER1D, "Sampler1D"}, + { WirePortDataType.SAMPLER2D, "Sampler2D"}, + { WirePortDataType.SAMPLER3D, "Sampler3D"}, + { WirePortDataType.SAMPLERCUBE, "SamplerCUBE"}, + { WirePortDataType.SAMPLER2DARRAY, "Sampler2DArray"}, + { WirePortDataType.SAMPLERSTATE,"Sampler State"}, + }; + + private static Dictionary m_inputTypeDeclaration = new Dictionary() + { + { SurfaceInputs.DEPTH, "{0} Depth : SV_Depth"}, + { SurfaceInputs.UV_COORDS, "{0}2 uv"},// texture uv must have uv or uv2 followed by the texture name + { SurfaceInputs.UV2_COORDS, "{0}2 uv2"}, + { SurfaceInputs.VIEW_DIR, "{0}3 viewDir"}, + { SurfaceInputs.COLOR, Constants.ColorInput}, + { SurfaceInputs.SCREEN_POS, "{0}4 screenPos"}, + { SurfaceInputs.WORLD_POS, "{0}3 worldPos"}, + { SurfaceInputs.WORLD_REFL, "{0}3 worldRefl"}, + { SurfaceInputs.WORLD_NORMAL,"{0}3 worldNormal"}, + { SurfaceInputs.VFACE, Constants.VFaceInput}, + { SurfaceInputs.INTERNALDATA, Constants.InternalData} + }; + + private static Dictionary m_inputTypeName = new Dictionary() + { + { SurfaceInputs.DEPTH, "Depth"}, + { SurfaceInputs.UV_COORDS, "uv"},// texture uv must have uv or uv2 followed by the texture name + { SurfaceInputs.UV2_COORDS, "uv2"}, + { SurfaceInputs.VIEW_DIR, "viewDir"}, + { SurfaceInputs.COLOR, Constants.ColorVariable}, + { SurfaceInputs.SCREEN_POS, "screenPos"}, + { SurfaceInputs.WORLD_POS, "worldPos"}, + { SurfaceInputs.WORLD_REFL, "worldRefl"}, + { SurfaceInputs.WORLD_NORMAL, "worldNormal"}, + { SurfaceInputs.VFACE, Constants.VFaceVariable}, + }; + + private static Dictionary m_precisionTypeToCg = new Dictionary() + { + {PrecisionType.Float, "float"}, + {PrecisionType.Half, "half"}, + {PrecisionType.Inherit, "float"} + }; + + private static Dictionary m_qualifierToCg = new Dictionary() + { + { VariableQualifiers.In, string.Empty}, + {VariableQualifiers.Out, "out"}, + {VariableQualifiers.InOut, "inout"} + }; + + private static Dictionary m_precisionWirePortToCgType = new Dictionary() + { + {WirePortDataType.FLOAT, "{0}"}, + {WirePortDataType.FLOAT2, "{0}2"}, + {WirePortDataType.FLOAT3, "{0}3"}, + {WirePortDataType.FLOAT4, "{0}4"}, + {WirePortDataType.FLOAT3x3, "{0}3x3"}, + {WirePortDataType.FLOAT4x4, "{0}4x4"}, + {WirePortDataType.COLOR, "{0}4"}, + {WirePortDataType.INT, "int"}, + {WirePortDataType.SAMPLER1D, "sampler1D"}, + {WirePortDataType.SAMPLER2D, "sampler2D"}, + {WirePortDataType.SAMPLER3D, "sampler3D"}, + {WirePortDataType.SAMPLERCUBE, "samplerCUBE"}, + {WirePortDataType.SAMPLER2DARRAY, "sampler2DArray"}, + {WirePortDataType.SAMPLERSTATE, "SamplerState"} + }; + + private static Dictionary m_precisionWirePortToStandardMacroType = new Dictionary() + { + {WirePortDataType.FLOAT, "{0}"}, + {WirePortDataType.FLOAT2, "{0}2"}, + {WirePortDataType.FLOAT3, "{0}3"}, + {WirePortDataType.FLOAT4, "{0}4"}, + {WirePortDataType.FLOAT3x3, "{0}3x3"}, + {WirePortDataType.FLOAT4x4, "{0}4x4"}, + {WirePortDataType.COLOR, "{0}4"}, + {WirePortDataType.INT, "int"}, + {WirePortDataType.SAMPLER1D, "sampler1D"}, + {WirePortDataType.SAMPLER2D, "UNITY_DECLARE_TEX2D_NOSAMPLER("}, + {WirePortDataType.SAMPLER3D, "UNITY_DECLARE_TEX3D_NOSAMPLER("}, + {WirePortDataType.SAMPLERCUBE, "UNITY_DECLARE_TEXCUBE_NOSAMPLER("}, + {WirePortDataType.SAMPLER2DARRAY, "UNITY_DECLARE_TEX2DARRAY_NOSAMPLER("}, + {WirePortDataType.SAMPLERSTATE, "SamplerState"} + }; + + private static Dictionary m_precisionWirePortToSRPMacroType = new Dictionary() + { + {WirePortDataType.FLOAT, "{0}"}, + {WirePortDataType.FLOAT2, "{0}2"}, + {WirePortDataType.FLOAT3, "{0}3"}, + {WirePortDataType.FLOAT4, "{0}4"}, + {WirePortDataType.FLOAT3x3, "{0}3x3"}, + {WirePortDataType.FLOAT4x4, "{0}4x4"}, + {WirePortDataType.COLOR, "{0}4"}, + {WirePortDataType.INT, "int"}, + {WirePortDataType.SAMPLER1D, "sampler1D"}, + {WirePortDataType.SAMPLER2D, "TEXTURE2D("}, + {WirePortDataType.SAMPLER3D, "TEXTURE3D("}, + {WirePortDataType.SAMPLERCUBE, "TEXTURECUBE("}, + {WirePortDataType.SAMPLER2DARRAY, "TEXTURE2D_ARRAY("}, + {WirePortDataType.SAMPLERSTATE, "SamplerState"} + }; + + private static Dictionary m_wirePortToCgType = new Dictionary() + { + { WirePortDataType.FLOAT, "float"}, + {WirePortDataType.FLOAT2, "float2"}, + {WirePortDataType.FLOAT3, "float3"}, + {WirePortDataType.FLOAT4, "float4"}, + {WirePortDataType.FLOAT3x3, "float3x3"}, + {WirePortDataType.FLOAT4x4, "float4x4"}, + {WirePortDataType.COLOR, "float4"}, + {WirePortDataType.INT, "int"}, + {WirePortDataType.SAMPLER1D, "sampler1D"}, + {WirePortDataType.SAMPLER2D, "sampler2D"}, + {WirePortDataType.SAMPLER3D, "sampler3D"}, + {WirePortDataType.SAMPLERCUBE, "samplerCUBE"}, + {WirePortDataType.SAMPLER2DARRAY, "sampler2DArray"}, + {WirePortDataType.UINT, "uint"}, + {WirePortDataType.SAMPLERSTATE, "SamplerState"} + }; + + private static Dictionary m_keycodeToString = new Dictionary() + { + {KeyCode.Alpha0,"0" }, + {KeyCode.Alpha1,"1" }, + {KeyCode.Alpha2,"2" }, + {KeyCode.Alpha3,"3" }, + {KeyCode.Alpha4,"4" }, + {KeyCode.Alpha5,"5" }, + {KeyCode.Alpha6,"6" }, + {KeyCode.Alpha7,"7" }, + {KeyCode.Alpha8,"8" }, + {KeyCode.Alpha9,"9" } + }; + + private static Dictionary m_wireStatusToColor = new Dictionary() + { + { WireStatus.Default,new Color(0.7f,0.7f,0.7f,1.0f) }, + {WireStatus.Highlighted,Color.yellow }, + {WireStatus.Selected,Color.white} + }; + + private static Dictionary m_autoSwizzle = new Dictionary() + { + {WirePortDataType.FLOAT, ".x"}, + {WirePortDataType.FLOAT2, ".xy"}, + {WirePortDataType.FLOAT3, ".xyz"}, + {WirePortDataType.FLOAT4, ".xyzw"} + }; + + private static Dictionary m_unityNativeShaderPaths = new Dictionary + { + { "Resources/unity_builtin_extra", true }, + { "Library/unity default resources", true } + }; + + private static Dictionary m_portPriority = new Dictionary() + { + {WirePortDataType.OBJECT, 0}, + {WirePortDataType.SAMPLERSTATE, 0}, + {WirePortDataType.SAMPLER1D, 0}, + {WirePortDataType.SAMPLER2D, 0}, + {WirePortDataType.SAMPLER3D, 0}, + {WirePortDataType.SAMPLERCUBE, 0}, + {WirePortDataType.SAMPLER2DARRAY, 0}, + {WirePortDataType.FLOAT3x3, 1}, + {WirePortDataType.FLOAT4x4, 2}, + {WirePortDataType.INT, 3}, + {WirePortDataType.UINT, 3}, + {WirePortDataType.FLOAT, 4}, + {WirePortDataType.FLOAT2, 5}, + {WirePortDataType.FLOAT3, 6}, + {WirePortDataType.FLOAT4, 7}, + {WirePortDataType.COLOR, 7} + }; + + private static readonly string IncorrectInputConnectionErrorMsg = "Input Port {0} from node {1} has type {2}\nwhich is incompatible with connection of type {3} from port {4} on node {5}"; + private static readonly string IncorrectOutputConnectionErrorMsg = "Output Port {0} from node {1} has type {2}\nwhich is incompatible with connection of type {3} from port {4} on node {5}"; + private static readonly string NoVertexModeNodeWarning = "{0} is unable to generate code in vertex function"; + + private static float SwitchFixedHeight; + private static float SwitchFontSize; + private static RectOffset SwitchNodeBorder; + private static RectOffset SwitchNodeMargin; + private static RectOffset SwitchNodeOverflow; + private static RectOffset SwitchNodePadding; + + public static void ForceExampleShaderCompilation() + { + CurrentWindow.ForceMaterialsToUpdate( ref m_exampleMaterialIDs ); + + } + + public static void Destroy() + { + if( IOUtils.AllOpenedWindows != null && IOUtils.AllOpenedWindows.Count > 0 ) + { + return; + } + else + { + IOUtils.AllOpenedWindows.Clear(); + } + + Initialized = false; + PlusStyle = null; + MinusStyle = null; + m_textInfo = null; + RangedFloatSliderStyle = null; + RangedFloatSliderThumbStyle = null; + PropertyPopUp = null; + ObjectField = null; + PreviewExpander = null; + PreviewCollapser = null; + MenuItemToggleStyle = null; + MenuItemEnableStyle = null; + MenuItemBackgroundStyle = null; + MenuItemToolbarStyle = null; + MenuItemInspectorDropdownStyle = null; + ObjectFieldThumb = null; + ObjectFieldThumbOverlay = null; + InspectorPopdropdownStyle = null; + InspectorPopdropdownFallback = null; + TooltipBox = null; + UnZoomedNodeTitleStyle = null; + UnZoomedPropertyValuesTitleStyle = null; + UnZoomedInputPortStyle = null; + UnZoomedOutputPortPortStyle = null; + ToolbarSearchTextfield = null; + ToolbarSearchCancelButton = null; + FloatIntPickerONOFF = null; + Box = null; + Button = null; + TextArea = null; + Label = null; + Toggle = null; + Textfield = null; + + CommentaryTitle = null; + StickyNoteText = null; + InputPortLabel = null; + OutputPortLabel = null; + + IntShader = null; + FloatShader = null; + Vector2Shader = null; + Vector3Shader = null; + Vector4Shader = null; + ColorShader = null; + Texture2DShader = null; + + MaskingShader = null; + + BoldErrorStyle = null; + BoldWarningStyle = null; + BoldInfoStyle = null; + Separator = null; + ToolbarMainTitle = null; + + GraphButtonIcon = null; + GraphButton = null; + GraphDropDown = null; + + ConsoleLogLabel = null; + ConsoleLogMessage = null; + ConsoleLogCircle = null; + + MiniButtonTopLeft = null; + MiniButtonTopMid = null; + MiniButtonTopRight = null; + + NodeWindowOffSquare = null; + NodeHeaderSquare = null; + NodeWindowOnSquare = null; + InternalDataOnPort = null; + InternalDataBackground = null; + + MiniObjectFieldThumbOverlay = null; + MiniSamplerButton = null; + + Resources.UnloadAsset( SmallErrorIcon ); + SmallErrorIcon = null; + + Resources.UnloadAsset( SmallWarningIcon ); + SmallWarningIcon = null; + + Resources.UnloadAsset( SmallInfoIcon ); + SmallInfoIcon = null; + + LockIconOpen = null; + LockIconClosed = null; + + FloatIntIconON = null; + FloatIntIconOFF = null; + + Resources.UnloadAsset( CheckmarkIcon ); + CheckmarkIcon = null; + + Resources.UnloadAsset( PopupIcon ); + PopupIcon = null; + + Resources.UnloadAsset( MasterNodeOnTexture ); + MasterNodeOnTexture = null; + + Resources.UnloadAsset( MasterNodeOffTexture ); + MasterNodeOffTexture = null; + + Resources.UnloadAsset( GPUInstancedOnTexture ); + GPUInstancedOnTexture = null; + + Resources.UnloadAsset( GPUInstancedOffTexture ); + GPUInstancedOffTexture = null; + + MainSkin = null; + + if( LinearMaterial != null ) + GameObject.DestroyImmediate( LinearMaterial ); + + LinearMaterial = null; + + if( m_undoHelper == null ) + { + m_undoHelper.Clear(); + m_undoHelper = null; + } + ASEMaterialInspector.Instance = null; + } + + public static void ResetMainSkin() + { + if( (object)MainSkin != null ) + { + CurrentHeaderHeight = HeaderMaxHeight; + ScaledPortsDelta = PortsDelta; + MainSkin.textField.fontSize = (int)( Constants.TextFieldFontSize ); + MainSkin.label.fontSize = (int)( Constants.DefaultFontSize ); + MainSkin.customStyles[ (int)CustomStyle.NodeTitle ].fontSize = (int)( Constants.DefaultTitleFontSize ); + + InputPortLabel.fontSize = (int)( Constants.DefaultFontSize ); + OutputPortLabel.fontSize = (int)( Constants.DefaultFontSize ); + CommentaryTitle.fontSize = (int)( Constants.DefaultFontSize ); + StickyNoteText.fontSize = (int)( Constants.DefaultFontSize ); + } + } + + public static void InitMainSkin() + { + MainSkin = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( IOUtils.MainSkinGUID ), typeof( GUISkin ) ) as GUISkin; + Initialized = true; + Texture2D portTex = GetCustomStyle( CustomStyle.PortEmptyIcon ).normal.background; + PortsSize = new Vector2( portTex.width, portTex.height ); + PortsDelta = new Vector3( 0.5f * PortsSize.x, 0.5f * PortsSize.y ); + HeaderMaxHeight = MainSkin.customStyles[ (int)CustomStyle.NodeHeader ].normal.background.height; + + RectOffsetZero = new RectOffset( 0, 0, 0, 0 ); + RectOffsetOne = new RectOffset( 1, 1, 1, 1 ); + RectOffsetTwo = new RectOffset( 2, 2, 2, 2 ); + RectOffsetThree = new RectOffset( 3, 3, 3, 3 ); + RectOffsetFour = new RectOffset( 4, 4, 4, 4 ); + RectOffsetFive = new RectOffset( 5, 5, 5, 5 ); + RectOffsetSix = new RectOffset( 6, 6, 6, 6 ); + + PropertyPopUp = GetCustomStyle( CustomStyle.NodePropertyPicker ); + ObjectField = new GUIStyle( (GUIStyle)"ObjectField" ); + PreviewExpander = GetCustomStyle( CustomStyle.NodePreviewExpander ); + PreviewCollapser = GetCustomStyle( CustomStyle.NodePreviewCollapser ); + + WireNodeSelection = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "bfe0b03d5d60cea4f9d4b2d1d121e592" ), typeof( Texture2D ) ) as Texture2D; + SliderButton = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "dd563e33152bb6443b099b4139ceecb9" ), typeof( Texture2D ) ) as Texture2D; + + SmallErrorIcon = EditorGUIUtility.Load( "icons/d_console.erroricon.sml.png" ) as Texture2D; + SmallWarningIcon = EditorGUIUtility.Load( "icons/d_console.warnicon.sml.png" ) as Texture2D; + SmallInfoIcon = EditorGUIUtility.Load( "icons/d_console.infoicon.sml.png" ) as Texture2D; + + LockIconOpen = new GUIContent( EditorGUIUtility.IconContent( "LockIcon-On" ) ); + LockIconOpen.tooltip = "Click to unlock and customize the variable name"; + LockIconClosed = new GUIContent( EditorGUIUtility.IconContent( "LockIcon" ) ); + LockIconClosed.tooltip = "Click to lock and auto-generate the variable name"; + + if( UsingProSkin ) + { + FloatIntIconON = new GUIContent( EditorGUIUtility.IconContent( "CircularToggle_ON" ) ); + FloatIntIconOFF = new GUIContent( EditorGUIUtility.IconContent( "CircularToggle_OFF" ) ); + } + else + { + FloatIntIconON = new GUIContent( ( AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "ac0860a6a77e29d4091ba790a17daa0f" ), typeof( Texture2D ) ) as Texture2D ) ); + FloatIntIconOFF = new GUIContent( ( AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "1aaca50d084b0bb43854f075ce2f302b" ), typeof( Texture2D ) ) as Texture2D ) ); + } + + CommentaryTitle = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.CommentaryTitle ] ); + StickyNoteText = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.CommentaryTitle ] ); + StickyNoteText.wordWrap = true; + StickyNoteText.alignment = TextAnchor.UpperLeft; + InputPortLabel = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.InputPortlabel ] ); + OutputPortLabel = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.OutputPortLabel ] ); + + CheckmarkIcon = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "e9c4642eaa083a54ab91406d8449e6ac" ), typeof( Texture2D ) ) as Texture2D; + PopupIcon = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "d2384a227b4ac4943b73c8151393e502" ), typeof( Texture2D ) ) as Texture2D; + + BoldErrorStyle = new GUIStyle( (GUIStyle)"BoldLabel" ); + BoldErrorStyle.normal.textColor = Color.red; + BoldErrorStyle.alignment = TextAnchor.MiddleCenter; + BoldWarningStyle = new GUIStyle( (GUIStyle)"BoldLabel" ); + BoldWarningStyle.normal.textColor = Color.yellow; + BoldWarningStyle.alignment = TextAnchor.MiddleCenter; + BoldInfoStyle = new GUIStyle( (GUIStyle)"BoldLabel" ); + BoldInfoStyle.normal.textColor = Color.white; + BoldInfoStyle.alignment = TextAnchor.MiddleCenter; + + ToolbarMainTitle = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.MainCanvasTitle ] ); + Separator = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.FlatBackground ] ); + MiniButtonTopLeft = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.MiniButtonTopLeft ] ); + MiniButtonTopMid = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.MiniButtonTopMid ] ); + MiniButtonTopRight = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.MiniButtonTopRight ] ); + + InternalDataOnPort = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.NodeTitle ] ); + InternalDataOnPort.fontSize = 8; + InternalDataOnPort.fontStyle = FontStyle.BoldAndItalic; + InternalDataBackground = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.NodeWindowOffSquare ] ); + InternalDataBackground.normal.background = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "330fd0c8f074a3c4f8042114a61a73d9" ), typeof( Texture2D ) ) as Texture2D; + InternalDataBackground.overflow = RectOffsetOne; + + MiniObjectFieldThumbOverlay = new GUIStyle( (GUIStyle)"ObjectFieldThumbOverlay" ); + MiniSamplerButton = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.SamplerButton ] ); + + m_textInfo = new System.Globalization.CultureInfo( "en-US", false ).TextInfo; + RangedFloatSliderStyle = new GUIStyle( GUI.skin.horizontalSlider ); + RangedFloatSliderThumbStyle = new GUIStyle( GUI.skin.horizontalSliderThumb ); + RangedFloatSliderThumbStyle.normal.background = SliderButton; + RangedFloatSliderThumbStyle.active.background = null; + RangedFloatSliderThumbStyle.hover.background = null; + RangedFloatSliderThumbStyle.focused.background = null; + RangedFloatSliderThumbStyle.overflow = new RectOffset( 1, 1, -4, 4 ); + RangedFloatSliderThumbStyle.margin = RectOffsetZero; + + SwitchNodePopUp = new GUIStyle( (GUIStyle)"Popup" ); + // RectOffset cannot be initiliazed on constructor + SwitchNodeBorder = new RectOffset( 4, 15, 3, 3 ); + SwitchNodeMargin = new RectOffset( 4, 4, 3, 3 ); + SwitchNodeOverflow = new RectOffset( 0, 0, -1, 2 ); + SwitchNodePadding = new RectOffset( 6, 14, 2, 3 ); + SwitchFixedHeight = 18; + SwitchFontSize = 10; + + GraphButtonIcon = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.GraphButtonIcon ] ); + GraphButton = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.GraphButton ] ); + GraphDropDown = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.GraphButton ] ); + GraphDropDown.padding.right = 20; + + Box = new GUIStyle( MainSkin.box ); + Button = new GUIStyle( GUI.skin.button ); + TextArea = new GUIStyle( GUI.skin.textArea ); + Label = new GUIStyle( GUI.skin.label ); + Toggle = new GUIStyle( GUI.skin.toggle ); + Textfield = new GUIStyle( GUI.skin.textField ); + //ShaderIcon = EditorGUIUtility.IconContent( "Shader Icon" ).image; + //MaterialIcon = EditorGUIUtility.IconContent( "Material Icon" ).image; + + ConsoleLogLabel = new GUIStyle( GUI.skin.label ); + ConsoleLogMessage = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.ConsoleLogMessage ] ); + ConsoleLogCircle = new GUIStyle( MainSkin.customStyles[ (int)CustomStyle.ConsoleLogCircle ] ); + + NodeWindowOffSquare = GetCustomStyle( CustomStyle.NodeWindowOffSquare ); + NodeHeaderSquare = GetCustomStyle( CustomStyle.NodeHeaderSquare ); + NodeWindowOnSquare = GetCustomStyle( CustomStyle.NodeWindowOnSquare ); + + UnZoomedNodeTitleStyle = new GUIStyle( GetCustomStyle( CustomStyle.NodeTitle ) ); + UnZoomedNodeTitleStyle.fontSize = 13; + + UnZoomedPropertyValuesTitleStyle = new GUIStyle( GetCustomStyle( CustomStyle.PropertyValuesTitle ) ); + UnZoomedPropertyValuesTitleStyle.fontSize = 11; + + UnZoomedInputPortStyle = new GUIStyle( InputPortLabel ); + UnZoomedInputPortStyle.fontSize = (int)Constants.DefaultFontSize; + + UnZoomedOutputPortPortStyle = new GUIStyle( OutputPortLabel ); + UnZoomedOutputPortPortStyle.fontSize = (int)Constants.DefaultFontSize; + + ObjectFieldThumb = new GUIStyle( (GUIStyle)"ObjectFieldThumb" ); + ObjectFieldThumbOverlay = new GUIStyle( (GUIStyle)"ObjectFieldThumbOverlay" ); + + FloatIntPickerONOFF = new GUIStyle( "metimelabel" ); + FloatIntPickerONOFF.padding.left = -2; + FloatIntPickerONOFF.margin = new RectOffset(0,2,2,2); + + TooltipBox = new GUIStyle( (GUIStyle)"Tooltip" ); + TooltipBox.richText = true; + + MasterNodeOnTexture = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( IOUtils.MasterNodeOnTextureGUID ) ); + MasterNodeOffTexture = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( IOUtils.MasterNodeOnTextureGUID ) ); + + GPUInstancedOnTexture = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( IOUtils.GPUInstancedOnTextureGUID ) ); + GPUInstancedOffTexture = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( IOUtils.GPUInstancedOffTextureGUID ) ); + + CheckNullMaterials(); + + UsingProSkin = EditorGUIUtility.isProSkin; + FetchMenuItemStyles(); + } + + public static bool IsLoading + { + get { return CurrentWindow.OutsideGraph.IsLoading; } + } + + public static void CheckNullMaterials() + { + if( LinearMaterial == null ) + { + Shader linearShader = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "e90ef6ea05743b84baf9549874c52e47" ) ); //linear previews + LinearMaterial = new Material( linearShader ); + } + + if( IntShader == null ) + IntShader = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "0f64d695b6ffacc469f2dd31432a232a" ) ); //int + if( FloatShader == null ) + FloatShader = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "d9ca47581ac157145bff6f72ac5dd73e" ) ); //ranged float + if( Vector2Shader == null ) + Vector2Shader = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "88b4191eb06084d4da85d1dd2f984085" ) ); //vector2 + if( Vector3Shader == null ) + Vector3Shader = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "8a44d38f06246bf48944b3f314bc7920" ) ); //vector3 + if( Vector4Shader == null ) + Vector4Shader = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "aac241d0e47a5a84fbd2edcd640788dc" ) ); //vector4 + if( ColorShader == null ) + ColorShader = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "6cf365ccc7ae776488ae8960d6d134c3" ) ); //color node + if( MaskingShader == null ) + MaskingShader = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "9c34f18ebe2be3e48b201b748c73dec0" ) ); //masking shader + if( Texture2DShader == null ) + Texture2DShader = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "13bd295c44d04e1419f20f792d331e33" ) ); //texture2d shader + } + + private static void FetchMenuItemStyles() + { + ObjectFieldThumb = new GUIStyle( (GUIStyle)"ObjectFieldThumb" ); + ObjectFieldThumbOverlay = new GUIStyle( (GUIStyle)"ObjectFieldThumbOverlay" ); + MenuItemToggleStyle = new GUIStyle( (GUIStyle)"foldout" ); + MenuItemEnableStyle = UsingProSkin ? new GUIStyle( (GUIStyle)"OL ToggleWhite" ) : new GUIStyle( (GUIStyle)"OL Toggle" ); + MenuItemBackgroundStyle = new GUIStyle( (GUIStyle)"TE NodeBackground" ); + MenuItemToolbarStyle = new GUIStyle( (GUIStyle)"toolbarbutton" ) { fixedHeight = 20 }; + MenuItemInspectorDropdownStyle = new GUIStyle( (GUIStyle)"toolbardropdown" ) { fixedHeight = 20 }; + MenuItemInspectorDropdownStyle.margin.bottom = 2; + + + InspectorPopdropdownStyle = new GUIStyle( GUI.skin.GetStyle( "PopupCurveDropdown" ) ); + InspectorPopdropdownStyle.alignment = TextAnchor.MiddleRight; + InspectorPopdropdownStyle.border.bottom = 16; + + InspectorPopdropdownFallback = new GUIStyle( InspectorPopdropdownStyle ); + InspectorPopdropdownFallback.overflow = new RectOffset( 0, -5, 0, 0 ); + + PlusStyle = ( EditorGUIUtility.isProSkin ) ? new GUIStyle( GetCustomStyle( CustomStyle.CustomExpressionAddItem ) ) : new GUIStyle( (GUIStyle)"OL Plus" ); + PlusStyle.imagePosition = ImagePosition.ImageOnly; + PlusStyle.overflow = new RectOffset( -2, 0, -4, 0 ); + + MinusStyle = ( EditorGUIUtility.isProSkin ) ? new GUIStyle( GetCustomStyle( CustomStyle.CustomExpressionRemoveItem ) ) : new GUIStyle( (GUIStyle)"OL Minus" ); + MinusStyle.contentOffset = Vector2.zero; + MinusStyle.imagePosition = ImagePosition.ImageOnly; + MinusStyle.overflow = new RectOffset( -2, 0, -4, 0 ); + + ToolbarSearchTextfield = new GUIStyle( (GUIStyle)"ToolbarSeachTextField" ); + ToolbarSearchCancelButton = new GUIStyle( (GUIStyle)"ToolbarSeachCancelButton" ); + } + + public static void UpdateMainSkin( DrawInfo drawInfo ) + { + CurrentHeaderHeight = HeaderMaxHeight * drawInfo.InvertedZoom; + ScaledPortsDelta = drawInfo.InvertedZoom * PortsDelta; + MainSkin.textField.fontSize = (int)( Constants.TextFieldFontSize * drawInfo.InvertedZoom ); + MainSkin.label.fontSize = (int)( Constants.DefaultFontSize * drawInfo.InvertedZoom ); + + MainSkin.customStyles[ (int)CustomStyle.NodeTitle ].fontSize = (int)( Constants.DefaultTitleFontSize * drawInfo.InvertedZoom ); + MainSkin.customStyles[ (int)CustomStyle.PropertyValuesTitle ].fontSize = (int)( Constants.PropertiesTitleFontSize * drawInfo.InvertedZoom ); + + InputPortLabel.fontSize = (int)( Constants.DefaultFontSize * drawInfo.InvertedZoom ); + OutputPortLabel.fontSize = (int)( Constants.DefaultFontSize * drawInfo.InvertedZoom ); + CommentaryTitle.fontSize = (int)( Constants.DefaultFontSize * drawInfo.InvertedZoom ); + StickyNoteText.fontSize = (int)( Constants.DefaultFontSize * drawInfo.InvertedZoom ); + + RangedFloatSliderStyle.fixedHeight = 18 * drawInfo.InvertedZoom; + RangedFloatSliderThumbStyle.fixedHeight = 12 * drawInfo.InvertedZoom; + RangedFloatSliderThumbStyle.fixedWidth = 10 * drawInfo.InvertedZoom; + RangedFloatSliderThumbStyle.overflow.left = (int)( 1 * drawInfo.InvertedZoom ); + RangedFloatSliderThumbStyle.overflow.right = (int)( 1 * drawInfo.InvertedZoom ); + RangedFloatSliderThumbStyle.overflow.top = (int)( -4 * drawInfo.InvertedZoom ); + RangedFloatSliderThumbStyle.overflow.bottom = (int)( 4 * drawInfo.InvertedZoom ); + + SwitchNodePopUp.fixedHeight = SwitchFixedHeight * drawInfo.InvertedZoom; + + SwitchNodePopUp.border.left = (int)( SwitchNodeBorder.left * drawInfo.InvertedZoom ); + SwitchNodePopUp.border.right = (int)( SwitchNodeBorder.right * drawInfo.InvertedZoom ); + SwitchNodePopUp.border.top = (int)( SwitchNodeBorder.top * drawInfo.InvertedZoom ); + SwitchNodePopUp.border.bottom = (int)( SwitchNodeBorder.bottom * drawInfo.InvertedZoom ); + + SwitchNodePopUp.margin.left = (int)( SwitchNodeMargin.left * drawInfo.InvertedZoom ); + SwitchNodePopUp.margin.right = (int)( SwitchNodeMargin.right * drawInfo.InvertedZoom ); + SwitchNodePopUp.margin.top = (int)( SwitchNodeMargin.top * drawInfo.InvertedZoom ); + SwitchNodePopUp.margin.bottom = (int)( SwitchNodeMargin.bottom * drawInfo.InvertedZoom ); + + SwitchNodePopUp.overflow.left = (int)( SwitchNodeOverflow.left * drawInfo.InvertedZoom ); + SwitchNodePopUp.overflow.right = (int)( SwitchNodeOverflow.right * drawInfo.InvertedZoom ); + SwitchNodePopUp.overflow.top = (int)( SwitchNodeOverflow.top * drawInfo.InvertedZoom ); + SwitchNodePopUp.overflow.bottom = (int)( SwitchNodeOverflow.bottom * drawInfo.InvertedZoom ); + + SwitchNodePopUp.padding.left = (int)( SwitchNodePadding.left * drawInfo.InvertedZoom ); + SwitchNodePopUp.padding.right = (int)( SwitchNodePadding.right * drawInfo.InvertedZoom ); + SwitchNodePopUp.padding.top = (int)( SwitchNodePadding.top * drawInfo.InvertedZoom ); + SwitchNodePopUp.padding.bottom = (int)( SwitchNodePadding.bottom * drawInfo.InvertedZoom ); + + SwitchNodePopUp.fontSize = (int)( SwitchFontSize * drawInfo.InvertedZoom ); + + BoldErrorStyle.fontSize = (int)( 12 * drawInfo.InvertedZoom ); + BoldWarningStyle.fontSize = (int)( 12 * drawInfo.InvertedZoom ); + BoldInfoStyle.fontSize = (int)( 12 * drawInfo.InvertedZoom ); + + PropertyPopUp.fixedHeight = Constants.PropertyPickerHeight * drawInfo.InvertedZoom; + PropertyPopUp.fixedWidth = Constants.PropertyPickerWidth * drawInfo.InvertedZoom; + if( UsingProSkin != EditorGUIUtility.isProSkin ) + { + UsingProSkin = EditorGUIUtility.isProSkin; + FetchMenuItemStyles(); + } + + GraphDropDown.padding.left = (int)( 2 * drawInfo.InvertedZoom + 2 ); + GraphDropDown.padding.right = (int)( 20 * drawInfo.InvertedZoom ); + GraphDropDown.fontSize = (int)( 10 * drawInfo.InvertedZoom ); + + PreviewExpander.fixedHeight = Constants.PreviewExpanderHeight * drawInfo.InvertedZoom; + PreviewExpander.fixedWidth = Constants.PreviewExpanderWidth * drawInfo.InvertedZoom; + + PreviewCollapser.fixedHeight = Constants.PreviewExpanderHeight * drawInfo.InvertedZoom; + PreviewCollapser.fixedWidth = Constants.PreviewExpanderWidth * drawInfo.InvertedZoom; + + MainSkin.customStyles[ (int)CustomStyle.SamplerButton ].fontSize = (int)( 9 * drawInfo.InvertedZoom ); + ObjectFieldThumbOverlay.fontSize = (int)( 9 * drawInfo.InvertedZoom ); + MiniButtonTopLeft.fontSize = (int)( 9 * drawInfo.InvertedZoom ); + MiniButtonTopMid.fontSize = (int)( 9 * drawInfo.InvertedZoom ); + MiniButtonTopRight.fontSize = (int)( 9 * drawInfo.InvertedZoom ); + + MiniObjectFieldThumbOverlay.fontSize = (int)( 7 * drawInfo.InvertedZoom ); + MiniSamplerButton.fontSize = (int)( 8 * drawInfo.InvertedZoom ); + + InternalDataOnPort.fontSize = (int)( 8 * drawInfo.InvertedZoom ); + ToolbarMainTitle.padding.left = 0; + ToolbarMainTitle.padding.right = 0; + + CheckNullMaterials(); + } + + public static void CacheLabelVars() + { + m_alignment = GUI.skin.label.alignment; + m_clipping = GUI.skin.label.clipping; + m_wordWrap = GUI.skin.label.wordWrap; + m_fontSize = GUI.skin.label.fontSize; + m_fontStyle = GUI.skin.label.fontStyle; + m_fontColor = GUI.skin.label.normal.textColor; + } + + public static void RestoreLabelVars() + { + GUI.skin.label.alignment = m_alignment; + GUI.skin.label.clipping = m_clipping; + GUI.skin.label.wordWrap = m_wordWrap; + GUI.skin.label.fontSize = m_fontSize; + GUI.skin.label.fontStyle = m_fontStyle; + GUI.skin.label.normal.textColor = m_fontColor; + } + + public static string GetTooltipForToolButton( ToolButtonType toolButtonType, int state ) { return m_toolButtonTooltips[ toolButtonType ][ state ]; } + + public static string KeyCodeToString( KeyCode keyCode ) + { + if( m_keycodeToString.ContainsKey( keyCode ) ) + return m_keycodeToString[ keyCode ]; + + return keyCode.ToString(); + } + + public static string TextureTypeToCgType( TextureType type ) { return m_textureTypeToCgType[ type ]; } + + public static string QualifierToCg( VariableQualifiers qualifier ) + { + return m_qualifierToCg[ qualifier ]; + } + + public static string WirePortToCgType( WirePortDataType type ) + { + if( type == WirePortDataType.OBJECT ) + return string.Empty; + + return m_wirePortToCgType[ type ]; + } + + public static string FinalPrecisionWirePortToCgType( PrecisionType precisionType, WirePortDataType type ) + { + return PrecisionWirePortToCgType( precisionType, type ); + } + + public static string PrecisionWirePortToCgType( PrecisionType precisionType, WirePortDataType type ) + { + if( type == WirePortDataType.OBJECT ) + return string.Empty; + + if( type == WirePortDataType.INT ) + return m_wirePortToCgType[ type ]; + + if( type == WirePortDataType.UINT ) + return m_wirePortToCgType[ type ]; + + return string.Format( m_precisionWirePortToCgType[ type ], m_precisionTypeToCg[ precisionType ] ); + } + + public static string PrecisionWirePortToTypeValue( PrecisionType precisionType, WirePortDataType type, string varName/*, bool isSRP, bool samplingMacro*/ ) + { + string result = string.Empty; + string varType = string.Empty; + if( type == WirePortDataType.OBJECT ) + varType = string.Empty; + + if( type == WirePortDataType.INT ) + varType = m_wirePortToCgType[ type ]; + + if( type == WirePortDataType.UINT ) + varType = m_wirePortToCgType[ type ]; + + switch( type ) + { + default: + case WirePortDataType.OBJECT: + case WirePortDataType.SAMPLERSTATE: + case WirePortDataType.FLOAT: + case WirePortDataType.FLOAT2: + case WirePortDataType.FLOAT3: + case WirePortDataType.FLOAT4: + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + case WirePortDataType.COLOR: + case WirePortDataType.UINT: + case WirePortDataType.INT: + case WirePortDataType.SAMPLER1D: + varType = string.Format( m_precisionWirePortToCgType[ type ], m_precisionTypeToCg[ precisionType ] ); + result = varType + " " + varName; + break; + case WirePortDataType.SAMPLER2D: + case WirePortDataType.SAMPLER3D: + case WirePortDataType.SAMPLERCUBE: + case WirePortDataType.SAMPLER2DARRAY: + ParentGraph outsideGraph = UIUtils.CurrentWindow.OutsideGraph; + if( outsideGraph.SamplingMacros /*&& !outsideGraph.IsStandardSurface*/ ) + { + if( outsideGraph.IsSRP ) + varType = string.Format( m_precisionWirePortToSRPMacroType[ type ], m_precisionTypeToCg[ precisionType ] ); + else + varType = string.Format( m_precisionWirePortToStandardMacroType[ type ], m_precisionTypeToCg[ precisionType ] ); + result = varType + varName + ")"; + } + else + { + varType = string.Format( m_precisionWirePortToCgType[ type ], m_precisionTypeToCg[ precisionType ] ); + result = varType + " " + varName; + } + break; + } + + return result; + } + + public static string GetAutoSwizzle( WirePortDataType type ) + { + return m_autoSwizzle[ type ]; + } + + public static Color GetColorForDataType( WirePortDataType dataType, bool monochromeMode = true, bool isInput = true ) + { + if( monochromeMode ) + { + return isInput ? m_dataTypeToColorMonoMode[ 0 ] : m_dataTypeToColorMonoMode[ 1 ]; + } + else + { + if ( m_dataTypeToColor.ContainsKey( dataType ) ) + return m_dataTypeToColor[ dataType ]; + } + return m_dataTypeToColor[ WirePortDataType.OBJECT ]; + } + + public static bool IsValidType( WirePortDataType type ) + { + switch ( type ) + { + case WirePortDataType.OBJECT: + case WirePortDataType.SAMPLERSTATE: + case WirePortDataType.FLOAT: + case WirePortDataType.FLOAT2: + case WirePortDataType.FLOAT3: + case WirePortDataType.FLOAT4: + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + case WirePortDataType.COLOR: + case WirePortDataType.INT: + case WirePortDataType.SAMPLER1D: + case WirePortDataType.SAMPLER2D: + case WirePortDataType.SAMPLER3D: + case WirePortDataType.SAMPLERCUBE: + case WirePortDataType.SAMPLER2DARRAY: + return true; + } + return false; + } + public static string GetNameForDataType( WirePortDataType dataType ) { return m_dataTypeToName[ dataType ]; } + + public static string GetInputDeclarationFromType( PrecisionType precision, SurfaceInputs inputType ) + { + string precisionStr = m_precisionTypeToCg[ precision ]; + return string.Format( m_inputTypeDeclaration[ inputType ], precisionStr ); + } + + public static string GetInputValueFromType( SurfaceInputs inputType ) { return m_inputTypeName[ inputType ]; } + private static string CreateLocalValueName( PrecisionType precision, WirePortDataType dataType, string localOutputValue, string value ) { return string.Format( Constants.LocalValueDecWithoutIdent, PrecisionWirePortToCgType( precision, dataType ), localOutputValue, value ); } + + public static string CastPortType( ref MasterNodeDataCollector dataCollector, PrecisionType nodePrecision, NodeCastInfo castInfo, object value, WirePortDataType oldType, WirePortDataType newType, string parameterName = null ) + { + if( oldType == newType || newType == WirePortDataType.OBJECT ) + { + return ( parameterName != null ) ? parameterName : value.ToString(); + } + + PrecisionType currentPrecision = nodePrecision; + string precisionStr = m_precisionTypeToCg[ currentPrecision ]; + string newTypeStr = m_wirePortToCgType[ newType ]; + newTypeStr = m_textInfo.ToTitleCase( newTypeStr ); + int castId = ( dataCollector.PortCategory == MasterNodePortCategory.Vertex || dataCollector.PortCategory == MasterNodePortCategory.Tessellation ) ? dataCollector.AvailableVertexTempId : dataCollector.AvailableFragTempId; + string localVarName = "temp_cast_" + castId;//m_wirePortToCgType[ oldType ] + "To" + newTypeStr + "_" + castInfo.ToString(); + string result = string.Empty; + bool useRealValue = ( parameterName == null ); + + switch( oldType ) + { + case WirePortDataType.FLOAT: + { + switch( newType ) + { + case WirePortDataType.OBJECT: result = useRealValue ? value.ToString() : parameterName; break; + case WirePortDataType.FLOAT2: + { + string localVal = CreateLocalValueName( currentPrecision, newType, localVarName, string.Format( Constants.CastHelper, ( ( useRealValue ) ? value.ToString() : parameterName ), "xx" ) ); + dataCollector.AddToLocalVariables( dataCollector.PortCategory, -1, localVal ); + result = localVarName; + } + break; + case WirePortDataType.FLOAT3: + { + string localVal = CreateLocalValueName( currentPrecision, newType, localVarName, string.Format( Constants.CastHelper, ( ( useRealValue ) ? value.ToString() : parameterName ), "xxx" ) ); + dataCollector.AddToLocalVariables( dataCollector.PortCategory, -1, localVal ); + result = localVarName; + } + break; + case WirePortDataType.COLOR: + { + string localVal = CreateLocalValueName( currentPrecision, newType, localVarName, string.Format( Constants.CastHelper, ( ( useRealValue ) ? value.ToString() : parameterName ), "xxxx" ) ); + dataCollector.AddToLocalVariables( dataCollector.PortCategory, -1, localVal ); + result = localVarName; + } + break; + case WirePortDataType.FLOAT4: + { + string localVal = CreateLocalValueName( currentPrecision, newType, localVarName, string.Format( Constants.CastHelper, ( ( useRealValue ) ? value.ToString() : parameterName ), "xxxx" ) ); + dataCollector.AddToLocalVariables( dataCollector.PortCategory, -1, localVal ); + result = localVarName; + } + break; + case WirePortDataType.FLOAT3x3: + { + string localVal = CreateLocalValueName( currentPrecision, newType, localVarName, ( ( useRealValue ) ? value.ToString() : parameterName ) ); + dataCollector.AddToLocalVariables( dataCollector.PortCategory, -1, localVal ); + result = localVarName; + } + break; + case WirePortDataType.FLOAT4x4: + { + string localVal = CreateLocalValueName( currentPrecision, newType, localVarName, ( ( useRealValue ) ? value.ToString() : parameterName ) ); + dataCollector.AddToLocalVariables( dataCollector.PortCategory, -1, localVal ); + result = localVarName; + } + break; + case WirePortDataType.INT: + { + result = ( useRealValue ) ? ( (int)value ).ToString() : "(int)" + parameterName; + } + break; + case WirePortDataType.UINT: + { + result = ( useRealValue ) ? ( (int)value ).ToString() : "(uint)" + parameterName; + } + break; + } + } + break; + case WirePortDataType.FLOAT2: + { + Vector2 vecVal = useRealValue ? (Vector2)value : Vector2.zero; + switch( newType ) + { + case WirePortDataType.OBJECT: result = useRealValue ? precisionStr + "2( " + vecVal.x + " , " + vecVal.y + " )" : parameterName; break; + case WirePortDataType.FLOAT: + { + result = ( useRealValue ) ? vecVal.x.ToString() : parameterName + ".x"; + } + break; + case WirePortDataType.FLOAT3: + { + result = ( useRealValue ) ? precisionStr + "3( " + vecVal.x + " , " + vecVal.y + " , " + " 0.0 )" : precisionStr + "3( " + parameterName + " , 0.0 )"; + } + break; + case WirePortDataType.COLOR: + case WirePortDataType.FLOAT4: + { + result = ( useRealValue ) ? precisionStr + "4( " + vecVal.x + " , " + vecVal.y + " , " + " 0.0 , 0.0 )" : precisionStr + "4( " + parameterName + ", 0.0 , 0.0 )"; + } + break; + } + } + break; + case WirePortDataType.FLOAT3: + { + Vector3 vecVal = useRealValue ? (Vector3)value : Vector3.zero; + switch( newType ) + { + case WirePortDataType.OBJECT: result = useRealValue ? precisionStr + "3( " + vecVal.x + " , " + vecVal.y + " , " + vecVal.z + " )" : parameterName; break; + case WirePortDataType.FLOAT: + { + result = ( useRealValue ) ? vecVal.x.ToString() : parameterName + ".x"; + } + break; + case WirePortDataType.FLOAT2: + { + result = ( useRealValue ) ? precisionStr + "2( " + vecVal.x + " , " + vecVal.y + " )" : parameterName + ".xy"; + } + break; + case WirePortDataType.COLOR: + case WirePortDataType.FLOAT4: + { + result = ( useRealValue ) ? precisionStr + "4( " + vecVal.x + " , " + vecVal.y + " , " + vecVal.z + " , 0.0 )" : precisionStr + "4( " + parameterName + " , 0.0 )"; + } + break; + //case WirePortDataType.FLOAT3x3: + //{ + // if ( useRealValue ) + // { + // result = precisionStr + "3x3( " + vecVal.x + " , " + vecVal.y + " , " + vecVal.z + " , " + + // vecVal.x + " , " + vecVal.y + " , " + vecVal.z + " , " + + // vecVal.x + " , " + vecVal.y + " , " + vecVal.z + " )"; + // } + // else + // { + // string localVal = CreateLocalValueName( currentPrecision, newType, localVarName, parameterName ); + // CurrentDataCollector.AddToLocalVariables( portCategory, -1, localVal ); + // result = precisionStr + "3x3( " + localVarName + ".x , " + localVarName + ".y , " + localVarName + ".x , " + + // localVarName + ".x , " + localVarName + ".y , " + localVarName + ".y , " + + // localVarName + ".x , " + localVarName + ".y , " + localVarName + ".z )"; + // } + //} + //break; + //case WirePortDataType.FLOAT4x4: + //{ + // if ( useRealValue ) + // { + // result = precisionStr + "4x4( " + vecVal + ".x , " + vecVal + ".y , " + vecVal + ".z , 0 , " + + // vecVal + ".x , " + vecVal + ".y , " + vecVal + ".z , 0 , " + + // vecVal + ".x , " + vecVal + ".y , " + vecVal + ".z , 0 , " + + // vecVal + ".x , " + vecVal + ".y , " + vecVal + ".z , 0 )"; + // } + // else + // { + // string localVal = CreateLocalValueName( currentPrecision, newType, localVarName, parameterName ); + // CurrentDataCollector.AddToLocalVariables( portCategory, -1, localVal ); + // result = precisionStr + "4x4( " + localVarName + ".x , " + localVarName + ".y , " + localVarName + ".z , 0 , " + + // localVarName + ".x , " + localVarName + ".y , " + localVarName + ".z , 0 , " + + // localVarName + ".x , " + localVarName + ".y , " + localVarName + ".z , 0 , " + + // localVarName + ".x , " + localVarName + ".y , " + localVarName + ".z , 0 )"; + // } + //} + //break; + } + } + break; + case WirePortDataType.FLOAT4: + { + Vector4 vecVal = useRealValue ? (Vector4)value : Vector4.zero; + switch( newType ) + { + case WirePortDataType.OBJECT: result = useRealValue ? precisionStr + "4( " + vecVal.x + " , " + vecVal.y + " , " + vecVal.z + " , " + vecVal.w + " )" : parameterName; break; + case WirePortDataType.FLOAT: + { + result = ( useRealValue ) ? vecVal.x.ToString() : parameterName + ".x"; + } + break; + case WirePortDataType.FLOAT2: + { + result = ( useRealValue ) ? precisionStr + "2( " + vecVal.x + " , " + vecVal.y + " )" : parameterName + ".xy"; + } + break; + case WirePortDataType.FLOAT3: + { + result = ( useRealValue ) ? precisionStr + "3( " + vecVal.x + " , " + vecVal.y + " , " + vecVal.z + " )" : parameterName + ".xyz"; + } + break; + //case WirePortDataType.FLOAT4x4: + //{ + // if ( useRealValue ) + // { + // result = precisionStr + "4x4( " + vecVal + ".x , " + vecVal + ".y , " + vecVal + ".z , " + vecVal + ".w , " + + // vecVal + ".x , " + vecVal + ".y , " + vecVal + ".z , " + vecVal + ".w , " + + // vecVal + ".x , " + vecVal + ".y , " + vecVal + ".z , " + vecVal + ".w , " + + // vecVal + ".x , " + vecVal + ".y , " + vecVal + ".z , " + vecVal + ".w )"; + // } + // else + // { + // string localVal = CreateLocalValueName( currentPrecision, newType, localVarName, parameterName ); + // CurrentDataCollector.AddToLocalVariables( portCategory, -1, localVal ); + // result = precisionStr + "4x4( " + localVarName + ".x , " + localVarName + ".y , " + localVarName + ".z , " + localVarName + ".w , " + + // localVarName + ".x , " + localVarName + ".y , " + localVarName + ".z , " + localVarName + ".w , " + + // localVarName + ".x , " + localVarName + ".y , " + localVarName + ".z , " + localVarName + ".w , " + + // localVarName + ".x , " + localVarName + ".y , " + localVarName + ".z , " + localVarName + ".w )"; + // } + //} + //break; + case WirePortDataType.COLOR: + { + result = useRealValue ? precisionStr + "4( " + vecVal.x + " , " + vecVal.y + " , " + vecVal.z + " , " + vecVal.w + " )" : parameterName; + } + break; + } + } + break; + case WirePortDataType.FLOAT3x3: + { + //Matrix4x4 matrixVal = useRealValue ? ( Matrix4x4 ) value : Matrix4x4.identity; + //switch ( newType ) + //{ + // case WirePortDataType.OBJECT: + // case WirePortDataType.FLOAT4x4: + // { + // result = ( useRealValue ) ? precisionStr + "4x4(" + matrixVal.m00 + " , " + matrixVal.m01 + " , " + matrixVal.m02 + " , " + matrixVal.m03 + " , " + + // matrixVal.m10 + " , " + matrixVal.m11 + " , " + matrixVal.m12 + " , " + matrixVal.m10 + " , " + + // matrixVal.m20 + " , " + matrixVal.m21 + " , " + matrixVal.m22 + " , " + matrixVal.m20 + " , " + + // matrixVal.m30 + " , " + matrixVal.m31 + " , " + matrixVal.m32 + " , " + matrixVal.m30 + " )" : precisionStr + "4x4(" + parameterName + ")"; + // } + // break; + //} + } + break; + case WirePortDataType.FLOAT4x4: + { + Matrix4x4 matrixVal = useRealValue ? (Matrix4x4)value : Matrix4x4.identity; + switch( newType ) + { + case WirePortDataType.OBJECT: + { + result = ( useRealValue ) ? precisionStr + "4x4(" + matrixVal.m00 + " , " + matrixVal.m01 + " , " + matrixVal.m02 + " , " + matrixVal.m03 + " , " + + matrixVal.m10 + " , " + matrixVal.m11 + " , " + matrixVal.m12 + " , " + matrixVal.m10 + " , " + + matrixVal.m20 + " , " + matrixVal.m21 + " , " + matrixVal.m22 + " , " + matrixVal.m20 + " , " + + matrixVal.m30 + " , " + matrixVal.m31 + " , " + matrixVal.m32 + " , " + matrixVal.m30 + " )" : parameterName; + } + break; + } + } + break; + case WirePortDataType.COLOR: + { + Color colorValue = ( useRealValue ) ? (Color)value : Color.black; + switch( newType ) + { + case WirePortDataType.OBJECT: result = useRealValue ? precisionStr + "4( " + colorValue.r + " , " + colorValue.g + " , " + colorValue.b + " , " + colorValue.a + " )" : parameterName; break; + case WirePortDataType.FLOAT: + { + result = ( useRealValue ) ? colorValue.r.ToString() : parameterName + ".r"; + } + break; + case WirePortDataType.FLOAT2: + { + result = ( useRealValue ) ? precisionStr + "2( " + colorValue.r + " , " + colorValue.g + " )" : parameterName + ".rg"; + } + break; + case WirePortDataType.FLOAT3: + { + result = ( useRealValue ) ? precisionStr + "3( " + colorValue.r + " , " + colorValue.g + " , " + colorValue.b + " )" : parameterName + ".rgb"; + } + break; + case WirePortDataType.FLOAT4: + { + result = useRealValue ? precisionStr + "4( " + colorValue.r + " , " + colorValue.g + " , " + colorValue.b + " , " + colorValue.a + " )" : parameterName; + } + break; + //case WirePortDataType.FLOAT4x4: + //{ + // if ( useRealValue ) + // { + // result = precisionStr + "4x4( " + colorValue.r + " , " + colorValue.g + " , " + colorValue.b + " , " + colorValue.a + " , " + + // colorValue.r + " , " + colorValue.g + " , " + colorValue.b + " , " + colorValue.a + " , " + + // colorValue.r + " , " + colorValue.g + " , " + colorValue.b + " , " + colorValue.a + " , " + + // colorValue.r + " , " + colorValue.g + " , " + colorValue.b + " , " + colorValue.a + " )"; + // } + // else + // { + // string localVal = CreateLocalValueName( currentPrecision, newType, localVarName, parameterName ); + // CurrentDataCollector.AddToLocalVariables( portCategory, -1, localVal ); + + // result = precisionStr + "4x4( " + localVarName + ".x , " + localVarName + ".y , " + localVarName + ".z , " + localVarName + ".w , " + + // localVarName + ".x , " + localVarName + ".y , " + localVarName + ".z , " + localVarName + ".w , " + + // localVarName + ".x , " + localVarName + ".y , " + localVarName + ".z , " + localVarName + ".w , " + + // localVarName + ".x , " + localVarName + ".y , " + localVarName + ".z , " + localVarName + ".w )"; + // } + //} + //break; + } + } + break; + case WirePortDataType.INT: + { + switch( newType ) + { + case WirePortDataType.OBJECT: result = useRealValue ? value.ToString() : parameterName; break; + case WirePortDataType.FLOAT2: + case WirePortDataType.FLOAT3: + case WirePortDataType.COLOR: + case WirePortDataType.FLOAT4: + { + string localVal = CreateLocalValueName( currentPrecision, newType, localVarName, ( ( useRealValue ) ? value.ToString() : parameterName ) ); + dataCollector.AddToLocalVariables( dataCollector.PortCategory, -1, localVal ); + result = localVarName; + } + break; + case WirePortDataType.FLOAT3x3: + { + string localVal = CreateLocalValueName( currentPrecision, oldType, localVarName, ( ( useRealValue ) ? value.ToString() : parameterName ) ); + dataCollector.AddToLocalVariables( dataCollector.PortCategory, -1, localVal ); + result = localVarName; + } + break; + case WirePortDataType.FLOAT4x4: + { + string localVal = CreateLocalValueName( currentPrecision, oldType, localVarName, ( ( useRealValue ) ? value.ToString() : parameterName ) ); + dataCollector.AddToLocalVariables( dataCollector.PortCategory, -1, localVal ); + result = localVarName; + } + break; + case WirePortDataType.FLOAT: + { + result = ( useRealValue ) ? ( (int)value ).ToString() : "(float)" + parameterName; + } + break; + case WirePortDataType.UINT: + { + result = ( useRealValue ) ? ( (int)value ).ToString() : "(uint)" + parameterName; + } + break; + } + } + break; + case WirePortDataType.UINT: + { + switch( newType ) + { + case WirePortDataType.OBJECT: result = useRealValue ? value.ToString() : parameterName; break; + case WirePortDataType.FLOAT2: + case WirePortDataType.FLOAT3: + case WirePortDataType.COLOR: + case WirePortDataType.FLOAT4: + { + string localVal = CreateLocalValueName( currentPrecision, newType, localVarName, ( ( useRealValue ) ? value.ToString() : parameterName ) ); + dataCollector.AddToLocalVariables( dataCollector.PortCategory, -1, localVal ); + result = localVarName; + } + break; + case WirePortDataType.FLOAT3x3: + { + string localVal = CreateLocalValueName( currentPrecision, oldType, localVarName, ( ( useRealValue ) ? value.ToString() : parameterName ) ); + dataCollector.AddToLocalVariables( dataCollector.PortCategory, -1, localVal ); + result = localVarName; + } + break; + case WirePortDataType.FLOAT4x4: + { + string localVal = CreateLocalValueName( currentPrecision, oldType, localVarName, ( ( useRealValue ) ? value.ToString() : parameterName ) ); + dataCollector.AddToLocalVariables( dataCollector.PortCategory, -1, localVal ); + result = localVarName; + } + break; + case WirePortDataType.FLOAT: + { + result = ( useRealValue ) ? ( (int)value ).ToString() : "(float)" + parameterName; + } + break; + case WirePortDataType.INT: + { + result = ( useRealValue ) ? ( (int)value ).ToString() : "(int)" + parameterName; + } + break; + } + } + break; + } + if( result.Equals( string.Empty ) ) + { + result = "0"; + string warningStr = string.Format( "Unable to cast from {0} to {1}. Generating dummy data ( {2} )", oldType, newType, result ); + + if( oldType == WirePortDataType.SAMPLER1D || oldType == WirePortDataType.SAMPLER2D || oldType == WirePortDataType.SAMPLER3D || oldType == WirePortDataType.SAMPLERCUBE || oldType == WirePortDataType.SAMPLER2DARRAY ) + { + warningStr = string.Format( "Unable to cast from {0} to {1}. You might want to use a Texture Sample node and connect it to the 'Tex' port. Generating dummy data ( {2} )", oldType, newType, result ); + } + ShowMessage( warningStr, MessageSeverity.Warning ); + } + return result; + } + + public static bool CanCast( WirePortDataType from, WirePortDataType to ) + { + if( from == WirePortDataType.OBJECT || to == WirePortDataType.OBJECT || from == to ) + return true; + + switch( from ) + { + case WirePortDataType.FLOAT: + { + if( to == WirePortDataType.INT ) + return true; + } + break; + case WirePortDataType.FLOAT2: + { + return false; + } + case WirePortDataType.FLOAT3: + { + if( to == WirePortDataType.COLOR || + to == WirePortDataType.FLOAT4 ) + return true; + } + break; + case WirePortDataType.FLOAT4: + { + if( to == WirePortDataType.FLOAT3 || + to == WirePortDataType.COLOR ) + return true; + } + break; + case WirePortDataType.FLOAT3x3: + { + if( to == WirePortDataType.FLOAT4x4 ) + return true; + } + break; + case WirePortDataType.FLOAT4x4: + { + if( to == WirePortDataType.FLOAT3x3 ) + return true; + } + break; + case WirePortDataType.COLOR: + { + if( to == WirePortDataType.FLOAT3 || + to == WirePortDataType.FLOAT4 ) + return true; + + } + break; + case WirePortDataType.INT: + { + if( to == WirePortDataType.FLOAT ) + return true; + } + break; + } + + return false; + } + + public static int GetChannelsAmount( WirePortDataType type ) + { + switch( type ) + { + case WirePortDataType.OBJECT: return 0; + case WirePortDataType.FLOAT: return 1; + case WirePortDataType.FLOAT2: return 2; + case WirePortDataType.FLOAT3: return 3; + case WirePortDataType.FLOAT4: return 4; + case WirePortDataType.FLOAT3x3: return 9; + case WirePortDataType.FLOAT4x4: return 16; + case WirePortDataType.COLOR: return 4; + case WirePortDataType.INT: return 1; + case WirePortDataType.UINT: return 1; + } + return 0; + } + + public static WirePortDataType GetWireTypeForChannelAmount( int channelAmount ) + { + switch( channelAmount ) + { + case 1: return WirePortDataType.FLOAT; + case 2: return WirePortDataType.FLOAT2; + case 3: return WirePortDataType.FLOAT3; + case 4: return WirePortDataType.FLOAT4; + case 9: return WirePortDataType.FLOAT3x3; + case 16: return WirePortDataType.FLOAT4x4; + } + return WirePortDataType.FLOAT; + } + + public static string GenerateUniformName( bool excludeUniformKeyword, WirePortDataType dataType, string dataName ) + { + return GenerateUniformName( excludeUniformKeyword, WirePortToCgType( dataType ), dataName ); + } + + public static string GenerateUniformName( bool excludeUniformKeyword, string dataType, string dataName ) + { + int index = excludeUniformKeyword ? 1 : 0; + return string.Format( Constants.UniformDec[index], dataType, dataName ); + } + + public static string GeneratePropertyName( string name, PropertyType propertyType, bool forceUnderscore = false ) + { + if( string.IsNullOrEmpty( name ) ) + return name; + + name = RemoveInvalidCharacters( name ); + if( propertyType != PropertyType.Global || forceUnderscore ) + { + if( name[ 0 ] != '_' ) + { + name = '_' + name; + } + } + + return name; + } + + public static string UrlReplaceInvalidStrings( string originalString ) + { + for( int i = 0; i < Constants.UrlReplacementStringValuesLen; i++ ) + { + originalString = originalString.Replace( Constants.UrlReplacementStringValues[i,0], Constants.UrlReplacementStringValues[i,1] ); + } + return originalString; + } + + public static string ReplaceInvalidStrings( string originalString ) + { + for(int i = 0; i< Constants.ReplacementStringValuesLen;i++ ) + { + originalString = originalString.Replace( Constants.ReplacementStringValues[i,0], Constants.ReplacementStringValues[ i, 1 ] ); + } + return originalString; + } + + public static string RemoveWikiInvalidCharacters( string originalString ) + { + for( int i = 0; i < Constants.WikiInvalidChars.Length; i++ ) + { + originalString = originalString.Replace( Constants.WikiInvalidChars[ i ], string.Empty ); + } + return originalString; + } + + public static string RemoveInvalidEnumCharacters( string originalString ) + { + for( int i = 0; i < Constants.EnumInvalidChars.Length; i++ ) + { + originalString = originalString.Replace( Constants.EnumInvalidChars[ i ], string.Empty ); + } + return originalString; + } + + public static string RemoveInvalidAttrCharacters( string originalString ) + { + for( int i = 0; i < Constants.AttrInvalidChars.Length; i++ ) + { + originalString = originalString.Replace( Constants.AttrInvalidChars[ i ], string.Empty ); + } + return originalString; + } + + public static string RemoveHeaderAttrCharacters( string originalString ) + { + for( int i = 0; i < Constants.AttrInvalidChars.Length; i++ ) + { + originalString = originalString.Replace( Constants.HeaderInvalidChars[ i ], string.Empty ); + } + return originalString; + } + + public static string RemoveInvalidCharacters( string originalString ) + { + for( int i = 0; i < Constants.OverallInvalidChars.Length; i++ ) + { + originalString = originalString.Replace( Constants.OverallInvalidChars[ i ], string.Empty ); + } + return originalString; + } + + public static string RemoveShaderInvalidCharacters( string originalString ) + { + originalString = originalString.Replace( '\\', '/' ); + for( int i = 0; i < Constants.ShaderInvalidChars.Length; i++ ) + { + originalString = originalString.Replace( Constants.ShaderInvalidChars[ i ], string.Empty ); + } + return originalString; + } + + public static bool IsUnityNativeShader( Shader shader ) + { + string pathName = AssetDatabase.GetAssetPath( shader ); + + if( pathName.Contains( "unity_builtin_extra") || + pathName.Contains( "unity default resources" )) + return true; + + return false; + } + public static bool IsUnityNativeShader( string path ) { return m_unityNativeShaderPaths.ContainsKey( path ); } + + public static string GetComponentForPosition( int pos, WirePortDataType type, bool addDot = false ) + { + string result = addDot ? "." : string.Empty; + switch( pos ) + { + case 0: + { + return ( ( type == WirePortDataType.COLOR ) ? ( result + "r" ) : ( result + "x" ) ); + } + case 1: + { + return ( ( type == WirePortDataType.COLOR ) ? ( result + "g" ) : ( result + "y" ) ); + } + case 2: + { + return ( ( type == WirePortDataType.COLOR ) ? ( result + "b" ) : ( result + "z" ) ); + } + case 3: + { + return ( ( type == WirePortDataType.COLOR ) ? ( result + "a" ) : ( result + "w" ) ); + } + } + return string.Empty; + } + + public static string InvalidParameter( ParentNode node ) + { + ShowMessage( node.UniqueId, "Invalid entrance type on node" + node, MessageSeverity.Error ); + return "0"; + } + + public static string NoConnection( ParentNode node ) + { + ShowMessage( node.UniqueId, "No Input connection on node" + node, MessageSeverity.Error ); + return "0"; + } + + public static string UnknownError( ParentNode node ) + { + ShowMessage( node.UniqueId, "Unknown error on node" + node, MessageSeverity.Error ); + return "0"; + } + + public static string GetTex2DProperty( string name, TexturePropertyValues defaultValue ) { return name + "(\"" + name + "\", 2D) = \"" + defaultValue + "\" {}"; } + public static string AddBrackets( string value ) { return "( " + value + " )"; } + public static Color GetColorFromWireStatus( WireStatus status ) { return m_wireStatusToColor[ status ]; } + public static bool HasColorCategory( string category ) { return m_nodeCategoryToColor.ContainsKey( category ); } + public static void AddColorCategory( string category, Color color ) + { + m_nodeCategoryToColor.Add( category, color ); + } + + public static Color AddColorCategory( string category, string hexColor ) + { + try + { + Color color = new Color(); + ColorUtility.TryParseHtmlString( hexColor, out color ); + m_nodeCategoryToColor.Add( category, color ); + return color; + } + catch( System.Exception e ) + { + Debug.LogException( e ); + } + return m_nodeCategoryToColor[ "Default" ]; + } + + public static Color GetColorFromCategory( string category ) + { + if( m_nodeCategoryToColor.ContainsKey( category ) ) + return m_nodeCategoryToColor[ category ]; + + + if(DebugConsoleWindow.DeveloperMode) + Debug.LogWarning( category + " category does not contain an associated color" ); + + return m_nodeCategoryToColor[ "Default" ]; + } + + public static string LatestOpenedFolder + { + get { return m_latestOpenedFolder; } + set { m_latestOpenedFolder = value; } + } + + public static Shader CreateNewUnlit() + { + if( CurrentWindow == null ) + return null; + + string shaderName; + string pathName; + Shader newShader = null; + IOUtils.GetShaderName( out shaderName, out pathName, "MyUnlitShader", m_latestOpenedFolder ); + if( !System.String.IsNullOrEmpty( shaderName ) && !System.String.IsNullOrEmpty( pathName ) ) + { + CurrentWindow.CreateNewGraph( shaderName ); + CurrentWindow.PreMadeShadersInstance.FlatColorSequence.Execute(); + + CurrentWindow.CurrentGraph.CurrentMasterNode.SetName( shaderName ); + newShader = CurrentWindow.CurrentGraph.FireMasterNode( pathName, true ); + AssetDatabase.Refresh(); + } + return newShader; + } + + public static Shader CreateNewEmpty( string customPath = null , string customShaderName = null ) + { + if( CurrentWindow == null ) + return null; + + string shaderName; + string pathName; + Shader newShader = null; + + + string path = AssetDatabase.GetAssetPath( Selection.activeObject ); + if( path == "" ) + { + path = "Assets"; + } + else if( System.IO.Path.GetExtension( path ) != "" ) + { + path = path.Replace( System.IO.Path.GetFileName( AssetDatabase.GetAssetPath( Selection.activeObject ) ), "" ); + } + + + if( string.IsNullOrEmpty( customPath ) ) + { + IOUtils.GetShaderName( out shaderName, out pathName, Constants.DefaultShaderName, m_latestOpenedFolder ); + } + else + { + pathName = customPath; + if( string.IsNullOrEmpty( customShaderName ) ) + { + shaderName = Constants.DefaultShaderName; + int indexOfAssets = pathName.IndexOf( "Assets" ); + string uniquePath = ( indexOfAssets > 0 ) ? pathName.Remove( 0, indexOfAssets ) : pathName; + string assetPathAndName = AssetDatabase.GenerateUniqueAssetPath( uniquePath + shaderName + ".shader" ); + pathName = assetPathAndName; + shaderName = assetPathAndName.Remove( 0, assetPathAndName.IndexOf( shaderName ) ); + } + else + { + shaderName = customShaderName; + } + shaderName = shaderName.Remove( shaderName.Length - 7 ); + } + if( !System.String.IsNullOrEmpty( shaderName ) && !System.String.IsNullOrEmpty( pathName ) ) + { + m_latestOpenedFolder = pathName; + + CurrentWindow.titleContent.text = AmplifyShaderEditorWindow.GenerateTabTitle( shaderName ); + CurrentWindow.titleContent.image = ShaderIcon; + CurrentWindow.CreateNewGraph( shaderName ); + CurrentWindow.LastOpenedLocation = pathName; + CurrentWindow.CurrentGraph.CurrentMasterNode.SetName( shaderName ); + newShader = CurrentWindow.CurrentGraph.FireMasterNode( pathName, true ); + AssetDatabase.Refresh(); + } + + return newShader; + } + + + public static Shader CreateNewEmptyTemplate( string templateGUID, string customPath = null, string customShaderName = null ) + { + if( CurrentWindow == null ) + return null; + + string shaderName; + string pathName; + Shader newShader = null; + + + string path = AssetDatabase.GetAssetPath( Selection.activeObject ); + if( path == "" ) + { + path = "Assets"; + } + else if( System.IO.Path.GetExtension( path ) != "" ) + { + path = path.Replace( System.IO.Path.GetFileName( AssetDatabase.GetAssetPath( Selection.activeObject ) ), "" ); + } + + + if( string.IsNullOrEmpty( customPath ) ) + { + IOUtils.GetShaderName( out shaderName, out pathName, Constants.DefaultShaderName, m_latestOpenedFolder ); + } + else + { + pathName = customPath; + if( string.IsNullOrEmpty( customShaderName ) ) + { + shaderName = Constants.DefaultShaderName; + int indexOfAssets = pathName.IndexOf( "Assets" ); + string uniquePath = ( indexOfAssets > 0 ) ? pathName.Remove( 0, indexOfAssets ) : pathName; + string assetPathAndName = AssetDatabase.GenerateUniqueAssetPath( uniquePath + shaderName + ".shader" ); + pathName = assetPathAndName; + shaderName = assetPathAndName.Remove( 0, assetPathAndName.IndexOf( shaderName ) ); + } + else + { + shaderName = customShaderName; + } + shaderName = shaderName.Remove( shaderName.Length - 7 ); + } + if( !System.String.IsNullOrEmpty( shaderName ) && !System.String.IsNullOrEmpty( pathName ) ) + { + m_latestOpenedFolder = pathName; + + CurrentWindow.titleContent.text = AmplifyShaderEditorWindow.GenerateTabTitle( shaderName ); + CurrentWindow.titleContent.image = UIUtils.ShaderIcon; + CurrentWindow.CreateNewTemplateGraph( templateGUID ); + CurrentWindow.CurrentGraph.CurrentMasterNode.SetName( shaderName ); + newShader = CurrentWindow.CurrentGraph.FireMasterNode( pathName, true ); + AssetDatabase.Refresh(); + } + + return newShader; + } + + + public static void SetDelayedMaterialMode( Material material ) + { + if( CurrentWindow == null ) + return; + CurrentWindow.SetDelayedMaterialMode( material ); + } + + public static void CreateEmptyFromInvalid( Shader shader ) + { + if( CurrentWindow == null ) + return; + + CurrentWindow.CreateNewGraph( shader ); + CurrentWindow.ForceRepaint(); + } + + public static void CreateEmptyFunction( AmplifyShaderFunction shaderFunction ) + { + if( CurrentWindow == null ) + return; + + CurrentWindow.CreateNewFunctionGraph( shaderFunction ); + CurrentWindow.SaveToDisk( false ); + CurrentWindow.ForceRepaint(); + } + + public static void DrawFloat( UndoParentNode owner, ref Rect propertyDrawPos, ref float value, float newLabelWidth = 8 ) + { + float labelWidth = EditorGUIUtility.labelWidth; + EditorGUIUtility.labelWidth = newLabelWidth; + value = owner.EditorGUIFloatField( propertyDrawPos, " ", value, UIUtils.MainSkin.textField ); + EditorGUIUtility.labelWidth = labelWidth; + } + + public static GUIStyle GetCustomStyle( CustomStyle style ) + { + return ( Initialized ) ? MainSkin.customStyles[ (int)style ] : null; + } + + public static void SetCustomStyle( CustomStyle style, GUIStyle guiStyle ) + { + if( MainSkin != null ) + MainSkin.customStyles[ (int)style ] = new GUIStyle( guiStyle ); + } + + public static void OpenFile() + { + if( CurrentWindow == null ) + return; + string newShader = EditorUtility.OpenFilePanel( "Select Shader to open", m_latestOpenedFolder, "shader" ); + if( !System.String.IsNullOrEmpty( newShader ) ) + { + m_latestOpenedFolder = newShader.Substring( 0, newShader.LastIndexOf( '/' ) + 1 ); + int relFilenameId = newShader.IndexOf( Application.dataPath ); + if( relFilenameId > -1 ) + { + string relFilename = newShader.Substring( relFilenameId + Application.dataPath.Length - 6 );// -6 need to also copy the assets/ part + CurrentWindow.LoadFromDisk( relFilename ); + } + else + { + ShowMessage( "Can only load shaders\nfrom inside the projects folder", MessageSeverity.Error ); + } + } + } + + public static bool DetectNodeLoopsFrom( ParentNode node, Dictionary currentNodes ) + { + for( int i = 0; i < node.InputPorts.Count; i++ ) + { + if( node.InputPorts[ i ].IsConnected ) + { + ParentNode newNode = node.InputPorts[ i ].GetOutputNode(); + if( !currentNodes.ContainsKey( newNode.UniqueId ) ) + RecursiveNodeFill( newNode, currentNodes ); + } + } + + bool found = currentNodes.ContainsKey( node.UniqueId ); + currentNodes.Clear(); + currentNodes = null; + + return found; + } + + private static void RecursiveNodeFill( ParentNode node, Dictionary currentNodes ) + { + if( !currentNodes.ContainsKey( node.UniqueId ) ) + currentNodes.Add( node.UniqueId, 1 ); + + for( int i = 0; i < node.InputPorts.Count; i++ ) + { + if( node.InputPorts[ i ].IsConnected ) + { + ParentNode newNode = node.InputPorts[ i ].GetOutputNode(); + if( !currentNodes.ContainsKey( newNode.UniqueId ) ) + RecursiveNodeFill( newNode, currentNodes ); + } + } + } + + public static ParentNode CreateNode( System.Type type, bool registerUndo, Vector2 pos, int nodeId = -1, bool addLast = true ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.CurrentGraph.CreateNode( type, registerUndo, pos, nodeId, addLast ); + } + return null; + } + + public static void DestroyNode( int nodeId ) + { + if( CurrentWindow != null ) + { + CurrentWindow.CurrentGraph.DestroyNode( nodeId ); + } + } + + public static void ShowMessage( int ownerId, string message, MessageSeverity severity = MessageSeverity.Normal, bool registerTimestamp = true ) + { + if( CurrentWindow != null ) + { + CurrentWindow.ShowMessage( ownerId, message, severity, registerTimestamp ); + } + } + + public static void ShowMessage( string message, MessageSeverity severity = MessageSeverity.Normal, bool registerTimestamp = true ) + { + if( CurrentWindow != null ) + { + CurrentWindow.ShowMessage( message, severity, registerTimestamp ); + } + } + + public static ParentNode GetNode( int nodeId ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.CurrentGraph.GetNode( nodeId ); + } + return null; + } + + public static PropertyNode GetInternalTemplateNode( int nodeId ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.CurrentGraph.GetInternalTemplateNode( nodeId ); + } + return null; + } + + public static PropertyNode GetInternalTemplateNode( string propertyName ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.CurrentGraph.GetInternalTemplateNode( propertyName ); + } + return null; + } + + + public static void DeleteConnection( bool isInput, int nodeId, int portId, bool registerOnLog, bool propagateCallback ) + { + if( CurrentWindow != null ) + { + CurrentWindow.DeleteConnection( isInput, nodeId, portId, registerOnLog, propagateCallback ); + } + } + + public static void ConnectInputToOutput( int inNodeId, int inPortId, int outNodeId, int outPortId ) + { + if( CurrentWindow != null ) + { + CurrentWindow.ConnectInputToOutput( inNodeId, inPortId, outNodeId, outPortId ); + } + } + + public static Shader CreateNewGraph( string name ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.CreateNewGraph( name ); + } + return null; + } + public static void SetConnection( int InNodeId, int InPortId, int OutNodeId, int OutPortId ) + { + if( CurrentWindow != null ) + { + CurrentWindow.CurrentGraph.SetConnection( InNodeId, InPortId, OutNodeId, OutPortId ); + } + } + + public static bool IsChannelAvailable( int channelId ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.DuplicatePrevBufferInstance.IsChannelAvailable( channelId ); + } + return false; + } + + public static bool ReleaseUVChannel( int nodeId, int channelId ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.DuplicatePrevBufferInstance.ReleaseUVChannel( nodeId, channelId ); + } + return false; + } + + public static bool RegisterUVChannel( int nodeId, int channelId, string name ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.DuplicatePrevBufferInstance.RegisterUVChannel( nodeId, channelId, name ); + } + return false; + } + + public static void GetFirstAvailableName( int nodeId, WirePortDataType type, out string outProperty, out string outInspector, bool useCustomPrefix = false, string customPrefix = null ) + { + outProperty = string.Empty; + outInspector = string.Empty; + if( CurrentWindow != null ) + { + CurrentWindow.DuplicatePrevBufferInstance.GetFirstAvailableName( nodeId, type, out outProperty, out outInspector, useCustomPrefix, customPrefix ); + } + } + + + public static bool IsNumericName( string name ) + { + Match match = Regex.Match( name, NumericNamePattern ); + if( match != null && match.Success ) + return true; + return false; + } + + public static bool CheckInvalidUniformName( string name ) + { + if( m_reservedPropertyNames.ContainsKey( name ) ) + { + ShowMessage( string.Format( Constants.ReservedPropertyNameStr, name ) ); + return true; + } + + if( IsNumericName( name )) + { + ShowMessage( string.Format( Constants.NumericPropertyNameStr, name ) ); + return true; + } + + return false; + } + + public static bool RegisterUniformName( int nodeId, string name ) + { + if( CheckInvalidUniformName( name ) ) + { + return false; + } + + if( CurrentWindow != null ) + { + return CurrentWindow.DuplicatePrevBufferInstance.RegisterUniformName( nodeId, name ); + } + return false; + } + + public static bool ReleaseUniformName( int nodeId, string name ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.DuplicatePrevBufferInstance.ReleaseUniformName( nodeId, name ); + } + return false; + } + + public static bool IsUniformNameAvailable( string name ) + { + if( CheckInvalidUniformName( name ) ) + { + return false; + } + + if( CurrentWindow != null ) + { + return CurrentWindow.DuplicatePrevBufferInstance.IsUniformNameAvailable( name ); + } + return false; + } + + public static int CheckUniformNameOwner( string name ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.DuplicatePrevBufferInstance.CheckUniformNameOwner( name ); + } + return -1; + } + + public static string GetUniqueUniformName( string name ) + { + int num = 0; + Regex reg = new Regex( @"([0-9]+)$" ); + Match match = reg.Match( name ); + if( match.Success ) + { + string s = match.Groups[ 1 ].Captures[ 0 ].Value; + num = int.Parse( s ); + name = name.Replace( s, "" ); + } + + for( int i = num + 1; i < 1000; i++ ) + { + string testName = name + i; + + if( CheckInvalidUniformName( testName ) ) + { + continue; + } + + if( CurrentWindow != null ) + { + if( CurrentWindow.DuplicatePrevBufferInstance.IsUniformNameAvailable( testName ) ) + { + return testName; + } + } + } + return name; + } + + public static bool RegisterLocalVariableName( int nodeId, string name ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.DuplicatePrevBufferInstance.RegisterLocalVariableName( nodeId, name ); + } + return false; + } + + public static bool ReleaseLocalVariableName( int nodeId, string name ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.DuplicatePrevBufferInstance.ReleaseLocalVariableName( nodeId, name ); + } + return false; + } + + public static bool IsLocalvariableNameAvailable( string name ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.DuplicatePrevBufferInstance.IsLocalvariableNameAvailable( name ); + } + return false; + } + + public static string GetChannelName( int channelId ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.DuplicatePrevBufferInstance.GetChannelName( channelId ); + } + return string.Empty; + } + + public static void SetChannelName( int channelId, string name ) + { + if( CurrentWindow != null ) + { + CurrentWindow.DuplicatePrevBufferInstance.SetChannelName( channelId, name ); + } + } + + public static int RegisterFirstAvailableChannel( int nodeId, string name ) + { + if( CurrentWindow != null ) + { + return CurrentWindow.DuplicatePrevBufferInstance.RegisterFirstAvailableChannel( nodeId, name ); + } + return -1; + } + + public static int PortCategorytoAttayIdx( MasterNodePortCategory category ) + { + if( m_portCategoryToArrayIdx.ContainsKey( category )) + return m_portCategoryToArrayIdx[category]; + + return m_portCategoryToArrayIdx[ MasterNodePortCategory.Fragment ]; + } + + public static bool DisplayDialog( string shaderPath ) + { + string value = System.String.Format( "Save changes to the shader {0} before closing?", shaderPath ); + return EditorUtility.DisplayDialog( "Load selected", value, "Yes", "No" ); + } + + public static void ForceUpdateFromMaterial() + { + if( CurrentWindow != null ) + { + // CurrentWindow.Focus(); + CurrentWindow.ForceUpdateFromMaterial(); + } + } + + public static void MarkToRepaint() { if( CurrentWindow != null ) CurrentWindow.MarkToRepaint(); } + public static void RequestSave() { if( CurrentWindow != null ) CurrentWindow.RequestSave(); } + public static string FloatToString( float value ) + { + string floatStr = value.ToString(); + if( value % 1 == 0 ) + { + floatStr += ".0"; + } + return floatStr; + } + + public static int CurrentShaderVersion() + { + if( CurrentWindow != null ) + { + return CurrentWindow.CurrentGraph.LoadedShaderVersion; + } + return -1; + } + + public static bool IsProperty( PropertyType type ) { return ( type == PropertyType.Property || type == PropertyType.InstancedProperty ); } + + public static MasterNode CurrentMasterNode() + { + if( CurrentWindow != null ) + { + return CurrentWindow.CurrentGraph.CurrentMasterNode; + } + return null; + } + + public static void AddVirtualTextureCount() { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.AddVirtualTextureCount(); } } + + public static bool HasVirtualTexture() + { + if( CurrentWindow != null ) + { + return CurrentWindow.CurrentGraph.HasVirtualTexture; + } + return false; + } + + public static void RemoveVirtualTextureCount() { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.RemoveVirtualTextureCount(); } } + + //public static void AddInstancePropertyCount() { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.AddInstancePropertyCount(); } } + + public static bool IsInstancedShader() + { + if( CurrentWindow != null ) + { + return CurrentWindow.CurrentGraph.IsInstancedShader; + } + return false; + } + + //public static void RemoveInstancePropertyCount() { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.RemoveInstancePropertyCount(); } } + //public static void AddNormalDependentCount() { if ( CurrentWindow != null ) { CurrentWindow.CurrentGraph.AddNormalDependentCount(); } } + //public static void RemoveNormalDependentCount() { if ( CurrentWindow != null ) { CurrentWindow.CurrentGraph.RemoveNormalDependentCount(); } } + //public static bool IsNormalDependent() + //{ + // if ( CurrentWindow != null ) + // { + // return CurrentWindow.CurrentGraph.IsNormalDependent; + // } + // return false; + //} + + public static void CopyValuesFromMaterial( Material mat ) + { + if( CurrentWindow != null && CurrentWindow.CurrentMaterial == mat ) + { + CurrentWindow.CurrentGraph.CopyValuesFromMaterial( mat ); + } + else + { + int aseWindowCount = IOUtils.AllOpenedWindows.Count; + for( int i = 0; i < aseWindowCount; i++ ) + { + if( IOUtils.AllOpenedWindows[ i ] != m_currentWindow && IOUtils.AllOpenedWindows[ i ].CurrentMaterial == mat ) + { + IOUtils.AllOpenedWindows[ i ].CurrentGraph.CopyValuesFromMaterial( mat ); + break; + } + } + } + } + + // Sampler Node + public static void RegisterSamplerNode( SamplerNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.SamplerNodes.AddNode( node ); } } + public static void UnregisterSamplerNode( SamplerNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.SamplerNodes.RemoveNode( node ); } } + public static string[] SamplerNodeArr() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.SamplerNodes.NodesArr; } return null; } + public static SamplerNode GetSamplerNode( int idx ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.SamplerNodes.GetNode( idx ); } return null; } + public static void UpdateSamplerDataNode( int uniqueId, string data ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.SamplerNodes.UpdateDataOnNode( uniqueId, data ); } } + public static int GetSamplerNodeRegisterId( int uniqueId ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.SamplerNodes.GetNodeRegisterIdx( uniqueId ); } return -1; } + public static int GetSamplerNodeAmount() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.SamplerNodes.NodesList.Count; } return -1; } + + // Float Node + public static void RegisterFloatIntNode( PropertyNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FloatIntNodes.AddNode( node ); } } + public static void UnregisterFloatIntNode( PropertyNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FloatIntNodes.RemoveNode( node ); } } + public static string[] FloatIntNodeArr() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.FloatIntNodes.NodesArr; } return null; } + public static int[] FloatIntNodeIds() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.FloatIntNodes.NodeIds; } return null; } + public static PropertyNode GetFloatIntNode( int idx ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.FloatIntNodes.GetNode( idx ); } return null; } + public static void UpdateFloatIntDataNode( int uniqueId, string data ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FloatIntNodes.UpdateDataOnNode( uniqueId, data ); } } + public static int GetFloatIntNodeRegisterId( int uniqueId ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.FloatIntNodes.GetNodeRegisterIdx( uniqueId ); } return -1; } + public static int GetNodeIdByName( string name ) + { + if( CurrentWindow != null ) + { + UsageListFloatIntNodes list = CurrentWindow.CurrentGraph.FloatIntNodes; + int count = list.Count; + for( int i = 0; i < count; i++ ) + { + if( list.NodesList[ i ].PropertyName.Equals( name ) ) + return list.NodesList[ i ].UniqueId; + } + } + return -1; + } + public static PropertyNode GetFloatIntNodeByUniqueId( int uniqueId ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.FloatIntNodes.GetNodeByUniqueId( uniqueId ); } return null; } + //public static int GetFloatNodeAmount() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.FloatNodes.NodesList.Count; } return -1; } + + // Texture Property + public static void RegisterTexturePropertyNode( TexturePropertyNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.TexturePropertyNodes.AddNode( node ); } } + public static void UnregisterTexturePropertyNode( TexturePropertyNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.TexturePropertyNodes.RemoveNode( node ); } } + public static string[] TexturePropertyNodeArr() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.TexturePropertyNodes.NodesArr; } return null; } + public static TexturePropertyNode GetTexturePropertyNode( int idx ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.TexturePropertyNodes.GetNode( idx ); } return null; } + public static void UpdateTexturePropertyDataNode( int uniqueId, string data ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.TexturePropertyNodes.UpdateDataOnNode( uniqueId, data ); } } + public static int GetTexturePropertyNodeRegisterId( int uniqueId ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.TexturePropertyNodes.GetNodeRegisterIdx( uniqueId ); } return -1; } + public static int GetTexturePropertyNodeAmount() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.TexturePropertyNodes.NodesList.Count; } return -1; } + + // Texture Array + public static void RegisterTextureArrayNode( TextureArrayNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.TextureArrayNodes.AddNode( node ); } } + public static void UnregisterTextureArrayNode( TextureArrayNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.TextureArrayNodes.RemoveNode( node ); } } + public static string[] TextureArrayNodeArr() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.TextureArrayNodes.NodesArr; } return null; } + public static TextureArrayNode GetTextureArrayNode( int idx ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.TextureArrayNodes.GetNode( idx ); } return null; } + public static void UpdateTextureArrayDataNode( int uniqueId, string data ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.TextureArrayNodes.UpdateDataOnNode( uniqueId, data ); } } + public static int GetTextureArrayNodeRegisterId( int uniqueId ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.TextureArrayNodes.GetNodeRegisterIdx( uniqueId ); } return -1; } + public static int GetTextureArrayNodeAmount() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.TextureArrayNodes.NodesList.Count; } return -1; } + + // Raw Property Node + public static void RegisterRawPropertyNode( PropertyNode node ) { if( CurrentWindow != null ) { CurrentWindow.OutsideGraph.RawPropertyNodes.AddNode( node ); } } + public static void UnregisterRawPropertyNode( PropertyNode node ) { if( CurrentWindow != null ) { CurrentWindow.OutsideGraph.RawPropertyNodes.RemoveNode( node ); } } + + // Property Node + public static void RegisterPropertyNode( PropertyNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.PropertyNodes.AddNode( node ); } } + public static void UnregisterPropertyNode( PropertyNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.PropertyNodes.RemoveNode( node ); } } + public static string[] PropertyNodeNodeArr() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.PropertyNodes.NodesArr; } return null; } + public static PropertyNode GetPropertyNode( int idx ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.PropertyNodes.GetNode( idx ); } return null; } + public static PropertyNode GetPropertyNodeByUniqueId( int uniqueId ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.PropertyNodes.GetNodeByUniqueId( uniqueId ); } return null; } + public static void UpdatePropertyDataNode( int uniqueId, string data ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.PropertyNodes.UpdateDataOnNode( uniqueId, data ); } } + public static int GetPropertyNodeRegisterId( int uniqueId ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.PropertyNodes.GetNodeRegisterIdx( uniqueId ); } return -1; } + public static List PropertyNodesList() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.PropertyNodes.NodesList; } return null; } + public static int GetPropertyNodeAmount() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.PropertyNodes.NodesList.Count; } return -1; } + + // Function Inputs + public static void RegisterFunctionInputNode( FunctionInput node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionInputNodes.AddNode( node ); } } + public static void UnregisterFunctionInputNode( FunctionInput node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionInputNodes.RemoveNode( node ); } } + public static void UpdateFunctionInputData( int uniqueId, string data ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionInputNodes.UpdateDataOnNode( uniqueId, data ); } } + public static List FunctionInputList() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.FunctionInputNodes.NodesList; } return null; } + + // Function Nodes + public static void RegisterFunctionNode( FunctionNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionNodes.AddNode( node ); } } + public static void UnregisterFunctionNode( FunctionNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionNodes.RemoveNode( node ); } } + public static void UpdateFunctionData( int uniqueId, string data ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionNodes.UpdateDataOnNode( uniqueId, data ); } } + public static List FunctionList() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.FunctionNodes.NodesList; } return null; } + + // Function Outputs + public static void RegisterFunctionOutputNode( FunctionOutput node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionOutputNodes.AddNode( node ); } } + public static void UnregisterFunctionOutputNode( FunctionOutput node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionOutputNodes.RemoveNode( node ); } } + public static void UpdateFunctionOutputData( int uniqueId, string data ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionOutputNodes.UpdateDataOnNode( uniqueId, data ); } } + public static List FunctionOutputList() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.FunctionOutputNodes.NodesList; } return null; } + + // Function Switches Copy + public static void RegisterFunctionSwitchCopyNode( FunctionSwitch node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionSwitchCopyNodes.AddNode( node ); } } + public static void UnregisterFunctionSwitchCopyNode( FunctionSwitch node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionSwitchCopyNodes.RemoveNode( node ); } } + public static void UpdateFunctionSwitchCopyData( int uniqueId, string data ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionSwitchCopyNodes.UpdateDataOnNode( uniqueId, data ); } } + public static List FunctionSwitchCopyList() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.FunctionSwitchCopyNodes.NodesList; } return null; } + + // Function Switches + public static void RegisterFunctionSwitchNode( FunctionSwitch node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionSwitchNodes.AddNode( node ); } } + public static void UnregisterFunctionSwitchNode( FunctionSwitch node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionSwitchNodes.RemoveNode( node ); } } + public static void UpdateFunctionSwitchData( int uniqueId, string data ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionSwitchNodes.UpdateDataOnNode( uniqueId, data ); } } + public static List FunctionSwitchList() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.FunctionSwitchNodes.NodesList; } return null; } + public static void UpdateFunctionSwitchArr() { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.FunctionSwitchNodes.UpdateNodeArr(); } } + public static string[] FunctionSwitchesNodeArr() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.FunctionSwitchNodes.NodesArr; } return null; } + public static FunctionSwitch GetFunctionSwitchNode( int idx ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.FunctionSwitchNodes.GetNode( idx ); } return null; } + public static int GetFunctionSwitchNodeIndex( int uniqueId ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.FunctionSwitchNodes.GetNodeRegisterIdx( uniqueId ); } return -1; } + + // Screen Color Node + public static void RegisterScreenColorNode( ScreenColorNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.ScreenColorNodes.AddNode( node ); } } + public static void UnregisterScreenColorNode( ScreenColorNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.ScreenColorNodes.RemoveNode( node ); } } + public static string[] ScreenColorNodeArr() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.ScreenColorNodes.NodesArr; } return null; } + public static ScreenColorNode GetScreenColorNode( int idx ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.ScreenColorNodes.GetNode( idx ); } return null; } + public static int GetScreenColorNodeRegisterId( int uniqueId ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.ScreenColorNodes.GetNodeRegisterIdx( uniqueId ); } return -1; } + public static void UpdateScreenColorDataNode( int uniqueId, string data ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.ScreenColorNodes.UpdateDataOnNode( uniqueId, data ); } } + public static int GetScreenColorNodeAmount() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.ScreenColorNodes.NodesList.Count; } return -1; } + + // Local Var Node + public static int RegisterLocalVarNode( RegisterLocalVarNode node ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.LocalVarNodes.AddNode( node ); } return -1; } + public static void UnregisterLocalVarNode( RegisterLocalVarNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.LocalVarNodes.RemoveNode( node ); } } + public static string[] LocalVarNodeArr() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.LocalVarNodes.NodesArr; } return null; } + public static int LocalVarNodeAmount() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.LocalVarNodes.NodesList.Count; } return 0; } + public static int GetLocalVarNodeRegisterId( int uniqueId ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.LocalVarNodes.GetNodeRegisterIdx( uniqueId ); } return -1; } + public static RegisterLocalVarNode GetLocalVarNode( int idx ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.LocalVarNodes.GetNode( idx ); } return null; } + public static void UpdateLocalVarDataNode( int uniqueId, string data ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.LocalVarNodes.UpdateDataOnNode( uniqueId, data ); } } + + //Global Array + public static void RegisterGlobalArrayNode( GlobalArrayNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.GlobalArrayNodes.AddNode( node ); } } + public static void UnregisterGlobalArrayNode( GlobalArrayNode node ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.GlobalArrayNodes.RemoveNode( node ); } } + public static string[] GlobalArrayNodeArr() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.GlobalArrayNodes.NodesArr; } return null; } + public static GlobalArrayNode GetGlobalArrayNode( int idx ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.GlobalArrayNodes.GetNode( idx ); } return null; } + public static int GetGlobalArrayNodeRegisterId( int uniqueId ) { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.GlobalArrayNodes.GetNodeRegisterIdx( uniqueId ); } return -1; } + public static void UpdateGlobalArrayDataNode( int uniqueId, string data ) { if( CurrentWindow != null ) { CurrentWindow.CurrentGraph.GlobalArrayNodes.UpdateDataOnNode( uniqueId, data ); } } + public static int GetGlobalArrayNodeAmount() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.GlobalArrayNodes.NodesList.Count; } return -1; } + + + public static void FocusOnNode( ParentNode node, float zoom, bool selectNode ) { if( CurrentWindow != null ) { CurrentWindow.FocusOnNode( node, zoom, selectNode ); } } + public static PrecisionType CurrentPrecision() { if( CurrentWindow != null ) { return CurrentWindow.CurrentGraph.CurrentPrecision; } return PrecisionType.Float; } + public static string CurrentPrecisionCg() { if( CurrentWindow != null ) { return m_precisionTypeToCg[ CurrentWindow.CurrentGraph.CurrentPrecision ]; } return m_precisionTypeToCg[ PrecisionType.Float ]; } + + public static PrecisionType GetFinalPrecision( PrecisionType precision ) + { + if( CurrentWindow != null && CurrentWindow.CurrentGraph != null ) + { + PrecisionType mainPrecision = CurrentWindow.CurrentGraph.CurrentPrecision; + if( (int)mainPrecision > (int)precision ) + return mainPrecision; + } + return precision; + } + + public static bool GetNodeAvailabilityInBitArray( int bitArray, NodeAvailability availability ) { return ( bitArray & (int)availability ) != 0; } + public static bool GetCategoryInBitArray( int bitArray, MasterNodePortCategory category ) { return ( bitArray & (int)category ) != 0; } + public static void SetCategoryInBitArray( ref int bitArray, MasterNodePortCategory category ) { bitArray = bitArray | (int)category; } + + public static int GetPriority( WirePortDataType type ) { return m_portPriority[ type ]; } + + public static void ShowIncompatiblePortMessage( bool fromInput, ParentNode inNode, WirePort inPort, ParentNode outNode, WirePort outPort ) + { + string inPortName = inPort.Name.Equals( Constants.EmptyPortValue ) ? inPort.PortId.ToString() : inPort.Name; + string outPortName = outPort.Name.Equals( Constants.EmptyPortValue ) ? outPort.PortId.ToString() : outPort.Name; + ShowMessage( outNode.UniqueId, string.Format( ( fromInput ? IncorrectInputConnectionErrorMsg : IncorrectOutputConnectionErrorMsg ), inPortName, inNode.Attributes.Name, inPort.DataType, outPort.DataType, outPortName, outNode.Attributes.Name ) ); + } + + public static void ShowNoVertexModeNodeMessage( ParentNode node ) + { + ShowMessage( node.UniqueId, string.Format( NoVertexModeNodeWarning, node.Attributes.Name ), MessageSeverity.Warning ); + } + + public static int TotalExampleMaterials { get { return m_exampleMaterialIDs.Count; } } + + public static int ShaderIndentLevel + { + get { return m_shaderIndentLevel; } + set + { + m_shaderIndentLevel = Mathf.Max( value, 0 ); + m_shaderIndentTabs = string.Empty; + for( int i = 0; i < m_shaderIndentLevel; i++ ) { m_shaderIndentTabs += "\t"; } + } + } + + public static string ShaderIndentTabs { get { return m_shaderIndentTabs; } } + public static void AddLineToShaderBody( ref string ShaderBody, string line ) { ShaderBody += m_shaderIndentTabs + line; } + public static void AddMultiLineToShaderBody( ref string ShaderBody, string[] lines ) + { + for( int i = 0; i < lines.Length; i++ ) + { + ShaderBody += m_shaderIndentTabs + lines[ i ]; + } + } + + public static void ClearUndoHelper() + { + m_undoHelper.Clear(); + } + + public static bool CheckUndoNode( ParentNode node ) + { + if( node == null ) + return false; + if( m_undoHelper.ContainsKey( node.UniqueId ) ) + { + return false; + } + + m_undoHelper.Add( node.UniqueId, node ); + EditorUtility.SetDirty( node ); + return true; + } + + public static void MarkUndoAction() + { + SerializeHelperCounter = 2; + } + + public static bool SerializeFromUndo() + { + if( SerializeHelperCounter > 0 ) + { + SerializeHelperCounter--; + return true; + } + return false; + } + + public static int GetKeywordId( string keyword, TemplateSRPType type = TemplateSRPType.BuiltIn) + { + switch( type ) + { + default: + case TemplateSRPType.BuiltIn: + { + if( AvailableKeywordsDict.Count != AvailableKeywords.Length ) + { + AvailableKeywordsDict.Clear(); + for( int i = 1; i < AvailableKeywords.Length; i++ ) + { + AvailableKeywordsDict.Add( AvailableKeywords[ i ], i ); + } + } + + if( AvailableKeywordsDict.ContainsKey( keyword ) ) + { + return AvailableKeywordsDict[ keyword ]; + } + } + break; + case TemplateSRPType.HD: + case TemplateSRPType.Lightweight: + { + if( AvailableURPKeywordsDict.Count != AvailableURPKeywords.Length ) + { + AvailableURPKeywordsDict.Clear(); + for( int i = 1; i < AvailableURPKeywords.Length; i++ ) + { + AvailableURPKeywordsDict.Add( AvailableURPKeywords[ i ], i ); + } + } + + if( AvailableURPKeywordsDict.ContainsKey( keyword ) ) + { + return AvailableURPKeywordsDict[ keyword ]; + } + } + break; + } + + + return 0; + } + public static string ForceLFLineEnding( string body ) + { + body = body.Replace( "\r\n", "\n" ); + body = body.Replace( "\r", "\n" ); + return body; + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/UIUtils.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/UIUtils.cs.meta new file mode 100644 index 0000000..9185851 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/UIUtils.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 23e0210afe076544ca92d761094a9119 +timeCreated: 1481126954 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/UndoUtils.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/UndoUtils.cs new file mode 100644 index 0000000..d7b35d3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/UndoUtils.cs @@ -0,0 +1,12 @@ +using UnityEditor; +using UnityEngine; +using UnityEngine.Internal; +using System; + +namespace AmplifyShaderEditor +{ + public class UndoUtils + { + + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/UndoUtils.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/UndoUtils.cs.meta new file mode 100644 index 0000000..e4ad8c0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/UndoUtils.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 89dee7566d97f1847b9fe114e1c9a1a2 +timeCreated: 1489603190 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/UpperLeftWidgetHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/UpperLeftWidgetHelper.cs new file mode 100644 index 0000000..9e92fe2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/UpperLeftWidgetHelper.cs @@ -0,0 +1,91 @@ +using System; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + public class UpperLeftWidgetHelper + { + public int DrawWidget( ParentNode owner, int selectedIndex, GUIContent[] displayedOptions ) + { + if( owner.DropdownEditing ) + { + int newValue = owner.EditorGUIPopup( owner.DropdownRect, selectedIndex, displayedOptions, UIUtils.PropertyPopUp ); + if( newValue != selectedIndex ) + { + owner.DropdownEditing = false; + } + return newValue; + } + return selectedIndex; + } + + public int DrawWidget( ParentNode owner, int selectedIndex, string[] displayedOptions ) + { + if( owner.DropdownEditing ) + { + int newValue = owner.EditorGUIPopup( owner.DropdownRect, selectedIndex, displayedOptions, UIUtils.PropertyPopUp ); + if( newValue != selectedIndex ) + { + owner.DropdownEditing = false; + } + return newValue; + } + return selectedIndex; + } + + public int DrawWidget( ParentNode owner, int selectedIndex, string[] displayedOptions, int[] optionValues ) + { + if( owner.DropdownEditing ) + { + int newValue = owner.EditorGUIIntPopup( owner.DropdownRect, selectedIndex, displayedOptions, optionValues, UIUtils.PropertyPopUp ); + if( newValue != selectedIndex ) + { + owner.DropdownEditing = false; + } + return newValue; + } + return selectedIndex; + } + + // GC free version + public void DrawWidget( ref TEnum selectedIndex, ParentNode owner, Action callback ) where TEnum : struct + { + if( owner.DropdownEditing ) + { + Enum asEnumType = selectedIndex as Enum; + if( asEnumType != null ) + { + EditorGUI.BeginChangeCheck(); + selectedIndex = ( owner.EditorGUIEnumPopup( owner.DropdownRect, asEnumType, UIUtils.PropertyPopUp ) as TEnum? ).Value; + if( EditorGUI.EndChangeCheck() ) + { + owner.DropdownEditing = false; + if( callback != null ) + callback( owner ); + } + } + } + } + + /* + * USE THIS OVERRIDE IN CASE THE NODE DOESN'T HAVE PREVIEW + */ + //public override void AfterCommonInit() + //{ + // base.AfterCommonInit(); + // if( PaddingTitleLeft == 0 ) + // { + // PaddingTitleLeft = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + // if( PaddingTitleRight == 0 ) + // PaddingTitleRight = Constants.PropertyPickerWidth + Constants.IconsLeftRightMargin; + // } + //} + + + /* + * USE THE SOURCE CODE BELOW INTO THE NODE YOU WANT THE WIDGET TO SHOW + */ + //private UpperLeftWidgetHelper m_upperLeftWidget = new UpperLeftWidgetHelper(); + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/UpperLeftWidgetHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/UpperLeftWidgetHelper.cs.meta new file mode 100644 index 0000000..6e11052 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/UpperLeftWidgetHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 32dbececad3a67a4fbde694ae50ce82c +timeCreated: 1504080603 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/WindowHelper.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/WindowHelper.cs new file mode 100644 index 0000000..3ae6481 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/WindowHelper.cs @@ -0,0 +1,260 @@ +#if UNITY_EDITOR +using System; +using System.Reflection; +using UnityEditor; +using UnityEngine; + +public static class WindowHelper +{ + private class R_EditorWindow + { + private EditorWindow m_instance; + private System.Type m_type; + + public R_EditorWindow( EditorWindow instance ) + { + m_instance = instance; + m_type = instance.GetType(); + } + + public object Parent + { + get + { + var field = m_type.GetField( "m_Parent", BindingFlags.Instance | BindingFlags.NonPublic ); + return field.GetValue( m_instance ); + } + } + + public object Docked + { + get + { + var property = m_type.GetProperty( "docked", BindingFlags.Instance | BindingFlags.NonPublic ); + return property.GetValue( m_instance, null ); + } + } + } + + private class R_DockArea + { + private object m_instance; + private System.Type m_type; + + public R_DockArea( object instance ) + { + m_instance = instance; + m_type = instance.GetType(); + } + + public object Window + { + get + { + var property = m_type.GetProperty( "window", BindingFlags.Instance | BindingFlags.Public ); + return property.GetValue( m_instance, null ); + } + } + + public object ActualView + { + get + { + var field = m_type.GetField( "m_ActualView", BindingFlags.Instance | BindingFlags.NonPublic ); + return field.GetValue( m_instance ); + } + } + + public object OriginalDragSource + { + set + { + var field = m_type.GetField( "s_OriginalDragSource", BindingFlags.Static | BindingFlags.NonPublic ); + field.SetValue( null, value ); + } + } + + + public void AddTab( EditorWindow pane ) + { +#if UNITY_2018_3_OR_NEWER + var method = m_type.GetMethod( "AddTab", BindingFlags.Instance | BindingFlags.Public, null, new System.Type[] { typeof( EditorWindow ), typeof( bool ) }, null ); + if( method != null ) + method.Invoke( m_instance, new object[] { pane, true } ); +#else + var method = m_type.GetMethod( "AddTab", BindingFlags.Instance | BindingFlags.Public, null, new System.Type[] { typeof( EditorWindow ) }, null ); + if( method != null ) + method.Invoke( m_instance, new object[] { pane } ); +#endif + } + + public void RemoveTab( EditorWindow pane ) + { + if( !pane.maximized ) + { + var method = m_type.GetMethod( "RemoveTab", BindingFlags.Instance | BindingFlags.Public, null, new System.Type[] { typeof( EditorWindow ) }, null ); + if( method != null ) + method.Invoke( m_instance, new object[] { pane } ); + } + } + } + + private class R_ContainerWindow + { + private object m_instance; + private System.Type m_type; + + public R_ContainerWindow( object instance ) + { + m_instance = instance; + m_type = instance.GetType(); + } + + public object RootSplitView + { + get + { + var property = m_type.GetProperty( "rootSplitView", BindingFlags.Instance | BindingFlags.Public ); + return property.GetValue( m_instance, null ); + } + } + + public object RootView + { + get + { + var property = m_type.GetProperty( "rootView", BindingFlags.Instance | BindingFlags.Public ); + return property.GetValue( m_instance, null ); + } + } + + public object WindowPtr + { + get + { + var all = m_type.GetNestedTypes(); + foreach( var item in all ) + { + Debug.Log( item.Name ); + } + var property = m_type.GetField( "m_WindowPtr", BindingFlags.Instance | BindingFlags.NonPublic ); + return property.GetValue( m_instance ); + } + } + } + + private class R_SplitView + { + private object m_instance; + private System.Type m_type; + + public R_SplitView( object instance ) + { + m_instance = instance; + m_type = instance.GetType(); + } + + public object DragOver( EditorWindow child, Vector2 screenPoint ) + { + var method = m_type.GetMethod( "DragOver", BindingFlags.Instance | BindingFlags.Public ); + return method.Invoke( m_instance, new object[] { child, screenPoint } ); + } + + public void PerformDrop( EditorWindow child, object dropInfo, Vector2 screenPoint ) + { + var method = m_type.GetMethod( "PerformDrop", BindingFlags.Instance | BindingFlags.Public ); + method.Invoke( m_instance, new object[] { child, dropInfo, screenPoint } ); + } + } + + public enum DockPosition + { + Left, + Top, + Right, + Bottom + } + + public static bool IsDocked( this EditorWindow wnd ) + { +#if UNITY_2020_2_OR_NEWER + return wnd.docked; +#else + var parent = new R_EditorWindow( wnd ); + return (bool)parent.Docked; +#endif + } + + public static void Undock( this EditorWindow wnd ) + { + var parent = new R_EditorWindow( wnd ); + var dockArea = new R_DockArea( parent.Parent ); + dockArea.RemoveTab( wnd ); + wnd.Show( true ); + } + + public static void RemoveTab( this EditorWindow wnd ) + { + var parent = new R_EditorWindow( wnd ); + var dockArea = new R_DockArea( parent.Parent ); + dockArea.RemoveTab( wnd ); + } + + /// + /// Docks the second window to the first window at the given position + /// + public static void Dock( this EditorWindow wnd, EditorWindow other, DockPosition position ) + { + var mousePosition = GetFakeMousePosition( wnd, position ); + + var parent = new R_EditorWindow( wnd ); + var child = new R_EditorWindow( other ); + var dockArea = new R_DockArea( parent.Parent ); + var containerWindow = new R_ContainerWindow( dockArea.Window ); + var splitView = new R_SplitView( containerWindow.RootSplitView ); + var dropInfo = splitView.DragOver( other, mousePosition ); + dockArea.OriginalDragSource = child.Parent; + splitView.PerformDrop( other, dropInfo, mousePosition ); + } + + + /// + /// Adds the the second window as a tab at the end of the first window tab list + /// + /// + /// + public static void AddTab( this EditorWindow existingWindow, EditorWindow newWindow ) + { + var parent = new R_EditorWindow( existingWindow ); + var child = new R_EditorWindow( newWindow ); + var dockArea = new R_DockArea( parent.Parent ); + dockArea.OriginalDragSource = child.Parent; + dockArea.AddTab( newWindow ); + } + + private static Vector2 GetFakeMousePosition( EditorWindow wnd, DockPosition position ) + { + Vector2 mousePosition = Vector2.zero; + + // The 20 is required to make the docking work. + // Smaller values might not work when faking the mouse position. + switch ( position ) + { + case DockPosition.Left: + mousePosition = new Vector2( 20, wnd.position.size.y / 2 ); + break; + case DockPosition.Top: + mousePosition = new Vector2( wnd.position.size.x / 2, 20 ); + break; + case DockPosition.Right: + mousePosition = new Vector2( wnd.position.size.x - 20, wnd.position.size.y / 2 ); + break; + case DockPosition.Bottom: + mousePosition = new Vector2( wnd.position.size.x / 2, wnd.position.size.y - 20 ); + break; + } + + return GUIUtility.GUIToScreenPoint( mousePosition ); + } +} +#endif diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/WindowHelper.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/WindowHelper.cs.meta new file mode 100644 index 0000000..4b58919 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/WindowHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ad6ef05d39dc39e42b8bfe0bdb826b7a +timeCreated: 1494336778 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/WindowsUtil.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/WindowsUtil.cs new file mode 100644 index 0000000..3a57b9b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/WindowsUtil.cs @@ -0,0 +1,148 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +#if UNITY_EDITOR_WIN + +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; + +public class WindowsUtil +{ + public const int GWL_STYLE = -16; //hex constant for style changing + public const int WS_BORDER = 0x00800000; //window with border + public const int WS_CAPTION = 0x00C00000; //window with a title bar with border + public const int WS_SYSMENU = 0x00080000; //window with no borders etc. + public const int WS_MAXIMIZE = 0x01000000; + public const int WS_MAXIMIZEBOX = 0x00010000; + public const int WS_MINIMIZE = 0x20000000; + public const int WS_MINIMIZEBOX = 0x00020000; + public const int WS_SIZEBOX = 0x00040000; + public const int WS_VISIBLE = 0x10000000; + public const int WS_TABSTOP = 0x00010000; + public const int WS_CLIPCHILDREN = 0x02000000; + public const int WS_CLIPSIBLINGS = 0x04000000; + + [DllImport( "user32.dll", EntryPoint = "SetWindowPos" )] + public static extern bool SetWindowPos( System.IntPtr hwnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags ); + + public delegate bool EnumWindowsProc( System.IntPtr hWnd, System.IntPtr lParam ); + + [DllImport( "user32.dll", CharSet = CharSet.Auto, ExactSpelling = true )] + public static extern IntPtr GetDesktopWindow(); + + [DllImport( "user32.dll" )] + public static extern int SetWindowLong( IntPtr hWnd, int nIndex, int dwNewLong ); + + [DllImport( "user32.dll" )] + public static extern int GetWindowLong( IntPtr hWnd, int nIndex ); + + [DllImport( "user32.dll", ExactSpelling = true, SetLastError = true )] + internal static extern int MapWindowPoints( IntPtr hWndFrom, IntPtr hWndTo, [In, Out] ref Rect rect, [MarshalAs( UnmanagedType.U4 )] int cPoints ); + + [DllImport( "user32.dll" )] + public static extern bool EnumWindows( EnumWindowsProc enumProc, System.IntPtr lParam ); + + [DllImport( "user32" )] + [return: MarshalAs( UnmanagedType.Bool )] + public static extern bool EnumChildWindows( IntPtr window, EnumWindowProc callback, IntPtr lParam ); + + public delegate bool EnumWindowProc( IntPtr hwnd, IntPtr lParam ); + + [DllImport( "user32.dll", SetLastError = true )] + public static extern bool MoveWindow( IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint ); + + [DllImport( "user32.dll", CharSet = CharSet.Auto, SetLastError = true )] + public static extern int GetWindowThreadProcessId( System.IntPtr handle, out int processId ); + + [DllImport( "user32.dll", SetLastError = true )] + public static extern IntPtr FindWindowEx( string lpClassName, string lpWindowName ); + + // Find window by Caption only. Note you must pass IntPtr.Zero as the first parameter. + [DllImport( "user32.dll", EntryPoint = "FindWindow", SetLastError = true )] + public static extern IntPtr FindWindowByCaptionEx( IntPtr ZeroOnly, string lpWindowName ); + + [DllImport( "user32.dll", SetLastError = true, CharSet = CharSet.Auto )] + public static extern int GetClassName( IntPtr hWnd, StringBuilder lpClassName, int nMaxCount ); + + [DllImport( "user32.dll" )] + public static extern int GetWindowText( System.IntPtr hWnd, StringBuilder text, int nMaxCount ); + + [DllImport( "user32.dll" )] + public static extern int GetWindowTextLength( System.IntPtr hWnd ); + + [DllImport( "user32.dll" )] + public static extern IntPtr FindWindowEx( IntPtr parentWindow, IntPtr previousChildWindow, string windowClass, string windowTitle ); + + [DllImport( "user32.dll" )] + public static extern IntPtr GetActiveWindow(); + + [DllImport( "user32.dll" )] + public static extern bool GetWindowRect( System.IntPtr hwnd, ref Rect rectangle ); + + static public IntPtr[] GetProcessWindows( int processId ) + { + List output = new List(); + IntPtr winPtr = IntPtr.Zero; + do + { + winPtr = FindWindowEx( IntPtr.Zero, winPtr, null, null ); + int id; + GetWindowThreadProcessId( winPtr, out id ); + if( id == processId ) + output.Add( winPtr ); + } while( winPtr != IntPtr.Zero ); + + return output.ToArray(); + } + + public struct Rect + { + public int Left { get; set; } + public int Top { get; set; } + public int Right { get; set; } + public int Bottom { get; set; } + public int Width { get { return Right - Left; } } + public int Height { get { return Bottom - Top; } } + + public override string ToString() + { + return "(l: " + Left + ", r: " + Right + ", t: " + Top + ", b: " + Bottom + ")"; + } + } + + public static bool GetProcessRect( System.Diagnostics.Process process, ref Rect rect ) + { + IntPtr[] winPtrs = WindowsUtil.GetProcessWindows( process.Id ); + + for( int i = 0; i < winPtrs.Length; i++ ) + { + bool gotRect = WindowsUtil.GetWindowRect( winPtrs[ i ], ref rect ); + if( gotRect && ( rect.Left != 0 && rect.Top != 0 ) ) + return true; + } + return false; + } + + public static void SetWindowPosition( int x, int y, int sizeX = 0, int sizeY = 0 ) + { + System.Diagnostics.Process process = System.Diagnostics.Process.GetCurrentProcess(); + process.Refresh(); + + EnumWindows( delegate ( System.IntPtr wnd, System.IntPtr param ) + { + int id; + GetWindowThreadProcessId( wnd, out id ); + if( id == process.Id ) + { + SetWindowPos( wnd, 0, x, y, sizeX, sizeY, sizeX * sizeY == 0 ? 1 : 0 ); + return false; + } + + return true; + }, System.IntPtr.Zero ); + } +} + +#endif \ No newline at end of file diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/WindowsUtil.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/WindowsUtil.cs.meta new file mode 100644 index 0000000..8200f79 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Utils/WindowsUtil.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 84d9a18b60b810c4c894886264a89da0 +timeCreated: 1559138384 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Version.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Version.meta new file mode 100644 index 0000000..c5ba7b8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Version.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6072f991722ef6c44b167cf204724a52 +folderAsset: yes +timeCreated: 1481126944 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Version/About.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Version/About.cs new file mode 100644 index 0000000..a147751 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Version/About.cs @@ -0,0 +1,66 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + public class About : EditorWindow + { + private const string AboutImageGUID = "8aba6bb20faf8824d9d81946542f1ce1"; + private Vector2 m_scrollPosition = Vector2.zero; + private Texture2D m_aboutImage; + + [MenuItem( "Window/Amplify Shader Editor/About...", false, 2001 )] + static void Init() + { + About window = (About)GetWindow( typeof( About ), true, "About Amplify Shader Editor" ); + window.minSize = new Vector2( 502, 290 ); + window.maxSize = new Vector2( 502, 290 ); + window.Show(); + } + + [MenuItem( "Window/Amplify Shader Editor/Manual", false, 2000 )] + static void OpenManual() + { + Application.OpenURL( "http://wiki.amplify.pt/index.php?title=Unity_Products:Amplify_Shader_Editor/Manual" ); + } + + private void OnEnable() + { + m_aboutImage = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( AboutImageGUID ) ); + } + + public void OnGUI() + { + m_scrollPosition = GUILayout.BeginScrollView( m_scrollPosition ); + + GUILayout.BeginVertical(); + + GUILayout.Space( 10 ); + + GUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + GUILayout.Box( m_aboutImage, GUIStyle.none ); + + if( Event.current.type == EventType.MouseUp && GUILayoutUtility.GetLastRect().Contains( Event.current.mousePosition ) ) + Application.OpenURL( "http://www.amplify.pt" ); + + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + GUIStyle labelStyle = new GUIStyle( EditorStyles.label ); + labelStyle.alignment = TextAnchor.MiddleCenter; + labelStyle.wordWrap = true; + + GUILayout.Label( "\nAmplify Shader Editor " + VersionInfo.StaticToString(), labelStyle, GUILayout.ExpandWidth( true ) ); + + GUILayout.Label( "\nCopyright (c) Amplify Creations, Lda. All rights reserved.\n", labelStyle, GUILayout.ExpandWidth( true ) ); + + GUILayout.EndVertical(); + + GUILayout.EndScrollView(); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Version/About.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Version/About.cs.meta new file mode 100644 index 0000000..1f8de1d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Version/About.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b52649079e4f9ef488724bd3c72449ed +timeCreated: 1481126958 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Version/VersionInfo.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Version/VersionInfo.cs new file mode 100644 index 0000000..2bd8ef6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Version/VersionInfo.cs @@ -0,0 +1,31 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; + +namespace AmplifyShaderEditor +{ + [Serializable] + public class VersionInfo + { + public const byte Major = 1; + public const byte Minor = 8; + public const byte Release = 9; + public static byte Revision = 00; + + //private static string StageSuffix = "_dev0"+Revision; + + //public static string StaticToString() + //{ + // return string.Format( "{0}.{1}.{2}", Major, Minor, Release ) + StageSuffix; + //} + + public static string StaticToString() + { + return string.Format( "{0}.{1}.{2}", Major, Minor, Release ) + ( Revision > 0 ? "r" + Revision.ToString() : "" ); + } + + public static int FullNumber { get { return Major * 10000 + Minor * 1000 + Release * 100 + Revision; } } + public static string FullLabel { get { return "Version=" + FullNumber; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Version/VersionInfo.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Version/VersionInfo.cs.meta new file mode 100644 index 0000000..f5edff8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Version/VersionInfo.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 581602482686da34180d35b169cd357a +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Wires.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Wires.meta new file mode 100644 index 0000000..04d01cf --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Wires.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 81b7f9ca313139248a5500a6da3c8a12 +folderAsset: yes +timeCreated: 1481126944 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/GLDraw.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/GLDraw.cs new file mode 100644 index 0000000..ab8011f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/GLDraw.cs @@ -0,0 +1,156 @@ +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + public class GLDraw + { + /* + * Clipping code: http://forum.unity3d.com/threads/17066-How-to-draw-a-GUI-2D-quot-line-quot?p=230386#post230386 + * Thick line drawing code: http://unifycommunity.com/wiki/index.php?title=VectorLine + */ + public static Material LineMaterial = null; + public static bool MultiLine = false; + private static Shader LineShader = null; + private static Rect BoundBox = new Rect(); + private static Vector3[] Allv3Points = new Vector3[] { }; + private static Vector2[] AllPerpendiculars = new Vector2[] { }; + private static Color[] AllColors = new Color[] { }; + private static Vector2 StartPt = Vector2.zero; + private static Vector2 EndPt = Vector2.zero; + + private static Vector3 Up = new Vector3( 0, 1, 0 ); + private static Vector3 Zero = new Vector3( 0, 0, 0 ); + + private static Vector2 Aux1Vec2 = Vector2.zero; + + private static int HigherBoundArray = 0; + + public static void CreateMaterial() + { + if( (object)LineMaterial != null && (object)LineShader != null ) + return; + + LineShader = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "50fc796413bac8b40aff70fb5a886273" ) ); + LineMaterial = new Material( LineShader ); + + LineMaterial.hideFlags = HideFlags.HideAndDontSave; + } + + public static void DrawCurve( Vector3[] allPoints, Vector2[] allNormals, Color[] allColors, int pointCount ) + { + CreateMaterial(); + LineMaterial.SetPass( ( MultiLine ? 1 : 0 ) ); + + GL.Begin( GL.TRIANGLE_STRIP ); + for( int i = 0; i < pointCount; i++ ) + { + GL.Color( allColors[ i ] ); + GL.TexCoord( Zero ); + GL.Vertex3( allPoints[ i ].x - allNormals[ i ].x, allPoints[ i ].y - allNormals[ i ].y, 0 ); + GL.TexCoord( Up ); + GL.Vertex3( allPoints[ i ].x + allNormals[ i ].x, allPoints[ i ].y + allNormals[ i ].y, 0 ); + } + GL.End(); + + } + + public static Rect DrawBezier( Vector2 start, Vector2 startTangent, Vector2 end, Vector2 endTangent, Color color, float width, int type = 1 ) + { + int segments = Mathf.FloorToInt( ( start - end ).magnitude / 20 ) * 3; // Three segments per distance of 20 + return DrawBezier( start, startTangent, end, endTangent, color, width, segments, type ); + } + + public static Rect DrawBezier( Vector2 start, Vector2 startTangent, Vector2 end, Vector2 endTangent, Color color, float width, int segments, int type = 1 ) + { + return DrawBezier( start, startTangent, end, endTangent, color, color, width, segments, type ); + } + + public static Rect DrawBezier( Vector2 start, Vector2 startTangent, Vector2 end, Vector2 endTangent, Color startColor, Color endColor, float width, int segments, int type = 1 ) + { + int pointsCount = segments + 1; + int linesCount = segments; + + HigherBoundArray = HigherBoundArray > pointsCount ? HigherBoundArray : pointsCount; + + Allv3Points = Handles.MakeBezierPoints( start, end, startTangent, endTangent, pointsCount ); + if( AllColors.Length < HigherBoundArray ) + { + AllColors = new Color[ HigherBoundArray ]; + AllPerpendiculars = new Vector2[ HigherBoundArray ]; + } + + startColor.a = ( type * 0.25f ); + endColor.a = ( type * 0.25f ); + + float minX = Allv3Points[ 0 ].x; + float minY = Allv3Points[ 0 ].y; + float maxX = Allv3Points[ 0 ].x; + float maxY = Allv3Points[ 0 ].y; + + float amount = 1 / (float)linesCount; + for( int i = 0; i < pointsCount; i++ ) + { + if( i == 0 ) + { + AllColors[ 0 ] = startColor; + StartPt.Set( startTangent.y, start.x ); + EndPt.Set( start.y, startTangent.x ); + } + else if( i == pointsCount - 1 ) + { + AllColors[ pointsCount - 1 ] = endColor; + StartPt.Set( end.y, endTangent.x ); + EndPt.Set( endTangent.y, end.x ); + } + else + { + AllColors[ i ] = Color.LerpUnclamped( startColor, endColor, amount * i ); + + minX = ( Allv3Points[ i ].x < minX ) ? Allv3Points[ i ].x : minX; + minY = ( Allv3Points[ i ].y < minY ) ? Allv3Points[ i ].y : minY; + maxX = ( Allv3Points[ i ].x > maxX ) ? Allv3Points[ i ].x : maxX; + maxY = ( Allv3Points[ i ].y > maxY ) ? Allv3Points[ i ].y : maxY; + StartPt.Set( Allv3Points[ i + 1 ].y, Allv3Points[ i - 1 ].x ); + EndPt.Set( Allv3Points[ i - 1 ].y, Allv3Points[ i + 1 ].x ); + } + Aux1Vec2.Set( StartPt.x - EndPt.x, StartPt.y - EndPt.y ); + FastNormalized( ref Aux1Vec2 ); + //aux1Vec2.FastNormalized(); + Aux1Vec2.Set( Aux1Vec2.x * width, Aux1Vec2.y * width ); + AllPerpendiculars[ i ] = Aux1Vec2; + } + + BoundBox.Set( minX, minY, ( maxX - minX ), ( maxY - minY ) ); + + DrawCurve( Allv3Points, AllPerpendiculars, AllColors, pointsCount ); + return BoundBox; + } + + private static void FastNormalized( ref Vector2 v ) + { + float len = Mathf.Sqrt( v.x * v.x + v.y * v.y ); + v.Set( v.x / len, v.y / len ); + } + + public static void Destroy() + { + GameObject.DestroyImmediate( LineMaterial ); + LineMaterial = null; + + Resources.UnloadAsset( LineShader ); + LineShader = null; + } + } + + //public static class VectorEx + //{ + // public static void FastNormalized( this Vector2 v ) + // { + // float len = Mathf.Sqrt( v.x * v.x + v.y * v.y ); + // v.Set( v.x / len, v.y / len ); + // } + //} +} + diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/GLDraw.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/GLDraw.cs.meta new file mode 100644 index 0000000..0f466ab --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/GLDraw.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 7647d2525992b7748a587740fd596977 +timeCreated: 1481126956 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/InputPort.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/InputPort.cs new file mode 100644 index 0000000..d18ff38 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/InputPort.cs @@ -0,0 +1,1523 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + [Serializable] + public sealed class InputPort : WirePort + { + private const string InputDefaultNameStr = "Input"; + [SerializeField] + private int m_externalNodeLink = -1; + + [SerializeField] + private int m_externalPortLink = -1; + + [SerializeField] + private string m_externalLinkId = string.Empty; + + [SerializeField] + private bool m_typeLocked; + + [SerializeField] + private string m_internalData = string.Empty; + + [SerializeField] + private string m_internalDataWrapper = string.Empty; + + [SerializeField] + private string m_dataName = string.Empty; + + [SerializeField] + private string m_internalDataPropertyLabel = string.Empty; + + // this will only is important on master node + [SerializeField] + private MasterNodePortCategory m_category = MasterNodePortCategory.Fragment; + + [SerializeField] + private PortGenType m_genType; + + private string m_propertyName = string.Empty; + private int m_cachedPropertyId = -1; + + private int m_cachedIntShaderID = -1; + private int m_cachedFloatShaderID = -1; + private int m_cachedVectorShaderID = -1; + private int m_cachedColorShaderID = -1; + private int m_cached2DShaderID = -1; + private int m_cachedDefaultTexShaderID = -1; + + [SerializeField] + private bool m_drawInternalData = false; + + //[SerializeField] + //private RenderTexture m_inputPreview = null; + //[SerializeField] + private RenderTexture m_inputPreviewTexture = null; + private Material m_inputPreviewMaterial = null; + private Shader m_inputPreviewShader = null; + + [SerializeField] + private int m_previewInternalInt = 0; + [SerializeField] + private float m_previewInternalFloat = 0; + [SerializeField] + private Vector2 m_previewInternalVec2 = Vector2.zero; + [SerializeField] + private Vector3 m_previewInternalVec3 = Vector3.zero; + [SerializeField] + private Vector4 m_previewInternalVec4 = Vector4.zero; + [SerializeField] + private Color m_previewInternalColor = Color.clear; + [SerializeField] + private Matrix4x4 m_previewInternalMatrix4x4 = Matrix4x4.identity; + + private int m_propertyNameInt = 0; + private ParentNode m_node = null; + + public InputPort() : base( -1, -1, WirePortDataType.FLOAT, string.Empty ) { m_typeLocked = true; } + public InputPort( int nodeId, int portId, WirePortDataType dataType, string name, bool typeLocked, int orderId = -1, MasterNodePortCategory category = MasterNodePortCategory.Fragment, PortGenType genType = PortGenType.NonCustomLighting ) : base( nodeId, portId, dataType, name, orderId ) + { + m_dataName = name; + m_internalDataPropertyLabel = ( string.IsNullOrEmpty( name ) || name.Equals( Constants.EmptyPortValue ) ) ? InputDefaultNameStr : name; + m_typeLocked = typeLocked; + m_category = category; + m_genType = genType; + } + + public InputPort( int nodeId, int portId, WirePortDataType dataType, string name, string dataName, bool typeLocked, int orderId = -1, MasterNodePortCategory category = MasterNodePortCategory.Fragment, PortGenType genType = PortGenType.NonCustomLighting ) : base( nodeId, portId, dataType, name, orderId ) + { + m_dataName = dataName; + m_internalDataPropertyLabel = ( string.IsNullOrEmpty( name ) || name.Equals( Constants.EmptyPortValue ) ) ? InputDefaultNameStr : name; + m_typeLocked = typeLocked; + m_category = category; + m_genType = genType; + } + + public void SetExternalLink( int nodeId, int portId ) + { + m_externalNodeLink = nodeId; + m_externalPortLink = portId; + } + + public override bool CheckValidType( WirePortDataType dataType ) + { + if( m_typeLocked ) + return ( dataType == m_dataType ); + + return base.CheckValidType( dataType ); + } + + public override void FullDeleteConnections() + { + UIUtils.DeleteConnection( true, m_nodeId, m_portId, true, true ); + } + + public override void NotifyExternalRefencesOnChange() + { + for( int i = 0; i < m_externalReferences.Count; i++ ) + { + ParentNode node = UIUtils.GetNode( m_externalReferences[ i ].NodeId ); + if( node ) + { + OutputPort port = node.GetOutputPortByUniqueId( m_externalReferences[ i ].PortId ); + port.UpdateInfoOnExternalConn( m_nodeId, m_portId, m_dataType ); + node.OnConnectedInputNodeChanges( m_externalReferences[ i ].PortId, m_nodeId, m_portId, m_name, m_dataType ); + } + } + } + + public void UpdatePreviewInternalData() + { + switch( m_dataType ) + { + case WirePortDataType.INT: m_previewInternalInt = IntInternalData; break; + case WirePortDataType.FLOAT: m_previewInternalFloat = FloatInternalData; break; + case WirePortDataType.FLOAT2: m_previewInternalVec2 = Vector2InternalData; break; + case WirePortDataType.FLOAT3: m_previewInternalVec3 = Vector3InternalData; break; + case WirePortDataType.FLOAT4: m_previewInternalVec4 = Vector4InternalData; break; + case WirePortDataType.COLOR: m_previewInternalColor = ColorInternalData; break; + } + } + + void UpdateVariablesFromInternalData() + { + string[] data = String.IsNullOrEmpty( m_internalData ) ? null : m_internalData.Split( IOUtils.VECTOR_SEPARATOR ); + bool reset = ( data == null || data.Length == 0 ); + m_internalDataUpdated = false; + try + { + switch( m_dataType ) + { + case WirePortDataType.OBJECT:break; + case WirePortDataType.FLOAT: m_previewInternalFloat = reset ? 0 : Convert.ToSingle( data[ 0 ] ); break; + case WirePortDataType.INT: + { + if( reset ) + { + m_previewInternalInt = 0; + } + else + { + if( data[ 0 ].Contains( "." ) ) + { + m_previewInternalInt = (int)Convert.ToSingle( data[ 0 ] ); + } + else + { + m_previewInternalInt = Convert.ToInt32( data[ 0 ] ); + } + } + } + break; + case WirePortDataType.FLOAT2: + { + if( reset ) + { + m_previewInternalVec2 = Vector2.zero; + } + else + { + if( data.Length < 2 ) + { + m_previewInternalVec2.x = Convert.ToSingle( data[ 0 ] ); + m_previewInternalVec2.y = 0; + } + else + { + m_previewInternalVec2.x = Convert.ToSingle( data[ 0 ] ); + m_previewInternalVec2.y = Convert.ToSingle( data[ 1 ] ); + } + } + } + break; + case WirePortDataType.FLOAT3: + { + if( reset ) + { + m_previewInternalVec3 = Vector3.zero; + } + else + { + int count = Mathf.Min( data.Length, 3 ); + for( int i = 0; i < count; i++ ) + { + m_previewInternalVec3[ i ] = Convert.ToSingle( data[ i ] ); + } + if( count < 3 ) + { + for( int i = count; i < 3; i++ ) + { + m_previewInternalVec3[ i ] = 0; + } + } + } + + } + break; + case WirePortDataType.FLOAT4: + { + if( reset ) + { + m_previewInternalVec4 = Vector4.zero; + } + else + { + int count = Mathf.Min( data.Length, 4 ); + for( int i = 0; i < count; i++ ) + { + m_previewInternalVec4[ i ] = Convert.ToSingle( data[ i ] ); + } + if( count < 4 ) + { + for( int i = count; i < 4; i++ ) + { + m_previewInternalVec4[ i ] = 0; + } + } + } + } + break; + case WirePortDataType.COLOR: + { + if( reset ) + { + m_previewInternalColor = Color.black; + } + else + { + int count = Mathf.Min( data.Length, 4 ); + for( int i = 0; i < count; i++ ) + { + m_previewInternalColor[ i ] = Convert.ToSingle( data[ i ] ); + } + if( count < 4 ) + { + for( int i = count; i < 4; i++ ) + { + m_previewInternalColor[ i ] = 0; + } + } + } + } + break; + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + { + if( reset ) + { + m_previewInternalMatrix4x4 = Matrix4x4.identity; + } + else + { + int count = Mathf.Min( data.Length, 16 ); + int overallIdx = 0; + for( int i = 0; i < 4; i++ ) + { + for( int j = 0; j < 4; j++ ) + { + if( overallIdx < count ) + { + m_previewInternalMatrix4x4[ i, j ] = Convert.ToSingle( data[ overallIdx ] ); + } + else + { + m_previewInternalMatrix4x4[ i, j ] = ( ( i == j ) ? 1 : 0 ); + } + overallIdx++; + } + } + } + } + break; + } + } + catch( Exception e ) + { + if( DebugConsoleWindow.DeveloperMode ) + Debug.LogException( e ); + } + } + + void UpdateInternalDataFromVariables( bool forceDecimal = false ) + { + switch( m_dataType ) + { + case WirePortDataType.OBJECT:break; + case WirePortDataType.FLOAT: + { + if( forceDecimal && m_previewInternalFloat == (int)m_previewInternalFloat ) + m_internalData = m_previewInternalFloat.ToString("0.0##############"); // to make sure integer values like 0 or 1 are generated as 0.0 and 1.0 + else + m_internalData = m_previewInternalFloat.ToString(); + m_internalDataWrapper = string.Empty; + } + break; + case WirePortDataType.INT: + { + m_internalData = m_previewInternalInt.ToString(); + m_internalDataWrapper = string.Empty; + } + break; + case WirePortDataType.FLOAT2: + { + m_internalData = m_previewInternalVec2.x.ToString() + IOUtils.VECTOR_SEPARATOR + + m_previewInternalVec2.y.ToString(); + m_internalDataWrapper = "float2( {0} )"; + } + break; + case WirePortDataType.FLOAT3: + { + m_internalData = m_previewInternalVec3.x.ToString() + IOUtils.VECTOR_SEPARATOR + + m_previewInternalVec3.y.ToString() + IOUtils.VECTOR_SEPARATOR + + m_previewInternalVec3.z.ToString(); + m_internalDataWrapper = "float3( {0} )"; + } + break; + case WirePortDataType.FLOAT4: + { + m_internalData = m_previewInternalVec4.x.ToString() + IOUtils.VECTOR_SEPARATOR + + m_previewInternalVec4.y.ToString() + IOUtils.VECTOR_SEPARATOR + + m_previewInternalVec4.z.ToString() + IOUtils.VECTOR_SEPARATOR + + m_previewInternalVec4.w.ToString(); + + m_internalDataWrapper = "float4( {0} )"; + } + break; + case WirePortDataType.COLOR: + { + m_internalData = m_previewInternalColor.r.ToString() + IOUtils.VECTOR_SEPARATOR + + m_previewInternalColor.g.ToString() + IOUtils.VECTOR_SEPARATOR + + m_previewInternalColor.b.ToString() + IOUtils.VECTOR_SEPARATOR + + m_previewInternalColor.a.ToString(); + + m_internalDataWrapper = "float4( {0} )"; + } + break; + case WirePortDataType.FLOAT3x3: + { + m_internalData = m_previewInternalMatrix4x4[ 0, 0 ].ToString() + IOUtils.VECTOR_SEPARATOR + m_previewInternalMatrix4x4[ 0, 1 ].ToString() + IOUtils.VECTOR_SEPARATOR + m_previewInternalMatrix4x4[ 0, 2 ].ToString() + IOUtils.VECTOR_SEPARATOR + + m_previewInternalMatrix4x4[ 1, 0 ].ToString() + IOUtils.VECTOR_SEPARATOR + m_previewInternalMatrix4x4[ 1, 1 ].ToString() + IOUtils.VECTOR_SEPARATOR + m_previewInternalMatrix4x4[ 1, 2 ].ToString() + IOUtils.VECTOR_SEPARATOR + + m_previewInternalMatrix4x4[ 2, 0 ].ToString() + IOUtils.VECTOR_SEPARATOR + m_previewInternalMatrix4x4[ 2, 1 ].ToString() + IOUtils.VECTOR_SEPARATOR + m_previewInternalMatrix4x4[ 2, 2 ].ToString(); + + m_internalDataWrapper = "float3x3( {0} )"; + + } + break; + case WirePortDataType.FLOAT4x4: + { + m_internalData = m_previewInternalMatrix4x4[ 0, 0 ].ToString() + IOUtils.VECTOR_SEPARATOR + m_previewInternalMatrix4x4[ 0, 1 ].ToString() + IOUtils.VECTOR_SEPARATOR + m_previewInternalMatrix4x4[ 0, 2 ].ToString() + IOUtils.VECTOR_SEPARATOR + m_previewInternalMatrix4x4[ 0, 3 ].ToString() + IOUtils.VECTOR_SEPARATOR + + m_previewInternalMatrix4x4[ 1, 0 ].ToString() + IOUtils.VECTOR_SEPARATOR + m_previewInternalMatrix4x4[ 1, 1 ].ToString() + IOUtils.VECTOR_SEPARATOR + m_previewInternalMatrix4x4[ 1, 2 ].ToString() + IOUtils.VECTOR_SEPARATOR + m_previewInternalMatrix4x4[ 1, 3 ].ToString() + IOUtils.VECTOR_SEPARATOR + + m_previewInternalMatrix4x4[ 2, 0 ].ToString() + IOUtils.VECTOR_SEPARATOR + m_previewInternalMatrix4x4[ 2, 1 ].ToString() + IOUtils.VECTOR_SEPARATOR + m_previewInternalMatrix4x4[ 2, 2 ].ToString() + IOUtils.VECTOR_SEPARATOR + m_previewInternalMatrix4x4[ 2, 3 ].ToString() + IOUtils.VECTOR_SEPARATOR + + m_previewInternalMatrix4x4[ 3, 0 ].ToString() + IOUtils.VECTOR_SEPARATOR + m_previewInternalMatrix4x4[ 3, 1 ].ToString() + IOUtils.VECTOR_SEPARATOR + m_previewInternalMatrix4x4[ 3, 2 ].ToString() + IOUtils.VECTOR_SEPARATOR + m_previewInternalMatrix4x4[ 3, 3 ].ToString(); + + m_internalDataWrapper = "float4x4( {0} )"; + } + break; + } + } + + //This gets the 3x3 matrix inside of the 4x4 + private string Matrix3x3WrappedData() + { + string tempInternal = string.Empty; + + string[] data = String.IsNullOrEmpty( m_internalData ) ? null : m_internalData.Split( IOUtils.VECTOR_SEPARATOR ); + if( data.Length == 16 ) + { + int o = 0; + for( int i = 0; i < 8; i++ ) + { + if( i == 3 || i == 6 ) + o++; + tempInternal += data[ i + o ] + IOUtils.VECTOR_SEPARATOR; + } + + tempInternal += data[ 10 ]; + + return String.Format( m_internalDataWrapper, tempInternal ); + } + else + { + return String.Format( m_internalDataWrapper, m_internalData ); + } + } + + private string SamplerWrappedData( ref MasterNodeDataCollector dataCollector ) + { + m_internalData = "_Sampler" + PortId + UIUtils.GetNode( m_nodeId ).OutputId; + + dataCollector.AddToUniforms( m_nodeId, GeneratorUtils.GetPropertyDeclaraction( m_internalData, TextureType.Texture2D, ";" ) ); + + return m_internalData; + } + + //TODO: Replace GenerateShaderForOutput(...) calls to this one + // This is a new similar method to GenerateShaderForOutput(...) which always autocasts + public string GeneratePortInstructions( ref MasterNodeDataCollector dataCollector ) + { + InputPort linkPort = ExternalLink; + if( linkPort != null ) + { + return linkPort.GeneratePortInstructions( ref dataCollector ); + } + + string result = string.Empty; + if( m_externalReferences.Count > 0 && !m_locked ) + { + result = UIUtils.GetNode( m_externalReferences[ 0 ].NodeId ).GenerateShaderForOutput( m_externalReferences[ 0 ].PortId, ref dataCollector, false ); + if( m_externalReferences[ 0 ].DataType != m_dataType ) + { + result = UIUtils.CastPortType( ref dataCollector, UIUtils.GetNode( m_nodeId ).CurrentPrecisionType, new NodeCastInfo( m_externalReferences[ 0 ].NodeId, m_externalReferences[ 0 ].PortId ), null, m_externalReferences[ 0 ].DataType, m_dataType, result ); + } + } + else + { + UpdateInternalDataFromVariables( true ); + if( DataType == WirePortDataType.FLOAT3x3 ) + result = Matrix3x3WrappedData(); + else if( DataType == WirePortDataType.SAMPLER2D ) + result = SamplerWrappedData( ref dataCollector ); + else + result = !String.IsNullOrEmpty( m_internalDataWrapper ) ? String.Format( m_internalDataWrapper, m_internalData ) : m_internalData; + } + return result; + } + + public string GenerateShaderForOutput( ref MasterNodeDataCollector dataCollector, bool ignoreLocalVar ) + { + InputPort linkPort = ExternalLink; + if( linkPort != null ) + { + return linkPort.GenerateShaderForOutput( ref dataCollector, ignoreLocalVar ); + } + + string result = string.Empty; + if( m_externalReferences.Count > 0 && !m_locked ) + { + result = UIUtils.GetNode( m_externalReferences[ 0 ].NodeId ).GenerateShaderForOutput( m_externalReferences[ 0 ].PortId, ref dataCollector, ignoreLocalVar ); + } + else + { + UpdateInternalDataFromVariables( true ); + if( !String.IsNullOrEmpty( m_internalDataWrapper ) ) + { + if( DataType == WirePortDataType.FLOAT3x3 ) + result = Matrix3x3WrappedData(); + else + result = String.Format( m_internalDataWrapper, m_internalData ); + } + else + { + result = m_internalData; + } + } + return result; + } + + public string GenerateShaderForOutput( ref MasterNodeDataCollector dataCollector, WirePortDataType inputPortType, bool ignoreLocalVar, bool autoCast = false ) + { + InputPort linkPort = ExternalLink; + if( linkPort != null ) + { + return linkPort.GenerateShaderForOutput( ref dataCollector, inputPortType, ignoreLocalVar, autoCast ); + } + + string result = string.Empty; + if( m_externalReferences.Count > 0 && !m_locked ) + { + result = UIUtils.GetNode( m_externalReferences[ 0 ].NodeId ).GenerateShaderForOutput( m_externalReferences[ 0 ].PortId, ref dataCollector, ignoreLocalVar ); + if( autoCast && m_externalReferences[ 0 ].DataType != inputPortType ) + { + result = UIUtils.CastPortType( ref dataCollector, UIUtils.GetNode( m_nodeId ).CurrentPrecisionType, new NodeCastInfo( m_externalReferences[ 0 ].NodeId, m_externalReferences[ 0 ].PortId ), null, m_externalReferences[ 0 ].DataType, inputPortType, result ); + } + } + else + { + UpdateInternalDataFromVariables( true ); + if( !String.IsNullOrEmpty( m_internalDataWrapper ) ) + { + if( DataType == WirePortDataType.FLOAT3x3 ) + result = Matrix3x3WrappedData(); + else + result = String.Format( m_internalDataWrapper, m_internalData ); + } + else + { + result = m_internalData; + } + } + + return result; + } + + public OutputPort GetOutputConnection( int connID = 0 ) + { + if( connID < m_externalReferences.Count ) + { + return UIUtils.GetNode( m_externalReferences[ connID ].NodeId ).GetOutputPortByUniqueId( m_externalReferences[ connID ].PortId ); + } + return null; + } + + public ParentNode GetOutputNodeWhichIsNotRelay( int connID = 0 ) + { + if( connID < m_externalReferences.Count ) + { + ParentNode node = UIUtils.GetNode( m_externalReferences[ connID ].NodeId ); + if( node is WireNode || node is RelayNode || node is FunctionInput ) + { + return node.InputPorts[ 0 ].GetOutputNodeWhichIsNotRelay( connID ); + } + + return node; + } + return null; + } + + public ParentNode GetOutputNode( int connID = 0 ) + { + if( connID < m_externalReferences.Count ) + { + return UIUtils.GetNode( m_externalReferences[ connID ].NodeId ); + } + return null; + } + + public bool TypeLocked + { + get { return m_typeLocked; } + } + + public void WriteToString( ref string myString ) + { + if( m_externalReferences.Count != 1 || m_isDummy ) + { + return; + } + + IOUtils.AddTypeToString( ref myString, IOUtils.WireConnectionParam ); + IOUtils.AddFieldValueToString( ref myString, m_nodeId ); + IOUtils.AddFieldValueToString( ref myString, m_portId ); + IOUtils.AddFieldValueToString( ref myString, m_externalReferences[ 0 ].NodeId ); + IOUtils.AddFieldValueToString( ref myString, m_externalReferences[ 0 ].PortId ); + IOUtils.AddLineTerminator( ref myString ); + } + + public void ShowInternalData( Rect rect, UndoParentNode owner, bool useCustomLabel = false, string customLabel = null ) + { + string label = ( useCustomLabel == true && customLabel != null ) ? customLabel : m_internalDataPropertyLabel; + switch( m_dataType ) + { + case WirePortDataType.OBJECT: + { + InternalData = owner.EditorGUITextField( rect, label, InternalData ); + } + break; + case WirePortDataType.FLOAT: + { + FloatInternalData = owner.EditorGUIFloatField( rect, label, FloatInternalData ); + } + break; + case WirePortDataType.FLOAT2: + { + Vector2InternalData = owner.EditorGUIVector2Field( rect, label, Vector2InternalData ); + } + break; + case WirePortDataType.FLOAT3: + { + Vector3InternalData = owner.EditorGUIVector3Field( rect, label, Vector3InternalData ); + } + break; + case WirePortDataType.FLOAT4: + { + Vector4InternalData = owner.EditorGUIVector4Field( rect, label, Vector4InternalData ); + } + break; + case WirePortDataType.FLOAT3x3: + { + Matrix4x4 matrix = Matrix4x4InternalData; + Vector3 currVec3 = Vector3.zero; + for( int i = 0; i < 3; i++ ) + { + Vector4 currVec = matrix.GetRow( i ); + currVec3.Set( currVec.x, currVec.y, currVec.z ); + EditorGUI.BeginChangeCheck(); + currVec3 = owner.EditorGUIVector3Field( rect, label + "[ " + i + " ]", currVec3 ); + rect.y += 2*EditorGUIUtility.singleLineHeight; + if( EditorGUI.EndChangeCheck() ) + { + currVec.Set( currVec3.x, currVec3.y, currVec3.z, currVec.w ); + matrix.SetRow( i, currVec ); + } + } + Matrix4x4InternalData = matrix; + } + break; + case WirePortDataType.FLOAT4x4: + { + Matrix4x4 matrix = Matrix4x4InternalData; + for( int i = 0; i < 4; i++ ) + { + Vector4 currVec = matrix.GetRow( i ); + EditorGUI.BeginChangeCheck(); + currVec = owner.EditorGUIVector4Field( rect, label + "[ " + i + " ]", currVec ); + rect.y += 2*EditorGUIUtility.singleLineHeight; + if( EditorGUI.EndChangeCheck() ) + { + matrix.SetRow( i, currVec ); + } + } + Matrix4x4InternalData = matrix; + } + break; + case WirePortDataType.COLOR: + { + ColorInternalData = owner.EditorGUIColorField( rect, label, ColorInternalData ); + } + break; + case WirePortDataType.INT: + { + IntInternalData = owner.EditorGUIIntField( rect, label, IntInternalData ); + } + break; + } + } + + public void ShowInternalData( UndoParentNode owner, bool useCustomLabel = false, string customLabel = null ) + { + string label = ( useCustomLabel == true && customLabel != null ) ? customLabel : m_internalDataPropertyLabel; + switch( m_dataType ) + { + case WirePortDataType.OBJECT: + case WirePortDataType.FLOAT: + { + FloatInternalData = owner.EditorGUILayoutFloatField( label, FloatInternalData ); + } + break; + case WirePortDataType.FLOAT2: + { + Vector2InternalData = owner.EditorGUILayoutVector2Field( label, Vector2InternalData ); + } + break; + case WirePortDataType.FLOAT3: + { + Vector3InternalData = owner.EditorGUILayoutVector3Field( label, Vector3InternalData ); + } + break; + case WirePortDataType.FLOAT4: + { + Vector4InternalData = owner.EditorGUILayoutVector4Field( label, Vector4InternalData ); + } + break; + case WirePortDataType.FLOAT3x3: + { + Matrix4x4 matrix = Matrix4x4InternalData; + Vector3 currVec3 = Vector3.zero; + for( int i = 0; i < 3; i++ ) + { + Vector4 currVec = matrix.GetRow( i ); + currVec3.Set( currVec.x, currVec.y, currVec.z ); + EditorGUI.BeginChangeCheck(); + currVec3 = owner.EditorGUILayoutVector3Field( label + "[ " + i + " ]", currVec3 ); + if( EditorGUI.EndChangeCheck() ) + { + currVec.Set( currVec3.x, currVec3.y, currVec3.z, currVec.w ); + matrix.SetRow( i, currVec ); + } + } + Matrix4x4InternalData = matrix; + } + break; + case WirePortDataType.FLOAT4x4: + { + Matrix4x4 matrix = Matrix4x4InternalData; + for( int i = 0; i < 4; i++ ) + { + Vector4 currVec = matrix.GetRow( i ); + EditorGUI.BeginChangeCheck(); + currVec = owner.EditorGUILayoutVector4Field( label + "[ " + i + " ]", currVec ); + if( EditorGUI.EndChangeCheck() ) + { + matrix.SetRow( i, currVec ); + } + } + Matrix4x4InternalData = matrix; + } + break; + case WirePortDataType.COLOR: + { + ColorInternalData = owner.EditorGUILayoutColorField( label, ColorInternalData ); + } + break; + case WirePortDataType.INT: + { + IntInternalData = owner.EditorGUILayoutIntField( label, IntInternalData ); + } + break; + } + } + public bool IsZeroInternalData + { + get + { + switch( m_dataType ) + { + + case WirePortDataType.FLOAT: return Mathf.Abs(m_previewInternalFloat) < 0.001f; + case WirePortDataType.UINT: + case WirePortDataType.INT: return m_previewInternalInt == 0; + case WirePortDataType.FLOAT2: + return (Mathf.Abs( m_previewInternalVec2.x ) < 0.001f && + Mathf.Abs( m_previewInternalVec2.y ) < 0.001f); + case WirePortDataType.FLOAT3: + return (Mathf.Abs( m_previewInternalVec3.x ) < 0.001f && + Mathf.Abs( m_previewInternalVec3.y ) < 0.001f && + Mathf.Abs( m_previewInternalVec3.z ) < 0.001f ); + case WirePortDataType.FLOAT4: + return (Mathf.Abs( m_previewInternalVec4.x ) < 0.001f && + Mathf.Abs( m_previewInternalVec4.y ) < 0.001f && + Mathf.Abs( m_previewInternalVec4.z ) < 0.001f && + Mathf.Abs( m_previewInternalVec4.w ) < 0.001f ); + case WirePortDataType.COLOR: + return (Mathf.Abs( m_previewInternalColor.r ) < 0.001f && + Mathf.Abs( m_previewInternalColor.g ) < 0.001f && + Mathf.Abs( m_previewInternalColor.b ) < 0.001f && + Mathf.Abs( m_previewInternalColor.a ) < 0.001f); + + } + return true; + } + } + public float FloatInternalData + { + set { m_previewInternalFloat = value; m_internalDataUpdated = false; } + get { return m_previewInternalFloat; } + } + + public int IntInternalData + { + set { m_previewInternalInt = value; m_internalDataUpdated = false; } + get { return m_previewInternalInt; } + } + + public Vector2 Vector2InternalData + { + set { m_previewInternalVec2 = value; m_internalDataUpdated = false; } + get { return m_previewInternalVec2; } + } + + public Vector3 Vector3InternalData + { + set { m_previewInternalVec3 = value; m_internalDataUpdated = false; } + get { return m_previewInternalVec3; } + } + + public Vector4 Vector4InternalData + { + set { m_previewInternalVec4 = value; m_internalDataUpdated = false; } + get { return m_previewInternalVec4; } + } + + public Color ColorInternalData + { + set { m_previewInternalColor = value; m_internalDataUpdated = false; } + get { return m_previewInternalColor; } + } + + public Matrix4x4 Matrix4x4InternalData + { + set { m_previewInternalMatrix4x4 = value; m_internalDataUpdated = false; } + get { return m_previewInternalMatrix4x4; } + } + + public string SamplerInternalData + { + set { InternalData = UIUtils.RemoveInvalidCharacters( value ); m_internalDataUpdated = false; } + get { return m_internalData; } + } + + public override void ForceClearConnection() + { + UIUtils.DeleteConnection( true, m_nodeId, m_portId, false, true ); + } + + private bool m_internalDataUpdated = false; + private string m_displayInternalData = string.Empty; + public string DisplayInternalData + { + get + { + if( !m_internalDataUpdated ) + { + UpdateInternalDataFromVariables(); + m_internalDataUpdated = true; + m_displayInternalData = "( "+ m_internalData + " )"; + } + return m_displayInternalData; + } + } + + public string InternalData + { + get + { + UpdateInternalDataFromVariables(); + return m_internalData; + } + set + { + m_internalData = value; + UpdateVariablesFromInternalData(); + } + } + + public string WrappedInternalData + { + get + { + UpdateInternalDataFromVariables(); + return string.IsNullOrEmpty( m_internalDataWrapper ) ? m_internalData : String.Format( m_internalDataWrapper, m_internalData ); + } + } + + public override WirePortDataType DataType + { + get { return base.DataType; } + // must be set to update internal data. do not delete + set + { + m_internalDataUpdated = false; + switch( DataType ) + { + case WirePortDataType.FLOAT: + { + switch( value ) + { + case WirePortDataType.FLOAT2: m_previewInternalVec2.x = m_previewInternalFloat; break; + case WirePortDataType.FLOAT3: m_previewInternalVec3.x = m_previewInternalFloat; break; + case WirePortDataType.FLOAT4: m_previewInternalVec4.x = m_previewInternalFloat; break; + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: m_previewInternalMatrix4x4[ 0 ] = m_previewInternalFloat; break; + case WirePortDataType.COLOR: m_previewInternalColor.r = m_previewInternalFloat; break; + case WirePortDataType.INT: m_previewInternalInt = (int)m_previewInternalFloat; break; + } + } + break; + case WirePortDataType.FLOAT2: + { + switch( value ) + { + case WirePortDataType.FLOAT: m_previewInternalFloat = m_previewInternalVec2.x; break; + case WirePortDataType.FLOAT3: + { + m_previewInternalVec3.x = m_previewInternalVec2.x; + m_previewInternalVec3.y = m_previewInternalVec2.y; + } + break; + case WirePortDataType.FLOAT4: + { + m_previewInternalVec4.x = m_previewInternalVec2.x; + m_previewInternalVec4.y = m_previewInternalVec2.y; + } + break; + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + { + m_previewInternalMatrix4x4[ 0 ] = m_previewInternalVec2.x; + m_previewInternalMatrix4x4[ 1 ] = m_previewInternalVec2.y; + } + break; + case WirePortDataType.COLOR: + { + m_previewInternalColor.r = m_previewInternalVec2.x; + m_previewInternalColor.g = m_previewInternalVec2.y; + } + break; + case WirePortDataType.INT: m_previewInternalInt = (int)m_previewInternalVec2.x; break; + } + } + break; + case WirePortDataType.FLOAT3: + { + switch( value ) + { + case WirePortDataType.FLOAT: m_previewInternalFloat = m_previewInternalVec3.x; break; + case WirePortDataType.FLOAT2: + { + m_previewInternalVec2.x = m_previewInternalVec3.x; + m_previewInternalVec2.y = m_previewInternalVec3.y; + } + break; + case WirePortDataType.FLOAT4: + { + m_previewInternalVec4.x = m_previewInternalVec3.x; + m_previewInternalVec4.y = m_previewInternalVec3.y; + m_previewInternalVec4.z = m_previewInternalVec3.z; + } + break; + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + { + m_previewInternalMatrix4x4[ 0 ] = m_previewInternalVec3.x; + m_previewInternalMatrix4x4[ 1 ] = m_previewInternalVec3.y; + m_previewInternalMatrix4x4[ 2 ] = m_previewInternalVec3.z; + } + break; + case WirePortDataType.COLOR: + { + m_previewInternalColor.r = m_previewInternalVec3.x; + m_previewInternalColor.g = m_previewInternalVec3.y; + m_previewInternalColor.b = m_previewInternalVec3.z; + } + break; + case WirePortDataType.INT: m_previewInternalInt = (int)m_previewInternalVec3.x; break; + } + } + break; + case WirePortDataType.FLOAT4: + { + switch( value ) + { + case WirePortDataType.FLOAT: m_previewInternalFloat = m_previewInternalVec4.x; break; + case WirePortDataType.FLOAT2: + { + m_previewInternalVec2.x = m_previewInternalVec4.x; + m_previewInternalVec2.y = m_previewInternalVec4.y; + } + break; + case WirePortDataType.FLOAT3: + { + m_previewInternalVec3.x = m_previewInternalVec4.x; + m_previewInternalVec3.y = m_previewInternalVec4.y; + m_previewInternalVec3.z = m_previewInternalVec4.z; + } + break; + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + { + m_previewInternalMatrix4x4[ 0 ] = m_previewInternalVec4.x; + m_previewInternalMatrix4x4[ 1 ] = m_previewInternalVec4.y; + m_previewInternalMatrix4x4[ 2 ] = m_previewInternalVec4.z; + m_previewInternalMatrix4x4[ 3 ] = m_previewInternalVec4.w; + } + break; + case WirePortDataType.COLOR: + { + m_previewInternalColor.r = m_previewInternalVec4.x; + m_previewInternalColor.g = m_previewInternalVec4.y; + m_previewInternalColor.b = m_previewInternalVec4.z; + m_previewInternalColor.a = m_previewInternalVec4.w; + } + break; + case WirePortDataType.INT: m_previewInternalInt = (int)m_previewInternalVec4.x; break; + } + } + break; + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + { + switch( value ) + { + case WirePortDataType.FLOAT: m_previewInternalFloat = m_previewInternalMatrix4x4[ 0 ]; break; + case WirePortDataType.FLOAT2: + { + m_previewInternalVec2.x = m_previewInternalMatrix4x4[ 0 ]; + m_previewInternalVec2.y = m_previewInternalMatrix4x4[ 1 ]; + } + break; + case WirePortDataType.FLOAT3: + { + m_previewInternalVec3.x = m_previewInternalMatrix4x4[ 0 ]; + m_previewInternalVec3.y = m_previewInternalMatrix4x4[ 1 ]; + m_previewInternalVec3.z = m_previewInternalMatrix4x4[ 2 ]; + } + break; + case WirePortDataType.FLOAT4: + { + m_previewInternalVec4.x = m_previewInternalMatrix4x4[ 0 ]; + m_previewInternalVec4.y = m_previewInternalMatrix4x4[ 1 ]; + m_previewInternalVec4.z = m_previewInternalMatrix4x4[ 2 ]; + m_previewInternalVec4.w = m_previewInternalMatrix4x4[ 3 ]; + } + break; + case WirePortDataType.COLOR: + { + m_previewInternalColor.r = m_previewInternalMatrix4x4[ 0 ]; + m_previewInternalColor.g = m_previewInternalMatrix4x4[ 1 ]; + m_previewInternalColor.b = m_previewInternalMatrix4x4[ 2 ]; + m_previewInternalColor.a = m_previewInternalMatrix4x4[ 3 ]; + } + break; + case WirePortDataType.INT: m_previewInternalInt = (int)m_previewInternalMatrix4x4[ 0 ]; break; + } + } + break; + case WirePortDataType.COLOR: + { + switch( value ) + { + case WirePortDataType.FLOAT: m_previewInternalFloat = m_previewInternalColor.r; break; + case WirePortDataType.FLOAT2: + { + m_previewInternalVec2.x = m_previewInternalColor.r; + m_previewInternalVec2.y = m_previewInternalColor.g; + } + break; + case WirePortDataType.FLOAT3: + { + m_previewInternalVec3.x = m_previewInternalColor.r; + m_previewInternalVec3.y = m_previewInternalColor.g; + m_previewInternalVec3.z = m_previewInternalColor.b; + } + break; + case WirePortDataType.FLOAT4: + { + m_previewInternalVec4.x = m_previewInternalColor.r; + m_previewInternalVec4.y = m_previewInternalColor.g; + m_previewInternalVec4.z = m_previewInternalColor.b; + m_previewInternalVec4.w = m_previewInternalColor.a; + } + break; + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + { + m_previewInternalMatrix4x4[ 0 ] = m_previewInternalColor.r; + m_previewInternalMatrix4x4[ 1 ] = m_previewInternalColor.g; + m_previewInternalMatrix4x4[ 2 ] = m_previewInternalColor.b; + m_previewInternalMatrix4x4[ 3 ] = m_previewInternalColor.a; + } + break; + case WirePortDataType.INT: m_previewInternalInt = (int)m_previewInternalColor.r; break; + } + } + break; + case WirePortDataType.INT: + { + switch( value ) + { + case WirePortDataType.FLOAT: m_previewInternalFloat = m_previewInternalInt; break; + case WirePortDataType.FLOAT2: m_previewInternalVec2.x = m_previewInternalInt; break; + case WirePortDataType.FLOAT3: m_previewInternalVec3.x = m_previewInternalInt; break; + case WirePortDataType.FLOAT4: m_previewInternalVec4.x = m_previewInternalInt; break; + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: m_previewInternalMatrix4x4[ 0 ] = m_previewInternalInt; break; + case WirePortDataType.COLOR: m_previewInternalColor.r = m_previewInternalInt; break; + } + } + break; + } + base.DataType = value; + } + } + + public string DataName + { + get { return m_dataName; } + set { m_dataName = value; } + } + + public bool IsFragment { get { return m_category == MasterNodePortCategory.Fragment || m_category == MasterNodePortCategory.Debug; } } + public MasterNodePortCategory Category + { + set { m_category = value; } + get { return m_category; } + } + + private int CachedIntPropertyID + { + get + { + if( m_cachedIntShaderID == -1 ) + m_cachedIntShaderID = Shader.PropertyToID( "_InputInt" ); + return m_cachedIntShaderID; + } + } + + private int CachedFloatPropertyID + { + get + { + if( m_cachedFloatShaderID == -1 ) + m_cachedFloatShaderID = Shader.PropertyToID( "_InputFloat" ); + return m_cachedFloatShaderID; + } + } + + private int CachedVectorPropertyID + { + get + { + if( m_cachedVectorShaderID == -1 ) + m_cachedVectorShaderID = Shader.PropertyToID( "_InputVector" ); + return m_cachedVectorShaderID; + } + } + + private int CachedColorPropertyID + { + get + { + if( m_cachedColorShaderID == -1 ) + m_cachedColorShaderID = Shader.PropertyToID( "_InputColor" ); + return m_cachedColorShaderID; + } + } + + private int CachedDefaultTexPropertyID + { + get + { + if( m_cachedDefaultTexShaderID == -1 ) + m_cachedDefaultTexShaderID = Shader.PropertyToID( "_Default" ); + return m_cachedDefaultTexShaderID; + } + } + + private int Cached2DPropertyID + { + get + { + if( m_cached2DShaderID == -1 ) + m_cached2DShaderID = Shader.PropertyToID( "_Input2D" ); + return m_cached2DShaderID; + } + } + + public int CachedPropertyId + { + get { return m_cachedPropertyId; } + } + + public bool InputNodeHasPreview( ParentGraph container ) + { + ParentNode node = null; + if( m_externalReferences.Count > 0) + { + node = container.GetNode( m_externalReferences[ 0 ].NodeId ); + } + + if( node != null ) + return node.HasPreviewShader; + + return false; + } + + public void PreparePortCacheID() + { + if( m_propertyNameInt != PortId || string.IsNullOrEmpty( m_propertyName ) ) + { + m_propertyNameInt = PortId; + m_propertyName = "_" + Convert.ToChar( PortId + 65 ); + m_cachedPropertyId = Shader.PropertyToID( m_propertyName ); + } + + if( m_cachedPropertyId == -1 ) + m_cachedPropertyId = Shader.PropertyToID( m_propertyName ); + } + + public void SetPreviewInputTexture( ParentGraph container ) + { + PreparePortCacheID(); + + if( (object)m_node == null ) + { + m_node = container.GetNode( NodeId ); + //m_node = UIUtils.GetNode( NodeId ); + } + + if( ExternalReferences.Count>0 ) + { + m_node.PreviewMaterial.SetTexture( m_cachedPropertyId, container.GetNode( ExternalReferences[ 0 ].NodeId ).GetOutputPortByUniqueId( ExternalReferences[ 0 ].PortId ).OutputPreviewTexture ); + } + //m_node.PreviewMaterial.SetTexture( m_cachedPropertyId, GetOutputConnection( 0 ).OutputPreviewTexture ); + } + + private void SetPortPreviewShader( Shader portShader ) + { + if( m_inputPreviewShader != portShader ) + { + m_inputPreviewShader = portShader; + InputPreviewMaterial.shader = portShader; + } + } + + public void SetPreviewInputValue( ParentGraph container ) + { + if( m_inputPreviewTexture == null ) + { + m_inputPreviewTexture = new RenderTexture( 128, 128, 0, RenderTextureFormat.ARGBFloat, RenderTextureReadWrite.Linear ); + m_inputPreviewTexture.wrapMode = TextureWrapMode.Repeat; + } + + switch( DataType ) + { + case WirePortDataType.INT: + { + SetPortPreviewShader( UIUtils.IntShader ); + + InputPreviewMaterial.SetInt( CachedIntPropertyID, m_previewInternalInt ); + } + break; + case WirePortDataType.FLOAT: + { + SetPortPreviewShader( UIUtils.FloatShader ); + //Debug.Log( m_previewInternalFloat ); + InputPreviewMaterial.SetFloat( CachedFloatPropertyID, m_previewInternalFloat ); + } + break; + case WirePortDataType.FLOAT2: + { + SetPortPreviewShader( UIUtils.Vector2Shader ); + + Vector2 v2 = m_previewInternalVec2;// Vector2InternalData; + InputPreviewMaterial.SetVector( CachedVectorPropertyID, new Vector4( v2.x, v2.y, 0, 0 ) ); + } + break; + case WirePortDataType.FLOAT3: + { + SetPortPreviewShader( UIUtils.Vector3Shader ); + + Vector3 v3 = m_previewInternalVec3;// Vector3InternalData; + InputPreviewMaterial.SetVector( CachedVectorPropertyID, new Vector4( v3.x, v3.y, v3.z, 0 ) ); + } + break; + case WirePortDataType.FLOAT4: + { + SetPortPreviewShader( UIUtils.Vector4Shader ); + + InputPreviewMaterial.SetVector( CachedVectorPropertyID, m_previewInternalVec4 ); + } + break; + case WirePortDataType.COLOR: + { + SetPortPreviewShader( UIUtils.ColorShader ); + + InputPreviewMaterial.SetColor( CachedColorPropertyID, m_previewInternalColor ); + } + break; + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + { + SetPortPreviewShader( UIUtils.FloatShader ); + + InputPreviewMaterial.SetFloat( CachedFloatPropertyID, 1 ); + } + break; + case WirePortDataType.SAMPLER2D: + { + SetPortPreviewShader( UIUtils.Texture2DShader ); + } + break; + default: + { + SetPortPreviewShader( UIUtils.FloatShader ); + + InputPreviewMaterial.SetFloat( CachedFloatPropertyID, 0 ); + } + break; + } + + RenderTexture temp = RenderTexture.active; + RenderTexture.active = m_inputPreviewTexture; + Graphics.Blit( null, m_inputPreviewTexture, InputPreviewMaterial ); + RenderTexture.active = temp; + + PreparePortCacheID(); + + //if( (object)m_node == null ) + // m_node = UIUtils.GetNode( NodeId ); + + if( (object)m_node == null ) + { + m_node = container.GetNode( NodeId ); + //m_node = UIUtils.GetNode( NodeId ); + } + //m_propertyName = "_A"; + //Debug.Log( m_propertyName ); + m_node.PreviewMaterial.SetTexture( m_propertyName, m_inputPreviewTexture ); + } + + public override void ChangePortId( int newPortId ) + { + if( IsConnected ) + { + int count = ExternalReferences.Count; + for( int connIdx = 0; connIdx < count; connIdx++ ) + { + int nodeId = ExternalReferences[ connIdx ].NodeId; + int portId = ExternalReferences[ connIdx ].PortId; + ParentNode node = UIUtils.GetNode( nodeId ); + if( node != null ) + { + OutputPort outputPort = node.GetOutputPortByUniqueId( portId ); + int outputCount = outputPort.ExternalReferences.Count; + for( int j = 0; j < outputCount; j++ ) + { + if( outputPort.ExternalReferences[ j ].NodeId == NodeId && + outputPort.ExternalReferences[ j ].PortId == PortId ) + { + outputPort.ExternalReferences[ j ].PortId = newPortId; + } + } + } + } + } + + PortId = newPortId; + } + + public override void Destroy() + { + base.Destroy(); + //if ( m_inputPreview != null ) + // UnityEngine.ScriptableObject.DestroyImmediate( m_inputPreview ); + //m_inputPreview = null; + + if( m_inputPreviewTexture != null ) + UnityEngine.ScriptableObject.DestroyImmediate( m_inputPreviewTexture ); + m_inputPreviewTexture = null; + + if( m_inputPreviewMaterial != null ) + UnityEngine.ScriptableObject.DestroyImmediate( m_inputPreviewMaterial ); + m_inputPreviewMaterial = null; + + m_inputPreviewShader = null; + + m_node = null; + } + + public Shader InputPreviewShader + { + get + { + if( m_inputPreviewShader == null ) + m_inputPreviewShader = AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "d9ca47581ac157145bff6f72ac5dd73e" ) ); //ranged float + + if( m_inputPreviewShader == null ) + m_inputPreviewShader = Shader.Find( "Unlit/Colored Transparent" ); + + return m_inputPreviewShader; + } + set + { + m_inputPreviewShader = value; + } + } + + public Material InputPreviewMaterial + { + get + { + if( m_inputPreviewMaterial == null ) + m_inputPreviewMaterial = new Material( InputPreviewShader ); + + return m_inputPreviewMaterial; + } + //set + //{ + // m_inputPreviewMaterial = value; + //} + } + + public override string Name + { + get { return m_name; } + set + { + m_name = value; + m_internalDataPropertyLabel = ( string.IsNullOrEmpty( value ) || value.Equals( Constants.EmptyPortValue ) ) ? InputDefaultNameStr : value; + m_dirtyLabelSize = true; + } + } + + public string InternalDataName + { + get { return m_internalDataPropertyLabel; } + set { m_internalDataPropertyLabel = value; } + } + + public bool AutoDrawInternalData + { + get { return m_drawInternalData; } + set { m_drawInternalData = value; } + } + + public PortGenType GenType + { + get { return m_genType; } + set { m_genType = value; } + } + + public bool ValidInternalData + { + get + { + switch( m_dataType ) + { + case WirePortDataType.FLOAT: + case WirePortDataType.FLOAT2: + case WirePortDataType.FLOAT3: + case WirePortDataType.FLOAT4: + case WirePortDataType.FLOAT3x3: + case WirePortDataType.FLOAT4x4: + case WirePortDataType.COLOR: + case WirePortDataType.INT: return true; + case WirePortDataType.OBJECT: + case WirePortDataType.SAMPLER1D: + case WirePortDataType.SAMPLER2D: + case WirePortDataType.SAMPLER3D: + case WirePortDataType.SAMPLERCUBE: + case WirePortDataType.SAMPLER2DARRAY: + case WirePortDataType.SAMPLERSTATE: + default: return false; + } + } + } + + //public RenderTexture InputPreviewTexture + //{ + // get + // { + // if( IsConnected ) + // return GetOutputConnection( 0 ).OutputPreviewTexture; + // else + // return m_inputPreviewTexture; + // } + //} + + public RenderTexture InputPreviewTexture( ParentGraph container ) + { + if( IsConnected ) + { + if( m_externalReferences.Count > 0 ) + return container.GetNode( m_externalReferences[ 0 ].NodeId ).GetOutputPortByUniqueId( m_externalReferences[ 0 ].PortId ).OutputPreviewTexture; + else + return null; + } + else + { + return m_inputPreviewTexture; + } + } + + public string ExternalLinkId + { + get { return m_externalLinkId; } + set + { + m_externalLinkId = value; + if( string.IsNullOrEmpty( value ) ) + { + m_externalNodeLink = -1; + m_externalPortLink = -1; + } + } + } + + public bool HasOwnOrLinkConnection { get { return IsConnected || HasConnectedExternalLink; } } + public bool HasExternalLink { get { return m_externalNodeLink > -1 && m_externalPortLink > -1; } } + + public bool HasConnectedExternalLink + { + get + { + InputPort link = ExternalLink; + return ( link != null && link.IsConnected ); + } + } + + public InputPort ExternalLink + { + get + { + if( HasExternalLink ) + { + ParentNode linkNode = UIUtils.GetNode( m_externalNodeLink ); + if( linkNode != null ) + { + return linkNode.GetInputPortByUniqueId( m_externalPortLink ); + } + } + return null; + } + } + + public ParentNode ExternalLinkNode + { + get + { + if( HasExternalLink ) + { + return UIUtils.GetNode( m_externalNodeLink ); + } + return null; + } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/InputPort.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/InputPort.cs.meta new file mode 100644 index 0000000..421ab30 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/InputPort.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e8199169aaf7f404492a0f2353fb52f9 +timeCreated: 1481126960 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/OutputPort.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/OutputPort.cs new file mode 100644 index 0000000..3050aa8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/OutputPort.cs @@ -0,0 +1,306 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEditor; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [System.Serializable] + public sealed class OutputPort : WirePort + { + public delegate void OnNewPreviewRTCreated(); + public OnNewPreviewRTCreated OnNewPreviewRTCreatedEvent; + + [SerializeField] + private bool m_connectedToMasterNode; + + [SerializeField] + private bool[] m_isLocalValue = { false, false}; + + [SerializeField] + private string[] m_localOutputValue = { string.Empty,string.Empty}; + + //[SerializeField] + //private int m_isLocalWithPortType = 0; + + private RenderTexture m_outputPreview = null; + private Material m_outputMaskMaterial = null; + + private int m_indexPreviewOffset = 0; + + public OutputPort( ParentNode owner, int nodeId, int portId, WirePortDataType dataType, string name ) : base( nodeId, portId, dataType, name ) + { + LabelSize = Vector2.zero; + OnNewPreviewRTCreatedEvent += owner.SetPreviewDirtyFromOutputs; + } + + public string ErrorValue + { + get + { + string value = string.Empty; + switch( m_dataType ) + { + default: + case WirePortDataType.OBJECT: + case WirePortDataType.INT: + case WirePortDataType.FLOAT: value = "(0)"; break; + case WirePortDataType.FLOAT2: value = "half2(0,0)"; break; + case WirePortDataType.FLOAT3: value = "half3(0,0,0)"; break; + case WirePortDataType.COLOR: + case WirePortDataType.FLOAT4: value = "half4(0,0,0,0)"; break; + case WirePortDataType.FLOAT3x3: value = "half3x3(0,0,0,0,0,0,0,0,0)"; break; + case WirePortDataType.FLOAT4x4: value = "half4x4(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)"; break; + } + return value; + } + } + + public bool ConnectedToMasterNode + { + get { return m_connectedToMasterNode; } + set { m_connectedToMasterNode = value; } + } + + public override void FullDeleteConnections() + { + UIUtils.DeleteConnection( false, m_nodeId, m_portId, true, true ); + } + + public bool HasConnectedNode + { + get + { + int count = m_externalReferences.Count; + for( int i = 0; i < count; i++ ) + { + if( UIUtils.GetNode( m_externalReferences[ i ].NodeId ).IsConnected ) + return true; + } + return false; + } + } + public InputPort GetInputConnection( int connID = 0 ) + { + if( connID < m_externalReferences.Count ) + { + return UIUtils.GetNode( m_externalReferences[ connID ].NodeId ).GetInputPortByUniqueId( m_externalReferences[ connID ].PortId ); + } + return null; + } + + public ParentNode GetInputNode( int connID = 0 ) + { + if( connID < m_externalReferences.Count ) + { + return UIUtils.GetNode( m_externalReferences[ connID ].NodeId ); + } + return null; + } + + public override void NotifyExternalRefencesOnChange() + { + for( int i = 0; i < m_externalReferences.Count; i++ ) + { + ParentNode node = UIUtils.GetNode( m_externalReferences[ i ].NodeId ); + if( node ) + { + node.CheckSpherePreview(); + InputPort port = node.GetInputPortByUniqueId( m_externalReferences[ i ].PortId ); + port.UpdateInfoOnExternalConn( m_nodeId, m_portId, m_dataType ); + node.OnConnectedOutputNodeChanges( m_externalReferences[ i ].PortId, m_nodeId, m_portId, m_name, m_dataType ); + } + } + } + + public void ChangeTypeWithRestrictions( WirePortDataType newType, int restrictions ) + { + if( m_dataType != newType ) + { + DataType = newType; + for( int i = 0; i < m_externalReferences.Count; i++ ) + { + ParentNode inNode = UIUtils.GetNode( m_externalReferences[ i ].NodeId ); + InputPort inputPort = inNode.GetInputPortByUniqueId( m_externalReferences[ i ].PortId ); + + bool valid = false; + if( restrictions == 0 ) + { + valid = true; + } + else + { + valid = ( restrictions & (int)inputPort.DataType ) != 0; + } + + if( valid ) + { + inNode.CheckSpherePreview(); + inputPort.UpdateInfoOnExternalConn( m_nodeId, m_portId, m_dataType ); + inNode.OnConnectedOutputNodeChanges( m_externalReferences[ i ].PortId, m_nodeId, m_portId, m_name, m_dataType ); + } + else + { + InvalidateConnection( m_externalReferences[ i ].NodeId, m_externalReferences[ i ].PortId ); + inputPort.InvalidateConnection( NodeId, PortId ); + i--; + } + } + } + } + + public override void ChangePortId( int newPortId ) + { + if( IsConnected ) + { + int count = ExternalReferences.Count; + for( int connIdx = 0; connIdx < count; connIdx++ ) + { + int nodeId = ExternalReferences[ connIdx ].NodeId; + int portId = ExternalReferences[ connIdx ].PortId; + ParentNode node = UIUtils.GetNode( nodeId ); + if( node != null ) + { + InputPort inputPort = node.GetInputPortByUniqueId( portId ); + int inputCount = inputPort.ExternalReferences.Count; + for( int j = 0; j < inputCount; j++ ) + { + if( inputPort.ExternalReferences[ j ].NodeId == NodeId && + inputPort.ExternalReferences[ j ].PortId == PortId ) + { + inputPort.ExternalReferences[ j ].PortId = newPortId; + } + } + } + } + } + + PortId = newPortId; + } + + public string ConfigOutputLocalValue( PrecisionType precisionType, string value, string customName, MasterNodePortCategory category ) + { + int idx = UIUtils.PortCategorytoAttayIdx( category ); + ParentGraph currentGraph = UIUtils.GetNode( NodeId ).ContainerGraph; + string autoGraphId = currentGraph.GraphId > 0 ? "_g" + currentGraph.GraphId : string.Empty; + m_localOutputValue[idx] = string.IsNullOrEmpty( customName ) ? ( "temp_output_" + m_nodeId + "_" + PortId + autoGraphId ) : customName; + m_isLocalValue[idx] = true; + //m_isLocalWithPortType |= (int)category; + return string.Format( Constants.LocalValueDecWithoutIdent, UIUtils.PrecisionWirePortToCgType( precisionType, DataType ), m_localOutputValue[idx], value ); + } + + public void SetLocalValue( string value, MasterNodePortCategory category ) + { + int idx = UIUtils.PortCategorytoAttayIdx( category ); + m_isLocalValue[idx] = true; + m_localOutputValue[ idx ] = value; + //m_isLocalWithPortType |= (int)category; + } + + public void ResetLocalValue() + { + for( int i = 0; i < m_localOutputValue.Length; i++ ) + { + m_localOutputValue[ i ] = string.Empty; + m_isLocalValue[i] = false; + } + //m_isLocalWithPortType = 0; + } + + public void ResetLocalValueIfNot( MasterNodePortCategory category ) + { + int idx = UIUtils.PortCategorytoAttayIdx( category ); + for( int i = 0; i < m_localOutputValue.Length; i++ ) + { + if( i != idx ) + { + m_localOutputValue[ i ] = string.Empty; + m_isLocalValue[ i ] = false; + } + } + } + + public void ResetLocalValueOnCategory( MasterNodePortCategory category ) + { + int idx = UIUtils.PortCategorytoAttayIdx( category ); + m_localOutputValue[ idx ] = string.Empty; + m_isLocalValue[ idx ] = false; + } + + public bool IsLocalOnCategory( MasterNodePortCategory category ) + { + int idx = UIUtils.PortCategorytoAttayIdx( category ); + return m_isLocalValue[ idx ]; + //return ( m_isLocalWithPortType & (int)category ) != 0; ; + } + + public override void ForceClearConnection() + { + UIUtils.DeleteConnection( false, m_nodeId, m_portId, false, true ); + } + + public bool IsLocalValue( MasterNodePortCategory category ) + { + int idx = UIUtils.PortCategorytoAttayIdx( category ); + return m_isLocalValue[ idx ]; + } + + public string LocalValue(MasterNodePortCategory category) + { + int idx = UIUtils.PortCategorytoAttayIdx( category ); + return m_localOutputValue[idx]; + } + + public RenderTexture OutputPreviewTexture + { + get + { + if( m_outputPreview == null ) + { + m_outputPreview = new RenderTexture( 128, 128, 0, RenderTextureFormat.ARGBFloat, RenderTextureReadWrite.Linear ); + m_outputPreview.wrapMode = TextureWrapMode.Repeat; + if( OnNewPreviewRTCreatedEvent != null ) + OnNewPreviewRTCreatedEvent(); + } + + return m_outputPreview; + } + set { m_outputPreview = value; } + } + + public int IndexPreviewOffset + { + get { return m_indexPreviewOffset; } + set { m_indexPreviewOffset = value; } + } + + public override void Destroy() + { + base.Destroy(); + if( m_outputPreview != null ) + UnityEngine.ScriptableObject.DestroyImmediate( m_outputPreview ); + m_outputPreview = null; + + if( m_outputMaskMaterial != null ) + UnityEngine.ScriptableObject.DestroyImmediate( m_outputMaskMaterial ); + m_outputMaskMaterial = null; + + OnNewPreviewRTCreatedEvent = null; + } + + public Material MaskingMaterial + { + get + { + if( m_outputMaskMaterial == null ) + { + //m_outputMaskMaterial = new Material( AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( "9c34f18ebe2be3e48b201b748c73dec0" ) ) ); + m_outputMaskMaterial = new Material( UIUtils.MaskingShader ); + } + return m_outputMaskMaterial; + } + //set { m_outputMaskMaterial = value; } + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/OutputPort.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/OutputPort.cs.meta new file mode 100644 index 0000000..9825de1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/OutputPort.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 82722ce1ba0df314490a9362e503727c +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/WireBezierReference.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/WireBezierReference.cs new file mode 100644 index 0000000..6753ff0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/WireBezierReference.cs @@ -0,0 +1,58 @@ +using UnityEngine; + +namespace AmplifyShaderEditor +{ + [System.Serializable] + public class WireBezierReference + { + private Rect m_boundingBox; + private int m_inNodeId; + private int m_inPortId; + private int m_outNodeId; + private int m_outPortId; + + public WireBezierReference() + { + m_boundingBox = new Rect(); + m_inNodeId = -1; + m_inPortId = -1; + m_outNodeId = -1; + m_outPortId = -1; + } + + public WireBezierReference( ref Rect area, int inNodeId, int inPortId, int outNodeId, int outPortId ) + { + UpdateInfo( ref area, inNodeId, inPortId, outNodeId, outPortId ); + } + + public void UpdateInfo( ref Rect area, int inNodeId, int inPortId, int outNodeId, int outPortId ) + { + m_boundingBox = area; + m_inNodeId = inNodeId; + m_inPortId = inPortId; + m_outNodeId = outNodeId; + m_outPortId = outPortId; + } + + public bool Contains( Vector2 position ) + { + return m_boundingBox.Contains( position ); + } + + public void DebugDraw() + { + GUI.Label( m_boundingBox, string.Empty, UIUtils.GetCustomStyle( CustomStyle.MainCanvasTitle )); + } + + public override string ToString() + { + return string.Format( "In node: {0} port: {1} -> Out node: {2} port: {3}", m_inNodeId, m_inPortId, m_outNodeId, m_outPortId ); + } + + public Rect BoundingBox { get { return m_boundingBox; } } + public int InNodeId { get { return m_inNodeId; } } + public int InPortId { get { return m_inPortId; } } + public int OutNodeId { get { return m_outNodeId; } } + public int OutPortId { get { return m_outPortId; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/WireBezierReference.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/WireBezierReference.cs.meta new file mode 100644 index 0000000..df5640c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/WireBezierReference.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 499682ec40529f44480d58747ad7ab44 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/WirePort.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/WirePort.cs new file mode 100644 index 0000000..311dfb0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/WirePort.cs @@ -0,0 +1,605 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using UnityEngine; +using UnityEditor; + +using System.Collections.Generic; + +namespace AmplifyShaderEditor +{ + public enum WirePortDataType + { + OBJECT = 1 << 1, + FLOAT = 1 << 2, + FLOAT2 = 1 << 3, + FLOAT3 = 1 << 4, + FLOAT4 = 1 << 5, + FLOAT3x3 = 1 << 6, + FLOAT4x4 = 1 << 7, + COLOR = 1 << 8, + INT = 1 << 9, + SAMPLER1D = 1 << 10, + SAMPLER2D = 1 << 11, + SAMPLER3D = 1 << 12, + SAMPLERCUBE = 1 << 13, + UINT = 1 << 14, + SAMPLER2DARRAY = 1 << 15, + SAMPLERSTATE = 1 << 16 + } + + public enum VariableQualifiers + { + In = 0, + Out, + InOut + } + + public struct WirePortDataTypeComparer : IEqualityComparer + { + public bool Equals( WirePortDataType x, WirePortDataType y ) + { + return x == y; + } + + public int GetHashCode( WirePortDataType obj ) + { + // you need to do some thinking here, + return (int)obj; + } + } + + [System.Serializable] + public class WirePort + { + private const double PortClickTime = 0.2; + + private double m_lastTimeClicked = -1; + + private Vector2 m_labelSize; + private Vector2 m_unscaledLabelSize; + protected bool m_dirtyLabelSize = true; + + private bool m_isEditable = false; + private bool m_editingName = false; + + protected int m_portRestrictions = 0; + + private bool m_repeatButtonState = false; + + [SerializeField] + private Rect m_position; + + [SerializeField] + private Rect m_labelPosition; + + [SerializeField] + protected int m_nodeId = -1; + + [SerializeField] + protected int m_portId = -1; + + [SerializeField] + protected int m_orderId = -1; + + [SerializeField] + protected WirePortDataType m_dataType = WirePortDataType.FLOAT; + + [SerializeField] + protected string m_name; + + [SerializeField] + protected List m_externalReferences; + + [SerializeField] + protected bool m_locked = false; + + [SerializeField] + protected bool m_visible = true; + + [SerializeField] + protected bool m_isDummy = false; + + [SerializeField] + protected bool m_hasCustomColor = false; + + [SerializeField] + protected Color m_customColor = Color.white; + + [SerializeField] + protected Rect m_activePortArea; + + public WirePort( int nodeId, int portId, WirePortDataType dataType, string name, int orderId = -1 ) + { + m_nodeId = nodeId; + m_portId = portId; + m_orderId = orderId; + m_dataType = dataType; + m_name = name; + m_externalReferences = new List(); + } + + public virtual void Destroy() + { + m_externalReferences.Clear(); + m_externalReferences = null; + } + + public void SetFreeForAll() + { + m_portRestrictions = -1; + } + + public void AddPortForbiddenTypes( params WirePortDataType[] forbiddenTypes ) + { + if( forbiddenTypes != null ) + { + if( m_portRestrictions == 0 ) + { + //if no previous restrictions are detected then we set up the bit array so we can set is bit correctly + m_portRestrictions = int.MaxValue; + } + + for( int i = 0; i < forbiddenTypes.Length; i++ ) + { + m_portRestrictions = m_portRestrictions & ( int.MaxValue - (int)forbiddenTypes[ i ] ); + } + } + } + + public void AddPortRestrictions( params WirePortDataType[] validTypes ) + { + if( validTypes != null ) + { + for( int i = 0; i < validTypes.Length; i++ ) + { + m_portRestrictions = m_portRestrictions | (int)validTypes[ i ]; + } + } + } + + public void CreatePortRestrictions( params WirePortDataType[] validTypes ) + { + m_portRestrictions = 0; + if( validTypes != null ) + { + for( int i = 0; i < validTypes.Length; i++ ) + { + m_portRestrictions = m_portRestrictions | (int)validTypes[ i ]; + } + } + } + + public virtual bool CheckValidType( WirePortDataType dataType ) + { + if( m_portRestrictions == 0 ) + { + return true; + } + + return ( m_portRestrictions & (int)dataType ) != 0; + } + + public bool ConnectTo( WireReference port ) + { + if( m_locked ) + return false; + + if( m_externalReferences.Contains( port ) ) + return false; + + m_externalReferences.Add( port ); + return true; + } + + public bool ConnectTo( int nodeId, int portId ) + { + if( m_locked ) + return false; + + + foreach( WireReference reference in m_externalReferences ) + { + if( reference.NodeId == nodeId && reference.PortId == portId ) + { + return false; + } + } + m_externalReferences.Add( new WireReference( nodeId, portId, m_dataType, false ) ); + return true; + } + + public bool ConnectTo( int nodeId, int portId, WirePortDataType dataType, bool typeLocked ) + { + if( m_locked ) + return false; + + foreach( WireReference reference in m_externalReferences ) + { + if( reference.NodeId == nodeId && reference.PortId == portId ) + { + return false; + } + } + m_externalReferences.Add( new WireReference( nodeId, portId, dataType, typeLocked ) ); + return true; + } + + public void DummyAdd( int nodeId, int portId ) + { + m_externalReferences.Insert( 0, new WireReference( nodeId, portId, WirePortDataType.OBJECT, false ) ); + m_isDummy = true; + } + + public void DummyRemove() + { + m_externalReferences.RemoveAt( 0 ); + m_isDummy = false; + } + + public void DummyClear() + { + m_externalReferences.Clear(); + m_isDummy = false; + } + + public WireReference GetConnection( int connID = 0 ) + { + if( connID < m_externalReferences.Count ) + return m_externalReferences[ connID ]; + return null; + } + + public void ChangeProperties( string newName, WirePortDataType newType, bool invalidateConnections ) + { + Name = newName; + ChangeType( newType, invalidateConnections ); + //if ( m_dataType != newType ) + //{ + // DataType = newType; + // if ( invalidateConnections ) + // { + // InvalidateAllConnections(); + // } + // else + // { + // NotifyExternalRefencesOnChange(); + // } + //} + } + + public void ChangeType( WirePortDataType newType, bool invalidateConnections ) + { + if( m_dataType != newType ) + { + //ParentNode node = UIUtils.GetNode( m_nodeId ); + //if ( node ) + //{ + // Undo.RegisterCompleteObjectUndo( node.ContainerGraph.ParentWindow, Constants.UndoChangeTypeNodesId ); + // Undo.RecordObject( node, Constants.UndoChangeTypeNodesId ); + //} + DataType = newType; + if( invalidateConnections ) + { + InvalidateAllConnections(); + } + else + { + NotifyExternalRefencesOnChange(); + } + } + } + + public virtual void ChangePortId( int newId ) { } + public virtual void NotifyExternalRefencesOnChange() { } + + public void UpdateInfoOnExternalConn( int nodeId, int portId, WirePortDataType type ) + { + for( int i = 0; i < m_externalReferences.Count; i++ ) + { + if( m_externalReferences[ i ].NodeId == nodeId && m_externalReferences[ i ].PortId == portId ) + { + m_externalReferences[ i ].DataType = type; + } + } + } + + public void InvalidateConnection( int nodeId, int portId ) + { + int id = -1; + for( int i = 0; i < m_externalReferences.Count; i++ ) + { + if( m_externalReferences[ i ].NodeId == nodeId && m_externalReferences[ i ].PortId == portId ) + { + id = i; + break; + } + } + + if( id > -1 ) + m_externalReferences.RemoveAt( id ); + } + + public void RemoveInvalidConnections() + { + Debug.Log( "Cleaning invalid connections" ); + List validConnections = new List(); + for( int i = 0; i < m_externalReferences.Count; i++ ) + { + if( m_externalReferences[ i ].IsValid ) + { + validConnections.Add( m_externalReferences[ i ] ); + } + else + { + Debug.Log( "Detected invalid connection on node " + m_nodeId + " port " + m_portId ); + } + } + m_externalReferences.Clear(); + m_externalReferences = validConnections; + } + + public void InvalidateAllConnections() + { + m_externalReferences.Clear(); + } + + public virtual void FullDeleteConnections() { } + + public bool IsConnectedTo( int nodeId, int portId ) + { + if( m_locked ) + return false; + + for( int i = 0; i < m_externalReferences.Count; i++ ) + { + if( m_externalReferences[ i ].NodeId == nodeId && m_externalReferences[ i ].PortId == portId ) + return true; + } + return false; + } + + public WirePortDataType ConnectionType( int id = 0 ) + { + return ( id < m_externalReferences.Count ) ? m_externalReferences[ id ].DataType : DataType; + } + + public bool CheckMatchConnectionType( int id = 0 ) + { + if( id < m_externalReferences.Count ) + return m_externalReferences[ id ].DataType == DataType; + + return false; + } + + public void MatchPortToConnection( int id = 0 ) + { + if( id < m_externalReferences.Count ) + { + DataType = m_externalReferences[ id ].DataType; + } + } + + public void ResetWireReferenceStatus() + { + for( int i = 0; i < m_externalReferences.Count; i++ ) + { + m_externalReferences[ i ].WireStatus = WireStatus.Default; + } + } + + public bool InsideActiveArea( Vector2 pos ) + { + return m_activePortArea.Contains( pos ); + } + + public void Click() + { + if( m_isEditable ) + { + if( ( EditorApplication.timeSinceStartup - m_lastTimeClicked ) < PortClickTime ) + { + m_editingName = true; + GUI.FocusControl( "port" + m_nodeId.ToString() + m_portId.ToString() ); + TextEditor te = (TextEditor)GUIUtility.GetStateObject( typeof( TextEditor ), GUIUtility.keyboardControl ); + if( te != null ) + { + te.SelectAll(); + } + } + + m_lastTimeClicked = EditorApplication.timeSinceStartup; + } + } + + public bool Draw( Rect textPos, GUIStyle style ) + { + bool changeFlag = false; + if( m_isEditable && m_editingName ) + { + textPos.width = m_labelSize.x; + EditorGUI.BeginChangeCheck(); + GUI.SetNextControlName( "port" + m_nodeId.ToString() + m_portId.ToString() ); + m_name = GUI.TextField( textPos, m_name, style ); + if( EditorGUI.EndChangeCheck() ) + { + m_dirtyLabelSize = true; + changeFlag = true; + } + + if( Event.current.isKey && ( Event.current.keyCode == KeyCode.Return || Event.current.keyCode == KeyCode.KeypadEnter ) ) + { + m_editingName = false; + GUIUtility.keyboardControl = 0; + } + } + else + { + GUI.Label( textPos, m_name, style ); + } + //GUI.Label( textPos, string.Empty ); + return changeFlag; + } + + public void ResetEditing() + { + m_editingName = false; + } + + public virtual void ForceClearConnection() { } + + public bool IsConnected + { + get { return ( m_externalReferences.Count > 0 && !m_locked ); } + } + + public List ExternalReferences + { + get { return m_externalReferences; } + } + + public int ConnectionCount + { + get { return m_externalReferences.Count; } + } + + public Rect Position + { + get { return m_position; } + set { m_position = value; } + } + + public Rect LabelPosition + { + get { return m_labelPosition; } + set { m_labelPosition = value; } + } + + public int PortId + { + get { return m_portId; } + set { m_portId = value; } + } + + public int OrderId + { + get { return m_orderId; } + set { m_orderId = value; } + } + + + public int NodeId + { + get { return m_nodeId; } + set { m_nodeId = value; } + } + + public virtual WirePortDataType DataType + { + get { return m_dataType; } + set { m_dataType = value; } + } + + public bool Visible + { + get { return m_visible; } + set + { + m_visible = value; + if( !m_visible && IsConnected ) + { + ForceClearConnection(); + } + } + } + + public bool Locked + { + get { return m_locked; } + set + { + //if ( m_locked && IsConnected ) + //{ + // ForceClearConnection(); + //} + m_locked = value; + } + } + + public virtual string Name + { + get { return m_name; } + set { m_name = value; m_dirtyLabelSize = true; } + } + + public bool DirtyLabelSize + { + get { return m_dirtyLabelSize; } + set { m_dirtyLabelSize = value; } + } + + public bool HasCustomColor + { + get { return m_hasCustomColor; } + } + + public Color CustomColor + { + get { return m_customColor; } + set + { + m_hasCustomColor = true; + m_customColor = value; + } + } + + public Rect ActivePortArea + { + get { return m_activePortArea; } + set { m_activePortArea = value; } + } + + public Vector2 LabelSize + { + get { return m_labelSize; } + set { m_labelSize = value; } + } + + public Vector2 UnscaledLabelSize + { + get { return m_unscaledLabelSize; } + set { m_unscaledLabelSize = value; } + } + + public bool IsEditable + { + get { return m_isEditable; } + set { m_isEditable = value; } + } + + public bool Available { get { return m_visible && !m_locked; } } + public override string ToString() + { + string dump = ""; + dump += "Order: " + m_orderId + "\n"; + dump += "Name: " + m_name + "\n"; + dump += " Type: " + m_dataType; + dump += " NodeId : " + m_nodeId; + dump += " PortId : " + m_portId; + dump += "\nConnections:\n"; + foreach( WireReference wirePort in m_externalReferences ) + { + dump += wirePort + "\n"; + } + return dump; + } + + public bool RepeatButtonState + { + get { return m_repeatButtonState; } + set { m_repeatButtonState = value; } + } + public bool IsDummy { get { return m_isDummy; } } + public bool NotFreeForAllTypes { get { return m_portRestrictions != -1; } } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/WirePort.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/WirePort.cs.meta new file mode 100644 index 0000000..d70ad88 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/WirePort.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4709687a4844c9545a254c2ddbf3ca63 +timeCreated: 1481126955 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/WireReference.cs b/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/WireReference.cs new file mode 100644 index 0000000..fb2b347 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/WireReference.cs @@ -0,0 +1,126 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda + +using System; +using UnityEngine; + +namespace AmplifyShaderEditor +{ + public enum WireStatus + { + Default = 0, + Highlighted, + Selected + } + + [Serializable] + public sealed class WireReference + { + private WireStatus m_status = WireStatus.Default; + + + + [SerializeField] + private int m_nodeId = -1; + [SerializeField] + private int m_portId = -1; + [SerializeField] + private WirePortDataType m_dataType = WirePortDataType.FLOAT; + [SerializeField] + private bool m_typeLocked = false; + + + + public WireReference() + { + m_nodeId = -1; + m_portId = -1; + m_dataType = WirePortDataType.FLOAT; + m_typeLocked = false; + m_status = WireStatus.Default; + } + + public WireReference( int nodeId, int portId, WirePortDataType dataType, bool typeLocked ) + { + m_portId = portId; + m_nodeId = nodeId; + m_dataType = dataType; + m_typeLocked = typeLocked; + m_status = WireStatus.Default; + } + + public void Invalidate() + { + m_nodeId = -1; + m_portId = -1; + m_typeLocked = false; + m_status = WireStatus.Default; + } + + public void SetReference( int nodeId, int portId, WirePortDataType dataType, bool typeLocked ) + { + m_nodeId = nodeId; + m_portId = portId; + m_dataType = dataType; + m_typeLocked = typeLocked; + } + + public void SetReference( WirePort port ) + { + m_nodeId = port.NodeId; + m_portId = port.PortId; + m_dataType = port.DataType; + } + + public bool IsValid + { + get { return ( m_nodeId != -1 && m_portId != -1 ); } + } + + public int NodeId + { + get { return m_nodeId; } + } + + public int PortId + { + get { return m_portId; } + set { m_portId = value; } + } + + public WirePortDataType DataType + { + get { return m_dataType; } + set { m_dataType = value; } + } + + public bool TypeLocked + { + get { return m_typeLocked; } + } + + public WireStatus WireStatus + { + get { return m_status; } + set { m_status = value; } + } + + public override string ToString() + { + string dump = ""; + dump += "* Wire Reference *\n"; + dump += "NodeId : " + m_nodeId + "\n"; + dump += "PortId : " + m_portId + "\n"; + dump += "DataType " + m_dataType + "\n"; ; + return dump; + } + + public void WriteToString( ref string myString ) + { + IOUtils.AddFieldToString( ref myString, "PortId", m_portId ); + IOUtils.AddFieldToString( ref myString, "NodeID", m_nodeId ); + IOUtils.AddFieldToString( ref myString, "DataType", m_dataType ); + IOUtils.AddFieldToString( ref myString, "TypeLocked", m_typeLocked ); + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/WireReference.cs.meta b/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/WireReference.cs.meta new file mode 100644 index 0000000..dee7f4d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/Editor/Wires/WireReference.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 99fb607e60678c44da002d6b694400dc +timeCreated: 1481126957 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources.meta new file mode 100644 index 0000000..82d54d7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0932db7ec1402c2489679c4b72eab5eb +folderAsset: yes +timeCreated: 1481126943 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/GUISkins.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/GUISkins.meta new file mode 100644 index 0000000..18ce2da --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/GUISkins.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0ecdc2c57c073bd4796f1ae8da7f851f +folderAsset: yes +timeCreated: 1481126943 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/GUISkins/MainSkin.guiskin b/Assets/AmplifyShaderEditor/Plugins/EditorResources/GUISkins/MainSkin.guiskin new file mode 100644 index 0000000..58289c6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/GUISkins/MainSkin.guiskin @@ -0,0 +1,5340 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12001, guid: 0000000000000000e000000000000000, type: 0} + m_Name: MainSkin + m_EditorClassIdentifier: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_box: + m_Name: box + m_Normal: + m_Background: {fileID: 2800000, guid: a702c1245d15ddb48b8fba73bf951a65, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.79999995, g: 0.79999995, b: 0.79999995, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 1 + m_Right: 1 + m_Top: 1 + m_Bottom: 1 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 1 + m_Right: 1 + m_Top: 1 + m_Bottom: 1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_button: + m_Name: button + m_Normal: + m_Background: {fileID: 2800000, guid: 87629cdfe03457046b57a25b1ea3096d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 87629cdfe03457046b57a25b1ea3096d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 87629cdfe03457046b57a25b1ea3096d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: 87629cdfe03457046b57a25b1ea3096d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 6c0712566778b3f4383fc3bb16edc880, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 6c0712566778b3f4383fc3bb16edc880, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 6c0712566778b3f4383fc3bb16edc880, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_toggle: + m_Name: toggle + m_Normal: + m_Background: {fileID: 11018, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.89112896, g: 0.89112896, b: 0.89112896, a: 1} + m_Hover: + m_Background: {fileID: 11014, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 11013, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 11016, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8901961, g: 0.8901961, b: 0.8901961, a: 1} + m_OnHover: + m_Background: {fileID: 11015, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 11017, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 14 + m_Right: 0 + m_Top: 14 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 15 + m_Right: 0 + m_Top: 3 + m_Bottom: 0 + m_Overflow: + m_Left: -1 + m_Right: 0 + m_Top: -4 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_label: + m_Name: label + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 15 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + m_textField: + m_Name: textfield + m_Normal: + m_Background: {fileID: 11024, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.79999995, g: 0.79999995, b: 0.79999995, a: 1} + m_Hover: + m_Background: {fileID: 11026, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 11026, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 11025, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_textArea: + m_Name: textarea + m_Normal: + m_Background: {fileID: 11024, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9019608, g: 0.9019608, b: 0.9019608, a: 1} + m_Hover: + m_Background: {fileID: 11026, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.79999995, g: 0.79999995, b: 0.79999995, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 11025, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_window: + m_Name: window + m_Normal: + m_Background: {fileID: 2800000, guid: bd8a303795331fe48b05eee287c0b3e5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: bd8a303795331fe48b05eee287c0b3e5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 4fdd9ad2fb20f14438637f9b085fbe81, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: bd8a303795331fe48b05eee287c0b3e5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: bd8a303795331fe48b05eee287c0b3e5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: bd8a303795331fe48b05eee287c0b3e5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 4fdd9ad2fb20f14438637f9b085fbe81, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 2800000, guid: bd8a303795331fe48b05eee287c0b3e5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 7 + m_Right: 7 + m_Top: 37 + m_Bottom: 7 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 10 + m_Right: 10 + m_Top: 25 + m_Bottom: 10 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 10 + m_FontStyle: 1 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: -18} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalSlider: + m_Name: horizontalslider + m_Normal: + m_Background: {fileID: 11009, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 3 + m_Right: 3 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -2 + m_Bottom: -3 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 12 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalSliderThumb: + m_Name: horizontalsliderthumb + m_Normal: + m_Background: {fileID: 11011, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 11012, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 11010, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 7 + m_Right: 7 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 12 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalSlider: + m_Name: verticalslider + m_Normal: + m_Background: {fileID: 11021, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 3 + m_Bottom: 3 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: -1 + m_Overflow: + m_Left: -2 + m_Right: -3 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 12 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_verticalSliderThumb: + m_Name: verticalsliderthumb + m_Normal: + m_Background: {fileID: 11011, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 11012, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 11010, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 7 + m_Bottom: 7 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: -1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 12 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_horizontalScrollbar: + m_Name: horizontalscrollbar + m_Normal: + m_Background: {fileID: 11008, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 9 + m_Right: 9 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 1 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 15 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarThumb: + m_Name: horizontalscrollbarthumb + m_Normal: + m_Background: {fileID: 11007, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 6 + m_Right: 6 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: 1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 13 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarLeftButton: + m_Name: horizontalscrollbarleftbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarRightButton: + m_Name: horizontalscrollbarrightbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbar: + m_Name: verticalscrollbar + m_Normal: + m_Background: {fileID: 11020, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 9 + m_Bottom: 9 + m_Margin: + m_Left: 1 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 1 + m_Bottom: 1 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 15 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbarThumb: + m_Name: verticalscrollbarthumb + m_Normal: + m_Background: {fileID: 11019, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 6 + m_Bottom: 6 + m_Overflow: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 15 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_verticalScrollbarUpButton: + m_Name: verticalscrollbarupbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbarDownButton: + m_Name: verticalscrollbardownbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_ScrollView: + m_Name: scrollview + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_CustomStyles: + - m_Name: NodeWindowOff + m_Normal: + m_Background: {fileID: 2800000, guid: 60c283ffa9a758646ab70a2fe7ff5f71, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 1 + m_Right: 1 + m_Top: 1 + m_Bottom: 1 + m_Font: {fileID: 0} + m_FontSize: 13 + m_FontStyle: 1 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: -18} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: NodeWindowOn + m_Normal: + m_Background: {fileID: 2800000, guid: 24fb767323009c143a4e744a2025a27e, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 24fb767323009c143a4e744a2025a27e, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 24fb767323009c143a4e744a2025a27e, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: 24fb767323009c143a4e744a2025a27e, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 24fb767323009c143a4e744a2025a27e, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 24fb767323009c143a4e744a2025a27e, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 24fb767323009c143a4e744a2025a27e, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 2800000, guid: 24fb767323009c143a4e744a2025a27e, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 2 + m_Right: 2 + m_Top: 2 + m_Bottom: 2 + m_Font: {fileID: 0} + m_FontSize: 6 + m_FontStyle: 1 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: NodeTitle + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 13 + m_FontStyle: 1 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: NodeHeader + m_Normal: + m_Background: {fileID: 2800000, guid: 9e88b336bd16b1e4b99de75f486126c1, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 9e88b336bd16b1e4b99de75f486126c1, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 9e88b336bd16b1e4b99de75f486126c1, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: 9e88b336bd16b1e4b99de75f486126c1, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 9e88b336bd16b1e4b99de75f486126c1, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 9e88b336bd16b1e4b99de75f486126c1, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 9e88b336bd16b1e4b99de75f486126c1, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 2800000, guid: 9e88b336bd16b1e4b99de75f486126c1, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 4 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 1 + m_Right: 1 + m_Top: 1 + m_Bottom: 1 + m_Font: {fileID: 0} + m_FontSize: 13 + m_FontStyle: 1 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: CommentaryHeader + m_Normal: + m_Background: {fileID: 2800000, guid: 9e88b336bd16b1e4b99de75f486126c1, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 9e88b336bd16b1e4b99de75f486126c1, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 9e88b336bd16b1e4b99de75f486126c1, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: 9e88b336bd16b1e4b99de75f486126c1, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 9e88b336bd16b1e4b99de75f486126c1, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 9e88b336bd16b1e4b99de75f486126c1, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 9e88b336bd16b1e4b99de75f486126c1, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 2800000, guid: 9e88b336bd16b1e4b99de75f486126c1, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 7 + m_Right: 7 + m_Top: 7 + m_Bottom: 7 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 1 + m_Right: 1 + m_Top: 1 + m_Bottom: 1 + m_Font: {fileID: 0} + m_FontSize: 15 + m_FontStyle: 1 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 1 + m_ContentOffset: {x: 8, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ShaderLibraryTitle + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 7 + m_Right: 7 + m_Top: 7 + m_Bottom: 7 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 23 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 20 + m_FontStyle: 1 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ShaderLibraryAddToList + m_Normal: + m_Background: {fileID: 2800000, guid: cccc116a6334dc1428687697c5a11d58, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: cccc116a6334dc1428687697c5a11d58, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: cccc116a6334dc1428687697c5a11d58, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: cccc116a6334dc1428687697c5a11d58, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: cccc116a6334dc1428687697c5a11d58, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: cccc116a6334dc1428687697c5a11d58, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: cccc116a6334dc1428687697c5a11d58, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 2800000, guid: cccc116a6334dc1428687697c5a11d58, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 20 + m_FontStyle: 0 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 23 + m_FixedHeight: 21 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: ShaderLibraryRemoveFromList + m_Normal: + m_Background: {fileID: 2800000, guid: 75f68506ba820564ea85b2620d78c097, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 75f68506ba820564ea85b2620d78c097, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 75f68506ba820564ea85b2620d78c097, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: 75f68506ba820564ea85b2620d78c097, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 75f68506ba820564ea85b2620d78c097, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 75f68506ba820564ea85b2620d78c097, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 75f68506ba820564ea85b2620d78c097, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 2800000, guid: 75f68506ba820564ea85b2620d78c097, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 20 + m_FontStyle: 1 + m_Alignment: 2 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 23 + m_FixedHeight: 21 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: ShaderLibraryOpenListed + m_Normal: + m_Background: {fileID: 2800000, guid: a66917730dccde947a01140dc04b9e59, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: a66917730dccde947a01140dc04b9e59, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: a66917730dccde947a01140dc04b9e59, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: a66917730dccde947a01140dc04b9e59, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: a66917730dccde947a01140dc04b9e59, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: a66917730dccde947a01140dc04b9e59, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: a66917730dccde947a01140dc04b9e59, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 2800000, guid: a66917730dccde947a01140dc04b9e59, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 20 + m_FontStyle: 1 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 23 + m_FixedHeight: 21 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ShaderLibrarySelectionAsTemplate + m_Normal: + m_Background: {fileID: 2800000, guid: 8148796947da07d49906f1201f417a60, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 8148796947da07d49906f1201f417a60, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 8148796947da07d49906f1201f417a60, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: 8148796947da07d49906f1201f417a60, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 8148796947da07d49906f1201f417a60, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 8148796947da07d49906f1201f417a60, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 8148796947da07d49906f1201f417a60, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 2800000, guid: 8148796947da07d49906f1201f417a60, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 20 + m_FontStyle: 1 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 23 + m_FixedHeight: 21 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ShaderLibraryItem + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 10 + m_Right: 10 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 15 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: CommentaryTitle + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 10 + m_Right: 10 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 15 + m_FontStyle: 1 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: PortEmptyIcon + m_Normal: + m_Background: {fileID: 2800000, guid: 56277f370fb77a448a152bcd2e3a9077, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 56277f370fb77a448a152bcd2e3a9077, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 56277f370fb77a448a152bcd2e3a9077, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: 56277f370fb77a448a152bcd2e3a9077, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 56277f370fb77a448a152bcd2e3a9077, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 56277f370fb77a448a152bcd2e3a9077, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 56277f370fb77a448a152bcd2e3a9077, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 2800000, guid: 56277f370fb77a448a152bcd2e3a9077, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: PortFullIcon + m_Normal: + m_Background: {fileID: 2800000, guid: 8113366f9f7cec647878e3af2fb98922, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 8113366f9f7cec647878e3af2fb98922, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 8113366f9f7cec647878e3af2fb98922, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: 8113366f9f7cec647878e3af2fb98922, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 8113366f9f7cec647878e3af2fb98922, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 8113366f9f7cec647878e3af2fb98922, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 8113366f9f7cec647878e3af2fb98922, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 2800000, guid: 8113366f9f7cec647878e3af2fb98922, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: InputPortLabel + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 10 + m_Right: 10 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 15 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: OutputPortLabel + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 15 + m_FontStyle: 0 + m_Alignment: 5 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: CommentaryResizeButton + m_Normal: + m_Background: {fileID: 2800000, guid: 5321bd2b79632764286f28503db80815, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 5321bd2b79632764286f28503db80815, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 5321bd2b79632764286f28503db80815, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: 5321bd2b79632764286f28503db80815, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 5321bd2b79632764286f28503db80815, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 5321bd2b79632764286f28503db80815, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 5321bd2b79632764286f28503db80815, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 2800000, guid: 5321bd2b79632764286f28503db80815, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 15 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: CommentaryResizeButtonInv + m_Normal: + m_Background: {fileID: 2800000, guid: b52bc320a2ff91446978a893ec738134, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: b52bc320a2ff91446978a893ec738134, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: b52bc320a2ff91446978a893ec738134, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: b52bc320a2ff91446978a893ec738134, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: b52bc320a2ff91446978a893ec738134, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: b52bc320a2ff91446978a893ec738134, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: b52bc320a2ff91446978a893ec738134, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 2800000, guid: b52bc320a2ff91446978a893ec738134, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 15 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: CommentaryBackground + m_Normal: + m_Background: {fileID: 2800000, guid: b2be9c55e7e7ba447967677c82b2cb23, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: b2be9c55e7e7ba447967677c82b2cb23, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: b2be9c55e7e7ba447967677c82b2cb23, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: b2be9c55e7e7ba447967677c82b2cb23, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: b2be9c55e7e7ba447967677c82b2cb23, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: b2be9c55e7e7ba447967677c82b2cb23, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: b2be9c55e7e7ba447967677c82b2cb23, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 2800000, guid: b2be9c55e7e7ba447967677c82b2cb23, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 1 + m_Right: 1 + m_Top: 1 + m_Bottom: 1 + m_Font: {fileID: 0} + m_FontSize: 15 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: -18} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: MinimizeButton + m_Normal: + m_Background: {fileID: 2800000, guid: 2aae9a02747d74d46bf98a15ac5c9b21, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 2aae9a02747d74d46bf98a15ac5c9b21, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 2aae9a02747d74d46bf98a15ac5c9b21, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: 2aae9a02747d74d46bf98a15ac5c9b21, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 2aae9a02747d74d46bf98a15ac5c9b21, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 2aae9a02747d74d46bf98a15ac5c9b21, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 2aae9a02747d74d46bf98a15ac5c9b21, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 2800000, guid: 2aae9a02747d74d46bf98a15ac5c9b21, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 15 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: MaximizeButton + m_Normal: + m_Background: {fileID: 2800000, guid: 7a1fd3f5fef75b64385591e1890d1842, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 7a1fd3f5fef75b64385591e1890d1842, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 7a1fd3f5fef75b64385591e1890d1842, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: 7a1fd3f5fef75b64385591e1890d1842, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 7a1fd3f5fef75b64385591e1890d1842, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 7a1fd3f5fef75b64385591e1890d1842, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 7a1fd3f5fef75b64385591e1890d1842, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 2800000, guid: 7a1fd3f5fef75b64385591e1890d1842, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 15 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: NodePropertiesTitle + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 15 + m_FontStyle: 1 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: ShaderModeTitle + m_Normal: + m_Background: {fileID: 2800000, guid: f4ca92d9e50d06049b7ccec2c438754d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_Hover: + m_Background: {fileID: 2800000, guid: f4ca92d9e50d06049b7ccec2c438754d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_Active: + m_Background: {fileID: 2800000, guid: f4ca92d9e50d06049b7ccec2c438754d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_Focused: + m_Background: {fileID: 2800000, guid: f4ca92d9e50d06049b7ccec2c438754d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_OnNormal: + m_Background: {fileID: 2800000, guid: f4ca92d9e50d06049b7ccec2c438754d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_OnHover: + m_Background: {fileID: 2800000, guid: f4ca92d9e50d06049b7ccec2c438754d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_OnActive: + m_Background: {fileID: 2800000, guid: f4ca92d9e50d06049b7ccec2c438754d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_OnFocused: + m_Background: {fileID: 2800000, guid: f4ca92d9e50d06049b7ccec2c438754d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_Border: + m_Left: 30 + m_Right: 0 + m_Top: 0 + m_Bottom: 38 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 14 + m_FontStyle: 1 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 34, y: -1} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: MaterialModeTitle + m_Normal: + m_Background: {fileID: 2800000, guid: 5725fa8ee04e1be449af059f5735cd81, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_Hover: + m_Background: {fileID: 2800000, guid: 5725fa8ee04e1be449af059f5735cd81, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_Focused: + m_Background: {fileID: 2800000, guid: 5725fa8ee04e1be449af059f5735cd81, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 5725fa8ee04e1be449af059f5735cd81, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_OnHover: + m_Background: {fileID: 2800000, guid: 5725fa8ee04e1be449af059f5735cd81, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_OnFocused: + m_Background: {fileID: 2800000, guid: 5725fa8ee04e1be449af059f5735cd81, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_Border: + m_Left: 0 + m_Right: 40 + m_Top: 0 + m_Bottom: 38 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 14 + m_FontStyle: 1 + m_Alignment: 5 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: -44, y: -1} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: ShaderNoMaterialModeTitle + m_Normal: + m_Background: {fileID: 2800000, guid: 7040748e1c49b9648aeeefef41c8a3d5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_Hover: + m_Background: {fileID: 2800000, guid: 7040748e1c49b9648aeeefef41c8a3d5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_Focused: + m_Background: {fileID: 2800000, guid: 7040748e1c49b9648aeeefef41c8a3d5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 7040748e1c49b9648aeeefef41c8a3d5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_OnHover: + m_Background: {fileID: 2800000, guid: 7040748e1c49b9648aeeefef41c8a3d5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_OnActive: + m_Background: {fileID: 2800000, guid: 7040748e1c49b9648aeeefef41c8a3d5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_OnFocused: + m_Background: {fileID: 2800000, guid: 7040748e1c49b9648aeeefef41c8a3d5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 14 + m_FontStyle: 1 + m_Alignment: 5 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: -44, y: 9} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: PropertyValuesTitle + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5882353} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 3 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: ShaderModeNoShader + m_Normal: + m_Background: {fileID: 2800000, guid: df81b9531d8ef704f96072ce6910db68, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_Border: + m_Left: 30 + m_Right: 0 + m_Top: 0 + m_Bottom: 38 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 14 + m_FontStyle: 1 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 34, y: -1} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: MainCanvasTitle + m_Normal: + m_Background: {fileID: 2800000, guid: bdb42c87b8801e94e886c5c0d60b3014, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.41911763, g: 0.41911763, b: 0.41911763, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 6 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 17 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 1 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: ShaderBorder + m_Normal: + m_Background: {fileID: 2800000, guid: 555b6a287b4121b479d412e6ea92bb2e, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 10 + m_Right: 10 + m_Top: 10 + m_Bottom: 10 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 17 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: MaterialBorder + m_Normal: + m_Background: {fileID: 2800000, guid: 157b94751c138d84bbe1768c672b5168, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 10 + m_Right: 10 + m_Top: 10 + m_Bottom: 10 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 17 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: SamplerTextureRef + m_Normal: + m_Background: {fileID: 2800000, guid: f9bd85ea2601b824c87556c13e852933, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 13 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: SamplerTextureIcon + m_Normal: + m_Background: {fileID: 2800000, guid: 7cabe27e9427ef346a6b6557106353fd, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 7cabe27e9427ef346a6b6557106353fd, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 13 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: CustomExpressionAddItem + m_Normal: + m_Background: {fileID: 2800000, guid: 7eb057fdbf020504fb6c9c3c78031e5e, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 52bbe770f45f531419e44a69be67ccba, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Border: + m_Left: 12 + m_Right: 0 + m_Top: 12 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 15 + m_Right: 3 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: -2 + m_Right: 0 + m_Top: -4 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 17 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: CustomExpressionRemoveItem + m_Normal: + m_Background: {fileID: 2800000, guid: 839cb1530f95ad14ab58762161a9cb06, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 1ba096552f9cbbb418ee2286856bb352, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Border: + m_Left: 12 + m_Right: 0 + m_Top: 12 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 15 + m_Right: 3 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: -2 + m_Right: 0 + m_Top: -4 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 17 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: CustomExpressionSmallAddItem + m_Normal: + m_Background: {fileID: 2800000, guid: 1bd93c39ca74ac041b79ae289e9b9f08, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 1bd93c39ca74ac041b79ae289e9b9f08, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 13 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 1 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 20 + m_FixedHeight: 18 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: CustomExpressionSmallRemoveItem + m_Normal: + m_Background: {fileID: 2800000, guid: f4d31aa109c919d4595094f627510932, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: f4d31aa109c919d4595094f627510932, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 13 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 1 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 25 + m_FixedHeight: 18 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: ResetToDefaultInspectorButton + m_Normal: + m_Background: {fileID: 2800000, guid: a51794475a883744db8d524cee84e5fc, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: a51794475a883744db8d524cee84e5fc, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 2 + m_Top: 6 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: -2 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 13 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 10 + m_FixedHeight: 9 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: SliderStyle + m_Normal: + m_Background: {fileID: 2800000, guid: 4cabb2d6785b8aa4db0c0a34e1e00f04, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 3 + m_Right: 3 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ObjectPicker + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: + - {fileID: 0} + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 8 + m_Right: 31 + m_Top: 0 + m_Bottom: 16 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 3 + m_Top: 0 + m_Bottom: 1 + m_Overflow: + m_Left: -24 + m_Right: -1 + m_Top: 0 + m_Bottom: -1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 8 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: NodePropertyPicker + m_Normal: + m_Background: {fileID: 2800000, guid: 94816692c85001f4dab01ec3666943c0, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 16 + m_FixedHeight: 16 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: NodePreviewExpander + m_Normal: + m_Background: {fileID: 2800000, guid: 1f3a46793c375864ab816c0d78061e4e, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 16 + m_FixedHeight: 16 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: NodePreviewCollapser + m_Normal: + m_Background: {fileID: 2800000, guid: dae54b5aa457b474e8a1599de1073d26, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 16 + m_FixedHeight: 16 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: SamplerButton + m_Normal: + m_Background: {fileID: 2800000, guid: b57dd36838fb19c449fd4559efe3f800, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Border: + m_Left: 2 + m_Right: 0 + m_Top: 2 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 1 + m_Top: 0 + m_Bottom: -1 + m_Overflow: + m_Left: 0 + m_Right: 1 + m_Top: 0 + m_Bottom: 1 + m_Font: {fileID: 3021071571035331536, guid: 0000000000000000d000000000000000, + type: 0} + m_FontSize: 9 + m_FontStyle: 0 + m_Alignment: 5 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 1} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: SamplerFrame + m_Normal: + m_Background: {fileID: 2800000, guid: c1912a55d2f211d468ddeb7b1386dd41, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 1 + m_Right: 1 + m_Top: 1 + m_Bottom: 1 + m_Font: {fileID: 3021071571035331536, guid: 0000000000000000d000000000000000, + type: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: CommentarySuperTitle + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5882353} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 1 + m_Right: 1 + m_Top: 1 + m_Bottom: 1 + m_Font: {fileID: 3021071571035331536, guid: 0000000000000000d000000000000000, + type: 0} + m_FontSize: 18 + m_FontStyle: 2 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: MiniButtonBotLeft + m_Normal: + m_Background: {fileID: 2800000, guid: 9f2d5e61dd9821b44a410f36519781d7, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_Hover: + m_Background: {fileID: 2800000, guid: 6f3901bfd2342774ba74e117e43d6db7, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 4c872bb553406fe44a9d0046a0ef9bc5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 7ef06ce40d713d34790e78278ee82dea, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_Border: + m_Left: 1 + m_Right: 2 + m_Top: 2 + m_Bottom: 1 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 1 + m_Right: 0 + m_Top: 1 + m_Bottom: 0 + m_Font: {fileID: 3021071571035331536, guid: 0000000000000000d000000000000000, + type: 0} + m_FontSize: 9 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: MiniButtonBotMid + m_Normal: + m_Background: {fileID: 2800000, guid: eaf512a569994074b9b268ff098b0f03, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_Hover: + m_Background: {fileID: 2800000, guid: c86cb249299fb7249b5ee7fb27ef1951, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 133e79bed45185d408f4c5410f89dded, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 542d7546736ddd244a145ef7103678fb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_Border: + m_Left: 1 + m_Right: 1 + m_Top: 2 + m_Bottom: 1 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 1 + m_Bottom: 0 + m_Font: {fileID: 3021071571035331536, guid: 0000000000000000d000000000000000, + type: 0} + m_FontSize: 9 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: MiniButtonBotRight + m_Normal: + m_Background: {fileID: 2800000, guid: bfcecef29876cc54db85363cf2feebb2, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_Hover: + m_Background: {fileID: 2800000, guid: df6fb8448a382c743bd124cc0da55113, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 3821e905373e9fb4aac56ad254ba5769, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: d3098ebd60a35494e9977bd96b923298, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_Border: + m_Left: 1 + m_Right: 2 + m_Top: 2 + m_Bottom: 1 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 1 + m_Top: 1 + m_Bottom: 0 + m_Font: {fileID: 3021071571035331536, guid: 0000000000000000d000000000000000, + type: 0} + m_FontSize: 9 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ShaderFunctionBorder + m_Normal: + m_Background: {fileID: 2800000, guid: 94cd628d3d8e07d40a85d82b3fdad15d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: + - {fileID: -3646434626659933611, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: + - {fileID: -3080321147634112521, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: + - {fileID: -3976217546018649614, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_Border: + m_Left: 10 + m_Right: 10 + m_Top: 10 + m_Bottom: 10 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 17 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: ShaderFunctionMode + m_Normal: + m_Background: {fileID: 2800000, guid: 68897d376b60748438e0ae3474ebe558, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: + - {fileID: -3646434626659933611, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: + - {fileID: -3080321147634112521, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: + - {fileID: -3976217546018649614, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_Border: + m_Left: 30 + m_Right: 0 + m_Top: 0 + m_Bottom: 38 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 14 + m_FontStyle: 1 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 34, y: -1} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: RightShaderMode + m_Normal: + m_Background: {fileID: 2800000, guid: 5725fa8ee04e1be449af059f5735cd81, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: + - {fileID: -3646434626659933611, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: + - {fileID: -3080321147634112521, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: + - {fileID: -3976217546018649614, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_Border: + m_Left: 0 + m_Right: 40 + m_Top: 0 + m_Bottom: 38 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 14 + m_FontStyle: 1 + m_Alignment: 5 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 3 + m_ContentOffset: {x: -44, y: -1} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: FlatBackground + m_Normal: + m_Background: {fileID: 2800000, guid: 44efd0011d6a9bc4fb0b3a82753dac4e, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.4} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: + - {fileID: -3646434626659933611, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: + - {fileID: -3080321147634112521, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: + - {fileID: -3976217546018649614, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 1 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: DocumentationLink + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.29803923, g: 0.49019608, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 1004d06b4b28f5943abdf2313a22790a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 1004d06b4b28f5943abdf2313a22790a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7019608, g: 0.7019608, b: 0.7019608, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: 1004d06b4b28f5943abdf2313a22790a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.2985075, g: 0.4923412, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 1004d06b4b28f5943abdf2313a22790a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.2985075, g: 0.4923412, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 2800000, guid: 1004d06b4b28f5943abdf2313a22790a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.2985075, g: 0.4923412, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 2 + m_Bottom: 2 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 1 + m_Bottom: 2 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 9 + m_FontStyle: 0 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: GraphButtonIcon + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 2 + m_Bottom: 2 + m_Overflow: + m_Left: 2 + m_Right: 2 + m_Top: 2 + m_Bottom: 2 + m_Font: {fileID: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: GraphButton + m_Normal: + m_Background: {fileID: 2800000, guid: 2b3b7485f95e8a44dab3fa9610f56cbb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: dd3411e8d9927d3429d5872dbdbd752b, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 4 + m_Right: 4 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 1 + m_Right: 1 + m_Top: 1 + m_Bottom: 1 + m_Font: {fileID: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: NodeWindowOffSquare + m_Normal: + m_Background: {fileID: 2800000, guid: d179c8744f837da49ab92aae04d1ae1c, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 1 + m_Right: 1 + m_Top: 1 + m_Bottom: 1 + m_Font: {fileID: 0} + m_FontSize: 13 + m_FontStyle: 1 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: -18} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: NodeHeaderSquare + m_Normal: + m_Background: {fileID: 2800000, guid: b16188b8a3dee8146bd9cb0bde234a24, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 1 + m_Right: 1 + m_Top: 1 + m_Bottom: 1 + m_Font: {fileID: 0} + m_FontSize: 13 + m_FontStyle: 1 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: NodeWindowOnSquare + m_Normal: + m_Background: {fileID: 2800000, guid: 080a030f87555fe419ecc1fb9f509118, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 2 + m_Right: 2 + m_Top: 2 + m_Bottom: 2 + m_Font: {fileID: 0} + m_FontSize: 6 + m_FontStyle: 1 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ConsoleLogMessage + m_Normal: + m_Background: {fileID: 2800000, guid: c560c5d8ca4c353409caf2ec204f3a19, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 8 + m_Right: 8 + m_Top: 8 + m_Bottom: 8 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_Alignment: 8 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: ConsoleLogCircle + m_Normal: + m_Background: {fileID: 2800000, guid: c560c5d8ca4c353409caf2ec204f3a19, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_Hover: + m_Background: {fileID: 2800000, guid: c560c5d8ca4c353409caf2ec204f3a19, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0.5019608} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Border: + m_Left: 8 + m_Right: 8 + m_Top: 8 + m_Bottom: 8 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + m_Settings: + m_DoubleClickSelectsWord: 0 + m_TripleClickSelectsLine: 0 + m_CursorColor: {r: 1, g: 1, b: 1, a: 1} + m_CursorFlashSpeed: -1 + m_SelectionColor: {r: 1, g: 0.38403907, b: 0, a: 0.7} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/GUISkins/MainSkin.guiskin.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/GUISkins/MainSkin.guiskin.meta new file mode 100644 index 0000000..1601885 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/GUISkins/MainSkin.guiskin.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 57482289c346f104a8162a3a79aaff9d +timeCreated: 1481127067 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes.meta new file mode 100644 index 0000000..09c8ef6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 74a246631cfb81b4eb720dba241ad84c +folderAsset: yes +timeCreated: 1481126944 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/Bezier1X2AA.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/Bezier1X2AA.png new file mode 100644 index 0000000..ca6e05c Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/Bezier1X2AA.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/Bezier1X2AA.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/Bezier1X2AA.png.meta new file mode 100644 index 0000000..c2e4d98 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/Bezier1X2AA.png.meta @@ -0,0 +1,59 @@ +fileFormatVersion: 2 +guid: 06e687f68dd96f0448c6d8217bbcf608 +timeCreated: 1481126972 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: 2 + aniso: 16 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 5 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/GPUInstancingIconOFF.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/GPUInstancingIconOFF.png new file mode 100644 index 0000000..b97bfdb Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/GPUInstancingIconOFF.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/GPUInstancingIconOFF.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/GPUInstancingIconOFF.png.meta new file mode 100644 index 0000000..5d712f1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/GPUInstancingIconOFF.png.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: 486c7766baaf21b46afb63c1121ef03e +timeCreated: 1481126990 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 1 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: 1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/GPUInstancingIconON.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/GPUInstancingIconON.png new file mode 100644 index 0000000..0d8878a Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/GPUInstancingIconON.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/GPUInstancingIconON.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/GPUInstancingIconON.png.meta new file mode 100644 index 0000000..a752056 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/GPUInstancingIconON.png.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: 4b0c2926cc71c5846ae2a29652d54fb6 +timeCreated: 1481126990 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: 1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/LinkIcon.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/LinkIcon.png new file mode 100644 index 0000000..fa98d79 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/LinkIcon.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/LinkIcon.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/LinkIcon.png.meta new file mode 100644 index 0000000..ba762b4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/LinkIcon.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 7cabe27e9427ef346a6b6557106353fd +timeCreated: 1481126999 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/MasterNodeIconOFF.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/MasterNodeIconOFF.png new file mode 100644 index 0000000..eb9426f Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/MasterNodeIconOFF.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/MasterNodeIconOFF.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/MasterNodeIconOFF.png.meta new file mode 100644 index 0000000..50b756f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/MasterNodeIconOFF.png.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: 712aee08d999c16438e2d694f42428e8 +timeCreated: 1481126996 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: 1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/MasterNodeIconON.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/MasterNodeIconON.png new file mode 100644 index 0000000..7dc8d15 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/MasterNodeIconON.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/MasterNodeIconON.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/MasterNodeIconON.png.meta new file mode 100644 index 0000000..8d64d38 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/MasterNodeIconON.png.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: 26c64fcee91024a49980ea2ee9d1a2fb +timeCreated: 1481126983 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: 1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/TextureReferenceBg.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/TextureReferenceBg.png new file mode 100644 index 0000000..573cc11 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/TextureReferenceBg.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/TextureReferenceBg.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/TextureReferenceBg.png.meta new file mode 100644 index 0000000..cc8e061 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Nodes/TextureReferenceBg.png.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: f9bd85ea2601b824c87556c13e852933 +timeCreated: 1481127030 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: 1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 5 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews.meta new file mode 100644 index 0000000..5bdab96 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 461082514f2c69d4a9cc883cd0fe7891 +folderAsset: yes +timeCreated: 1488289754 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/IndirectSpecularPreview.exr b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/IndirectSpecularPreview.exr new file mode 100644 index 0000000..90154e8 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/IndirectSpecularPreview.exr differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/IndirectSpecularPreview.exr.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/IndirectSpecularPreview.exr.meta new file mode 100644 index 0000000..fd58550 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/IndirectSpecularPreview.exr.meta @@ -0,0 +1,69 @@ +fileFormatVersion: 2 +guid: ef7513b54a0670140b9b967af7620563 +timeCreated: 1512052044 +licenseType: Store +TextureImporter: + fileIDToRecycleName: + 8900000: generatedCubemap + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 1 + seamlessCubemap: 1 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + filterMode: 2 + aniso: 0 + mipBias: 0 + wrapMode: 1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 2 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 100 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/LinearPreviews.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/LinearPreviews.shader new file mode 100644 index 0000000..077ef3a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/LinearPreviews.shader @@ -0,0 +1,232 @@ +Shader "Hidden/LinearMaterial" +{ + Properties + { + _MainTex( "Texture", any ) = "" {} + _BackGround( "Back", 2D) = "white" {} + } + + SubShader + { + Lighting Off + Blend SrcAlpha OneMinusSrcAlpha + Cull Off + ZWrite Off + ZTest Always + + + Pass { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma target 2.0 + + #include "UnityCG.cginc" + + sampler2D _MainTex; + uniform float4 _MainTex_ST; + float4 _Mask; + + uniform float4x4 unity_GUIClipTextureMatrix; + sampler2D _GUIClipTexture; + + struct appdata_t { + float4 vertex : POSITION; + float2 texcoord : TEXCOORD0; + }; + + struct v2f { + float4 vertex : SV_POSITION; + float2 texcoord : TEXCOORD0; + float2 clipUV : TEXCOORD1; + }; + + v2f vert( appdata_t v ) + { + v2f o; + o.vertex = UnityObjectToClipPos( v.vertex ); + o.texcoord = TRANSFORM_TEX( v.texcoord.xy, _MainTex ); + float3 eyePos = UnityObjectToViewPos( v.vertex ); + o.clipUV = mul( unity_GUIClipTextureMatrix, float4( eyePos.xy, 0, 1.0 ) ); + return o; + } + + fixed4 frag( v2f i ) : SV_Target + { + float4 c = tex2D( _MainTex, i.texcoord ); + c.rgb *= _Mask.rgb; + + c.a = tex2D( _GUIClipTexture, i.clipUV ).a; + return c; + } + ENDCG + } + + Pass { // sphere preview = true, alpha mask = false + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma target 2.0 + + #include "UnityCG.cginc" + + sampler2D _MainTex; + uniform float4 _MainTex_ST; + float _InvertedZoom; + float4 _Mask; + + uniform float4x4 unity_GUIClipTextureMatrix; + sampler2D _GUIClipTexture; + + struct appdata_t { + float4 vertex : POSITION; + float2 texcoord : TEXCOORD0; + }; + + struct v2f { + float4 vertex : SV_POSITION; + float2 texcoord : TEXCOORD0; + float2 clipUV : TEXCOORD1; + }; + + v2f vert( appdata_t v ) + { + v2f o; + o.vertex = UnityObjectToClipPos( v.vertex ); + o.texcoord = TRANSFORM_TEX( v.texcoord.xy, _MainTex ); + float3 eyePos = UnityObjectToViewPos( v.vertex ); + o.clipUV = mul( unity_GUIClipTextureMatrix, float4( eyePos.xy, 0, 1.0 ) ); + return o; + } + + fixed4 frag( v2f i ) : SV_Target + { + float2 p = 2 * i.texcoord - 1; + float r = sqrt( dot( p,p ) ); + + float alpha = saturate( ( 1 - r )*( 45 * _InvertedZoom + 5 ) ); + + float4 c = tex2D( _MainTex, i.texcoord ); + c.rgb *= _Mask.rgb; + + c.rgb *= alpha; + + c.a = tex2D( _GUIClipTexture, i.clipUV ).a; + return c; + } + ENDCG + } + + Pass { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma target 2.0 + + #include "UnityCG.cginc" + + sampler2D _MainTex; + sampler2D _BackGround; + uniform float4 _MainTex_ST; + uniform float4 _BackGround_ST; + float _InvertedZoom; + float4 _Mask; + + uniform float4x4 unity_GUIClipTextureMatrix; + sampler2D _GUIClipTexture; + + struct appdata_t { + float4 vertex : POSITION; + float2 texcoord : TEXCOORD0; + }; + + struct v2f { + float4 vertex : SV_POSITION; + float2 texcoord : TEXCOORD0; + float2 clipUV : TEXCOORD1; + }; + + v2f vert( appdata_t v ) + { + v2f o; + o.vertex = UnityObjectToClipPos( v.vertex ); + o.texcoord = TRANSFORM_TEX( v.texcoord.xy, _MainTex ); + float3 eyePos = UnityObjectToViewPos( v.vertex ); + o.clipUV = mul( unity_GUIClipTextureMatrix, float4( eyePos.xy, 0, 1.0 ) ); + return o; + } + + fixed4 frag( v2f i ) : SV_Target + { + float3 back = tex2D( _BackGround, ( i.texcoord * 2 - 1 ) * _InvertedZoom).b; + + float4 c = tex2D( _MainTex, i.texcoord ); + c.rgb *= _Mask.rgb; + c.rgb = lerp( back, c.rgb, c.a ); + + c.a = tex2D( _GUIClipTexture, i.clipUV ).a; + return c; + } + ENDCG + } + + Pass { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma target 2.0 + + #include "UnityCG.cginc" + + sampler2D _MainTex; + sampler2D _BackGround; + uniform float4 _MainTex_ST; + uniform float4 _BackGround_ST; + float _InvertedZoom; + float4 _Mask; + + uniform float4x4 unity_GUIClipTextureMatrix; + sampler2D _GUIClipTexture; + + struct appdata_t { + float4 vertex : POSITION; + float2 texcoord : TEXCOORD0; + }; + + struct v2f { + float4 vertex : SV_POSITION; + float2 texcoord : TEXCOORD0; + float2 clipUV : TEXCOORD1; + }; + + v2f vert( appdata_t v ) + { + v2f o; + o.vertex = UnityObjectToClipPos( v.vertex ); + o.texcoord = TRANSFORM_TEX( v.texcoord.xy, _MainTex ); + float3 eyePos = UnityObjectToViewPos( v.vertex ); + o.clipUV = mul( unity_GUIClipTextureMatrix, float4( eyePos.xy, 0, 1.0 ) ); + return o; + } + + fixed4 frag( v2f i ) : SV_Target + { + float2 p = 2 * i.texcoord - 1; + float3 back = tex2D( _BackGround, p * _InvertedZoom).b; + float r = sqrt( dot( p,p ) ); + + float alpha = saturate( ( 1 - r )*( 45 * _InvertedZoom + 5 ) ); + + float4 c = 0; + c = tex2D( _MainTex, i.texcoord ); + c.rgb *= _Mask.rgb; + c.rgb = lerp( back, c.rgb, c.a * alpha); + + c.a = tex2D( _GUIClipTexture, i.clipUV ).a; + return c; + } + ENDCG + } + } + Fallback Off +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/LinearPreviews.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/LinearPreviews.shader.meta new file mode 100644 index 0000000..03bf6e5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/LinearPreviews.shader.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e90ef6ea05743b84baf9549874c52e47 +timeCreated: 1489078120 +licenseType: Store +ShaderImporter: + defaultTextures: + - _MainTex: {instanceID: 0} + - _BackGround: {fileID: 2800000, guid: 750b1bd7ba8bd28489650de6d0a95cc5, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ACosOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ACosOpNode.shader new file mode 100644 index 0000000..a06859d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ACosOpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/ACosOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return acos(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ACosOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ACosOpNode.shader.meta new file mode 100644 index 0000000..8cb6d6a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ACosOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 710f3c0bbd7ba0c4aada6d7dfadd49c2 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ASinOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ASinOpNode.shader new file mode 100644 index 0000000..8273b04 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ASinOpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/ASinOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return asin(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ASinOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ASinOpNode.shader.meta new file mode 100644 index 0000000..69d34ba --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ASinOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2b016c135284add4cb3364d4a0bd0638 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ATan2OpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ATan2OpNode.shader new file mode 100644 index 0000000..f15dbcd --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ATan2OpNode.shader @@ -0,0 +1,29 @@ +Shader "Hidden/ATan2OpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 b = tex2D( _B, i.uv ); + return atan2(a, b); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ATan2OpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ATan2OpNode.shader.meta new file mode 100644 index 0000000..fc57c1a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ATan2OpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 02e3ff61784e38840af6313936b6a730 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ATanOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ATanOpNode.shader new file mode 100644 index 0000000..acc5cdb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ATanOpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/ATanOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return atan(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ATanOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ATanOpNode.shader.meta new file mode 100644 index 0000000..178006a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ATanOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 7d7f3331a98831241b017364e80625ea +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_AbsOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_AbsOpNode.shader new file mode 100644 index 0000000..ecff53d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_AbsOpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/AbsOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return abs(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_AbsOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_AbsOpNode.shader.meta new file mode 100644 index 0000000..43b7595 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_AbsOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: cd6d6dfa3df214a479f68a490e177db6 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_AppendNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_AppendNode.shader new file mode 100644 index 0000000..f91228b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_AppendNode.shader @@ -0,0 +1,36 @@ +Shader "Hidden/AppendNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + _C ("_C", 2D) = "white" {} + _D ("_D", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + + float4 frag(v2f_img i) : SV_Target + { + float x = tex2D(_A, i.uv).x; + float y = tex2D(_B, i.uv).y; + float z = tex2D(_C, i.uv).z; + float w = tex2D(_D, i.uv).w; + + return float4(x,y,z,w); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_AppendNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_AppendNode.shader.meta new file mode 100644 index 0000000..fc3d21e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_AppendNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d80ac81aabf643848a4eaa76f2f88d65 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_BlendNormalsNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_BlendNormalsNode.shader new file mode 100644 index 0000000..cbb2419 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_BlendNormalsNode.shader @@ -0,0 +1,82 @@ +Shader "Hidden/BlendNormalsNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + _C ("_C", 2D) = "white" {} + } + SubShader + { + CGINCLUDE + #pragma vertex vert_img + #pragma fragment frag + #pragma target 3.0 + #include "UnityCG.cginc" + #include "UnityStandardUtils.cginc" + + float3 BlendNormalWorldspaceRNM(float3 n1, float3 n2, float3 vtxNormal) + { + float4 q = float4(cross(vtxNormal, n2), dot(vtxNormal, n2) + 1.0) / sqrt(2.0 * (dot(vtxNormal, n2) + 1)); + return n1 * (q.w * q.w - dot(q.xyz, q.xyz)) + 2 * q.xyz * dot(q.xyz, n1) + 2 * q.w * cross(q.xyz, n1); + } + + float3 BlendNormalRNM(float3 n1, float3 n2) + { + float3 t = n1.xyz + float3(0.0, 0.0, 1.0); + float3 u = n2.xyz * float3(-1.0, -1.0, 1.0); + float3 r = (t / t.z) * dot(t, u) - u; + return r; + } + ENDCG + Pass + { + CGPROGRAM + + sampler2D _A; + sampler2D _B; + + float4 frag(v2f_img i) : SV_Target + { + float3 a = tex2D( _A, i.uv ).rgb; + float3 b = tex2D( _B, i.uv ).rgb; + return float4(BlendNormals(a, b), 0); + } + ENDCG + } + + Pass + { + CGPROGRAM + + sampler2D _A; + sampler2D _B; + + float4 frag(v2f_img i) : SV_Target + { + float3 a = tex2D(_A, i.uv).rgb; + float3 b = tex2D(_B, i.uv).rgb; + return float4(BlendNormalRNM(a, b), 0); + } + ENDCG + } + + Pass + { + CGPROGRAM + + sampler2D _A; + sampler2D _B; + sampler2D _C; + + float4 frag(v2f_img i) : SV_Target + { + float3 a = tex2D(_A, i.uv).rgb; + float3 b = tex2D(_B, i.uv).rgb; + float3 c = tex2D(_C, i.uv).rgb; + return float4(BlendNormalWorldspaceRNM(a,b,c), 0); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_BlendNormalsNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_BlendNormalsNode.shader.meta new file mode 100644 index 0000000..fac57de --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_BlendNormalsNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: bcdf750ff5f70444f98b8a3efa50dc6f +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_BlendOpsNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_BlendOpsNode.shader new file mode 100644 index 0000000..8066511 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_BlendOpsNode.shader @@ -0,0 +1,601 @@ +Shader "Hidden/BlendOpsNode" +{ + Properties + { + _A ("_Source", 2D) = "white" {} + _B ("_Destiny", 2D) = "white" {} + _C ("_Alpha", 2D) = "white" {} + } + SubShader + { + Pass //colorburn + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + int _Sat; + int _Lerp; + + float4 frag(v2f_img i) : SV_Target + { + float4 src = tex2D( _A, i.uv ); + float4 des = tex2D( _B, i.uv ); + + float4 c = ( ( 1.0 - ( ( 1.0 - des) / max( src,0.00001)) ) ); + if (_Lerp == 1) + { + float alpha = tex2D (_C, i.uv).r; + c = lerp(des, c, alpha); + } + + if( _Sat == 1 ) + c = saturate( c ); + return c; + } + ENDCG + } + + Pass //colordodge + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + int _Sat; + int _Lerp; + + float4 frag(v2f_img i) : SV_Target + { + float4 src = tex2D( _A, i.uv ); + float4 des = tex2D( _B, i.uv ); + + float4 c = ( ( des/ max( 1.0 - src,0.00001 ) ) ); + if (_Lerp == 1) + { + float alpha = tex2D (_C, i.uv).r; + c = lerp (des, c, alpha); + } + if( _Sat == 1 ) + c = saturate( c ); + return c; + } + ENDCG + } + + Pass //darken + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + int _Sat; + int _Lerp; + + float4 frag(v2f_img i) : SV_Target + { + float4 src = tex2D( _A, i.uv ); + float4 des = tex2D( _B, i.uv ); + + float4 c = ( min( src , des ) ); + if (_Lerp == 1) + { + float alpha = tex2D (_C, i.uv).r; + c = lerp (des, c, alpha); + } + if( _Sat == 1 ) + c = saturate( c ); + return c; + } + ENDCG + } + + Pass //divide + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + int _Sat; + int _Lerp; + + float4 frag(v2f_img i) : SV_Target + { + float4 src = tex2D( _A, i.uv ); + float4 des = tex2D( _B, i.uv ); + + float4 c = ( ( des / max( src,0.00001) ) ); + if (_Lerp == 1) + { + float alpha = tex2D (_C, i.uv).r; + c = lerp (des, c, alpha); + } + if( _Sat == 1 ) + c = saturate( c ); + return c; + } + ENDCG + } + + Pass //difference + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + int _Sat; + int _Lerp; + + float4 frag(v2f_img i) : SV_Target + { + float4 src = tex2D( _A, i.uv ); + float4 des = tex2D( _B, i.uv ); + + float4 c = ( abs( src - des ) ); + if (_Lerp == 1) + { + float alpha = tex2D (_C, i.uv).r; + c = lerp (des, c, alpha); + } + if( _Sat == 1 ) + c = saturate( c ); + return c; + } + ENDCG + } + + Pass //exclusion + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + int _Sat; + int _Lerp; + + float4 frag(v2f_img i) : SV_Target + { + float4 src = tex2D( _A, i.uv ); + float4 des = tex2D( _B, i.uv ); + + float4 c = ( ( 0.5 - 2.0 * ( src - 0.5 ) * ( des - 0.5 ) ) ); + if (_Lerp == 1) + { + float alpha = tex2D (_C, i.uv).r; + c = lerp (des, c, alpha); + } + if( _Sat == 1 ) + c = saturate( c ); + return c; + } + ENDCG + } + + Pass //softlight + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + int _Sat; + int _Lerp; + + float4 frag(v2f_img i) : SV_Target + { + float4 src = tex2D( _A, i.uv ); + float4 des = tex2D( _B, i.uv ); + + float4 c = ( 2.0f*src*des + des*des*(1.0f - 2.0f*src) ); + if (_Lerp == 1) + { + float alpha = tex2D (_C, i.uv).r; + c = lerp (des, c, alpha); + } + if( _Sat == 1 ) + c = saturate( c ); + return c; + } + ENDCG + } + + Pass //hardlight + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + int _Sat; + int _Lerp; + + float4 frag(v2f_img i) : SV_Target + { + float4 src = tex2D( _A, i.uv ); + float4 des = tex2D( _B, i.uv ); + + float4 c = ( ( src > 0.5 ? ( 1.0 - ( 1.0 - 2.0 * ( src - 0.5 ) ) * ( 1.0 - des ) ) : ( 2.0 * src * des ) ) ); + if (_Lerp == 1) + { + float alpha = tex2D (_C, i.uv).r; + c = lerp (des, c, alpha); + } + if( _Sat == 1 ) + c = saturate( c ); + return c; + } + ENDCG + } + + Pass //hardmix + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + int _Sat; + int _Lerp; + + float4 frag(v2f_img i) : SV_Target + { + float4 src = tex2D( _A, i.uv ); + float4 des = tex2D( _B, i.uv ); + + float4 c = ( round( 0.5 * ( src + des ) ) ); + if (_Lerp == 1) + { + float alpha = tex2D (_C, i.uv).r; + c = lerp (des, c, alpha); + } + if( _Sat == 1 ) + c = saturate( c ); + return c; + } + ENDCG + } + + Pass //lighten + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + int _Sat; + int _Lerp; + + float4 frag(v2f_img i) : SV_Target + { + float4 src = tex2D( _A, i.uv ); + float4 des = tex2D( _B, i.uv ); + + float4 c = ( max( src, des ) ); + if (_Lerp == 1) + { + float alpha = tex2D (_C, i.uv).r; + c = lerp (des, c, alpha); + } + if( _Sat == 1 ) + c = saturate( c ); + return c; + } + ENDCG + } + + Pass //linearburn + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + int _Sat; + int _Lerp; + + float4 frag(v2f_img i) : SV_Target + { + float4 src = tex2D( _A, i.uv ); + float4 des = tex2D( _B, i.uv ); + + float4 c = ( ( src + des - 1.0 ) ); + if (_Lerp == 1) + { + float alpha = tex2D (_C, i.uv).r; + c = lerp (des, c, alpha); + } + if( _Sat == 1 ) + c = saturate( c ); + return c; + } + ENDCG + } + + Pass //lineardodge + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + int _Sat; + int _Lerp; + + float4 frag(v2f_img i) : SV_Target + { + float4 src = tex2D( _A, i.uv ); + float4 des = tex2D( _B, i.uv ); + + float4 c = ( ( src + des ) ); + if (_Lerp == 1) + { + float alpha = tex2D (_C, i.uv).r; + c = lerp (des, c, alpha); + } + if( _Sat == 1 ) + c = saturate( c ); + return c; + } + ENDCG + } + + Pass //linearlight + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + int _Sat; + int _Lerp; + + float4 frag(v2f_img i) : SV_Target + { + float4 src = tex2D( _A, i.uv ); + float4 des = tex2D( _B, i.uv ); + + float4 c = ( ( src > 0.5 ? ( des + 2.0 * src - 1.0 ) : ( des + 2.0 * ( src - 0.5 ) ) ) ); + if (_Lerp == 1) + { + float alpha = tex2D (_C, i.uv).r; + c = lerp (des, c, alpha); + } + if( _Sat == 1 ) + c = saturate( c ); + return c; + } + ENDCG + } + + Pass //multiply + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + int _Sat; + int _Lerp; + + float4 frag(v2f_img i) : SV_Target + { + float4 src = tex2D( _A, i.uv ); + float4 des = tex2D( _B, i.uv ); + + float4 c = ( ( src * des ) ); + if (_Lerp == 1) + { + float alpha = tex2D (_C, i.uv).r; + c = lerp (des, c, alpha); + } + if( _Sat == 1 ) + c = saturate( c ); + return c; + } + ENDCG + } + + Pass //overlay + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + int _Sat; + int _Lerp; + + float4 frag(v2f_img i) : SV_Target + { + float4 src = tex2D( _A, i.uv ); + float4 des = tex2D( _B, i.uv ); + + float4 c = ( ( des > 0.5 ? ( 1.0 - 2.0 * ( 1.0 - des ) * ( 1.0 - src ) ) : ( 2.0 * des * src ) ) ); + if (_Lerp == 1) + { + float alpha = tex2D (_C, i.uv).r; + c = lerp (des, c, alpha); + } + if( _Sat == 1 ) + c = saturate( c ); + return c; + } + ENDCG + } + + Pass //pinlight + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + int _Sat; + int _Lerp; + + float4 frag(v2f_img i) : SV_Target + { + float4 src = tex2D( _A, i.uv ); + float4 des = tex2D( _B, i.uv ); + + float4 c = ( ( src > 0.5 ? max( des, 2.0 * ( src - 0.5 ) ) : min( des, 2.0 * src ) ) ); + if (_Lerp == 1) + { + float alpha = tex2D (_C, i.uv).r; + c = lerp (des, c, alpha); + } + if( _Sat == 1 ) + c = saturate( c ); + return c; + } + ENDCG + } + + Pass //subtract + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + int _Sat; + int _Lerp; + + float4 frag(v2f_img i) : SV_Target + { + float4 src = tex2D( _A, i.uv ); + float4 des = tex2D( _B, i.uv ); + + float4 c = ( ( des - src ) ); + if (_Lerp == 1) + { + float alpha = tex2D (_C, i.uv).r; + c = lerp (des, c, alpha); + } + if( _Sat == 1 ) + c = saturate( c ); + return c; + } + ENDCG + } + + Pass //screen + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + int _Sat; + int _Lerp; + + float4 frag(v2f_img i) : SV_Target + { + float4 src = tex2D( _A, i.uv ); + float4 des = tex2D( _B, i.uv ); + + float4 c = ( ( 1.0 - ( 1.0 - src ) * ( 1.0 - des ) ) ); + if (_Lerp == 1) + { + float alpha = tex2D (_C, i.uv).r; + c = lerp (des, c, alpha); + } + if( _Sat == 1 ) + c = saturate( c ); + return c; + } + ENDCG + } + + Pass //vividlight + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + int _Sat; + int _Lerp; + + float4 frag(v2f_img i) : SV_Target + { + float4 src = tex2D( _A, i.uv ); + float4 des = tex2D( _B, i.uv ); + + float4 c = ( ( src > 0.5 ? ( des / max( ( 1.0 - src ) * 2.0 ,0.00001) ) : ( 1.0 - ( ( ( 1.0 - des ) * 0.5 ) / max(src,0.00001) ) ) ) ); + if (_Lerp == 1) + { + float alpha = tex2D (_C, i.uv).r; + c = lerp (des, c, alpha); + } + if( _Sat == 1 ) + c = saturate( c ); + return c; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_BlendOpsNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_BlendOpsNode.shader.meta new file mode 100644 index 0000000..37d0722 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_BlendOpsNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6d6b3518705b3ba49acdc6e18e480257 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_BreakToComponentsNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_BreakToComponentsNode.shader new file mode 100644 index 0000000..e6306b5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_BreakToComponentsNode.shader @@ -0,0 +1,73 @@ +Shader "Hidden/BreakToComponentsNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return tex2D( _A, i.uv ).x; + } + ENDCG + } + + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return tex2D( _A, i.uv ).y; + } + ENDCG + } + + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return tex2D( _A, i.uv ).z; + } + ENDCG + } + + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return tex2D( _A, i.uv ).w; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_BreakToComponentsNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_BreakToComponentsNode.shader.meta new file mode 100644 index 0000000..05a2374 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_BreakToComponentsNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 5f58f74a202ba804daddec838b75207d +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CeilOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CeilOpNode.shader new file mode 100644 index 0000000..7065d1e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CeilOpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/CeilOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return ceil(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CeilOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CeilOpNode.shader.meta new file mode 100644 index 0000000..e278da2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CeilOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ce0588227a766a245a85291977c1f222 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ClampOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ClampOpNode.shader new file mode 100644 index 0000000..df9318e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ClampOpNode.shader @@ -0,0 +1,33 @@ +Shader "Hidden/ClampOpNode" +{ + Properties + { + _A ("_Value", 2D) = "white" {} + _B ("_Min", 2D) = "white" {} + _C ("_Max", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + + float4 frag(v2f_img i) : SV_Target + { + float4 value = tex2D( _A, i.uv ); + float4 min = tex2D( _B, i.uv ); + float4 max = tex2D( _C, i.uv ); + + return clamp(value, min, max); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ClampOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ClampOpNode.shader.meta new file mode 100644 index 0000000..aedd754 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ClampOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ab6163c4b10bfc84da8e3c486520490a +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Clip.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Clip.shader new file mode 100644 index 0000000..47bd6e0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Clip.shader @@ -0,0 +1,35 @@ +Shader "Hidden/Clip" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + _C ("_C", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + + float4 frag( v2f_img i ) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 b = tex2D( _B, i.uv ); + float4 c = tex2D( _C, i.uv ); + + clip(b - c); + + return a; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Clip.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Clip.shader.meta new file mode 100644 index 0000000..637c32a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Clip.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 1fca7774f364aee4d8c64e8634ef4be4 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ClipPlanes.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ClipPlanes.shader new file mode 100644 index 0000000..59f5543 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ClipPlanes.shader @@ -0,0 +1,25 @@ +Shader "Hidden/ClipPlanes" +{ + Properties + { + _PlaneId ("_PlaneId", Int) = 0 + } + + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + int _PlaneId; + float4 frag( v2f_img i ) : SV_Target + { + return unity_CameraWorldClipPlanes[_PlaneId]; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ClipPlanes.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ClipPlanes.shader.meta new file mode 100644 index 0000000..7de7975 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ClipPlanes.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6afe5a4ad7bbd0e4ab352c758f543a09 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ColorNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ColorNode.shader new file mode 100644 index 0000000..4663c49 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ColorNode.shader @@ -0,0 +1,24 @@ +Shader "Hidden/ColorNode" +{ + Properties { + _InputColor ("_InputColor", Color) = (0,0,0,0) + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + float4 _InputColor; + + float4 frag( v2f_img i ) : SV_Target + { + return _InputColor; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ColorNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ColorNode.shader.meta new file mode 100644 index 0000000..27cfeaf --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ColorNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6cf365ccc7ae776488ae8960d6d134c3 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ColorSpaceDouble.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ColorSpaceDouble.shader new file mode 100644 index 0000000..c27833a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ColorSpaceDouble.shader @@ -0,0 +1,19 @@ +Shader "Hidden/ColorSpaceDouble" +{ + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float4 frag( v2f_img i ) : SV_Target + { + return unity_ColorSpaceDouble; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ColorSpaceDouble.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ColorSpaceDouble.shader.meta new file mode 100644 index 0000000..66ba194 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ColorSpaceDouble.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ac680a8772bb97c46851a7f075fd04e3 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Compare.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Compare.shader new file mode 100644 index 0000000..7a3009b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Compare.shader @@ -0,0 +1,48 @@ +Shader "Hidden/TFHCCompareEqual" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + _C ("_True", 2D) = "white" {} + _D ( "_False", 2D ) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + int _Operator; + + float4 frag(v2f_img i) : SV_Target + { + float A = tex2D( _A, i.uv ).x; + float B = tex2D( _B, i.uv ).x; + float4 True = tex2D( _C, i.uv ); + float4 False = tex2D ( _D, i.uv ); + + if( _Operator == 0 ) + return ( ( A == B ) ? True : False ); + else if( _Operator == 1 ) + return ( ( A != B ) ? True : False ); + else if( _Operator == 2 ) + return ( ( A > B ) ? True : False ); + else if( _Operator == 3 ) + return ( ( A >= B ) ? True : False ); + else if( _Operator == 4 ) + return ( ( A < B ) ? True : False ); + else + return ( ( A <= B ) ? True : False ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Compare.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Compare.shader.meta new file mode 100644 index 0000000..9e2ee0e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Compare.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 381937898f0c15747af1da09a751890c +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ComponentMaskNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ComponentMaskNode.shader new file mode 100644 index 0000000..b607639 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ComponentMaskNode.shader @@ -0,0 +1,62 @@ +Shader "Hidden/ComponentMaskNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + float _Singular; + float4 _Order; + + float4 frag( v2f_img i ) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 r = 0; + if(_Singular == 0) + r = a.x; + else if(_Singular == 1) + r = a.y; + else if(_Singular == 2) + r = a.z; + else if(_Singular == 3) + r = a.w; + + if ( _Order.x == 0 ) + r.x = a.x; + else if(_Order.y == 0) + r.x = a.y; + else if(_Order.z == 0) + r.x = a.z; + else if(_Order.w == 0) + r.x = a.w; + + if(_Order.y == 1) + r.y = a.y; + else if(_Order.z == 1) + r.y = a.z; + else if(_Order.w == 1) + r.y = a.w; + + if(_Order.z == 2) + r.z = a.z; + else if(_Order.w == 2) + r.z = a.w; + + if(_Order.w == 3) + r.w = a.w; + + return r; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ComponentMaskNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ComponentMaskNode.shader.meta new file mode 100644 index 0000000..a019f58 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ComponentMaskNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b78e2b295c265cd439c80d218fb3e88e +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ComputeScreenPos.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ComputeScreenPos.shader new file mode 100644 index 0000000..175ae3b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ComputeScreenPos.shader @@ -0,0 +1,47 @@ +Shader "Hidden/ComputeScreenPos" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag( v2f_img i ) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 screenPos = ComputeScreenPos(a); + return screenPos; + } + ENDCG + } + + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag (v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + float4 screenPos = ComputeScreenPos(a); + screenPos = screenPos / screenPos.w; + screenPos.z = (UNITY_NEAR_CLIP_VALUE >= 0) ? screenPos.z : screenPos.z* 0.5 + 0.5; + return screenPos; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ComputeScreenPos.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ComputeScreenPos.shader.meta new file mode 100644 index 0000000..983e7e4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ComputeScreenPos.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 97bd4895d847d764eb21d2bf7aa13671 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ConditionalIfNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ConditionalIfNode.shader new file mode 100644 index 0000000..1121f0d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ConditionalIfNode.shader @@ -0,0 +1,47 @@ +Shader "Hidden/Preview_ConditionalIfNode" +{ + Properties + { + _A ( "_A", 2D) = "white" {} + _B ( "_B", 2D ) = "white" {} + _C ( "_AGreaterThanB", 2D ) = "white" {} + _D ( "_AEqualToB", 2D ) = "white" {} + _E ( "_ALessThanB", 2D ) = "white" {} + } + + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + uniform sampler2D _A; + uniform sampler2D _B; + uniform sampler2D _C; + uniform sampler2D _D; + uniform sampler2D _E; + + float4 frag ( v2f_img i ) : SV_Target + { + float aVal = tex2D ( _A, i.uv ).r; + float bVal = tex2D ( _B, i.uv ).r; + float4 aGreaterbVal = tex2D ( _C, i.uv ); + float4 aEqualbVal = tex2D ( _D, i.uv ); + float4 aLessbVal = tex2D ( _E, i.uv ); + + if ( aVal > bVal ) + return aGreaterbVal; + + if ( aVal == bVal ) + return aEqualbVal; + + return aLessbVal; + + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ConditionalIfNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ConditionalIfNode.shader.meta new file mode 100644 index 0000000..2a79ade --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ConditionalIfNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f6fb4d46bddf29e45a8a3ddfed75d0c0 +timeCreated: 1515424552 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CosOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CosOpNode.shader new file mode 100644 index 0000000..7db0240 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CosOpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/CosOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return cos(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CosOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CosOpNode.shader.meta new file mode 100644 index 0000000..85cde2f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CosOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 3dde9e80389196f459eb94137268de4a +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CosTime.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CosTime.shader new file mode 100644 index 0000000..8e591b6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CosTime.shader @@ -0,0 +1,25 @@ +Shader "Hidden/CosTime" +{ + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float _EditorTime; + + float4 frag( v2f_img i ) : SV_Target + { + float4 t = _EditorTime; + t.x = _EditorTime / 8; + t.y = _EditorTime / 4; + t.z = _EditorTime / 2; + return cos(t); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CosTime.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CosTime.shader.meta new file mode 100644 index 0000000..4a17551 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CosTime.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 3093999b42c3c0940a71799511d7781c +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CoshOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CoshOpNode.shader new file mode 100644 index 0000000..8bdcf40 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CoshOpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/CoshOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return cosh(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CoshOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CoshOpNode.shader.meta new file mode 100644 index 0000000..cb2b2fe --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CoshOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 154a4c85fe88657489a54a02416402c0 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CrossProductOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CrossProductOpNode.shader new file mode 100644 index 0000000..6b50b14 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CrossProductOpNode.shader @@ -0,0 +1,29 @@ +Shader "Hidden/CrossProductOpNode" +{ + Properties + { + _A ("_Lhs", 2D) = "white" {} + _B ("_Rhs", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 b = tex2D( _B, i.uv ); + return float4(cross(a.rgb, b.rgb),0); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CrossProductOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CrossProductOpNode.shader.meta new file mode 100644 index 0000000..8a06c64 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_CrossProductOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 65a9be5cc7037654db8e148d669f03ee +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DdxOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DdxOpNode.shader new file mode 100644 index 0000000..d6fd37b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DdxOpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/DdxOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return ddx(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DdxOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DdxOpNode.shader.meta new file mode 100644 index 0000000..80e1431 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DdxOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b54ea73d5568b3540977557813eb9c3c +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DdyOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DdyOpNode.shader new file mode 100644 index 0000000..cfffd11 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DdyOpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/DdyOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return ddy(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DdyOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DdyOpNode.shader.meta new file mode 100644 index 0000000..ec2c4ef --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DdyOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 197dcc7f05339da47b6b0e681c475c5e +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeDepthNormalNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeDepthNormalNode.shader new file mode 100644 index 0000000..41ee539 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeDepthNormalNode.shader @@ -0,0 +1,30 @@ +Shader "Hidden/DecodeDepthNormalNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + + float4 frag( v2f_img i ) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float depthValue = 0; + float3 normalValue = 0; + DecodeDepthNormal( a , depthValue, normalValue ); + return float4( depthValue,normalValue ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeDepthNormalNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeDepthNormalNode.shader.meta new file mode 100644 index 0000000..6f6d8ac --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeDepthNormalNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: dbf37c4d3ce0f0b41822584d6c9ba203 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeFloatRGBAHlpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeFloatRGBAHlpNode.shader new file mode 100644 index 0000000..e749466 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeFloatRGBAHlpNode.shader @@ -0,0 +1,27 @@ +Shader "Hidden/DecodeFloatRGBAHlpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + + float4 frag( v2f_img i ) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + return DecodeFloatRGBA( a ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeFloatRGBAHlpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeFloatRGBAHlpNode.shader.meta new file mode 100644 index 0000000..a1237f6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeFloatRGBAHlpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f71b31b15ff3f2042bafbed40acd29f4 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeFloatRGHlpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeFloatRGHlpNode.shader new file mode 100644 index 0000000..e60788c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeFloatRGHlpNode.shader @@ -0,0 +1,27 @@ +Shader "Hidden/DecodeFloatRGHlpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + + float4 frag( v2f_img i ) : SV_Target + { + float2 a = tex2D( _A, i.uv ).rg; + return DecodeFloatRG( a ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeFloatRGHlpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeFloatRGHlpNode.shader.meta new file mode 100644 index 0000000..c6e62f2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeFloatRGHlpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 1fb3121b1c8febb4dbcc2a507a2df2db +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeLightmapHlpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeLightmapHlpNode.shader new file mode 100644 index 0000000..b0629e6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeLightmapHlpNode.shader @@ -0,0 +1,26 @@ +Shader "Hidden/DecodeLighmapHlpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag( v2f_img i ) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + return float4(DecodeLightmap ( a ),0); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeLightmapHlpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeLightmapHlpNode.shader.meta new file mode 100644 index 0000000..e0806a2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeLightmapHlpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c2d3bee1aee183343b31b9208cb402e9 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeViewNormalStereoHlpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeViewNormalStereoHlpNode.shader new file mode 100644 index 0000000..cf7c62f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeViewNormalStereoHlpNode.shader @@ -0,0 +1,27 @@ +Shader "Hidden/DecodeViewNormalStereoHlpNode" +{ + Properties + { + _A ( "_A", 2D ) = "white" {} + } + + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag ( v2f_img i ) : SV_Target + { + float4 a = tex2D ( _A, i.uv ); + return float4( DecodeViewNormalStereo ( a ),0 ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeViewNormalStereoHlpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeViewNormalStereoHlpNode.shader.meta new file mode 100644 index 0000000..409d139 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DecodeViewNormalStereoHlpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e996db1cc4510c84185cb9f933f916bb +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DegreesOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DegreesOpNode.shader new file mode 100644 index 0000000..9e91f8c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DegreesOpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/DegreesOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return degrees(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DegreesOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DegreesOpNode.shader.meta new file mode 100644 index 0000000..67fd1f3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DegreesOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2a8eebb5566830c4a9d7c4b9021bb743 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DeltaTime.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DeltaTime.shader new file mode 100644 index 0000000..092d1f9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DeltaTime.shader @@ -0,0 +1,26 @@ +Shader "Hidden/DeltaTime" +{ + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float _EditorDeltaTime; + + float4 frag( v2f_img i ) : SV_Target + { + float4 t = _EditorDeltaTime; + t.y = 1 / _EditorDeltaTime; + t.z = _EditorDeltaTime; + t.w = 1 / _EditorDeltaTime; + return cos(t); + } + ENDCG + } + + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DeltaTime.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DeltaTime.shader.meta new file mode 100644 index 0000000..c39cf8d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DeltaTime.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 9d69a693042c443498f96d6da60535eb +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DesaturateNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DesaturateNode.shader new file mode 100644 index 0000000..1bc967f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DesaturateNode.shader @@ -0,0 +1,34 @@ +Shader "Hidden/DesaturateNode" +{ + Properties + { + _A ( "_RBG", 2D ) = "white" {} + _B ( "_Fraction", 2D ) = "white" {} + } + + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + uniform sampler2D _A; + uniform sampler2D _B; + + float4 frag ( v2f_img i ) : SV_Target + { + float3 rgb = tex2D ( _A, i.uv ).rgb; + float fraction = tex2D ( _B, i.uv ).r; + + float dotResult = dot ( rgb, float3( 0.299, 0.587, 0.114 ) ); + float3 finalColor = lerp ( rgb, dotResult.xxx, fraction ); + + return float4( finalColor, 1 ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DesaturateNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DesaturateNode.shader.meta new file mode 100644 index 0000000..97fe8c0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DesaturateNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: faabe9efdf44b9648a523f1742abdfd3 +timeCreated: 1515421907 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DiffuseAndSpecularFromMetallic.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DiffuseAndSpecularFromMetallic.shader new file mode 100644 index 0000000..9d2f407 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DiffuseAndSpecularFromMetallic.shader @@ -0,0 +1,32 @@ +Shader "Hidden/DiffuseAndSpecularFromMetallicNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #include "UnityStandardUtils.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag( v2f_img i ) : SV_Target + { + float4 albedo = tex2D( _A, i.uv ); + float metallic = tex2D( _A, i.uv ).r; + float3 specColor = 0; + float oneMinusReflectivity; + float3 albedoFinal = DiffuseAndSpecularFromMetallic(albedo,metallic,specColor,oneMinusReflectivity); + return float4( albedoFinal , 1 ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DiffuseAndSpecularFromMetallic.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DiffuseAndSpecularFromMetallic.shader.meta new file mode 100644 index 0000000..46286ed --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DiffuseAndSpecularFromMetallic.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c7c4485750948a045b5dab0985896e17 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DistanceOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DistanceOpNode.shader new file mode 100644 index 0000000..0ba2dfd --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DistanceOpNode.shader @@ -0,0 +1,29 @@ +Shader "Hidden/DistanceOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 b = tex2D( _B, i.uv ); + return distance( a, b ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DistanceOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DistanceOpNode.shader.meta new file mode 100644 index 0000000..6ca677b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DistanceOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 3be9a95031c0cb740ae982e465dfc242 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DotProductOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DotProductOpNode.shader new file mode 100644 index 0000000..a467eed --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DotProductOpNode.shader @@ -0,0 +1,27 @@ +Shader "Hidden/DotProductOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + + float4 frag(v2f_img i) : SV_Target + { + return dot(tex2D(_A, i.uv).rgb, tex2D(_B, i.uv).rgb); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DotProductOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DotProductOpNode.shader.meta new file mode 100644 index 0000000..d506912 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DotProductOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 85f11fd5cb9bb954c8615a45c57a3784 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DynamicAppendNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DynamicAppendNode.shader new file mode 100644 index 0000000..d7e7b16 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DynamicAppendNode.shader @@ -0,0 +1,135 @@ +Shader "Hidden/DynamicAppendNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + _C ("_C", 2D) = "white" {} + _D ("_D", 2D) = "white" {} + _Mask("_Mask", Vector) = (0,0,0,0) + } + SubShader + { + CGINCLUDE + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + + float4 _Mask; + ENDCG + + Pass //0 + { + Name "1111" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + float4 b = tex2D(_B, i.uv); + float4 c = tex2D(_C, i.uv); + float4 d = tex2D(_D, i.uv); + return float4(a.x,b.x,c.x,d.x)*_Mask; + } + ENDCG + } + + Pass //1 + { + Name "1120" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + float4 b = tex2D(_B, i.uv); + float4 c = tex2D(_C, i.uv); + + return float4(a.x,b.x,c.xy)*_Mask; + } + ENDCG + } + + Pass //2 + { + Name "1201" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + float4 b = tex2D(_B, i.uv); + float4 d = tex2D(_D, i.uv); + return float4(a.x,b.xy,d.x)*_Mask; + } + ENDCG + } + + Pass //3 + { + Name "1300" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + float4 b = tex2D(_B, i.uv); + return float4(a.x,b.xyz)*_Mask; + } + ENDCG + } + + Pass //4 + { + Name "2011" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + float4 c = tex2D(_C, i.uv); + float4 d = tex2D(_D, i.uv); + return float4(a.xy,c.x,d.x)*_Mask; + } + ENDCG + } + + Pass //5 + { + Name "2020" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + float4 c = tex2D(_C, i.uv); + return float4(a.xy,c.xy)*_Mask; + } + ENDCG + } + + Pass //6 + { + Name "3001" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + float4 d = tex2D(_D, i.uv); + return float4(a.xyz,d.x)*_Mask; + } + ENDCG + } + + Pass //7 + { + Name "4000" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return a*_Mask; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DynamicAppendNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DynamicAppendNode.shader.meta new file mode 100644 index 0000000..ebe42e4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_DynamicAppendNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: bfcd2919fe75bbf428fbbe583f463a9e +timeCreated: 1510580676 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_EncodeFloatRGBAHlpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_EncodeFloatRGBAHlpNode.shader new file mode 100644 index 0000000..80e3070 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_EncodeFloatRGBAHlpNode.shader @@ -0,0 +1,27 @@ +Shader "Hidden/EncodeFloatRGBAHlpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + + float4 frag( v2f_img i ) : SV_Target + { + float a = tex2D( _A, i.uv ).r; + return EncodeFloatRGBA( a ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_EncodeFloatRGBAHlpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_EncodeFloatRGBAHlpNode.shader.meta new file mode 100644 index 0000000..416d650 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_EncodeFloatRGBAHlpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c21569bf5b9371b4ca13c0c00abd5562 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_EncodeFloatRGHlpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_EncodeFloatRGHlpNode.shader new file mode 100644 index 0000000..f3b8ff1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_EncodeFloatRGHlpNode.shader @@ -0,0 +1,27 @@ +Shader "Hidden/EncodeFloatRGNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + + float4 frag( v2f_img i ) : SV_Target + { + float a = tex2D( _A, i.uv ).r; + return float4( EncodeFloatRG( a ), 0,0); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_EncodeFloatRGHlpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_EncodeFloatRGHlpNode.shader.meta new file mode 100644 index 0000000..8b064eb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_EncodeFloatRGHlpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a44b520baa5c39e41bc69a22ea46f24d +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_EncodeViewNormalStereoHlpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_EncodeViewNormalStereoHlpNode.shader new file mode 100644 index 0000000..d23d09f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_EncodeViewNormalStereoHlpNode.shader @@ -0,0 +1,27 @@ +Shader "Hidden/EncodeViewNormalStereoHlpNode" +{ + Properties + { + _A ( "_A", 2D ) = "white" {} + } + + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag ( v2f_img i ) : SV_Target + { + float3 a = tex2D ( _A, i.uv ).rgb; + return float4( EncodeViewNormalStereo( a ),0,0); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_EncodeViewNormalStereoHlpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_EncodeViewNormalStereoHlpNode.shader.meta new file mode 100644 index 0000000..1db2cbf --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_EncodeViewNormalStereoHlpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 3d0b3d482b7246c4cb60fa73e6ceac6c +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Exp2OpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Exp2OpNode.shader new file mode 100644 index 0000000..36ab711 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Exp2OpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/Exp2OpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return exp2(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Exp2OpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Exp2OpNode.shader.meta new file mode 100644 index 0000000..b5c6d56 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Exp2OpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ceb70ed5423a36647a504a41de7dbfe6 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ExpOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ExpOpNode.shader new file mode 100644 index 0000000..83afb73 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ExpOpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/ExpOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return exp(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ExpOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ExpOpNode.shader.meta new file mode 100644 index 0000000..53b5e1e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ExpOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6416ff506137d97479a7ebde790b45e5 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FWidthOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FWidthOpNode.shader new file mode 100644 index 0000000..d711647 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FWidthOpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/FWidthOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return fwidth(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FWidthOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FWidthOpNode.shader.meta new file mode 100644 index 0000000..c251ea4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FWidthOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 81ea481faaef9c8459a555479ba64df7 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FaceVariableNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FaceVariableNode.shader new file mode 100644 index 0000000..9cb4428 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FaceVariableNode.shader @@ -0,0 +1,19 @@ +Shader "Hidden/FaceVariableNode" +{ + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + float4 frag( v2f_img i, half ase_vface : VFACE ) : SV_Target + { + return ase_vface; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FaceVariableNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FaceVariableNode.shader.meta new file mode 100644 index 0000000..9239bc9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FaceVariableNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4b0b5b9f16353b840a5f5ad2baab3c3c +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FloorOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FloorOpNode.shader new file mode 100644 index 0000000..ad11b59 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FloorOpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/FloorOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return floor(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FloorOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FloorOpNode.shader.meta new file mode 100644 index 0000000..11687b4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FloorOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 46ae4a72a9a38de40a2d8f20cfccc67d +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FmodOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FmodOpNode.shader new file mode 100644 index 0000000..2149b14 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FmodOpNode.shader @@ -0,0 +1,29 @@ +Shader "Hidden/FmodOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + + float4 frag( v2f_img i ) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 b = tex2D( _B, i.uv ); + return fmod(a, b); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FmodOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FmodOpNode.shader.meta new file mode 100644 index 0000000..8bbfee6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FmodOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 65083930f9d7812479fd6ff203ad2992 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FogAndAmbientColors.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FogAndAmbientColors.shader new file mode 100644 index 0000000..b2b5b93 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FogAndAmbientColors.shader @@ -0,0 +1,75 @@ +Shader "Hidden/FogAndAmbientColors" +{ + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float4 frag( v2f_img i ) : SV_Target + { + return UNITY_LIGHTMODEL_AMBIENT; + } + ENDCG + } + + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float4 frag (v2f_img i) : SV_Target + { + return unity_AmbientSky; + } + ENDCG + } + + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float4 frag (v2f_img i) : SV_Target + { + return unity_AmbientEquator; + } + ENDCG + } + + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float4 frag (v2f_img i) : SV_Target + { + return unity_AmbientGround; + } + ENDCG + } + + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float4 frag (v2f_img i) : SV_Target + { + return unity_FogColor; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FogAndAmbientColors.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FogAndAmbientColors.shader.meta new file mode 100644 index 0000000..40a27fe --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FogAndAmbientColors.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 937c7bde062f0f942b600d9950d2ebb2 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FogParams.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FogParams.shader new file mode 100644 index 0000000..c2914ce --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FogParams.shader @@ -0,0 +1,19 @@ +Shader "Hidden/FogParams" +{ + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float4 frag( v2f_img i ) : SV_Target + { + return unity_FogParams; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FogParams.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FogParams.shader.meta new file mode 100644 index 0000000..bef9688 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FogParams.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 42abde3281b1848438c3b53443c91a1e +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FractNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FractNode.shader new file mode 100644 index 0000000..d85eaf6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FractNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/FractNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return frac(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FractNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FractNode.shader.meta new file mode 100644 index 0000000..4de2cee --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FractNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 53a335f8f18d4694b8d94e8aee21fdca +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FresnelNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FresnelNode.shader new file mode 100644 index 0000000..256a4d6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FresnelNode.shader @@ -0,0 +1,358 @@ +Shader "Hidden/FresnelNode" +{ + Properties + { + _A ("_Normal", 2D) = "white" {} + _B ("_Bias", 2D) = "white" {} + _C ("_Scale", 2D) = "white" {} + _D ("_Power", 2D) = "white" {} + _E ("_View", 2D) = "white" {} + } + SubShader + { + Pass //not connected world + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + //sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + int _FresnelType; + + float4 frag(v2f_img i) : SV_Target + { + float b = tex2D( _B, i.uv ).r; + float s = tex2D( _C, i.uv ).r; + float pw = tex2D( _D, i.uv ).r; + + float2 xy = 2 * i.uv - 1; + float z = -sqrt(1-saturate(dot(xy,xy))); + float3 vertexPos = float3(xy, z); + float3 worldNormal = normalize(float3(xy, z)); + float3 worldViewDir = normalize(float3(0,0,-5) - vertexPos); + + float fresnel = 0; + if(_FresnelType == 0) + fresnel = (b + s*pow(1 - dot( worldNormal, worldViewDir ) , pw)); + else if(_FresnelType == 1) + fresnel = (b + (1-b) * pow(1 - dot( worldNormal, worldViewDir ) , 5)); + else if(_FresnelType == 2) + { + float f0 = pow((1-s)/(1+s),2); + fresnel = (f0 + (1-f0) * pow(1 - dot( worldNormal, worldViewDir ) , 5)); + } + return fresnel; + } + ENDCG + } + + Pass //connected world + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + int _FresnelType; + + float4 frag(v2f_img i) : SV_Target + { + float b = tex2D( _B, i.uv ).r; + float s = tex2D( _C, i.uv ).r; + float pw = tex2D( _D, i.uv ).r; + + float2 xy = 2 * i.uv - 1; + float z = -sqrt(1-saturate(dot(xy,xy))); + float3 vertexPos = float3(xy, z); + float3 worldNormal = tex2D( _A, i.uv ); + float3 worldViewDir = normalize(float3(0,0,-5) - vertexPos); + + float fresnel = 0; + if(_FresnelType == 0) + fresnel = (b + s*pow(1 - dot( worldNormal, worldViewDir ) , pw)); + else if(_FresnelType == 1) + fresnel = (b + (1-b) * pow(1 - dot( worldNormal, worldViewDir ) , 5)); + else if(_FresnelType == 2) + { + float f0 = pow((1-s)/(1+s),2); + fresnel = (f0 + (1-f0) * pow(1 - dot( worldNormal, worldViewDir ) , 5)); + } + return fresnel; + } + ENDCG + } + + Pass //connected tangent + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + int _FresnelType; + + float4 frag(v2f_img i) : SV_Target + { + float b = tex2D( _B, i.uv ).r; + float s = tex2D( _C, i.uv ).r; + float pw = tex2D( _D, i.uv ).r; + + float2 xy = 2 * i.uv - 1; + float z = -sqrt(1-saturate(dot(xy,xy))); + float3 vertexPos = float3(xy, z); + float3 worldNormal = normalize(float3(xy, z)); + + float3 tangent = normalize(float3( -z, xy.y*0.01, xy.x )); + float3 worldPos = mul(unity_ObjectToWorld, float4(vertexPos,1)).xyz; + float3 worldTangent = UnityObjectToWorldDir(tangent); + float tangentSign = -1; + float3 worldBinormal = normalize( cross(worldNormal, worldTangent) * tangentSign); + float4 tSpace0 = float4(worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x); + float4 tSpace1 = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y); + float4 tSpace2 = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z); + + float2 sphereUVs = i.uv; + + sphereUVs.x = (atan2(vertexPos.x, -vertexPos.z) / (UNITY_PI) + 0.5); + float3 tangentNormal = tex2D(_A, sphereUVs).xyz; + + worldNormal = fixed3( dot( tSpace0.xyz, tangentNormal ), dot( tSpace1.xyz, tangentNormal ), dot( tSpace2.xyz, tangentNormal ) ); + + float3 worldViewDir = normalize(float3(0,0,-5) - vertexPos); + + float fresnel = 0; + if(_FresnelType == 0) + fresnel = (b + s*pow(1 - dot( worldNormal, worldViewDir ) , pw)); + else if(_FresnelType == 1) + fresnel = (b + (1-b) * pow(1 - dot( worldNormal, worldViewDir ) , 5)); + else if(_FresnelType == 2) + { + float f0 = pow((1-s)/(1+s),2); + fresnel = (f0 + (1-f0) * pow(1 - dot( worldNormal, worldViewDir ) , 5)); + } + return fresnel; + } + ENDCG + } + + Pass //not connected half vector + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + //sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + int _FresnelType; + float4 _EditorWorldLightPos; + float4 frag(v2f_img i) : SV_Target + { + float b = tex2D( _B, i.uv ).r; + float s = tex2D( _C, i.uv ).r; + float pw = tex2D( _D, i.uv ).r; + + float2 xy = 2 * i.uv - 1; + float z = -sqrt(1-(dot(xy,xy))); + float3 vertexPos = normalize(float3(xy, z)); + float3 worldViewDir = normalize(float3(0,0,-5) - vertexPos); + float3 lightDir = normalize( _EditorWorldLightPos.xyz ); + float3 halfVector = normalize(worldViewDir+lightDir); + + float fresnel = 0; + if(_FresnelType == 0) + fresnel = (b + s*pow(1 - dot( halfVector, worldViewDir ) , pw)); + else if(_FresnelType == 1) + fresnel = (b + (1-b) * pow(1 - dot( halfVector, worldViewDir ) , 5)); + else if(_FresnelType == 2) + { + float f0 = pow((1-s)/(1+s),2); + fresnel = (f0 + (1-f0) * pow(1 - dot( halfVector, worldViewDir ) , 5)); + } + return fresnel; + } + ENDCG + } + + Pass //connected both + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + sampler2D _E; + int _FresnelType; + + float4 frag(v2f_img i) : SV_Target + { + float b = tex2D( _B, i.uv ).r; + float s = tex2D( _C, i.uv ).r; + float pw = tex2D( _D, i.uv ).r; + + float2 xy = 2 * i.uv - 1; + float z = -sqrt(1-saturate(dot(xy,xy))); + float3 vertexPos = float3(xy, z); + float3 worldNormal = tex2D( _A, i.uv ); + float3 worldViewDir = tex2D( _E, i.uv );; + + float fresnel = 0; + if(_FresnelType == 0) + fresnel = (b + s*pow(1 - dot( worldNormal, worldViewDir ) , pw)); + else if(_FresnelType == 1) + fresnel = (b + (1-b) * pow(1 - dot( worldNormal, worldViewDir ) , 5)); + else if(_FresnelType == 2) + { + float f0 = pow((1-s)/(1+s),2); + fresnel = (f0 + (1-f0) * pow(1 - dot( worldNormal, worldViewDir ) , 5)); + } + return fresnel; + } + ENDCG + } + + Pass //not connected world and light + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + //sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + int _FresnelType; + float4 _EditorWorldLightPos; + + float4 frag(v2f_img i) : SV_Target + { + float b = tex2D( _B, i.uv ).r; + float s = tex2D( _C, i.uv ).r; + float pw = tex2D( _D, i.uv ).r; + + float2 xy = 2 * i.uv - 1; + float z = -sqrt(1-(dot(xy,xy))); + float3 vertexPos = normalize(float3(xy, z)); + float3 normal = normalize(vertexPos); + float3 worldNormal = UnityObjectToWorldNormal(normal); + float3 lightDir = normalize( _EditorWorldLightPos.xyz ); + + float fresnel = 0; + if(_FresnelType == 0) + fresnel = (b + s*pow(1 - dot( worldNormal, lightDir ) , pw)); + else if(_FresnelType == 1) + fresnel = (b + (1-b) * pow(1 - dot( worldNormal, lightDir ) , 5)); + else if(_FresnelType == 2) + { + float f0 = pow((1-s)/(1+s),2); + fresnel = (f0 + (1-f0) * pow(1 - dot( worldNormal, lightDir ) , 5)); + } + return fresnel; + } + ENDCG + } + + Pass //connected view + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + sampler2D _E; + int _FresnelType; + + float4 frag(v2f_img i) : SV_Target + { + float b = tex2D( _B, i.uv ).r; + float s = tex2D( _C, i.uv ).r; + float pw = tex2D( _D, i.uv ).r; + + float2 xy = 2 * i.uv - 1; + float z = -sqrt(1-saturate(dot(xy,xy))); + float3 vertexPos = float3(xy, z); + float3 normal = normalize(vertexPos); + float3 worldNormal = UnityObjectToWorldNormal(normal); + float3 worldViewDir = tex2D( _E, i.uv ); + + float fresnel = 0; + if(_FresnelType == 0) + fresnel = (b + s*pow(1 - dot( worldNormal, worldViewDir ) , pw)); + else if(_FresnelType == 1) + fresnel = (b + (1-b) * pow(1 - dot( worldNormal, worldViewDir ) , 5)); + else if(_FresnelType == 2) + { + float f0 = pow((1-s)/(1+s),2); + fresnel = (f0 + (1-f0) * pow(1 - dot( worldNormal, worldViewDir ) , 5)); + } + return fresnel; + } + ENDCG + } + + Pass //not connected half vector with connected view + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + //sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + sampler2D _E; + int _FresnelType; + float4 _EditorWorldLightPos; + float4 frag(v2f_img i) : SV_Target + { + float b = tex2D( _B, i.uv ).r; + float s = tex2D( _C, i.uv ).r; + float pw = tex2D( _D, i.uv ).r; + + float2 xy = 2 * i.uv - 1; + float z = -sqrt(1-(dot(xy,xy))); + float3 vertexPos = normalize(float3(xy, z)); + float3 worldViewDir = tex2D( _E, i.uv ); + float3 lightDir = normalize( _EditorWorldLightPos.xyz ); + float3 halfVector = normalize(worldViewDir+lightDir); + + float fresnel = 0; + if(_FresnelType == 0) + fresnel = (b + s*pow(1 - dot( halfVector, worldViewDir ) , pw)); + else if(_FresnelType == 1) + fresnel = (b + (1-b) * pow(1 - dot( halfVector, worldViewDir ) , 5)); + else if(_FresnelType == 2) + { + float f0 = pow((1-s)/(1+s),2); + fresnel = (f0 + (1-f0) * pow(1 - dot( halfVector, worldViewDir ) , 5)); + } + return fresnel; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FresnelNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FresnelNode.shader.meta new file mode 100644 index 0000000..c98c0fe --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FresnelNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 240145eb70cf79f428015012559f4e7d +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FunctionInputNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FunctionInputNode.shader new file mode 100644 index 0000000..898706a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FunctionInputNode.shader @@ -0,0 +1,39 @@ +Shader "Hidden/FunctionInputNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + int _Type; + + float4 frag(v2f_img i) : SV_Target + { + if( _Type == 1 ) + { + return tex2D( _A, i.uv ).r; + } else if( _Type == 2 ) + { + return float4(tex2D( _A, i.uv ).rg,0,0); + } else if( _Type == 3 ) + { + return float4(tex2D( _A, i.uv ).rgb,0); + } + else + { + return tex2D( _A, i.uv ); + } + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FunctionInputNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FunctionInputNode.shader.meta new file mode 100644 index 0000000..e2cf164 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FunctionInputNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 04bc8e7b317dccb4d8da601680dd8140 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FunctionNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FunctionNode.shader new file mode 100644 index 0000000..e8b7c4a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FunctionNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/FunctionNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return tex2D( _A, i.uv ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FunctionNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FunctionNode.shader.meta new file mode 100644 index 0000000..7209bcd --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FunctionNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: aca70c900c50c004e8ef0b47c4fac4d4 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FunctionOutputNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FunctionOutputNode.shader new file mode 100644 index 0000000..5fa7d2d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FunctionOutputNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/FunctionOutputNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return tex2D( _A, i.uv ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FunctionOutputNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FunctionOutputNode.shader.meta new file mode 100644 index 0000000..689efb6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_FunctionOutputNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e6d5f64114b18e24f99dc65290c0fe98 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_GammaToLinearNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_GammaToLinearNode.shader new file mode 100644 index 0000000..585f403 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_GammaToLinearNode.shader @@ -0,0 +1,27 @@ +Shader "Hidden/GammaToLinearNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + float4 c = tex2D( _A, i.uv ); + c.rgb = GammaToLinearSpace( c.rgb ); + return c; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_GammaToLinearNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_GammaToLinearNode.shader.meta new file mode 100644 index 0000000..9ebe8de --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_GammaToLinearNode.shader.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e82a888a6ebdb1443823aafceaa051b9 +timeCreated: 1489078120 +licenseType: Store +ShaderImporter: + defaultTextures: + - _MainTex: {instanceID: 0} + - _BackGround: {fileID: 2800000, guid: 750b1bd7ba8bd28489650de6d0a95cc5, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_GetLocalVarNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_GetLocalVarNode.shader new file mode 100644 index 0000000..f9398ac --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_GetLocalVarNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/GetLocalVarNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return tex2D( _A, i.uv ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_GetLocalVarNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_GetLocalVarNode.shader.meta new file mode 100644 index 0000000..513bcad --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_GetLocalVarNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f21a6e44c7d7b8543afacd19751d24c6 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_GradientSample.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_GradientSample.shader new file mode 100644 index 0000000..28aebf5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_GradientSample.shader @@ -0,0 +1,123 @@ +Shader "Hidden/GradientSample" +{ + Properties + { + _GTime( "_Time", 2D ) = "white" {} + _GType( "_GType", Int ) = 0 + _GColorNum( "_GColorNum", Int ) = 0 + _GAlphaNum( "_GAlphaNum", Int ) = 0 + _Col0( "_Col0", Vector ) = ( 0, 0, 0, 0 ) + _Col1( "_Col1", Vector ) = ( 0, 0, 0, 0 ) + _Col2( "_Col2", Vector ) = ( 0, 0, 0, 0 ) + _Col3( "_Col3", Vector ) = ( 0, 0, 0, 0 ) + _Col4( "_Col4", Vector ) = ( 0, 0, 0, 0 ) + _Col5( "_Col5", Vector ) = ( 0, 0, 0, 0 ) + _Col6( "_Col6", Vector ) = ( 0, 0, 0, 0 ) + _Col7( "_Col7", Vector ) = ( 0, 0, 0, 0 ) + _Alp0( "_Alp0", Vector ) = ( 0, 0, 0, 0 ) + _Alp1( "_Alp1", Vector ) = ( 0, 0, 0, 0 ) + _Alp2( "_Alp2", Vector ) = ( 0, 0, 0, 0 ) + _Alp3( "_Alp3", Vector ) = ( 0, 0, 0, 0 ) + _Alp4( "_Alp4", Vector ) = ( 0, 0, 0, 0 ) + _Alp5( "_Alp5", Vector ) = ( 0, 0, 0, 0 ) + _Alp6( "_Alp6", Vector ) = ( 0, 0, 0, 0 ) + _Alp7( "_Alp7", Vector ) = ( 0, 0, 0, 0 ) + } + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + sampler2D _GTime; + int _GType; + int _GColorNum; + int _GAlphaNum; + float4 _Col0; + float4 _Col1; + float4 _Col2; + float4 _Col3; + float4 _Col4; + float4 _Col5; + float4 _Col6; + float4 _Col7; + float4 _Alp0; + float4 _Alp1; + float4 _Alp2; + float4 _Alp3; + float4 _Alp4; + float4 _Alp5; + float4 _Alp6; + float4 _Alp7; + + struct Gradient + { + int type; + int colorsLength; + int alphasLength; + float4 colors[ 8 ]; + float2 alphas[ 8 ]; + }; + + Gradient NewGradient( int type, int colorsLength, int alphasLength, + float4 colors0, float4 colors1, float4 colors2, float4 colors3, float4 colors4, float4 colors5, float4 colors6, float4 colors7, + float2 alphas0, float2 alphas1, float2 alphas2, float2 alphas3, float2 alphas4, float2 alphas5, float2 alphas6, float2 alphas7 ) + { + Gradient g; + g.type = type; + g.colorsLength = colorsLength; + g.alphasLength = alphasLength; + g.colors[ 0 ] = colors0; + g.colors[ 1 ] = colors1; + g.colors[ 2 ] = colors2; + g.colors[ 3 ] = colors3; + g.colors[ 4 ] = colors4; + g.colors[ 5 ] = colors5; + g.colors[ 6 ] = colors6; + g.colors[ 7 ] = colors7; + g.alphas[ 0 ] = alphas0; + g.alphas[ 1 ] = alphas1; + g.alphas[ 2 ] = alphas2; + g.alphas[ 3 ] = alphas3; + g.alphas[ 4 ] = alphas4; + g.alphas[ 5 ] = alphas5; + g.alphas[ 6 ] = alphas6; + g.alphas[ 7 ] = alphas7; + return g; + } + + float4 SampleGradient( Gradient gradient, float time ) + { + float3 color = gradient.colors[ 0 ].rgb; + UNITY_UNROLL + for( int c = 1; c < 8; c++ ) + { + float colorPos = saturate( ( time - gradient.colors[ c - 1 ].w ) / ( gradient.colors[ c ].w - gradient.colors[ c - 1 ].w ) ) * step( c, (float)gradient.colorsLength - 1 ); + color = lerp( color, gradient.colors[ c ].rgb, lerp( colorPos, step( 0.01, colorPos ), gradient.type ) ); + } + #ifndef UNITY_COLORSPACE_GAMMA + color = GammaToLinearSpace( color ); + #endif + float alpha = gradient.alphas[ 0 ].x; + UNITY_UNROLL + for( int a = 1; a < 8; a++ ) + { + float alphaPos = saturate( ( time - gradient.alphas[ a - 1 ].y ) / ( gradient.alphas[ a ].y - gradient.alphas[ a - 1 ].y ) ) * step( a, (float)gradient.alphasLength - 1 ); + alpha = lerp( alpha, gradient.alphas[ a ].x, lerp( alphaPos, step( 0.01, alphaPos ), gradient.type ) ); + } + return float4( color, alpha ); + } + + float4 frag( v2f_img i ) : SV_Target + { + Gradient gradient = NewGradient( _GType, _GColorNum, _GAlphaNum, _Col0, _Col1, _Col2, _Col3, _Col4, _Col5, _Col6, _Col7, _Alp0.xy, _Alp1.xy, _Alp2.xy, _Alp3.xy, _Alp4.xy, _Alp5.xy, _Alp6.xy, _Alp7.xy ); + float time = tex2D( _GTime, i.uv ).r; + return SampleGradient( gradient, time ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_GradientSample.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_GradientSample.shader.meta new file mode 100644 index 0000000..5082a60 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_GradientSample.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8a09124cd6e4aa54a996e7487ec16b90 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_GrayscaleNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_GrayscaleNode.shader new file mode 100644 index 0000000..2f60460 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_GrayscaleNode.shader @@ -0,0 +1,62 @@ +Shader "Hidden/GrayscaleNode" +{ + Properties + { + _A ("_RGB", 2D) = "white" {} + } + SubShader + { + Pass //Luminance + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + float lum = Luminance( tex2D( _A, i.uv ) ); + return float4( lum.xxx, 1); + } + ENDCG + } + + Pass //Natural Classic + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag ( v2f_img i ) : SV_Target + { + float lum = dot ( tex2D ( _A, i.uv ), float3( 0.299,0.587,0.114 ) ); + return float4( lum.xxx, 1 ); + } + ENDCG + } + + Pass //Old School + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag ( v2f_img i ) : SV_Target + { + float3 rgbValue = tex2D ( _A, i.uv ).rgb; + float lum = ( rgbValue.r + rgbValue.g + rgbValue.b ) / 3; + return float4( lum.xxx, 1 ); + } + ENDCG + } + + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_GrayscaleNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_GrayscaleNode.shader.meta new file mode 100644 index 0000000..329b709 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_GrayscaleNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 56781cd022be9124597f0f396a46a35f +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_HSVToRGBNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_HSVToRGBNode.shader new file mode 100644 index 0000000..3bb972a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_HSVToRGBNode.shader @@ -0,0 +1,41 @@ +Shader "Hidden/HSVToRGBNode" +{ + Properties + { + _A ( "_Hue", 2D ) = "white" {} + _B ( "_Saturation", 2D ) = "white" {} + _C ( "_Value", 2D ) = "white" {} + } + + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + uniform sampler2D _A; + uniform sampler2D _B; + uniform sampler2D _C; + + 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 frag ( v2f_img i ) : SV_Target + { + float h = tex2D ( _A, i.uv ).r; + float s = tex2D ( _B, i.uv ).r; + float v = tex2D ( _C, i.uv ).r; + + return float4( HSVToRGB(float3(h,s,v)), 1 ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_HSVToRGBNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_HSVToRGBNode.shader.meta new file mode 100644 index 0000000..952938e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_HSVToRGBNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: fab445eb945d63047822a7a6b81b959d +timeCreated: 1515421907 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_HeightMapTextureBlend.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_HeightMapTextureBlend.shader new file mode 100644 index 0000000..f15f92e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_HeightMapTextureBlend.shader @@ -0,0 +1,33 @@ +Shader "Hidden/HeightMapTextureBlend" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + _C ("_C", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + + float4 frag( v2f_img i ) : SV_Target + { + float heightmap = tex2D( _A, i.uv ).x; + float splatMask = tex2D( _B, i.uv ).x; + float blendStrength = tex2D( _C, i.uv ).x; + float result = saturate( pow((( heightmap*splatMask ) * 4 ) + ( splatMask * 2 ), blendStrength )); + return float4( result.x , 0, 0, 1 ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_HeightMapTextureBlend.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_HeightMapTextureBlend.shader.meta new file mode 100644 index 0000000..35ffff5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_HeightMapTextureBlend.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b2ac23d6d5dcb334982b6f31c2e7a734 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_IndirectDiffuseLight.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_IndirectDiffuseLight.shader new file mode 100644 index 0000000..6569557 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_IndirectDiffuseLight.shader @@ -0,0 +1,106 @@ +Shader "Hidden/IndirectDiffuseLight" +{ + Properties + { + _Intensity ("Intensity", Float) = 1 + } + + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + #include "Lighting.cginc" + #include "UnityPBSLighting.cginc" + + float _Intensity; + + float4 frag(v2f_img i) : SV_Target + { + float2 xy = 2 * i.uv - 1; + float z = -sqrt(1-saturate(dot(xy,xy))); + float3 worldNormal = normalize(float3(xy, z)); + float3 vertexPos = float3(xy, z); + float3 worldPos = mul(unity_ObjectToWorld, float4(vertexPos,1)).xyz; + float4 back = lerp(float4(0.4117,0.3843,0.3647,1),float4(0.4117,0.5059,0.6470,1),worldPos.y * 0.5 + 0.5); + return float4(GammaToLinearSpace(back.rgb * _Intensity),1); + } + ENDCG + } + + Pass // connected tangent + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + #include "Lighting.cginc" + #include "UnityPBSLighting.cginc" + + float _Intensity; + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + float2 xy = 2 * i.uv - 1; + float z = -sqrt(1-saturate(dot(xy,xy))); + float3 vertexPos = float3(xy, z); + float3 normal = normalize(vertexPos); + float3 worldNormal = UnityObjectToWorldNormal(normal); + + float3 tangent = normalize(float3( -z, xy.y*0.01, xy.x )); + float3 worldPos = mul(unity_ObjectToWorld, float4(vertexPos,1)).xyz; + float3 worldTangent = UnityObjectToWorldDir(tangent); + float tangentSign = -1; + float3 worldBinormal = normalize( cross(worldNormal, worldTangent) * tangentSign); + float4 tSpace0 = float4(worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x); + float4 tSpace1 = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y); + float4 tSpace2 = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z); + + float2 sphereUVs = i.uv; + + sphereUVs.x = (atan2(vertexPos.x, -vertexPos.z) / (UNITY_PI) + 0.5); + // Needs further checking + //float3 tangentNormal = tex2Dlod(_A, float4(sphereUVs,0,0)).xyz; + float3 tangentNormal = tex2D(_A, sphereUVs).xyz; + + worldNormal = fixed3( dot( tSpace0.xyz, tangentNormal ), dot( tSpace1.xyz, tangentNormal ), dot( tSpace2.xyz, tangentNormal ) ); + + float4 back = lerp(float4(0.4117,0.3843,0.3647,1),float4(0.4117,0.5059,0.6470,1),worldNormal.y * 0.5 + 0.5); + + return float4(GammaToLinearSpace(back.rgb * _Intensity),1); + } + ENDCG + } + + Pass // connected world + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + #include "Lighting.cginc" + #include "UnityPBSLighting.cginc" + + float _Intensity; + sampler2D _A; + + float4 frag( v2f_img i ) : SV_Target + { + float2 xy = 2 * i.uv - 1; + float z = -sqrt( 1 - saturate( dot( xy,xy ) ) ); + float3 vertexPos = float3( xy, z ); + float3 normal = normalize( vertexPos ); + float3 worldNormal = tex2D( _A, i.uv ); + + float4 back = lerp( float4( 0.4117,0.3843,0.3647,1 ),float4( 0.4117,0.5059,0.6470,1 ),worldNormal.y * 0.5 + 0.5 ); + + return float4( GammaToLinearSpace( back.rgb * _Intensity ),1 ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_IndirectDiffuseLight.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_IndirectDiffuseLight.shader.meta new file mode 100644 index 0000000..59f7461 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_IndirectDiffuseLight.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b45d57fa606c1ea438fe9a2c08426bc7 +timeCreated: 1512043114 +licenseType: Store +ShaderImporter: + defaultTextures: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_IndirectSpecularLight.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_IndirectSpecularLight.shader new file mode 100644 index 0000000..6c48d9e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_IndirectSpecularLight.shader @@ -0,0 +1,128 @@ +Shader "Hidden/IndirectSpecularLight" +{ + Properties + { + _Skybox("_Skybox", CUBE) = "white" {} + _A ("Normal", 2D) = "white" {} + _B ("Smoothness", 2D) = "white" {} + _C ("Occlusion", 2D) = "white" {} + } + + SubShader + { + Pass // not connected + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + #include "Lighting.cginc" + #include "UnityPBSLighting.cginc" + + uniform samplerCUBE _Skybox; + sampler2D _A; + sampler2D _B; + sampler2D _C; + + float4 frag(v2f_img i) : SV_Target + { + float2 xy = 2 * i.uv - 1; + float z = -sqrt(1-saturate(dot(xy,xy))); + float3 worldNormal = normalize(float3(xy, z)); + float3 vertexPos = float3(xy, z); + float3 worldViewDir = normalize(float3(0,0,-5) - vertexPos); + + float3 worldRefl = -worldViewDir; + worldRefl = normalize(reflect( worldRefl, worldNormal )); + + float3 sky = texCUBElod( _Skybox, float4(worldRefl, (1-saturate(tex2D(_B,i.uv).r)) * 6) ).rgb; + + return float4(sky * tex2D(_C,i.uv).r, 1); + } + ENDCG + } + + Pass // connected tangent + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + #include "Lighting.cginc" + #include "UnityPBSLighting.cginc" + + uniform samplerCUBE _Skybox; + sampler2D _A; + sampler2D _B; + sampler2D _C; + + float4 frag(v2f_img i) : SV_Target + { + float2 xy = 2 * i.uv - 1; + float z = -sqrt(1-saturate(dot(xy,xy))); + float3 vertexPos = float3(xy, z); + float3 normal = normalize(vertexPos); + float3 worldNormal = UnityObjectToWorldNormal(normal); + + float3 tangent = normalize(float3( -z, xy.y*0.01, xy.x )); + float3 worldPos = mul(unity_ObjectToWorld, float4(vertexPos,1)).xyz; + float3 worldViewDir = normalize(float3(0,0,-5) - vertexPos); + + float3 worldTangent = UnityObjectToWorldDir(tangent); + float tangentSign = -1; + float3 worldBinormal = normalize( cross(worldNormal, worldTangent) * tangentSign); + float4 tSpace0 = float4(worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x); + float4 tSpace1 = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y); + float4 tSpace2 = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z); + + float3 worldRefl = -worldViewDir; + + float2 sphereUVs = i.uv; + sphereUVs.x = atan2(vertexPos.x, -vertexPos.z) / (UNITY_PI) + 0.5; + + // Needs further checking + //float3 tangentNormal = tex2Dlod(_A, float4(sphereUVs,0,0)).xyz; + float3 tangentNormal = tex2D(_A, sphereUVs).xyz; + + worldRefl = reflect( worldRefl, half3( dot( tSpace0.xyz, tangentNormal ), dot( tSpace1.xyz, tangentNormal ), dot( tSpace2.xyz, tangentNormal ) ) ); + + float3 sky = texCUBElod( _Skybox, float4(worldRefl, (1-saturate(tex2D(_B,i.uv).r)) * 6) ).rgb; + + return float4(sky * tex2D(_C,i.uv).r, 1); + } + ENDCG + } + + Pass // connected world + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + #include "Lighting.cginc" + #include "UnityPBSLighting.cginc" + + uniform samplerCUBE _Skybox; + sampler2D _A; + sampler2D _B; + sampler2D _C; + + float4 frag(v2f_img i) : SV_Target + { + float2 xy = 2 * i.uv - 1; + float z = -sqrt(1-saturate(dot(xy,xy))); + float3 vertexPos = float3(xy, z); + float3 normal = normalize(vertexPos); + float3 worldNormal = tex2D( _A, i.uv ); + float3 worldViewDir = normalize(float3(0,0,-5) - vertexPos); + + float3 worldRefl = reflect( -worldViewDir, worldNormal ); + + float3 sky = texCUBElod( _Skybox, float4(worldRefl, (1-saturate(tex2D(_B,i.uv).r)) * 6) ).rgb; + + return float4(sky * tex2D(_C,i.uv).r, 1); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_IndirectSpecularLight.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_IndirectSpecularLight.shader.meta new file mode 100644 index 0000000..44a99df --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_IndirectSpecularLight.shader.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: d6e441d0a8608954c97fa347d3735e92 +timeCreated: 1512052132 +licenseType: Store +ShaderImporter: + defaultTextures: + - _Skybox: {fileID: 8900000, guid: ef7513b54a0670140b9b967af7620563, type: 3} + - _A: {instanceID: 0} + - _B: {instanceID: 0} + - _C: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_InstanceIDNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_InstanceIDNode.shader new file mode 100644 index 0000000..828da9f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_InstanceIDNode.shader @@ -0,0 +1,24 @@ +Shader "Hidden/InstanceIDNode" +{ + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float4 frag (v2f_img i) : SV_Target + { + uint currInstanceId = 0; + #ifdef UNITY_INSTANCING_ENABLED + currInstanceId = unity_InstanceID; + #endif + + return currInstanceId; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_InstanceIDNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_InstanceIDNode.shader.meta new file mode 100644 index 0000000..acd68c4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_InstanceIDNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 03febce56a8cf354b90e7d5180c1dbd7 +timeCreated: 1542641929 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_IntNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_IntNode.shader new file mode 100644 index 0000000..5e1b367 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_IntNode.shader @@ -0,0 +1,24 @@ +Shader "Hidden/IntNode" +{ + Properties { + _InputInt ("_InputInt", Int) = 0 + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + int _InputInt; + + float4 frag( v2f_img i ) : SV_Target + { + return _InputInt; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_IntNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_IntNode.shader.meta new file mode 100644 index 0000000..6854db4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_IntNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0f64d695b6ffacc469f2dd31432a232a +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LODFadeNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LODFadeNode.shader new file mode 100644 index 0000000..b855246 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LODFadeNode.shader @@ -0,0 +1,19 @@ +Shader "Hidden/LODFadeNode" +{ + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float4 frag( v2f_img i ) : SV_Target + { + return unity_LODFade; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LODFadeNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LODFadeNode.shader.meta new file mode 100644 index 0000000..9fee1f6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LODFadeNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: fcd4d93f57ffc51458d4ade10df2fdb4 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LayeredBlendNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LayeredBlendNode.shader new file mode 100644 index 0000000..bf562c3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LayeredBlendNode.shader @@ -0,0 +1,90 @@ +Shader "Hidden/LayeredBlendNode" +{ + Properties + { + _A ( "_Weights", 2D) = "white" {} + _B ( "_LayerBase", 2D) = "white" {} + _C ( "_Layer1", 2D) = "white" {} + _D ( "_Layer2", 2D ) = "white" {} + _E ( "_Layer3", 2D ) = "white" {} + _F ( "_Layer4", 2D ) = "white" {} + } + SubShader + { + + CGINCLUDE + + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + sampler2D _A; + sampler2D _B; + sampler2D _C; + + ENDCG + + Pass + { + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 Weights = tex2D( _A, i.uv ); + float4 LayerBase = tex2D( _B, i.uv ); + float4 Layer1 = tex2D( _C, i.uv ); + return lerp ( LayerBase, Layer1, Weights.x ); + } + ENDCG + } + + Pass + { + CGPROGRAM + sampler2D _D; + float4 frag ( v2f_img i ) : SV_Target + { + float4 Weights = tex2D ( _A, i.uv ); + float4 LayerBase = tex2D ( _B, i.uv ); + float4 Layer1 = tex2D ( _C, i.uv ); + float4 Layer2 = tex2D ( _D, i.uv ); + return lerp ( lerp ( LayerBase, Layer1, Weights.x ), Layer2, Weights.y ); + } + ENDCG + } + + Pass + { + CGPROGRAM + sampler2D _D; + sampler2D _E; + float4 frag ( v2f_img i ) : SV_Target + { + float4 Weights = tex2D ( _A, i.uv ); + float4 LayerBase = tex2D ( _B, i.uv ); + float4 Layer1 = tex2D ( _C, i.uv ); + float4 Layer2 = tex2D ( _D, i.uv ); + float4 Layer3 = tex2D ( _E, i.uv ); + return lerp ( lerp ( lerp ( LayerBase, Layer1, Weights.x ), Layer2, Weights.y ), Layer3, Weights.z ); + } + ENDCG + } + + Pass + { + CGPROGRAM + sampler2D _D; + sampler2D _E; + sampler2D _F; + float4 frag ( v2f_img i ) : SV_Target + { + float4 Weights = tex2D ( _A, i.uv ); + float4 LayerBase = tex2D ( _B, i.uv ); + float4 Layer1 = tex2D ( _C, i.uv ); + float4 Layer2 = tex2D ( _D, i.uv ); + float4 Layer3 = tex2D ( _E, i.uv ); + float4 Layer4 = tex2D ( _F, i.uv ); + return lerp ( lerp ( lerp ( lerp ( LayerBase, Layer1, Weights.x ), Layer2, Weights.y ), Layer3, Weights.z ), Layer4, Weights.w ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LayeredBlendNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LayeredBlendNode.shader.meta new file mode 100644 index 0000000..81f601e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LayeredBlendNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 48faca2f6506fc44c97adb1e2b79c37d +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LengthOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LengthOpNode.shader new file mode 100644 index 0000000..213607d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LengthOpNode.shader @@ -0,0 +1,73 @@ +Shader "Hidden/LengthOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag (v2f_img i) : SV_Target + { + return length( tex2D (_A, i.uv).x ); + } + ENDCG + } + + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag (v2f_img i) : SV_Target + { + return length( tex2D(_A, i.uv).xy ); + } + ENDCG + } + + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag (v2f_img i) : SV_Target + { + return length( tex2D(_A, i.uv).xyz ); + } + ENDCG + } + + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag (v2f_img i) : SV_Target + { + return length( tex2D(_A, i.uv)); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LengthOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LengthOpNode.shader.meta new file mode 100644 index 0000000..641415a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LengthOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 1c1f6d6512b758942a8b9dd1bea12f34 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LerpOp.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LerpOp.shader new file mode 100644 index 0000000..3b95b83 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LerpOp.shader @@ -0,0 +1,32 @@ +Shader "Hidden/LerpOp" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + _C ("_Alpha", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + + float4 frag( v2f_img i ) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 b = tex2D( _B, i.uv ); + float4 alpha = tex2D( _C, i.uv ); + return lerp(a,b,alpha); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LerpOp.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LerpOp.shader.meta new file mode 100644 index 0000000..07b4fbc --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LerpOp.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 34d9c4cdcf1fadb49af2de3f90bbc57d +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LightAttenuation.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LightAttenuation.shader new file mode 100644 index 0000000..a3fc384 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LightAttenuation.shader @@ -0,0 +1,26 @@ +Shader "Hidden/LightAttenuation" +{ + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + #include "Lighting.cginc" + + float4 _EditorWorldLightPos; + + float4 frag(v2f_img i) : SV_Target + { + float2 xy = 2 * i.uv - 1; + float z = -sqrt(1-saturate(dot(xy,xy))); + float3 worldNormal = normalize(float3(xy, z)); + float3 lightDir = normalize( _EditorWorldLightPos.xyz ); + return saturate(dot(worldNormal ,lightDir) * 10 + 0.1); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LightAttenuation.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LightAttenuation.shader.meta new file mode 100644 index 0000000..7f133af --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LightAttenuation.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4b12227498a5c8d46b6c44ea018e5b56 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LightColorNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LightColorNode.shader new file mode 100644 index 0000000..ad3d5eb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LightColorNode.shader @@ -0,0 +1,56 @@ +Shader "Hidden/LightColorNode" +{ + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + #include "Lighting.cginc" + + float4 _EditorLightColor; + + float4 frag(v2f_img i) : SV_Target + { + return _EditorLightColor; + } + ENDCG + } + + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + #include "Lighting.cginc" + + float4 _EditorLightColor; + + float4 frag(v2f_img i) : SV_Target + { + return float4(_EditorLightColor.rgb, 0); + } + ENDCG + } + + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + #include "Lighting.cginc" + + float4 _EditorLightColor; + + float4 frag(v2f_img i) : SV_Target + { + return _EditorLightColor.a; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LightColorNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LightColorNode.shader.meta new file mode 100644 index 0000000..fcd8689 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LightColorNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 43f5d3c033eb5044e9aeb40241358349 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LinearDepthNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LinearDepthNode.shader new file mode 100644 index 0000000..0bcf779 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LinearDepthNode.shader @@ -0,0 +1,43 @@ +Shader "Hidden/LinearDepthNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + float depthValue = tex2D( _A, i.uv ).r; + return LinearEyeDepth( depthValue ); + } + ENDCG + } + + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + float depthValue = tex2D( _A, i.uv ).r; + return Linear01Depth( depthValue ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LinearDepthNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LinearDepthNode.shader.meta new file mode 100644 index 0000000..754a2f4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LinearDepthNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2b0785cc8b854974ab4e45419072705a +timeCreated: 1546440865 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LinearToGammaNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LinearToGammaNode.shader new file mode 100644 index 0000000..b246880 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LinearToGammaNode.shader @@ -0,0 +1,27 @@ +Shader "Hidden/LinearToGammaNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + float4 c = tex2D( _A, i.uv ); + c.rgb = LinearToGammaSpace( c.rgb ); + return c; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LinearToGammaNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LinearToGammaNode.shader.meta new file mode 100644 index 0000000..2c413a8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LinearToGammaNode.shader.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9027c408b928c5c4d8b450712049d541 +timeCreated: 1489078120 +licenseType: Store +ShaderImporter: + defaultTextures: + - _MainTex: {instanceID: 0} + - _BackGround: {fileID: 2800000, guid: 750b1bd7ba8bd28489650de6d0a95cc5, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Log10OpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Log10OpNode.shader new file mode 100644 index 0000000..6259c6c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Log10OpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/Log10OpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return log10(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Log10OpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Log10OpNode.shader.meta new file mode 100644 index 0000000..981dbc5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Log10OpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 9e7cfa357dd261f499d0ba8637ff2614 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Log2OpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Log2OpNode.shader new file mode 100644 index 0000000..44dabdb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Log2OpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/Log2OpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return log2(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Log2OpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Log2OpNode.shader.meta new file mode 100644 index 0000000..a8a3888 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Log2OpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 5975a154432d4c64cacd78d015ed08ba +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LogOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LogOpNode.shader new file mode 100644 index 0000000..b95abb0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LogOpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/LogOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return log(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LogOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LogOpNode.shader.meta new file mode 100644 index 0000000..317db1f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LogOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a3293e0a73834b24682775f5d8ee1e7c +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LuminanceNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LuminanceNode.shader new file mode 100644 index 0000000..a56bbe3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LuminanceNode.shader @@ -0,0 +1,26 @@ +Shader "Hidden/LuminanceNode" +{ + Properties + { + _A ("_RGB", 2D) = "white" {} + } + SubShader + { + Pass //Luminance + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + float lum = Luminance( tex2D( _A, i.uv ) ); + return float4( lum.xxx, 1); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LuminanceNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LuminanceNode.shader.meta new file mode 100644 index 0000000..a303971 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_LuminanceNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 81e1d8ffeec8a4b4cabb1094bc981048 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NegateNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NegateNode.shader new file mode 100644 index 0000000..9d94ffb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NegateNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/NegateNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return -(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NegateNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NegateNode.shader.meta new file mode 100644 index 0000000..8cff94e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NegateNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b035bc40da1ac7c4eafad4116382ec79 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NodeMasking.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NodeMasking.shader new file mode 100644 index 0000000..b129ccc --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NodeMasking.shader @@ -0,0 +1,55 @@ +Shader "Hidden/NodeMasking" +{ + Properties { + _Ports ("_Ports", Vector) = (0,0,0,0) + _MainTex("_MainTex", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _MainTex; + float4 _Ports; + + float4 frag( v2f_img i ) : SV_Target + { + float4 a = tex2D( _MainTex, i.uv ); + return a * _Ports; + } + ENDCG + } + + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _MaskTex; + float _Port; + + float4 frag( v2f_img i ) : SV_Target + { + float4 a = tex2D( _MaskTex, i.uv ); + float4 c = 0; + if ( _Port == 1 ) + c = a.x; + else if ( _Port == 2 ) + c = a.y; + else if ( _Port == 3 ) + c = a.z; + else if ( _Port == 4 ) + c = a.w; + + return c; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NodeMasking.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NodeMasking.shader.meta new file mode 100644 index 0000000..4a020c3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NodeMasking.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 9c34f18ebe2be3e48b201b748c73dec0 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NoiseGeneratorNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NoiseGeneratorNode.shader new file mode 100644 index 0000000..a8b9286 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NoiseGeneratorNode.shader @@ -0,0 +1,267 @@ +Shader "Hidden/NoiseGeneratorNode" +{ + Properties + { + _A ("_RGB", 2D) = "white" {} + _B ("_RGB", 2D) = "white" {} + _To01Range ("_To01Range", Float) = 0 + } + + SubShader + { + CGINCLUDE + sampler2D _A; + sampler2D _B; + float _To01Range; + ENDCG + + Pass //Simplex2D + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + + float3 mod2D289 ( float3 x ) { return x - floor ( x * ( 1.0 / 289.0 ) ) * 289.0; } + float2 mod2D289 ( float2 x ) { return x - floor ( x * ( 1.0 / 289.0 ) ) * 289.0; } + float3 permute ( float3 x ) { return mod2D289 ( ( ( x * 34.0 ) + 1.0 ) * x ); } + + float snoise ( float2 v ) + { + const float4 C = float4( 0.211324865405187, 0.366025403784439, -0.577350269189626, 0.024390243902439 ); + float2 i = floor ( v + dot ( v, C.yy ) ); + float2 x0 = v - i + dot ( i, C.xx ); + float2 i1; + i1 = ( x0.x > x0.y ) ? float2( 1.0, 0.0 ) : float2( 0.0, 1.0 ); + float4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + i = mod2D289 ( i ); + float3 p = permute ( permute ( i.y + float3( 0.0, i1.y, 1.0 ) ) + i.x + float3( 0.0, i1.x, 1.0 ) ); + float3 m = max ( 0.5 - float3( dot ( x0, x0 ), dot ( x12.xy, x12.xy ), dot ( x12.zw, x12.zw ) ), 0.0 ); + m = m * m; + m = m * m; + float3 x = 2.0 * frac ( p * C.www ) - 1.0; + float3 h = abs ( x ) - 0.5; + float3 ox = floor ( x + 0.5 ); + float3 a0 = x - ox; + m *= 1.79284291400159 - 0.85373472095314 * ( a0 * a0 + h * h ); + float3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot ( m, g ); + } + float4 frag(v2f_img i) : SV_Target + { + float2 size = tex2D( _A, i.uv ).rg; + float scale = tex2D (_B, i.uv).r; + float noiseVal = snoise ( size * scale ); + noiseVal = (_To01Range > 0) ? noiseVal * 0.5 + 0.5 : noiseVal; + return float4( noiseVal.xxx, 1); + } + ENDCG + } + + Pass //Simplex3D + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + float3 mod3D289 ( float3 x ) { return x - floor ( x / 289.0 ) * 289.0; } + + float4 mod3D289 ( float4 x ) { return x - floor ( x / 289.0 ) * 289.0; } + + float4 permute ( float4 x ) { return mod3D289 ( ( x * 34.0 + 1.0 ) * x ); } + + float4 taylorInvSqrt ( float4 r ) { return 1.79284291400159 - r * 0.85373472095314; } + + float snoise ( float3 v ) + { + const float2 C = float2( 1.0 / 6.0, 1.0 / 3.0 ); + float3 i = floor ( v + dot ( v, C.yyy ) ); + float3 x0 = v - i + dot ( i, C.xxx ); + float3 g = step ( x0.yzx, x0.xyz ); + float3 l = 1.0 - g; + float3 i1 = min ( g.xyz, l.zxy ); + float3 i2 = max ( g.xyz, l.zxy ); + float3 x1 = x0 - i1 + C.xxx; + float3 x2 = x0 - i2 + C.yyy; + float3 x3 = x0 - 0.5; + i = mod3D289 ( i ); + float4 p = permute ( permute ( permute ( i.z + float4( 0.0, i1.z, i2.z, 1.0 ) ) + i.y + float4( 0.0, i1.y, i2.y, 1.0 ) ) + i.x + float4( 0.0, i1.x, i2.x, 1.0 ) ); + float4 j = p - 49.0 * floor ( p / 49.0 ); // mod(p,7*7) + float4 x_ = floor ( j / 7.0 ); + float4 y_ = floor ( j - 7.0 * x_ ); // mod(j,N) + float4 x = ( x_ * 2.0 + 0.5 ) / 7.0 - 1.0; + float4 y = ( y_ * 2.0 + 0.5 ) / 7.0 - 1.0; + float4 h = 1.0 - abs ( x ) - abs ( y ); + float4 b0 = float4( x.xy, y.xy ); + float4 b1 = float4( x.zw, y.zw ); + float4 s0 = floor ( b0 ) * 2.0 + 1.0; + float4 s1 = floor ( b1 ) * 2.0 + 1.0; + float4 sh = -step ( h, 0.0 ); + float4 a0 = b0.xzyw + s0.xzyw * sh.xxyy; + float4 a1 = b1.xzyw + s1.xzyw * sh.zzww; + float3 g0 = float3( a0.xy, h.x ); + float3 g1 = float3( a0.zw, h.y ); + float3 g2 = float3( a1.xy, h.z ); + float3 g3 = float3( a1.zw, h.w ); + float4 norm = taylorInvSqrt ( float4( dot ( g0, g0 ), dot ( g1, g1 ), dot ( g2, g2 ), dot ( g3, g3 ) ) ); + g0 *= norm.x; + g1 *= norm.y; + g2 *= norm.z; + g3 *= norm.w; + float4 m = max ( 0.6 - float4( dot ( x0, x0 ), dot ( x1, x1 ), dot ( x2, x2 ), dot ( x3, x3 ) ), 0.0 ); + m = m* m; + m = m* m; + float4 px = float4( dot ( x0, g0 ), dot ( x1, g1 ), dot ( x2, g2 ), dot ( x3, g3 ) ); + return 42.0 * dot ( m, px ); + } + + float4 frag ( v2f_img i ) : SV_Target + { + float3 size = tex2D ( _A, i.uv ).rgb; + float scale = tex2D (_B, i.uv).r; + float noiseVal = snoise ( size * scale ); + noiseVal = (_To01Range > 0) ? noiseVal * 0.5 + 0.5 : noiseVal; + return float4( noiseVal.xxx, 1 ); + } + ENDCG + } + + Pass // Gradient - Shader Toy + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + //https://www.shadertoy.com/view/XdXGW8 + float2 GradientNoiseDir (float2 x) + { + const float2 k = float2(0.3183099, 0.3678794); + x = x * k + k.yx; + return -1.0 + 2.0 * frac (16.0 * k * frac (x.x * x.y * (x.x + x.y))); + } + + float GradientNoise (float2 UV, float Scale) + { + float2 p = UV * Scale; + float2 i = floor (p); + float2 f = frac (p); + float2 u = f * f * (3.0 - 2.0 * f); + return lerp (lerp (dot (GradientNoiseDir (i + float2(0.0, 0.0)), f - float2(0.0, 0.0)), + dot (GradientNoiseDir (i + float2(1.0, 0.0)), f - float2(1.0, 0.0)), u.x), + lerp (dot (GradientNoiseDir (i + float2(0.0, 1.0)), f - float2(0.0, 1.0)), + dot (GradientNoiseDir (i + float2(1.0, 1.0)), f - float2(1.0, 1.0)), u.x), u.y); + } + + float4 frag (v2f_img i) : SV_Target + { + float3 size = tex2D (_A, i.uv).rgb; + float scale = tex2D (_B, i.uv).r; + float noiseVal = GradientNoise (size , scale); + noiseVal = (_To01Range > 0) ? noiseVal * 0.5 + 0.5 : noiseVal; + return float4(noiseVal.xxx, 1); + } + ENDCG + } + + Pass // Gradient - Unity + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + float2 UnityGradientNoiseDir (float2 p) + { + p = fmod (p , 289); + float x = fmod ((34 * p.x + 1) * p.x , 289) + p.y; + x = fmod ((34 * x + 1) * x , 289); + x = frac (x / 41) * 2 - 1; + return normalize (float2(x - floor (x + 0.5), abs (x) - 0.5)); + } + + float UnityGradientNoise (float2 UV, float Scale) + { + float2 p = UV * Scale; + float2 ip = floor (p); + float2 fp = frac (p); + float d00 = dot (UnityGradientNoiseDir (ip), fp); + float d01 = dot (UnityGradientNoiseDir (ip + float2(0, 1)), fp - float2(0, 1)); + float d10 = dot (UnityGradientNoiseDir (ip + float2(1, 0)), fp - float2(1, 0)); + float d11 = dot (UnityGradientNoiseDir (ip + float2(1, 1)), fp - float2(1, 1)); + fp = fp * fp * fp * (fp * (fp * 6 - 15) + 10); + return lerp (lerp (d00, d01, fp.y), lerp (d10, d11, fp.y), fp.x) + 0.5; + } + + float4 frag (v2f_img i) : SV_Target + { + float3 size = tex2D (_A, i.uv).rgb; + float scale = tex2D (_B, i.uv).r; + float noiseVal = UnityGradientNoise(size , scale); + noiseVal = (_To01Range > 0) ? noiseVal * 0.5 + 0.5 : noiseVal; + return float4(noiseVal.xxx, 1); + } + ENDCG + } + + Pass // Simple + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + inline float noise_randomValue (float2 uv) { return frac(sin(dot(uv, float2(12.9898, 78.233)))*43758.5453); } + inline float noise_interpolate (float a, float b, float t) { return (1.0-t)*a + (t*b); } + inline float valueNoise (float2 uv) + { + float2 i = floor(uv); + float2 f = frac( uv ); + f = f* f * (3.0 - 2.0 * f); + uv = abs( frac(uv) - 0.5); + float2 c0 = i + float2( 0.0, 0.0 ); + float2 c1 = i + float2( 1.0, 0.0 ); + float2 c2 = i + float2( 0.0, 1.0 ); + float2 c3 = i + float2( 1.0, 1.0 ); + float r0 = noise_randomValue( c0 ); + float r1 = noise_randomValue( c1 ); + float r2 = noise_randomValue( c2 ); + float r3 = noise_randomValue( c3 ); + float bottomOfGrid = noise_interpolate( r0, r1, f.x ); + float topOfGrid = noise_interpolate( r2, r3, f.x ); + float t = noise_interpolate( bottomOfGrid, topOfGrid, f.y ); + return t; + } + + float SimpleNoise(float2 UV) + { + float t = 0.0; + float freq = pow( 2.0, float( 0 ) ); + float amp = pow( 0.5, float( 3 - 0 ) ); + t += valueNoise( UV/freq )*amp; + freq = pow(2.0, float(1)); + amp = pow(0.5, float(3-1)); + t += valueNoise( UV/freq )*amp; + freq = pow(2.0, float(2)); + amp = pow(0.5, float(3-2)); + t += valueNoise( UV/freq )*amp; + return t; + } + + float4 frag (v2f_img i) : SV_Target + { + float3 size = tex2D (_A, i.uv).rgb; + float scale = tex2D (_B, i.uv).r; + float noiseVal = SimpleNoise(size * scale); + noiseVal = (_To01Range == 0) ? noiseVal * 2 - 1 : noiseVal; + return float4(noiseVal.xxx, 1); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NoiseGeneratorNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NoiseGeneratorNode.shader.meta new file mode 100644 index 0000000..d92bbfc --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NoiseGeneratorNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: cd2d37ef5da190b42a91a5a690ba2a7d +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NormalVertexDataNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NormalVertexDataNode.shader new file mode 100644 index 0000000..8fce5f6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NormalVertexDataNode.shader @@ -0,0 +1,22 @@ +Shader "Hidden/NormalVertexDataNode" +{ + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + float4 frag(v2f_img i) : SV_Target + { + float2 xy = 2 * i.uv - 1; + float z = -sqrt(1-saturate(dot(xy,xy))); + float3 normal = normalize(float3(xy, z)); + return float4(normal, 1); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NormalVertexDataNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NormalVertexDataNode.shader.meta new file mode 100644 index 0000000..9ec1526 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NormalVertexDataNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6b24b06c33f9fe84c8a2393f13ab5406 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NormalizeNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NormalizeNode.shader new file mode 100644 index 0000000..fdcc64f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NormalizeNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/NormalizeNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return normalize(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NormalizeNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NormalizeNode.shader.meta new file mode 100644 index 0000000..98ea8d3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_NormalizeNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a51b11dfb6b32884e930595e5f9defa8 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjSpaceLightDirHlpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjSpaceLightDirHlpNode.shader new file mode 100644 index 0000000..4aa3e88 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjSpaceLightDirHlpNode.shader @@ -0,0 +1,22 @@ +Shader "Hidden/ObjSpaceLightDirHlpNode" +{ + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float4 _EditorWorldLightPos; + + float4 frag( v2f_img i ) : SV_Target + { + float3 lightDir = mul(unity_WorldToObject, normalize( _EditorWorldLightPos.xyz ) ); + return float4 ( lightDir, 1); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjSpaceLightDirHlpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjSpaceLightDirHlpNode.shader.meta new file mode 100644 index 0000000..a1d64ec --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjSpaceLightDirHlpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c7852de24cec4a744b5358921e23feee +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjSpaceViewDirHlpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjSpaceViewDirHlpNode.shader new file mode 100644 index 0000000..3535052 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjSpaceViewDirHlpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/ObjSpaceViewDirHlpNode" +{ +Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + sampler2D _A; + + float4 frag( v2f_img i ) : SV_Target + { + return float4(ObjSpaceViewDir(tex2D( _A, i.uv )),0); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjSpaceViewDirHlpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjSpaceViewDirHlpNode.shader.meta new file mode 100644 index 0000000..4c8fc97 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjSpaceViewDirHlpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b6b985e165d0dd44c96a05b46e267e64 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjectScaleNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjectScaleNode.shader new file mode 100644 index 0000000..445c627 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjectScaleNode.shader @@ -0,0 +1,36 @@ +Shader "Hidden/ObjectScaleNode" +{ + SubShader + { + + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + float4 frag(v2f_img i) : SV_Target + { + float3 objectScale = float3( length( unity_ObjectToWorld[ 0 ].xyz ), length( unity_ObjectToWorld[ 1 ].xyz ), length( unity_ObjectToWorld[ 2 ].xyz ) ); + return float4(objectScale, 1); + } + ENDCG + } + + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + float4 frag (v2f_img i) : SV_Target + { + float3 objectScale = 1.0 / float3(length (unity_WorldToObject[0].xyz), length (unity_WorldToObject[1].xyz), length (unity_WorldToObject[2].xyz)); + return float4(objectScale, 1); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjectScaleNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjectScaleNode.shader.meta new file mode 100644 index 0000000..3c410d6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjectScaleNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 5540033c6c52f51468938c1a42bd2730 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjectToClipPos.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjectToClipPos.shader new file mode 100644 index 0000000..b85a410 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjectToClipPos.shader @@ -0,0 +1,28 @@ +Shader "Hidden/ObjectToClipPos" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag( v2f_img i ) : SV_Target + { + float3 pos = tex2D( _A, i.uv ).xyz; + return UnityObjectToClipPos(pos); + } + ENDCG + } + + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjectToClipPos.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjectToClipPos.shader.meta new file mode 100644 index 0000000..929708b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjectToClipPos.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 14ec765a147a53340877b489e73f1c9f +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjectToViewPos.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjectToViewPos.shader new file mode 100644 index 0000000..6acf81a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjectToViewPos.shader @@ -0,0 +1,29 @@ +Shader "Hidden/ObjectToViewPos" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag( v2f_img i ) : SV_Target + { + float3 pos = tex2D( _A, i.uv ).xyz; + float3 result = UnityObjectToViewPos(pos); + return float4(result, 1.0); + } + ENDCG + } + + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjectToViewPos.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjectToViewPos.shader.meta new file mode 100644 index 0000000..9453774 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjectToViewPos.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b790bc1d468a51840a9facef372b4729 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjectToWorldTransfNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjectToWorldTransfNode.shader new file mode 100644 index 0000000..57050b8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjectToWorldTransfNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/ObjectToWorldTransfNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return mul(unity_ObjectToWorld, tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjectToWorldTransfNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjectToWorldTransfNode.shader.meta new file mode 100644 index 0000000..9aa0dd9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ObjectToWorldTransfNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a4044ee165813654486d0cecd0de478c +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_OneMinusNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_OneMinusNode.shader new file mode 100644 index 0000000..6c290ee --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_OneMinusNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/OneMinusNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return 1-tex2D(_A, i.uv); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_OneMinusNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_OneMinusNode.shader.meta new file mode 100644 index 0000000..84d6766 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_OneMinusNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: bed5300b92e7bb0419d0f4accb853312 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_OrthoParams.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_OrthoParams.shader new file mode 100644 index 0000000..119867b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_OrthoParams.shader @@ -0,0 +1,19 @@ +Shader "Hidden/OrthoParams" +{ + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float4 frag( v2f_img i ) : SV_Target + { + return unity_OrthoParams; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_OrthoParams.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_OrthoParams.shader.meta new file mode 100644 index 0000000..b619a3a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_OrthoParams.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 88a910ece3dce224793e669bb1bc158d +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PannerNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PannerNode.shader new file mode 100644 index 0000000..be63723 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PannerNode.shader @@ -0,0 +1,40 @@ +Shader "Hidden/PannerNode" +{ + Properties + { + _A ("_UVs", 2D) = "white" {} + _B ("_PanTime", 2D) = "white" {} + _C ("_PanSpeed", 2D ) = "white" {} + } + SubShader + { + Pass + { + Name "Panner" // 14 - UV panner node + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + sampler2D _A; + sampler2D _B; + sampler2D _C; + + float _UsingEditor; + float _EditorTime; + + float4 frag(v2f_img i) : SV_Target + { + float multiplier = tex2D ( _B, i.uv ).r; + float time = _EditorTime*multiplier; + if ( _UsingEditor == 0 ) + { + time = multiplier; + } + float2 speed = tex2D ( _C, i.uv ).rg; + return tex2D( _A, i.uv) + time * float4( speed, 0, 0 ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PannerNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PannerNode.shader.meta new file mode 100644 index 0000000..d3b5057 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PannerNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6f89a5d96bdad114b9bbd0c236cac622 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ParallaxMappingNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ParallaxMappingNode.shader new file mode 100644 index 0000000..5ea1a1b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ParallaxMappingNode.shader @@ -0,0 +1,44 @@ +Shader "Hidden/ParallaxMappingNode" +{ + Properties + { + _A ("_UV", 2D) = "white" {} + _B ("_Height", 2D) = "white" {} + _C ("_Scale", 2D) = "white" {} + _D ("_ViewDirTan", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + float _ParallaxType; + + float4 frag(v2f_img i) : SV_Target + { + float2 uv = tex2D( _A, i.uv ).rg; + float h = tex2D( _B, i.uv ).r; + float s = tex2D( _C, i.uv ).r; + float3 vt = tex2D( _D, i.uv ).xyz; + float2 parallaxed = uv; + if ( _ParallaxType == 1 ) { + parallaxed = ( ( h - 1 )*( vt.xy / vt.z ) * s ) + uv; + } + else { + parallaxed = ( ( h - 1 )*( vt.xy ) * s ) + uv; + } + + return float4(parallaxed, 0 , 0); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ParallaxMappingNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ParallaxMappingNode.shader.meta new file mode 100644 index 0000000..35dfe96 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ParallaxMappingNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 589f12f68e00ac74286815aa56053fcc +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ParallaxOffset.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ParallaxOffset.shader new file mode 100644 index 0000000..0db961a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ParallaxOffset.shader @@ -0,0 +1,35 @@ +Shader "Hidden/ParallaxOffset" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + _C ("_C", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + + float4 frag( v2f_img i ) : SV_Target + { + float h = tex2D( _A, i.uv ).x; + float height = tex2D( _B, i.uv ).x; + float3 viewDir = tex2D( _C, i.uv ).xyz; + float2 result = ParallaxOffset (h, height, viewDir); + return float4(result, 0, 1); + + } + ENDCG + } + + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ParallaxOffset.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ParallaxOffset.shader.meta new file mode 100644 index 0000000..5c74486 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ParallaxOffset.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6085f804c6fbf354eac039c11feaa7cc +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PiNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PiNode.shader new file mode 100644 index 0000000..000e8c0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PiNode.shader @@ -0,0 +1,21 @@ +Shader "Hidden/PiNode" +{ + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return tex2D( _A, i.uv ).r * UNITY_PI; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PiNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PiNode.shader.meta new file mode 100644 index 0000000..a3cac8c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PiNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: bf4a65726dab3d445a69fb1d0945c33e +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PosVertexDataNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PosVertexDataNode.shader new file mode 100644 index 0000000..15f3ad9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PosVertexDataNode.shader @@ -0,0 +1,22 @@ +Shader "Hidden/PosVertexDataNode" +{ + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float4 frag(v2f_img i) : SV_Target + { + float2 xy = 2 * i.uv - 1; + float z = -sqrt(1-saturate(dot(xy,xy))); + float3 vertexPos = float3(xy, z); + return float4(vertexPos, 1); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PosVertexDataNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PosVertexDataNode.shader.meta new file mode 100644 index 0000000..b86aa1a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PosVertexDataNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a5c14f759dd021b4b8d4b6eeb85ac227 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PosterizeNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PosterizeNode.shader new file mode 100644 index 0000000..099d105 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PosterizeNode.shader @@ -0,0 +1,35 @@ +Shader "Hidden/PosterizeNode" +{ + Properties + { + _A ( "_RGBA", 2D ) = "white" {} + _B ( "_Power", 2D ) = "white" {} + } + + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + uniform sampler2D _A; + uniform sampler2D _B; + + float4 frag ( v2f_img i ) : SV_Target + { + float4 rgba = tex2D ( _B, i.uv ); + float power = tex2D ( _A, i.uv ).r; + if ( power < 1 ) + return float4(0,0,0,0); + float divideOp = 256.0 / float ( (int)power ); + float4 finalColor = ( floor ( rgba * divideOp ) / divideOp ); + + return finalColor; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PosterizeNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PosterizeNode.shader.meta new file mode 100644 index 0000000..e652f83 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PosterizeNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ecb3048ef0eec1645bad1d72a98d8279 +timeCreated: 1515421907 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PowerNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PowerNode.shader new file mode 100644 index 0000000..721fe1d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PowerNode.shader @@ -0,0 +1,29 @@ +Shader "Hidden/PowerNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + + float4 frag( v2f_img i ) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 b = tex2D( _B, i.uv ); + return pow(a, b); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PowerNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PowerNode.shader.meta new file mode 100644 index 0000000..205e037 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PowerNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 758cc2f8b537b4e4b93d9833075d138c +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PrimitiveIDVariableNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PrimitiveIDVariableNode.shader new file mode 100644 index 0000000..30dc0ca --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PrimitiveIDVariableNode.shader @@ -0,0 +1,19 @@ +Shader "Hidden/PrimitiveIDVariableNode" +{ + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + float4 frag( v2f_img i, uint ase_primitiveId : SV_PrimitiveID ) : SV_Target + { + return ase_primitiveId; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PrimitiveIDVariableNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PrimitiveIDVariableNode.shader.meta new file mode 100644 index 0000000..f2438c3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_PrimitiveIDVariableNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 92c1b588d7658594cb219696f593f64b +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ProjectionParams.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ProjectionParams.shader new file mode 100644 index 0000000..835f886 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ProjectionParams.shader @@ -0,0 +1,19 @@ +Shader "Hidden/ProjectionParams" +{ + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float4 frag( v2f_img i ) : SV_Target + { + return _ProjectionParams; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ProjectionParams.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ProjectionParams.shader.meta new file mode 100644 index 0000000..acd5433 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ProjectionParams.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 97ae846cb0a6b044388fad3bc03bb4c2 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RGBToHSVNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RGBToHSVNode.shader new file mode 100644 index 0000000..510fb75 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RGBToHSVNode.shader @@ -0,0 +1,37 @@ +Shader "Hidden/RGBToHSVNode" +{ + Properties + { + _A ( "_RGB", 2D ) = "white" {} + } + + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + uniform sampler2D _A; + + float3 RGBToHSV(float3 c) + { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp( float4( c.bg, K.wz ), float4( c.gb, K.xy ), step( c.b, c.g ) ); + float4 q = lerp( float4( p.xyw, c.r ), float4( c.r, p.yzx ), step( p.x, c.r ) ); + float d = q.x - min( q.w, q.y ); + float e = 1.0e-10; + return float3( abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + + float4 frag ( v2f_img i ) : SV_Target + { + float3 rgb = tex2D ( _A, i.uv ).rgb; + return float4( RGBToHSV(rgb), 1 ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RGBToHSVNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RGBToHSVNode.shader.meta new file mode 100644 index 0000000..87cdb89 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RGBToHSVNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0f2f09b49bf4954428aafa2dfe1a9a09 +timeCreated: 1515423140 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RadiansOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RadiansOpNode.shader new file mode 100644 index 0000000..48c8343 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RadiansOpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/RadiansOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return radians(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RadiansOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RadiansOpNode.shader.meta new file mode 100644 index 0000000..aa74094 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RadiansOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d27d189eaf6eeb04fae9913d9617ece5 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RangedFloatNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RangedFloatNode.shader new file mode 100644 index 0000000..62a378e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RangedFloatNode.shader @@ -0,0 +1,24 @@ +Shader "Hidden/RangedFloatNode" +{ + Properties { + _InputFloat ("_InputFloat", Float) = 0 + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + float _InputFloat; + + float4 frag( v2f_img i ) : SV_Target + { + return _InputFloat; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RangedFloatNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RangedFloatNode.shader.meta new file mode 100644 index 0000000..35db24d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RangedFloatNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d9ca47581ac157145bff6f72ac5dd73e +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ReflectOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ReflectOpNode.shader new file mode 100644 index 0000000..c9f2a55 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ReflectOpNode.shader @@ -0,0 +1,29 @@ +Shader "Hidden/ReflectOpNode" +{ + Properties + { + _A ("_Incident", 2D) = "white" {} + _B ("_Normal", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 b = tex2D( _B, i.uv ); + return reflect(a, b); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ReflectOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ReflectOpNode.shader.meta new file mode 100644 index 0000000..48ebfd4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ReflectOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: fb520f2145c0fa0409320a9e6d720758 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RefractOpVec.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RefractOpVec.shader new file mode 100644 index 0000000..0aee3cf --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RefractOpVec.shader @@ -0,0 +1,32 @@ +Shader "Hidden/RefractOpVec" +{ + Properties + { + _A ("_Incident", 2D) = "white" {} + _B ("_Normal", 2D) = "white" {} + _C ("_Eta", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + + float4 frag(v2f_img i) : SV_Target + { + float4 inc = tex2D( _A, i.uv ); + float4 nor = tex2D( _B, i.uv ); + float4 eta = tex2D( _C, i.uv ); + return refract( inc, nor, eta ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RefractOpVec.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RefractOpVec.shader.meta new file mode 100644 index 0000000..47b5f3d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RefractOpVec.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 5ab44ca484bed8b4884b03b1c00fdc3d +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RegisterLocalVarNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RegisterLocalVarNode.shader new file mode 100644 index 0000000..8538155 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RegisterLocalVarNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/RegisterLocalVarNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return tex2D( _A, i.uv ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RegisterLocalVarNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RegisterLocalVarNode.shader.meta new file mode 100644 index 0000000..af9e1be --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RegisterLocalVarNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 5aaa1d3ea9e1fa64781647e035a82334 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RelayNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RelayNode.shader new file mode 100644 index 0000000..598f22b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RelayNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/RelayNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return tex2D( _A, i.uv ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RelayNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RelayNode.shader.meta new file mode 100644 index 0000000..29421ef --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RelayNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 74e4d859fbdb2c0468de3612145f4929 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RotatorNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RotatorNode.shader new file mode 100644 index 0000000..59c2d43 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RotatorNode.shader @@ -0,0 +1,43 @@ +Shader "Hidden/RotatorNode" +{ + Properties + { + _A ("_UVs", 2D) = "white" {} + _B ("_Anchor", 2D) = "white" {} + _C ("_RotTimeTex", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + sampler2D _A; + sampler2D _B; + sampler2D _C; + float _UsingEditor; + float _EditorTime; + + float4 frag(v2f_img i) : SV_Target + { + float multiplier = tex2D ( _C, i.uv ).r; + float time = _EditorTime*multiplier; + + if ( _UsingEditor == 0 ) + { + time = multiplier; + } + + float cosT = cos( time ); + float sinT = sin( time ); + + float2 a = tex2D( _B, i.uv ).rg; + return float4( mul( tex2D( _A, i.uv ).xy - a, float2x2( cosT, -sinT, sinT, cosT ) ) + a, 0, 1 ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RotatorNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RotatorNode.shader.meta new file mode 100644 index 0000000..c9a283e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RotatorNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e21408a1c7f12f14bbc2652f69bce1fc +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RoundOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RoundOpNode.shader new file mode 100644 index 0000000..85226ad --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RoundOpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/RoundOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return round(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RoundOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RoundOpNode.shader.meta new file mode 100644 index 0000000..21a0a03 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RoundOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 554d561417b207c4bb3cd4a0c86b6907 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RsqrtOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RsqrtOpNode.shader new file mode 100644 index 0000000..b15f1eb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RsqrtOpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/RSqrtOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return rsqrt(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RsqrtOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RsqrtOpNode.shader.meta new file mode 100644 index 0000000..077ff4f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_RsqrtOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c58c17cb1f7f6e6429a2c7a6cdaef87d +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SamplerNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SamplerNode.shader new file mode 100644 index 0000000..95cda8f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SamplerNode.shader @@ -0,0 +1,143 @@ +Shader "Hidden/SamplerNode" +{ + Properties + { + _B ("_UVs", 2D) = "white" {} + _C ("_Level", 2D) = "white" {} + _F ("_NormalScale", 2D) = "white" {} + _G ("Index", 2D) = "white" {} + _CustomUVs ("_CustomUVs", Int) = 0 + _Unpack ("_Unpack", Int) = 0 + _LodType ("_LodType", Int) = 0 + + _Sampler ("_Sampler", 2D) = "white" {} + _Sampler3D ("_Sampler3D", 3D) = "white" {} + _Array ("_Array", 2DArray) = "white" {} + _Cube( "_Cube", CUBE) = "white" {} + _Default ("_Default", Int) = 0 + _Type ("_Type", Int) = 0 + } + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #pragma exclude_renderers d3d9 + #pragma target 3.5 + #include "UnityCG.cginc" + #include "UnityStandardUtils.cginc" + + sampler2D _F; + int _CustomUVs; + int _Unpack; + int _Default; + + float4 frag( v2f_img i ) : SV_Target + { + if( _Default == 1 ) + { + return 1; + } + else if( _Default == 2 ) + { + return 0; + } + else if( _Default == 3 ) + { + return 0.5f; + } + else if( _Default == 4 ) + { + float4 h = float4(0.5,0.5,1,1); + if ( _Unpack == 1 ) + { + h.rgb = UnpackScaleNormal( h.xxyy, tex2D( _F, i.uv ).r ); + } + return h; + } + return 1; + } + ENDCG + } + + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #pragma exclude_renderers d3d9 + #pragma target 3.5 + #include "UnityCG.cginc" + #include "UnityStandardUtils.cginc" + + sampler2D _B; + sampler2D _C; + sampler2D _F; + sampler2D _G; + int _CustomUVs; + int _Unpack; + int _LodType; + + UNITY_DECLARE_TEX2DARRAY (_Array); + samplerCUBE _Cube; + sampler2D _Sampler; + sampler3D _Sampler3D; + int _Type; + + float4 frag (v2f_img i) : SV_Target + { + if (_Type == 4) + { + return UNITY_SAMPLE_TEX2DARRAY ( _Array, float3(i.uv, tex2D( _G, i.uv ).r ) ); + } + else if (_Type == 3) + { + float3 uvs = float3(i.uv,0); + + if (_CustomUVs == 1) + uvs = tex2D (_B, i.uv).xyz; + + return texCUBE (_Cube, uvs); + } + else if (_Type == 2) + { + return tex3D (_Sampler3D, float3(i.uv,0)); + } + else + { + float2 uvs = i.uv; + float4 c = 0; + + if (_CustomUVs == 1) + uvs = tex2D (_B, i.uv).xy; + + if (_LodType == 1) + { + float lod = tex2D (_C, i.uv).r; + c = tex2Dlod (_Sampler, float4(uvs,0,lod)); + } + else if (_LodType == 2) + { + float bias = tex2D (_C, i.uv).r; + c = tex2Dbias (_Sampler, float4(uvs,0,bias)); + } + else + { + c = tex2D (_Sampler, uvs); + } + + if (_Unpack == 1) + { + float nscale = tex2D (_F, i.uv).r; + c.rgb = UnpackScaleNormal (c, nscale); + } + + return c; + } + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SamplerNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SamplerNode.shader.meta new file mode 100644 index 0000000..c212b3b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SamplerNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 7b4e86a89b70ae64993bf422eb406422 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SaturateNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SaturateNode.shader new file mode 100644 index 0000000..53af8e0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SaturateNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/SaturateNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return saturate(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SaturateNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SaturateNode.shader.meta new file mode 100644 index 0000000..9dc04ea --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SaturateNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d9e53418dc8b9d34fb395e3ea3c75985 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ScaleAndOffsetNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ScaleAndOffsetNode.shader new file mode 100644 index 0000000..fadf991 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ScaleAndOffsetNode.shader @@ -0,0 +1,33 @@ +Shader "Hidden/ScaleAndOffsetNode" +{ + Properties + { + _A ("_Value", 2D) = "white" {} + _B ("_Scale", 2D) = "white" {} + _C ("_Offset", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + + float4 frag(v2f_img i) : SV_Target + { + float4 v = tex2D( _A, i.uv ); + float4 s = tex2D( _B, i.uv ); + float4 o = tex2D( _C, i.uv ); + + return v * s + o; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ScaleAndOffsetNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ScaleAndOffsetNode.shader.meta new file mode 100644 index 0000000..6bb6382 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ScaleAndOffsetNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a1f1053d4d9c3be439e0382038b74771 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ScaleNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ScaleNode.shader new file mode 100644 index 0000000..4a8f15c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ScaleNode.shader @@ -0,0 +1,27 @@ +Shader "Hidden/ScaleNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + float _ScaleFloat; + + float4 frag( v2f_img i ) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + return a * _ScaleFloat; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ScaleNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ScaleNode.shader.meta new file mode 100644 index 0000000..1f8ba8e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ScaleNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6d8ec9d9dab62c44aa2dcc0e3987760d +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ScreenParams.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ScreenParams.shader new file mode 100644 index 0000000..65e42ba --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ScreenParams.shader @@ -0,0 +1,19 @@ +Shader "Hidden/ScreenParams" +{ + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float4 frag( v2f_img i ) : SV_Target + { + return _ScreenParams; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ScreenParams.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ScreenParams.shader.meta new file mode 100644 index 0000000..697cc33 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ScreenParams.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 78173633b803de4419206191fed3d61e +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ScreenPosInputsNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ScreenPosInputsNode.shader new file mode 100644 index 0000000..4c0338c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ScreenPosInputsNode.shader @@ -0,0 +1,62 @@ +Shader "Hidden/ScreenPosInputsNode" +{ + SubShader + { + CGINCLUDE + #include "UnityCG.cginc" + inline float4 PrevComputeNonStereoScreenPos (float4 pos) { + float4 o = pos * 0.5f; + o.xy = float2(o.x, o.y*_ProjectionParams.x) + o.w; + o.zw = pos.zw; + return o; + } + + inline float4 CalculateScreenPos (float2 uv) + { + float2 xy = 2 * uv - 1; + float z = -sqrt (1 - saturate (dot (xy,xy))); + float3 vertexPos = float3(xy, z); + float4x4 P = float4x4(1,0,0,0,0,-1,0,0,0,0,1,0,0,0,0,1); //UNITY_MATRIX_P + float4x4 V = UNITY_MATRIX_V;//float4x4(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1); //UNITY_MATRIX_V + float4x4 M = unity_ObjectToWorld;//float4x4(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1); //unity_ObjectToWorld + float4x4 VPmatrix = mul (P, V); + float4 clipPos = mul (VPmatrix, mul (M, float4(vertexPos, 1.0))); //same as object to clip pos + float4 screenPos = ComputeScreenPos (clipPos); + return screenPos; + } + ENDCG + + //Normalized + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + + + float4 frag( v2f_img i ) : SV_Target + { + return CalculateScreenPos(i.uv); + } + ENDCG + } + + //Screen + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + + uniform float4 _ASEPreviewSize; + + float4 frag (v2f_img i) : SV_Target + { + float4 screenPos = CalculateScreenPos (i.uv); + screenPos.xy *= _ASEPreviewSize.xy; + return screenPos; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ScreenPosInputsNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ScreenPosInputsNode.shader.meta new file mode 100644 index 0000000..f6c791d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ScreenPosInputsNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a5e7295278a404175b732f1516fb68a6 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ShadeVertexLights.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ShadeVertexLights.shader new file mode 100644 index 0000000..23dc3b3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ShadeVertexLights.shader @@ -0,0 +1,34 @@ +Shader "Hidden/ShadeVertexLights" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + _LightCount( "_LightCount", Int ) = 4 + _IsSpotlight ("_IsSpotlight", Int) = 0 + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + int _LightCount; + int _IsSpotlight; + + float4 frag( v2f_img i ) : SV_Target + { + float4 vertexPosition = tex2D( _A, i.uv ); + float3 vertexNormal = tex2D( _B, i.uv ).xyz; + float3 result = ShadeVertexLightsFull (vertexPosition, vertexNormal, _LightCount, (_IsSpotlight > 0)); + return float4(result, 1); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ShadeVertexLights.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ShadeVertexLights.shader.meta new file mode 100644 index 0000000..73b03f3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ShadeVertexLights.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 3b6075034a85ad047be2d31dd213fb4f +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SignOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SignOpNode.shader new file mode 100644 index 0000000..45da74a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SignOpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/SignOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return sign(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SignOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SignOpNode.shader.meta new file mode 100644 index 0000000..6a6b6fd --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SignOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 3aca80b49aadf5046b7133730818e18f +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleAddOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleAddOpNode.shader new file mode 100644 index 0000000..e8965d9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleAddOpNode.shader @@ -0,0 +1,66 @@ +Shader "Hidden/SimpleAddOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + _C ("_C", 2D) = "white" {} + _D ("_D", 2D) = "white" {} + _E ("_E", 2D) = "white" {} + _F ("_F", 2D) = "white" {} + _G ("_G", 2D) = "white" {} + _H ("_H", 2D) = "white" {} + _I ("_I", 2D) = "white" {} + _J ("_J", 2D) = "white" {} + _Count ("_Count", Int) = 0 + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + sampler2D _E; + sampler2D _F; + sampler2D _G; + sampler2D _H; + sampler2D _I; + sampler2D _J; + int _Count; + + float4 frag( v2f_img i ) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 b = tex2D( _B, i.uv ); + float4 final = a + b; + + if( _Count > 2 ) + final += tex2D( _C, i.uv ); + if( _Count > 3 ) + final += tex2D( _D, i.uv ); + if( _Count > 4 ) + final += tex2D( _E, i.uv ); + if( _Count > 5 ) + final += tex2D( _F, i.uv ); + if( _Count > 6 ) + final += tex2D( _G, i.uv ); + if( _Count > 7 ) + final += tex2D( _H, i.uv ); + if( _Count > 8 ) + final += tex2D( _I, i.uv ); + if( _Count > 9 ) + final += tex2D( _J, i.uv ); + + return final; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleAddOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleAddOpNode.shader.meta new file mode 100644 index 0000000..acd038b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleAddOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 9eb150cbc752cbc458a0a37984b9934a +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleContrastNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleContrastNode.shader new file mode 100644 index 0000000..96fa3b1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleContrastNode.shader @@ -0,0 +1,39 @@ +Shader "Hidden/SimpleContrastNode" +{ + Properties + { + _A ( "_RBG", 2D ) = "white" {} + _B ( "_Fraction", 2D ) = "white" {} + } + + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + uniform sampler2D _A; + uniform sampler2D _B; + + float4 CalculateContrast ( float contrastValue, float4 colorTarget ) + { + float t = 0.5 * ( 1.0 - contrastValue ); + return mul ( float4x4( contrastValue, 0, 0, t, 0, contrastValue, 0, t, 0, 0, contrastValue, t, 0, 0, 0, 1 ), colorTarget ); + } + + float4 frag ( v2f_img i ) : SV_Target + { + float4 rgba = tex2D ( _B, i.uv ); + float value = tex2D ( _A, i.uv ).r; + + float4 finalColor = CalculateContrast( value , rgba ); + + return finalColor; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleContrastNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleContrastNode.shader.meta new file mode 100644 index 0000000..5c780fe --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleContrastNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8d76799413f9f0547ac9b1de7ba798f1 +timeCreated: 1515421907 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleDivideOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleDivideOpNode.shader new file mode 100644 index 0000000..5f414cd --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleDivideOpNode.shader @@ -0,0 +1,29 @@ +Shader "Hidden/SimpleDivideOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + + float4 frag( v2f_img i ) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 b = tex2D( _B, i.uv ); + return a / b; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleDivideOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleDivideOpNode.shader.meta new file mode 100644 index 0000000..582a69b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleDivideOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 409f06d00d1094849b0834c52791fa72 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleMaxOp.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleMaxOp.shader new file mode 100644 index 0000000..f973907 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleMaxOp.shader @@ -0,0 +1,29 @@ +Shader "Hidden/SimpleMaxOp" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 b = tex2D( _B, i.uv ); + return max( a, b ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleMaxOp.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleMaxOp.shader.meta new file mode 100644 index 0000000..9575af5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleMaxOp.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 79d7f2a11092ac84a95ef6823b34adf2 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleMinNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleMinNode.shader new file mode 100644 index 0000000..183d0dd --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleMinNode.shader @@ -0,0 +1,29 @@ +Shader "Hidden/SimpleMinNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 b = tex2D( _B, i.uv ); + return min( a, b ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleMinNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleMinNode.shader.meta new file mode 100644 index 0000000..0f2a266 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleMinNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d6033298044f0f14aa9932ca46e58ce6 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleMultiplyOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleMultiplyOpNode.shader new file mode 100644 index 0000000..5bd25e3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleMultiplyOpNode.shader @@ -0,0 +1,272 @@ +Shader "Hidden/SimpleMultiplyOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + _C ("_C", 2D) = "white" {} + _D ("_D", 2D) = "white" {} + _E ("_E", 2D) = "white" {} + _F ("_F", 2D) = "white" {} + _G ("_G", 2D) = "white" {} + _H ("_H", 2D) = "white" {} + _I ("_I", 2D) = "white" {} + _J ("_J", 2D) = "white" {} + _Count ("_Count", Int) = 0 + } + + SubShader + { + Pass //2 + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + + float4 frag( v2f_img i ) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 b = tex2D( _B, i.uv ); + + return a * b; + } + ENDCG + } + + Pass //3 + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + + float4 frag( v2f_img i ) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 b = tex2D( _B, i.uv ); + float4 c = tex2D( _C, i.uv ); + + return a * b * c; + } + ENDCG + } + + Pass //4 + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + + float4 frag( v2f_img i ) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 b = tex2D( _B, i.uv ); + float4 c = tex2D( _C, i.uv ); + float4 d = tex2D( _D, i.uv ); + + return a * b * c * d; + } + ENDCG + } + + Pass //5 + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + sampler2D _E; + + float4 frag( v2f_img i ) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 b = tex2D( _B, i.uv ); + float4 c = tex2D( _C, i.uv ); + float4 d = tex2D( _D, i.uv ); + float4 e = tex2D( _E, i.uv ); + + return a * b * c * d * e; + } + ENDCG + } + + Pass //6 + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + sampler2D _E; + sampler2D _F; + + float4 frag( v2f_img i ) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 b = tex2D( _B, i.uv ); + float4 c = tex2D( _C, i.uv ); + float4 d = tex2D( _D, i.uv ); + float4 e = tex2D( _E, i.uv ); + float4 f = tex2D( _F, i.uv ); + + return a * b * c * d * e * f; + } + ENDCG + } + + Pass //7 + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + sampler2D _E; + sampler2D _F; + sampler2D _G; + + float4 frag( v2f_img i ) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 b = tex2D( _B, i.uv ); + float4 c = tex2D( _C, i.uv ); + float4 d = tex2D( _D, i.uv ); + float4 e = tex2D( _E, i.uv ); + float4 f = tex2D( _F, i.uv ); + float4 g = tex2D( _G, i.uv ); + + return a * b * c * d * e * f * g; + } + ENDCG + } + + Pass //8 + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + sampler2D _E; + sampler2D _F; + sampler2D _G; + sampler2D _H; + + float4 frag( v2f_img i ) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 b = tex2D( _B, i.uv ); + float4 c = tex2D( _C, i.uv ); + float4 d = tex2D( _D, i.uv ); + float4 e = tex2D( _E, i.uv ); + float4 f = tex2D( _F, i.uv ); + float4 g = tex2D( _G, i.uv ); + float4 h = tex2D( _H, i.uv ); + + return a * b * c * d * e * f * g * h; + } + ENDCG + } + + Pass //9 + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + sampler2D _E; + sampler2D _F; + sampler2D _G; + sampler2D _H; + sampler2D _I; + + float4 frag( v2f_img i ) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 b = tex2D( _B, i.uv ); + float4 c = tex2D( _C, i.uv ); + float4 d = tex2D( _D, i.uv ); + float4 e = tex2D( _E, i.uv ); + float4 f = tex2D( _F, i.uv ); + float4 g = tex2D( _G, i.uv ); + float4 h = tex2D( _H, i.uv ); + float4 is = tex2D( _I, i.uv ); + + return a * b * c * d * e * f * g * h * is; + } + ENDCG + } + + Pass //10 + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + sampler2D _E; + sampler2D _F; + sampler2D _G; + sampler2D _H; + sampler2D _I; + sampler2D _J; + + float4 frag( v2f_img i ) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 b = tex2D( _B, i.uv ); + float4 c = tex2D( _C, i.uv ); + float4 d = tex2D( _D, i.uv ); + float4 e = tex2D( _E, i.uv ); + float4 f = tex2D( _F, i.uv ); + float4 g = tex2D( _G, i.uv ); + float4 h = tex2D( _H, i.uv ); + float4 is = tex2D( _I, i.uv ); + float4 j = tex2D( _J, i.uv ); + + return a * b * c * d * e * f * g * h * is * j; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleMultiplyOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleMultiplyOpNode.shader.meta new file mode 100644 index 0000000..721b5df --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleMultiplyOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 1ba1e43e86415ff4bbdf4d81dfcf035b +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleRemainderNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleRemainderNode.shader new file mode 100644 index 0000000..b62c655 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleRemainderNode.shader @@ -0,0 +1,29 @@ +Shader "Hidden/SimpleRemainderNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + + float4 frag( v2f_img i ) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 b = tex2D( _B, i.uv ); + return a % b; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleRemainderNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleRemainderNode.shader.meta new file mode 100644 index 0000000..1cf624d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleRemainderNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8fdfc429d6b191c4985c9531364c1a95 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleSubtractOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleSubtractOpNode.shader new file mode 100644 index 0000000..7282f97 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleSubtractOpNode.shader @@ -0,0 +1,29 @@ +Shader "Hidden/SimpleSubtractOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + + float4 frag( v2f_img i ) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 b = tex2D( _B, i.uv ); + return a - b; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleSubtractOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleSubtractOpNode.shader.meta new file mode 100644 index 0000000..8956501 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleSubtractOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 5725e8300be208449973f771ab6682f2 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleTimeNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleTimeNode.shader new file mode 100644 index 0000000..428eea6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleTimeNode.shader @@ -0,0 +1,29 @@ +Shader "Hidden/SimpleTimeNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _Count ("_Count", Int) = 0 + } + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + sampler2D _A; + float _EditorTime; + + float4 frag( v2f_img i ) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 t = _EditorTime; + return t * a.x; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleTimeNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleTimeNode.shader.meta new file mode 100644 index 0000000..2fa5654 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimpleTimeNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 45b7107d5d11f124fad92bcb1fa53661 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimplifiedFModOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimplifiedFModOpNode.shader new file mode 100644 index 0000000..8cc3d4a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimplifiedFModOpNode.shader @@ -0,0 +1,29 @@ +Shader "Hidden/SimplifiedFModOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 b = tex2D( _B, i.uv ); + return frac( a / b ) * b; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimplifiedFModOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimplifiedFModOpNode.shader.meta new file mode 100644 index 0000000..29f7167 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SimplifiedFModOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2688236fb4f37ce47b81cc818c53321d +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SinOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SinOpNode.shader new file mode 100644 index 0000000..0645bf4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SinOpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/SinOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return sin(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SinOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SinOpNode.shader.meta new file mode 100644 index 0000000..bf7ab48 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SinOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: bcd9f8749ddd3ac4f94f4c2071c1d0d4 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SinTimeNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SinTimeNode.shader new file mode 100644 index 0000000..443f807 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SinTimeNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/SinTimeNode" +{ + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float _EditorTime; + + float4 frag( v2f_img i ) : SV_Target + { + float4 t = _EditorTime; + t.x = _EditorTime / 8; + t.y = _EditorTime / 4; + t.z = _EditorTime / 2; + return sin(t); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SinTimeNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SinTimeNode.shader.meta new file mode 100644 index 0000000..2cbb3c1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SinTimeNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e4ba809e0badeb94994170b2cbbbba10 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SinhOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SinhOpNode.shader new file mode 100644 index 0000000..b1c0984 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SinhOpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/SinhOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return sinh(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SinhOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SinhOpNode.shader.meta new file mode 100644 index 0000000..e989054 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SinhOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4e9c00e6dceb4024f80d4e3d7786abad +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SmoothstepOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SmoothstepOpNode.shader new file mode 100644 index 0000000..bcfb876 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SmoothstepOpNode.shader @@ -0,0 +1,32 @@ +Shader "Hidden/SmoothstepOpNode" +{ + Properties + { + _A ("_Alpha", 2D) = "white" {} + _B ("_Min", 2D) = "white" {} + _C ("_Max", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + + float4 frag(v2f_img i) : SV_Target + { + float4 alpha = tex2D( _A, i.uv ); + float4 min = tex2D( _B, i.uv ); + float4 max = tex2D( _C, i.uv ); + return smoothstep(min, max, alpha); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SmoothstepOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SmoothstepOpNode.shader.meta new file mode 100644 index 0000000..817fd47 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SmoothstepOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 954cdd40a7a528344a0a4d3ff1db5176 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SqrtOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SqrtOpNode.shader new file mode 100644 index 0000000..b45f325 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SqrtOpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/SqrtOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return sqrt(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SqrtOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SqrtOpNode.shader.meta new file mode 100644 index 0000000..a5ab372 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SqrtOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 1791e2fbf36af084da7ecfc289e89b6e +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_StaticSwitchNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_StaticSwitchNode.shader new file mode 100644 index 0000000..4931a07 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_StaticSwitchNode.shader @@ -0,0 +1,59 @@ +Shader "Hidden/StaticSwitchNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + _C ("_C", 2D) = "white" {} + _D ("_D", 2D) = "white" {} + _E ("_E", 2D) = "white" {} + _F ("_F", 2D) = "white" {} + _G ("_G", 2D) = "white" {} + _H ("_H", 2D) = "white" {} + _I ("_I", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + sampler2D _E; + sampler2D _F; + sampler2D _G; + sampler2D _H; + sampler2D _I; + int _Condition; + + float4 frag( v2f_img i ) : SV_Target + { + if( _Condition == 0) + return tex2D( _B, i.uv ); // A nd B are switched + else if( _Condition == 1 ) + return tex2D( _A, i.uv ); + else if( _Condition == 2 ) + return tex2D( _C, i.uv ); + else if( _Condition == 3 ) + return tex2D( _D, i.uv ); + else if( _Condition == 4 ) + return tex2D( _E, i.uv ); + else if( _Condition == 5 ) + return tex2D( _F, i.uv ); + else if( _Condition == 6 ) + return tex2D( _G, i.uv ); + else if( _Condition == 7 ) + return tex2D( _H, i.uv ); + else + return tex2D( _I, i.uv ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_StaticSwitchNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_StaticSwitchNode.shader.meta new file mode 100644 index 0000000..306b981 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_StaticSwitchNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0b708c11c68e6a9478ac97fe3643eab1 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_StepOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_StepOpNode.shader new file mode 100644 index 0000000..86fdf06 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_StepOpNode.shader @@ -0,0 +1,29 @@ +Shader "Hidden/StepOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + + float4 frag( v2f_img i ) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 b = tex2D( _B, i.uv ); + return step(a, b); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_StepOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_StepOpNode.shader.meta new file mode 100644 index 0000000..a23d36d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_StepOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2c757add7f97ecd4abd9ce6ec4659697 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SubstanceSamplerNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SubstanceSamplerNode.shader new file mode 100644 index 0000000..86a2adc --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SubstanceSamplerNode.shader @@ -0,0 +1,53 @@ +Shader "Hidden/SubstanceSamplerNode" +{ + Properties + { + _A ("_UV", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _GenTex; + int _CustomUVs; + + float4 frag( v2f_img i ) : SV_Target + { + float2 uvs = i.uv; + if( _CustomUVs == 1 ) + uvs = tex2D( _A, i.uv ).xy; + float4 genTex = tex2D( _GenTex, uvs); + return genTex; + } + ENDCG + } + + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _GenTex; + int _CustomUVs; + + float4 frag( v2f_img i ) : SV_Target + { + float2 uvs = i.uv; + if( _CustomUVs == 1 ) + uvs = tex2D( _A, i.uv ).xy; + float3 genTex = UnpackNormal( tex2D( _GenTex, uvs ) ); + return float4( genTex, 0 ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SubstanceSamplerNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SubstanceSamplerNode.shader.meta new file mode 100644 index 0000000..322d784 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SubstanceSamplerNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6f322c1da33f1e744941aafcb0ad1a2d +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SummedBlendNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SummedBlendNode.shader new file mode 100644 index 0000000..4f3b670 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SummedBlendNode.shader @@ -0,0 +1,85 @@ +Shader "Hidden/SummedBlendNode" +{ + Properties + { + _A ( "_Weights", 2D) = "white" {} + _B ( "_Layer1", 2D) = "white" {} + _C ( "_Layer2", 2D ) = "white" {} + _D ( "_Layer3", 2D ) = "white" {} + _E ( "_Layer4", 2D ) = "white" {} + } + + SubShader + { + + CGINCLUDE + + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + sampler2D _A; + sampler2D _B; + + ENDCG + + Pass + { + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 Weights = tex2D ( _A, i.uv ); + float4 Layer1 = tex2D( _B, i.uv ); + return Weights*Layer1; + } + ENDCG + } + + Pass + { + CGPROGRAM + sampler2D _C; + float4 frag ( v2f_img i ) : SV_Target + { + float4 Weights = tex2D ( _A, i.uv ); + float4 Layer1 = tex2D ( _B, i.uv ); + float4 Layer2 = tex2D ( _C, i.uv ); + return ( Weights.x*Layer1 + Weights.y*Layer2 ); + } + ENDCG + } + + Pass + { + CGPROGRAM + sampler2D _C; + sampler2D _D; + float4 frag ( v2f_img i ) : SV_Target + { + float4 Weights = tex2D( _A, i.uv ); + float4 Layer1 = tex2D( _B, i.uv ); + float4 Layer2 = tex2D( _C, i.uv ); + float4 Layer3 = tex2D( _D, i.uv ); + return ( Weights.x*Layer1 + Weights.y*Layer2 + Weights.z*Layer3 ); + } + ENDCG + } + + Pass + { + CGPROGRAM + sampler2D _C; + sampler2D _D; + sampler2D _E; + float4 frag ( v2f_img i ) : SV_Target + { + float4 Weights = tex2D ( _A, i.uv ); + float4 Layer1 = tex2D ( _B, i.uv ); + float4 Layer2 = tex2D ( _C, i.uv ); + float4 Layer3 = tex2D ( _D, i.uv ); + float4 Layer4 = tex2D ( _E, i.uv ); + return ( Weights.x*Layer1 + Weights.y*Layer2 + Weights.z*Layer3 + Weights.w*Layer4 ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SummedBlendNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SummedBlendNode.shader.meta new file mode 100644 index 0000000..700d2e6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SummedBlendNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: eda18b96e13f78b49bbdaa4da3fead19 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SwitchByFaceNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SwitchByFaceNode.shader new file mode 100644 index 0000000..0f8176c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SwitchByFaceNode.shader @@ -0,0 +1,29 @@ +Shader "Hidden/SwitchByFaceNode" +{ + Properties + { + _A ("_Front", 2D) = "white" {} + _B ("_Back", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + + float4 frag( v2f_img i, half ase_vface : VFACE ) : SV_Target + { + float4 front = tex2D( _A, i.uv ); + float4 back = tex2D( _B, i.uv ); + return ( ( ase_vface > 0 ) ? ( front ) : ( back ) ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SwitchByFaceNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SwitchByFaceNode.shader.meta new file mode 100644 index 0000000..1dbf813 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SwitchByFaceNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f4edf6febb54dc743b25bd5b56facea8 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SwitchNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SwitchNode.shader new file mode 100644 index 0000000..d797872 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SwitchNode.shader @@ -0,0 +1,59 @@ +Shader "Hidden/SwitchNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + _C ("_C", 2D) = "white" {} + _D ("_D", 2D) = "white" {} + _E ("_E", 2D) = "white" {} + _F ("_F", 2D) = "white" {} + _G ("_G", 2D) = "white" {} + _H ("_H", 2D) = "white" {} + _I ("_I", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + sampler2D _E; + sampler2D _F; + sampler2D _G; + sampler2D _H; + sampler2D _I; + float _Current; + + float4 frag( v2f_img i ) : SV_Target + { + if( _Current == 0 ) + return tex2D( _A, i.uv ); + else if( _Current == 1 ) + return tex2D( _B, i.uv ); + else if( _Current == 2 ) + return tex2D( _C, i.uv ); + else if( _Current == 3 ) + return tex2D( _D, i.uv ); + else if( _Current == 4 ) + return tex2D( _E, i.uv ); + else if( _Current == 5 ) + return tex2D( _F, i.uv ); + else if( _Current == 6 ) + return tex2D( _G, i.uv ); + else if( _Current == 7 ) + return tex2D( _H, i.uv ); + else + return tex2D( _I, i.uv ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SwitchNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SwitchNode.shader.meta new file mode 100644 index 0000000..8319d2a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SwitchNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a58e46feaa5e3d14383bfeac24d008bc +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SwizzleNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SwizzleNode.shader new file mode 100644 index 0000000..9433c79 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SwizzleNode.shader @@ -0,0 +1,3103 @@ +Shader "Hidden/SwizzleNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _Mask("_Mask", Vector) = (0,0,0,0) + } + SubShader + { + CGINCLUDE + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + + float4 _Mask; + ENDCG + /////////////////////////////////////////////////////////////////////////////// + Pass + { + Name "xxxx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.x,a.x,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "xxxy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.x,a.x,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "xxxz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.x,a.x,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "xxxw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.x,a.x,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "xxyx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.x,a.y,a.x)*_Mask; + } + ENDCG + } + + + Pass + { + Name "xxyy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.x,a.y,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "xxyz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.x,a.y,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "xxyw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.x,a.y,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "xxzx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.x,a.z,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "xxzy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.x,a.z,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "xxzz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.x,a.z,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "xxzw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.x,a.z,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "xxwx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.x,a.w,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "xxwy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.x,a.w,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "xxwz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.x,a.w,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "xxww" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.x,a.w,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "xyxx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.y,a.x,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "xyxy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.y,a.x,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "xyxz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.y,a.x,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "xyxw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.y,a.x,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "xyyx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.y,a.y,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "xyyy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.y,a.y,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "xyyz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.y,a.y,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "xyyw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.y,a.y,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "xyzx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.y,a.z,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "xyzy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.y,a.z,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "xyzz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.y,a.z,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "xyzw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.y,a.z,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "xywx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.y,a.w,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "xywy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.y,a.w,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "xywz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.y,a.w,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "xyww" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.y,a.w,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "xzxx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.z,a.x,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "xzxy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.z,a.x,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "xzxz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.z,a.x,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "xzxw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.z,a.x,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "xzyx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.z,a.y,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "xzyy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.z,a.y,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "xzyz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.z,a.y,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "xzyw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.z,a.y,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "xzzx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.z,a.z,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "xzzy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.z,a.z,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "xzzz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.z,a.z,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "xzzw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.z,a.z,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "xzwx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.z,a.w,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "xzwy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.z,a.w,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "xzwz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.z,a.w,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "xzww" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.z,a.w,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "xwxx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.w,a.x,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "xwxy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.w,a.x,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "xwxz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.w,a.x,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "xwxw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.w,a.x,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "xwyx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.w,a.y,a.x)*_Mask; + } + ENDCG + } + + + Pass + { + Name "xwyy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.w,a.y,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "xwyz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.w,a.y,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "xwyw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.w,a.y,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "xwzx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.w,a.z,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "xwzy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.w,a.z,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "xwzz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.w,a.z,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "xwzw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.w,a.z,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "xwwx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.w,a.w,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "xwwy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.w,a.w,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "xwwz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.w,a.w,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "xwww" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.x,a.w,a.w,a.w)*_Mask; + } + ENDCG + } + /////////////////////////////////////////////////////////////////////////////// + Pass + { + Name "yxxx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.x,a.x,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "yxxy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.x,a.x,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "yxxz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.x,a.x,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "yxxw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.x,a.x,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "yxyx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.x,a.y,a.x)*_Mask; + } + ENDCG + } + + + Pass + { + Name "yxyy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.x,a.y,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "yxyz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.x,a.y,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "yxyw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.x,a.y,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "yxzx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.x,a.z,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "yxzy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.x,a.z,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "yxzz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.x,a.z,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "yxzw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.x,a.z,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "yxwx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.x,a.w,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "yxwy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.x,a.w,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "yxwz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.x,a.w,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "yxww" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.x,a.w,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "yyxx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.y,a.x,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "yyxy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.y,a.x,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "yyxz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.y,a.x,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "yyxw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.y,a.x,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "yyyx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.y,a.y,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "yyyy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.y,a.y,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "yyyz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.y,a.y,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "yyyw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.y,a.y,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "yyzx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.y,a.z,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "yyzy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.y,a.z,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "yyzz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.y,a.z,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "yyzw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.y,a.z,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "yywx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.y,a.w,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "yywy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.y,a.w,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "yywz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.y,a.w,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "yyww" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.y,a.w,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "yzxx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.z,a.x,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "yzxy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.z,a.x,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "yzxz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.z,a.x,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "yzxw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.z,a.x,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "yzyx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.z,a.y,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "yzyy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.z,a.y,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "yzyz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.z,a.y,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "yzyw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.z,a.y,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "yzzx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.z,a.z,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "yzzy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.z,a.z,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "yzzz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.z,a.z,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "yzzw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.z,a.z,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "yzwx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.z,a.w,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "yzwy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.z,a.w,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "yzwz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.z,a.w,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "yzww" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.z,a.w,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "ywxx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.w,a.x,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "ywxy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.w,a.x,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "ywxz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.w,a.x,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "ywxw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.w,a.x,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "ywyx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.w,a.y,a.x)*_Mask; + } + ENDCG + } + + + Pass + { + Name "ywyy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.w,a.y,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "ywyz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.w,a.y,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "ywyw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.w,a.y,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "ywzx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.w,a.z,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "ywzy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.w,a.z,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "ywzz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.w,a.z,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "ywzw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.w,a.z,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "ywwx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.w,a.w,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "ywwy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.w,a.w,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "ywwz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.w,a.w,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "ywww" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.y,a.w,a.w,a.w)*_Mask; + } + ENDCG + } + /////////////////////////////////////////////////////////////////////////////// + Pass + { + Name "zxxx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.x,a.x,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "zxxy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.x,a.x,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "zxxz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.x,a.x,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "zxxw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.x,a.x,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "zxyx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.x,a.y,a.x)*_Mask; + } + ENDCG + } + + + Pass + { + Name "zxyy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.x,a.y,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "zxyz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.x,a.y,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "zxyw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.x,a.y,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "zxzx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.x,a.z,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "zxzy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.x,a.z,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "zxzz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.x,a.z,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "zxzw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.x,a.z,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "zxwx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.x,a.w,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "zxwy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.x,a.w,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "zxwz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.x,a.w,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "zxww" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.x,a.w,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "zyxx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.y,a.x,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "zyxy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.y,a.x,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "zyxz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.y,a.x,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "zyxw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.y,a.x,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "zyyx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.y,a.y,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "zyyy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.y,a.y,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "zyyz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.y,a.y,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "zyyw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.y,a.y,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "zyzx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.y,a.z,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "zyzy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.y,a.z,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "zyzz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.y,a.z,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "zyzw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.y,a.z,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "zywx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.y,a.w,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "zywy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.y,a.w,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "zywz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.y,a.w,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "zyww" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.y,a.w,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "zzxx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.z,a.x,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "zzxy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.z,a.x,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "zzxz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.z,a.x,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "zzxw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.z,a.x,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "zzyx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.z,a.y,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "zzyy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.z,a.y,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "zzyz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.z,a.y,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "zzyw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.z,a.y,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "zzzx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.z,a.z,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "zzzy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.z,a.z,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "zzzz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.z,a.z,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "zzzw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.z,a.z,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "zzwx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.z,a.w,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "zzwy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.z,a.w,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "zzwz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.z,a.w,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "zzww" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.z,a.w,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "zwxx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.w,a.x,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "zwxy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.w,a.x,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "zwxz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.w,a.x,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "zwxw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.w,a.x,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "zwyx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.w,a.y,a.x)*_Mask; + } + ENDCG + } + + + Pass + { + Name "zwyy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.w,a.y,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "zwyz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.w,a.y,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "zwyw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.w,a.y,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "zwzx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.w,a.z,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "zwzy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.w,a.z,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "zwzz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.w,a.z,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "zwzw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.w,a.z,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "zwwx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.w,a.w,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "zwwy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.w,a.w,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "zwwz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.w,a.w,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "zwww" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.z,a.w,a.w,a.w)*_Mask; + } + ENDCG + } + /////////////////////////////////////////////////////////////////////////////// + Pass + { + Name "wxxx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.x,a.x,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "wxxy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.x,a.x,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "wxxz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.x,a.x,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "wxxw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.x,a.x,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "wxyx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.x,a.y,a.x)*_Mask; + } + ENDCG + } + + + Pass + { + Name "wxyy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.x,a.y,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "wxyz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.x,a.y,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "wxyw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.x,a.y,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "wxzx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.x,a.z,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "wxzy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.x,a.z,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "wxzz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.x,a.z,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "wxzw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.x,a.z,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "wxwx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.x,a.w,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "wxwy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.x,a.w,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "wxwz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.x,a.w,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "wxww" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.x,a.w,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "wyxx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.y,a.x,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "wyxy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.y,a.x,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "wyxz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.y,a.x,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "wyxw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.y,a.x,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "wyyx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.y,a.y,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "wyyy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.y,a.y,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "wyyz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.y,a.y,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "wyyw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.y,a.y,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "wyzx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.y,a.z,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "wyzy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.y,a.z,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "wyzz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.y,a.z,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "wyzw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.y,a.z,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "wywx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.y,a.w,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "wywy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.y,a.w,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "wywz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.y,a.w,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "wyww" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.y,a.w,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "wzxx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.z,a.x,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "wzxy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.z,a.x,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "wzxz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.z,a.x,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "wzxw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.z,a.x,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "wzyx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.z,a.y,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "wzyy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.z,a.y,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "wzyz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.z,a.y,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "wzyw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.z,a.y,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "wzzx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.z,a.z,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "wzzy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.z,a.z,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "wzzz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.z,a.z,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "wzzw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.z,a.z,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "wzwx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.z,a.w,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "wzwy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.z,a.w,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "wzwz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.z,a.w,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "wzww" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.z,a.w,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "wwxx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.w,a.x,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "wwxy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.w,a.x,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "wwxz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.w,a.x,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "wwxw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.w,a.x,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "wwyx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.w,a.y,a.x)*_Mask; + } + ENDCG + } + + + Pass + { + Name "wwyy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.w,a.y,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "wwyz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.w,a.y,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "wwyw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.w,a.y,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "wwzx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.w,a.z,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "wwzy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.w,a.z,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "wwzz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.w,a.z,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "wwzw" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.w,a.z,a.w)*_Mask; + } + ENDCG + } + + Pass + { + Name "wwwx" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.w,a.w,a.x)*_Mask; + } + ENDCG + } + + Pass + { + Name "wwwy" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.w,a.w,a.y)*_Mask; + } + ENDCG + } + + Pass + { + Name "wwwz" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.w,a.w,a.z)*_Mask; + } + ENDCG + } + + Pass + { + Name "wwww" + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 a = tex2D(_A, i.uv); + return float4(a.w,a.w,a.w,a.w)*_Mask; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SwizzleNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SwizzleNode.shader.meta new file mode 100644 index 0000000..0fdc111 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_SwizzleNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: d20531704ce28b14bafb296f291f6608 +timeCreated: 1510580676 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareEqual.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareEqual.shader new file mode 100644 index 0000000..83bf4a8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareEqual.shader @@ -0,0 +1,35 @@ +Shader "Hidden/TFHCCompareEqual" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + _C ("_True", 2D) = "white" {} + _D ( "_False", 2D ) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + + float4 frag(v2f_img i) : SV_Target + { + float A = tex2D( _A, i.uv ).x; + float B = tex2D( _B, i.uv ).x; + float4 True = tex2D( _C, i.uv ); + float4 False = tex2D ( _D, i.uv ); + return ( ( A == B ) ? True : False ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareEqual.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareEqual.shader.meta new file mode 100644 index 0000000..730c9a8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareEqual.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6904de6cf8c08e7439672390b425ab50 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareGreater.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareGreater.shader new file mode 100644 index 0000000..3c5d934 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareGreater.shader @@ -0,0 +1,35 @@ +Shader "Hidden/TFHCCompareGreater" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + _C ("_True", 2D) = "white" {} + _D ( "_False", 2D ) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + + float4 frag(v2f_img i) : SV_Target + { + float A = tex2D( _A, i.uv ).x; + float B = tex2D( _B, i.uv ).x; + float4 True = tex2D( _C, i.uv ); + float4 False = tex2D ( _D, i.uv ); + return ( ( A > B ) ? True : False ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareGreater.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareGreater.shader.meta new file mode 100644 index 0000000..bd60bd3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareGreater.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 363192dbd019ad2478f2fe6c277b7e48 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareGreaterEqual.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareGreaterEqual.shader new file mode 100644 index 0000000..9da87b1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareGreaterEqual.shader @@ -0,0 +1,35 @@ +Shader "Hidden/TFHCCompareGreaterEqual" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + _C ("_True", 2D) = "white" {} + _D ( "_False", 2D ) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + + float4 frag(v2f_img i) : SV_Target + { + float A = tex2D( _A, i.uv ).x; + float B = tex2D( _B, i.uv ).x; + float4 True = tex2D( _C, i.uv ); + float4 False = tex2D ( _D, i.uv ); + return ( ( A >= B ) ? True : False ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareGreaterEqual.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareGreaterEqual.shader.meta new file mode 100644 index 0000000..0b28956 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareGreaterEqual.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f4ff76282a117c2429a1bcd8ba3a9112 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareLessNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareLessNode.shader new file mode 100644 index 0000000..e5eb198 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareLessNode.shader @@ -0,0 +1,35 @@ +Shader "Hidden/TFHCCompareLess" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + _C ("_True", 2D) = "white" {} + _D ( "_False", 2D ) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + + float4 frag(v2f_img i) : SV_Target + { + float A = tex2D( _A, i.uv ).x; + float B = tex2D( _B, i.uv ).x; + float4 True = tex2D( _C, i.uv ); + float4 False = tex2D ( _D, i.uv ); + return ( ( A < B ) ? True : False ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareLessNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareLessNode.shader.meta new file mode 100644 index 0000000..6cca110 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareLessNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8024509244392ed44b37c28473e66a8a +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareLowerEqual.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareLowerEqual.shader new file mode 100644 index 0000000..be9b7f0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareLowerEqual.shader @@ -0,0 +1,35 @@ +Shader "Hidden/TFHCCompareLessEqual" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + _C ("_True", 2D) = "white" {} + _D ( "_False", 2D ) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + + float4 frag(v2f_img i) : SV_Target + { + float A = tex2D( _A, i.uv ).x; + float B = tex2D( _B, i.uv ).x; + float4 True = tex2D( _C, i.uv ); + float4 False = tex2D ( _D, i.uv ); + return ( ( A <= B ) ? True : False ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareLowerEqual.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareLowerEqual.shader.meta new file mode 100644 index 0000000..471968d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareLowerEqual.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 9a3e17508793b9d42b1efaaf5bcd2554 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareNotEqual.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareNotEqual.shader new file mode 100644 index 0000000..b40f85e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareNotEqual.shader @@ -0,0 +1,35 @@ +Shader "Hidden/TFHCCompareNotEqual" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + _C ("_True", 2D) = "white" {} + _D ( "_False", 2D ) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + + float4 frag(v2f_img i) : SV_Target + { + float A = tex2D( _A, i.uv ).x; + float B = tex2D( _B, i.uv ).x; + float4 True = tex2D( _C, i.uv ); + float4 False = tex2D ( _D, i.uv ); + return ( ( A != B ) ? True : False ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareNotEqual.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareNotEqual.shader.meta new file mode 100644 index 0000000..44e64f9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareNotEqual.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 75f433376eef1ad4a881d99124e08008 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareWithRange.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareWithRange.shader new file mode 100644 index 0000000..516727f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareWithRange.shader @@ -0,0 +1,38 @@ +Shader "Hidden/TFHCCompareWithRange" +{ + Properties + { + _A ("_Value", 2D) = "white" {} + _B ("_RangeMin", 2D) = "white" {} + _C ("_RangeMax", 2D) = "white" {} + _D ( "_True", 2D ) = "white" {} + _E ( "_False", 2D ) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + sampler2D _E; + + float4 frag(v2f_img i) : SV_Target + { + float4 Value = tex2D( _A, i.uv ).x; + float4 RangeMin = tex2D( _B, i.uv ).x; + float4 RangeMax = tex2D( _C, i.uv ); + float4 True = tex2D ( _D, i.uv ); + float4 False = tex2D ( _E, i.uv ); + return ( ( Value >= RangeMin && Value <= RangeMax ) ? True : False ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareWithRange.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareWithRange.shader.meta new file mode 100644 index 0000000..65b4bf6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCCompareWithRange.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 127d114eed178d7409f900134a6c00d1 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCFlipBookUVAnimation.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCFlipBookUVAnimation.shader new file mode 100644 index 0000000..a377898 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCFlipBookUVAnimation.shader @@ -0,0 +1,89 @@ +Shader "Hidden/TFHCFlipBookUVAnimation" +{ + Properties + { + _A ("_UV", 2D) = "white" {} + _B ("_Columns", 2D) = "white" {} + _C ("_Rows", 2D) = "white" {} + _D ("_Speed", 2D) = "white" {} + _E ("_StartFrame", 2D) = "white" {} + _F ("_Speed", 2D) = "white" {} + } + SubShader + { + CGINCLUDE + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + sampler2D _E; + sampler2D _F; + float _EditorTime; + ENDCG + + //Time port disconnected + Pass + { + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float2 uv = tex2D( _A, i.uv ).rg; + float col = tex2D( _B, i.uv ).r; + float row = tex2D( _C, i.uv ).r; + float spd = tex2D( _D, i.uv ).r; + float str = tex2D( _E, i.uv ).r; + + float fbtotaltiles = col * row; + float fbcolsoffset = 1.0f / col; + float fbrowsoffset = 1.0f / row; + float fbspeed = _EditorTime * spd; + float2 fbtiling = float2(fbcolsoffset, fbrowsoffset); + float fbcurrenttileindex = round( fmod( fbspeed + str, fbtotaltiles) ); + fbcurrenttileindex += ( fbcurrenttileindex < 0) ? fbtotaltiles : 0; + float fblinearindextox = round ( fmod ( fbcurrenttileindex, col ) ); + float fboffsetx = fblinearindextox * fbcolsoffset; + float fblinearindextoy = round( fmod( ( fbcurrenttileindex - fblinearindextox ) / col, row ) ); + fblinearindextoy = (int)(row-1) - fblinearindextoy; + float fboffsety = fblinearindextoy * fbrowsoffset; + float2 fboffset = float2(fboffsetx, fboffsety); + float2 fbuv = float4( uv, 0.0 , 0.0 ) * fbtiling + fboffset; + return float4(fbuv, 0 , 0); + } + ENDCG + } + + //Time port connected + Pass + { + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float2 uv = tex2D( _A, i.uv ).rg; + float col = tex2D( _B, i.uv ).r; + float row = tex2D( _C, i.uv ).r; + float spd = tex2D( _D, i.uv ).r; + float str = tex2D( _E, i.uv ).r; + float time = tex2D( _F, i.uv ).r; + float fbtotaltiles = col * row; + float fbcolsoffset = 1.0f / col; + float fbrowsoffset = 1.0f / row; + float fbspeed = time * spd; + float2 fbtiling = float2(fbcolsoffset, fbrowsoffset); + float fbcurrenttileindex = round( fmod( fbspeed + str, fbtotaltiles) ); + fbcurrenttileindex += ( fbcurrenttileindex < 0) ? fbtotaltiles : 0; + float fblinearindextox = round ( fmod ( fbcurrenttileindex, col ) ); + float fboffsetx = fblinearindextox * fbcolsoffset; + float fblinearindextoy = round( fmod( ( fbcurrenttileindex - fblinearindextox ) / col, row ) ); + fblinearindextoy = (int)(row-1) - fblinearindextoy; + float fboffsety = fblinearindextoy * fbrowsoffset; + float2 fboffset = float2(fboffsetx, fboffsety); + float2 fbuv = float4( uv, 0.0 , 0.0 ) * fbtiling + fboffset; + return float4(fbuv, 0 , 0); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCFlipBookUVAnimation.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCFlipBookUVAnimation.shader.meta new file mode 100644 index 0000000..9f79680 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCFlipBookUVAnimation.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 04fe24be792bfd5428b92132d7cf0f7d +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCIf.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCIf.shader new file mode 100644 index 0000000..fb605cb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCIf.shader @@ -0,0 +1,41 @@ +Shader "Hidden/TFHCIf" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + _C ("_AGreaterB", 2D) = "white" {} + _D ( "_AEqualsB", 2D ) = "white" {} + _E ( "_ALessB", 2D ) = "white" {} + _F ( "_EqualThreshold", 2D ) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + sampler2D _E; + sampler2D _F; + + float4 frag(v2f_img i) : SV_Target + { + float4 A = tex2D( _A, i.uv ).x; + float4 B = tex2D( _B, i.uv ).x; + float4 AGreaterB = tex2D( _C, i.uv ); + float4 AEqualsB = tex2D ( _D, i.uv ); + float4 ALessB = tex2D ( _E, i.uv ); + float4 EqualThreshold = tex2D ( _F, i.uv ); + return ( A - EqualThreshold > B ? AGreaterB : A - EqualThreshold <= B && A + EqualThreshold >= B ? AEqualsB : ALessB ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCIf.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCIf.shader.meta new file mode 100644 index 0000000..5d18716 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCIf.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 5c7bc7e3cab81da499e4864ace0d86c5 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCPixelateUV.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCPixelateUV.shader new file mode 100644 index 0000000..f9d3d8a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCPixelateUV.shader @@ -0,0 +1,35 @@ +Shader "Hidden/TFHCPixelateUV" +{ + Properties + { + _A ("_UV", 2D) = "white" {} + _B ("_PixelX", 2D) = "white" {} + _C ("_PixelY", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + + float4 frag(v2f_img i) : SV_Target + { + float2 uv = tex2D( _A, i.uv ).rg; + float pix = tex2D( _B, i.uv ).r; + float piy = tex2D( _C, i.uv ).r; + + float2 steppedPixel = float2( pix, piy ); + float2 pixelatedUV = floor( uv * steppedPixel ) / steppedPixel; + return float4(pixelatedUV, 0 , 0); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCPixelateUV.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCPixelateUV.shader.meta new file mode 100644 index 0000000..bfaaa63 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCPixelateUV.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e2f7e3c513ed18340868b8cbd0d85cfb +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCRemap.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCRemap.shader new file mode 100644 index 0000000..bf10c8a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCRemap.shader @@ -0,0 +1,49 @@ +Shader "Hidden/TFHCRemap" +{ + Properties + { + _A ("_Value", 2D) = "white" {} + _B ("_MinOld", 2D) = "white" {} + _C ("_MaxOld", 2D) = "white" {} + _D ("_MinNew", 2D) = "white" {} + _E ("_MaxNew", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + sampler2D _E; + + float4 frag(v2f_img i) : SV_Target + { + float4 value = tex2D( _A, i.uv ); + float4 minold = tex2D( _B, i.uv ); + float4 maxold = tex2D( _C, i.uv ); + float4 minnew = tex2D( _D, i.uv ); + float4 maxnew = tex2D( _E, i.uv ); + + float4 denom = maxold - minold; + if(denom.x == 0) + denom.x = 0.000001; + if(denom.y == 0) + denom.y = 0.000001; + if(denom.z == 0) + denom.z = 0.000001; + if(denom.w == 0) + denom.w = 0.000001; + + return (minnew + (value - minold) * (maxnew - minnew) / denom); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCRemap.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCRemap.shader.meta new file mode 100644 index 0000000..8ebceb4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TFHCRemap.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 72dd1cbea889fa047b929d5191e360c0 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TanOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TanOpNode.shader new file mode 100644 index 0000000..475be37 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TanOpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/TanOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return tan(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TanOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TanOpNode.shader.meta new file mode 100644 index 0000000..f7a22d2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TanOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 312e291832cac5749a3626547dfc8607 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TangentSignVertexDataNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TangentSignVertexDataNode.shader new file mode 100644 index 0000000..c84d7f2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TangentSignVertexDataNode.shader @@ -0,0 +1,31 @@ +Shader "Hidden/TangentVertexDataNode" +{ + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float4 frag( v2f_img i ) : SV_Target + { + //float2 tp = 2 * i.uv - 1; + //float tr = sqrt( dot(tp,tp) ); + //tr = saturate( tr ); + + //float2 tuvs; + //float f = ( 1 - sqrt( 1 - tr ) ) / tr; + + //float3 tangent = normalize(float3( (1-f)*2, tp.y*0.01, tp.x )); + + //float4((tangent), 1); + + //TODO: needs revision at some point + return -1; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TangentSignVertexDataNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TangentSignVertexDataNode.shader.meta new file mode 100644 index 0000000..15b2740 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TangentSignVertexDataNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f5466d126f4bb1f49917eac88b1cb6af +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TangentVertexDataNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TangentVertexDataNode.shader new file mode 100644 index 0000000..e465eaf --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TangentVertexDataNode.shader @@ -0,0 +1,22 @@ +Shader "Hidden/TangentVertexDataNode" +{ + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float4 frag( v2f_img i ) : SV_Target + { + float2 xy = 2 * i.uv - 1; + float z = -sqrt(1-saturate(dot(xy,xy))); + float3 tangent = normalize(float3( -z, xy.y*0.01, xy.x )); + return float4((tangent), 1); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TangentVertexDataNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TangentVertexDataNode.shader.meta new file mode 100644 index 0000000..f3c7c38 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TangentVertexDataNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0a44bb521d06d6143a4acbc3602037f8 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TanhOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TanhOpNode.shader new file mode 100644 index 0000000..f4c54f8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TanhOpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/TanhOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return tanh(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TanhOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TanhOpNode.shader.meta new file mode 100644 index 0000000..b3565b6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TanhOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 52f78d3a1c66d1c489cd63b0a9300b38 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TauNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TauNode.shader new file mode 100644 index 0000000..4bd66c5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TauNode.shader @@ -0,0 +1,19 @@ +Shader "Hidden/TauNode" +{ + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + float4 frag(v2f_img i) : SV_Target + { + return UNITY_PI * 2; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TauNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TauNode.shader.meta new file mode 100644 index 0000000..e46f21a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TauNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 701bc295c0d75d8429eabcf45e8e008d +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TemplateShaderProperty.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TemplateShaderProperty.shader new file mode 100644 index 0000000..9285b9b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TemplateShaderProperty.shader @@ -0,0 +1,47 @@ +Shader "Hidden/TemplateShaderProperty" +{ + Properties + { + [HideFromInspector]_IntData ( "_IntData", Int ) = 0 + [HideFromInspector]_FloatData ( "_FloatData", Float ) = 0 + [HideFromInspector]_VectorData ( "_VectorData", Vector ) = ( 0,0,0,0 ) + [HideFromInspector]_Sampler2DData ( "_Sampler2DData", 2D ) = "white" {} + [HideFromInspector]_Sampler3DData ( "_Sampler3DData", 3D ) = "white" {} + [HideFromInspector]_SamplerCubeData ( "_SamplerCubeData", Cube ) = "white" {} + } + + CGINCLUDE + #include "UnityCG.cginc" + uniform int _IntData; + uniform float _FloatData; + uniform float4 _VectorData; + uniform sampler2D _Sampler2DData; + uniform sampler3D _Sampler3DData; + uniform samplerCUBE _SamplerCubeData; + + #pragma vertex vert_img + #pragma fragment frag + + float4 CalculatePreviewColor ( v2f_img i, const int dataType ) + { + /*Int*/ if ( dataType == 0 ) return float4( _IntData.xxx,1); + /*Float*/ if ( dataType == 1 ) return float4( _FloatData.xxx, 1 ); + /*Vector4/Color*/ if ( dataType == 2 ) return _VectorData; + /*Sampler 2D*/ if ( dataType == 3 ) return tex2D ( _Sampler2DData, i.uv ); + /*Sampler 3D*/ if ( dataType == 4 ) return tex3D ( _Sampler3DData, float3( i.uv, 0.0 ) ); + /*Sampler Cube*/ if ( dataType == 5 ) return texCUBE ( _SamplerCubeData, float3( i.uv, 0.0 ) ); + return (0).xxxx; + } + + ENDCG + + SubShader + { + Pass{ CGPROGRAM float4 frag ( v2f_img i ) : SV_Target { return CalculatePreviewColor(i,0); } ENDCG } + Pass{ CGPROGRAM float4 frag ( v2f_img i ) : SV_Target { return CalculatePreviewColor(i,1); } ENDCG } + Pass{ CGPROGRAM float4 frag ( v2f_img i ) : SV_Target { return CalculatePreviewColor(i,2); } ENDCG } + Pass{ CGPROGRAM float4 frag ( v2f_img i ) : SV_Target { return CalculatePreviewColor(i,3); } ENDCG } + Pass{ CGPROGRAM float4 frag ( v2f_img i ) : SV_Target { return CalculatePreviewColor(i,4); } ENDCG } + Pass{ CGPROGRAM float4 frag ( v2f_img i ) : SV_Target { return CalculatePreviewColor(i,5); } ENDCG } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TemplateShaderProperty.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TemplateShaderProperty.shader.meta new file mode 100644 index 0000000..4a4090d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TemplateShaderProperty.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 4feb2016be0ece148b8bf234508f6aa4 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TexCoordVertexDataNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TexCoordVertexDataNode.shader new file mode 100644 index 0000000..e03aca7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TexCoordVertexDataNode.shader @@ -0,0 +1,19 @@ +Shader "Hidden/TexCoordVertexDataNode" +{ + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + float4 frag( v2f_img i ) : SV_Target + { + return float4( i.uv, 0, 0 ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TexCoordVertexDataNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TexCoordVertexDataNode.shader.meta new file mode 100644 index 0000000..01ddea9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TexCoordVertexDataNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6c1bee77276896041bbb73b1b9e7f8ac +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TexelSize.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TexelSize.shader new file mode 100644 index 0000000..b3e43ff --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TexelSize.shader @@ -0,0 +1,80 @@ +Shader "Hidden/TexelSize" +{ + Properties + { + _Sampler ("_Sampler", 2D) = "white" {} + _Sampler3D ("_Sampler3D", 3D) = "white" {} + _Array ("_Array", 2DArray) = "white" {} + _Cube ("_Cube", CUBE) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _Sampler; + float4 _Sampler_TexelSize; + + float4 frag( v2f_img i ) : SV_Target + { + return _Sampler_TexelSize; + } + ENDCG + } + + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler3D _Sampler3D; + float4 _Sampler3D_TexelSize; + + float4 frag (v2f_img i) : SV_Target + { + return _Sampler3D_TexelSize; + } + ENDCG + } + + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + UNITY_DECLARE_TEX2DARRAY (_Array); + float4 _Array_TexelSize; + + float4 frag (v2f_img i) : SV_Target + { + return _Array_TexelSize; + } + ENDCG + } + + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + samplerCUBE _Cube; + float4 _Cube_TexelSize; + + float4 frag (v2f_img i) : SV_Target + { + return _Cube_TexelSize; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TexelSize.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TexelSize.shader.meta new file mode 100644 index 0000000..b4773e8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TexelSize.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6b20226576a059443b58aa2d0b942276 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Texture2D.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Texture2D.shader new file mode 100644 index 0000000..b1f48be --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Texture2D.shader @@ -0,0 +1,19 @@ +Shader "Hidden/Texture2D" +{ + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + float4 frag( v2f_img i ) : SV_Target + { + return 0; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Texture2D.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Texture2D.shader.meta new file mode 100644 index 0000000..9297922 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Texture2D.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 13bd295c44d04e1419f20f792d331e33 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TextureArrayNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TextureArrayNode.shader new file mode 100644 index 0000000..9b9c8be --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TextureArrayNode.shader @@ -0,0 +1,63 @@ +Shader "Hidden/TextureArrayNode" +{ + Properties + { + _A ("_UVs", 2D) = "white" {} + _B ("_Index", 2D) = "white" {} + _C ("_Lod", 2D) = "white" {} + _D ("_NormalScale", 2D) = "white" {} + _G ("_Tex", 2D) = "white" {} + _TexConnected ("_TexConnected", Int) = 0 + } + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #pragma target 3.5 + #include "UnityCG.cginc" + #include "UnityStandardUtils.cginc" + + uniform UNITY_DECLARE_TEX2DARRAY( _Sampler ); + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + sampler2D _G; + float _CustomUVs; + float _LodType; + float _Unpack; + int _TexConnected; + + float4 frag( v2f_img i ) : SV_Target + { + float2 uvs = i.uv; + if ( _CustomUVs == 1 ) + uvs = tex2D( _A, i.uv ).xy; + + float n = tex2D( _D, i.uv ).r; + float4 c = 0; + if ( _LodType == 1 ) { + float lod = tex2D( _C, i.uv ).r; + c = UNITY_SAMPLE_TEX2DARRAY_LOD( _Sampler, float3( uvs, tex2D( _B, i.uv ).r ), lod ); + } + else if( _TexConnected == 0) { + c = UNITY_SAMPLE_TEX2DARRAY( _Sampler, float3( uvs, tex2D( _B, i.uv ).r ) ); + } + else { + c = tex2D( _G, uvs ); + } + + if ( _Unpack == 1 ) + { + c.rgb = UnpackScaleNormal(c, n); + } + + return c; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TextureArrayNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TextureArrayNode.shader.meta new file mode 100644 index 0000000..936540b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TextureArrayNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2e6d093df2d289f47b827b36efb31a81 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TextureCoordinatesNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TextureCoordinatesNode.shader new file mode 100644 index 0000000..aaa78e0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TextureCoordinatesNode.shader @@ -0,0 +1,29 @@ +Shader "Hidden/TextureCoordinatesNode" +{ + Properties + { + _A ("_Tilling", 2D) = "white" {} + _B ("_Offset", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + + float4 frag( v2f_img i ) : SV_Target + { + float4 t = tex2D( _A, i.uv ); + float4 o = tex2D( _B, i.uv ); + return float4( i.uv * t.xy + o.xy, 0, 0 ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TextureCoordinatesNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TextureCoordinatesNode.shader.meta new file mode 100644 index 0000000..656fedd --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TextureCoordinatesNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 085e462b2de441a42949be0e666cf5d2 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TexturePropertyNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TexturePropertyNode.shader new file mode 100644 index 0000000..28079d6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TexturePropertyNode.shader @@ -0,0 +1,84 @@ +Shader "Hidden/TexturePropertyNode" +{ + Properties + { + _Sampler ("_Sampler", 2D) = "white" {} + _Sampler3D ("_Sampler3D", 3D) = "white" {} + _Array ("_Array", 2DArray) = "white" {} + _Cube( "_Cube", CUBE) = "white" {} + _Default ("_Default", Int) = 0 + _Type ("_Type", Int) = 0 + } + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #pragma exclude_renderers d3d9 + #pragma target 3.5 + #include "UnityCG.cginc" + int _Default; + float4 frag( v2f_img i ) : SV_Target + { + if(_Default == 1) + { + return 1; + } + else if(_Default == 2) + { + return 0; + } + else if(_Default == 3) + { + return 0.5f; + } + else if(_Default == 4) + { + return float4(0.5,0.5,1,1); + } + + return 1; + } + ENDCG + } + + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #pragma exclude_renderers d3d9 + #pragma target 3.5 + #include "UnityCG.cginc" + + UNITY_DECLARE_TEX2DARRAY (_Array); + samplerCUBE _Cube; + sampler2D _Sampler; + sampler3D _Sampler3D; + int _Type; + + float4 frag (v2f_img i) : SV_Target + { + if (_Type == 4) + { + return UNITY_SAMPLE_TEX2DARRAY (_Array, float3(i.uv, 0)); + } + else if (_Type == 3) + { + return texCUBE (_Cube, float3(i.uv,0)); + } + else if (_Type == 2) + { + return tex3D (_Sampler3D, float3(i.uv,0)); + } + else + { + return tex2D (_Sampler, i.uv); + } + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TexturePropertyNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TexturePropertyNode.shader.meta new file mode 100644 index 0000000..c2ac2c0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TexturePropertyNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e53988745ec6e034694ee2640cd3d372 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TextureTransform.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TextureTransform.shader new file mode 100644 index 0000000..55adec1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TextureTransform.shader @@ -0,0 +1,87 @@ +Shader "Hidden/TextureTransform" +{ + Properties + { + _Sampler ("_Sampler", 2D) = "white" {} + _Sampler3D ("_Sampler3D", 3D) = "white" {} + _Array ("_Array", 2DArray) = "white" {} + _Cube ("_Cube", CUBE) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + int _PreviewID = 0; + sampler2D _Sampler; + float4 _Sampler_ST; + + float4 frag( v2f_img i ) : SV_Target + { + return _PreviewID == 0?float4(_Sampler_ST.xy,0,0): float4(_Sampler_ST.zw,0,0); + } + ENDCG + } + + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + int _PreviewID = 0; + sampler3D _Sampler3D; + float4 _Sampler3D_ST; + + float4 frag (v2f_img i) : SV_Target + { + return _Sampler3D_ST; + return _PreviewID == 0 ? float4(_Sampler3D_ST.xy, 0, 0) : float4(_Sampler3D_ST.zw, 0, 0); + } + ENDCG + } + + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + int _PreviewID = 0; + UNITY_DECLARE_TEX2DARRAY (_Array); + float4 _Array_ST; + + float4 frag (v2f_img i) : SV_Target + { + return _Array_ST; + return _PreviewID == 0 ? float4(_Array_ST.xy, 0, 0) : float4(_Array_ST.zw, 0, 0); + } + ENDCG + } + + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + int _PreviewID = 0; + samplerCUBE _Cube; + float4 _Cube_ST; + + float4 frag (v2f_img i) : SV_Target + { + return _Cube_ST; + return _PreviewID == 0 ? float4(_Cube_ST.xy, 0, 0) : float4(_Cube_ST.zw, 0, 0); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TextureTransform.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TextureTransform.shader.meta new file mode 100644 index 0000000..6d5bc4e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TextureTransform.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 25ba2903568b00343ae06788994cab54 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TimeNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TimeNode.shader new file mode 100644 index 0000000..7a5fc9e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TimeNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/TimeNode" +{ + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float _EditorTime; + + float4 frag( v2f_img i ) : SV_Target + { + float4 t = _EditorTime; + t.x = _EditorTime / 20; + t.z = _EditorTime * 2; + t.w = _EditorTime * 3; + return t; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TimeNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TimeNode.shader.meta new file mode 100644 index 0000000..43a3698 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TimeNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 73abc10c8d1399444827a7eeb9c24c2a +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ToggleSwitchNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ToggleSwitchNode.shader new file mode 100644 index 0000000..e9d0eec --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ToggleSwitchNode.shader @@ -0,0 +1,30 @@ +Shader "Hidden/ToggleSwitchNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + _B ("_B", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + sampler2D _B; + float _Current; + + float4 frag( v2f_img i ) : SV_Target + { + float4 a = tex2D( _A, i.uv ); + float4 b = tex2D( _B, i.uv ); + return lerp(a,b,_Current); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ToggleSwitchNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ToggleSwitchNode.shader.meta new file mode 100644 index 0000000..a6c388c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ToggleSwitchNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: beeb138daeb592a4887454f81dba2b3f +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TriplanarNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TriplanarNode.shader new file mode 100644 index 0000000..1b7843c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TriplanarNode.shader @@ -0,0 +1,105 @@ +Shader "Hidden/TriplanarNode" +{ + Properties + { + _A ("_TopTex", 2D) = "white" {} + _B ("_MidTex", 2D) = "white" {} + _C ("_BotTex", 2D) = "white" {} + _D ("_Tilling", 2D) = "white" {} + _E ("_Falloff", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #pragma target 3.0 + #include "UnityCG.cginc" + #include "UnityStandardUtils.cginc" + + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + sampler2D _E; + float _IsNormal; + float _IsTangent; + float _IsSpherical; + + inline float3 TriplanarSamplingCNF( sampler2D topTexMap, sampler2D midTexMap, sampler2D botTexMap, float3 worldPos, float3 worldNormal, float falloff, float tilling ) + { + float3 projNormal = ( pow( abs( worldNormal ), falloff ) ); + projNormal /= projNormal.x + projNormal.y + projNormal.z; + float3 nsign = sign( worldNormal ); + float negProjNormalY = max( 0, projNormal.y * -nsign.y ); + projNormal.y = max( 0, projNormal.y * nsign.y ); + half4 xNorm; half4 yNorm; half4 yNormN; half4 zNorm; + xNorm = ( tex2D( midTexMap, tilling * worldPos.zy * float2( nsign.x, 1.0 ) ) ); + yNorm = ( tex2D( topTexMap, tilling * worldPos.xz * float2( nsign.y, 1.0 ) ) ); + yNormN = ( tex2D( botTexMap, tilling * worldPos.xz * float2( nsign.y, 1.0 ) ) ); + zNorm = ( tex2D( midTexMap, tilling * worldPos.xy * float2( -nsign.z, 1.0 ) ) ); + xNorm.xyz = half3( UnpackNormal( xNorm ).xy * float2( nsign.x, 1.0 ) + worldNormal.zy, worldNormal.x ).zyx; + yNorm.xyz = half3( UnpackNormal( yNorm ).xy * float2( nsign.y, 1.0 ) + worldNormal.xz, worldNormal.y ).xzy; + zNorm.xyz = half3( UnpackNormal( zNorm ).xy * float2( -nsign.z, 1.0 ) + worldNormal.xy, worldNormal.z ).xyz; + yNormN.xyz = half3( UnpackNormal( yNormN ).xy * float2( nsign.y, 1.0 ) + worldNormal.xz, worldNormal.y ).xzy; + return normalize( xNorm.xyz * projNormal.x + yNorm.xyz * projNormal.y + yNormN.xyz * negProjNormalY + zNorm.xyz * projNormal.z ); + } + + inline float4 TriplanarSamplingCF( sampler2D topTexMap, sampler2D midTexMap, sampler2D botTexMap, float3 worldPos, float3 worldNormal, float falloff, float tilling ) + { + float3 projNormal = ( pow( abs( worldNormal ), falloff ) ); + projNormal /= projNormal.x + projNormal.y + projNormal.z; + float3 nsign = sign( worldNormal ); + float negProjNormalY = max( 0, projNormal.y * -nsign.y ); + projNormal.y = max( 0, projNormal.y * nsign.y ); + half4 xNorm; half4 yNorm; half4 yNormN; half4 zNorm; + xNorm = ( tex2D( midTexMap, tilling * worldPos.zy * float2( nsign.x, 1.0 ) ) ); + yNorm = ( tex2D( topTexMap, tilling * worldPos.xz * float2( nsign.y, 1.0 ) ) ); + yNormN = ( tex2D( botTexMap, tilling * worldPos.xz * float2( nsign.y, 1.0 ) ) ); + zNorm = ( tex2D( midTexMap, tilling * worldPos.xy * float2( -nsign.z, 1.0 ) ) ); + return xNorm * projNormal.x + yNorm * projNormal.y + yNormN * negProjNormalY + zNorm * projNormal.z; + } + + float4 frag( v2f_img i ) : SV_Target + { + float2 xy = 2 * i.uv - 1; + float z = -sqrt(1-saturate(dot(xy,xy))); + float3 vertexPos = float3(xy, z); + float3 normal = normalize(vertexPos); + float3 worldNormal = UnityObjectToWorldNormal(normal); + float3 worldPos = mul(unity_ObjectToWorld, vertexPos).xyz; + + float falloff = tex2D( _E, xy ).r; + float tilling = tex2D( _D, xy ).r * 0.625; + float4 triplanar = 1; + + if ( _IsNormal == 1 ) { + float3 tangent = normalize(float3( -z, xy.y*0.01, xy.x )); + float3 worldTangent = UnityObjectToWorldDir(tangent); + float tangentSign = -1; + float3 worldBinormal = normalize( cross(worldNormal, worldTangent) * tangentSign); + float3x3 worldToTangent = float3x3( worldTangent, worldBinormal, worldNormal ); + if ( _IsSpherical == 1 ) + triplanar.xyz = TriplanarSamplingCNF( _A, _A, _A, worldPos, worldNormal, falloff, tilling ); + else + triplanar.xyz = TriplanarSamplingCNF( _A, _B, _C, worldPos, worldNormal, falloff, tilling ); + + if( _IsTangent == 1 ) + triplanar.xyz = mul( worldToTangent, triplanar.xyz ); + } + else + { + if ( _IsSpherical == 1 ) + triplanar = TriplanarSamplingCF( _A, _A, _A, worldPos, worldNormal, falloff, tilling ); + else + triplanar = TriplanarSamplingCF( _A, _B, _C, worldPos, worldNormal, falloff, tilling ); + } + + return triplanar; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TriplanarNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TriplanarNode.shader.meta new file mode 100644 index 0000000..d990502 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TriplanarNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8723015ec59743143aadfbe480e34391 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TruncOpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TruncOpNode.shader new file mode 100644 index 0000000..31b23c1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TruncOpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/TruncOpNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return trunc(tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TruncOpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TruncOpNode.shader.meta new file mode 100644 index 0000000..40189d2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_TruncOpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c717aaa68f4ac9e469b15763e82933e1 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_UnpackScaleNormalNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_UnpackScaleNormalNode.shader new file mode 100644 index 0000000..72e2fcf --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_UnpackScaleNormalNode.shader @@ -0,0 +1,33 @@ +Shader "Hidden/UnpackScaleNormalNode" +{ + Properties + { + _A ("_Value", 2D) = "white" {} + _B ("_NormalScale", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #pragma target 3.0 + #include "UnityCG.cginc" + #include "UnityStandardUtils.cginc" + + sampler2D _A; + sampler2D _B; + + float4 frag( v2f_img i ) : SV_Target + { + float4 c = tex2D( _A, i.uv ); + float n = tex2D( _B, i.uv ).r; + c.rgb = UnpackScaleNormal( c, n ); + + return float4(c.rgb, 0); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_UnpackScaleNormalNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_UnpackScaleNormalNode.shader.meta new file mode 100644 index 0000000..7cf87f1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_UnpackScaleNormalNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8b0ae05e25d280c45af81ded56f8012e +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Vector2Node.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Vector2Node.shader new file mode 100644 index 0000000..4edf77f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Vector2Node.shader @@ -0,0 +1,24 @@ +Shader "Hidden/Vector2Node" +{ + Properties { + _InputVector ("_InputVector", Vector) = (0,0,0,0) + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + float4 _InputVector; + + float4 frag( v2f_img i ) : SV_Target + { + return float4(_InputVector.x,_InputVector.y,0,0); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Vector2Node.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Vector2Node.shader.meta new file mode 100644 index 0000000..b9e7d39 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Vector2Node.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 88b4191eb06084d4da85d1dd2f984085 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Vector3Node.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Vector3Node.shader new file mode 100644 index 0000000..299f3ad --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Vector3Node.shader @@ -0,0 +1,24 @@ +Shader "Hidden/Vector3Node" +{ + Properties { + _InputVector ("_InputVector", Vector) = (0,0,0,0) + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + float4 _InputVector; + + float4 frag( v2f_img i ) : SV_Target + { + return float4(_InputVector.x,_InputVector.y,_InputVector.z,0); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Vector3Node.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Vector3Node.shader.meta new file mode 100644 index 0000000..677eadc --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Vector3Node.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8a44d38f06246bf48944b3f314bc7920 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Vector4Node.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Vector4Node.shader new file mode 100644 index 0000000..044be7a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Vector4Node.shader @@ -0,0 +1,24 @@ +Shader "Hidden/Vector4Node" +{ + Properties { + _InputVector ("_InputVector", Vector) = (0,0,0,0) + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + float4 _InputVector; + + float4 frag( v2f_img i ) : SV_Target + { + return _InputVector; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Vector4Node.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Vector4Node.shader.meta new file mode 100644 index 0000000..e90efaf --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_Vector4Node.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: aac241d0e47a5a84fbd2edcd640788dc +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VertexBinormalNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VertexBinormalNode.shader new file mode 100644 index 0000000..f54cf44 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VertexBinormalNode.shader @@ -0,0 +1,31 @@ +Shader "Hidden/VertexBinormalNode" +{ + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float4 frag( v2f_img i ) : SV_Target + { + float2 xy = 2 * i.uv - 1; + float z = -sqrt(1-saturate(dot(xy,xy))); + float3 vertexPos = float3(xy, z); + float3 normal = normalize(vertexPos); + float3 worldNormal = UnityObjectToWorldNormal(normal); + + float3 tangent = normalize(float3( -z, xy.y*0.01, xy.x )); + float3 worldPos = mul(unity_ObjectToWorld, vertexPos).xyz; + float3 worldTangent = UnityObjectToWorldDir(tangent); + float tangentSign = -1; + float3 worldBinormal = normalize( cross(worldNormal, worldTangent) * tangentSign); + + return float4(worldBinormal, 1); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VertexBinormalNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VertexBinormalNode.shader.meta new file mode 100644 index 0000000..ec27e26 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VertexBinormalNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 76873532ab67d2947beaf07151383cbe +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VertexColorNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VertexColorNode.shader new file mode 100644 index 0000000..99b62ca --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VertexColorNode.shader @@ -0,0 +1,19 @@ +Shader "Hidden/VertexColorNode" +{ + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float4 frag( v2f_img i ) : SV_Target + { + return 1; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VertexColorNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VertexColorNode.shader.meta new file mode 100644 index 0000000..0ac109c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VertexColorNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ca1d22db6470c5f4d9f93a9873b4f5bc +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VertexIdVariableNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VertexIdVariableNode.shader new file mode 100644 index 0000000..a3ef76f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VertexIdVariableNode.shader @@ -0,0 +1,39 @@ +Shader "Hidden/VertexIdVariableNode" +{ + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert + #pragma fragment frag + + struct appdata_custom + { + float4 vertex : POSITION; + uint vertexId : SV_VertexID; + }; + + struct v2f_custom + { + float4 pos : SV_POSITION; + half vertexId : TEXCOORD0; + }; + + v2f_custom vert( appdata_custom v ) + { + v2f_custom o; + o.pos = UnityObjectToClipPos (v.vertex); + o.vertexId = v.vertexId; + return o; + } + + float4 frag( v2f_custom i ) : SV_Target + { + return i.vertexId; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VertexIdVariableNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VertexIdVariableNode.shader.meta new file mode 100644 index 0000000..e7ac67a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VertexIdVariableNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 5934bf2c10b127a459177a3b622cea65 +timeCreated: 1542641929 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VertexTangentNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VertexTangentNode.shader new file mode 100644 index 0000000..3769192 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VertexTangentNode.shader @@ -0,0 +1,31 @@ +Shader "Hidden/VertexTangentNode" +{ + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float4 frag( v2f_img i ) : SV_Target + { + float2 tp = 2 * i.uv - 1; + float tr = sqrt( dot(tp,tp) ); + tr = saturate( tr ); + //if ( tr < 1 ) { + float2 tuvs; + float f = ( 1 - sqrt( 1 - tr ) ) / tr; + + float3 tangent = normalize(float3( (1-f)*2, tp.y*0.01, tp.x )); + return float4((tangent), 1); + //} + //else { + // return 0; + //} + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VertexTangentNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VertexTangentNode.shader.meta new file mode 100644 index 0000000..93c49b1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VertexTangentNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 61f0b80493c9b404d8c7bf56d59c3f81 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ViewDirInputsCoordNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ViewDirInputsCoordNode.shader new file mode 100644 index 0000000..7bf6d61 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ViewDirInputsCoordNode.shader @@ -0,0 +1,57 @@ +Shader "Hidden/WorldPosInputsNode" +{ + SubShader + { + Pass //world space + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + float4 frag(v2f_img i) : SV_Target + { + float2 xy = 2 * i.uv - 1; + float z = -sqrt(1-saturate(dot(xy,xy))); + float3 vertexPos = float3(xy, z); + float3 worldViewDir = normalize(float3(0,0,-5) - vertexPos); + + return float4(worldViewDir, 1); + } + ENDCG + } + + Pass //tangent space + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + float4 frag(v2f_img i) : SV_Target + { + float2 xy = 2 * i.uv - 1; + float z = -sqrt(1-saturate(dot(xy,xy))); + float3 vertexPos = float3(xy, z); + float3 worldViewDir = normalize(float3(0,0,-5) - vertexPos); + + float3 normal = normalize(vertexPos); + float3 worldNormal = UnityObjectToWorldNormal(normal); + + float3 tangent = normalize(float3( -z, xy.y*0.01, xy.x )); + float3 worldPos = mul(unity_ObjectToWorld, float4(vertexPos,1)).xyz; + float3 worldTangent = UnityObjectToWorldDir(tangent); + float tangentSign = -1; + float3 worldBinormal = normalize( cross(worldNormal, worldTangent) * tangentSign); + float4 tSpace0 = float4(worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x); + float4 tSpace1 = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y); + float4 tSpace2 = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z); + + fixed3 viewDirTan = tSpace0.xyz * worldViewDir.x + tSpace1.xyz * worldViewDir.y + tSpace2.xyz * worldViewDir.z; + + return float4(viewDirTan, 1); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ViewDirInputsCoordNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ViewDirInputsCoordNode.shader.meta new file mode 100644 index 0000000..6fdc1d1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ViewDirInputsCoordNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 07b57d9823df4bd4d8fe6dcb29fca36a +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VoronoiNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VoronoiNode.shader new file mode 100644 index 0000000..f2c5beb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VoronoiNode.shader @@ -0,0 +1,263 @@ +Shader "Hidden/VoronoiNode" +{ + Properties + { + _A("_RGB", 2D) = "white" {} + _B("_RGB", 2D) = "white" {} + _C("_RGB", 2D) = "white" {} + _D ("_RGB", 2D) = "white" {} + _UseTileScale("_UseTileScale", Float) = 0 + _TileScale ("_TileScale", Int) = 1 + _MinkowskiPower("_MinkowskiPower", Float) = 0 + _DistFunc("_DistFunc", Int) = 0 + _MethodType("_MethodType", Int) = 0 + _SearchQuality("_SearchQuality", Int) = 1 + _Octaves("_Octaves", Int) = 1 + _UseSmoothness("_UseSmoothness", Int ) = 0 + } + SubShader + { + Tags { "RenderType"="Opaque" } + CGINCLUDE + sampler2D _A; + sampler2D _B; + sampler2D _C; + sampler2D _D; + float _UseTileScale = 0; + int _TileScale = 1; + float _MinkowskiPower = 1; + int _DistFunc = 0; + int _MethodType = 0; + int _SearchQuality = 0; + int _Octaves = 1; + int _PreviewID = 0; + int _UseSmoothness = 0; + int _CustomUVs; + + float2 VoronoiHash( float2 p ) + { + p = lerp( p, p - _TileScale * floor (p / _TileScale), _UseTileScale ); + p = float2(dot (p, float2(127.1, 311.7)), dot (p, float2(269.5, 183.3))); + return frac (sin (p) *43758.5453); + } + + float Voronoi( float2 v, float time, inout float2 id, inout float2 mr, float smoothness ) + { + float2 n = floor(v); + float2 f = frac(v); + float F1 = 8.0; + float F2 = 8.0; + float2 mg = 0; + for (int j = -_SearchQuality; j <= _SearchQuality; j++) + { + for (int i = -_SearchQuality; i <= _SearchQuality; i++) + { + float2 g = float2(i, j); + float2 o = VoronoiHash (n + g); + o = (sin (time + o * 6.2831) * 0.5 + 0.5); float2 r = f - g - o; + float d = 0; + //Euclidean^2 + if (_DistFunc == 0) + { + d = 0.5 * dot (r, r); + } + //Euclidean + else if (_DistFunc == 1) + { + d = 0.707 * sqrt (dot (r, r)); + } + //Manhattan + else if (_DistFunc == 2) + { + d = 0.5 * (abs (r.x) + abs (r.y)); + } + //Chebyshev + else if (_DistFunc == 3) + { + d = max (abs (r.x), abs (r.y)); + } + //Minkowski + else if (_DistFunc == 4) + { + d = (1 / pow(2, 1 / _MinkowskiPower)) * pow( ( pow( abs( r.x ), _MinkowskiPower) + pow( abs( r.y ), _MinkowskiPower) ), (1 / _MinkowskiPower)); + } + + if (_MethodType == 0 && _UseSmoothness == 1) + { + float h = smoothstep (0.0, 1.0, 0.5 + 0.5 * (F1 - d) / smoothness); + F1 = lerp (F1, d, h) - smoothness * h * (1.0 - h); + mg = g; mr = r; id = o; + } + else + { + if (d < F1) + { + F2 = F1; + F1 = d; mg = g; mr = r; id = o; + } + else if (d < F2) + { + F2 = d; + } + + } + + } + } + + //Cells + if(_MethodType == 0) + { + return F1; + } + //Crystal + else if (_MethodType == 1) + { + return F2; + } + //Glass + else if (_MethodType == 2) + { + return F2 - F1; + } + //Caustic + else if (_MethodType == 3) + { + return (F2 + F1) * 0.5; + } + //Distance + else if (_MethodType == 4) + { + F1 = 8.0; + for (int j = -2; j <= 2; j++) + { + for (int i = -2; i <= 2; i++) + { + float2 g = mg + float2(i, j); + float2 o = VoronoiHash (n + g); + o = ( sin (time + o * 6.2831) * 0.5 + 0.5); + float2 r = f - g - o; + float d = dot (0.5 * (mr + r), normalize (r - mr)); + F1 = min (F1, d); + } + } + return F1; + } + else + return F1; + } + + + ENDCG + + Pass // Voronoi - Unity + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + inline float2 UnityVoronoiRandomVector (float2 UV, float offset) + { + float2x2 m = float2x2(15.27, 47.63, 99.41, 89.98); + UV = frac (sin (mul (UV, m)) * 46839.32); + return float2(sin (UV.y* +offset) * 0.5 + 0.5, cos (UV.x* offset) * 0.5 + 0.5); + } + + //x - Out y - Cells + float3 UnityVoronoi (float2 UV, float AngleOffset, float CellDensity, inout float2 mr) + { + float2 g = floor (UV * CellDensity); + float2 f = frac (UV * CellDensity); + float t = 8.0; + float3 res = float3(8.0, 0.0, 0.0); + + for (int y = -1; y <= 1; y++) + { + for (int x = -1; x <= 1; x++) + { + float2 lattice = float2(x, y); + float2 offset = UnityVoronoiRandomVector (lattice + g, AngleOffset); + float d = distance (lattice + offset, f); + if (d < res.x) + { + mr = f - lattice - offset; + res = float3(d, offset.x, offset.y); + } + } + } + return res; + } + + float4 frag (v2f_img i) : SV_Target + { + float2 uvValue = i.uv; + if (_CustomUVs == 1) + uvValue = tex2D(_A, i.uv).rg; + float angleOffset = tex2D(_B, i.uv).r; + float cellDensity = tex2D(_C, i.uv).r; + float2 uv = 0; + float3 voronoiVal = UnityVoronoi( uvValue, angleOffset , cellDensity, uv ); + if( _PreviewID == 2) + return float4( uv, 0, 1 ); + else if( _PreviewID == 1) + return float4( voronoiVal.yz, 0, 1 ); + else + return float4( voronoiVal.xxx, 1); + } + ENDCG + } + + Pass // Voronoi - ASE + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + float4 frag (v2f_img i) : SV_Target + { + float2 uvValue = i.uv; + if (_CustomUVs == 1) + uvValue = tex2D(_A, i.uv).rg; + float time = tex2D (_B, i.uv).r; + float scale = tex2D (_C, i.uv).r; + float smoothness = tex2D (_D, i.uv).r; + + float2 id = 0; + float2 uv = 0; + float voronoiVal = Voronoi( uvValue*scale,time, id, uv, smoothness ); + if (_Octaves == 1) + { + if( _PreviewID == 2) + return float4( uv, 0, 1 ); + else if( _PreviewID == 1) + return float4( id, 0, 1 ); + else + return float4(voronoiVal.xxx, 1); + } + else + { + float fade = 0.5; + float voroi = 0; + float rest = 0; + for (int it = 0; it < _Octaves; it++) + { + voroi += fade * Voronoi( uvValue*scale, time, id, uv, smoothness); + rest += fade; + uvValue *= 2; + fade *= 0.5; + } + voroi /= rest; + if( _PreviewID == 2) + return float4( uv, 0, 1 ); + else if( _PreviewID == 1) + return float4( id, 0, 1 ); + else + return float4(voroi.xxx, 1); + } + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VoronoiNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VoronoiNode.shader.meta new file mode 100644 index 0000000..420e71c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_VoronoiNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: bc1498ccdade442479038b24982fc946 +timeCreated: 1566905239 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WeightedBlendNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WeightedBlendNode.shader new file mode 100644 index 0000000..e0a46b5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WeightedBlendNode.shader @@ -0,0 +1,84 @@ +Shader "Hidden/WeightedBlendNode" +{ + Properties + { + _A ( "_Weights", 2D) = "white" {} + _B ( "_Layer1", 2D) = "white" {} + _C ( "_Layer2", 2D ) = "white" {} + _D ( "_Layer3", 2D ) = "white" {} + _E ( "_Layer4", 2D ) = "white" {} + } + + SubShader + { + + CGINCLUDE + + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + sampler2D _A; + sampler2D _B; + + ENDCG + + Pass + { + CGPROGRAM + float4 frag(v2f_img i) : SV_Target + { + float4 Layer1 = tex2D( _B, i.uv ); + return Layer1; + } + ENDCG + } + + Pass + { + CGPROGRAM + sampler2D _C; + float4 frag ( v2f_img i ) : SV_Target + { + float4 Weights = tex2D ( _A, i.uv ); + float4 Layer1 = tex2D ( _B, i.uv ); + float4 Layer2 = tex2D ( _C, i.uv ); + return ( Weights.x*Layer1 + Weights.y*Layer2 ) / ( Weights.x + Weights.y ); + } + ENDCG + } + + Pass + { + CGPROGRAM + sampler2D _C; + sampler2D _D; + float4 frag ( v2f_img i ) : SV_Target + { + float4 Weights = tex2D( _A, i.uv ); + float4 Layer1 = tex2D( _B, i.uv ); + float4 Layer2 = tex2D( _C, i.uv ); + float4 Layer3 = tex2D( _D, i.uv ); + return ( Weights.x*Layer1 + Weights.y*Layer2 + Weights.z*Layer3 ) / ( Weights.x + Weights.y + Weights.z ); + } + ENDCG + } + + Pass + { + CGPROGRAM + sampler2D _C; + sampler2D _D; + sampler2D _E; + float4 frag ( v2f_img i ) : SV_Target + { + float4 Weights = tex2D ( _A, i.uv ); + float4 Layer1 = tex2D ( _B, i.uv ); + float4 Layer2 = tex2D ( _C, i.uv ); + float4 Layer3 = tex2D ( _D, i.uv ); + float4 Layer4 = tex2D ( _E, i.uv ); + return ( Weights.x*Layer1 + Weights.y*Layer2 + Weights.z*Layer3 + Weights.w*Layer4 ) / ( Weights.x + Weights.y + Weights.z + Weights.w ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WeightedBlendNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WeightedBlendNode.shader.meta new file mode 100644 index 0000000..9738a46 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WeightedBlendNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6076cbeaa41ebb14c85ff81b58df7d88 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WireNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WireNode.shader new file mode 100644 index 0000000..7d04059 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WireNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/WireNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return tex2D( _A, i.uv ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WireNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WireNode.shader.meta new file mode 100644 index 0000000..255c336 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WireNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: fa1e3e404e6b3c243b5527b82739d682 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldNormalVector.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldNormalVector.shader new file mode 100644 index 0000000..7a6983b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldNormalVector.shader @@ -0,0 +1,66 @@ +Shader "Hidden/WorldNormalVector" +{ + Properties + { + _A ("_WorldNormal", 2D) = "white" {} + } + SubShader + { + Pass //not connected + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + float4 frag(v2f_img i) : SV_Target + { + float2 xy = 2 * i.uv - 1; + float z = -sqrt(1-saturate(dot(xy,xy))); + float3 worldNormal = normalize(float3(xy, z)); + return float4(worldNormal, 1); + } + ENDCG + } + + Pass //connected + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + float2 xy = 2 * i.uv - 1; + float z = -sqrt(1-saturate(dot(xy,xy))); + float3 vertexPos = float3(xy, z); + float3 normal = normalize(vertexPos); + float3 worldNormal = UnityObjectToWorldNormal(normal); + + float3 tangent = normalize(float3( -z, xy.y*0.01, xy.x )); + float3 worldPos = mul(unity_ObjectToWorld, float4(vertexPos,1)).xyz; + float3 worldTangent = UnityObjectToWorldDir(tangent); + float tangentSign = -1; + float3 worldBinormal = normalize( cross(worldNormal, worldTangent) * tangentSign); + float4 tSpace0 = float4(worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x); + float4 tSpace1 = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y); + float4 tSpace2 = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z); + + float2 sphereUVs = i.uv; + + sphereUVs.x = (atan2(vertexPos.x, -vertexPos.z) / (UNITY_PI) + 0.5); + // Needs further checking + //float3 tangentNormal = tex2Dlod(_A, float4(sphereUVs,0,0)).xyz; + float3 tangentNormal = tex2D(_A, sphereUVs).xyz; + + worldNormal = fixed3( dot( tSpace0.xyz, tangentNormal ), dot( tSpace1.xyz, tangentNormal ), dot( tSpace2.xyz, tangentNormal ) ); + + return float4(worldNormal, 1); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldNormalVector.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldNormalVector.shader.meta new file mode 100644 index 0000000..dfc9ffa --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldNormalVector.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 5f55f4841abb61e45967957788593a9d +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldPosInputsNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldPosInputsNode.shader new file mode 100644 index 0000000..c36df0f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldPosInputsNode.shader @@ -0,0 +1,23 @@ +Shader "Hidden/WorldPosInputsNode" +{ + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float4 frag( v2f_img i ) : SV_Target + { + float2 xy = 2 * i.uv - 1; + float z = -sqrt(1-saturate(dot(xy,xy))); + float4 vertexPos = float4(xy, z,1); + float4 worldPos = mul(unity_ObjectToWorld, vertexPos); + return float4 (worldPos.xyz, 1); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldPosInputsNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldPosInputsNode.shader.meta new file mode 100644 index 0000000..713d2ac --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldPosInputsNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 70d5405009b31a349a4d8285f30cf5d9 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldReflectionVector.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldReflectionVector.shader new file mode 100644 index 0000000..e3cfb4e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldReflectionVector.shader @@ -0,0 +1,77 @@ +Shader "Hidden/WorldReflectionVector" +{ + Properties + { + _A ("_TangentNormal", 2D) = "white" {} + } + SubShader + { + Pass //not connected + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float4 frag(v2f_img i) : SV_Target + { + float2 xy = 2 * i.uv - 1; + float z = -sqrt(1-saturate(dot(xy,xy))); + float3 vertexPos = float3(xy, z); + float3 normal = normalize(vertexPos); + float3 worldNormal = UnityObjectToWorldNormal(normal); + + float3 worldViewDir = normalize(float3(0,0,-5) - vertexPos); + float3 worldRefl = -worldViewDir; + worldRefl = reflect( worldRefl, worldNormal ); + + return float4((worldRefl), 1); + } + ENDCG + } + + Pass //connected + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + float2 xy = 2 * i.uv - 1; + float z = -sqrt(1-saturate(dot(xy,xy))); + float3 vertexPos = float3(xy, z); + float3 normal = normalize(vertexPos); + float3 worldNormal = UnityObjectToWorldNormal(normal); + + float3 tangent = normalize(float3( -z, xy.y*0.01, xy.x )); + float3 worldPos = mul(unity_ObjectToWorld, float4(vertexPos,1)).xyz; + float3 worldViewDir = normalize(float3(0,0,-5) - vertexPos); + + float3 worldTangent = UnityObjectToWorldDir(tangent); + float tangentSign = -1; + float3 worldBinormal = normalize( cross(worldNormal, worldTangent) * tangentSign); + float4 tSpace0 = float4(worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x); + float4 tSpace1 = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y); + float4 tSpace2 = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z); + + float3 worldRefl = -worldViewDir; + + float2 sphereUVs = i.uv; + sphereUVs.x = atan2(vertexPos.x, -vertexPos.z) / (UNITY_PI) + 0.5; + + // Needs further checking + //float3 tangentNormal = tex2Dlod(_A, float4(sphereUVs,0,0)).xyz; + float3 tangentNormal = tex2D(_A, sphereUVs).xyz; + + worldRefl = reflect( worldRefl, half3( dot( tSpace0.xyz, tangentNormal ), dot( tSpace1.xyz, tangentNormal ), dot( tSpace2.xyz, tangentNormal ) ) ); + + return float4((worldRefl), 1); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldReflectionVector.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldReflectionVector.shader.meta new file mode 100644 index 0000000..44034b5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldReflectionVector.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8e267e9aa545eeb418585a730f50273e +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldSpaceCameraPos.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldSpaceCameraPos.shader new file mode 100644 index 0000000..9f04ac1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldSpaceCameraPos.shader @@ -0,0 +1,20 @@ +Shader "Hidden/WorldSpaceCameraPos" +{ + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float4 frag( v2f_img i ) : SV_Target + { + //_WorldSpaceCameraPos + return float4(float3(0,0,-5),0); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldSpaceCameraPos.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldSpaceCameraPos.shader.meta new file mode 100644 index 0000000..78177ce --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldSpaceCameraPos.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6b0c78411043dd24dac1152c84bb63ba +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldSpaceLightDirHlpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldSpaceLightDirHlpNode.shader new file mode 100644 index 0000000..742e492 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldSpaceLightDirHlpNode.shader @@ -0,0 +1,22 @@ +Shader "Hidden/WorldSpaceLightDirHlpNode" +{ + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float4 _EditorWorldLightPos; + + float4 frag( v2f_img i ) : SV_Target + { + float3 lightDir = normalize( _EditorWorldLightPos.xyz ); + return float4 ( lightDir, 1); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldSpaceLightDirHlpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldSpaceLightDirHlpNode.shader.meta new file mode 100644 index 0000000..10ed275 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldSpaceLightDirHlpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2e8dc46eb6fb2124d9f0007caf9567e3 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldSpaceLightPosNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldSpaceLightPosNode.shader new file mode 100644 index 0000000..3bb5ef1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldSpaceLightPosNode.shader @@ -0,0 +1,33 @@ +Shader "Hidden/WorldSpaceLightPosNode" +{ + SubShader + { + CGINCLUDE + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + ENDCG + + Pass + { + CGPROGRAM + float4 _EditorWorldLightPos; + float4 frag( v2f_img i ) : SV_Target + { + float3 lightDir = normalize( _EditorWorldLightPos.xyz ); + return float4 ( lightDir, 0); + } + ENDCG + } + + Pass + { + CGPROGRAM + float4 frag( v2f_img i ) : SV_Target + { + return (0).xxxx; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldSpaceLightPosNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldSpaceLightPosNode.shader.meta new file mode 100644 index 0000000..f9fa58c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldSpaceLightPosNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2292a614672283c41a367b22cdde4620 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldSpaceViewDirHlpNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldSpaceViewDirHlpNode.shader new file mode 100644 index 0000000..e90bacb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldSpaceViewDirHlpNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/WorldSpaceViewDirHlpNode" +{ +Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + sampler2D _A; + + float4 frag( v2f_img i ) : SV_Target + { + return float4( float3( 0,0,-5 ) - tex2D( _A, i.uv ).rgb,1); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldSpaceViewDirHlpNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldSpaceViewDirHlpNode.shader.meta new file mode 100644 index 0000000..edeada6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldSpaceViewDirHlpNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: fe0e09756a8a0ba408015b43e66cb8a6 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldToObjectTransfNode.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldToObjectTransfNode.shader new file mode 100644 index 0000000..d3ff2a7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldToObjectTransfNode.shader @@ -0,0 +1,25 @@ +Shader "Hidden/WorldToObjectTransfNode" +{ + Properties + { + _A ("_A", 2D) = "white" {} + } + SubShader + { + Pass + { + CGPROGRAM + #include "UnityCG.cginc" + #pragma vertex vert_img + #pragma fragment frag + + sampler2D _A; + + float4 frag(v2f_img i) : SV_Target + { + return mul(unity_WorldToObject, tex2D( _A, i.uv )); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldToObjectTransfNode.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldToObjectTransfNode.shader.meta new file mode 100644 index 0000000..069ac0b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldToObjectTransfNode.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 79a5efd1e3309f54d8ba3e7fdf5e459b +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldTransformParams.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldTransformParams.shader new file mode 100644 index 0000000..9272676 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldTransformParams.shader @@ -0,0 +1,20 @@ +Shader "Hidden/WorldTransformParams" +{ + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float4 frag( v2f_img i ) : SV_Target + { + return unity_WorldTransformParams; + } + ENDCG + } + + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldTransformParams.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldTransformParams.shader.meta new file mode 100644 index 0000000..b6b2479 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_WorldTransformParams.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 5a2642605f085da458d6e03ade47b87a +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ZBufferParams.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ZBufferParams.shader new file mode 100644 index 0000000..9f817b1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ZBufferParams.shader @@ -0,0 +1,19 @@ +Shader "Hidden/ZBufferParams" +{ + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #include "UnityCG.cginc" + + float4 frag( v2f_img i ) : SV_Target + { + return _ZBufferParams; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ZBufferParams.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ZBufferParams.shader.meta new file mode 100644 index 0000000..c7caf5e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/Preview_ZBufferParams.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 56c42c106bcb497439187f5bb6b6f94d +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/TextureArrayInspector.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/TextureArrayInspector.shader new file mode 100644 index 0000000..408050d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/TextureArrayInspector.shader @@ -0,0 +1,30 @@ +Shader "Hidden/TextureArrayEditor" +{ + Properties + { + _MainTex ("_MainTex", 2DArray) = "white" {} + _Index ("_Index", Int) = 0 + } + SubShader + { + Pass + { + CGPROGRAM + #pragma vertex vert_img + #pragma fragment frag + #pragma target 3.5 + #include "UnityCG.cginc" + #include "UnityStandardUtils.cginc" + + uniform UNITY_DECLARE_TEX2DARRAY( _MainTex ); + int _Index; + + float4 frag( v2f_img i ) : SV_Target + { + //return UNITY_SAMPLE_TEX2DARRAY_LOD( _MainTex, float3( i.uv, _Index), 0 ); + return UNITY_SAMPLE_TEX2DARRAY( _MainTex, float3( i.uv, _Index) ); + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/TextureArrayInspector.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/TextureArrayInspector.shader.meta new file mode 100644 index 0000000..8f6ce0a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Previews/TextureArrayInspector.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 610c24aad350fba4583068c6c22fa428 +timeCreated: 1488289785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions.meta new file mode 100644 index 0000000..96c839a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e21dd05d276e6c8438cc722d4559a0c3 +folderAsset: yes +timeCreated: 1507301549 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/And.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/And.asset new file mode 100644 index 0000000..8cba006 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/And.asset @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: And + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=18101\n468;180;1104;762;810;372;1;True;False\nNode;AmplifyShaderEditor.FunctionInput;2;-320,0;Inherit;False;A;1;0;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;3;-320,80;Inherit;False;B;1;1;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.CustomExpressionNode;1;-160,0;Inherit;False;float + result = A && B@$return result@;1;False;2;True;A;FLOAT;0;In;;Inherit;False;True;B;FLOAT;0;In;;Inherit;False;ASEAnd;False;False;0;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;0;0,0;Inherit;False;True;-1;;0;False;1;0;FLOAT;0;False;1;FLOAT;0\nWireConnection;1;0;2;0\nWireConnection;1;1;3;0\nWireConnection;0;0;1;0\nASEEND*/\n//CHKSM=194105DDA916A991C9946AB2786628346B491717" + m_functionName: + m_description: Returns 1 if both the inputs A and B are 1 + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 6 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/And.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/And.asset.meta new file mode 100644 index 0000000..cea5c99 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/And.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 50f923f3b90822e47953386ea346e02f +timeCreated: 1589816062 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bacteria.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bacteria.asset new file mode 100644 index 0000000..56013f7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bacteria.asset @@ -0,0 +1,38 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Bacteria + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=17902\n-1440;-254;1004;726;5555.52;2071.572;5.733906;True;False\nNode;AmplifyShaderEditor.SimpleAddOpNode;40;-512,-224;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SmoothstepOpNode;42;-912,0;Inherit;False;3;0;FLOAT;0;False;1;FLOAT;0.6;False;2;FLOAT;0.55;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;55;-512,320;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SmoothstepOpNode;41;-912,-128;Inherit;False;3;0;FLOAT;0;False;1;FLOAT;0.7;False;2;FLOAT;0.65;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;44;-256,0;Inherit;True;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SmoothstepOpNode;45;-912,144;Inherit;False;3;0;FLOAT;0;False;1;FLOAT;0.2;False;2;FLOAT;0.15;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;33;-704,-320;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;2;-3872,160;Inherit;False;Tiling;2;0;False;1;0;FLOAT2;5,5;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SmoothstepOpNode;32;-912,-384;Inherit;False;3;0;FLOAT;0;False;1;FLOAT;0.45;False;2;FLOAT;0.4;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SmoothstepOpNode;46;-912,272;Inherit;False;3;0;FLOAT;0;False;1;FLOAT;0.1;False;2;FLOAT;0.05;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;43;-704,-80;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SmoothstepOpNode;34;-912,-256;Inherit;False;3;0;FLOAT;0;False;1;FLOAT;0.35;False;2;FLOAT;0.3;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SmoothstepOpNode;49;-912,400;Inherit;False;3;0;FLOAT;0;False;1;FLOAT;0.2;False;2;FLOAT;0.15;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SmoothstepOpNode;50;-912,528;Inherit;False;3;0;FLOAT;0;False;1;FLOAT;0.1;False;2;FLOAT;0.05;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;47;-704,208;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;48;-704,464;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.LengthOpNode;53;-1120,464;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.LengthOpNode;51;-1120,224;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;52;-1280,224;Inherit;False;2;0;FLOAT2;0,0;False;1;FLOAT2;0.5,1;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;54;-1280,464;Inherit;False;2;0;FLOAT2;0,0;False;1;FLOAT2;1,0.5;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.LengthOpNode;37;-1152,-176;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;31;-1616,0;Inherit;True;3;3;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;2;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.TexCoordVertexDataNode;4;-3920,0;Inherit;False;0;2;0;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;3;-3680,64;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FloorOpNode;6;-3520,-128;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionInput;5;-3504,-48;Inherit;False;Seed;1;1;False;1;0;FLOAT;560;False;1;FLOAT;0\nNode;AmplifyShaderEditor.NoiseGeneratorNode;7;-3344,-112;Inherit;False;Simple;False;False;2;0;FLOAT2;0,0;False;1;FLOAT;560;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FractNode;12;-3088,-112;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FractNode;13;-3072,64;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.StepOpNode;14;-2848,-192;Inherit;False;2;0;FLOAT;0.75;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.OneMinusNode;17;-2848,-80;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.StepOpNode;16;-2800,304;Inherit;False;2;0;FLOAT;0.25;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;1;-2816,176;Inherit;False;FLOAT2;1;0;FLOAT2;0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.OneMinusNode;19;-2528,160;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DynamicAppendNode;20;-2352,176;Inherit;False;FLOAT2;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.StepOpNode;15;-2832,32;Inherit;False;2;0;FLOAT;0.5;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.OneMinusNode;23;-2208,96;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;22;-2208,-16;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;24;-2032,16;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;21;-2160,-176;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;25;-1840,-112;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;26;-1904,176;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;27;-2144,256;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.OneMinusNode;28;-2112,352;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;29;-1888,384;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;30;-2832,432;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionOutput;0;0,0;Inherit;False;True;-1;Out;0;False;1;0;FLOAT;0;False;1;FLOAT;0\nWireConnection;40;0;33;0\nWireConnection;40;1;43;0\nWireConnection;42;0;37;0\nWireConnection;55;0;47;0\nWireConnection;55;1;48;0\nWireConnection;41;0;37;0\nWireConnection;44;0;40;0\nWireConnection;44;1;55;0\nWireConnection;45;0;51;0\nWireConnection;33;0;32;0\nWireConnection;33;1;34;0\nWireConnection;32;0;37;0\nWireConnection;46;0;51;0\nWireConnection;43;0;41;0\nWireConnection;43;1;42;0\nWireConnection;34;0;37;0\nWireConnection;49;0;53;0\nWireConnection;50;0;53;0\nWireConnection;47;0;45;0\nWireConnection;47;1;46;0\nWireConnection;48;0;49;0\nWireConnection;48;1;50;0\nWireConnection;53;0;54;0\nWireConnection;51;0;52;0\nWireConnection;52;0;31;0\nWireConnection;54;0;31;0\nWireConnection;37;0;31;0\nWireConnection;31;0;25;0\nWireConnection;31;1;26;0\nWireConnection;31;2;29;0\nWireConnection;3;0;4;0\nWireConnection;3;1;2;0\nWireConnection;6;0;3;0\nWireConnection;7;0;6;0\nWireConnection;7;1;5;0\nWireConnection;12;0;7;0\nWireConnection;13;0;3;0\nWireConnection;14;1;12;0\nWireConnection;17;0;13;0\nWireConnection;16;1;12;0\nWireConnection;1;0;13;0\nWireConnection;19;0;1;0\nWireConnection;20;0;19;0\nWireConnection;20;1;1;1\nWireConnection;15;1;12;0\nWireConnection;23;0;20;0\nWireConnection;22;0;15;0\nWireConnection;22;1;14;0\nWireConnection;24;0;22;0\nWireConnection;24;1;23;0\nWireConnection;21;0;14;0\nWireConnection;21;1;17;0\nWireConnection;25;0;21;0\nWireConnection;25;1;24;0\nWireConnection;26;0;20;0\nWireConnection;26;1;27;0\nWireConnection;27;0;16;0\nWireConnection;27;1;15;0\nWireConnection;28;0;16;0\nWireConnection;29;0;28;0\nWireConnection;29;1;30;0\nWireConnection;30;0;13;0\nWireConnection;0;0;44;0\nASEEND*/\n//CHKSM=A7931AF4EE98C9341AB309047876D23C8E9396B7" + m_functionName: + m_description: + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 9 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bacteria.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bacteria.asset.meta new file mode 100644 index 0000000..3cd0009 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bacteria.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c4b8e21d0aca1b04d843e80ebaf2ba67 +timeCreated: 1586867844 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bicubic Precompute.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bicubic Precompute.asset new file mode 100644 index 0000000..c07e0c1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bicubic Precompute.asset @@ -0,0 +1,57 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Bicubic Precompute + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=18600\n0;537;1729;822;2496.342;532.7923;2.001278;True;False\nNode;AmplifyShaderEditor.FunctionInput;5;-931.3976,161.7528;Inherit;False;UV;2;0;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionInput;55;-937.6257,292.313;Inherit;False;Texel + Size;4;1;False;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.CustomExpressionNode;2;-712.9393,184.7253;Inherit;False;UV + = UV * TexelSize.zw - 0.5@$float2 f = frac( UV )@$UV -= f@$$float4 xn = float4( + 1.0, 2.0, 3.0, 4.0 ) - f.xxxx@$float4 yn = float4( 1.0, 2.0, 3.0, 4.0 ) - f.yyyy@$$float4 + xs = xn * xn * xn@$float4 ys = yn * yn * yn@$$float3 xv = float3( xs.x, xs.y - + 4.0 * xs.x, xs.z - 4.0 * xs.y + 6.0 * xs.x )@$float3 yv = float3( ys.x, ys.y - + 4.0 * ys.x, ys.z - 4.0 * ys.y + 6.0 * ys.x )@$float4 xc = float4( xv.xyz, 6.0 + - xv.x - xv.y - xv.z )@$float4 yc = float4( yv.xyz, 6.0 - yv.x - yv.y - yv.z )@$$float4 + c = float4( UV.x - 0.5, UV.x + 1.5, UV.y - 0.5, UV.y + 1.5 )@$float4 s = float4( + xc.x + xc.y, xc.z + xc.w, yc.x + yc.y, yc.z + yc.w )@$$float w0 = s.x / ( s.x + + s.y )@$float w1 = s.z / ( s.z + s.w )@$$Offsets = ( c + float4( xc.y, xc.w, + yc.y, yc.w ) / s ) * TexelSize.xyxy@$Weights = float2( w0, w1 )@$;7;False;4;True;UV;FLOAT2;0,0;In;;Float;False;True;TexelSize;FLOAT4;0,0,0,0;In;;Inherit;False;True;Offsets;FLOAT4;0,0,0,0;Out;;Float;False;True;Weights;FLOAT2;0,0;Out;;Float;False;Stochastic + Tiling;False;False;0;5;0;FLOAT;0;False;1;FLOAT2;0,0;False;2;FLOAT4;0,0,0,0;False;3;FLOAT4;0,0,0,0;False;4;FLOAT2;0,0;False;3;FLOAT;0;FLOAT4;4;FLOAT2;5\nNode;AmplifyShaderEditor.FunctionOutput;34;-379.6704,177.7769;Inherit;False;True;-1;Offsets;0;False;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.FunctionOutput;54;-378.9186,285.9598;Inherit;False;False;-1;Weights;1;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nWireConnection;2;1;5;0\nWireConnection;2;2;55;0\nWireConnection;34;0;2;4\nWireConnection;54;0;2;5\nASEEND*/\n//CHKSM=83289324BA5D4E43B3BB2E090095EB3689FE9CE1" + m_functionName: + m_description: 'Precomputation step (1 of 2) for bicubic sampling. + + + IMPORTANT + + This node only precomputes data that is fed into the "Bicubic Sample" nodes using + Fetch sampling mode. All textures sharing the same precomputation step must also + share the same size and UV coordinates. ' + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 1 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 12 + m_customNodeCategory: Rust + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bicubic Precompute.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bicubic Precompute.asset.meta new file mode 100644 index 0000000..1ce087c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bicubic Precompute.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 818835145cc522e4da1f9915d8b8a984 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bicubic Sample.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bicubic Sample.asset new file mode 100644 index 0000000..8b46b58 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bicubic Sample.asset @@ -0,0 +1,97 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Bicubic Sample + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=18600\n0;537;1729;822;-467.7644;465.2727;1.320468;True;False\nNode;AmplifyShaderEditor.CommentaryNode;201;-1043.748,1734.264;Inherit;False;2226.074;1089.492;;25;205;187;192;188;204;203;202;176;196;195;194;193;191;190;189;186;185;184;183;182;181;180;179;178;177;Fetch + 2D;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;130;-1074.157,-571.3032;Inherit;False;2248.869;991.9108;;28;126;131;40;4;44;45;120;124;122;121;119;118;2;123;125;127;66;128;43;6;7;46;68;67;129;167;168;169;2D;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;71;1388.118,-555.2822;Inherit;False;1546.347;970.757;;15;84;82;85;83;86;72;80;76;74;88;81;79;73;87;78;Outputs;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;89;-2721.481,-555.8615;Inherit;False;1378.169;964.4158;;17;197;199;94;97;198;105;96;200;99;102;98;92;91;93;101;103;100;Inputs;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;132;-1059.981,593.8146;Inherit;False;2248.869;991.9108;;33;157;156;155;154;153;152;151;150;149;148;147;146;145;144;142;141;140;139;138;137;136;135;134;133;158;159;160;161;162;163;164;165;166;2D + Array;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;206;-1034.245,2999.804;Inherit;False;2216.924;1095.592;;32;231;230;229;228;227;226;225;224;223;222;221;220;219;218;217;216;215;214;213;212;211;210;209;208;207;232;233;234;235;236;237;238;Fetch + 2D Array;1,1,1,1;0;0\nNode;AmplifyShaderEditor.WireNode;218;-269.7177,3218.184;Inherit;False;1;0;SAMPLER2DARRAY;;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.WireNode;217;-272.4329,3188.314;Inherit;False;1;0;SAMPLER2DARRAY;;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.WireNode;191;-311.0844,1978.569;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.SwizzleNode;214;-540.3856,3483.624;Inherit;False;FLOAT2;1;2;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SwizzleNode;213;-540.3856,3663.624;Inherit;False;FLOAT2;1;3;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;219;-287.368,3242.624;Inherit;False;1;0;SAMPLER2DARRAY;;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.GetLocalVarNode;227;-924.5254,3528.712;Inherit;False;197;Input_FetchOffsets;1;0;OBJECT;;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.WireNode;189;-296.1492,1924.26;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.WireNode;233;-190.7924,3352.336;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;127;-95.72092,292.4236;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;226;517.788,3744.942;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;234;-201.4768,3473.426;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SamplerNode;180;-110.8541,2465.857;Inherit;True;Property;_TextureSample11;Texture + Sample 11;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.LerpOp;181;318.6297,2397.643;Inherit;False;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.LerpOp;224;728.2203,3446.359;Inherit;False;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.LerpOp;176;704.5042,2182.305;Inherit;False;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.SamplerNode;207;-90.20921,3317.818;Inherit;True;Property;_TextureSample2;Texture + Sample 2;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2DArray;8;0;SAMPLER2DARRAY;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SamplerNode;177;-113.9256,2053.764;Inherit;True;Property;_TextureSample8;Texture + Sample 8;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.WireNode;158;-740.9282,796.8607;Inherit;False;1;0;SAMPLER2DARRAY;;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.SwizzleNode;216;-542.3856,3574.624;Inherit;False;FLOAT2;0;3;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.CustomExpressionNode;145;-657.9156,1104.576;Inherit;False;{$ + UV = UV * TexelSize.zw - 0.5@$ float2 f = frac( UV )@$ UV -= f@$$ float4 + xn = float4( 1.0, 2.0, 3.0, 4.0 ) - f.xxxx@$ float4 yn = float4( 1.0, 2.0, + 3.0, 4.0 ) - f.yyyy@$$ float4 xs = xn * xn * xn@$ float4 ys = yn * yn * + yn@$$ float3 xv = float3( xs.x, xs.y - 4.0 * xs.x, xs.z - 4.0 * xs.y + 6.0 + * xs.x )@$ float3 yv = float3( ys.x, ys.y - 4.0 * ys.x, ys.z - 4.0 * ys.y + + 6.0 * ys.x )@$ float4 xc = float4( xv.xyz, 6.0 - xv.x - xv.y - xv.z )@$ float4 + yc = float4( yv.xyz, 6.0 - yv.x - yv.y - yv.z )@$$ float4 c = float4( UV.x + - 0.5, UV.x + 1.5, UV.y - 0.5, UV.y + 1.5 )@$ float4 s = float4( xc.x + xc.y, + xc.z + xc.w, yc.x + yc.y, yc.z + yc.w )@$$ float4 off = ( c + float4( xc.y, + xc.w, yc.y, yc.w ) / s ) * TexelSize.xyxy@$$ UV0 = off.xz@$ UV1 = off.yz@$ + \ UV2 = off.xw@$ UV3 = off.yw@$ W0 = s.x / ( s.x + s.y )@$ W1 = s.z / + ( s.z + s.w )@$};7;False;8;True;UV;FLOAT2;0,0;In;;Float;False;True;TexelSize;FLOAT4;0,0,0,0;In;;Inherit;False;True;UV0;FLOAT2;0,0;Out;;Float;False;True;UV1;FLOAT2;0,0;Out;;Float;False;True;UV2;FLOAT2;0,0;Out;;Float;False;True;UV3;FLOAT2;0,0;Out;;Inherit;False;True;W0;FLOAT;0;Out;;Inherit;False;True;W1;FLOAT;0;Out;;Inherit;False;Bicubic + Prepare;False;False;0;9;0;FLOAT;0;False;1;FLOAT2;0,0;False;2;FLOAT4;0,0,0,0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT2;0,0;False;6;FLOAT2;0,0;False;7;FLOAT;0;False;8;FLOAT;0;False;7;FLOAT;0;FLOAT2;4;FLOAT2;5;FLOAT2;6;FLOAT2;7;FLOAT;8;FLOAT;9\nNode;AmplifyShaderEditor.WireNode;190;-293.4339,1954.13;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.SamplerNode;179;-113.5429,2257.507;Inherit;True;Property;_TextureSample10;Texture + Sample 10;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.RegisterLocalVarNode;105;-1643.842,35.19871;Inherit;False;Input_SS;-1;True;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.LerpOp;45;351.319,-373.6947;Inherit;False;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.WireNode;203;494.0718,2480.887;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;220;-370.9889,3317.928;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.LerpOp;211;342.3458,3661.698;Inherit;False;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.SamplerNode;209;-89.82652,3521.562;Inherit;True;Property;_TextureSample16;Texture + Sample 16;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2DArray;8;0;SAMPLER2DARRAY;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.WireNode;193;-415.6305,2008.959;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;159;-334.8512,736.2561;Inherit;False;1;0;SAMPLER2DARRAY;;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.SamplerNode;208;-85.47648,3112.596;Inherit;True;Property;_TextureSample0;Texture + Sample 0;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2DArray;8;0;SAMPLER2DARRAY;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.BreakToComponentsNode;230;-19.01893,3942.506;Inherit;False;FLOAT2;1;0;FLOAT2;0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.LerpOp;182;314.7018,1978.976;Inherit;False;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.SwizzleNode;185;-570.4064,2125.433;Inherit;False;FLOAT2;0;2;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;161;-309.4034,811.0089;Inherit;False;1;0;SAMPLER2DARRAY;;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.SwizzleNode;186;-566.1018,2310.57;Inherit;False;FLOAT2;0;3;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;202;878.0947,2176.097;Inherit;False;Output_Fetch2D;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.FunctionInput;198;-2580.608,143.3581;Inherit;False;Offsets;4;4;False;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;187;-42.73524,2678.451;Inherit;False;FLOAT2;1;0;FLOAT2;0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.FunctionInput;199;-2581.965,245.189;Inherit;False;Weights;2;5;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionSubtitle;88;1783.674,101.3291;Inherit;False;Fetch + 2D Array (2/2);1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.FunctionSubtitle;76;1794.327,-169.9491;Inherit;False;2D + Array;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;74;2490.12,0.7858257;Inherit;False;COLOR;1;0;COLOR;0,0,0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.FunctionSubtitle;80;1803.251,-313.9693;Inherit;False;2D;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.GetLocalVarNode;87;1442.031,99.73958;Inherit;False;225;Output_Fetch2DArray;1;0;OBJECT;;False;1;COLOR;0\nNode;AmplifyShaderEditor.GetLocalVarNode;78;1496.474,-317.2461;Inherit;False;131;Output_2D;1;0;OBJECT;;False;1;COLOR;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;225;901.8109,3440.151;Inherit;False;Output_Fetch2DArray;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.WireNode;160;-326.8987,769.6562;Inherit;False;1;0;SAMPLER2DARRAY;;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.GetLocalVarNode;231;-377.444,3934.225;Inherit;False;200;Input_FetchWeights;1;0;OBJECT;;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;235;-357.6844,3222.431;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionSubtitle;81;1787.2,-40.47982;Inherit;False;Fetch + 2D (2/2);1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.CustomExpressionNode;2;-672.0914,-60.54211;Inherit;False;{$ + UV = UV * TexelSize.zw - 0.5@$ float2 f = frac( UV )@$ UV -= f@$$ float4 + xn = float4( 1.0, 2.0, 3.0, 4.0 ) - f.xxxx@$ float4 yn = float4( 1.0, 2.0, + 3.0, 4.0 ) - f.yyyy@$$ float4 xs = xn * xn * xn@$ float4 ys = yn * yn * + yn@$$ float3 xv = float3( xs.x, xs.y - 4.0 * xs.x, xs.z - 4.0 * xs.y + 6.0 + * xs.x )@$ float3 yv = float3( ys.x, ys.y - 4.0 * ys.x, ys.z - 4.0 * ys.y + + 6.0 * ys.x )@$ float4 xc = float4( xv.xyz, 6.0 - xv.x - xv.y - xv.z )@$ float4 + yc = float4( yv.xyz, 6.0 - yv.x - yv.y - yv.z )@$$ float4 c = float4( UV.x + - 0.5, UV.x + 1.5, UV.y - 0.5, UV.y + 1.5 )@$ float4 s = float4( xc.x + xc.y, + xc.z + xc.w, yc.x + yc.y, yc.z + yc.w )@$$ float4 off = ( c + float4( xc.y, + xc.w, yc.y, yc.w ) / s ) * TexelSize.xyxy@$$ UV0 = off.xz@$ UV1 = off.yz@$ + \ UV2 = off.xw@$ UV3 = off.yw@$ W0 = s.x / ( s.x + s.y )@$ W1 = s.z / + ( s.z + s.w )@$};7;False;8;True;UV;FLOAT2;0,0;In;;Float;False;True;TexelSize;FLOAT4;0,0,0,0;In;;Inherit;False;True;UV0;FLOAT2;0,0;Out;;Float;False;True;UV1;FLOAT2;0,0;Out;;Float;False;True;UV2;FLOAT2;0,0;Out;;Float;False;True;UV3;FLOAT2;0,0;Out;;Inherit;False;True;W0;FLOAT;0;Out;;Inherit;False;True;W1;FLOAT;0;Out;;Inherit;False;Bicubic + Prepare;False;False;0;9;0;FLOAT;0;False;1;FLOAT2;0,0;False;2;FLOAT4;0,0,0,0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT2;0,0;False;6;FLOAT2;0,0;False;7;FLOAT;0;False;8;FLOAT;0;False;7;FLOAT;0;FLOAT2;4;FLOAT2;5;FLOAT2;6;FLOAT2;7;FLOAT;8;FLOAT;9\nNode;AmplifyShaderEditor.SwizzleNode;183;-564.1018,2399.57;Inherit;False;FLOAT2;1;3;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.GetLocalVarNode;118;-955.8895,-151.2794;Inherit;False;100;Input_UV;1;0;OBJECT;;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SwizzleNode;215;-546.6902,3389.487;Inherit;False;FLOAT2;0;2;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;196;-399.3375,2086.351;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;195;-396.6223,2064.626;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;238;-353.1872,3276.79;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;204;-948.2417,2264.657;Inherit;False;197;Input_FetchOffsets;1;0;OBJECT;;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.WireNode;194;-402.0527,2038.829;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.SwizzleNode;184;-564.1018,2219.57;Inherit;False;FLOAT2;1;2;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.LerpOp;212;338.418,3243.03;Inherit;False;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;197;-1637.331,141.5877;Inherit;False;Input_FetchOffsets;-1;True;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.WireNode;128;248.1051,292.4236;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;192;-647.9,1997.286;Inherit;False;105;Input_SS;1;0;OBJECT;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.GetLocalVarNode;188;-663.9133,1852.121;Inherit;False;101;Input_Texture;1;0;OBJECT;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.SamplerNode;6;-77.30836,-298.9066;Inherit;True;Property;_TextureSample1;Texture + Sample 1;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.FunctionInput;94;-2587.118,36.96911;Inherit;False;SS;13;6;False;1;0;SAMPLERSTATE;0;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;156;956.144,991.3506;Inherit;False;Output_2DArray;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.SamplerNode;178;-109.1929,1848.542;Inherit;True;Property;_TextureSample9;Texture + Sample 9;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.FunctionInput;97;-1783.926,-341.5729;Inherit;False;UV;2;3;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SamplerNode;139;-60.06113,1278.305;Inherit;True;Property;_TextureSample6;Texture + Sample 6;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2DArray;8;0;SAMPLER2DARRAY;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.LerpOp;152;365.4948,791.4232;Inherit;False;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.TexelSizeNode;155;-968.2141,1150.107;Inherit;False;-1;1;0;SAMPLER2DARRAY;;False;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.FunctionInput;91;-2601.69,-153.4011;Inherit;False;Texture + Array;12;1;False;1;0;SAMPLER2DARRAY;0;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.WireNode;68;-88.63429,348.3121;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionSwitch;92;-2128.13,-340.859;Inherit;False;Option;False;0;4;-1;2D;2D + Array;Triplanar;Triplanar Array;Instance;72;9;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;2;FLOAT2;0,0;False;3;FLOAT2;0,0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;157;-993.7668,956.1034;Inherit;False;1;0;SAMPLER2DARRAY;;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.WireNode;142;-81.54513,1457.542;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;162;-670.3486,817.4661;Inherit;False;98;Input_Index;1;0;OBJECT;;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;151;-406.4995,963.3865;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;163;-384.1563,834.8665;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;79;1470.797,-174.3436;Inherit;False;156;Output_2DArray;1;0;OBJECT;;False;1;COLOR;0\nNode;AmplifyShaderEditor.LerpOp;44;750.9617,-170.366;Inherit;False;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.GetLocalVarNode;119;-652.9467,-253.246;Inherit;False;105;Input_SS;1;0;OBJECT;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;134;-77.88247,1485.869;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SamplerNode;210;-87.13773,3729.912;Inherit;True;Property;_TextureSample1;Texture + Sample 1;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2DArray;8;0;SAMPLER2DARRAY;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.GetLocalVarNode;124;-967.2612,-508.0312;Inherit;False;101;Input_Texture;1;0;OBJECT;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.WireNode;148;-406.0995,985.9865;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;140;262.2807,1457.542;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;167;-339.9795,-424.4737;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.FunctionInput;93;-2533.613,-48.14872;Inherit;False;Index;1;2;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SamplerNode;138;-63.13266,866.2112;Inherit;True;Property;_TextureSample5;Texture + Sample 5;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2DArray;8;0;SAMPLER2DARRAY;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.TextureCoordinatesNode;103;-2395.848,-231.0578;Inherit;False;0;-1;2;3;2;SAMPLER2DARRAY;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.RegisterLocalVarNode;101;-1648.95,-438.0066;Inherit;False;Input_Texture;-1;True;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.GetLocalVarNode;146;-941.7139,1013.838;Inherit;False;100;Input_UV;1;0;OBJECT;;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.LerpOp;136;369.4226,1210.091;Inherit;False;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;100;-1640.919,-341.9367;Inherit;False;Input_UV;-1;True;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.LerpOp;46;355.2469,44.97323;Inherit;False;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.WireNode;144;-404.5566,1029.196;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.SamplerNode;154;-58.39999,660.9893;Inherit;True;Property;_TextureSample7;Texture + Sample 7;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2DArray;8;0;SAMPLER2DARRAY;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SamplerNode;43;-74.23686,113.1873;Inherit;True;Property;_TextureSample4;Texture + Sample 4;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.TexelSizeNode;40;-982.3898,-15.01096;Inherit;False;-1;1;0;SAMPLER2D;;False;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SamplerNode;137;-62.74997,1069.955;Inherit;True;Property;_TextureSample3;Texture + Sample 3;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2DArray;8;0;SAMPLER2DARRAY;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.WireNode;166;-387.3372,888.9426;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;149;-403.2565,1011.686;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;237;-354.9358,3257.045;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;141;239.3885,1414.408;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;66;225.2129,249.2902;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;99;-2573.558,-440.557;Inherit;False;Texture;9;0;False;1;0;SAMPLER2D;0;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.WireNode;169;-326.6317,-354.7689;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.WireNode;126;-1003.882,-231.9052;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;131;941.968,-173.7672;Inherit;False;Output_2D;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;96;-1649.888,-153.7866;Inherit;False;Input_TextureArray;-1;True;1;0;SAMPLER2DARRAY;;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.WireNode;164;-379.3847,853.952;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;229;-572.9658,3296.807;Inherit;False;105;Input_SS;1;0;OBJECT;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.SamplerNode;7;-76.92567,-95.16291;Inherit;True;Property;_TextureSample2;Texture + Sample 2;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.GetLocalVarNode;232;-581.6864,3211.935;Inherit;False;98;Input_Index;1;0;OBJECT;;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;129;299.7782,302.3605;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;133;313.9539,1467.479;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SamplerNode;4;-72.57567,-504.1286;Inherit;True;Property;_TextureSample0;Texture + Sample 0;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.WireNode;123;-399.6465,-182.0461;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;165;-384.1563,873.0378;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;120;-392.0465,-249.4461;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.LerpOp;153;765.1377,994.7519;Inherit;False;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.GetLocalVarNode;150;-921.8599,664.8158;Inherit;False;96;Input_TextureArray;1;0;OBJECT;;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.WireNode;125;-792.2485,-371.2797;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.WireNode;121;-391.6465,-226.8461;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.TextureCoordinatesNode;102;-2396.089,-365.7368;Inherit;False;0;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.WireNode;223;-372.0595,3381.453;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;236;-352.8128,3242.612;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;221;-370.7801,3337.677;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.GetLocalVarNode;228;-617.197,3114.176;Inherit;False;96;Input_TextureArray;1;0;OBJECT;;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.WireNode;168;-329.5981,-387.3966;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.WireNode;67;-92.05823,320.7514;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;200;-1638.688,242.1192;Inherit;False;Input_FetchWeights;-1;True;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionSwitch;72;2095.89,-139.1704;Inherit;False;Sample + Mode;False;0;4;-1;2D;2D Array;Fetch 2D;Fetch 2D Array;Object;-1;9;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;3;COLOR;0,0,0,0;False;4;COLOR;0,0,0,0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.WireNode;222;-367.2213,3359.789;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.GetLocalVarNode;205;-401.1604,2671.893;Inherit;False;200;Input_FetchWeights;1;0;OBJECT;;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.GetLocalVarNode;147;-661.0379,957.996;Inherit;False;105;Input_SS;1;0;OBJECT;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;98;-1643.479,-47.99601;Inherit;False;Input_Index;-1;True;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;73;1469.538,-43.06931;Inherit;False;202;Output_Fetch2D;1;0;OBJECT;;False;1;COLOR;0\nNode;AmplifyShaderEditor.WireNode;122;-398.3464,-201.1461;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;135;-74.45852,1513.43;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;85;2768.492,1.857527;Inherit;False;False;-1;G;2;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;82;2771.692,77.05763;Inherit;False;True;-1;B;3;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;83;2773.292,155.4575;Inherit;False;False;-1;A;4;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;84;2768.492,-68.54239;Inherit;False;False;-1;R;1;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;86;2768.33,-138.4119;Inherit;False;False;-1;RGBA;0;False;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nWireConnection;218;0;228;0\nWireConnection;217;0;228;0\nWireConnection;191;0;188;0\nWireConnection;214;0;227;0\nWireConnection;213;0;227;0\nWireConnection;219;0;228;0\nWireConnection;189;0;188;0\nWireConnection;233;0;215;0\nWireConnection;127;0;2;8\nWireConnection;226;0;230;1\nWireConnection;234;0;214;0\nWireConnection;180;0;191;0\nWireConnection;180;1;183;0\nWireConnection;180;7;196;0\nWireConnection;181;0;180;0\nWireConnection;181;1;179;0\nWireConnection;181;2;187;0\nWireConnection;224;0;211;0\nWireConnection;224;1;212;0\nWireConnection;224;2;226;0\nWireConnection;176;0;181;0\nWireConnection;176;1;182;0\nWireConnection;176;2;203;0\nWireConnection;207;0;217;0\nWireConnection;207;1;234;0\nWireConnection;207;6;236;0\nWireConnection;207;7;221;0\nWireConnection;177;0;189;0\nWireConnection;177;1;184;0\nWireConnection;177;7;194;0\nWireConnection;158;0;150;0\nWireConnection;216;0;227;0\nWireConnection;145;1;146;0\nWireConnection;145;2;155;0\nWireConnection;190;0;188;0\nWireConnection;179;0;190;0\nWireConnection;179;1;186;0\nWireConnection;179;7;195;0\nWireConnection;105;0;94;0\nWireConnection;45;0;6;0\nWireConnection;45;1;4;0\nWireConnection;45;2;66;0\nWireConnection;203;0;187;1\nWireConnection;220;0;229;0\nWireConnection;211;0;210;0\nWireConnection;211;1;209;0\nWireConnection;211;2;230;0\nWireConnection;209;0;218;0\nWireConnection;209;1;216;0\nWireConnection;209;6;237;0\nWireConnection;209;7;222;0\nWireConnection;193;0;192;0\nWireConnection;159;0;150;0\nWireConnection;208;0;228;0\nWireConnection;208;1;233;0\nWireConnection;208;6;235;0\nWireConnection;208;7;220;0\nWireConnection;230;0;231;0\nWireConnection;182;0;177;0\nWireConnection;182;1;178;0\nWireConnection;182;2;187;0\nWireConnection;185;0;204;0\nWireConnection;161;0;150;0\nWireConnection;186;0;204;0\nWireConnection;202;0;176;0\nWireConnection;187;0;205;0\nWireConnection;88;0;87;0\nWireConnection;76;0;79;0\nWireConnection;74;0;72;0\nWireConnection;80;0;78;0\nWireConnection;225;0;224;0\nWireConnection;160;0;150;0\nWireConnection;235;0;232;0\nWireConnection;81;0;73;0\nWireConnection;2;1;118;0\nWireConnection;2;2;40;0\nWireConnection;183;0;204;0\nWireConnection;215;0;227;0\nWireConnection;196;0;192;0\nWireConnection;195;0;192;0\nWireConnection;238;0;232;0\nWireConnection;194;0;192;0\nWireConnection;184;0;204;0\nWireConnection;212;0;207;0\nWireConnection;212;1;208;0\nWireConnection;212;2;230;0\nWireConnection;197;0;198;0\nWireConnection;128;0;67;0\nWireConnection;6;0;167;0\nWireConnection;6;1;2;5\nWireConnection;6;7;121;0\nWireConnection;156;0;153;0\nWireConnection;178;0;188;0\nWireConnection;178;1;185;0\nWireConnection;178;7;193;0\nWireConnection;97;0;92;0\nWireConnection;139;0;161;0\nWireConnection;139;1;145;7\nWireConnection;139;6;166;0\nWireConnection;139;7;144;0\nWireConnection;152;0;138;0\nWireConnection;152;1;154;0\nWireConnection;152;2;141;0\nWireConnection;155;0;157;0\nWireConnection;68;0;2;9\nWireConnection;92;0;102;0\nWireConnection;92;1;103;0\nWireConnection;92;2;102;0\nWireConnection;92;3;103;0\nWireConnection;157;0;158;0\nWireConnection;142;0;145;8\nWireConnection;151;0;147;0\nWireConnection;163;0;162;0\nWireConnection;44;0;46;0\nWireConnection;44;1;45;0\nWireConnection;44;2;129;0\nWireConnection;134;0;145;8\nWireConnection;210;0;219;0\nWireConnection;210;1;213;0\nWireConnection;210;6;238;0\nWireConnection;210;7;223;0\nWireConnection;148;0;147;0\nWireConnection;140;0;134;0\nWireConnection;167;0;124;0\nWireConnection;138;0;159;0\nWireConnection;138;1;145;5\nWireConnection;138;6;164;0\nWireConnection;138;7;148;0\nWireConnection;103;2;91;0\nWireConnection;101;0;99;0\nWireConnection;136;0;139;0\nWireConnection;136;1;137;0\nWireConnection;136;2;140;0\nWireConnection;100;0;97;0\nWireConnection;46;0;43;0\nWireConnection;46;1;7;0\nWireConnection;46;2;128;0\nWireConnection;144;0;147;0\nWireConnection;154;0;150;0\nWireConnection;154;1;145;4\nWireConnection;154;6;163;0\nWireConnection;154;7;151;0\nWireConnection;43;0;169;0\nWireConnection;43;1;2;7\nWireConnection;43;7;123;0\nWireConnection;40;0;126;0\nWireConnection;137;0;160;0\nWireConnection;137;1;145;6\nWireConnection;137;6;165;0\nWireConnection;137;7;149;0\nWireConnection;166;0;162;0\nWireConnection;149;0;147;0\nWireConnection;237;0;232;0\nWireConnection;141;0;142;0\nWireConnection;66;0;127;0\nWireConnection;169;0;124;0\nWireConnection;126;0;125;0\nWireConnection;131;0;44;0\nWireConnection;96;0;91;0\nWireConnection;164;0;162;0\nWireConnection;7;0;168;0\nWireConnection;7;1;2;6\nWireConnection;7;7;122;0\nWireConnection;129;0;68;0\nWireConnection;133;0;135;0\nWireConnection;4;0;124;0\nWireConnection;4;1;2;4\nWireConnection;4;7;120;0\nWireConnection;123;0;119;0\nWireConnection;165;0;162;0\nWireConnection;120;0;119;0\nWireConnection;153;0;136;0\nWireConnection;153;1;152;0\nWireConnection;153;2;133;0\nWireConnection;125;0;124;0\nWireConnection;121;0;119;0\nWireConnection;102;2;99;0\nWireConnection;223;0;229;0\nWireConnection;236;0;232;0\nWireConnection;221;0;229;0\nWireConnection;168;0;124;0\nWireConnection;67;0;2;8\nWireConnection;200;0;199;0\nWireConnection;72;0;80;0\nWireConnection;72;1;76;0\nWireConnection;72;2;81;0\nWireConnection;72;3;88;0\nWireConnection;222;0;229;0\nWireConnection;98;0;93;0\nWireConnection;122;0;119;0\nWireConnection;135;0;145;9\nWireConnection;85;0;74;1\nWireConnection;82;0;74;2\nWireConnection;83;0;74;3\nWireConnection;84;0;74;0\nWireConnection;86;0;72;0\nASEEND*/\n//CHKSM=92DC859C84122553D9A506AB24FD12161823607A" + m_functionName: + m_description: 'Fast 4-Tap bicubic texture sampling. Smoother than regular texture + sampling at a slightly higher performance cost. + + + IMPORTANT + + Fetch modes are faster sampling paths for multiple textures that share the same + size and UVs. For these modes, the "Bicubic Precompute" node must be used to feed + the necessary data.' + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 1 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 12 + m_customNodeCategory: Rust + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bicubic Sample.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bicubic Sample.asset.meta new file mode 100644 index 0000000..eaf0052 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bicubic Sample.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ce0e14d5ad5eac645b2e5892ab3506ff +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bidirectional Parallax Mapping.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bidirectional Parallax Mapping.asset new file mode 100644 index 0000000..0c655e0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bidirectional Parallax Mapping.asset @@ -0,0 +1,49 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Bidirectional Parallax Mapping + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=18811\n-2078;98;1539;885;2195.799;594.0439;1.72294;False;False\nNode;AmplifyShaderEditor.FunctionInput;32;-1173.847,777.5085;Inherit;False;SS;13;1;False;1;0;SAMPLERSTATE;0;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.FunctionInput;11;-1895.168,-38.58259;Inherit;False;Heightmap + Tex;9;0;False;1;0;SAMPLER2D;0.0;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.SamplerStateNode;33;-1646.789,729.798;Inherit;False;0;0;0;1;-1;1;0;SAMPLER2D;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.CustomExpressionNode;35;-693.9971,-314.8272;Float;False;UVs + += plane * scale * refp * ite@$for(int i = 0@ i < ite@ i++)${$\tUVs += (tex2D(tex, + UVs).g - 1) * plane * scale@$}$return UVs@;2;False;6;True;tex;SAMPLER2D;0.0;In;;Float;False;True;UVs;FLOAT2;0,0;In;;Float;False;True;plane;FLOAT2;0,0;In;;Float;False;True;ite;INT;0;In;;Float;False;True;refp;FLOAT;0;In;;Float;False;True;scale;FLOAT;0;In;;Float;False;IterativeParallaxLegacy;True;False;0;6;0;SAMPLER2D;0.0;False;1;FLOAT2;0,0;False;2;FLOAT2;0,0;False;3;INT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.CustomExpressionNode;27;-727.9086,-54.66006;Float;False;UVs + += plane * scale * refp * ite@$for(int i = 0@ i < ite@ i++)${$#if ASE_USING_SAMPLING_MACROS$\tUVs + += (SAMPLE_TEXTURE2D( tex, customSS, UVs ).g - 1) * plane * scale@$#else$\tUVs + += (tex2D(tex, UVs).g - 1) * plane * scale@$#endif$}$return UVs@;2;False;7;True;tex;SAMPLER2D;0.0;In;;Float;False;True;UVs;FLOAT2;0,0;In;;Float;False;True;plane;FLOAT2;0,0;In;;Float;False;True;ite;INT;0;In;;Float;False;True;refp;FLOAT;0;In;;Float;False;True;scale;FLOAT;0;In;;Float;False;True;customSS;SAMPLERSTATE;;In;;Inherit;False;IterativeParallax;True;False;0;7;0;SAMPLER2D;0.0;False;1;FLOAT2;0,0;False;2;FLOAT2;0,0;False;3;INT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;SAMPLERSTATE;;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionSwitch;34;-372.7607,78.24609;Inherit;False;Unity + 2018 or Higher;True;1;2;-1;In 0;In 1;Object;-1;9;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionInput;9;-1181.702,667.7348;Inherit;False;Parallax + Scale;1;3;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.TextureCoordinatesNode;22;-1295.124,60.47374;Inherit;False;0;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.DynamicAppendNode;2;-1371.897,195.5105;Inherit;False;FLOAT2;4;0;FLOAT2;0,0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleDivideOpNode;4;-1166.738,231.9931;Inherit;False;2;0;FLOAT2;0,0;False;1;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionInput;25;-1196.823,405.4736;Inherit;False;Iterations;0;4;False;1;0;INT;1;False;1;INT;0\nNode;AmplifyShaderEditor.FunctionInput;10;-1187.709,555.5891;Inherit;False;Reference + Plane;1;2;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.ViewDirInputsCoordNode;1;-1618.191,180.3121;Float;False;Tangent;False;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3\nNode;AmplifyShaderEditor.FunctionOutput;0;0.5848999,-19.6864;Inherit;False;True;-1;Out;0;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nWireConnection;32;0;33;0\nWireConnection;33;0;11;0\nWireConnection;35;0;11;0\nWireConnection;35;1;22;0\nWireConnection;35;2;4;0\nWireConnection;35;3;25;0\nWireConnection;35;4;10;0\nWireConnection;35;5;9;0\nWireConnection;27;0;11;0\nWireConnection;27;1;22;0\nWireConnection;27;2;4;0\nWireConnection;27;3;25;0\nWireConnection;27;4;10;0\nWireConnection;27;5;9;0\nWireConnection;27;6;32;0\nWireConnection;34;0;35;0\nWireConnection;34;1;27;0\nWireConnection;22;2;11;0\nWireConnection;2;0;1;0\nWireConnection;4;0;2;0\nWireConnection;4;1;1;3\nWireConnection;0;0;34;0\nASEEND*/\n//CHKSM=6EE46B6FFD57D58A4296B6A03938C323EF31A8F5" + m_functionName: + m_description: Creates a parallax mapping effect with user defined iterations and + reference plane. + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_customEdited: 0 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 15 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bidirectional Parallax Mapping.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bidirectional Parallax Mapping.asset.meta new file mode 100644 index 0000000..bfca124 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bidirectional Parallax Mapping.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ab457a4ccb6d8f745b63ef50e1417242 +timeCreated: 1507301651 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Blinn-Phong Half Vector.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Blinn-Phong Half Vector.asset new file mode 100644 index 0000000..567173c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Blinn-Phong Half Vector.asset @@ -0,0 +1,23 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Blinn-Phong Half Vector + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=13705\n487;506;979;512;774.2847;195.955;1;False;False\nNode;AmplifyShaderEditor.WorldSpaceLightDirHlpNode;2;-640,96;Float;False;1;0;FLOAT;0.0;False;4;FLOAT3;FLOAT;FLOAT;FLOAT\nNode;AmplifyShaderEditor.ViewDirInputsCoordNode;1;-592,-64;Float;False;World;0;4;FLOAT3;FLOAT;FLOAT;FLOAT\nNode;AmplifyShaderEditor.SimpleAddOpNode;3;-336,0;Float;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0.0,0,0;False;1;FLOAT3\nNode;AmplifyShaderEditor.NormalizeNode;4;-176,0;Float;False;1;0;FLOAT3;0,0,0,0;False;1;FLOAT3\nNode;AmplifyShaderEditor.FunctionOutput;0;0,0;Float;False;True;XYZ;0;1;0;FLOAT3;0,0,0;False;0\nWireConnection;3;0;1;0\nWireConnection;3;1;2;0\nWireConnection;4;0;3;0\nWireConnection;0;0;4;0\nASEEND*/\n//CHKSM=CDF922191A60D2395104E4F539CAFDF78289C070" + m_functionName: + m_description: Calculates the halfway vector between view direction and light direction + in world space. + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_nodeCategory: 11 + m_customNodeCategory: Custom Lighting diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Blinn-Phong Half Vector.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Blinn-Phong Half Vector.asset.meta new file mode 100644 index 0000000..ddcbca9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Blinn-Phong Half Vector.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 91a149ac9d615be429126c95e20753ce +timeCreated: 1509361778 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Blinn-Phong Light.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Blinn-Phong Light.asset new file mode 100644 index 0000000..d5779fb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Blinn-Phong Light.asset @@ -0,0 +1,41 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Blinn-Phong Light + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=16306\n716;346;1066;687;501.1261;294.544;1;False;False\nNode;AmplifyShaderEditor.ComponentMaskNode;29;48,-496;Float;False;True;True;True;False;1;0;COLOR;0,0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.RangedFloatNode;22;-352,-224;Float;False;Property;_Shininess;Shininess;2;0;Create;True;0;0;False;0;0.1;0;0.01;1;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;37;609.1547,-34.90417;Float;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT3;0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.SimpleMaxOpNode;59;-336,-320;Float;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionNode;51;-832,-288;Float;False;Blinn-Phong + Half Vector;-1;;2;91a149ac9d615be429126c95e20753ce;0;0;1;FLOAT3;0\nNode;AmplifyShaderEditor.ComponentMaskNode;44;48,-416;Float;False;False;False;False;True;1;0;COLOR;0,0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.ColorNode;24;-368,-496;Float;False;Property;_SpecularColor;Specular + Color;1;0;Create;True;0;0;False;0;0.3921569,0.3921569,0.3921569,1;0,0,0,0;False;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.PowerNode;21;112,-320;Float;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.IndirectDiffuseLighting;34;337.1547,77.09583;Float;False;World;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;36;417.1547,-34.90417;Float;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.LightColorNode;17;14.82559,-84.1315;Float;False;0;3;COLOR;0;FLOAT3;1;FLOAT;2\nNode;AmplifyShaderEditor.LightAttenuation;10;-27.48053,45.50479;Float;False;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;38;1009.155,-34.90417;Float;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT3;0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.ComponentMaskNode;47;769.1547,93.09583;Float;False;True;True;True;False;1;0;COLOR;0,0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.ComponentMaskNode;50;769.1547,189.0958;Float;False;False;False;False;True;1;0;COLOR;0,0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;25;801.1547,-274.9042;Float;False;4;4;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.DotProductOpNode;19;-512,-240;Float;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WorldNormalVector;12;-937.117,-98.03006;Float;False;False;1;0;FLOAT3;0,0,0;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3\nNode;AmplifyShaderEditor.WireNode;67;395.671,-128.7589;Float;False;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.WireNode;55;-518.842,331.2534;Float;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.NormalizeNode;64;-729.1198,-98.03006;Float;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.ColorNode;26;353.1547,189.0958;Float;False;Property;_MainColor;Main + Color;0;0;Create;True;0;0;False;0;0.3921569,0.3921569,0.3921569,1;0,0,0,0;False;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SimpleMaxOpNode;15;-65.18457,141.2409;Float;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;40;232.9505,-46.9381;Float;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;39;1185.155,-162.9042;Float;False;2;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.FunctionInput;42;625.1547,189.0958;Float;False;Diffuse;5;0;False;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.FunctionInput;52;-1065.115,-98.03006;Float;False;Normal;3;1;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionInput;43;-128,-496;Float;False;Specular;5;2;False;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;60;-48,-256;Float;False;2;2;0;FLOAT;0;False;1;FLOAT;128;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;56;165.1989,329.8424;Float;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.WorldSpaceLightDirHlpNode;13;-487.8197,165.9312;Float;False;False;1;0;FLOAT;0;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3\nNode;AmplifyShaderEditor.Vector3Node;53;-1273.115,-98.03006;Float;False;Constant;_DefaultNormal;DefaultNormal;3;0;Create;True;0;0;False;0;0,0,1;0,0,0;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3\nNode;AmplifyShaderEditor.DotProductOpNode;14;-210.7447,112.9567;Float;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;0;1329.155,-162.9042;Float;False;True;RGB;0;False;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.FunctionOutput;57;1329.155,-82.90417;Float;False;True;Alpha;1;False;1;0;FLOAT;0;False;1;FLOAT;0\nWireConnection;29;0;43;0\nWireConnection;37;0;36;0\nWireConnection;37;1;34;0\nWireConnection;59;0;19;0\nWireConnection;44;0;43;0\nWireConnection;21;0;59;0\nWireConnection;21;1;60;0\nWireConnection;34;0;56;0\nWireConnection;36;0;40;0\nWireConnection;36;1;15;0\nWireConnection;38;0;37;0\nWireConnection;38;1;47;0\nWireConnection;47;0;42;0\nWireConnection;50;0;42;0\nWireConnection;25;0;29;0\nWireConnection;25;1;44;0\nWireConnection;25;2;21;0\nWireConnection;25;3;67;0\nWireConnection;19;0;51;0\nWireConnection;19;1;64;0\nWireConnection;12;0;52;0\nWireConnection;67;0;40;0\nWireConnection;55;0;64;0\nWireConnection;64;0;12;0\nWireConnection;15;0;14;0\nWireConnection;40;0;17;0\nWireConnection;40;1;10;0\nWireConnection;39;0;25;0\nWireConnection;39;1;38;0\nWireConnection;42;0;26;0\nWireConnection;52;0;53;0\nWireConnection;43;0;24;0\nWireConnection;60;0;22;0\nWireConnection;56;0;55;0\nWireConnection;14;0;64;0\nWireConnection;14;1;13;0\nWireConnection;0;0;39;0\nWireConnection;57;0;50;0\nASEEND*/\n//CHKSM=57C0C1F3D628A2FE0988ED3E128E1C80E9BEE859" + m_functionName: + m_description: Generates a lighting model using Blinn-Phong reflectance model and + closely resembles Unity legacy shaders. + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 5 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Blinn-Phong Light.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Blinn-Phong Light.asset.meta new file mode 100644 index 0000000..af90b62 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Blinn-Phong Light.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cf814dba44d007a4e958d2ddd5813da6 +timeCreated: 1510331168 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/BlinnPhongLightWrap.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/BlinnPhongLightWrap.asset new file mode 100644 index 0000000..5ae1746 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/BlinnPhongLightWrap.asset @@ -0,0 +1,48 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: BlinnPhongLightWrap + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=16205\n234;92;1063;705;1563.922;447.6829;2.241337;True;False\nNode;AmplifyShaderEditor.CommentaryNode;82;-868.7166,1513.25;Float;False;615.7619;256.2104;;4;0;73;72;71;Diffuse + + Specular;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;62;-874.5117,944.6415;Float;False;2334.29;521.7126;Comment;20;60;1;69;66;68;67;61;56;55;47;50;53;51;52;49;48;45;46;44;70;Diffuse + Color;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;43;-873.949,406.1891;Float;False;1347.446;439.3573;;11;41;40;42;2;33;34;36;37;39;38;32;Specular + Color;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;31;-871.1387,-356.8812;Float;False;1192.721;289.2242;;7;21;20;18;23;19;4;17;NDotL;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;30;-875.0961,-9.355102;Float;False;977.2441;332.3028;;6;26;29;28;27;77;76;Half + Dir;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;15;-856.0029,-727.2549;Float;False;924;294;;7;3;10;12;13;11;9;14;Gloss;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;16;-866.0001,-1064.568;Float;False;748.5;272;;4;8;7;5;6;Light + Attenuation;1,1,1,1;0;0\nNode;AmplifyShaderEditor.Exp2OpNode;9;-310.0023,-612.2548;Float;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.LightColorNode;6;-768.0001,-1014.568;Float;False;0;3;COLOR;0;FLOAT3;1;FLOAT;2\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;61;351.8147,1114.297;Float;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;40;22.70839,527.0504;Float;False;3;3;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;2;FLOAT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SimpleMaxOpNode;36;-412.9491,536.5466;Float;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMaxOpNode;55;193.8148,1072.297;Float;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.RangedFloatNode;46;-819.0866,1078.04;Float;False;Constant;_Float3;Float + 3;0;0;Create;True;0;0;False;0;0.5;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;34;-823.949,563.5466;Float;False;23;CurrentNormal;1;0;OBJECT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SwizzleNode;48;-461.0868,1017.04;Float;False;FLOAT3;0;0;0;0;1;0;FLOAT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;45;-614.0866,1015.04;Float;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;33;-809.7029,474.5466;Float;False;29;HalfDirection;1;0;OBJECT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionInput;44;-824.5117,994.6415;Float;False;Light + Wrapping;1;4;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;41;-314.718,456.1892;Float;False;8;AttenuationColor;1;0;OBJECT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.DotProductOpNode;32;-562.3635,499.8815;Float;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;51;-189.0866,1179.04;Float;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;47;-292.0868,1021.04;Float;False;LightWrapVector;-1;True;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.GetLocalVarNode;50;-605.0866,1170.04;Float;False;47;LightWrapVector;1;0;OBJECT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.OneMinusNode;49;-358.0868,1176.04;Float;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FogAndAmbientColorsNode;67;339.0064,1220.623;Float;False;UNITY_LIGHTMODEL_AMBIENT;0;1;COLOR;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;73;-560,1600;Float;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.GetLocalVarNode;72;-832,1664;Float;False;42;specularFinalColor;1;0;OBJECT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.GetLocalVarNode;71;-832,1568;Float;False;70;DiffuseColor;1;0;OBJECT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.RangedFloatNode;37;-566.9489,632.5466;Float;False;Constant;_Float2;Float + 2;0;0;Create;True;0;0;False;0;0;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;66;790.0066,1122.623;Float;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.Vector3Node;56;-16.18523,1193.297;Float;False;Constant;_Vector1;Vector + 1;0;0;Create;True;0;0;False;0;0,0,0;0,0,0;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3\nNode;AmplifyShaderEditor.GetLocalVarNode;60;9.172014,1340.574;Float;False;8;AttenuationColor;1;0;OBJECT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;10;-614.0029,-660.2548;Float;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;12;-806.0029,-564.2547;Float;False;Constant;_Float0;Float + 0;0;0;Create;True;0;0;False;0;10;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;53;-20.54932,1092.818;Float;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;70;1146.801,1151.155;Float;False;DiffuseColor;-1;True;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;42;200.4974,524.5294;Float;False;specularFinalColor;-1;True;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.RangedFloatNode;13;-630.0029,-548.2548;Float;False;Constant;_Float1;Float + 1;0;0;Create;True;0;0;False;0;1;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;14;-182.0024,-628.2548;Float;False;SpecularPower;-1;True;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SwizzleNode;68;609.0066,1209.623;Float;False;FLOAT3;0;1;2;3;1;0;COLOR;0,0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;7;-576.0001,-950.5679;Float;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionInput;1;736.0968,1302.828;Float;False;Diffuse;3;0;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.GetLocalVarNode;52;-398.0868,1262.04;Float;False;21;NDotL;1;0;OBJECT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;69;976.0066,1143.623;Float;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;11;-454.0023,-612.2548;Float;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.PowerNode;38;-239.3654,550.192;Float;False;2;0;FLOAT;0;False;1;FLOAT;1;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;2;-234.7179,664.1893;Float;False;Specular;1;2;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;39;-516.949,730.5465;Float;False;14;SpecularPower;1;0;OBJECT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WorldSpaceLightPos;76;-854.467,61.70709;Float;False;0;3;FLOAT4;0;FLOAT3;1;FLOAT;2\nNode;AmplifyShaderEditor.NormalizeNode;77;-598.467,61.70709;Float;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.WorldNormalVector;19;-521.2433,-309.2914;Float;False;True;1;0;FLOAT3;0,0,1;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3\nNode;AmplifyShaderEditor.RegisterLocalVarNode;23;-329.2433,-309.2914;Float;False;CurrentNormal;-1;True;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.Vector3Node;17;-857.2433,-309.2914;Float;False;Constant;_Vector0;Vector + 0;0;0;Create;True;0;0;False;0;0,0,1;0,0,0;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3\nNode;AmplifyShaderEditor.FunctionInput;4;-681.2433,-309.2914;Float;False;Normal;3;1;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionInput;3;-785.0029,-677.2548;Float;False;Gloss;1;3;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.LightAttenuation;5;-816.0001,-886.5679;Float;False;0;1;FLOAT;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;8;-400,-966.5679;Float;False;AttenuationColor;-1;True;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.WorldSpaceLightDirHlpNode;18;-329.2433,-213.2914;Float;False;False;1;0;FLOAT;0;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3\nNode;AmplifyShaderEditor.DotProductOpNode;20;-57.24332,-277.2914;Float;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;21;86.75671,-261.2914;Float;False;NDotL;-1;True;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.ViewDirInputsCoordNode;26;-800,160;Float;False;World;False;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3\nNode;AmplifyShaderEditor.SimpleAddOpNode;27;-422.467,77.70709;Float;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.NormalizeNode;28;-294.467,77.70709;Float;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;29;-134.467,77.70709;Float;False;HalfDirection;-1;True;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionOutput;0;-416,1616;Float;False;True;Output;0;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nWireConnection;9;0;11;0\nWireConnection;61;0;55;0\nWireConnection;61;1;60;0\nWireConnection;40;0;41;0\nWireConnection;40;1;38;0\nWireConnection;40;2;2;0\nWireConnection;36;0;32;0\nWireConnection;36;1;37;0\nWireConnection;55;0;53;0\nWireConnection;55;1;56;0\nWireConnection;48;0;45;0\nWireConnection;45;0;44;0\nWireConnection;45;1;46;0\nWireConnection;32;0;33;0\nWireConnection;32;1;34;0\nWireConnection;51;0;49;0\nWireConnection;51;1;52;0\nWireConnection;47;0;48;0\nWireConnection;49;0;50;0\nWireConnection;73;0;71;0\nWireConnection;73;1;72;0\nWireConnection;66;0;61;0\nWireConnection;66;1;68;0\nWireConnection;10;0;3;0\nWireConnection;10;1;12;0\nWireConnection;53;0;47;0\nWireConnection;53;1;51;0\nWireConnection;70;0;69;0\nWireConnection;42;0;40;0\nWireConnection;14;0;9;0\nWireConnection;68;0;67;0\nWireConnection;7;0;6;1\nWireConnection;7;1;5;0\nWireConnection;69;0;66;0\nWireConnection;69;1;1;0\nWireConnection;11;0;10;0\nWireConnection;11;1;13;0\nWireConnection;38;0;36;0\nWireConnection;38;1;39;0\nWireConnection;77;0;76;1\nWireConnection;19;0;4;0\nWireConnection;23;0;19;0\nWireConnection;4;0;17;0\nWireConnection;8;0;7;0\nWireConnection;20;0;23;0\nWireConnection;20;1;18;0\nWireConnection;21;0;20;0\nWireConnection;27;0;77;0\nWireConnection;27;1;26;0\nWireConnection;28;0;27;0\nWireConnection;29;0;28;0\nWireConnection;0;0;73;0\nASEEND*/\n//CHKSM=2875532B381E030A9F10046AE6BB0271C00931BB" + m_functionName: + m_description: + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 3 + m_customNodeCategory: + m_previewPosition: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/BlinnPhongLightWrap.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/BlinnPhongLightWrap.asset.meta new file mode 100644 index 0000000..ec6b34e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/BlinnPhongLightWrap.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 139fed909c1bc1a42a96c42d8cf09006 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/BoxMask.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/BoxMask.asset new file mode 100644 index 0000000..2de5098 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/BoxMask.asset @@ -0,0 +1,27 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: BoxMask + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=14205\n585;92;1335;966;841.4062;390.9513;1;True;False\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;3;-770.7323,-83.37894;Float;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0.0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;7;-359.1361,-15.58681;Float;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.AbsOpNode;6;-536.6868,-59.16749;Float;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SimpleDivideOpNode;15;268.7505,-15.58675;Float;False;2;0;FLOAT;0.0;False;1;FLOAT;0.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMaxOpNode;12;-99.26636,-15.5865;Float;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionInput;1;-1107.93,-142.7251;Float;False;World + Position;3;0;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionInput;10;-880.4891,142.5947;Float;False;Size;3;2;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionInput;4;-1091.939,-4.288156;Float;False;Center;3;1;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionInput;17;37.9352,82.87358;Float;False;Falloff;1;3;False;1;0;FLOAT;0.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DistanceOpNode;13;36.31915,-15.58687;Float;False;2;0;FLOAT3;0,0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;8;-599.6362,161.9639;Float;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0.5,0.5,0.5;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionOutput;0;461.6318,-16.14097;Float;False;True;Output;0;False;1;0;FLOAT;0.0;False;1;FLOAT;0\nWireConnection;3;0;1;0\nWireConnection;3;1;4;0\nWireConnection;7;0;6;0\nWireConnection;7;1;8;0\nWireConnection;6;0;3;0\nWireConnection;15;0;13;0\nWireConnection;15;1;17;0\nWireConnection;12;0;7;0\nWireConnection;13;0;12;0\nWireConnection;8;0;10;0\nWireConnection;0;0;15;0\nASEEND*/\n//CHKSM=B3B832D729B3AA37648FFC3D368D473533835BDC" + m_functionName: + m_description: Box Mask + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_nodeCategory: 3 + m_customNodeCategory: + m_previewPosition: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/BoxMask.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/BoxMask.asset.meta new file mode 100644 index 0000000..ab3c8b1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/BoxMask.asset.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 9dce4093ad5a42b4aa255f0153c4f209 +timeCreated: 1516621733 +licenseType: Store +NativeFormatImporter: + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bricks Pattern.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bricks Pattern.asset new file mode 100644 index 0000000..123cc59 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bricks Pattern.asset @@ -0,0 +1,41 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Bricks Pattern + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=17902\n-1462;-370;1004;726;3880.583;1484.979;4.133047;True;False\nNode;AmplifyShaderEditor.FractNode;23;-1104,-16;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.DynamicAppendNode;27;-1296,-80;Inherit;False;FLOAT2;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;30;-1472,-192;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FloorOpNode;32;-928,-256;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;12;-1760,192;Inherit;False;FLOAT2;1;0;FLOAT2;0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.BreakToComponentsNode;31;-736,-176;Inherit;False;FLOAT2;1;0;FLOAT2;0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.FunctionInput;17;-960,-160;Inherit;False;Luminance + Range;2;3;False;1;0;FLOAT2;0,1;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;29;-1648,-192;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;19;-2464,48;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionInput;15;-2640,176;Inherit;False;Tiling;2;0;False;1;0;FLOAT2;2,4;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.TexCoordVertexDataNode;18;-2704,48;Inherit;False;0;2;0;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.StepOpNode;28;-1808,-192;Inherit;False;2;0;FLOAT;1;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;26;-2272,-80;Inherit;False;FLOAT2;1;0;FLOAT2;0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.SimpleRemainderNode;25;-2000,-160;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;2;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;16;-1808,-272;Inherit;False;Offset;1;2;False;1;0;FLOAT;0.5;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;22;-1504,368;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;14;-832,192;Inherit;False;Size;1;1;False;1;0;FLOAT;0.65;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;4;-672,80;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;6;-928,80;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionNode;2;-448,0;Inherit;False;Rectangle;-1;;1;6b23e0c975270fb4084c354b2c83366a;0;3;1;FLOAT2;0,0;False;2;FLOAT;0.5;False;3;FLOAT;0.5;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionNode;24;-448,-256;Inherit;False;Random + Range;-1;;2;7b754edb8aebbfb4a9ace907af661cfc;0;3;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT;1;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;1;-160,-256;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;5;-672,256;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleDivideOpNode;9;-1104,288;Inherit;False;2;0;FLOAT;-1;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMinOpNode;20;-1104,384;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SignOpNode;21;-1360,368;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleDivideOpNode;8;-1104,80;Inherit;False;2;0;FLOAT;1;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;7;-928,288;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMaxOpNode;11;-1104,192;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;0;0,0;Inherit;True;True;-1;Bricks;0;True;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;3;0,-256;Inherit;True;False;-1;Luminance;1;False;1;0;FLOAT;0;False;1;FLOAT;0\nWireConnection;23;0;27;0\nWireConnection;27;0;30;0\nWireConnection;27;1;26;1\nWireConnection;30;0;29;0\nWireConnection;30;1;26;0\nWireConnection;32;0;27;0\nWireConnection;12;0;15;0\nWireConnection;31;0;17;0\nWireConnection;29;0;16;0\nWireConnection;29;1;28;0\nWireConnection;19;0;18;0\nWireConnection;19;1;15;0\nWireConnection;28;1;25;0\nWireConnection;26;0;19;0\nWireConnection;25;0;26;1\nWireConnection;22;0;12;1\nWireConnection;22;1;12;0\nWireConnection;4;0;6;0\nWireConnection;4;1;14;0\nWireConnection;6;0;8;0\nWireConnection;6;1;11;0\nWireConnection;2;1;23;0\nWireConnection;2;2;4;0\nWireConnection;2;3;5;0\nWireConnection;24;1;32;0\nWireConnection;24;2;31;0\nWireConnection;24;3;31;1\nWireConnection;1;0;24;0\nWireConnection;1;1;2;0\nWireConnection;5;0;14;0\nWireConnection;5;1;7;0\nWireConnection;9;1;12;0\nWireConnection;20;0;21;0\nWireConnection;21;0;22;0\nWireConnection;8;1;12;1\nWireConnection;7;0;9;0\nWireConnection;7;1;20;0\nWireConnection;11;0;21;0\nWireConnection;0;0;2;0\nWireConnection;3;0;1;0\nASEEND*/\n//CHKSM=27789CFA7C579B24211E55A89520C287602B2C4E" + m_functionName: + m_description: Creates a repeated bricks pattern with alternating offsetted lines + of bricks. + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 9 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bricks Pattern.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bricks Pattern.asset.meta new file mode 100644 index 0000000..a382913 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Bricks Pattern.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7d219d3a79fd53a48987a86fa91d6bac +timeCreated: 1586861586 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Checkerboard.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Checkerboard.asset new file mode 100644 index 0000000..c3a6f65 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Checkerboard.asset @@ -0,0 +1,56 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Checkerboard + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=17500\n2092;369;1066;673;519.6959;768.1077;1.3;True;False\nNode;AmplifyShaderEditor.CommentaryNode;18;-1101.678,-1164.645;Inherit;False;1511.133;506.8259;;12;6;1;10;11;12;4;9;13;14;15;16;17;UV + and Derivatives;1,1,1,1;0;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;39;-1068.804,243.1458;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.RangedFloatNode;40;-1228.804,307.1458;Inherit;False;Constant;_Float4;Float + 4;0;0;Create;True;0;0;False;0;4;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.AbsOpNode;32;-1208.804,195.1458;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.RangedFloatNode;42;-1068.804,355.1458;Inherit;False;Constant;_Float5;Float + 5;0;0;Create;True;0;0;False;0;1;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;3;95.94269,118.7242;Inherit;False;Color + B;5;2;False;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;37;-1340.804,195.1458;Inherit;False;2;0;FLOAT2;0,0;False;1;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.RangedFloatNode;38;-1532.805,275.1458;Inherit;False;Constant;_Float3;Float + 3;0;0;Create;True;0;0;False;0;0.5;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;66;-60.19727,349.9423;Inherit;False;Constant;_Float9;Float + 9;0;0;Create;True;0;0;False;0;0.5;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.ColorNode;8;-112.0574,118.7242;Inherit;False;Constant;_Color1;Color + 1;0;0;Create;True;0;0;False;0;0.6980392,0.6980392,0.6980392,0;0,0,0,0;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.RangedFloatNode;50;-829.9077,762.2733;Inherit;False;Constant;_Float6;Float + 6;0;0;Create;True;0;0;False;0;1.1;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;68;-56.59735,495.6422;Inherit;False;4;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;67;95.94269,422.7241;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.ColorNode;7;-112.0574,-73.27585;Inherit;False;Constant;_Color0;Color + 0;0;0;Create;True;0;0;False;0;0.2,0.2,0.2,0;0,0,0,0;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.BreakToComponentsNode;71;-302.0974,513.8422;Inherit;False;FLOAT2;1;0;FLOAT2;0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.FractNode;33;-1484.805,163.1458;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SqrtOpNode;48;-366.826,795.2014;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SaturateNode;49;-517.6261,801.4014;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;53;-1232.34,860.269;Inherit;False;29;derivativesLength;1;0;OBJECT;;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;55;-1036.94,854.6689;Inherit;False;FLOAT2;1;0;FLOAT2;0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.RangedFloatNode;58;-637.4819,548.7932;Inherit;False;Constant;_Float7;Float + 7;0;0;Create;True;0;0;False;0;-1;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;35;-1596.804,163.1458;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;51;-662.9076,794.273;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.ClampOpNode;57;-477.4815,516.7932;Inherit;False;3;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;2;FLOAT2;1,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;63;-637.4819,452.7921;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;41;-924.8043,291.1458;Inherit;False;2;0;FLOAT2;0,0;False;1;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.GetLocalVarNode;45;-987.7781,549.8922;Inherit;False;29;derivativesLength;1;0;OBJECT;;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.RangedFloatNode;59;-637.4819,628.7933;Inherit;False;Constant;_Float8;Float + 8;0;0;Create;True;0;0;False;0;1;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;43;-956.7781,452.0911;Inherit;False;Constant;_Float1;Float + 1;0;0;Create;True;0;0;False;0;0.35;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleDivideOpNode;44;-774.1779,498.6923;Inherit;False;2;0;FLOAT;0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.LerpOp;73;383.9426,22.72415;Inherit;False;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.SqrtOpNode;26;-160,-448;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.DynamicAppendNode;19;-593.6686,-565.8171;Inherit;False;FLOAT2;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.DynamicAppendNode;21;-592,-368;Inherit;False;FLOAT2;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.DynamicAppendNode;25;-288,-448;Inherit;False;FLOAT2;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;28;-966.1454,-418.2566;Inherit;False;FLOAT4;1;0;FLOAT4;0,0,0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.DotProductOpNode;23;-448,-336;Inherit;False;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;2;95.94269,-73.27585;Inherit;False;Color + A;5;1;False;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;10;-678.6784,-881.8192;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.DynamicAppendNode;22;-592,-272;Inherit;False;FLOAT2;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.DynamicAppendNode;20;-592,-464;Inherit;False;FLOAT2;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;12;-549.6785,-980.8192;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.TexCoordVertexDataNode;6;-1051.678,-816.8192;Inherit;False;0;2;0;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.DdyOpNode;15;-140.6784,-877.8192;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.GetLocalVarNode;27;-1139.145,-405.2566;Inherit;False;17;UVDerivatives;1;0;OBJECT;;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.RangedFloatNode;11;-833.6784,-945.8192;Inherit;False;Constant;_Float0;Float + 0;0;0;Create;True;0;0;False;0;0.5;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;69;-223.9972,434.8422;Inherit;False;Constant;_Float10;Float + 10;0;0;Create;True;0;0;False;0;0.5;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;36;-1740.804,211.1458;Inherit;False;Constant;_Float2;Float + 2;0;0;Create;True;0;0;False;0;0.25;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;34;-1755.153,114.0224;Inherit;False;13;FinalUV;1;0;OBJECT;;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SaturateNode;65;253.0029,341.8422;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMaxOpNode;52;-810.9399,854.6689;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;29;-48,-448;Inherit;False;derivativesLength;-1;True;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.DotProductOpNode;24;-448,-544;Inherit;False;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.Vector2Node;9;-994.1925,-1114.645;Inherit;False;Constant;_Vector0;Vector + 0;0;0;Create;True;0;0;False;0;1,1;0,0;0;3;FLOAT2;0;FLOAT;1;FLOAT;2\nNode;AmplifyShaderEditor.FunctionInput;1;-855.6784,-822.8192;Inherit;False;UV;2;0;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionInput;4;-828.1924,-1094.645;Inherit;False;Frequency;2;3;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;13;-395.1576,-957.8666;Inherit;False;FinalUV;-1;True;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.DynamicAppendNode;16;17.45426,-967.288;Inherit;False;FLOAT4;4;0;FLOAT2;0,0;False;1;FLOAT;0;False;2;FLOAT2;0,0;False;3;FLOAT;0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;17;185.4542,-971.288;Inherit;False;UVDerivatives;-1;True;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.DdxOpNode;14;-140.6784,-1005.819;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionOutput;0;612.215,21.62323;Inherit;False;True;-1;Out;0;False;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nWireConnection;39;0;32;0\nWireConnection;39;1;40;0\nWireConnection;32;0;37;0\nWireConnection;3;0;8;0\nWireConnection;37;0;33;0\nWireConnection;37;1;38;0\nWireConnection;68;0;69;0\nWireConnection;68;1;71;0\nWireConnection;68;2;71;1\nWireConnection;68;3;48;0\nWireConnection;67;0;66;0\nWireConnection;67;1;68;0\nWireConnection;71;0;57;0\nWireConnection;33;0;35;0\nWireConnection;48;0;49;0\nWireConnection;49;0;51;0\nWireConnection;55;0;53;0\nWireConnection;35;0;34;0\nWireConnection;35;1;36;0\nWireConnection;51;0;50;0\nWireConnection;51;1;52;0\nWireConnection;57;0;63;0\nWireConnection;57;1;58;0\nWireConnection;57;2;59;0\nWireConnection;63;0;41;0\nWireConnection;63;1;44;0\nWireConnection;41;0;39;0\nWireConnection;41;1;42;0\nWireConnection;44;0;43;0\nWireConnection;44;1;45;0\nWireConnection;73;0;2;0\nWireConnection;73;1;3;0\nWireConnection;73;2;65;0\nWireConnection;26;0;25;0\nWireConnection;19;0;28;0\nWireConnection;19;1;28;2\nWireConnection;21;0;28;1\nWireConnection;21;1;28;3\nWireConnection;25;0;24;0\nWireConnection;25;1;23;0\nWireConnection;28;0;27;0\nWireConnection;23;0;21;0\nWireConnection;23;1;22;0\nWireConnection;2;0;7;0\nWireConnection;10;0;11;0\nWireConnection;10;1;1;0\nWireConnection;22;0;28;1\nWireConnection;22;1;28;3\nWireConnection;20;0;28;0\nWireConnection;20;1;28;2\nWireConnection;12;0;4;0\nWireConnection;12;1;10;0\nWireConnection;15;0;13;0\nWireConnection;65;0;67;0\nWireConnection;52;0;55;0\nWireConnection;52;1;55;1\nWireConnection;29;0;26;0\nWireConnection;24;0;19;0\nWireConnection;24;1;20;0\nWireConnection;1;0;6;0\nWireConnection;4;0;9;0\nWireConnection;13;0;12;0\nWireConnection;16;0;14;0\nWireConnection;16;2;15;0\nWireConnection;17;0;16;0\nWireConnection;14;0;13;0\nWireConnection;0;0;73;0\nASEEND*/\n//CHKSM=2A92AA4C137FA7B827E342AC45B5BF06C4CEEF0A" + m_functionName: + m_description: Created a checkerboard pattern with given colors where Frequency + controls its tiling + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 9 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Checkerboard.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Checkerboard.asset.meta new file mode 100644 index 0000000..bc0c991 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Checkerboard.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 43dad715d66e03a4c8ad5f9564018081 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Color Mask.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Color Mask.asset new file mode 100644 index 0000000..c230320 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Color Mask.asset @@ -0,0 +1,37 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Color Mask + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=15401\n346;92;1025;714;609.2212;273.3323;1.054284;True;False\nNode;AmplifyShaderEditor.FunctionInput;1;-653.5797,-106.7027;Float;False;In;3;0;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.DistanceOpNode;6;-448.5804,-174.703;Float;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SaturateNode;14;608.4777,116.7526;Float;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;3;-640.5798,-192.703;Float;False;Mask + Color;3;1;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionInput;4;-658.4253,3.963058;Float;False;Range;1;2;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMaxOpNode;11;90.87174,229.5228;Float;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;5;-114.1282,184.5228;Float;False;Fuzziness;1;3;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;12;-74.12819,316.5228;Float;False;Constant;_Float0;Float + 0;0;0;Create;True;0;0;False;0;1E-05;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;8;-172.7711,-116.3855;Float;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleDivideOpNode;10;224.5456,-26.87407;Float;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.OneMinusNode;7;382.857,35.49149;Float;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;0;773.5771,78.81425;Float;False;True;Output;0;False;1;0;FLOAT;0;False;1;FLOAT;0\nWireConnection;6;0;3;0\nWireConnection;6;1;1;0\nWireConnection;14;0;7;0\nWireConnection;11;0;5;0\nWireConnection;11;1;12;0\nWireConnection;8;0;6;0\nWireConnection;8;1;4;0\nWireConnection;10;0;8;0\nWireConnection;10;1;11;0\nWireConnection;7;0;10;0\nWireConnection;0;0;14;0\nASEEND*/\n//CHKSM=17BE7B1AD5B755695D444DE4E62340591EEA3488" + m_functionName: + m_description: + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesFoldout: 0 + m_nodeCategory: 3 + m_customNodeCategory: + m_previewPosition: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Color Mask.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Color Mask.asset.meta new file mode 100644 index 0000000..363f104 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Color Mask.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: eec747d987850564c95bde0e5a6d1867 +timeCreated: 1529242750 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/ComputeFilterWidth.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/ComputeFilterWidth.asset new file mode 100644 index 0000000..286a8b8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/ComputeFilterWidth.asset @@ -0,0 +1,22 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: ComputeFilterWidth + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=14001\n389;92;1064;673;507.116;202.918;1;True;False\nNode;AmplifyShaderEditor.DotProductOpNode;4;-216,-85;Float;False;2;0;FLOAT3;0,0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SqrtOpNode;7;263,-7;Float;False;1;0;FLOAT;0.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.ConditionalIfNode;6;38,-37;Float;False;False;5;0;FLOAT;0.0;False;1;FLOAT;0.0;False;2;FLOAT;0.0;False;3;FLOAT;0.0;False;4;FLOAT;0.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DotProductOpNode;5;-185,84;Float;False;2;0;FLOAT3;0,0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DdxOpNode;2;-398,-75;Float;False;1;0;FLOAT3;0.0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionInput;1;-610,-13;Float;False;In;3;0;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.DdyOpNode;3;-372,94;Float;False;1;0;FLOAT3;0.0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionOutput;0;411,14;Float;False;True;Result;0;False;1;0;FLOAT;0.0;False;1;FLOAT;0\nWireConnection;4;0;2;0\nWireConnection;4;1;2;0\nWireConnection;7;0;6;0\nWireConnection;6;0;4;0\nWireConnection;6;1;5;0\nWireConnection;6;2;4;0\nWireConnection;6;3;5;0\nWireConnection;6;4;5;0\nWireConnection;5;0;3;0\nWireConnection;5;1;3;0\nWireConnection;2;0;1;0\nWireConnection;3;0;1;0\nWireConnection;0;0;7;0\nASEEND*/\n//CHKSM=492807FC2E3C8BD5838861DEE6C6EDB10A2FF2D2" + m_functionName: + m_description: + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_nodeCategory: 7 + m_customNodeCategory: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/ComputeFilterWidth.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/ComputeFilterWidth.asset.meta new file mode 100644 index 0000000..799467f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/ComputeFilterWidth.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 326bea850683cca44ae7af083d880d70 +timeCreated: 1512498793 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/ConstantBiasScale.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/ConstantBiasScale.asset new file mode 100644 index 0000000..a7250c5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/ConstantBiasScale.asset @@ -0,0 +1,26 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: ConstantBiasScale + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=14407\n389;92;1064;673;789;458;1;True;False\nNode;AmplifyShaderEditor.SimpleAddOpNode;6;-227,-128;Float;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;3;-392,-184;Float;False;Input;1;0;True;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;1;-391,-91;Float;False;Bias;1;1;True;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;7;-102,-19;Float;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;2;-392,16;Float;False;Scale;1;2;True;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;0;78,-35;Float;False;True;Output;0;False;1;0;FLOAT;0;False;1;FLOAT;0\nWireConnection;6;0;3;0\nWireConnection;6;1;1;0\nWireConnection;7;0;6;0\nWireConnection;7;1;2;0\nWireConnection;0;0;7;0\nASEEND*/\n//CHKSM=917F8D80859772EF16ACCF69C2333B732B3FBEF4" + m_functionName: + m_description: Simple Bias and Scale operation. Output = (Input + Bias) * Scale + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_nodeCategory: 3 + m_customNodeCategory: + m_previewPosition: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/ConstantBiasScale.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/ConstantBiasScale.asset.meta new file mode 100644 index 0000000..c1fa681 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/ConstantBiasScale.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 63208df05c83e8e49a48ffbdce2e43a0 +timeCreated: 1519302963 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/CotangentFrame.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/CotangentFrame.asset new file mode 100644 index 0000000..ab1673a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/CotangentFrame.asset @@ -0,0 +1,37 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: CotangentFrame + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=15103\n344;92;1056;673;1041.108;554.3792;1;True;False\nNode;AmplifyShaderEditor.FunctionInput;2;-613.4943,-271.5543;Float;False;View + Dir;3;1;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionInput;1;-608.4943,-157.5543;Float;False;UV;2;2;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionInput;4;-592.4943,-397.5543;Float;False;World + Normal;3;0;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.CustomExpressionNode;3;-421.4942,-290.5543;Float;False;float3 + dp1 = ddx ( position )@$float3 dp2 = ddy ( position )@$float2 duv1 = ddx ( uv + )@$float2 duv2 = ddy ( uv )@$float3 dp2perp = cross ( dp2, normal )@$float3 dp1perp + = cross ( normal, dp1 )@$float3 tangent = dp2perp * duv1.x + dp1perp * duv2.x@$float3 + bitangent = dp2perp * duv1.y + dp1perp * duv2.y@$float invmax = rsqrt ( max ( + dot ( tangent, tangent ), dot ( bitangent, bitangent ) ) )@$tangent *= invmax@$bitangent + *= invmax@$return float3x3 (\ttangent.x, bitangent.x, normal.x,$\t\t\t\t\ttangent.y, + bitangent.y, normal.y,$\t\t\t\t\ttangent.z, bitangent.z, normal.z )@;5;False;3;True;normal;FLOAT3;0,0,0;In;True;position;FLOAT3;0,0,0;In;True;uv;FLOAT2;0,0;In;CotangentFrame;False;False;3;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;2;FLOAT2;0,0;False;1;FLOAT3x3;0\nNode;AmplifyShaderEditor.FunctionOutput;5;-204.4942,-327.5543;Float;False;True;TBN;0;False;1;0;FLOAT3x3;0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1;False;1;FLOAT3x3;0\nWireConnection;3;0;4;0\nWireConnection;3;1;2;0\nWireConnection;3;2;1;0\nWireConnection;5;0;3;0\nASEEND*/\n//CHKSM=D848432022B91999196CE4B6F7A8557013863A11" + m_functionName: + m_description: 'Calculating Cotangent frame without precomputed data + + http://www.thetenthplanet.de/archives/1180' + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_nodeCategory: 3 + m_customNodeCategory: + m_previewPosition: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/CotangentFrame.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/CotangentFrame.asset.meta new file mode 100644 index 0000000..d33591f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/CotangentFrame.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 62ce0f00f1417804bb4f2b38501ba0d0 +timeCreated: 1522316215 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Create Orthogonal Vector.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Create Orthogonal Vector.asset new file mode 100644 index 0000000..ad111c8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Create Orthogonal Vector.asset @@ -0,0 +1,33 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Create Orthogonal Vector + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=15104\n465;615;1039;403;1446.756;132.3935;1.734783;True;False\nNode;AmplifyShaderEditor.CrossProductOpNode;28;-512,192;Float;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionInput;26;-896,208;Float;False;Vector + 2;3;1;False;1;0;FLOAT3;0,1,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.CrossProductOpNode;30;-96,128;Float;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.NormalizeNode;29;-336,192;Float;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.NormalizeNode;27;-720,0;Float;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionInput;25;-896,0;Float;False;Vector + 1;3;0;False;1;0;FLOAT3;1,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.NormalizeNode;31;-720,208;Float;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionOutput;0;128,0;Float;False;True;Vector + 1;0;True;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionOutput;2;128,256;Float;False;False;Vector + 3;2;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionOutput;1;128,128;Float;False;False;Vector + 2;1;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nWireConnection;28;0;27;0\nWireConnection;28;1;31;0\nWireConnection;30;0;29;0\nWireConnection;30;1;27;0\nWireConnection;29;0;28;0\nWireConnection;27;0;25;0\nWireConnection;31;0;26;0\nWireConnection;0;0;27;0\nWireConnection;2;0;29;0\nWireConnection;1;0;30;0\nASEEND*/\n//CHKSM=18CFF9C2BBF194BC2C63D4F07354C52613D46DD0" + m_functionName: + m_description: Providing two vectors creates a third one which is orthogonal to + the first two. It uses the first vector as the main guiding vector changing the + second accordingly. All results are normalized. + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_nodeCategory: 16 + m_customNodeCategory: + m_previewPosition: 1 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Create Orthogonal Vector.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Create Orthogonal Vector.asset.meta new file mode 100644 index 0000000..7cd3334 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Create Orthogonal Vector.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 83358ef05db30f04ba825a1be5f469d8 +timeCreated: 1518189974 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Decode Directional Lighmap.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Decode Directional Lighmap.asset new file mode 100644 index 0000000..54f3072 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Decode Directional Lighmap.asset @@ -0,0 +1,45 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Decode Directional Lighmap + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=17701\n412;73;1609;802;1389.521;361.4048;1;True;False\nNode;AmplifyShaderEditor.CustomExpressionNode;1;-135.5,-181;Float;False;return + DecodeDirectionalLightmap( Color,DirTex,NormalWorld)@;3;False;3;True;Color;FLOAT3;0,0,0;In;;Float;False;True;DirTex;FLOAT4;0,0,0,0;In;;Float;False;True;NormalWorld;FLOAT3;0,0,0;In;;Float;False;ASEDecodeDirectionalLightmap;False;False;0;3;0;FLOAT3;0,0,0;False;1;FLOAT4;0,0,0,0;False;2;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;23;-622.1301,-200.5;Inherit;False;inputColor;-1;True;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionInput;4;-466.5,-12;Inherit;False;NormalWorld;3;2;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.RangedFloatNode;9;-480,240;Inherit;False;Constant;_Float0;Float + 0;0;0;Create;True;0;0;False;0;0.5;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;13;293.7467,121.8659;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SimpleMaxOpNode;16;356.1465,405.266;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;17;190.3352,367.6559;Inherit;False;Constant;_Float2;Float + 2;0;0;Create;True;0;0;False;0;0.0001;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SwizzleNode;18;176.3352,467.6559;Inherit;False;FLOAT;3;1;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;20;-527.6785,372.98;Inherit;False;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.SimpleDivideOpNode;15;502.8605,106.8558;Inherit;False;2;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionSwitchByPipeline;5;682.8613,-173.207;Inherit;False;4;0;FLOAT3;0,0,0;False;3;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;2;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SwizzleNode;6;-480,160;Inherit;False;FLOAT3;0;1;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.DotProductOpNode;7;-144,64;Inherit;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;8;-320,176;Inherit;False;2;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.RangedFloatNode;12;-140.6092,173.8985;Inherit;False;Constant;_Float1;Float + 1;0;0;Create;True;0;0;False;0;0.5;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;11;48,96;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;2;-857.1957,-104.1015;Inherit;False;DirTex;4;1;False;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.FunctionInput;3;-852.2914,-189.0047;Inherit;False;Color;3;0;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.GetLocalVarNode;24;40.90209,216.6535;Inherit;False;23;inputColor;1;0;OBJECT;;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionOutput;0;916.3615,-183.7863;Inherit;False;True;-1;Output;0;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nWireConnection;1;0;23;0\nWireConnection;1;1;2;0\nWireConnection;1;2;4;0\nWireConnection;23;0;3;0\nWireConnection;13;0;11;0\nWireConnection;13;1;24;0\nWireConnection;16;0;17;0\nWireConnection;16;1;18;0\nWireConnection;18;0;20;0\nWireConnection;20;0;2;0\nWireConnection;15;0;13;0\nWireConnection;15;1;16;0\nWireConnection;5;0;1;0\nWireConnection;5;3;1;0\nWireConnection;5;1;15;0\nWireConnection;5;2;15;0\nWireConnection;6;0;2;0\nWireConnection;7;0;4;0\nWireConnection;7;1;8;0\nWireConnection;8;0;6;0\nWireConnection;8;1;9;0\nWireConnection;11;0;7;0\nWireConnection;11;1;12;0\nWireConnection;0;0;5;0\nASEEND*/\n//CHKSM=887A7A2BA5CFB5CBB9854D026B260CA7971382E5" + m_functionName: + m_description: 'Calls Unity internal DecodeDirectionalLightmap function. + + Uses custom graph on all other pipelines' + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 3 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Decode Directional Lighmap.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Decode Directional Lighmap.asset.meta new file mode 100644 index 0000000..b33de37 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Decode Directional Lighmap.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8132441d5c7c63f479ea1c42855420a8 +timeCreated: 1550589461 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/DepthMaskedRefraction.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/DepthMaskedRefraction.asset new file mode 100644 index 0000000..5667239 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/DepthMaskedRefraction.asset @@ -0,0 +1,52 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: DepthMaskedRefraction + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=18501\n352;92;1481;859;5529.478;1867.746;3.751044;True;False\nNode;AmplifyShaderEditor.CommentaryNode;42;-1534.82,-801.194;Inherit;False;1532.902;402.5788;;8;9;11;15;14;16;17;13;1;Artifact + Correction;1,1,1,1;0;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;10;-1793.859,-388.0908;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT;1;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;4;-2173.438,17.72729;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionSwitch;40;-3154.926,-42.33801;Inherit;False;Boundaries;False;0;2;-1;Continous;Discontinous;Object;-1;9;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;41;-3398.61,-20.0625;Inherit;False;Constant;_Float1;Float + 1;0;0;Create;True;0;0;False;0;False;1;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;29;-3573.743,-87.7131;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.ScreenDepthNode;28;-3823.751,-92.9282;Inherit;False;0;True;1;0;FLOAT4;0,0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SaturateNode;21;-3400.329,-87.85226;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SaturateNode;5;-1980.353,17.46826;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;1;-241.299,-550.8569;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;13;-818.5988,-648.5499;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionSwitchByPipeline;89;54.23302,-226.3335;Inherit;False;4;0;FLOAT2;0,0;False;3;FLOAT2;0,0;False;1;FLOAT2;0,0;False;2;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;17;-426.9748,-742.0114;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SwizzleNode;16;-1056.131,-538.2838;Inherit;False;FLOAT2;0;1;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SwizzleNode;32;-1232.117,-189.1583;Inherit;False;FLOAT2;0;1;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.RangedFloatNode;104;-3565.097,-516.2079;Inherit;False;Constant;_Float2;Float + 2;0;0;Create;True;0;0;False;0;False;1;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.ScreenPosInputsNode;19;-2842.449,-169.8328;Float;False;0;False;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.FunctionInput;35;-3255.611,-273.0523;Inherit;False;Normals;3;0;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.NormalVertexDataNode;97;-3494.124,-268.1942;Inherit;False;0;5;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SwizzleNode;26;-2978.274,-271.8887;Inherit;False;FLOAT2;0;1;2;3;1;0;FLOAT3;0,0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;20;-2766.966,-392.6118;Inherit;False;3;3;0;FLOAT2;1,1;False;1;FLOAT;0;False;2;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;7;-2569.792,-276.0808;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.Vector4Node;9;-1446.455,-736.3716;Inherit;False;Global;_CameraDepthTexture_TexelSize;_CameraDepthTexture_TexelSize;21;0;Fetch;True;0;0;True;0;False;0,0,0,0;0.001383126,0.001470588,723,680;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SimpleAddOpNode;18;-1576.075,-184.5327;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.SwizzleNode;11;-1053.65,-736.3645;Inherit;False;FLOAT2;2;3;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FloorOpNode;14;-667.9666,-648.5499;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.ScreenDepthNode;2;-2384.089,-51.48779;Inherit;False;0;True;1;0;FLOAT4;0,0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionSwitch;103;-3375.097,-436.2079;Inherit;False;Strength + Scaling;False;0;2;-1;Scale with distance;Constant;Object;-1;9;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleDivideOpNode;105;-2972.097,-452.2079;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;37;-3265.538,-527.2198;Inherit;False;Refraction + Strength;1;1;False;1;0;FLOAT;0.02;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMaxOpNode;101;-3546.097,-431.2079;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0.1;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;15;-712.0767,-726.3988;Inherit;False;Constant;_Float0;Float + 0;1;0;Create;True;0;0;False;0;False;0.5;0.5;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SurfaceDepthNode;27;-3936.345,30.59574;Inherit;False;0;1;0;FLOAT3;0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;38;357.6264,-224.0661;Inherit;False;True;-1;Refracted + UV;0;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nWireConnection;10;0;20;0\nWireConnection;10;1;5;0\nWireConnection;4;0;2;0\nWireConnection;4;1;27;0\nWireConnection;40;0;21;0\nWireConnection;40;1;41;0\nWireConnection;29;0;28;0\nWireConnection;29;1;27;0\nWireConnection;21;0;29;0\nWireConnection;5;0;4;0\nWireConnection;1;0;17;0\nWireConnection;1;1;16;0\nWireConnection;13;0;32;0\nWireConnection;13;1;11;0\nWireConnection;89;0;1;0\nWireConnection;89;3;1;0\nWireConnection;89;1;32;0\nWireConnection;89;2;32;0\nWireConnection;17;0;14;0\nWireConnection;17;1;15;0\nWireConnection;16;0;9;0\nWireConnection;32;0;18;0\nWireConnection;35;0;97;0\nWireConnection;26;0;35;0\nWireConnection;20;0;26;0\nWireConnection;20;1;105;0\nWireConnection;20;2;40;0\nWireConnection;7;0;20;0\nWireConnection;7;1;19;0\nWireConnection;18;0;10;0\nWireConnection;18;1;19;0\nWireConnection;11;0;9;0\nWireConnection;14;0;13;0\nWireConnection;2;0;7;0\nWireConnection;103;0;101;0\nWireConnection;103;1;104;0\nWireConnection;105;0;37;0\nWireConnection;105;1;103;0\nWireConnection;101;0;27;0\nWireConnection;38;0;89;0\nASEEND*/\n//CHKSM=E126823090EC4C04CD6801119B18A02F540BA131" + m_functionName: + m_description: 'Outputs normal-warped UVs for use in a Screen Color node to simulate + refraction. Depth Textures have to be enabled. In URP, ''Depth Texture'' and ''Opaque + Texture'' have to be enabled and ''Opaque Downsampling'' set to ''None'' to obtain + no artifacts. + + Created by community member Sai + + https://twitter.com/saismirk' + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 3 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/DepthMaskedRefraction.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/DepthMaskedRefraction.asset.meta new file mode 100644 index 0000000..ae88d29 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/DepthMaskedRefraction.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c805f061214177c42bca056464193f81 +timeCreated: 1600098425 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Derive Tangent Basis.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Derive Tangent Basis.asset new file mode 100644 index 0000000..3a73911 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Derive Tangent Basis.asset @@ -0,0 +1,64 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Derive Tangent Basis + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=17102\n0;731;1536;630;1714.5;318.7658;1;True;False\nNode;AmplifyShaderEditor.WorldNormalVector;10;-821.4876,20.21545;Inherit;False;False;1;0;FLOAT3;0,0,1;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3\nNode;AmplifyShaderEditor.FunctionInput;5;-784.8259,164.9036;Inherit;False;UV;2;0;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WorldPosInputsNode;13;-823.4999,-127.2658;Inherit;False;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3\nNode;AmplifyShaderEditor.CustomExpressionNode;1;-529.4937,-4.008303;Inherit;False;#if + (SHADER_TARGET >= 45)$float3 dPdx = ddx_fine( WorldPosition )@$float3 dPdy = ddy_fine( + WorldPosition )@$#else$float3 dPdx = ddx( WorldPosition )@$float3 dPdy = ddy( + WorldPosition )@$#endif$$float3 sigmaX = dPdx - dot( dPdx, WorldNormal ) * WorldNormal@$float3 + sigmaY = dPdy - dot( dPdy, WorldNormal ) * WorldNormal@$$float flip_sign = dot( + dPdy, cross( WorldNormal, dPdx ) ) < 0 ? -1 : 1@$$#if (SHADER_TARGET >= 45)$float2 + dSTdx = ddx_fine( UV )@$float2 dSTdy = ddy_fine( UV )@$#else$float2 dSTdx = ddx( + UV )@$float2 dSTdy = ddy( UV )@$#endif$$float det = dot( dSTdx, float2( dSTdy.y, + -dSTdy.x ) )@$float sign_det = ( det < 0 ) ? -1 : 1@$$float2 invC0 = sign_det + * float2( dSTdy.y, -dSTdx.y )@$$float3 T = sigmaX * invC0.x + sigmaY * invC0.y@$if + ( abs( det ) > 0 ) T = normalize( T )@$$float3 B = ( sign_det * flip_sign ) * + cross( WorldNormal, T )@$$WorldToTangent = float3x3( T, B, WorldNormal )@$TangentToWorld + = transpose( WorldToTangent )@$return@;7;False;5;True;WorldPosition;FLOAT3;0,0,0;In;;Float;False;True;WorldNormal;FLOAT3;0,0,0;In;;Float;False;True;UV;FLOAT2;0,0;In;;Float;False;True;TangentToWorld;FLOAT3x3;1,0,0,1,1,1,1,0,1;Out;;Float;False;True;WorldToTangent;FLOAT3x3;1,0,0,1,1,1,1,0,1;Out;;Float;False;Derive + Tangent Basis;False;False;0;6;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;2;FLOAT3;0,0,0;False;3;FLOAT2;0,0;False;4;FLOAT3x3;1,0,0,1,1,1,1,0,1;False;5;FLOAT3x3;1,0,0,1,1,1,1,0,1;False;3;FLOAT3;0;FLOAT3x3;5;FLOAT3x3;6\nNode;AmplifyShaderEditor.FunctionOutput;0;-147.9617,-6.546963;Inherit;False;True;Tangent + To World;0;False;1;0;FLOAT3x3;0,0,0,1,1,1,1,0,1;False;1;FLOAT3x3;0\nNode;AmplifyShaderEditor.FunctionOutput;6;-143.2227,68.66327;Inherit;False;False;World + To Tangent;1;False;1;0;FLOAT3x3;0,0,0,1,1,1,1,0,1;False;1;FLOAT3x3;0\nWireConnection;1;1;13;0\nWireConnection;1;2;10;0\nWireConnection;1;3;5;0\nWireConnection;0;0;1;5\nWireConnection;6;0;1;6\nASEEND*/\n//CHKSM=AEDC509876FA685886EABAB4978B0630E667D50E" + m_functionName: + m_description: 'This function derives a per-pixel tangent basis for a specific set + of UV coordinates. The built-in tangent basis is based on UV0. This function allows + normal mapping for UV1 or any other UV set, including runtime generated. + + + Typical usage case: + + Blending additional normal mapped layers that require non-UV0 coordinates. + + + Based on "Surface Gradient Based Bump Mapping Framework" by Morten S. Mikkelsen' + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 3 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Derive Tangent Basis.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Derive Tangent Basis.asset.meta new file mode 100644 index 0000000..89b545c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Derive Tangent Basis.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fee816718ad753c4f9b25822c0d67438 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Detail Albedo.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Detail Albedo.asset new file mode 100644 index 0000000..785378c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Detail Albedo.asset @@ -0,0 +1,30 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Detail Albedo + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=15308\n234;92;1334;669;1058.943;684.4172;1.391955;True;False\nNode;AmplifyShaderEditor.FunctionInput;11;-791.7281,-222.1082;Float;False;Detail + Albedo;3;1;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.ComponentMaskNode;10;-1044.388,-263.2733;Float;False;True;True;True;False;1;0;COLOR;0,0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SamplerNode;2;-1374.942,-264.6411;Float;True;Property;_DetailAlbedo;Detail + Albedo;1;0;Create;True;0;0;False;0;None;bdbe94d7623ec3940947b62544306f1c;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;6;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SamplerNode;7;-917.0518,-585.9581;Float;True;Property;_Albedo;Albedo;0;0;Create;True;0;0;False;0;None;37e6f91f3efb0954cbdce254638862ea;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;6;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.ComponentMaskNode;5;-897.4531,2.035467;Float;False;True;True;True;False;1;0;COLOR;0,0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.ComponentMaskNode;13;-545.7818,-575.8773;Float;False;True;True;True;False;1;0;COLOR;0,0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;3;-621.8271,-138.6786;Float;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.ColorSpaceDouble;1;-1143.392,22.29117;Float;False;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.FunctionInput;9;-388.3632,289.7231;Float;False;Detail + Mask;1;2;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SamplerNode;4;-724.7507,221.7417;Float;True;Property;_DetailMask;Detail + Mask;2;0;Create;True;0;0;False;0;None;37e6f91f3efb0954cbdce254638862ea;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;6;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.FunctionInput;12;-215.2053,-435.8505;Float;False;Albedo;3;0;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.DynamicAppendNode;16;116.0423,225.5565;Float;False;FLOAT3;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;17;-72.95755,102.5566;Float;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.OneMinusNode;18;-88.95757,230.5565;Float;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;15;311.0422,102.5566;Float;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;8;487.2353,-311.0565;Float;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionOutput;0;677.5877,-317.7978;Float;False;True;Output;0;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nWireConnection;11;0;10;0\nWireConnection;10;0;2;0\nWireConnection;5;0;1;0\nWireConnection;13;0;7;0\nWireConnection;3;0;11;0\nWireConnection;3;1;5;0\nWireConnection;9;0;4;4\nWireConnection;12;0;13;0\nWireConnection;16;0;18;0\nWireConnection;16;1;18;0\nWireConnection;16;2;18;0\nWireConnection;17;0;3;0\nWireConnection;17;1;9;0\nWireConnection;18;0;9;0\nWireConnection;15;0;17;0\nWireConnection;15;1;16;0\nWireConnection;8;0;12;0\nWireConnection;8;1;15;0\nWireConnection;0;0;8;0\nASEEND*/\n//CHKSM=98DA4DD57D5904F6ADF4806CACEF92157BC023C5" + m_functionName: + m_description: Adds Detail Abledo X2 map, similar to Standard Material + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_nodeCategory: 3 + m_customNodeCategory: + m_previewPosition: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Detail Albedo.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Detail Albedo.asset.meta new file mode 100644 index 0000000..4f4f8d9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Detail Albedo.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 29e5a290b15a7884983e27c8f1afaa8c +timeCreated: 1527501568 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Dots Pattern.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Dots Pattern.asset new file mode 100644 index 0000000..aee150d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Dots Pattern.asset @@ -0,0 +1,42 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Dots Pattern + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=17902\n-1462;-370;1004;726;3436.004;1250.192;3.58226;True;False\nNode;AmplifyShaderEditor.FunctionInput;4;-1216,-64;Inherit;False;Offset + X;1;3;False;1;0;FLOAT;0.5;False;1;FLOAT;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;16;-1712,-128;Inherit;False;FLOAT2;1;0;FLOAT2;0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.FractNode;6;-400,0;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionInput;2;-400,96;Inherit;False;Size;1;2;False;1;0;FLOAT;0.9;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionNode;1;-256,0;Inherit;True;Ellipse;-1;;1;3ba94b7b3cfd5f447befde8107c04d52;0;3;2;FLOAT2;0,0;False;7;FLOAT;0.5;False;9;FLOAT;0.5;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionSwitch;22;-1953.205,-105.9789;Inherit;False;Custom + UVs;True;0;2;0;In 0;In 1;Object;-1;9;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionInput;21;-2144,-16;Inherit;False;UV;2;0;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.TexCoordVertexDataNode;13;-2416,-128;Inherit;False;0;2;0;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.FunctionInput;3;-2368,0;Inherit;False;Tiling;2;1;False;1;0;FLOAT2;8,8;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;15;-2144,-128;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;17;-896,128;Inherit;True;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleRemainderNode;11;-1408,32;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;2;False;1;FLOAT;0\nNode;AmplifyShaderEditor.StepOpNode;10;-1216,16;Inherit;False;2;0;FLOAT;1;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;8;-896,-128;Inherit;True;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;9;-1056,-32;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;18;-1056,208;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DynamicAppendNode;7;-560,0;Inherit;False;FLOAT2;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionInput;5;-1216,176;Inherit;False;Offset + Y;1;4;False;1;0;FLOAT;1;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleRemainderNode;20;-1408,288;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;2;False;1;FLOAT;0\nNode;AmplifyShaderEditor.StepOpNode;19;-1216,272;Inherit;False;2;0;FLOAT;1;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;0;0,0;Inherit;False;True;-1;Out;0;False;1;0;FLOAT;0;False;1;FLOAT;0\nWireConnection;16;0;22;0\nWireConnection;6;0;7;0\nWireConnection;1;2;6;0\nWireConnection;1;7;2;0\nWireConnection;1;9;2;0\nWireConnection;22;0;15;0\nWireConnection;22;1;21;0\nWireConnection;21;0;13;0\nWireConnection;15;0;13;0\nWireConnection;15;1;3;0\nWireConnection;17;0;16;1\nWireConnection;17;1;18;0\nWireConnection;11;0;16;1\nWireConnection;10;1;11;0\nWireConnection;8;0;16;0\nWireConnection;8;1;9;0\nWireConnection;9;0;4;0\nWireConnection;9;1;10;0\nWireConnection;18;0;5;0\nWireConnection;18;1;19;0\nWireConnection;7;0;8;0\nWireConnection;7;1;17;0\nWireConnection;20;0;16;0\nWireConnection;19;1;20;0\nWireConnection;0;0;1;0\nASEEND*/\n//CHKSM=26E6410FBC1EBC56E76C21CF54FC55DEAFFEA95F" + m_functionName: + m_description: Creates a repeated dots pattern with alternating offsetted lines + or columns of dots. + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 9 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Dots Pattern.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Dots Pattern.asset.meta new file mode 100644 index 0000000..dad7905 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Dots Pattern.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7d8d5e315fd9002418fb41741d3a59cb +timeCreated: 1586787388 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Ellipse.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Ellipse.asset new file mode 100644 index 0000000..4891837 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Ellipse.asset @@ -0,0 +1,40 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Ellipse + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=17902\n-1410;-481;1109;726;1067.283;573.8351;2;True;False\nNode;AmplifyShaderEditor.SimpleDivideOpNode;15;736,128;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.OneMinusNode;13;560,128;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DynamicAppendNode;11;64,304;Inherit;False;FLOAT2;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SaturateNode;16;880,128;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FWidthOpNode;14;560,208;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.LengthOpNode;17;384,128;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleDivideOpNode;12;240,128;Inherit;False;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionInput;9;-112,384;Inherit;False;Height;1;2;False;1;0;FLOAT;0.5;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;7;-112,304;Inherit;False;Width;1;1;False;1;0;FLOAT;0.5;False;1;FLOAT;0\nNode;AmplifyShaderEditor.ScaleAndOffsetNode;3;-48,32;Inherit;True;3;0;FLOAT2;0,0;False;1;FLOAT;2;False;2;FLOAT;-1;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.RangedFloatNode;5;-272,128;Inherit;False;Constant;_Float1;Float + 1;0;0;Create;True;0;0;False;0;-1;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;4;-272,32;Inherit;False;Constant;_Float0;Float + 0;0;0;Create;True;0;0;False;0;2;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;2;-272,-64;Inherit;False;UV;2;0;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.TexCoordVertexDataNode;1;-496,-64;Inherit;False;0;2;0;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.FunctionOutput;0;1024,128;Inherit;False;True;-1;Out;0;False;1;0;FLOAT;0;False;1;FLOAT;0\nWireConnection;15;0;13;0\nWireConnection;15;1;14;0\nWireConnection;13;0;17;0\nWireConnection;11;0;7;0\nWireConnection;11;1;9;0\nWireConnection;16;0;15;0\nWireConnection;14;0;17;0\nWireConnection;17;0;12;0\nWireConnection;12;0;3;0\nWireConnection;12;1;11;0\nWireConnection;3;0;2;0\nWireConnection;3;1;4;0\nWireConnection;3;2;5;0\nWireConnection;2;0;1;0\nWireConnection;0;0;16;0\nASEEND*/\n//CHKSM=00B1FD172E8372FBCF36CB9A133FB643740A4B46" + m_functionName: + m_description: Creates an ellipse based on given uv and dimensions + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 9 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Ellipse.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Ellipse.asset.meta new file mode 100644 index 0000000..4899a58 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Ellipse.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3ba94b7b3cfd5f447befde8107c04d52 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/FetchHDColorPyramid.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/FetchHDColorPyramid.asset new file mode 100644 index 0000000..58671c7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/FetchHDColorPyramid.asset @@ -0,0 +1,40 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: FetchHDColorPyramid + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=15502\n460;92;961;705;422.5;427.5;1;True;False\nNode;AmplifyShaderEditor.FunctionSwitchByPipeline;4;192.5,-174.5;Float;False;3;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0,0,0,0;False;2;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.Vector4Node;5;-38.5,-232.5;Float;False;Constant;_Vector0;Vector + 0;0;0;Create;True;0;0;False;0;0,0,0,0;0,0,0,0;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.CustomExpressionNode;1;-33.5,-23.5;Float;False;LOAD_TEXTURE2D_LOD(\r + \ _ColorPyramidTexture,UV,LOD);4;False;2;True;UV;FLOAT2;0,0;In;;True;LOD;FLOAT;0;In;;FetchColorPyramid;True;False;0;2;0;FLOAT2;0,0;False;1;FLOAT;0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.FunctionInput;2;-195.5,35.5;Float;False;LOD;1;1;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;3;-227.5,-119.5;Float;False;UV;2;0;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionOutput;0;432,-54;Float;False;True;Output;0;False;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nWireConnection;4;0;5;0\nWireConnection;4;1;5;0\nWireConnection;4;2;1;0\nWireConnection;1;0;3;0\nWireConnection;1;1;2;0\nWireConnection;0;0;4;0\nASEEND*/\n//CHKSM=FCEB018C27BAF233C7FC33A2B4BB473BEB28E231" + m_functionName: + m_description: 'Fetches the _ColorPyramidTexture texture of the HDRP pipeline. + + Using this over LW or default pipelines will result in incorrect behaviors.' + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 3 + m_customNodeCategory: + m_previewPosition: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/FetchHDColorPyramid.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/FetchHDColorPyramid.asset.meta new file mode 100644 index 0000000..29497be --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/FetchHDColorPyramid.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e17d5b1cd6898394dbe1f30e05022025 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/FetchLightmapValue.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/FetchLightmapValue.asset new file mode 100644 index 0000000..3e0cfef --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/FetchLightmapValue.asset @@ -0,0 +1,48 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: FetchLightmapValue + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity + Asset Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=18801\n-2170;79;1288;932;-209.2776;470.0745;1.3;True;False\nNode;AmplifyShaderEditor.SwizzleNode;9;-188.546,133.5814;Inherit;False;FLOAT2;2;3;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionSwitchByPipeline;12;1027.71,-224.5106;Inherit;False;4;0;COLOR;0,0,0,0;False;3;COLOR;0,0,0,0;False;1;FLOAT4;0,0,0,0;False;2;FLOAT4;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.CustomExpressionNode;11;735.7104,-21.51056;Float;False;return + SAMPLE_TEXTURE2D( unity_Lightmap, samplerunity_Lightmap, UV )@;4;False;1;True;UV;FLOAT2;0,0;In;;Float;False;SampleLightmapHD;True;False;0;1;0;FLOAT2;0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.Vector4Node;16;754.9202,321.7659;Float;False;Constant;_Vector1;Vector + 1;3;0;Create;True;0;0;0;False;0;False;0,0,0,0;0,0,0,0;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.Vector4Node;18;322.9202,307.7659;Float;False;Constant;_Vector3;Vector + 3;3;0;Create;True;0;0;0;False;0;False;34.49324,2.2,0,0;0,0,0,0;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.TexturePropertyNode;1;314.5027,-433.4464;Float;True;Global;unity_Lightmap;unity_Lightmap;0;0;Create;True;0;0;0;False;0;False;None;None;False;white;Auto;Texture2D;-1;0;2;SAMPLER2D;0;SAMPLERSTATE;1\nNode;AmplifyShaderEditor.Vector4Node;17;329.9202,94.76587;Float;False;Constant;_Vector2;Vector + 2;3;0;Create;True;0;0;0;False;0;False;2,2.2,0,0;0,0,0,0;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.StaticSwitch;15;602.9202,151.7659;Float;False;Property;_Keyword2;Keyword + 2;2;0;Create;True;0;0;0;False;0;False;0;0;0;False;UNITY_LIGHTMAP_RGBM_ENCODING;Toggle;2;Key0;Key1;Fetch;True;True;9;1;FLOAT4;0,0,0,0;False;0;FLOAT4;0,0,0,0;False;2;FLOAT4;0,0,0,0;False;3;FLOAT4;0,0,0,0;False;4;FLOAT4;0,0,0,0;False;5;FLOAT4;0,0,0,0;False;6;FLOAT4;0,0,0,0;False;7;FLOAT4;0,0,0,0;False;8;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.SamplerNode;7;654.0723,-337.4277;Inherit;True;Property;_TextureSample0;Texture + Sample 0;0;0;Create;True;0;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SimpleAddOpNode;3;224,-32;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.StaticSwitch;13;981.1006,204.6251;Float;False;Property;_Keyword0;Keyword + 0;1;0;Create;True;0;0;0;False;0;False;0;0;0;False;UNITY_LIGHTMAP_FULL_HDR;Toggle;2;Key0;Key1;Fetch;True;True;9;1;FLOAT4;0,0,0,0;False;0;FLOAT4;0,0,0,0;False;2;FLOAT4;0,0,0,0;False;3;FLOAT4;0,0,0,0;False;4;FLOAT4;0,0,0,0;False;5;FLOAT4;0,0,0,0;False;6;FLOAT4;0,0,0,0;False;7;FLOAT4;0,0,0,0;False;8;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.SwizzleNode;4;-188.546,21.5814;Inherit;False;FLOAT2;0;1;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;5;-28.547,-122.4186;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.Vector4Node;8;-500.423,19.56814;Float;False;Global;unity_LightmapST;unity_LightmapST;2;0;Fetch;True;0;0;0;False;0;False;0,0,0,0;0.6809906,0.6809906,-0.002660119,-0.002660119;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.VertexToFragmentNode;10;368,-112;Inherit;False;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.TextureCoordinatesNode;2;-528,-128;Inherit;False;1;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.FunctionSwitchByPipeline;20;1405.278,220.2255;Inherit;False;4;0;FLOAT4;0,0,0,0;False;3;FLOAT4;0,0,0,0;False;1;FLOAT4;0,0,0,0;False;2;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.DecodeLightmapHlpNode;6;1661.949,-191.024;Inherit;False;2;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0,0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.CustomExpressionNode;19;1108.877,25.22512;Inherit;False;return + float4(LIGHTMAP_HDR_MULTIPLIER, LIGHTMAP_HDR_EXPONENT, 0, 0)@;4;False;0;URPDecodeInstruction;True;False;0;0;1;FLOAT4;0\nNode;AmplifyShaderEditor.FunctionOutput;0;1894.252,-186.4676;Inherit;False;True;-1;Output;0;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nWireConnection;9;0;8;0\nWireConnection;12;0;7;0\nWireConnection;12;3;7;0\nWireConnection;12;1;11;0\nWireConnection;12;2;11;0\nWireConnection;11;0;10;0\nWireConnection;15;1;17;0\nWireConnection;15;0;18;0\nWireConnection;7;0;1;0\nWireConnection;7;1;10;0\nWireConnection;3;0;5;0\nWireConnection;3;1;9;0\nWireConnection;13;1;15;0\nWireConnection;13;0;16;0\nWireConnection;4;0;8;0\nWireConnection;5;0;2;0\nWireConnection;5;1;4;0\nWireConnection;10;0;3;0\nWireConnection;20;0;13;0\nWireConnection;20;3;13;0\nWireConnection;20;1;19;0\nWireConnection;20;2;13;0\nWireConnection;6;0;12;0\nWireConnection;6;1;20;0\nWireConnection;0;0;6;0\nASEEND*/\n//CHKSM=F3EDFB6DB36FA6E548308165A08BC75F0F46A9B5" + m_functionName: + m_description: 'Fetches the value from the lightmap. Multiply the fetched value + by the final fragment color. ' + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 3 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/FetchLightmapValue.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/FetchLightmapValue.asset.meta new file mode 100644 index 0000000..af3eb8d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/FetchLightmapValue.asset.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 43de3d4ae59f645418fdd020d1b8e78e +timeCreated: 1528994083 +licenseType: Store +NativeFormatImporter: + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Flipbook.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Flipbook.asset new file mode 100644 index 0000000..7c8153f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Flipbook.asset @@ -0,0 +1,36 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Flipbook + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=14204\n487;595;979;423;2696.247;1459.301;4.894685;True;False\nNode;AmplifyShaderEditor.GetLocalVarNode;50;-816,96;Float;False;39;0;1;FLOAT;0\nNode;AmplifyShaderEditor.ClampOpNode;42;-992,80;Float;False;3;0;FLOAT;0.0;False;1;FLOAT;0.0001;False;2;FLOAT;8.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DynamicAppendNode;8;-128,-128;Float;False;FLOAT2;4;0;FLOAT;0.0;False;1;FLOAT;0.0;False;2;FLOAT;0.0;False;3;FLOAT;0.0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;49;640,-112;Float;False;FLOAT2;1;0;FLOAT2;0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.SimpleDivideOpNode;27;-608,0;Float;False;2;0;FLOAT;0.0;False;1;FLOAT;9.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FractNode;35;-464,0;Float;False;1;0;FLOAT;0.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;44;-1168,160;Float;False;2;0;FLOAT;0.0;False;1;FLOAT;1.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;2;-992,0;Float;False;Time;1;5;False;1;0;FLOAT;0.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FloorOpNode;10;160,-64;Float;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionInput;24;-1200,80;Float;False;Start + Frame;1;4;False;1;0;FLOAT;0.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;39;-464,-176;Float;False;totalFrames;-1;True;1;0;FLOAT;0.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionSwitch;68;1408,-720;Float;False;Mip + Mode;False;0;3;1;Auto;Bias;Level;8;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;3;FLOAT;0.0;False;4;FLOAT;0.0;False;5;FLOAT;0.0;False;6;FLOAT;0.0;False;7;FLOAT;0.0;False;1;COLOR;0\nNode;AmplifyShaderEditor.OneMinusNode;38;-304,64;Float;False;1;0;FLOAT;0.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;40;-1376,160;Float;False;39;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleTimeNode;3;-1200,0;Float;False;1;0;FLOAT;1.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;9;16,-64;Float;False;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0.0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;15;480,-224;Float;False;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0.0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.DynamicAppendNode;7;-128,-256;Float;False;FLOAT2;4;0;FLOAT;0.0;False;1;FLOAT;0.0;False;2;FLOAT;0.0;False;3;FLOAT;0.0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.TexCoordVertexDataNode;14;-128,-384;Float;False;0;2;0;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;67;-304,160;Float;False;2;2;0;FLOAT;0.0;False;1;FLOAT;0.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;5;-768,-96;Float;False;Rows;1;3;False;1;0;FLOAT;3.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;6;-624,-176;Float;False;2;2;0;FLOAT;0.0;False;1;FLOAT;0.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;4;-768,-256;Float;False;Colums;1;2;False;1;0;FLOAT;3.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DynamicAppendNode;29;-128,0;Float;False;FLOAT2;4;0;FLOAT;0.0;False;1;FLOAT;0.0;False;2;FLOAT;0.0;False;3;FLOAT;0.0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionInput;13;128,-384;Float;False;UV;2;1;False;1;0;FLOAT2;1,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SamplerNode;69;896,-512;Float;True;Property;_SamplerLevel;Sampler + Level;0;0;Create;True;None;None;True;0;False;white;Auto;False;Object;-1;MipLevel;Texture2D;6;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0.0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1.0;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SimpleDivideOpNode;12;320,-288;Float;False;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionInput;51;512,-896;Float;False;Tex;9;0;False;1;0;SAMPLER2D;0.0;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.SimpleDivideOpNode;11;320,-160;Float;False;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;22;-768,0;Float;False;2;2;0;FLOAT;0.0;False;1;FLOAT;0.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;70;512,-512;Float;False;Mip + Level;1;7;False;1;0;FLOAT;0.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SamplerNode;52;896,-896;Float;True;Property;_SamplerAuto;Sampler + Auto;0;0;Create;True;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;6;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0.0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1.0;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SamplerNode;57;896,-704;Float;True;Property;_SamplerBias;Sampler + Bias;0;0;Create;True;None;None;True;0;False;white;Auto;False;Object;-1;MipBias;Texture2D;6;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0.0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1.0;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.FunctionInput;55;512,-704;Float;False;Mip + Bias;1;6;False;1;0;FLOAT;0.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionSwitch;71;1654.729,-742.7292;Float;False;Use + Texture;True;0;2;0;False;True;8;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0.0;False;3;FLOAT;0.0;False;4;FLOAT;0.0;False;5;FLOAT;0.0;False;6;FLOAT;0.0;False;7;FLOAT;0.0;False;1;COLOR;0\nNode;AmplifyShaderEditor.FunctionOutput;0;896,-224;Float;False;True;UV;1;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionOutput;53;1882.438,-748.9789;Float;False;False;RGBA;0;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.FunctionOutput;47;896,-128;Float;False;False;U;2;False;1;0;FLOAT;0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;62;-112,160;Float;False;False;Cur + Frame;4;False;1;0;FLOAT;0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;48;896,-64;Float;False;False;V;3;False;1;0;FLOAT;0,0;False;1;FLOAT;0\nWireConnection;42;0;24;0\nWireConnection;42;2;44;0\nWireConnection;8;0;39;0\nWireConnection;8;1;5;0\nWireConnection;49;0;15;0\nWireConnection;27;0;22;0\nWireConnection;27;1;50;0\nWireConnection;35;0;27;0\nWireConnection;44;0;40;0\nWireConnection;2;0;3;0\nWireConnection;10;0;9;0\nWireConnection;39;0;6;0\nWireConnection;68;0;52;0\nWireConnection;68;1;57;0\nWireConnection;68;2;69;0\nWireConnection;38;0;35;0\nWireConnection;9;0;8;0\nWireConnection;9;1;29;0\nWireConnection;15;0;12;0\nWireConnection;15;1;11;0\nWireConnection;7;0;4;0\nWireConnection;7;1;5;0\nWireConnection;67;0;35;0\nWireConnection;67;1;50;0\nWireConnection;6;0;4;0\nWireConnection;6;1;5;0\nWireConnection;29;0;35;0\nWireConnection;29;1;38;0\nWireConnection;13;0;14;0\nWireConnection;69;0;51;0\nWireConnection;69;1;15;0\nWireConnection;69;2;70;0\nWireConnection;12;0;13;0\nWireConnection;12;1;7;0\nWireConnection;11;0;10;0\nWireConnection;11;1;7;0\nWireConnection;22;0;2;0\nWireConnection;22;1;42;0\nWireConnection;52;0;51;0\nWireConnection;52;1;15;0\nWireConnection;57;0;51;0\nWireConnection;57;1;15;0\nWireConnection;57;2;55;0\nWireConnection;71;1;68;0\nWireConnection;0;0;15;0\nWireConnection;53;0;71;0\nWireConnection;47;0;49;0\nWireConnection;62;0;67;0\nWireConnection;48;0;49;1\nASEEND*/\n//CHKSM=312D1CE7E23C444F9583CB6B462131FEE8B66987" + m_functionName: + m_description: This node generates either UVs or a final color which scroll through + a texture sheet. Make sure your texture wrap mode is set to repeat. + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_nodeCategory: 0 + m_customNodeCategory: + m_previewPosition: 1 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Flipbook.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Flipbook.asset.meta new file mode 100644 index 0000000..c24f34a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Flipbook.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 53c2488c220f6564ca6c90721ee16673 +timeCreated: 1515152873 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Flow.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Flow.asset new file mode 100644 index 0000000..1e3c708 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Flow.asset @@ -0,0 +1,50 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Flow + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=17500\n368;498;1477;895;2968.752;895.1555;2.383106;True;False\nNode;AmplifyShaderEditor.CommentaryNode;47;-1168,448;Inherit;False;527;247;Linear + Blend;3;32;30;31;;1,1,1,1;0;0\nNode;AmplifyShaderEditor.FunctionInput;18;-1712,80;Inherit;False;Flow + Direction;2;2;False;1;0;FLOAT2;0,1;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;41;-1472,80;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.NegateNode;46;-1872,80;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.RangedFloatNode;42;-1728,176;Float;False;Constant;_Rescalevectors;Rescale + vectors;3;0;Create;True;0;0;False;0;0.5;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleTimeNode;22;-1792,416;Inherit;False;1;0;FLOAT;1;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FractNode;27;-1440,416;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;28;-1584,528;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;24;-1984,416;Inherit;False;Flow + Speed;1;4;False;1;0;FLOAT;0.2;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;26;-1776,624;Float;False;Constant;_Float0;Float + 0;1;0;Create;True;0;0;False;0;0.5;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;17;-1488,272;Inherit;False;Flow + Strength;2;3;False;1;0;FLOAT2;1,1;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;12;-896,224;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;14;-1184,256;Inherit;False;3;3;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionInput;2;-1696,-160;Inherit;False;UVs;2;1;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.VertexColorNode;45;-2288,80;Inherit;False;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.ComponentMaskNode;44;-2096,80;Inherit;False;True;True;False;False;1;0;COLOR;0,0,0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.TexCoordVertexDataNode;43;-1920,-160;Inherit;False;0;2;0;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SimpleDivideOpNode;37;-1472,-48;Inherit;False;2;0;FLOAT2;0,0;False;1;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SamplerNode;49;-544,384;Inherit;True;Property;_TextureSample3;Texture + Sample 3;3;0;Create;True;0;0;False;0;-1;None;None;True;0;False;bump;Auto;True;Object;-1;Auto;Texture2D;6;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;5;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SamplerNode;8;-544,192;Inherit;True;Property;_TextureSample1;Texture + Sample 1;1;0;Create;True;0;0;False;0;-1;e28dc97a9541e3642a48c0e3886688c5;e28dc97a9541e3642a48c0e3886688c5;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;6;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.LerpOp;9;144,112;Inherit;False;3;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;2;FLOAT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SamplerNode;48;-544,-64;Inherit;True;Property;_TextureSample2;Texture + Sample 2;2;0;Create;True;0;0;False;0;-1;None;None;True;0;False;bump;Auto;True;Object;-1;Auto;Texture2D;6;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;5;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;30;-1120,496;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleDivideOpNode;32;-800,560;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SamplerNode;7;-544,-256;Inherit;True;Property;_TextureSample0;Texture + Sample 0;1;0;Create;True;0;0;False;0;-1;e28dc97a9541e3642a48c0e3886688c5;e28dc97a9541e3642a48c0e3886688c5;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;6;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.AbsOpNode;31;-944,496;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.ComponentMaskNode;4;-1200,-16;Inherit;False;True;True;True;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;13;-1184,80;Inherit;False;3;3;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.RangedFloatNode;38;-1808,-16;Float;False;Property;_Size;Size;1;0;Create;True;0;0;False;0;1;0;0;10;0;1;FLOAT;0\nNode;AmplifyShaderEditor.FractNode;29;-1440,528;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;11;-896,-16;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;52;0,528;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;5;-1008,-256;Inherit;False;Tex;9;0;False;1;0;SAMPLER2D;0,0;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.TexturePropertyNode;6;-1248,-256;Float;True;Property;_Tex;Tex;0;0;Create;True;0;0;False;0;e28dc97a9541e3642a48c0e3886688c5;e28dc97a9541e3642a48c0e3886688c5;False;white;Auto;Texture2D;-1;0;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.FunctionSwitch;50;-160,16;Inherit;False;Is + Normal;True;1;2;-1;In 0;In 1;Object;-1;9;0;COLOR;0,0,0,0;False;1;FLOAT3;0,0,0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionSwitch;51;-160,192;Inherit;False;Is + Normal;True;1;2;-1;In 0;In 1;Instance;50;9;0;COLOR;0,0,0,0;False;1;FLOAT3;0,0,0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionOutput;0;320,112;Inherit;True;True;-1;Output;0;True;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nWireConnection;18;0;46;0\nWireConnection;41;0;18;0\nWireConnection;41;1;42;0\nWireConnection;46;0;44;0\nWireConnection;22;0;24;0\nWireConnection;27;0;22;0\nWireConnection;28;0;22;0\nWireConnection;28;1;26;0\nWireConnection;12;0;4;0\nWireConnection;12;1;14;0\nWireConnection;14;0;41;0\nWireConnection;14;1;17;0\nWireConnection;14;2;29;0\nWireConnection;2;0;43;0\nWireConnection;44;0;45;0\nWireConnection;37;0;2;0\nWireConnection;37;1;38;0\nWireConnection;49;0;5;0\nWireConnection;49;1;12;0\nWireConnection;8;0;5;0\nWireConnection;8;1;12;0\nWireConnection;9;0;50;0\nWireConnection;9;1;51;0\nWireConnection;9;2;52;0\nWireConnection;48;0;5;0\nWireConnection;48;1;11;0\nWireConnection;30;0;27;0\nWireConnection;30;1;26;0\nWireConnection;32;0;31;0\nWireConnection;32;1;26;0\nWireConnection;7;0;5;0\nWireConnection;7;1;11;0\nWireConnection;31;0;30;0\nWireConnection;4;0;37;0\nWireConnection;13;0;41;0\nWireConnection;13;1;17;0\nWireConnection;13;2;27;0\nWireConnection;29;0;28;0\nWireConnection;11;0;4;0\nWireConnection;11;1;13;0\nWireConnection;52;0;32;0\nWireConnection;5;0;6;0\nWireConnection;50;0;7;0\nWireConnection;50;1;48;0\nWireConnection;51;0;8;0\nWireConnection;51;1;49;0\nWireConnection;0;0;9;0\nASEEND*/\n//CHKSM=E084CD7EC3DACA44AFB695EB557ABBE5C34C5A63" + m_functionName: + m_description: Creates a flow effect which can be given from a flow map. + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 9 + m_customNodeCategory: My noise category + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Flow.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Flow.asset.meta new file mode 100644 index 0000000..1bf2997 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Flow.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: acad10cc8145e1f4eb8042bebe2d9a42 +timeCreated: 1575558674 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Four Splats First Pass Terrain.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Four Splats First Pass Terrain.asset new file mode 100644 index 0000000..a8557a5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Four Splats First Pass Terrain.asset @@ -0,0 +1,87 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Four Splats First Pass Terrain + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=18506\n437;92;820;529;1391.052;-2467.193;1.770204;True;False\nNode;AmplifyShaderEditor.CommentaryNode;209;-339.216,268.535;Inherit;False;408.144;170.0303;;2;46;47;Old + Smoothness;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;170;296.9723,2913.144;Inherit;False;827.0509;423.9417;;10;149;158;157;156;155;151;153;152;150;154;Mask + Smoothness;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;159;252.6284,2169.96;Inherit;False;917.8029;677.2048;;10;140;139;138;130;113;112;114;137;111;141;Compute + Masks;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;129;-954.9393,2741.565;Inherit;False;1210.908;2784.683;;21;124;123;122;128;127;125;126;132;133;134;135;131;136;121;103;104;105;106;188;189;191;Mask + Variables;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;182;303.4217,3942.71;Inherit;False;812.6509;423.9421;;10;177;176;181;180;175;174;173;172;179;178;Mask + Occlusion;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;171;303.88,3430.155;Inherit;False;807.0508;423.9419;;10;165;164;169;168;163;162;161;160;166;167;Mask + Metallic;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;68;-84.15448,1030.644;Inherit;False;1134.33;398.6418;Comment;8;17;77;80;75;78;16;76;81;Tangents;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;199;416.7253,4483.475;Inherit;False;1281.122;462.335;;9;201;198;197;218;200;192;195;196;193;Occlusion;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;69;97.99105,251.4516;Inherit;False;1299.523;553.9363;;9;217;220;212;213;216;45;58;215;214;Smoothness;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;67;-23.4915,-70.91965;Inherit;False;686.1986;184.0211;;3;27;19;62;Alpha;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;64;-1838.406,612.7104;Inherit;False;1582.024;883.2601;;14;11;73;71;72;10;1;70;14;12;8;2;61;84;85;Normal;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;95;-70.55766,-610.683;Inherit;False;758.3281;346.0931;;3;99;100;98;Holes;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;63;-2707.89,-60.62326;Inherit;False;1931.073;500.6417;Comment;10;24;20;5;74;22;59;23;26;25;21;Control;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;66;-75.88382,1489.471;Inherit;False;1596.247;581.4266;;13;54;56;57;48;49;50;203;53;219;202;55;204;51;Metallic;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;65;-1778.84,-1982.8;Inherit;False;1604.401;1763.963;;27;4;6;7;35;32;36;60;28;42;33;29;3;30;41;9;40;38;31;39;34;37;44;43;205;206;207;210;Albedo;1,1,1,1;0;0\nNode;AmplifyShaderEditor.DynamicAppendNode;33;-1437.993,-1929.072;Inherit;False;FLOAT4;4;0;FLOAT;1;False;1;FLOAT;1;False;2;FLOAT;1;False;3;FLOAT;0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.GetLocalVarNode;151;349.7676,3046.995;Inherit;False;139;mask1;1;0;OBJECT;;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.SamplerNode;11;-1568,1280;Inherit;True;Property;_Normal3;Normal3;9;1;[HideInInspector];Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.DynamicAppendNode;168;731.5413,3553.301;Inherit;False;FLOAT4;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.GetLocalVarNode;162;358.0726,3738.697;Inherit;False;141;mask3;1;0;OBJECT;;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.RangedFloatNode;31;-1704.334,-987.735;Float;False;Property;_Smoothness2;Smoothness2;13;1;[HideInInspector];Create;True;0;0;False;0;False;1;0;0;1;0;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;43;-1591.952,-656.6342;Float;False;Constant;_Float4;Float + 4;13;0;Create;True;0;0;False;0;False;1;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.TangentVertexDataNode;77;-72.23888,1072.639;Inherit;False;0;0;5;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.TextureCoordinatesNode;113;305.6313,2556.965;Inherit;False;0;6;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.TextureCoordinatesNode;72;-1808,1072;Inherit;False;0;6;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.GetLocalVarNode;195;441.4373,4605.778;Inherit;False;191;defaultOcclusion;1;0;OBJECT;;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.SwizzleNode;165;529.8993,3566.496;Inherit;False;FLOAT;0;1;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SamplerNode;10;-1568,1072;Inherit;True;Property;_Normal2;Normal2;8;1;[HideInInspector];Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.GetLocalVarNode;152;346.9723,3130.847;Inherit;False;140;mask2;1;0;OBJECT;;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.RangedFloatNode;48;-25.88388,1619.345;Float;False;Property;_Metallic0;Metallic0;14;2;[HideInInspector];[Gamma];Create;True;0;0;False;0;False;0;0;0;1;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;78;152.2551,1153.509;Inherit;False;3;3;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;2;FLOAT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SwizzleNode;156;522.9917,3129.485;Inherit;False;FLOAT;3;1;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SamplerNode;1;-1568,864;Inherit;True;Property;_Normal1;Normal1;7;1;[HideInInspector];Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.RegisterLocalVarNode;169;886.1307,3557.652;Inherit;False;maskMetallic;-1;True;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.FunctionSwitch;85;-614.1091,1096.369;Inherit;False;Draw + SRP Per Pixel Normals;True;0;2;-1;In 0;In 1;Object;-1;9;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionInput;59;-1356.444,20.82132;Inherit;False;Custom + Control;4;0;False;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;191;-119.3642,3742.854;Inherit;False;defaultOcclusion;-1;True;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.SimpleDivideOpNode;23;-1712,16;Inherit;False;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.SamplerNode;5;-2698.008,-13.10038;Inherit;True;Property;_Control;Control;1;1;[HideInInspector];Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.CustomExpressionNode;100;514.496,-539.1801;Inherit;False;#ifdef + _ALPHATEST_ON$\tclip(Hole == 0.0f ? -1 : 1)@$#endif;1;True;1;True;Hole;FLOAT;0;In;;Inherit;False;ClipHoles;False;False;0;2;0;FLOAT4;0,0,0,0;False;1;FLOAT;0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.UnpackScaleNormalNode;12;-898.4255,806.7103;Inherit;False;2;0;FLOAT4;0,0,0,0;False;1;FLOAT;1;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;38;-1208.126,-1416.042;Inherit;False;2;2;0;FLOAT4;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;35;-1204.12,-1877.288;Inherit;False;2;2;0;FLOAT4;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.GetLocalVarNode;27;26.5085,-20.91957;Inherit;False;22;SplatWeight;1;0;OBJECT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SwizzleNode;167;529.8993,3726.496;Inherit;False;FLOAT;0;1;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;28;-629.0479,-660.6064;Float;False;MixDiffuse;-1;True;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.CustomExpressionNode;76;346.3839,1191.393;Float;False;v.ase_tangent.xyz + = cross ( v.ase_normal, float3( 0, 0, 1 ) )@$v.ase_tangent.w = -1@;1;True;0;CalculateTangentsSRP;True;False;0;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.RangedFloatNode;49;-24.21591,1708.193;Float;False;Property;_Metallic1;Metallic1;17;2;[HideInInspector];[Gamma];Create;True;0;0;False;0;False;0;0;0;1;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;190;-287.0641,3742.854;Inherit;False;2;2;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.GetLocalVarNode;150;353.9599,2963.144;Inherit;False;138;mask0;1;0;OBJECT;;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.FunctionInput;62;288.6909,-19.04097;Inherit;False;Custom + Alpha;1;6;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;32;-1705.907,-528.7023;Float;False;Property;_Smoothness3;Smoothness3;10;1;[HideInInspector];Create;True;0;0;False;0;False;1;0;0;1;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SwizzleNode;166;529.8993,3646.496;Inherit;False;FLOAT;0;1;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DynamicAppendNode;158;724.6343,3036.289;Inherit;False;FLOAT4;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.RangedFloatNode;80;-45.98957,1349.331;Float;False;Constant;_Float5;Float + 5;17;0;Create;True;0;0;False;0;False;0;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.LerpOp;215;389.3123,504.1568;Inherit;False;3;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0,0,0,0;False;2;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.GetLocalVarNode;196;440.4074,4680.303;Inherit;False;181;maskOcclusion;1;0;OBJECT;;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.GetLocalVarNode;54;680.1399,1554.148;Inherit;False;26;SplatControl;1;0;OBJECT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.GetLocalVarNode;46;-289.2161,318.535;Inherit;False;28;MixDiffuse;1;0;OBJECT;0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.CustomExpressionNode;74;-2041.122,125.4553;Float;False;#if + !defined(SHADER_API_MOBILE) && defined(TERRAIN_SPLAT_ADDPASS)$\tclip(SplatWeight + == 0.0f ? -1 : 1)@$#endif;1;True;1;True;SplatWeight;FLOAT;0;In;;Float;False;SplatClip;False;False;0;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;60;-369.0532,-738.7761;Inherit;False;Custom + Albedo;4;1;False;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;210;-428.2156,-1804.76;Inherit;False;defaultSmoothness;-1;True;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.FunctionInput;57;1177.389,1568.532;Inherit;False;Custom + Metallic;1;3;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.LerpOp;192;664.4073,4664.303;Inherit;False;3;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0,0,0,0;False;2;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.TexturePropertyNode;104;-649.9539,2840.603;Inherit;True;Property;_Mask1;_Mask1;21;1;[HideInInspector];Create;True;0;0;True;0;False;None;None;False;white;Auto;Texture2D;-1;0;2;SAMPLER2D;0;SAMPLERSTATE;1\nNode;AmplifyShaderEditor.TexturePropertyNode;103;-867.7384,2839.526;Inherit;True;Property;_Mask0;_Mask0;20;1;[HideInInspector];Create;True;0;0;True;0;False;None;None;False;white;Auto;Texture2D;-1;0;2;SAMPLER2D;0;SAMPLERSTATE;1\nNode;AmplifyShaderEditor.TexturePropertyNode;106;-219.8126,2839.176;Inherit;True;Property;_Mask3;_Mask3;22;1;[HideInInspector];Create;True;0;0;True;0;False;None;None;False;white;Auto;Texture2D;-1;0;2;SAMPLER2D;0;SAMPLERSTATE;1\nNode;AmplifyShaderEditor.TexturePropertyNode;105;-434.9858,2836.898;Inherit;True;Property;_Mask2;_Mask2;19;1;[HideInInspector];Create;True;0;0;True;0;False;None;None;False;white;Auto;Texture2D;-1;0;2;SAMPLER2D;0;SAMPLERSTATE;1\nNode;AmplifyShaderEditor.GetLocalVarNode;212;101.0529,324.0095;Inherit;False;210;defaultSmoothness;1;0;OBJECT;;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.GetLocalVarNode;213;128.0529,504.0095;Inherit;False;149;maskSmoothness;1;0;OBJECT;;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.GetLocalVarNode;217;414.0565,655.2891;Inherit;False;26;SplatControl;1;0;OBJECT;;False;1;COLOR;0\nNode;AmplifyShaderEditor.FunctionSwitchByPipeline;220;570.5651,410.0537;Inherit;False;4;0;FLOAT4;0,0,0,0;False;3;FLOAT4;0,0,0,0;False;1;FLOAT4;0,0,0,0;False;2;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.DotProductOpNode;216;817.0565,513.2891;Inherit;False;2;0;FLOAT4;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionSwitchByPipeline;218;867.7135,4622.045;Inherit;False;4;0;FLOAT4;0,0,0,0;False;3;FLOAT4;0,0,0,0;False;1;FLOAT4;0,0,0,0;False;2;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.TextureCoordinatesNode;111;302.6284,2306.024;Inherit;False;0;4;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SamplerNode;6;-1575.096,-907.3033;Inherit;True;Property;_Splat2;Splat2;3;1;[HideInInspector];Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SwizzleNode;155;522.9917,3049.485;Inherit;False;FLOAT;3;1;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;99;252.4595,-530.1924;Inherit;False;holeClipValue;-1;True;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DynamicAppendNode;39;-1432.712,-1076.035;Inherit;False;FLOAT4;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.SamplerNode;4;-1571.735,-1779.668;Inherit;True;Property;_Splat0;Splat0;5;1;[HideInInspector];Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.GetLocalVarNode;161;353.88,3647.859;Inherit;False;140;mask2;1;0;OBJECT;;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.DynamicAppendNode;36;-1399.088,-1520.375;Inherit;False;FLOAT4;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.SwizzleNode;164;529.8993,3486.496;Inherit;False;FLOAT;0;1;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;50;-19.21585,1806.193;Float;False;Property;_Metallic2;Metallic2;15;2;[HideInInspector];[Gamma];Create;True;0;0;False;0;False;0;0;0;1;0;1;FLOAT;0\nNode;AmplifyShaderEditor.DotProductOpNode;197;1089.656,4723.663;Inherit;False;2;0;FLOAT4;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;163;356.6753,3564.007;Inherit;False;139;mask1;1;0;OBJECT;;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.GetLocalVarNode;214;154.0529,668.0095;Inherit;False;136;layerHasMask;1;0;OBJECT;;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.SwizzleNode;154;522.9917,2969.485;Inherit;False;FLOAT;3;1;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SummedBlendNode;9;-835.2949,-654.9649;Inherit;False;5;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0,0,0,0;False;2;FLOAT4;0,0,0,0;False;3;FLOAT4;0,0,0,0;False;4;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.GetLocalVarNode;173;353.4217,4160.415;Inherit;False;140;mask2;1;0;OBJECT;;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.GetLocalVarNode;193;440.4074,4760.303;Inherit;False;136;layerHasMask;1;0;OBJECT;;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.SummedBlendNode;8;-1106.425,902.7103;Inherit;False;5;0;FLOAT4;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;3;COLOR;0,0,0,0;False;4;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.GetLocalVarNode;160;360.8676,3480.155;Inherit;False;138;mask0;1;0;OBJECT;;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.NormalVertexDataNode;81;-66.2998,1212.924;Inherit;False;0;5;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.RangedFloatNode;30;-1677.401,-1423.224;Float;False;Property;_Smoothness1;Smoothness1;11;1;[HideInInspector];Create;True;0;0;False;0;False;1;0;0;1;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SamplerNode;2;-1570.425,662.7104;Inherit;True;Property;_Normal0;Normal0;6;1;[HideInInspector];Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.StaticSwitch;84;-1024.719,1119.15;Inherit;False;Property;_EnablePerpixelNormals;Enable + Per-pixel Normals;18;0;Create;True;0;0;False;0;False;0;0;0;True;_TERRAIN_INSTANCED_PERPIXEL_NORMAL;Toggle;2;Key0;Key1;Create;True;False;9;1;FLOAT3;0,0,0;False;0;FLOAT3;0,0,0;False;2;FLOAT3;0,0,0;False;3;FLOAT3;0,0,0;False;4;FLOAT3;0,0,0;False;5;FLOAT3;0,0,0;False;6;FLOAT3;0,0,0;False;7;FLOAT3;0,0,0;False;8;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.RangedFloatNode;34;-1585.608,-1932.8;Float;False;Constant;_Float1;Float + 1;13;0;Create;True;0;0;False;0;False;1;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;137;327.5631,2219.96;Inherit;False;136;layerHasMask;1;0;OBJECT;;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.TextureCoordinatesNode;112;305.6313,2427.848;Inherit;False;0;3;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SwizzleNode;176;529.441,3999.052;Inherit;False;FLOAT;1;1;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;174;357.6143,4251.252;Inherit;False;141;mask3;1;0;OBJECT;;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;139;929.6311,2444.965;Inherit;False;mask1;-1;True;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.DynamicAppendNode;180;731.0833,4065.856;Inherit;False;FLOAT4;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.FunctionInput;61;-637.6442,821.6487;Inherit;False;Custom + Normal;3;2;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.CustomExpressionNode;16;395.9061,1093.737;Float;False;v.tangent.xyz + = cross ( v.normal, float3( 0, 0, 1 ) )@$v.tangent.w = -1@;1;True;0;CalculateTangentsStandard;True;False;0;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DotProductOpNode;20;-2392.622,167.361;Inherit;False;2;0;COLOR;0,0,0,0;False;1;FLOAT4;0,0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;141;940.2234,2675.739;Inherit;False;mask3;-1;True;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.DynamicAppendNode;188;-485.4102,3647.58;Inherit;False;FLOAT4;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.DynamicAppendNode;42;-1414.952,-615.6342;Inherit;False;FLOAT4;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.FunctionSwitchByPipeline;75;647.9054,1106.737;Inherit;False;4;0;FLOAT;0;False;3;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;2;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionSwitch;102;791.2579,-704.1357;Inherit;False;Activate + Holes;True;1;2;-1;In 0;In 1;Object;-1;9;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0,0,0,0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.RangedFloatNode;40;-1595.099,-1079.418;Float;False;Constant;_Float3;Float + 3;13;0;Create;True;0;0;False;0;False;1;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;51;-8.215824,1904.193;Float;False;Property;_Metallic3;Metallic3;16;2;[HideInInspector];[Gamma];Create;True;0;0;False;0;False;0;0;0;1;0;1;FLOAT;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;140;944.0311,2564.296;Inherit;False;mask2;-1;True;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;44;-1252.967,-522.7264;Inherit;False;2;2;0;FLOAT4;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.SwizzleNode;177;529.441,4079.052;Inherit;False;FLOAT;1;1;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;172;360.4093,3992.71;Inherit;False;138;mask0;1;0;OBJECT;;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.SwizzleNode;179;529.441,4239.051;Inherit;False;FLOAT;1;1;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.TextureCoordinatesNode;70;-1808,688;Inherit;False;0;4;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.TextureCoordinatesNode;114;305.6313,2684.965;Inherit;False;0;7;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.GetLocalVarNode;204;418.8666,1933.974;Inherit;False;136;layerHasMask;1;0;OBJECT;;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.RangedFloatNode;133;-846.5417,5243.348;Inherit;False;Global;_LayerHasMask2;_LayerHasMask2;23;0;Create;True;0;0;False;0;False;0;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.DynamicAppendNode;135;-622.5417,5160.348;Inherit;False;FLOAT4;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.RangedFloatNode;29;-1728.84,-1854.911;Float;False;Property;_Smoothness0;Smoothness0;12;1;[HideInInspector];Create;True;0;0;False;0;False;1;0;0;1;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SamplerNode;98;-48.01836,-552.3624;Inherit;True;Property;_TerrainHolesTexture;_TerrainHolesTexture;0;1;[HideInInspector];Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.Vector4Node;21;-2689.97,184.6759;Float;False;Constant;_Vector0;Vector + 0;9;0;Create;True;0;0;False;0;False;1,1,1,1;0,0,0,0;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.RegisterLocalVarNode;22;-2261.105,164.0728;Float;False;SplatWeight;-1;True;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;41;-1260.513,-932.1429;Inherit;False;2;2;0;FLOAT4;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.DynamicAppendNode;189;-460.6728,3882.633;Inherit;False;FLOAT4;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;26;-1568,16;Float;False;SplatControl;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.RangedFloatNode;132;-848.5417,5153.348;Inherit;False;Global;_LayerHasMask1;_LayerHasMask1;23;0;Create;True;0;0;False;0;False;0;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;203;411.0664,1824.774;Inherit;False;169;maskMetallic;1;0;OBJECT;;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;138;945.6311,2284.965;Inherit;False;mask0;-1;True;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.SwizzleNode;47;-82.6719,320.1653;Inherit;False;FLOAT;3;1;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SamplerNode;3;-1584.171,-1329.939;Inherit;True;Property;_Splat1;Splat1;4;1;[HideInInspector];Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SwizzleNode;157;522.9917,3209.485;Inherit;False;FLOAT;3;1;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;101;112.4228,-666.2932;Inherit;False;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.GetLocalVarNode;175;356.217,4076.562;Inherit;False;139;mask1;1;0;OBJECT;;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.RangedFloatNode;131;-861.5417,5073.348;Inherit;False;Global;_LayerHasMask0;_LayerHasMask0;23;0;Create;True;0;0;False;0;False;0;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;24;-1836.506,177.3755;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;153;351.1649,3221.686;Inherit;False;141;mask3;1;0;OBJECT;;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.TextureCoordinatesNode;73;-1808,1312;Inherit;False;0;7;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.FunctionInput;58;931.6936,507.8923;Inherit;False;Custom + Smoothness;1;4;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;149;879.2237,3040.641;Inherit;False;maskSmoothness;-1;True;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.TextureCoordinatesNode;71;-1808,880;Inherit;False;0;3;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.FunctionInput;201;1243.743,4725.404;Inherit;False;Custom + Occlusion;1;5;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;198;884.6371,4816.325;Inherit;False;26;SplatControl;1;0;OBJECT;;False;1;COLOR;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;181;885.6727,4070.208;Inherit;False;maskOcclusion;-1;True;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.SwizzleNode;178;529.441,4159.051;Inherit;False;FLOAT;1;1;2;3;1;0;FLOAT4;0,0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;25;-2144,256;Float;False;Constant;_Float0;Float + 0;9;0;Create;True;0;0;False;0;False;0.001;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.DynamicAppendNode;205;-794.3522,-1895.012;Inherit;False;FLOAT4;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.LerpOp;202;657.944,1768.564;Inherit;False;3;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0,0,0,0;False;2;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.DynamicAppendNode;55;297.546,1713.904;Inherit;False;FLOAT4;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.Vector4Node;126;-912,4112;Inherit;False;Global;_MaskMapRemapScale1;_MaskMapRemapScale1;23;0;Create;True;0;0;True;0;False;0,0,0,0;0,0,0,0;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.RangedFloatNode;134;-859.5417,5329.349;Inherit;False;Global;_LayerHasMask3;_LayerHasMask3;23;0;Create;True;0;0;False;0;False;0;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionSwitchByPipeline;219;829.7055,1679.817;Inherit;False;4;0;FLOAT4;0,0,0,0;False;3;FLOAT4;0,0,0,0;False;1;FLOAT4;0,0,0,0;False;2;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.CustomExpressionNode;130;625.6312,2412.965;Inherit;False;masks0 + = 0.5h@$masks1 = 0.5h@$masks2 = 0.5h@$masks3 = 0.5h@$#ifdef _MASKMAP$masks0 = + lerp(masks0, SAMPLE_TEXTURE2D(_Mask0, sampler_Mask0, uvMask0), hasMask.x)@$masks1 + = lerp(masks1, SAMPLE_TEXTURE2D(_Mask1, sampler_Mask0, uvMask1), hasMask.y)@$masks2 + = lerp(masks2, SAMPLE_TEXTURE2D(_Mask2, sampler_Mask0, uvMask2), hasMask.z)@$masks3 + = lerp(masks3, SAMPLE_TEXTURE2D(_Mask3, sampler_Mask0, uvMask3), hasMask.w)@$#endif$masks0 + *= _MaskMapRemapScale0.rgba@$masks0 += _MaskMapRemapOffset0.rgba@$masks1 *= _MaskMapRemapScale1.rgba@$masks1 + += _MaskMapRemapOffset1.rgba@$masks2 *= _MaskMapRemapScale2.rgba@$masks2 += _MaskMapRemapOffset2.rgba@$masks3 + *= _MaskMapRemapScale3.rgba@$masks3 += _MaskMapRemapOffset3.rgba@;7;False;9;True;masks0;FLOAT4;0,0,0,0;Out;;Inherit;False;True;masks1;FLOAT4;0,0,0,0;Out;;Inherit;False;True;masks2;FLOAT4;0,0,0,0;Out;;Inherit;False;True;masks3;FLOAT4;0,0,0,0;Out;;Inherit;False;False;hasMask;FLOAT4;0,0,0,0;In;;Inherit;False;False;uvMask0;FLOAT2;0,0;In;;Inherit;False;False;uvMask1;FLOAT2;0,0;In;;Inherit;False;False;uvMask2;FLOAT2;0,0;In;;Inherit;False;True;uvMask3;FLOAT2;0,0;In;;Inherit;False;ComputeMasks;True;False;0;10;0;FLOAT;0;False;1;FLOAT4;0,0,0,0;False;2;FLOAT4;0,0,0,0;False;3;FLOAT4;0,0,0,0;False;4;FLOAT4;0,0,0,0;False;5;FLOAT4;0,0,0,0;False;6;FLOAT2;0,0;False;7;FLOAT2;0,0;False;8;FLOAT2;0,0;False;9;FLOAT2;0,0;False;5;FLOAT;0;FLOAT4;2;FLOAT4;3;FLOAT4;4;FLOAT4;5\nNode;AmplifyShaderEditor.DynamicAppendNode;206;-800,-1728;Inherit;False;FLOAT4;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.SamplerNode;7;-1563.881,-422.9568;Inherit;True;Property;_Splat3;Splat3;2;1;[HideInInspector];Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.RegisterLocalVarNode;136;-415.5418,5176.348;Inherit;False;layerHasMask;-1;True;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.Vector4Node;125;-912,3904;Inherit;False;Global;_MaskMapRemapScale0;_MaskMapRemapScale0;23;0;Create;True;0;0;True;0;False;0,0,0,0;0,0,0,0;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.Vector4Node;122;-930.8565,3265.366;Inherit;False;Global;_MaskMapRemapOffset1;_MaskMapRemapOffset1;23;0;Create;True;0;0;True;0;False;0,0,0,0;0,0,0,0;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.Vector4Node;123;-935.1711,3467.736;Inherit;False;Global;_MaskMapRemapOffset2;_MaskMapRemapOffset2;23;0;Create;True;0;0;True;0;False;0,0,0,0;0,0,0,0;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;207;-595.396,-1831.095;Inherit;False;2;2;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.RangedFloatNode;37;-1553.258,-1504.617;Float;False;Constant;_Float2;Float + 2;13;0;Create;True;0;0;False;0;False;1;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.DotProductOpNode;53;1011.853,1573.078;Inherit;False;2;0;COLOR;0,0,0,0;False;1;FLOAT4;0,0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.Vector4Node;127;-912,4304;Inherit;False;Global;_MaskMapRemapScale2;_MaskMapRemapScale2;23;0;Create;True;0;0;True;0;False;0,0,0,0;0,0,0,0;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.Vector4Node;128;-912,4496;Inherit;False;Global;_MaskMapRemapScale3;_MaskMapRemapScale3;23;0;Create;True;0;0;True;0;False;0,0,0,0;0,0,0,0;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.Vector4Node;121;-941.6769,3065.909;Inherit;False;Global;_MaskMapRemapOffset0;_MaskMapRemapOffset0;23;0;Create;True;0;0;True;0;False;0,0,0,0;0,0,0,0;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.Vector4Node;124;-934.2458,3669.353;Inherit;False;Global;_MaskMapRemapOffset3;_MaskMapRemapOffset3;23;0;Create;True;0;0;True;0;False;0,0,0,0;0,0,0,0;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.FunctionOutput;14;-417.8965,823.1106;Inherit;False;False;-1;Normal;1;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionOutput;56;1366.832,1559.547;Inherit;False;False;-1;Metallic;2;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;45;1145.995,514.5017;Inherit;False;False;-1;Smoothness;3;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;19;493.604,-31.32466;Inherit;False;False;-1;Alpha;5;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;0;1098.414,-685.4164;Inherit;False;True;-1;Albedo;0;False;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.FunctionOutput;200;1474.611,4755.851;Inherit;False;False;-1;Occlusion;4;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;17;887.9049,1074.737;Inherit;False;False;-1;Tangents;6;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nWireConnection;33;0;34;0\nWireConnection;33;1;34;0\nWireConnection;33;2;34;0\nWireConnection;33;3;29;0\nWireConnection;11;1;73;0\nWireConnection;168;0;164;0\nWireConnection;168;1;165;0\nWireConnection;168;2;166;0\nWireConnection;168;3;167;0\nWireConnection;165;0;163;0\nWireConnection;10;1;72;0\nWireConnection;78;0;77;0\nWireConnection;78;1;81;0\nWireConnection;78;2;80;0\nWireConnection;156;0;152;0\nWireConnection;1;1;71;0\nWireConnection;169;0;168;0\nWireConnection;85;0;61;0\nWireConnection;85;1;84;0\nWireConnection;59;0;26;0\nWireConnection;191;0;190;0\nWireConnection;23;0;5;0\nWireConnection;23;1;24;0\nWireConnection;100;0;101;0\nWireConnection;100;1;99;0\nWireConnection;12;0;8;0\nWireConnection;38;0;36;0\nWireConnection;38;1;3;0\nWireConnection;35;0;33;0\nWireConnection;35;1;4;0\nWireConnection;167;0;162;0\nWireConnection;28;0;9;0\nWireConnection;76;0;78;0\nWireConnection;190;0;188;0\nWireConnection;190;1;189;0\nWireConnection;62;0;27;0\nWireConnection;166;0;161;0\nWireConnection;158;0;154;0\nWireConnection;158;1;155;0\nWireConnection;158;2;156;0\nWireConnection;158;3;157;0\nWireConnection;215;0;212;0\nWireConnection;215;1;213;0\nWireConnection;215;2;214;0\nWireConnection;74;0;22;0\nWireConnection;74;1;22;0\nWireConnection;60;0;28;0\nWireConnection;210;0;207;0\nWireConnection;57;0;53;0\nWireConnection;192;0;195;0\nWireConnection;192;1;196;0\nWireConnection;192;2;193;0\nWireConnection;220;0;212;0\nWireConnection;220;3;212;0\nWireConnection;220;1;215;0\nWireConnection;220;2;215;0\nWireConnection;216;0;220;0\nWireConnection;216;1;217;0\nWireConnection;218;0;195;0\nWireConnection;218;3;195;0\nWireConnection;218;1;192;0\nWireConnection;218;2;192;0\nWireConnection;155;0;151;0\nWireConnection;99;0;98;1\nWireConnection;39;0;40;0\nWireConnection;39;1;40;0\nWireConnection;39;2;40;0\nWireConnection;39;3;31;0\nWireConnection;36;0;37;0\nWireConnection;36;1;37;0\nWireConnection;36;2;37;0\nWireConnection;36;3;30;0\nWireConnection;164;0;160;0\nWireConnection;197;0;218;0\nWireConnection;197;1;198;0\nWireConnection;154;0;150;0\nWireConnection;9;0;59;0\nWireConnection;9;1;35;0\nWireConnection;9;2;38;0\nWireConnection;9;3;41;0\nWireConnection;9;4;44;0\nWireConnection;8;0;59;0\nWireConnection;8;1;2;0\nWireConnection;8;2;1;0\nWireConnection;8;3;10;0\nWireConnection;8;4;11;0\nWireConnection;2;1;70;0\nWireConnection;84;1;61;0\nWireConnection;84;0;61;0\nWireConnection;176;0;172;0\nWireConnection;139;0;130;3\nWireConnection;180;0;176;0\nWireConnection;180;1;177;0\nWireConnection;180;2;178;0\nWireConnection;180;3;179;0\nWireConnection;61;0;12;0\nWireConnection;20;0;5;0\nWireConnection;20;1;21;0\nWireConnection;141;0;130;5\nWireConnection;188;0;121;2\nWireConnection;188;1;122;2\nWireConnection;188;2;123;2\nWireConnection;188;3;124;2\nWireConnection;42;0;43;0\nWireConnection;42;1;43;0\nWireConnection;42;2;43;0\nWireConnection;42;3;32;0\nWireConnection;75;0;16;0\nWireConnection;75;3;76;0\nWireConnection;75;1;76;0\nWireConnection;75;2;76;0\nWireConnection;102;0;60;0\nWireConnection;102;1;100;0\nWireConnection;140;0;130;4\nWireConnection;44;0;42;0\nWireConnection;44;1;7;0\nWireConnection;177;0;175;0\nWireConnection;179;0;174;0\nWireConnection;135;0;131;0\nWireConnection;135;1;132;0\nWireConnection;135;2;133;0\nWireConnection;135;3;134;0\nWireConnection;22;0;20;0\nWireConnection;41;0;39;0\nWireConnection;41;1;6;0\nWireConnection;189;0;125;2\nWireConnection;189;1;126;2\nWireConnection;189;2;127;2\nWireConnection;189;3;128;2\nWireConnection;26;0;23;0\nWireConnection;138;0;130;2\nWireConnection;47;0;46;0\nWireConnection;157;0;153;0\nWireConnection;101;0;60;0\nWireConnection;24;0;74;0\nWireConnection;24;1;25;0\nWireConnection;58;0;216;0\nWireConnection;149;0;158;0\nWireConnection;201;0;197;0\nWireConnection;181;0;180;0\nWireConnection;178;0;173;0\nWireConnection;205;0;29;0\nWireConnection;205;1;30;0\nWireConnection;205;2;31;0\nWireConnection;205;3;32;0\nWireConnection;202;0;55;0\nWireConnection;202;1;203;0\nWireConnection;202;2;204;0\nWireConnection;55;0;48;0\nWireConnection;55;1;49;0\nWireConnection;55;2;50;0\nWireConnection;55;3;51;0\nWireConnection;219;0;55;0\nWireConnection;219;3;55;0\nWireConnection;219;1;202;0\nWireConnection;219;2;202;0\nWireConnection;130;5;137;0\nWireConnection;130;6;111;0\nWireConnection;130;7;112;0\nWireConnection;130;8;113;0\nWireConnection;130;9;114;0\nWireConnection;206;0;4;4\nWireConnection;206;1;3;4\nWireConnection;206;2;6;4\nWireConnection;206;3;7;4\nWireConnection;136;0;135;0\nWireConnection;207;0;205;0\nWireConnection;207;1;206;0\nWireConnection;53;0;54;0\nWireConnection;53;1;219;0\nWireConnection;14;0;85;0\nWireConnection;56;0;57;0\nWireConnection;45;0;58;0\nWireConnection;19;0;62;0\nWireConnection;0;0;102;0\nWireConnection;200;0;201;0\nWireConnection;17;0;75;0\nASEEND*/\n//CHKSM=B5129B21BBF493FDBEDCD9047474F2BEBF168912" + m_functionName: + m_description: Creates a Standard Terrain shader. On main shader the tag SplatCount + must be created with a value of 4. + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 1 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: + - {fileID: 0} + - {fileID: 0} + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: + - LineType: 2 + LineValue: multi_compile_local __ _ALPHATEST_ON + GUIDToggle: 0 + GUIDValue: + Origin: 2 + - LineType: 2 + LineValue: shader_feature_local _MASKMAP + GUIDToggle: 0 + GUIDValue: + Origin: 2 + m_nodeCategory: 9 + m_customNodeCategory: Terrain + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Four Splats First Pass Terrain.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Four Splats First Pass Terrain.asset.meta new file mode 100644 index 0000000..e85e4e6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Four Splats First Pass Terrain.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 37452fdfb732e1443b7e39720d05b708 +timeCreated: 1513337564 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Grid.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Grid.asset new file mode 100644 index 0000000..6ed5ad4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Grid.asset @@ -0,0 +1,38 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Grid + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=17902\n-1462;-370;1004;726;1341.279;420.1091;1.453505;True;False\nNode;AmplifyShaderEditor.TexCoordVertexDataNode;3;-928,0;Inherit;False;0;2;0;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.ScaleAndOffsetNode;4;-656,0;Inherit;False;3;0;FLOAT2;0,0;False;1;FLOAT2;1,0;False;2;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionInput;6;-848,208;Inherit;False;Offset;2;1;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionInput;5;-864,128;Inherit;False;Tiling;2;0;False;1;0;FLOAT2;8,8;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionNode;1;-240,0;Inherit;True;Rectangle;-1;;1;6b23e0c975270fb4084c354b2c83366a;0;3;1;FLOAT2;0,0;False;2;FLOAT;0.5;False;3;FLOAT;0.5;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;2;-415,77;Inherit;False;Size;1;2;False;1;0;FLOAT;0.9;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FractNode;7;-416,0;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionOutput;0;0,0;Inherit;False;True;-1;Out;0;False;1;0;FLOAT;0;False;1;FLOAT;0\nWireConnection;4;0;3;0\nWireConnection;4;1;5;0\nWireConnection;4;2;6;0\nWireConnection;1;1;7;0\nWireConnection;1;2;2;0\nWireConnection;1;3;2;0\nWireConnection;7;0;4;0\nWireConnection;0;0;1;0\nASEEND*/\n//CHKSM=8522C6065F43CA9B41D4DCA7DB4B032BEE05BFF8" + m_functionName: + m_description: Creates a rectangular shaped grid. + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 9 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Grid.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Grid.asset.meta new file mode 100644 index 0000000..393f362 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Grid.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a9240ca2be7e49e4f9fa3de380c0dbe9 +timeCreated: 1586860862 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Half Lambert Term.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Half Lambert Term.asset new file mode 100644 index 0000000..f28ec2c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Half Lambert Term.asset @@ -0,0 +1,25 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Half Lambert Term + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=13705\n487;595;979;423;884.665;200.5353;1.013844;True;False\nNode;AmplifyShaderEditor.FunctionInput;3;-640,-32;Float;False;World + Normal;3;0;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3\nNode;AmplifyShaderEditor.ScaleAndOffsetNode;6;-208,0;Float;False;3;0;FLOAT;0.0;False;1;FLOAT;1.0;False;2;FLOAT;0.0;False;1;FLOAT\nNode;AmplifyShaderEditor.WorldSpaceLightDirHlpNode;8;-672,64;Float;False;1;0;FLOAT;0.0;False;4;FLOAT3;FLOAT;FLOAT;FLOAT\nNode;AmplifyShaderEditor.RangedFloatNode;7;-416,96;Float;False;Constant;_RemapValue;Remap + Value;0;0;0.5;0;0;0;1;FLOAT\nNode;AmplifyShaderEditor.DotProductOpNode;5;-416,0;Float;False;2;0;FLOAT3;0,0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT\nNode;AmplifyShaderEditor.WorldNormalVector;2;-864,-32;Float;False;1;0;FLOAT3;0,0,0;False;4;FLOAT3;FLOAT;FLOAT;FLOAT\nNode;AmplifyShaderEditor.FunctionOutput;0;16,0;Float;False;True;Out;0;1;0;FLOAT;0.0;False;0\nWireConnection;3;0;2;0\nWireConnection;6;0;5;0\nWireConnection;6;1;7;0\nWireConnection;6;2;7;0\nWireConnection;5;0;3;0\nWireConnection;5;1;8;0\nWireConnection;0;0;6;0\nASEEND*/\n//CHKSM=D225A64D2A31472128B6D003C45B4417097300C7" + m_functionName: + m_description: Generates a linear gradient from black to white that represents the + surface facing term to a light. Useful for cloth shading, skin or toon ramps. + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_nodeCategory: 11 + m_customNodeCategory: Lighting Models diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Half Lambert Term.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Half Lambert Term.asset.meta new file mode 100644 index 0000000..568356e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Half Lambert Term.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 86299dc21373a954aa5772333626c9c1 +timeCreated: 1510234721 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Height-based Blending.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Height-based Blending.asset new file mode 100644 index 0000000..8158f31 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Height-based Blending.asset @@ -0,0 +1,44 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Height-based Blending + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=17102\n1280.5;1;1278;1369;-764.8537;728.8295;1.036422;True;False\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;7;413,-443;Inherit;False;3;3;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;1;164.1368,-535.239;Inherit;False;Alpha;1;3;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;4;162.6766,-437.1684;Inherit;False;Height;1;2;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;5;236.3459,-320.3895;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;1;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;6;47.11577,-341;Float;False;Constant;_Float0;Float + 0;0;0;Create;True;0;0;False;0;1;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;2;22.54278,-256.0706;Inherit;False;Blend + Factor;1;4;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.PowerNode;8;886.6812,-337.8587;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;1;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SaturateNode;9;1092.221,-338.2482;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMaxOpNode;10;663.4116,-374.5408;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;3;27.04797,-99.6286;Inherit;False;Blend + Falloff;1;5;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;11;422.4116,-240.5408;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.LerpOp;14;1512.113,-459.3596;Inherit;False;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.FunctionInput;12;1247.828,-566.1115;Inherit;False;Bottom;5;1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.FunctionInput;13;1246.79,-467.6507;Inherit;False;Top;5;0;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.FunctionOutput;15;1711.107,-460.3962;Inherit;False;False;Result;0;False;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.FunctionOutput;0;1519.228,-232.7731;Inherit;False;True;Alpha;1;False;1;0;FLOAT;0;False;1;FLOAT;0\nWireConnection;7;0;1;0\nWireConnection;7;1;4;0\nWireConnection;7;2;5;0\nWireConnection;5;0;6;0\nWireConnection;5;1;2;0\nWireConnection;8;0;10;0\nWireConnection;8;1;11;0\nWireConnection;9;0;8;0\nWireConnection;10;0;7;0\nWireConnection;11;0;3;0\nWireConnection;14;0;12;0\nWireConnection;14;1;13;0\nWireConnection;14;2;9;0\nWireConnection;15;0;14;0\nWireConnection;0;0;9;0\nASEEND*/\n//CHKSM=EAEFB89C4A5CD1A06A1578CB7E39D908044F001C" + m_functionName: + m_description: Implements height-based blending to allow blending a bottom layer + to a top layer using a height map and a few control parameters, including alpha, + which can be from vertex color channel. + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 3 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Height-based Blending.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Height-based Blending.asset.meta new file mode 100644 index 0000000..a7845b2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Height-based Blending.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 31c0084e26e17dc4c963d2f60261c022 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Herringbone.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Herringbone.asset new file mode 100644 index 0000000..1b94b60 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Herringbone.asset @@ -0,0 +1,38 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Herringbone + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=17902\n-1478;80;1004;726;3587.759;1370.986;3.835479;True;False\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;10;-1072,16;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0.5;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;9;-1248,16;Inherit;False;Width;1;1;False;1;0;FLOAT;0.2;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;3;-400,-176;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SmoothstepOpNode;4;-624,-304;Inherit;False;3;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;1;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;35;-928,128;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0.5;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RoundOpNode;36;-1104,128;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleRemainderNode;29;-1248,-128;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMaxOpNode;1;-208,0;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;2;-416,192;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SmoothstepOpNode;5;-640,240;Inherit;False;3;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;1;False;1;FLOAT;0\nNode;AmplifyShaderEditor.AbsOpNode;14;-880,240;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.StepOpNode;12;-640,368;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleRemainderNode;33;-880,400;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleRemainderNode;34;-880,-128;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleRemainderNode;31;-1264,400;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.StepOpNode;11;-624,-160;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;30;-1056,-128;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;32;-1056,400;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;6;-857.5597,0.1007617;Inherit;False;2;2;0;FLOAT;0.05;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.AbsOpNode;26;-880,-304;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;28;-1440,192;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;2;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RoundOpNode;18;-1760,-192;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;22;-1600,-304;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;27;-1408,-128;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;-1;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;23;-1568,-128;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RoundOpNode;20;-1760,352;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;25;-1520,416;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.TexCoordVertexDataNode;15;-2496,64;Inherit;False;0;2;0;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;16;-2256,128;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;17;-2112,128;Inherit;False;FLOAT2;1;0;FLOAT2;0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.WireNode;38;-1810.665,-224.2363;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;24;-1520,304;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FloorOpNode;21;-1760,432;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FloorOpNode;19;-1760,-112;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;7;-2448,224;Inherit;False;Tiling;2;0;False;1;0;FLOAT2;6,6;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionInput;8;-1600,128;Inherit;False;Cells;1;2;False;1;0;FLOAT;3;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;0;0,0;Inherit;True;True;-1;Out;0;False;1;0;FLOAT;0;False;1;FLOAT;0\nWireConnection;10;0;9;0\nWireConnection;3;0;4;0\nWireConnection;3;1;11;0\nWireConnection;4;0;26;0\nWireConnection;4;1;6;0\nWireConnection;4;2;10;0\nWireConnection;35;0;36;0\nWireConnection;36;0;8;0\nWireConnection;29;0;27;0\nWireConnection;29;1;28;0\nWireConnection;1;0;3;0\nWireConnection;1;1;2;0\nWireConnection;2;0;5;0\nWireConnection;2;1;12;0\nWireConnection;5;0;14;0\nWireConnection;5;1;6;0\nWireConnection;5;2;10;0\nWireConnection;14;0;24;0\nWireConnection;12;0;35;0\nWireConnection;12;1;33;0\nWireConnection;33;0;32;0\nWireConnection;33;1;28;0\nWireConnection;34;0;30;0\nWireConnection;34;1;28;0\nWireConnection;31;0;25;0\nWireConnection;31;1;28;0\nWireConnection;11;0;35;0\nWireConnection;11;1;34;0\nWireConnection;30;0;29;0\nWireConnection;30;1;28;0\nWireConnection;32;0;31;0\nWireConnection;32;1;28;0\nWireConnection;6;1;10;0\nWireConnection;26;0;22;0\nWireConnection;28;0;8;0\nWireConnection;18;0;17;0\nWireConnection;22;0;38;0\nWireConnection;22;1;18;0\nWireConnection;27;0;23;0\nWireConnection;23;0;18;0\nWireConnection;23;1;19;0\nWireConnection;20;0;17;1\nWireConnection;25;0;20;0\nWireConnection;25;1;21;0\nWireConnection;16;0;15;0\nWireConnection;16;1;7;0\nWireConnection;17;0;16;0\nWireConnection;38;0;17;0\nWireConnection;24;0;17;1\nWireConnection;24;1;20;0\nWireConnection;21;0;17;0\nWireConnection;19;0;17;1\nWireConnection;0;0;1;0\nASEEND*/\n//CHKSM=BCB7F728B16C2B7BFFF600A14B7FC9C20F79CED1" + m_functionName: + m_description: Creates a herringbone rectangular floor tile pattern. + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 9 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Herringbone.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Herringbone.asset.meta new file mode 100644 index 0000000..112fc8d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Herringbone.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dbdb22f3b40ddf6459baf32842f7168a +timeCreated: 1586866005 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Hex Lattice.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Hex Lattice.asset new file mode 100644 index 0000000..9861493 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Hex Lattice.asset @@ -0,0 +1,40 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Hex Lattice + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=17902\n-1451;-120;1004;726;5300.028;1982.368;5.575107;True;False\nNode;AmplifyShaderEditor.SmoothstepOpNode;1;-192,0;Inherit;False;3;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;1;False;1;FLOAT;0\nNode;AmplifyShaderEditor.AbsOpNode;6;-512,0;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.AbsOpNode;13;-1616,64;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;7;-688,0;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMaxOpNode;8;-841,3;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;5;-352,0;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;2;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;3;-3664,256;Inherit;False;Tiling;2;0;False;1;0;FLOAT2;10,10;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionInput;2;-864,112;Inherit;False;Hex + Scale;1;1;False;1;0;FLOAT;1;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;4;-368,96;Inherit;False;Edge + Width;1;2;False;1;0;FLOAT;0.2;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;11;-1184,-16;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;1.5;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;9;-1008,-16;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;10;-1024,80;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;2;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DynamicAppendNode;14;-2144,64;Inherit;False;FLOAT2;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleRemainderNode;15;-1968,64;Inherit;False;2;0;FLOAT2;0,0;False;1;FLOAT2;1,1;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;24;-2304,144;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;23;-2448,224;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0.5;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleRemainderNode;22;-2656,224;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;2;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FloorOpNode;21;-2800,224;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;16;-1760,64;Inherit;False;2;0;FLOAT2;0,0;False;1;FLOAT2;0.5,0.5;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;19;-3312,128;Inherit;False;FLOAT2;1;0;FLOAT2;0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;18;-3472,128;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.TexCoordVertexDataNode;17;-3712,128;Inherit;False;0;2;0;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.BreakToComponentsNode;12;-1472,64;Inherit;False;FLOAT2;1;0;FLOAT2;0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;20;-3008,64;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;1.5;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;0;0,0;Inherit;True;True;-1;Out;0;False;1;0;FLOAT;0;False;1;FLOAT;0\nWireConnection;1;0;5;0\nWireConnection;1;2;4;0\nWireConnection;6;0;7;0\nWireConnection;13;0;16;0\nWireConnection;7;0;8;0\nWireConnection;7;1;2;0\nWireConnection;8;0;9;0\nWireConnection;8;1;10;0\nWireConnection;5;0;6;0\nWireConnection;11;0;12;0\nWireConnection;9;0;11;0\nWireConnection;9;1;12;1\nWireConnection;10;0;12;1\nWireConnection;14;0;20;0\nWireConnection;14;1;24;0\nWireConnection;15;0;14;0\nWireConnection;24;0;19;1\nWireConnection;24;1;23;0\nWireConnection;23;0;22;0\nWireConnection;22;0;21;0\nWireConnection;21;0;20;0\nWireConnection;16;0;15;0\nWireConnection;19;0;18;0\nWireConnection;18;0;17;0\nWireConnection;18;1;3;0\nWireConnection;12;0;13;0\nWireConnection;20;0;19;0\nWireConnection;0;0;1;0\nASEEND*/\n//CHKSM=3C3A7331726678319E055DBE5F0CE1A326E34C29" + m_functionName: + m_description: Creates a hexagonal lattice pattern. + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 9 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Hex Lattice.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Hex Lattice.asset.meta new file mode 100644 index 0000000..27875ae --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Hex Lattice.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 56d977fb137832a498dced8436cf6708 +timeCreated: 1586863236 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Houndstooth.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Houndstooth.asset new file mode 100644 index 0000000..ffacb65 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Houndstooth.asset @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Houndstooth + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=17902\n-1451;-120;1004;726;3255.592;1165.008;3.399142;True;False\nNode;AmplifyShaderEditor.TexCoordVertexDataNode;1;-2288,0;Inherit;False;0;2;0;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.FunctionInput;25;-2240,144;Inherit;False;Tiling;2;0;False;1;0;FLOAT2;5,5;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.DynamicAppendNode;68;-1280,0;Inherit;False;FLOAT3;4;0;FLOAT2;0,0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;24;-2048,0;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;63;-1456,96;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;20;-1600,208;Inherit;False;Teeth;1;1;False;1;0;FLOAT;2;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;66;-1600,96;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;65;-1856,96;Inherit;False;FLOAT2;1;0;FLOAT2;0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;11;-624,0;Inherit;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;16;-480,0;Inherit;False;FLOAT3;1;0;FLOAT3;0,0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.LerpOp;15;-240,0;Inherit;True;3;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SmoothstepOpNode;10;-848,0;Inherit;False;3;0;FLOAT3;0,0,0;False;1;FLOAT3;0.5,0.5,0;False;2;FLOAT3;0.55,0.55,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.Vector4Node;23;-1184,96;Inherit;False;Constant;_Vector0;Vector + 0;0;0;Create;True;0;0;False;0;0.5,0.55,0.95,1;0,0,0,0;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.FractNode;8;-1088,0;Inherit;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SmoothstepOpNode;12;-848,128;Inherit;False;3;0;FLOAT3;0,0,0;False;1;FLOAT3;0.95,0.95,0;False;2;FLOAT3;1,1,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionOutput;0;0,0;Inherit;False;True;-1;Out;0;False;1;0;FLOAT;0;False;1;FLOAT;0\nWireConnection;68;0;24;0\nWireConnection;68;2;63;0\nWireConnection;24;0;1;0\nWireConnection;24;1;25;0\nWireConnection;63;0;66;0\nWireConnection;63;1;20;0\nWireConnection;66;0;65;0\nWireConnection;66;1;65;1\nWireConnection;65;0;24;0\nWireConnection;11;0;10;0\nWireConnection;11;1;12;0\nWireConnection;16;0;11;0\nWireConnection;15;0;16;0\nWireConnection;15;1;16;1\nWireConnection;15;2;16;2\nWireConnection;10;0;8;0\nWireConnection;10;1;23;1\nWireConnection;10;2;23;2\nWireConnection;8;0;68;0\nWireConnection;12;0;8;0\nWireConnection;12;1;23;3\nWireConnection;12;2;23;4\nWireConnection;0;0;15;0\nASEEND*/\n//CHKSM=85441DDEF3C9BF306BA13CF583CEBD72A1CEC9B0" + m_functionName: + m_description: Creates a duotone textile pattern. + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 9 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Houndstooth.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Houndstooth.asset.meta new file mode 100644 index 0000000..3fc5c8b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Houndstooth.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 179b3e2dbd7f5a247afe15a7315e0707 +timeCreated: 1586788750 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Inverse Lerp.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Inverse Lerp.asset new file mode 100644 index 0000000..8c80dc8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Inverse Lerp.asset @@ -0,0 +1,41 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Inverse Lerp + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=17706\n435;95;1527;761;970.3008;288.0356;1;True;False\nNode;AmplifyShaderEditor.FunctionInput;3;-512,160;Inherit;False;Alpha;1;2;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;1;-512,0;Inherit;False;A;1;0;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;2;-512,80;Inherit;False;B;1;1;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;5;-320,0;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleDivideOpNode;4;-144,0;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;6;-320,96;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;0;0,0;Inherit;False;True;-1;;0;False;1;0;FLOAT;0;False;1;FLOAT;0\nWireConnection;5;0;3;0\nWireConnection;5;1;1;0\nWireConnection;4;0;5;0\nWireConnection;4;1;6;0\nWireConnection;6;0;2;0\nWireConnection;6;1;1;0\nWireConnection;0;0;4;0\nASEEND*/\n//CHKSM=9FE4353E1EA15E40F1B4D54618C26A1738EFB700" + m_functionName: + m_description: "Returns the linear parameter that produces the interpolant specified + by input Alpha within the range of input A to input B.\r Inverse Lerp is the inverse + operation of the Lerp Node. It can be used to determine what the input to a Lerp + was based on its output. " + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 7 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Inverse Lerp.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Inverse Lerp.asset.meta new file mode 100644 index 0000000..7f71a94 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Inverse Lerp.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 09cbe79402f023141a4dc1fddd4c9511 +timeCreated: 1582898085 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Lerp White To.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Lerp White To.asset new file mode 100644 index 0000000..7b85d32 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Lerp White To.asset @@ -0,0 +1,26 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Lerp White To + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=15308\n7;358;1906;673;1715.98;594.084;1.39994;False;False\nNode;AmplifyShaderEditor.FunctionInput;2;-544,-16;Float;False;T;1;1;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;5;48,-128;Float;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.DynamicAppendNode;7;-147,-5;Float;False;FLOAT3;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;6;-336,-128;Float;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionInput;1;-544,-160;Float;False;B;3;0;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.OneMinusNode;3;-352,0;Float;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;0;224,-128;Float;False;True;Output;0;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nWireConnection;5;0;6;0\nWireConnection;5;1;7;0\nWireConnection;7;0;3;0\nWireConnection;7;1;3;0\nWireConnection;7;2;3;0\nWireConnection;6;0;1;0\nWireConnection;6;1;2;0\nWireConnection;3;0;2;0\nWireConnection;0;0;5;0\nASEEND*/\n//CHKSM=D1DB2171EF0B926DCE56994508D5E925AFAC6AD5" + m_functionName: + m_description: + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_nodeCategory: 3 + m_customNodeCategory: + m_previewPosition: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Lerp White To.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Lerp White To.asset.meta new file mode 100644 index 0000000..3a348fb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Lerp White To.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 047d7c189c36a62438973bad9d37b1c2 +timeCreated: 1527498692 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Midtones Control.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Midtones Control.asset new file mode 100644 index 0000000..8a4ee24 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Midtones Control.asset @@ -0,0 +1,35 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Midtones Control + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=14205\n666;208;1066;728;2931.866;781.7222;2.2203;True;False\nNode;AmplifyShaderEditor.RangedFloatNode;3;-1907.899,-289.42;Float;False;Constant;_b;b;5;0;Create;True;0.333;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;5;-1973.299,6.039673;Float;False;Constant;_a;a;5;0;Create;True;0.25;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;20;-1191.009,82.84344;Float;False;Constant;_scale;scale;5;0;Create;True;0.7;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;22;-808.6494,-114.4888;Float;False;4;4;0;FLOAT;0.0;False;1;FLOAT;0.0;False;2;FLOAT;0.0;False;3;FLOAT3;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;23;-642.6191,-517.399;Float;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT3;0.0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.SaturateNode;24;-440.7793,-523.3648;Float;False;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.FunctionInput;26;-1138.585,215.9016;Float;False;Red + Shift;1;1;False;1;0;FLOAT;0.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;27;-1136.361,311.5068;Float;False;Green + Shift;1;2;False;1;0;FLOAT;0.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;28;-1092.291,436.1535;Float;False;Blue + Shift;1;3;False;1;0;FLOAT;0.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SamplerNode;1;-2162.971,-543.0989;Float;True;Property;_TextureSample0;Texture + Sample 0;3;0;Create;True;None;cc818fab9e6e24a40b931f8701ae2c12;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;6;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0.0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1.0;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.FunctionInput;25;-2376.585,-567.5209;Float;False;Input;9;0;False;1;0;SAMPLER2D;0.0;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.DynamicAppendNode;17;-898.4647,265.9574;Float;False;FLOAT3;4;0;FLOAT;0.0;False;1;FLOAT;0.0;False;2;FLOAT;0.0;False;3;FLOAT;0.0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.WireNode;21;-1276.049,-548.8137;Float;False;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.NegateNode;7;-1550.52,151.5848;Float;False;1;0;FLOAT;0.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;8;-1535.909,-477.3485;Float;False;2;0;FLOAT;0.0;False;1;FLOAT;0.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;4;-1724.909,10.69427;Float;False;Constant;_Float1;Float + 1;5;0;Create;True;-1;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;6;-1560.319,-92.27643;Float;False;3;3;0;FLOAT;0.0;False;1;FLOAT;0.0;False;2;FLOAT;0.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;15;-1207.399,-318.7663;Float;False;2;2;0;FLOAT;0.0;False;1;FLOAT;0.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;16;-1161.829,-75.91486;Float;False;2;2;0;FLOAT;0.0;False;1;FLOAT;0.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleDivideOpNode;10;-1380.099,-330.7704;Float;False;2;0;FLOAT;0.0;False;1;FLOAT;0.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SaturateNode;18;-1061.339,-331.9753;Float;False;1;0;FLOAT;0.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SaturateNode;19;-1008.659,-73.86804;Float;False;1;0;FLOAT;0.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleDivideOpNode;9;-1363.329,-47.31543;Float;False;2;0;FLOAT;0.0;False;1;FLOAT;0.0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.CustomExpressionNode;2;-1772.049,-470.1264;Float;False;float + fmin = min(min(Color.r, Color.g), Color.b)@$float fmax = max(max(Color.r, Color.g), + Color.b)@$return (fmax + fmin) / 2.0@;1;False;1;True;Color;FLOAT3;0,0,0;In;RBGToLuminance;1;0;FLOAT3;0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;11;-1366.299,-194.0069;Float;False;Constant;_Float3;Float + 3;5;0;Create;True;0.5;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;0;-271.7024,-592.2229;Float;False;True;Output;0;False;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nWireConnection;22;0;18;0\nWireConnection;22;1;19;0\nWireConnection;22;2;20;0\nWireConnection;22;3;17;0\nWireConnection;23;0;21;0\nWireConnection;23;1;22;0\nWireConnection;24;0;23;0\nWireConnection;1;0;25;0\nWireConnection;17;0;26;0\nWireConnection;17;1;27;0\nWireConnection;17;2;28;0\nWireConnection;21;0;1;0\nWireConnection;7;0;5;0\nWireConnection;8;0;2;0\nWireConnection;8;1;3;0\nWireConnection;6;0;2;0\nWireConnection;6;1;3;0\nWireConnection;6;2;4;0\nWireConnection;15;0;10;0\nWireConnection;15;1;11;0\nWireConnection;16;0;11;0\nWireConnection;16;1;9;0\nWireConnection;10;0;8;0\nWireConnection;10;1;5;0\nWireConnection;18;0;15;0\nWireConnection;19;0;16;0\nWireConnection;9;0;6;0\nWireConnection;9;1;7;0\nWireConnection;2;0;1;0\nWireConnection;0;0;24;0\nASEEND*/\n//CHKSM=75F383819F22C7DE4B23FB26DA48A8B24E31CDAE" + m_functionName: + m_description: Can change midtones but does not preserve luminosity (still under + construction ) + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_nodeCategory: 3 + m_customNodeCategory: + m_previewPosition: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Midtones Control.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Midtones Control.asset.meta new file mode 100644 index 0000000..03d0250 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Midtones Control.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1862d12003a80d24ab048da83dc4e4d5 +timeCreated: 1516025195 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Noise Sine Wave.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Noise Sine Wave.asset new file mode 100644 index 0000000..e9b8ffa --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Noise Sine Wave.asset @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Noise Sine Wave + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=17500\n508;100;994;700;-752.6482;31.0816;1;True;False\nNode;AmplifyShaderEditor.GetLocalVarNode;23;1004.148,255.9184;Inherit;False;7;sinIn;1;0;OBJECT;;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;7;599.5011,526.1053;Inherit;False;sinIn;-1;True;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;15;704,256;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SinOpNode;24;576,640;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;1;272,576;Inherit;False;In;1;0;True;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;5;272,672;Inherit;False;Constant;_Float0;Float + 0;0;0;Create;True;0;0;False;0;1;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;6;704,624;Inherit;False;sinInOffset;-1;True;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;4;448,624;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FractNode;17;848,224;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SinOpNode;3;448,544;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;12;224,336;Inherit;False;Constant;_Float1;Float + 1;0;0;Create;True;0;0;False;0;91.2228;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;21;1198.957,186.5331;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;2;599.7036,112.5256;Inherit;False;Min + Max;2;1;False;1;0;FLOAT2;-0.5,0.5;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.GetLocalVarNode;9;80,176;Inherit;False;7;sinIn;1;0;OBJECT;;False;1;FLOAT;0\nNode;AmplifyShaderEditor.LerpOp;20;985.5731,116.8529;Inherit;False;3;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;10;64,256;Inherit;False;6;sinInOffset;1;0;OBJECT;;False;1;FLOAT;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;19;743.0641,109.0836;Inherit;False;FLOAT2;1;0;FLOAT2;0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.SinOpNode;14;576,256;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;16;416,368;Inherit;False;Constant;_Float2;Float + 2;0;0;Create;True;0;0;False;0;43758.55;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;13;416,256;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;8;272,208;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;0;1372,141;Inherit;False;True;-1;Out;0;False;1;0;FLOAT;0;False;1;FLOAT;0\nWireConnection;7;0;3;0\nWireConnection;15;0;14;0\nWireConnection;15;1;16;0\nWireConnection;24;0;4;0\nWireConnection;6;0;24;0\nWireConnection;4;0;1;0\nWireConnection;4;1;5;0\nWireConnection;17;0;15;0\nWireConnection;3;0;1;0\nWireConnection;21;0;20;0\nWireConnection;21;1;23;0\nWireConnection;20;0;19;0\nWireConnection;20;1;19;1\nWireConnection;20;2;17;0\nWireConnection;19;0;2;0\nWireConnection;14;0;13;0\nWireConnection;13;0;8;0\nWireConnection;13;1;12;0\nWireConnection;8;0;9;0\nWireConnection;8;1;10;0\nWireConnection;0;0;21;0\nASEEND*/\n//CHKSM=19A53C6E7C22AEDCEB7C9748D639AD32E25A4747" + m_functionName: + m_description: Creates a sine wave from a given input with an added pseudo-random + value + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 9 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Noise Sine Wave.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Noise Sine Wave.asset.meta new file mode 100644 index 0000000..30059cb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Noise Sine Wave.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a6eff29f739ced848846e3b648af87bd +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Non Stereo Screen Pos.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Non Stereo Screen Pos.asset new file mode 100644 index 0000000..98af8ee --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Non Stereo Screen Pos.asset @@ -0,0 +1,42 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Non Stereo Screen Pos + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=18812\n-2114;98;1601;770;1522.233;357.651;1.3;True;False\nNode;AmplifyShaderEditor.FunctionInput;23;-544,0;Inherit;False;Screen + Pos;4;0;False;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.CustomExpressionNode;22;-384,0;Inherit;False;#if + UNITY_SINGLE_PASS_STEREO$float4 scaleOffset = unity_StereoScaleOffset[ unity_StereoEyeIndex + ]@$UV.xy = (UV.xy - scaleOffset.zw) / scaleOffset.xy@$#endif$return UV@;2;False;1;True;UV;FLOAT2;0,0;In;;Float;False;UnStereo;False;False;0;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.ScreenPosInputsNode;21;-752,-45.5;Inherit;False;0;False;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.FunctionOutput;0;-224,0;Inherit;False;True;-1;UV;0;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nWireConnection;23;0;21;0\nWireConnection;22;0;23;0\nWireConnection;0;0;22;0\nASEEND*/\n//CHKSM=E2EEB77DC921BFB3883BDF45A4C981ACE85F8ED2" + m_functionName: + m_description: Transforms a screen position value from VR Stereo to non Stereo + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_customEdited: 0 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 3 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Non Stereo Screen Pos.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Non Stereo Screen Pos.asset.meta new file mode 100644 index 0000000..ae29d03 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Non Stereo Screen Pos.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1731ee083b93c104880efc701e11b49b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Normal From Height.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Normal From Height.asset new file mode 100644 index 0000000..a60acb8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Normal From Height.asset @@ -0,0 +1,47 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Normal From Height + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity + Asset Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=18702\n0;632;1729;727;608.7599;657.7451;1;True;False\nNode;AmplifyShaderEditor.WorldNormalVector;109;109.7551,-549.6889;Inherit;False;False;1;0;FLOAT3;0,0,1;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3\nNode;AmplifyShaderEditor.WorldPosInputsNode;108;117.2075,-701.2255;Inherit;False;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3\nNode;AmplifyShaderEditor.TransformDirectionNode;42;687.678,-435.2692;Inherit;False;World;Tangent;False;Fast;1;0;FLOAT3;0,0,0;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3\nNode;AmplifyShaderEditor.FunctionInput;20;190.7045,-386.7478;Inherit;False;Height;1;0;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;110;196.2401,-283.7451;Inherit;False;Strength;1;1;False;1;0;FLOAT;1;False;1;FLOAT;0\nNode;AmplifyShaderEditor.CustomExpressionNode;107;424.2144,-542.7633;Inherit;False;// + \"Bump Mapping Unparametrized Surfaces on the GPU\" by Morten S. Mikkelsen$float3 + vSigmaS = ddx( surf_pos )@$float3 vSigmaT = ddy( surf_pos )@$float3 vN = surf_norm@$float3 + vR1 = cross( vSigmaT , vN )@$float3 vR2 = cross( vN , vSigmaS )@$float fDet = + dot( vSigmaS , vR1 )@$float dBs = ddx( height )@$float dBt = ddy( height )@$float3 + vSurfGrad = scale * 0.05 * sign( fDet ) * ( dBs * vR1 + dBt * vR2 )@$return normalize + ( abs( fDet ) * vN - vSurfGrad )@$;3;False;4;True;surf_pos;FLOAT3;0,0,0;In;;Inherit;False;True;surf_norm;FLOAT3;0,0,0;In;;Inherit;False;True;height;FLOAT;0;In;;Inherit;False;True;scale;FLOAT;0;In;;Inherit;False;PerturbNormal;True;False;0;4;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionOutput;40;936.6965,-431.3251;Inherit;False;False;-1;Tangent + Normal;0;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionOutput;0;709.3525,-542.4827;Inherit;False;True;-1;World + Normal;1;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nWireConnection;42;0;107;0\nWireConnection;107;0;108;0\nWireConnection;107;1;109;0\nWireConnection;107;2;20;0\nWireConnection;107;3;110;0\nWireConnection;40;0;42;0\nWireConnection;0;0;107;0\nASEEND*/\n//CHKSM=73C78BB6755C01B84C5BF88CEAA7D85C65F7A490" + m_functionName: + m_description: Derive a normal vector from a procedural height value. + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 3 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Normal From Height.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Normal From Height.asset.meta new file mode 100644 index 0000000..d8ae7da --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Normal From Height.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1942fe2c5f1a1f94881a33d532e4afeb +timeCreated: 1575458539 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Normal From Texture.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Normal From Texture.asset new file mode 100644 index 0000000..29c536d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Normal From Texture.asset @@ -0,0 +1,82 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Normal From Texture + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity + Asset Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=18702\n0;411;1729;948;621.1696;-899.756;1.578781;True;False\nNode;AmplifyShaderEditor.WireNode;94;-934.7373,3153.675;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.FunctionSwitch;149;-35.36745,2507.335;Inherit;False;Height + Channel;False;0;4;-1;R;G;B;A;Instance;135;9;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;148;-173.2692,2512.505;Inherit;False;COLOR;1;0;COLOR;0,0,0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.FunctionSwitch;147;-37.1351,2265.176;Inherit;False;Height + Channel;False;0;4;-1;R;G;B;A;Instance;135;9;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;146;-175.0368,2270.346;Inherit;False;COLOR;1;0;COLOR;0,0,0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.SamplerNode;54;-534.2678,2265.954;Inherit;True;Property;_TextureSample3;Texture + Sample 3;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.FunctionSwitch;143;-45.9734,2033.621;Inherit;False;Height + Channel;False;0;4;-1;R;G;B;A;Instance;135;9;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;142;-183.8751,2038.791;Inherit;False;COLOR;1;0;COLOR;0,0,0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.FunctionSwitch;141;-44.20639,1805.602;Inherit;False;Height + Channel;False;0;4;-1;R;G;B;A;Instance;135;9;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionSwitch;139;-50.45546,1508.225;Inherit;False;Height + Channel;False;0;4;-1;R;G;B;A;Instance;135;9;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionSwitch;151;-33.13635,2759.903;Inherit;False;Height + Channel;False;0;4;-1;R;G;B;A;Instance;135;9;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;150;-171.0381,2765.073;Inherit;False;COLOR;1;0;COLOR;0,0,0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.BreakToComponentsNode;140;-182.1081,1810.772;Inherit;False;COLOR;1;0;COLOR;0,0,0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.BreakToComponentsNode;138;-188.3572,1513.395;Inherit;False;COLOR;1;0;COLOR;0,0,0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.BreakToComponentsNode;136;-192.5089,1278.04;Inherit;False;COLOR;1;0;COLOR;0,0,0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.BreakToComponentsNode;134;-200.3653,1049.094;Inherit;False;COLOR;1;0;COLOR;0,0,0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.WireNode;88;-950.8482,2862.768;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;83;-942.6831,2954.455;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.CustomExpressionNode;46;-1267.346,2170.667;Inherit;False;{$ + float3 pos = float3( TexelSize.xy, 0 )@$ float3 neg = float3( -pos.xy, 0 )@$ + UV0 = UV + neg.xy@$ UV1 = UV + neg.zy@$ UV2 = UV + float2( pos.x, neg.y + )@$ UV3 = UV + neg.xz@$ UV4 = UV@$ UV5 = UV + pos.xz@$ UV6 = UV + + float2( neg.x, pos.y )@$ UV7 = UV + pos.zy@$ UV8 = UV + pos.xy@$ return@$};7;False;11;True;UV;FLOAT2;0,0;In;;Inherit;False;True;TexelSize;FLOAT4;0,0,0,0;In;;Inherit;False;True;UV0;FLOAT2;0,0;Out;;Inherit;False;True;UV1;FLOAT2;0,0;Out;;Inherit;False;True;UV2;FLOAT2;0,0;Out;;Inherit;False;True;UV3;FLOAT2;0,0;Out;;Inherit;False;True;UV4;FLOAT2;0,0;Out;;Inherit;False;True;UV5;FLOAT2;0,0;Out;;Inherit;False;True;UV6;FLOAT2;0,0;Out;;Inherit;False;True;UV7;FLOAT2;0,0;Out;;Inherit;False;True;UV8;FLOAT2;0,0;Out;;Inherit;False;Calculate + UVs Smooth;True;False;0;12;0;FLOAT;0;False;1;FLOAT2;0,0;False;2;FLOAT4;0,0,0,0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT2;0,0;False;6;FLOAT2;0,0;False;7;FLOAT2;0,0;False;8;FLOAT2;0,0;False;9;FLOAT2;0,0;False;10;FLOAT2;0,0;False;11;FLOAT2;0,0;False;10;FLOAT;0;FLOAT2;4;FLOAT2;5;FLOAT2;6;FLOAT2;7;FLOAT2;8;FLOAT2;9;FLOAT2;10;FLOAT2;11;FLOAT2;12\nNode;AmplifyShaderEditor.WireNode;71;-950.5735,2126.853;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.TextureCoordinatesNode;86;-1725.35,1955.66;Inherit;False;0;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.FunctionSwitch;137;-54.60703,1271.102;Inherit;False;Height + Channel;False;0;4;-1;R;G;B;A;Instance;135;9;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;152;-168.3932,3013.224;Inherit;False;COLOR;1;0;COLOR;0,0,0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.FunctionSwitch;153;-30.49147,3008.054;Inherit;False;Height + Channel;False;0;4;-1;R;G;B;A;Instance;135;9;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionSubtitle;109;980.571,1698.853;Inherit;False;Smooth + (Slower);1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.WireNode;163;284.3418,2049.237;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.TransformDirectionNode;68;1495.271,1695.723;Inherit;False;Tangent;World;False;Fast;1;0;FLOAT3;0,0,0;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3\nNode;AmplifyShaderEditor.FunctionSubtitle;107;986.7996,1572.163;Inherit;False;Sharp + (Faster);1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionInput;91;451.2825,1651.488;Inherit;False;Strength;1;3;False;1;0;FLOAT;1.5;False;1;FLOAT;0\nNode;AmplifyShaderEditor.CustomExpressionNode;128;687.2171,1466.29;Inherit;False;{$ + float3 va = float3( 0.13, 0, ( S1 - S0 ) * Strength )@$ float3 vb = float3( + 0, 0.13, ( S2 - S0 ) * Strength )@$ return normalize( cross( va, vb ) )@$};3;False;4;True;S0;FLOAT;0;In;;Inherit;False;True;S1;FLOAT;0;In;;Inherit;False;True;S2;FLOAT;0;In;;Inherit;False;True;Strength;FLOAT;0;In;;Inherit;False;Combine + Samples Sharp;True;False;0;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.CustomExpressionNode;58;683.8669,1781.724;Inherit;False;{$ + float3 normal@$ normal.x = Strength * ( S0 - S2 + 2 * S3 - 2 * S5 + S6 - S8 + )@$ normal.y = Strength * ( S0 + 2 * S1 + S2 - S6 - 2 * S7 - S8 )@$ normal.z + = 1.0@$ return normalize( normal )@$};3;False;10;True;Strength;FLOAT;0;In;;Inherit;False;True;S0;FLOAT;0;In;;Inherit;False;True;S1;FLOAT;0;In;;Inherit;False;True;S2;FLOAT;0;In;;Inherit;False;True;S3;FLOAT;0;In;;Inherit;False;True;S4;FLOAT;0;In;;Inherit;False;True;S5;FLOAT;0;In;;Inherit;False;True;S6;FLOAT;0;In;;Inherit;False;True;S7;FLOAT;0;In;;Inherit;False;True;S8;FLOAT;0;In;;Inherit;False;Combine + Samples Smooth;True;False;0;10;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;9;FLOAT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.WireNode;167;365.7449,2175.053;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;166;341.2415,2147.356;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;165;322.1609,2118.973;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;164;300.2653,2089.528;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;162;266.8397,2013.852;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;161;248.7872,1964.641;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;160;229.3277,1907.705;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionSwitch;159;-27.41323,3728.875;Inherit;False;Height + Channel;False;0;4;-1;R;G;B;A;Instance;135;9;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;158;-165.3149,3734.044;Inherit;False;COLOR;1;0;COLOR;0,0,0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.FunctionSwitch;157;-27.81758,3490.377;Inherit;False;Height + Channel;False;0;4;-1;R;G;B;A;Instance;135;9;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;156;-165.7193,3495.547;Inherit;False;COLOR;1;0;COLOR;0,0,0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.FunctionSwitch;155;-31.35663,3251.417;Inherit;False;Height + Channel;False;0;4;-1;R;G;B;A;Instance;135;9;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;154;-169.2584,3256.587;Inherit;False;COLOR;1;0;COLOR;0,0,0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.WireNode;43;-879.6338,1932.672;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.WireNode;168;262.7348,1474.22;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionSwitch;135;-62.46368,1043.924;Inherit;False;Height + Channel;False;0;4;-1;R;G;B;A;Object;-1;9;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;92;-928.7188,3207.844;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;64;-978.6859,2405.781;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;78;-920.438,2056.731;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.WireNode;72;-939.3794,3058.119;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;119;-1239.437,2845.394;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;59;-873.6181,2000.867;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.WireNode;62;-972.6644,2535.252;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SamplerNode;80;-548.3456,1807.032;Inherit;True;Property;_TextureSample1;Texture + Sample 1;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SamplerNode;97;-503.1219,3726.325;Inherit;True;Property;_TextureSample7;Texture + Sample 7;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SamplerNode;90;-540.4975,2031.932;Inherit;True;Property;_TextureSample2;Texture + Sample 2;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.CustomExpressionNode;110;-1103.439,1234.901;Inherit;False;{$ + UV.y -= TexelSize.y * 0.5@$ UV0 = UV@$ UV1 = UV + float2( TexelSize.x, + 0 )@$ UV2 = UV + float2( 0, TexelSize.y )@$};7;False;5;True;UV;FLOAT2;0,0;In;;Inherit;False;True;TexelSize;FLOAT4;0,0,0,0;In;;Inherit;False;True;UV0;FLOAT2;0,0;Out;;Inherit;False;True;UV1;FLOAT2;0,0;Out;;Inherit;False;True;UV2;FLOAT2;0,0;Out;;Inherit;False;Calculate + UVs Sharp;True;False;0;6;0;FLOAT;0;False;1;FLOAT2;0,0;False;2;FLOAT4;0,0,0,0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT2;0,0;False;4;FLOAT;0;FLOAT2;4;FLOAT2;5;FLOAT2;6\nNode;AmplifyShaderEditor.WireNode;117;-865.0287,1683.958;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.WireNode;120;-2141.424,2414.817;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.SamplerNode;113;-558.706,1273.719;Inherit;True;Property;_TextureSample10;Texture + Sample 10;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.TexelSizeNode;89;-1718.808,2243.135;Inherit;False;-1;1;0;SAMPLER2D;;False;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.WireNode;45;-875.6236,1969.773;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.WireNode;121;-856.3488,1450.987;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;73;-944.3997,3034.064;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.RelayNode;118;-1535.702,1475.698;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;63;-960.6208,2234.158;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;115;-879.8671,1597.852;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.SamplerNode;79;-531.1535,2508.48;Inherit;True;Property;_TextureSample4;Texture + Sample 4;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.WireNode;96;-966.6425,2188.994;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;111;-1245.284,2052.146;Inherit;False;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.SamplerNode;112;-551.6846,1042.588;Inherit;True;Property;_TextureSample9;Texture + Sample 9;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SamplerNode;48;-512.4654,3249.776;Inherit;True;Property;_TextureSample0;Texture + Sample 0;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.FunctionSwitch;108;1233.465,1567.899;Inherit;False;Filtering;False;0;2;-1;Sharp;Smooth;Object;-1;9;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.WireNode;65;-879.3245,1845.746;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.WireNode;67;-969.6533,2279.322;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SamplerNode;82;-524.924,2757.656;Inherit;True;Property;_TextureSample5;Texture + Sample 5;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.WireNode;133;-863.5597,1493.908;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;66;-932.4942,2095.913;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.SamplerNode;114;-565.3553,1507.426;Inherit;True;Property;_TextureSample11;Texture + Sample 11;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.FunctionInput;87;-2095.677,1799.138;Inherit;False;Texture;9;0;False;1;0;SAMPLER2D;0;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.WireNode;76;-948.5767,2913.511;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;57;-907.7392,2017.885;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.WireNode;69;-878.6321,1893.557;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.WireNode;81;-939.6157,3105.523;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.SamplerNode;70;-528.0388,3006.831;Inherit;True;Property;_TextureSample6;Texture + Sample 6;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.WireNode;44;-975.6751,2360.617;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;47;-972.6643,2327.497;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SamplerNode;84;-503.1212,3489.608;Inherit;True;Property;_TextureSample8;Texture + Sample 8;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.WireNode;93;-972.6644,2493.099;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;123;-870.4584,1531.294;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;75;-972.6643,2444.924;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionInput;74;-1443.075,2964.874;Inherit;False;SS;13;2;False;1;0;SAMPLERSTATE;0;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;116;-875.6149,1642.134;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.WireNode;95;-943.1602,3001.948;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.FunctionInput;85;-1457.552,1951.121;Inherit;False;UV;2;1;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;169;281.6801,1420.541;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;127;-2142.816,1680.113;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.FunctionOutput;0;1748.021,1700.925;Inherit;False;True;-1;World + Normal;1;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionOutput;40;1492.221,1570.54;Inherit;False;False;-1;Tangent + Normal;0;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nWireConnection;94;0;74;0\nWireConnection;149;0;148;0\nWireConnection;149;1;148;1\nWireConnection;149;2;148;2\nWireConnection;149;3;148;3\nWireConnection;148;0;79;0\nWireConnection;147;0;146;0\nWireConnection;147;1;146;1\nWireConnection;147;2;146;2\nWireConnection;147;3;146;3\nWireConnection;146;0;54;0\nWireConnection;54;0;43;0\nWireConnection;54;1;67;0\nWireConnection;54;7;83;0\nWireConnection;143;0;142;0\nWireConnection;143;1;142;1\nWireConnection;143;2;142;2\nWireConnection;143;3;142;3\nWireConnection;142;0;90;0\nWireConnection;141;0;140;0\nWireConnection;141;1;140;1\nWireConnection;141;2;140;2\nWireConnection;141;3;140;3\nWireConnection;139;0;138;0\nWireConnection;139;1;138;1\nWireConnection;139;2;138;2\nWireConnection;139;3;138;3\nWireConnection;151;0;150;0\nWireConnection;151;1;150;1\nWireConnection;151;2;150;2\nWireConnection;151;3;150;3\nWireConnection;150;0;82;0\nWireConnection;140;0;80;0\nWireConnection;138;0;114;0\nWireConnection;136;0;113;0\nWireConnection;134;0;112;0\nWireConnection;88;0;74;0\nWireConnection;83;0;74;0\nWireConnection;46;1;85;0\nWireConnection;46;2;89;0\nWireConnection;71;0;87;0\nWireConnection;86;2;87;0\nWireConnection;137;0;136;0\nWireConnection;137;1;136;1\nWireConnection;137;2;136;2\nWireConnection;137;3;136;3\nWireConnection;152;0;70;0\nWireConnection;153;0;152;0\nWireConnection;153;1;152;1\nWireConnection;153;2;152;2\nWireConnection;153;3;152;3\nWireConnection;109;0;58;0\nWireConnection;163;0;151;0\nWireConnection;68;0;108;0\nWireConnection;107;0;128;0\nWireConnection;128;0;169;0\nWireConnection;128;1;168;0\nWireConnection;128;2;139;0\nWireConnection;128;3;91;0\nWireConnection;58;0;91;0\nWireConnection;58;1;141;0\nWireConnection;58;2;160;0\nWireConnection;58;3;161;0\nWireConnection;58;4;162;0\nWireConnection;58;5;163;0\nWireConnection;58;6;164;0\nWireConnection;58;7;165;0\nWireConnection;58;8;166;0\nWireConnection;58;9;167;0\nWireConnection;167;0;159;0\nWireConnection;166;0;157;0\nWireConnection;165;0;155;0\nWireConnection;164;0;153;0\nWireConnection;162;0;149;0\nWireConnection;161;0;147;0\nWireConnection;160;0;143;0\nWireConnection;159;0;158;0\nWireConnection;159;1;158;1\nWireConnection;159;2;158;2\nWireConnection;159;3;158;3\nWireConnection;158;0;97;0\nWireConnection;157;0;156;0\nWireConnection;157;1;156;1\nWireConnection;157;2;156;2\nWireConnection;157;3;156;3\nWireConnection;156;0;84;0\nWireConnection;155;0;154;0\nWireConnection;155;1;154;1\nWireConnection;155;2;154;2\nWireConnection;155;3;154;3\nWireConnection;154;0;48;0\nWireConnection;43;0;87;0\nWireConnection;168;0;137;0\nWireConnection;135;0;134;0\nWireConnection;135;1;134;1\nWireConnection;135;2;134;2\nWireConnection;135;3;134;3\nWireConnection;92;0;74;0\nWireConnection;64;0;46;9\nWireConnection;78;0;87;0\nWireConnection;72;0;74;0\nWireConnection;119;0;74;0\nWireConnection;59;0;87;0\nWireConnection;62;0;46;12\nWireConnection;80;0;65;0\nWireConnection;80;1;96;0\nWireConnection;80;7;88;0\nWireConnection;97;0;71;0\nWireConnection;97;1;62;0\nWireConnection;97;7;92;0\nWireConnection;90;0;69;0\nWireConnection;90;1;63;0\nWireConnection;90;7;76;0\nWireConnection;110;1;85;0\nWireConnection;110;2;111;0\nWireConnection;117;0;87;0\nWireConnection;120;0;119;0\nWireConnection;113;0;116;0\nWireConnection;113;1;110;5\nWireConnection;113;7;133;0\nWireConnection;89;0;87;0\nWireConnection;45;0;87;0\nWireConnection;121;0;118;0\nWireConnection;73;0;74;0\nWireConnection;118;0;127;0\nWireConnection;63;0;46;5\nWireConnection;115;0;87;0\nWireConnection;79;0;45;0\nWireConnection;79;1;47;0\nWireConnection;79;7;95;0\nWireConnection;96;0;46;4\nWireConnection;111;0;89;0\nWireConnection;112;0;115;0\nWireConnection;112;1;110;4\nWireConnection;112;7;121;0\nWireConnection;48;0;78;0\nWireConnection;48;1;75;0\nWireConnection;48;7;81;0\nWireConnection;108;0;107;0\nWireConnection;108;1;109;0\nWireConnection;65;0;87;0\nWireConnection;67;0;46;6\nWireConnection;82;0;59;0\nWireConnection;82;1;44;0\nWireConnection;82;7;73;0\nWireConnection;133;0;118;0\nWireConnection;66;0;87;0\nWireConnection;114;0;117;0\nWireConnection;114;1;110;6\nWireConnection;114;7;123;0\nWireConnection;76;0;74;0\nWireConnection;57;0;87;0\nWireConnection;69;0;87;0\nWireConnection;81;0;74;0\nWireConnection;70;0;57;0\nWireConnection;70;1;64;0\nWireConnection;70;7;72;0\nWireConnection;44;0;46;8\nWireConnection;47;0;46;7\nWireConnection;84;0;66;0\nWireConnection;84;1;93;0\nWireConnection;84;7;94;0\nWireConnection;93;0;46;11\nWireConnection;123;0;118;0\nWireConnection;75;0;46;10\nWireConnection;116;0;87;0\nWireConnection;95;0;74;0\nWireConnection;85;0;86;0\nWireConnection;169;0;135;0\nWireConnection;127;0;120;0\nWireConnection;0;0;68;0\nWireConnection;40;0;108;0\nASEEND*/\n//CHKSM=31A91DFE3C09739865ECF32FB1E5EB483581411D" + m_functionName: + m_description: Derive a normal vector from a texture. + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 3 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Normal From Texture.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Normal From Texture.asset.meta new file mode 100644 index 0000000..38d9749 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Normal From Texture.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9728ee98a55193249b513caf9a0f1676 +timeCreated: 1575458539 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/NormalCreate.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/NormalCreate.asset new file mode 100644 index 0000000..65a41ca --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/NormalCreate.asset @@ -0,0 +1,29 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: NormalCreate + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=14504\n355;526;1066;579;2449.117;567.652;1.195803;True;False\nNode;AmplifyShaderEditor.SimpleAddOpNode;10;-653.5344,187.1665;Float;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.PowerNode;24;-1044.8,149.3853;Float;False;2;0;FLOAT;0;False;1;FLOAT;3;False;1;FLOAT;0\nNode;AmplifyShaderEditor.ScaleNode;25;-863.0129,158.0113;Float;False;0.1;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SamplerNode;12;-300.427,-32.63319;Float;True;Property;_TextureSample1;Texture + Sample 1;0;0;Create;True;0;0;False;0;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;6;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SamplerNode;11;-297.0564,-267.8521;Float;True;Property;_TextureSample0;Texture + Sample 0;0;0;Create;True;0;0;False;0;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;6;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SamplerNode;14;-289.2554,-557.6742;Float;True;Property;_TextureSample2;Texture + Sample 2;0;0;Create;True;0;0;False;0;None;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;6;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.DynamicAppendNode;9;-510.4005,165.5482;Float;False;FLOAT2;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionInput;1;-1609.853,-367.2421;Float;False;Tex;9;0;False;1;0;SAMPLER2D;0;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.TexturePropertyNode;26;-1891.178,-373.9199;Float;True;Property;_Normal;Height;0;0;Create;True;0;0;False;0;None;None;False;white;Auto;0;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;18;248.1256,-271.7343;Float;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;3;-1194.829,150.4831;Float;False;Offset;1;2;False;1;0;FLOAT;0.5;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;4;33.9635,-213.628;Float;False;Strength;1;3;False;1;0;FLOAT;2;False;1;FLOAT;0\nNode;AmplifyShaderEditor.CrossProductOpNode;21;591.7831,-218.9246;Float;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.DynamicAppendNode;13;430.6205,-320.9595;Float;False;FLOAT3;4;0;FLOAT;1;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.TextureCoordinatesNode;23;-1414.536,38.33293;Float;False;0;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;19;232.3673,-128.4985;Float;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;17;50.32483,-85.61093;Float;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;7;-642.9897,42.01196;Float;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DynamicAppendNode;16;457.5351,-92.18595;Float;False;FLOAT3;4;0;FLOAT;0;False;1;FLOAT;1;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionInput;2;-1101.952,36.79971;Float;False;UV;2;1;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;6;-958.3405,44.83144;Float;False;FLOAT2;1;0;FLOAT2;0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;15;56.50588,-318.4448;Float;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.NormalizeNode;22;751.4589,-201.3778;Float;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.DynamicAppendNode;8;-490.1855,39.45096;Float;False;FLOAT2;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionOutput;0;959.5413,-203.6477;Float;False;True;Output;0;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nWireConnection;10;0;6;1\nWireConnection;10;1;25;0\nWireConnection;24;0;3;0\nWireConnection;25;0;24;0\nWireConnection;12;0;1;0\nWireConnection;12;1;9;0\nWireConnection;11;0;1;0\nWireConnection;11;1;8;0\nWireConnection;14;0;1;0\nWireConnection;14;1;2;0\nWireConnection;9;0;6;0\nWireConnection;9;1;10;0\nWireConnection;1;0;26;0\nWireConnection;18;0;15;0\nWireConnection;18;1;4;0\nWireConnection;21;0;13;0\nWireConnection;21;1;16;0\nWireConnection;13;2;18;0\nWireConnection;23;2;1;0\nWireConnection;19;0;17;0\nWireConnection;19;1;4;0\nWireConnection;17;0;12;2\nWireConnection;17;1;14;2\nWireConnection;7;0;6;0\nWireConnection;7;1;25;0\nWireConnection;16;2;19;0\nWireConnection;2;0;23;0\nWireConnection;6;0;2;0\nWireConnection;15;0;11;2\nWireConnection;15;1;14;2\nWireConnection;22;0;21;0\nWireConnection;8;0;7;0\nWireConnection;8;1;6;1\nWireConnection;0;0;22;0\nASEEND*/\n//CHKSM=E15D8591709274A59C7536FD5BB9577CCD09C4B4" + m_functionName: + m_description: + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_nodeCategory: 3 + m_customNodeCategory: + m_previewPosition: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/NormalCreate.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/NormalCreate.asset.meta new file mode 100644 index 0000000..a0802e3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/NormalCreate.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e12f7ae19d416b942820e3932b56220f +timeCreated: 1520619538 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Or.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Or.asset new file mode 100644 index 0000000..6572f7c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Or.asset @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Or + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=18101\n468;180;1104;762;810;372;1;True;False\nNode;AmplifyShaderEditor.CustomExpressionNode;1;-160,0;Inherit;False;float + result = A || B@$return result@;1;False;2;True;A;FLOAT;0;In;;Inherit;False;True;B;FLOAT;0;In;;Inherit;False;ASEOr;False;False;0;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;2;-320,0;Inherit;False;A;1;0;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;3;-320,80;Inherit;False;B;1;1;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;0;0,0;Inherit;False;True;-1;;0;False;1;0;FLOAT;0;False;1;FLOAT;0\nWireConnection;1;0;2;0\nWireConnection;1;1;3;0\nWireConnection;0;0;1;0\nASEEND*/\n//CHKSM=F2AFC1FFB9B7CC9340AFFCC196218CE05C5EF2C1" + m_functionName: + m_description: Returns true if either of the inputs A and B are true + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 6 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Or.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Or.asset.meta new file mode 100644 index 0000000..11812d1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Or.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dcfde22f80031984b87bcc46a052ad1f +timeCreated: 1589816062 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/PerturbNormal.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/PerturbNormal.asset new file mode 100644 index 0000000..a436506 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/PerturbNormal.asset @@ -0,0 +1,29 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: PerturbNormal + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=15103\n344;92;1056;673;575.1386;503.1177;1.033186;True;False\nNode;AmplifyShaderEditor.BreakToComponentsNode;27;760.8596,55.21472;Float;False;FLOAT3;1;0;FLOAT3;0,0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;24;567.4818,-78.97424;Float;False;2;2;0;FLOAT3x3;0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionNode;31;80,-272;Float;False;CotangentFrame;-1;;7;62ce0f00f1417804bb4f2b38501ba0d0;0;3;4;FLOAT3;0,0,0;False;2;FLOAT3;0,0,0;False;1;FLOAT2;0,0;False;1;FLOAT3x3;5\nNode;AmplifyShaderEditor.FunctionInput;6;-160,48;Float;False;Normal;3;0;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.WorldNormalVector;13;-176,-400;Float;False;True;1;0;FLOAT3;0,0,0;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3\nNode;AmplifyShaderEditor.NormalizeNode;8;64,112;Float;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.ViewDirInputsCoordNode;12;-160,-256;Float;False;World;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3\nNode;AmplifyShaderEditor.TexCoordVertexDataNode;11;-176,-96;Float;False;0;2;0;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.FunctionSwitch;26;256,48;Float;False;Normalize;True;0;2;-1;In + 0;In 1;Object;-1;9;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionOutput;29;1040,80;Float;False;False;Y;2;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;28;1040,0;Float;False;False;X;1;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;9;1040,-80;Float;False;True;XYZ;0;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionOutput;30;1040,160;Float;False;False;Z;3;False;1;0;FLOAT;0;False;1;FLOAT;0\nWireConnection;27;0;24;0\nWireConnection;24;0;31;5\nWireConnection;24;1;26;0\nWireConnection;31;4;13;0\nWireConnection;31;2;12;0\nWireConnection;31;1;11;0\nWireConnection;8;0;6;0\nWireConnection;26;0;6;0\nWireConnection;26;1;8;0\nWireConnection;29;0;27;1\nWireConnection;28;0;27;0\nWireConnection;9;0;24;0\nWireConnection;30;0;27;2\nASEEND*/\n//CHKSM=82B74CD48F60956E292CC6A0881ADA96C894E5CD" + m_functionName: + m_description: 'Perturbing normals without Precomputed Tangents + + http://www.thetenthplanet.de/archives/1180' + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_nodeCategory: 3 + m_customNodeCategory: + m_previewPosition: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/PerturbNormal.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/PerturbNormal.asset.meta new file mode 100644 index 0000000..16594f7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/PerturbNormal.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c8b64dd82fb09f542943a895dffb6c06 +timeCreated: 1522256219 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/PerturbNormalHQ.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/PerturbNormalHQ.asset new file mode 100644 index 0000000..15f7c85 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/PerturbNormalHQ.asset @@ -0,0 +1,44 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: PerturbNormalHQ + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=15901\n262;107;1149;682;1154.028;517.2542;2.484015;False;False\nNode;AmplifyShaderEditor.FunctionInput;3;-416,16;Float;False;Bump + One Pixel Down;1;2;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DdxOpNode;9;-122.6414,307.0036;Float;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionInput;2;-416,-96;Float;False;Bump + Center;1;1;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;11;259.3586,-190.9964;Float;False;2;2;0;FLOAT;0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;6;-112,-192;Float;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;1;-406.5,-209.5;Float;False;Bump + One Pixel Right;1;0;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.AbsOpNode;25;650.9295,79.78731;Float;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DotProductOpNode;21;451.7501,209.2307;Float;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.CrossProductOpNode;15;240,528;Float;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;16;323.3586,-7.996399;Float;False;2;2;0;FLOAT;0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.WorldNormalVector;5;-569.6414,488.0036;Float;False;False;1;0;FLOAT3;0,0,1;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3\nNode;AmplifyShaderEditor.CrossProductOpNode;14;90.53894,177.7209;Float;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;12;527.3586,-157.9964;Float;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.WorldPosInputsNode;8;-394.6414,238.0036;Float;False;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3\nNode;AmplifyShaderEditor.FunctionInput;4;-309.4063,534.0479;Float;False;World + Space Normal;3;3;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.ConditionalIfNode;17;843.8935,337.3362;Float;False;False;5;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;18;632.8947,365.3362;Float;False;Constant;_Float0;Float + 0;0;0;Create;True;0;0;False;0;0;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;20;644.8946,607.3355;Float;False;Constant;_Float2;Float + 2;0;0;Create;True;0;0;False;0;-1;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;19;627.8946,497.3361;Float;False;Constant;_Float1;Float + 1;0;0;Create;True;0;0;False;0;1;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;22;1232,176;Float;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.DdyOpNode;10;-113.6414,183.0036;Float;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;7;-112,-16;Float;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;13;1077.014,199.0213;Float;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.NormalizeNode;23;1424,176;Float;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;24;1054.02,41.71672;Float;False;2;2;0;FLOAT;0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionOutput;0;1600,176;Float;False;True;World + Space Normal;0;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nWireConnection;9;0;8;0\nWireConnection;11;0;6;0\nWireConnection;11;1;14;0\nWireConnection;6;0;1;0\nWireConnection;6;1;2;0\nWireConnection;25;0;21;0\nWireConnection;21;0;14;0\nWireConnection;21;1;9;0\nWireConnection;15;0;4;0\nWireConnection;15;1;9;0\nWireConnection;16;0;7;0\nWireConnection;16;1;15;0\nWireConnection;14;0;10;0\nWireConnection;14;1;4;0\nWireConnection;12;0;11;0\nWireConnection;12;1;16;0\nWireConnection;4;0;5;0\nWireConnection;17;0;21;0\nWireConnection;17;1;18;0\nWireConnection;17;2;19;0\nWireConnection;17;3;18;0\nWireConnection;17;4;20;0\nWireConnection;22;0;24;0\nWireConnection;22;1;13;0\nWireConnection;10;0;8;0\nWireConnection;7;0;3;0\nWireConnection;7;1;2;0\nWireConnection;13;0;12;0\nWireConnection;13;1;17;0\nWireConnection;23;0;22;0\nWireConnection;24;0;25;0\nWireConnection;24;1;4;0\nWireConnection;0;0;23;0\nASEEND*/\n//CHKSM=EDC100B8D8E2AD6CDE38D95EB0F332AE4D644559" + m_functionName: + m_description: Based on Perturb Normal HQ UE4 Material Expression + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 3 + m_customNodeCategory: + m_previewPosition: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/PerturbNormalHQ.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/PerturbNormalHQ.asset.meta new file mode 100644 index 0000000..4884244 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/PerturbNormalHQ.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 45dff16e78a0685469fed8b5b46e4d96 +timeCreated: 1542724676 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Polar Coordinates.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Polar Coordinates.asset new file mode 100644 index 0000000..4e53b3f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Polar Coordinates.asset @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Polar Coordinates + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=17902\n-1476;-250;1004;726;2152.682;1112.438;2.835857;True;False\nNode;AmplifyShaderEditor.ATan2OpNode;14;-528,-128;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;17;-832,-128;Inherit;False;FLOAT2;1;0;FLOAT2;0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.FunctionInput;2;-1104,-432;Inherit;False;Center;2;1;False;1;0;FLOAT2;0.5,0.5;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;18;-304,-128;Inherit;True;3;3;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;16;-1056,-128;Inherit;False;15;CenteredUV;1;0;OBJECT;;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.TauNode;22;-688,64;Inherit;False;0;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;4;-528,96;Inherit;False;Length + Scale;1;3;False;1;0;FLOAT;1;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleDivideOpNode;20;-528,-16;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;21;-736,-16;Inherit;False;Constant;_Float3;Float + 3;0;0;Create;True;0;0;False;0;1;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;1;-1104,-512;Inherit;False;UV;2;0;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.RangedFloatNode;13;-528,-288;Inherit;False;Constant;_Float2;Float + 2;0;0;Create;True;0;0;False;0;2;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;3;-544,-384;Inherit;False;Radial + Scale;1;2;False;1;0;FLOAT;1;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DynamicAppendNode;23;0,-256;Inherit;True;FLOAT2;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;10;-304,-384;Inherit;True;3;3;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;9;-928,-512;Inherit;False;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.TexCoordVertexDataNode;5;-1328,-512;Inherit;False;0;2;0;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.LengthOpNode;11;-544,-512;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;15;-768,-512;Inherit;False;CenteredUV;-1;True;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionOutput;0;256,-256;Inherit;False;True;-1;Out;0;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nWireConnection;14;0;17;0\nWireConnection;14;1;17;1\nWireConnection;17;0;16;0\nWireConnection;18;0;14;0\nWireConnection;18;1;20;0\nWireConnection;18;2;4;0\nWireConnection;20;0;21;0\nWireConnection;20;1;22;0\nWireConnection;1;0;5;0\nWireConnection;23;0;10;0\nWireConnection;23;1;18;0\nWireConnection;10;0;11;0\nWireConnection;10;1;3;0\nWireConnection;10;2;13;0\nWireConnection;9;0;1;0\nWireConnection;9;1;2;0\nWireConnection;11;0;15;0\nWireConnection;15;0;9;0\nWireConnection;0;0;23;0\nASEEND*/\n//CHKSM=7C36C8C8F3864BFA86D86EABF6E84D60184CCBC6" + m_functionName: + m_description: Transforms the given UVs into polar coordinates and returns both + distance to center (X) and angle(Y) + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 14 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Polar Coordinates.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Polar Coordinates.asset.meta new file mode 100644 index 0000000..f75fc94 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Polar Coordinates.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7dab8e02884cf104ebefaa2e788e4162 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Polygon.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Polygon.asset new file mode 100644 index 0000000..59fcbf0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Polygon.asset @@ -0,0 +1,45 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Polygon + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity + Asset Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=17500\n776;81;858;790;607.6838;-337.546;1.3;True;False\nNode;AmplifyShaderEditor.RegisterLocalVarNode;12;-192,-496;Inherit;False;cosSides;-1;True;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;2;-896.0001,-468.8;Inherit;False;Sides;1;1;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DynamicAppendNode;25;576,-112;Inherit;False;FLOAT2;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.PiNode;9;-600.1328,-531.7235;Inherit;False;1;0;FLOAT;1;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;43;112.5215,865.7967;Inherit;False;30;polarCoords;1;0;OBJECT;;False;1;FLOAT;0\nNode;AmplifyShaderEditor.ATan2OpNode;27;606.6644,49.34894;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;29;732.6644,-113.6511;Inherit;False;finalUVs;-1;True;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleDivideOpNode;37;-240.4785,767.7967;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;20;-368,-224;Inherit;False;Constant;_Float3;Float + 3;0;0;Create;True;0;0;False;0;2;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;42;314.5215,754.7967;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;30;735.6644,34.34894;Inherit;False;polarCoords;-1;True;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;38;-117.4785,719.7967;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;21;-368,-144;Inherit;False;Constant;_Float4;Float + 4;0;0;Create;True;0;0;False;0;-1;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.ScaleAndOffsetNode;19;-208,-240;Inherit;False;3;0;FLOAT2;0,0;False;1;FLOAT;1;False;2;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.TexCoordVertexDataNode;5;-560,-304;Inherit;False;0;2;0;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.RangedFloatNode;8;-621.4227,144.4016;Inherit;False;Constant;_Float2;Float + 2;0;0;Create;True;0;0;False;0;0.5;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;28;425.6644,54.34894;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;14;-552.0002,37.50001;Inherit;False;12;cosSides;1;0;OBJECT;;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;7;-648.0002,-42.49999;Inherit;False;Constant;_Float1;Float + 1;0;0;Create;True;0;0;False;0;0.5;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;15;-369.5999,170.3;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.CosOpNode;53;466.3291,788.9124;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;55;-474.633,867.5168;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;6;-1020.8,-468.8;Inherit;False;Constant;_Float0;Float + 0;0;0;Create;True;0;0;False;0;6;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleDivideOpNode;52;-641.1151,595.2535;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;16;-529.6003,234.3001;Inherit;False;12;cosSides;1;0;OBJECT;;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;35;-431.4811,738.2798;Inherit;False;30;polarCoords;1;0;OBJECT;;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;3;-504.0001,-42.49999;Inherit;False;Width;1;2;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DynamicAppendNode;18;-192.8964,46.80437;Inherit;False;FLOAT2;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.CosOpNode;11;-304,-496;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleDivideOpNode;10;-427.0461,-493.8062;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleDivideOpNode;22;48,-112;Inherit;False;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.NegateNode;26;442,-37;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;13;-376,-10.5;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;4;-487.6001,145.3;Inherit;False;Height;1;3;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FloorOpNode;40;9.521484,720.7967;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;1;-368,-304;Inherit;False;UV;2;0;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;44;610.5215,816.7967;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FWidthOpNode;50;784,880;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleDivideOpNode;49;944,816;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SaturateNode;51;1072,816;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;45;224,960;Inherit;False;29;finalUVs;1;0;OBJECT;;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.LengthOpNode;46;400,960;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;39;-320,656;Inherit;False;Constant;_Float5;Float + 5;0;0;Create;True;0;0;False;0;0.5;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.TauNode;31;-749.1282,559.6296;Inherit;False;0;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;33;-837.237,553.755;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;54;-468.628,792.4522;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;23;161.6644,-112.6511;Inherit;False;FLOAT2;1;0;FLOAT2;0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.OneMinusNode;48;784,800;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;41;144.5215,747.7967;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;0;1216,816;Inherit;False;True;-1;Out;0;False;1;0;FLOAT;0;False;1;FLOAT;0\nWireConnection;12;0;11;0\nWireConnection;2;0;6;0\nWireConnection;25;0;23;0\nWireConnection;25;1;26;0\nWireConnection;27;0;28;0\nWireConnection;27;1;26;0\nWireConnection;29;0;25;0\nWireConnection;37;0;35;0\nWireConnection;37;1;54;0\nWireConnection;42;0;41;0\nWireConnection;42;1;43;0\nWireConnection;30;0;27;0\nWireConnection;38;0;39;0\nWireConnection;38;1;37;0\nWireConnection;19;0;1;0\nWireConnection;19;1;20;0\nWireConnection;19;2;21;0\nWireConnection;28;0;23;0\nWireConnection;15;0;4;0\nWireConnection;15;1;16;0\nWireConnection;53;0;42;0\nWireConnection;55;0;52;0\nWireConnection;52;0;31;0\nWireConnection;52;1;33;0\nWireConnection;3;0;7;0\nWireConnection;18;0;13;0\nWireConnection;18;1;15;0\nWireConnection;11;0;10;0\nWireConnection;10;0;9;0\nWireConnection;10;1;2;0\nWireConnection;22;0;19;0\nWireConnection;22;1;18;0\nWireConnection;26;0;23;1\nWireConnection;13;0;3;0\nWireConnection;13;1;14;0\nWireConnection;4;0;8;0\nWireConnection;40;0;38;0\nWireConnection;1;0;5;0\nWireConnection;44;0;53;0\nWireConnection;44;1;46;0\nWireConnection;50;0;44;0\nWireConnection;49;0;48;0\nWireConnection;49;1;50;0\nWireConnection;51;0;49;0\nWireConnection;46;0;45;0\nWireConnection;33;0;2;0\nWireConnection;54;0;52;0\nWireConnection;23;0;22;0\nWireConnection;48;0;44;0\nWireConnection;41;0;40;0\nWireConnection;41;1;55;0\nWireConnection;0;0;51;0\nASEEND*/\n//CHKSM=4217BFEBCCECAD2073A228BB92D684CF54BC2E87" + m_functionName: + m_description: Creates a polygon shape with a specified amount of sides + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 9 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Polygon.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Polygon.asset.meta new file mode 100644 index 0000000..0621162 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Polygon.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6906ef7087298c94c853d6753e182169 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/PreparePerturbNormalHQ.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/PreparePerturbNormalHQ.asset new file mode 100644 index 0000000..f7e8a70 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/PreparePerturbNormalHQ.asset @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: PreparePerturbNormalHQ + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=15901\n262;107;1149;682;1369.136;129.7274;1;True;False\nNode;AmplifyShaderEditor.SimpleAddOpNode;3;-153,-151;Float;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.WireNode;5;-365,-117;Float;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.DotProductOpNode;10;-109,392;Float;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DdxOpNode;2;-344,-36;Float;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.DotProductOpNode;11;-153,564;Float;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;8;-141,142;Float;False;2;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SqrtOpNode;13;248,484;Float;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DdyOpNode;7;-368,180;Float;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.ConditionalIfNode;12;54,479;Float;False;False;5;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;1;-653,45;Float;False;Value;3;0;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionOutput;9;401,452;Float;False;False;Filter + Width;3;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;6;128,158;Float;False;False;Value + One Pixel Down;2;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionOutput;4;116,61;Float;False;False;Value;1;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionOutput;0;46,-150;Float;False;True;Value + One Pixel Right;0;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nWireConnection;3;0;5;0\nWireConnection;3;1;2;0\nWireConnection;5;0;1;0\nWireConnection;10;0;2;0\nWireConnection;10;1;2;0\nWireConnection;2;0;1;0\nWireConnection;11;0;7;0\nWireConnection;11;1;7;0\nWireConnection;8;0;1;0\nWireConnection;8;1;7;0\nWireConnection;13;0;12;0\nWireConnection;7;0;1;0\nWireConnection;12;0;10;0\nWireConnection;12;1;11;0\nWireConnection;12;2;10;0\nWireConnection;12;4;11;0\nWireConnection;9;0;13;0\nWireConnection;6;0;8;0\nWireConnection;4;0;1;0\nWireConnection;0;0;3;0\nASEEND*/\n//CHKSM=F843D9238DE3D976B8A55531C9D75AAF0B29A25D" + m_functionName: + m_description: Based on Prepare Perturb Normal HQ UE4 Material Expression + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 3 + m_customNodeCategory: + m_previewPosition: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/PreparePerturbNormalHQ.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/PreparePerturbNormalHQ.asset.meta new file mode 100644 index 0000000..6f9cd75 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/PreparePerturbNormalHQ.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ce0790c3228f3654b818a19dd51453a4 +timeCreated: 1542716511 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Procedural Sample.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Procedural Sample.asset new file mode 100644 index 0000000..9453b81 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Procedural Sample.asset @@ -0,0 +1,200 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Procedural Sample + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=18701\n339;100;906;513;-1593.459;91.35236;1;True;False\nNode;AmplifyShaderEditor.CommentaryNode;142;-1295.165,-358.8215;Inherit;False;2404.07;914.0666;;23;293;24;27;28;144;4;10;2;6;7;135;137;136;134;139;140;141;138;23;25;22;26;12;2D;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;160;-1287.924,722.2014;Inherit;False;2400.167;913.1149;;30;185;190;189;171;176;181;179;187;188;186;165;161;164;163;162;182;172;191;173;175;180;178;177;174;170;169;168;167;166;294;2D + Array;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;198;-1266.038,4663.606;Inherit;False;2381.579;2608.276;;94;289;254;253;291;290;292;285;271;277;257;256;288;287;286;250;281;264;263;266;278;283;284;282;274;273;272;279;260;259;237;249;235;218;251;248;246;258;214;247;242;280;275;276;270;269;267;265;262;261;255;252;245;244;243;241;240;239;238;236;234;233;232;231;230;229;228;227;226;225;224;223;222;221;220;219;217;216;215;213;212;211;210;209;208;207;206;205;204;203;202;201;200;199;296;Triplanar + 2D Array;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;297;1268.411,-354.576;Inherit;False;1484.525;902.526;;15;302;303;304;305;301;300;299;298;34;0;35;33;32;157;31;Outputs;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;146;-1281.138,1820.621;Inherit;False;2395.235;2604.375;;83;57;130;48;84;67;58;133;132;131;93;56;91;129;43;46;89;47;55;44;194;87;96;110;109;101;105;103;116;100;115;90;119;118;92;120;126;127;128;86;63;42;125;123;88;62;112;60;65;95;54;45;108;70;121;69;79;106;94;97;99;122;192;111;113;53;83;107;98;193;59;149;148;147;114;152;150;102;155;156;117;85;41;295;Triplanar + 2D;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;143;-2805.996,-359.0244;Inherit;False;1399.204;991.5428;;28;104;309;76;36;68;145;82;184;5;73;159;315;77;75;308;80;306;74;71;50;72;81;78;183;64;307;158;61;Inputs;1,1,1,1;0;0\nNode;AmplifyShaderEditor.SamplerNode;170;-365.7677,1082.383;Inherit;True;Property;_TextureSample13;Texture + Sample 1;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Derivative;Texture2DArray;8;0;SAMPLER2DARRAY;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.WireNode;85;-18.17893,3443.745;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;161;-992.5226,1018.242;Inherit;False;76;Input_SS;1;0;OBJECT;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;45;-64.76524,2521.532;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.CustomExpressionNode;83;-970.9571,3339.666;Inherit;False;float2 + vertex1, vertex2, vertex3@$$// Scaling of the input$float2 uv = UV * 3.464@ // + 2 * sqrt (3)$$// Skew input space into simplex triangle grid$const float2x2 gridToSkewedGrid + = float2x2( 1.0, 0.0, -0.57735027, 1.15470054 )@$float2 skewedCoord = mul( gridToSkewedGrid, + uv )@$$// Compute local triangle vertex IDs and local barycentric coordinates$int2 + baseId = int2( floor( skewedCoord ) )@$float3 temp = float3( frac( skewedCoord + ), 0 )@$temp.z = 1.0 - temp.x - temp.y@$if ( temp.z > 0.0 )${$\tW1 = temp.z@$\tW2 + = temp.y@$\tW3 = temp.x@$\tvertex1 = baseId@$\tvertex2 = baseId + int2( 0, 1 )@$\tvertex3 + = baseId + int2( 1, 0 )@$}$else${$\tW1 = -temp.z@$\tW2 = 1.0 - temp.y@$\tW3 = + 1.0 - temp.x@$\tvertex1 = baseId + int2( 1, 1 )@$\tvertex2 = baseId + int2( 1, + 0 )@$\tvertex3 = baseId + int2( 0, 1 )@$}$$UV1 = UV + frac( sin( mul( float2x2( + 127.1, 311.7, 269.5, 183.3 ), vertex1 ) ) * 43758.5453 )@$UV2 = UV + frac( sin( + mul( float2x2( 127.1, 311.7, 269.5, 183.3 ), vertex2 ) ) * 43758.5453 )@$UV3 = + UV + frac( sin( mul( float2x2( 127.1, 311.7, 269.5, 183.3 ), vertex3 ) ) * 43758.5453 + )@$return@;7;False;7;True;UV;FLOAT2;0,0;In;;Float;False;True;UV1;FLOAT2;0,0;Out;;Float;False;True;UV2;FLOAT2;0,0;Out;;Float;False;True;UV3;FLOAT2;0,0;Out;;Float;False;True;W1;FLOAT;0;Out;;Float;False;True;W2;FLOAT;0;Out;;Float;False;True;W3;FLOAT;0;Out;;Float;False;Stochastic + Tiling;False;False;0;8;0;FLOAT;0;False;1;FLOAT2;0,0;False;2;FLOAT2;0,0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;7;FLOAT;0;FLOAT2;3;FLOAT2;4;FLOAT2;5;FLOAT;6;FLOAT;7;FLOAT;8\nNode;AmplifyShaderEditor.WireNode;102;-46.64538,4274.229;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;113;-1224.541,3090.587;Inherit;False;64;Triplanar_UV1;1;0;OBJECT;;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;47;-674.6476,2026.501;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;121;72.30684,4059.421;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.CustomExpressionNode;108;165.3301,2727.335;Inherit;False;half3 + weights = max( abs( WorldNormal.xyz ), 0.000001 )@$weights /= ( weights.x + weights.y + + weights.z ).xxx@$W0 = weights.x@$W1 = weights.y@$W2 = weights.z@$return@;7;False;4;True;WorldNormal;FLOAT3;0,0,0;In;;Inherit;False;True;W0;FLOAT;0;Out;;Inherit;False;True;W1;FLOAT;0;Out;;Inherit;False;True;W2;FLOAT;0;Out;;Inherit;False;Triplanar + Weights;True;False;0;5;0;FLOAT;0;False;1;FLOAT3;0,0,0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;4;FLOAT;0;FLOAT;3;FLOAT;4;FLOAT;5\nNode;AmplifyShaderEditor.WireNode;141;-687.2004,-56.97699;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;70;702.0071,3020.752;Inherit;False;3;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.WireNode;194;-172.265,3509.147;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;26;303.8399,385.2554;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.CustomExpressionNode;2;-967.7908,239.7245;Inherit;False;float2 + vertex1, vertex2, vertex3@$$// Scaling of the input$float2 uv = UV * 3.464@ // + 2 * sqrt (3)$$// Skew input space into simplex triangle grid$const float2x2 gridToSkewedGrid + = float2x2( 1.0, 0.0, -0.57735027, 1.15470054 )@$float2 skewedCoord = mul( gridToSkewedGrid, + uv )@$$// Compute local triangle vertex IDs and local barycentric coordinates$int2 + baseId = int2( floor( skewedCoord ) )@$float3 temp = float3( frac( skewedCoord + ), 0 )@$temp.z = 1.0 - temp.x - temp.y@$if ( temp.z > 0.0 )${$\tW1 = temp.z@$\tW2 + = temp.y@$\tW3 = temp.x@$\tvertex1 = baseId@$\tvertex2 = baseId + int2( 0, 1 )@$\tvertex3 + = baseId + int2( 1, 0 )@$}$else${$\tW1 = -temp.z@$\tW2 = 1.0 - temp.y@$\tW3 = + 1.0 - temp.x@$\tvertex1 = baseId + int2( 1, 1 )@$\tvertex2 = baseId + int2( 1, + 0 )@$\tvertex3 = baseId + int2( 0, 1 )@$}$$UV1 = UV + frac( sin( mul( float2x2( + 127.1, 311.7, 269.5, 183.3 ), vertex1 ) ) * 43758.5453 )@$UV2 = UV + frac( sin( + mul( float2x2( 127.1, 311.7, 269.5, 183.3 ), vertex2 ) ) * 43758.5453 )@$UV3 = + UV + frac( sin( mul( float2x2( 127.1, 311.7, 269.5, 183.3 ), vertex3 ) ) * 43758.5453 + )@$return@;7;False;7;True;UV;FLOAT2;0,0;In;;Float;False;True;UV1;FLOAT2;0,0;Out;;Float;False;True;UV2;FLOAT2;0,0;Out;;Float;False;True;UV3;FLOAT2;0,0;Out;;Float;False;True;W1;FLOAT;0;Out;;Float;False;True;W2;FLOAT;0;Out;;Float;False;True;W3;FLOAT;0;Out;;Float;False;Stochastic + Tiling;False;False;0;8;0;FLOAT;0;False;1;FLOAT2;0,0;False;2;FLOAT2;0,0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;7;FLOAT;0;FLOAT2;3;FLOAT2;4;FLOAT2;5;FLOAT;6;FLOAT;7;FLOAT;8\nNode;AmplifyShaderEditor.WireNode;152;-187.3821,4345.959;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SamplerNode;169;-365.385,1286.126;Inherit;True;Property;_TextureSample12;Texture + Sample 2;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Derivative;Texture2DArray;8;0;SAMPLER2DARRAY;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SamplerNode;43;-377.2667,2361.99;Inherit;True;Property;_TextureSample3;Texture + Sample 3;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Derivative;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.WireNode;119;-519.4247,3719.87;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.WireNode;163;-740.3662,1072.4;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;25;303.8398,354.8411;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;139;-671.59,-112.4807;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.GetLocalVarNode;130;-951.8373,1870.621;Inherit;False;68;Input_Texture;1;0;OBJECT;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.WireNode;114;-21.95006,4281.605;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SamplerNode;100;-369.6875,2860.79;Inherit;True;Property;_TextureSample7;Texture + Sample 7;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Derivative;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SamplerNode;56;-374.4885,1954.325;Inherit;True;Property;_TextureSample4;Texture + Sample 4;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Derivative;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SamplerNode;89;-372.4656,3268.457;Inherit;True;Property;_TextureSample6;Texture + Sample 6;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Derivative;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.WireNode;46;-674.6478,2058.139;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;87;-539.7791,2910.117;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.WireNode;84;-669.847,2964.604;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;164;-736.9875,1046.247;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;131;-507.7252,1950.13;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.SamplerNode;91;-372.8483,3064.712;Inherit;True;Property;_TextureSample5;Texture + Sample 5;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Derivative;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;69;520.7668,2902.641;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.SamplerNode;7;-372.6252,205.1037;Inherit;True;Property;_TextureSample2;Texture + Sample 2;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Derivative;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.WireNode;156;-195.8623,4301.043;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;95;275.6625,3046.13;Inherit;False;3;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.WireNode;136;-568.3672,-163.3666;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.SamplerNode;173;-362.6067,878.461;Inherit;True;Property;_TextureSample14;Texture + Sample 0;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Derivative;Texture2DArray;8;0;SAMPLER2DARRAY;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.WireNode;150;-190.2717,4322.456;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;202;-180.7623,7144.028;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;112;-540.5168,3756.782;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;94;77.9698,3211.89;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;99;65.72094,2930.447;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.WireNode;186;-641.9001,979.174;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DdxOpNode;10;-960.4671,-5.020669;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;162;-755.9764,1096.683;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;60;16.91692,2162.801;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;122;269.9997,3893.663;Inherit;False;3;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.GetLocalVarNode;138;-999.7629,-162.4468;Inherit;False;76;Input_SS;1;0;OBJECT;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;147;-183.8212,2565.917;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionSubtitle;303;1604.811,-34.21301;Inherit;False;Planar + 2D Array;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.WireNode;133;-559.291,1999.009;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.WireNode;200;-3.078922,6286.73;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DdxOpNode;107;-961.0446,3904.996;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.GetLocalVarNode;90;-949.1356,2796.05;Inherit;False;68;Input_Texture;1;0;OBJECT;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.WireNode;140;-671.5901,-81.25983;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.CustomExpressionNode;53;-969.106,2453.156;Inherit;False;float2 + vertex1, vertex2, vertex3@$$// Scaling of the input$float2 uv = UV * 3.464@ // + 2 * sqrt (3)$$// Skew input space into simplex triangle grid$const float2x2 gridToSkewedGrid + = float2x2( 1.0, 0.0, -0.57735027, 1.15470054 )@$float2 skewedCoord = mul( gridToSkewedGrid, + uv )@$$// Compute local triangle vertex IDs and local barycentric coordinates$int2 + baseId = int2( floor( skewedCoord ) )@$float3 temp = float3( frac( skewedCoord + ), 0 )@$temp.z = 1.0 - temp.x - temp.y@$if ( temp.z > 0.0 )${$\tW1 = temp.z@$\tW2 + = temp.y@$\tW3 = temp.x@$\tvertex1 = baseId@$\tvertex2 = baseId + int2( 0, 1 )@$\tvertex3 + = baseId + int2( 1, 0 )@$}$else${$\tW1 = -temp.z@$\tW2 = 1.0 - temp.y@$\tW3 = + 1.0 - temp.x@$\tvertex1 = baseId + int2( 1, 1 )@$\tvertex2 = baseId + int2( 1, + 0 )@$\tvertex3 = baseId + int2( 0, 1 )@$}$$UV1 = UV + frac( sin( mul( float2x2( + 127.1, 311.7, 269.5, 183.3 ), vertex1 ) ) * 43758.5453 )@$UV2 = UV + frac( sin( + mul( float2x2( 127.1, 311.7, 269.5, 183.3 ), vertex2 ) ) * 43758.5453 )@$UV3 = + UV + frac( sin( mul( float2x2( 127.1, 311.7, 269.5, 183.3 ), vertex3 ) ) * 43758.5453 + )@$return@;7;False;7;True;UV;FLOAT2;0,0;In;;Float;False;True;UV1;FLOAT2;0,0;Out;;Float;False;True;UV2;FLOAT2;0,0;Out;;Float;False;True;UV3;FLOAT2;0,0;Out;;Float;False;True;W1;FLOAT;0;Out;;Float;False;True;W2;FLOAT;0;Out;;Float;False;True;W3;FLOAT;0;Out;;Float;False;Stochastic + Tiling;False;False;0;8;0;FLOAT;0;False;1;FLOAT2;0,0;False;2;FLOAT2;0,0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;7;FLOAT;0;FLOAT2;3;FLOAT2;4;FLOAT2;5;FLOAT;6;FLOAT;7;FLOAT;8\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;106;524.8408,3222.355;Inherit;False;2;2;0;FLOAT;0;False;1;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.WireNode;137;-600.6234,-132.8083;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.WireNode;192;-180.2166,3486.774;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;116;-948.1158,3727.082;Inherit;False;76;Input_SS;1;0;OBJECT;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;176;67.66106,1501.591;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;111;-570.3969,3770.843;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.FunctionSubtitle;304;1618.694,95.19456;Inherit;False;Triplanar + 2D;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.GetLocalVarNode;134;-1003.098,-253.8223;Inherit;False;68;Input_Texture;1;0;OBJECT;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.GetLocalVarNode;44;-1231.138,2184.123;Inherit;False;50;Triplanar_UV0;1;0;OBJECT;;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;63;222.213,2136.949;Inherit;False;3;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.WireNode;115;-688.1614,3828.846;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.SamplerNode;128;-373.2032,4115.121;Inherit;True;Property;_TextureSample11;Texture + Sample 11;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Derivative;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.WireNode;120;-670.5846,3811.27;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;294;865.0776,1047.969;Inherit;False;Output_2DArray;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.FunctionInput;104;-2531.787,313.7767;Inherit;False;Tiling;2;5;False;1;0;FLOAT2;1,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;149;-183.7648,2612.974;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DdxOpNode;172;-948.1591,1126.679;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;178;487.1229,1080.427;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;42;24.52043,2302.707;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.SamplerNode;4;-369.847,-202.5619;Inherit;True;Property;_TextureSample0;Texture + Sample 0;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Derivative;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.WireNode;168;-547.5455,876.9119;Inherit;False;1;0;SAMPLER2DARRAY;;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.GetLocalVarNode;174;-1236.06,1180.329;Inherit;False;145;Input_UV;1;0;OBJECT;;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;190;-158.0187,1528.828;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;123;64.70333,3919.515;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.WireNode;188;-659.7223,1049.705;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;118;-670.5844,3779.631;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;191;-158.0863,1551.41;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DdxOpNode;86;-960.3069,3058.33;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;148;-185.7914,2588.942;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;28;689.8213,-14.83985;Inherit;False;3;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;175;692.4185,1054.575;Inherit;False;3;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.FunctionSwitch;157;1885.965,-13.69264;Inherit;False;Sample + Mode;False;0;4;-1;Planar 2D;Planar 2D Array;Triplanar 2D;Triplanar 2D Array;Object;-1;9;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;3;COLOR;0,0,0,0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.WireNode;132;-522.834,1983.267;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.WireNode;59;-45.21275,2528.454;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;293;865.8185,-18.28572;Inherit;False;Output_2D;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.GetLocalVarNode;103;-949.8732,3642.714;Inherit;False;68;Input_Texture;1;0;OBJECT;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;177;494.7263,1220.333;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.FunctionSubtitle;305;1583.404,244.2609;Inherit;False;Triplanar + 2D Array;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;24;492.1291,150.9177;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;65;21.47899,2033.54;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;180;491.6849,951.1669;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.DdyOpNode;182;-946.6234,1204.227;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionSubtitle;302;1639.862,-181.2332;Inherit;False;Planar + 2D;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.WireNode;166;-561.127,917.6563;Inherit;False;1;0;SAMPLER2DARRAY;;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.WireNode;193;-184.1203,3463.355;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;300;1336.352,91.59142;Inherit;False;295;Output_Triplanar;1;0;OBJECT;;False;1;COLOR;0\nNode;AmplifyShaderEditor.GetLocalVarNode;48;-952.1794,1973.951;Inherit;False;76;Input_SS;1;0;OBJECT;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.DdyOpNode;92;-958.7713,3135.878;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;208;-168.7211,5408.902;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;298;1358.352,-187.2293;Inherit;False;293;Output_2D;1;0;OBJECT;;False;1;COLOR;0\nNode;AmplifyShaderEditor.WireNode;155;-67.66827,4256.529;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;93;-669.8467,2932.966;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.CustomExpressionNode;171;-942.7695,1359.865;Inherit;False;float2 + vertex1, vertex2, vertex3@$$// Scaling of the input$float2 uv = UV * 3.464@ // + 2 * sqrt (3)$$// Skew input space into simplex triangle grid$const float2x2 gridToSkewedGrid + = float2x2( 1.0, 0.0, -0.57735027, 1.15470054 )@$float2 skewedCoord = mul( gridToSkewedGrid, + uv )@$$// Compute local triangle vertex IDs and local barycentric coordinates$int2 + baseId = int2( floor( skewedCoord ) )@$float3 temp = float3( frac( skewedCoord + ), 0 )@$temp.z = 1.0 - temp.x - temp.y@$if ( temp.z > 0.0 )${$\tW1 = temp.z@$\tW2 + = temp.y@$\tW3 = temp.x@$\tvertex1 = baseId@$\tvertex2 = baseId + int2( 0, 1 )@$\tvertex3 + = baseId + int2( 1, 0 )@$}$else${$\tW1 = -temp.z@$\tW2 = 1.0 - temp.y@$\tW3 = + 1.0 - temp.x@$\tvertex1 = baseId + int2( 1, 1 )@$\tvertex2 = baseId + int2( 1, + 0 )@$\tvertex3 = baseId + int2( 0, 1 )@$}$$UV1 = UV + frac( sin( mul( float2x2( + 127.1, 311.7, 269.5, 183.3 ), vertex1 ) ) * 43758.5453 )@$UV2 = UV + frac( sin( + mul( float2x2( 127.1, 311.7, 269.5, 183.3 ), vertex2 ) ) * 43758.5453 )@$UV3 = + UV + frac( sin( mul( float2x2( 127.1, 311.7, 269.5, 183.3 ), vertex3 ) ) * 43758.5453 + )@$return@;7;False;7;True;UV;FLOAT2;0,0;In;;Float;False;True;UV1;FLOAT2;0,0;Out;;Float;False;True;UV2;FLOAT2;0,0;Out;;Float;False;True;UV3;FLOAT2;0,0;Out;;Float;False;True;W1;FLOAT;0;Out;;Float;False;True;W2;FLOAT;0;Out;;Float;False;True;W3;FLOAT;0;Out;;Float;False;Stochastic + Tiling;False;False;0;8;0;FLOAT;0;False;1;FLOAT2;0,0;False;2;FLOAT2;0,0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;7;FLOAT;0;FLOAT2;3;FLOAT2;4;FLOAT2;5;FLOAT;6;FLOAT;7;FLOAT;8\nNode;AmplifyShaderEditor.WireNode;88;-518.6871,2873.205;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.GetLocalVarNode;101;-947.3781,2880.416;Inherit;False;76;Input_SS;1;0;OBJECT;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;199;-18.26203,6268.457;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;189;-159.3294,1507.557;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;79;518.7319,3049.262;Inherit;False;2;2;0;FLOAT;0;False;1;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;125;69.26546,3790.255;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.CustomExpressionNode;117;-976.4214,4183.103;Inherit;False;float2 + vertex1, vertex2, vertex3@$$// Scaling of the input$float2 uv = UV * 3.464@ // + 2 * sqrt (3)$$// Skew input space into simplex triangle grid$const float2x2 gridToSkewedGrid + = float2x2( 1.0, 0.0, -0.57735027, 1.15470054 )@$float2 skewedCoord = mul( gridToSkewedGrid, + uv )@$$// Compute local triangle vertex IDs and local barycentric coordinates$int2 + baseId = int2( floor( skewedCoord ) )@$float3 temp = float3( frac( skewedCoord + ), 0 )@$temp.z = 1.0 - temp.x - temp.y@$if ( temp.z > 0.0 )${$\tW1 = temp.z@$\tW2 + = temp.y@$\tW3 = temp.x@$\tvertex1 = baseId@$\tvertex2 = baseId + int2( 0, 1 )@$\tvertex3 + = baseId + int2( 1, 0 )@$}$else${$\tW1 = -temp.z@$\tW2 = 1.0 - temp.y@$\tW3 = + 1.0 - temp.x@$\tvertex1 = baseId + int2( 1, 1 )@$\tvertex2 = baseId + int2( 1, + 0 )@$\tvertex3 = baseId + int2( 0, 1 )@$}$$UV1 = UV + frac( sin( mul( float2x2( + 127.1, 311.7, 269.5, 183.3 ), vertex1 ) ) * 43758.5453 )@$UV2 = UV + frac( sin( + mul( float2x2( 127.1, 311.7, 269.5, 183.3 ), vertex2 ) ) * 43758.5453 )@$UV3 = + UV + frac( sin( mul( float2x2( 127.1, 311.7, 269.5, 183.3 ), vertex3 ) ) * 43758.5453 + )@$return@;7;False;7;True;UV;FLOAT2;0,0;In;;Float;False;True;UV1;FLOAT2;0,0;Out;;Float;False;True;UV2;FLOAT2;0,0;Out;;Float;False;True;UV3;FLOAT2;0,0;Out;;Float;False;True;W1;FLOAT;0;Out;;Float;False;True;W2;FLOAT;0;Out;;Float;False;True;W3;FLOAT;0;Out;;Float;False;Stochastic + Tiling;False;False;0;8;0;FLOAT;0;False;1;FLOAT2;0,0;False;2;FLOAT2;0,0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;7;FLOAT;0;FLOAT2;3;FLOAT2;4;FLOAT2;5;FLOAT;6;FLOAT;7;FLOAT;8\nNode;AmplifyShaderEditor.SamplerNode;6;-373.0079,1.359925;Inherit;True;Property;_TextureSample1;Texture + Sample 1;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Derivative;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SamplerNode;126;-373.5859,3911.377;Inherit;True;Property;_TextureSample9;Texture + Sample 9;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Derivative;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.WireNode;181;61.0726,1469.656;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.CustomExpressionNode;201;-961.3214,7026.089;Inherit;False;float2 + vertex1, vertex2, vertex3@$$// Scaling of the input$float2 uv = UV * 3.464@ // + 2 * sqrt (3)$$// Skew input space into simplex triangle grid$const float2x2 gridToSkewedGrid + = float2x2( 1.0, 0.0, -0.57735027, 1.15470054 )@$float2 skewedCoord = mul( gridToSkewedGrid, + uv )@$$// Compute local triangle vertex IDs and local barycentric coordinates$int2 + baseId = int2( floor( skewedCoord ) )@$float3 temp = float3( frac( skewedCoord + ), 0 )@$temp.z = 1.0 - temp.x - temp.y@$if ( temp.z > 0.0 )${$\tW1 = temp.z@$\tW2 + = temp.y@$\tW3 = temp.x@$\tvertex1 = baseId@$\tvertex2 = baseId + int2( 0, 1 )@$\tvertex3 + = baseId + int2( 1, 0 )@$}$else${$\tW1 = -temp.z@$\tW2 = 1.0 - temp.y@$\tW3 = + 1.0 - temp.x@$\tvertex1 = baseId + int2( 1, 1 )@$\tvertex2 = baseId + int2( 1, + 0 )@$\tvertex3 = baseId + int2( 0, 1 )@$}$$UV1 = UV + frac( sin( mul( float2x2( + 127.1, 311.7, 269.5, 183.3 ), vertex1 ) ) * 43758.5453 )@$UV2 = UV + frac( sin( + mul( float2x2( 127.1, 311.7, 269.5, 183.3 ), vertex2 ) ) * 43758.5453 )@$UV3 = + UV + frac( sin( mul( float2x2( 127.1, 311.7, 269.5, 183.3 ), vertex3 ) ) * 43758.5453 + )@$return@;7;False;7;True;UV;FLOAT2;0,0;In;;Float;False;True;UV1;FLOAT2;0,0;Out;;Float;False;True;UV2;FLOAT2;0,0;Out;;Float;False;True;UV3;FLOAT2;0,0;Out;;Float;False;True;W1;FLOAT;0;Out;;Float;False;True;W2;FLOAT;0;Out;;Float;False;True;W3;FLOAT;0;Out;;Float;False;Stochastic + Tiling;False;False;0;8;0;FLOAT;0;False;1;FLOAT2;0,0;False;2;FLOAT2;0,0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;7;FLOAT;0;FLOAT2;3;FLOAT2;4;FLOAT2;5;FLOAT;6;FLOAT;7;FLOAT;8\nNode;AmplifyShaderEditor.WireNode;167;-593.3832,948.2145;Inherit;False;1;0;SAMPLER2DARRAY;;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.SamplerNode;127;-370.425,3707.456;Inherit;True;Property;_TextureSample10;Texture + Sample 10;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Derivative;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.DdyOpNode;12;-958.9313,72.52722;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.GetLocalVarNode;165;-1044.845,828.8899;Inherit;False;159;Input_TextureArray;1;0;OBJECT;;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.WireNode;41;-33.36201,3425.471;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;187;-645.2793,997.7559;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;299;1331.738,-38.71012;Inherit;False;294;Output_2DArray;1;0;OBJECT;;False;1;COLOR;0\nNode;AmplifyShaderEditor.GetLocalVarNode;129;-362.8989,2887.883;Inherit;False;68;Input_Texture;1;0;OBJECT;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.DdyOpNode;58;-963.5724,2229.414;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WorldNormalVector;62;-31.00317,2723.179;Inherit;False;False;1;0;FLOAT3;0,0,1;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3\nNode;AmplifyShaderEditor.WireNode;54;-92.78294,2504.121;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DdxOpNode;57;-965.1083,2151.866;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;251;-733.1257,6786.954;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.CustomExpressionNode;216;-954.0061,5296.142;Inherit;False;float2 + vertex1, vertex2, vertex3@$$// Scaling of the input$float2 uv = UV * 3.464@ // + 2 * sqrt (3)$$// Skew input space into simplex triangle grid$const float2x2 gridToSkewedGrid + = float2x2( 1.0, 0.0, -0.57735027, 1.15470054 )@$float2 skewedCoord = mul( gridToSkewedGrid, + uv )@$$// Compute local triangle vertex IDs and local barycentric coordinates$int2 + baseId = int2( floor( skewedCoord ) )@$float3 temp = float3( frac( skewedCoord + ), 0 )@$temp.z = 1.0 - temp.x - temp.y@$if ( temp.z > 0.0 )${$\tW1 = temp.z@$\tW2 + = temp.y@$\tW3 = temp.x@$\tvertex1 = baseId@$\tvertex2 = baseId + int2( 0, 1 )@$\tvertex3 + = baseId + int2( 1, 0 )@$}$else${$\tW1 = -temp.z@$\tW2 = 1.0 - temp.y@$\tW3 = + 1.0 - temp.x@$\tvertex1 = baseId + int2( 1, 1 )@$\tvertex2 = baseId + int2( 1, + 0 )@$\tvertex3 = baseId + int2( 0, 1 )@$}$$UV1 = UV + frac( sin( mul( float2x2( + 127.1, 311.7, 269.5, 183.3 ), vertex1 ) ) * 43758.5453 )@$UV2 = UV + frac( sin( + mul( float2x2( 127.1, 311.7, 269.5, 183.3 ), vertex2 ) ) * 43758.5453 )@$UV3 = + UV + frac( sin( mul( float2x2( 127.1, 311.7, 269.5, 183.3 ), vertex3 ) ) * 43758.5453 + )@$return@;7;False;7;True;UV;FLOAT2;0,0;In;;Float;False;True;UV1;FLOAT2;0,0;Out;;Float;False;True;UV2;FLOAT2;0,0;Out;;Float;False;True;UV3;FLOAT2;0,0;Out;;Float;False;True;W1;FLOAT;0;Out;;Float;False;True;W2;FLOAT;0;Out;;Float;False;True;W3;FLOAT;0;Out;;Float;False;Stochastic + Tiling;False;False;0;8;0;FLOAT;0;False;1;FLOAT2;0,0;False;2;FLOAT2;0,0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;7;FLOAT;0;FLOAT2;3;FLOAT2;4;FLOAT2;5;FLOAT;6;FLOAT;7;FLOAT;8\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;240;39.62043,5145.692;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.DdxOpNode;242;-927.6881,5993.915;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.GetLocalVarNode;279;-998.8414,4745.661;Inherit;False;159;Input_TextureArray;1;0;OBJECT;;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;224;539.9408,6065.341;Inherit;False;2;2;0;FLOAT;0;False;1;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.WireNode;261;-157.165,6352.133;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SamplerNode;105;-377.6494,2158.247;Inherit;True;Property;_TextureSample8;Texture + Sample 8;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Derivative;Texture2D;8;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SimpleAddOpNode;232;290.7627,5889.115;Inherit;False;3;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;227;87.40696,6902.406;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.WireNode;213;-33.87604,6253.656;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;231;-77.68291,5347.106;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;284;-605.3763,4924.135;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;239;84.36546,6633.24;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.DdxOpNode;214;-933.4313,6855.596;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;205;-175.1717,7165.441;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SamplerNode;245;-358.4859,6754.362;Inherit;True;Property;_TextureSample17;Texture + Sample 9;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Derivative;Texture2DArray;8;0;SAMPLER2DARRAY;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.WireNode;288;-603.3726,5839.669;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;277;-693.7852,5897.679;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;260;-494.6287,5761.116;Inherit;False;1;0;SAMPLER2DARRAY;;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.WireNode;218;-533.2599,6622.33;Inherit;False;1;0;SAMPLER2DARRAY;;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.WireNode;257;-711.3621,5915.255;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.FunctionInput;183;-2522.189,101.5914;Inherit;False;Index;1;2;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;212;-169.0203,6306.341;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SamplerNode;243;-358.1031,6958.106;Inherit;True;Property;_TextureSample15;Texture + Sample 11;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Derivative;Texture2DArray;8;0;SAMPLER2DARRAY;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;233;36.57905,4876.525;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.WorldNormalVector;236;-15.90314,5566.165;Inherit;False;False;1;0;FLOAT3;0,0,1;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3\nNode;AmplifyShaderEditor.WireNode;271;-676.2661,5873.548;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;234;32.01691,5005.787;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.GetLocalVarNode;185;-1005.769,928.8007;Inherit;False;184;Input_Index;1;0;OBJECT;;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DdyOpNode;275;-915.9375,5175.009;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;238;79.80344,6762.5;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.GetLocalVarNode;254;-1037.831,6514.394;Inherit;False;159;Input_TextureArray;1;0;OBJECT;;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;97;70.36629,3071.982;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.WireNode;203;-52.56817,7099.515;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;230;-49.66521,5364.518;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;207;-6.85004,7124.591;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;259;-524.509,5775.177;Inherit;False;1;0;SAMPLER2DARRAY;;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.WireNode;109;-687.4238,2982.181;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.CustomExpressionNode;229;180.4301,5570.32;Inherit;False;half3 + weights = max( abs( WorldNormal.xyz ), 0.000001 )@$weights /= ( weights.x + weights.y + + weights.z ).xxx@$W0 = weights.x@$W1 = weights.y@$W2 = weights.z@$return@;7;False;4;True;WorldNormal;FLOAT3;0,0,0;In;;Inherit;False;True;W0;FLOAT;0;Out;;Inherit;False;True;W1;FLOAT;0;Out;;Inherit;False;True;W2;FLOAT;0;Out;;Inherit;False;Triplanar + Weights;True;False;0;5;0;FLOAT;0;False;1;FLOAT3;0,0,0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;4;FLOAT;0;FLOAT;3;FLOAT;4;FLOAT;5\nNode;AmplifyShaderEditor.DdyOpNode;247;-926.1526,6071.462;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;27;305.3607,417.1903;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;264;-677.0543,4964.566;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;241;237.3129,4979.935;Inherit;False;3;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.DdyOpNode;258;-931.8958,6933.145;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SamplerNode;255;-362.5493,5001.232;Inherit;True;Property;_TextureSample19;Texture + Sample 8;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Derivative;Texture2DArray;8;0;SAMPLER2DARRAY;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.WireNode;246;-715.549,6769.378;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;237;-473.5366,5724.204;Inherit;False;1;0;SAMPLER2DARRAY;;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.SamplerNode;252;-354.5874,5703.775;Inherit;True;Property;_TextureSample18;Texture + Sample 7;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Derivative;Texture2DArray;8;0;SAMPLER2DARRAY;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.WireNode;248;-715.5488,6737.739;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;223;93.0698,6054.875;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.GetLocalVarNode;281;-964.0038,4829.952;Inherit;False;184;Input_Index;1;0;OBJECT;;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;250;-1022.183,5639.036;Inherit;False;159;Input_TextureArray;1;0;OBJECT;;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;228;717.1071,5863.737;Inherit;False;3;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.WireNode;204;-31.54535,7117.215;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;296;870.2289,5857.978;Inherit;False;Output_TriplanarArray;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.WireNode;273;-475.6802,4856.304;Inherit;False;1;0;SAMPLER2DARRAY;;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;22;489.0877,-118.2482;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.WireNode;287;-589.3491,5819.636;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;144;-1257.727,32.94259;Inherit;False;145;Input_UV;1;0;OBJECT;;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionInput;158;-2590.266,-3.661018;Inherit;False;Texture + Array;12;1;False;1;0;SAMPLER2DARRAY;0;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.WireNode;274;-512.1373,4872.046;Inherit;False;1;0;SAMPLER2DARRAY;;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.GetLocalVarNode;253;-984.0741,6702.991;Inherit;False;76;Input_SS;1;0;OBJECT;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.GetLocalVarNode;256;-972.3212,5842.516;Inherit;False;76;Input_SS;1;0;OBJECT;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;272;-460.5714,4823.167;Inherit;False;1;0;SAMPLER2DARRAY;;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.WireNode;290;-615.3917,6651.026;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DdyOpNode;110;-959.5091,3982.545;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.GetLocalVarNode;67;-1225.278,3937.253;Inherit;False;71;Triplanar_UV2;1;0;OBJECT;;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SamplerNode;265;-357.3655,6111.442;Inherit;True;Property;_TextureSample20;Texture + Sample 6;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Derivative;Texture2DArray;8;0;SAMPLER2DARRAY;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.WireNode;283;-597.3629,4908.108;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;291;-613.3883,6679.072;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;179;44.18006,1435.864;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;292;-619.3984,6699.106;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;217;-1206.556,6060.53;Inherit;False;64;Triplanar_UV1;1;0;OBJECT;;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.GetLocalVarNode;276;-1230.178,6903.238;Inherit;False;71;Triplanar_UV2;1;0;OBJECT;;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;220;285.0999,6736.648;Inherit;False;3;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.SamplerNode;269;-357.7482,5907.697;Inherit;True;Property;_TextureSample22;Texture + Sample 5;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Derivative;Texture2DArray;8;0;SAMPLER2DARRAY;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;222;85.46629,5914.968;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.WireNode;219;-165.1165,6329.76;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;226;535.8668,5745.627;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.WireNode;266;-694.5734,4988.696;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;221;80.82102,5773.433;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.GetLocalVarNode;289;-998.0596,6606.927;Inherit;False;184;Input_Index;1;0;OBJECT;;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SamplerNode;267;-362.1667,5204.976;Inherit;True;Property;_TextureSample21;Texture + Sample 3;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Derivative;Texture2DArray;8;0;SAMPLER2DARRAY;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.FunctionInput;74;-2575.694,186.7092;Inherit;False;SS;13;6;False;1;0;SAMPLERSTATE;0;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;225;533.8319,5892.248;Inherit;False;2;2;0;FLOAT;0;False;1;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.DdxOpNode;280;-917.4734,5097.461;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;235;-503.3798,6608.269;Inherit;False;1;0;SAMPLER2DARRAY;;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.WireNode;55;-692.2244,2075.716;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;98;-48.9761,3410.671;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;210;-168.6647,5455.96;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;308;-2149.554,321.281;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;211;-30.11273,5371.439;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;263;-699.6365,5013.781;Inherit;False;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.SamplerNode;244;-355.325,6550.441;Inherit;True;Property;_TextureSample16;Texture + Sample 10;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Derivative;Texture2DArray;8;0;SAMPLER2DARRAY;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.WireNode;286;-589.3489,5787.583;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;209;-170.6913,5431.928;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;206;-172.282,7188.944;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;96;-569.6593,2924.178;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.GetLocalVarNode;278;-946.5848,4931.528;Inherit;False;76;Input_SS;1;0;OBJECT;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.WireNode;135;-554.7857,-204.111;Inherit;False;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.TextureCoordinatesNode;36;-2384.665,-215.9967;Inherit;False;0;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.WireNode;249;-482.2875,6571.357;Inherit;False;1;0;SAMPLER2DARRAY;;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;145;-1629.496,-192.1966;Inherit;False;Input_UV;-1;True;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;68;-1637.527,-288.2665;Inherit;False;Input_Texture;-1;True;1;0;SAMPLER2D;;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.SamplerNode;270;-359.3885,4797.311;Inherit;True;Property;_TextureSample23;Texture + Sample 4;0;0;Create;True;0;0;False;0;False;-1;None;None;True;0;False;white;Auto;False;Object;-1;Derivative;Texture2DArray;8;0;SAMPLER2DARRAY;;False;1;FLOAT2;0,0;False;2;FLOAT;0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1;False;6;FLOAT;0;False;7;SAMPLERSTATE;;False;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.TextureCoordinatesNode;309;-2384.424,-81.31772;Inherit;False;0;-1;2;3;2;SAMPLER2DARRAY;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;23;484.5256,11.0122;Inherit;False;2;2;0;COLOR;0,0,0,0;False;1;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.GetLocalVarNode;262;-1204.496,5159.837;Inherit;False;50;Triplanar_UV0;1;0;OBJECT;;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.CustomExpressionNode;215;-955.8572,6182.651;Inherit;False;float2 + vertex1, vertex2, vertex3@$$// Scaling of the input$float2 uv = UV * 3.464@ // + 2 * sqrt (3)$$// Skew input space into simplex triangle grid$const float2x2 gridToSkewedGrid + = float2x2( 1.0, 0.0, -0.57735027, 1.15470054 )@$float2 skewedCoord = mul( gridToSkewedGrid, + uv )@$$// Compute local triangle vertex IDs and local barycentric coordinates$int2 + baseId = int2( floor( skewedCoord ) )@$float3 temp = float3( frac( skewedCoord + ), 0 )@$temp.z = 1.0 - temp.x - temp.y@$if ( temp.z > 0.0 )${$\tW1 = temp.z@$\tW2 + = temp.y@$\tW3 = temp.x@$\tvertex1 = baseId@$\tvertex2 = baseId + int2( 0, 1 )@$\tvertex3 + = baseId + int2( 1, 0 )@$}$else${$\tW1 = -temp.z@$\tW2 = 1.0 - temp.y@$\tW3 = + 1.0 - temp.x@$\tvertex1 = baseId + int2( 1, 1 )@$\tvertex2 = baseId + int2( 1, + 0 )@$\tvertex3 = baseId + int2( 0, 1 )@$}$$UV1 = UV + frac( sin( mul( float2x2( + 127.1, 311.7, 269.5, 183.3 ), vertex1 ) ) * 43758.5453 )@$UV2 = UV + frac( sin( + mul( float2x2( 127.1, 311.7, 269.5, 183.3 ), vertex2 ) ) * 43758.5453 )@$UV3 = + UV + frac( sin( mul( float2x2( 127.1, 311.7, 269.5, 183.3 ), vertex3 ) ) * 43758.5453 + )@$return@;7;False;7;True;UV;FLOAT2;0,0;In;;Float;False;True;UV1;FLOAT2;0,0;Out;;Float;False;True;UV2;FLOAT2;0,0;Out;;Float;False;True;UV3;FLOAT2;0,0;Out;;Float;False;True;W1;FLOAT;0;Out;;Float;False;True;W2;FLOAT;0;Out;;Float;False;True;W3;FLOAT;0;Out;;Float;False;Stochastic + Tiling;False;False;0;8;0;FLOAT;0;False;1;FLOAT2;0,0;False;2;FLOAT2;0,0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;7;FLOAT;0;FLOAT2;3;FLOAT2;4;FLOAT2;5;FLOAT;6;FLOAT;7;FLOAT;8\nNode;AmplifyShaderEditor.FunctionInput;5;-1772.503,-191.8328;Inherit;False;UV;2;3;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionSwitch;315;-2116.706,-191.1189;Inherit;False;Option;False;0;4;-1;2D;2D + Array;Triplanar;Triplanar Array;Instance;157;9;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;2;FLOAT2;0,0;False;3;FLOAT2;0,0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;159;-1638.465,-4.046509;Inherit;False;Input_TextureArray;-1;True;1;0;SAMPLER2DARRAY;;False;1;SAMPLER2DARRAY;0\nNode;AmplifyShaderEditor.FunctionInput;82;-2562.134,-290.8169;Inherit;False;Texture;9;0;False;1;0;SAMPLER2D;0;False;1;SAMPLER2D;0\nNode;AmplifyShaderEditor.WireNode;282;-591.3529,4882.065;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;301;1327.809,238.6714;Inherit;False;296;Output_TriplanarArray;1;0;OBJECT;;False;1;COLOR;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;184;-1632.055,101.7441;Inherit;False;Input_Index;-1;True;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SwizzleNode;61;-2258.47,364.7153;Inherit;False;FLOAT2;2;1;2;3;1;0;FLOAT3;0,0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;306;-2196.85,294.618;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;307;-2138.884,347.3101;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;77;-1994.028,329.8235;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SwizzleNode;73;-2257.888,435.678;Inherit;False;FLOAT2;2;0;2;3;1;0;FLOAT3;0,0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.GetLocalVarNode;285;-984.0376,5741.479;Inherit;False;184;Input_Index;1;0;OBJECT;;False;1;FLOAT;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;31;2294.798,132.5219;Inherit;False;COLOR;1;0;COLOR;0,0,0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.RegisterLocalVarNode;76;-1632.419,184.9388;Inherit;False;Input_SS;-1;True;1;0;SAMPLERSTATE;;False;1;SAMPLERSTATE;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;295;873.6226,3015.605;Inherit;False;Output_Triplanar;-1;True;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.WorldPosInputsNode;81;-2760.234,421.0934;Inherit;False;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;72;-1993.533,507.2687;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;64;-1632.479,418.3403;Inherit;False;Triplanar_UV1;-1;True;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;78;-1994.079,417.5941;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionInput;80;-2574.644,415.9991;Inherit;False;World + Position;3;4;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SwizzleNode;75;-2257.687,506.5578;Inherit;False;FLOAT2;0;1;2;3;1;0;FLOAT3;0,0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;50;-1630.848,341.5698;Inherit;False;Triplanar_UV0;-1;True;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;71;-1630.916,494.2191;Inherit;False;Triplanar_UV2;-1;True;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionOutput;33;2573.17,133.5936;Inherit;False;False;-1;G;2;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;0;2573.008,-6.675806;Inherit;False;True;-1;RGBA;0;False;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.FunctionOutput;34;2576.37,208.7937;Inherit;False;False;-1;B;3;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;35;2577.97,287.1936;Inherit;False;False;-1;A;4;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;32;2573.17,63.19369;Inherit;False;False;-1;R;1;False;1;0;FLOAT;0;False;1;FLOAT;0\nWireConnection;170;0;166;0\nWireConnection;170;1;171;4\nWireConnection;170;3;172;0\nWireConnection;170;4;182;0\nWireConnection;170;6;187;0\nWireConnection;170;7;163;0\nWireConnection;85;0;194;0\nWireConnection;45;0;148;0\nWireConnection;83;1;113;0\nWireConnection;102;0;150;0\nWireConnection;47;0;48;0\nWireConnection;121;0;128;0\nWireConnection;121;1;114;0\nWireConnection;108;1;62;0\nWireConnection;141;0;138;0\nWireConnection;70;0;69;0\nWireConnection;70;1;79;0\nWireConnection;70;2;106;0\nWireConnection;194;0;83;8\nWireConnection;26;0;2;7\nWireConnection;2;1;144;0\nWireConnection;152;0;117;8\nWireConnection;169;0;167;0\nWireConnection;169;1;171;5\nWireConnection;169;3;172;0\nWireConnection;169;4;182;0\nWireConnection;169;6;188;0\nWireConnection;169;7;162;0\nWireConnection;43;0;133;0\nWireConnection;43;1;53;5\nWireConnection;43;3;57;0\nWireConnection;43;4;58;0\nWireConnection;43;7;55;0\nWireConnection;119;0;103;0\nWireConnection;163;0;161;0\nWireConnection;25;0;2;6\nWireConnection;139;0;138;0\nWireConnection;114;0;152;0\nWireConnection;100;0;88;0\nWireConnection;100;1;83;3\nWireConnection;100;3;86;0\nWireConnection;100;4;92;0\nWireConnection;100;7;93;0\nWireConnection;56;0;131;0\nWireConnection;56;1;53;3\nWireConnection;56;3;57;0\nWireConnection;56;4;58;0\nWireConnection;56;7;47;0\nWireConnection;89;0;96;0\nWireConnection;89;1;83;5\nWireConnection;89;3;86;0\nWireConnection;89;4;92;0\nWireConnection;89;7;109;0\nWireConnection;46;0;48;0\nWireConnection;87;0;90;0\nWireConnection;84;0;101;0\nWireConnection;164;0;161;0\nWireConnection;131;0;130;0\nWireConnection;91;0;87;0\nWireConnection;91;1;83;4\nWireConnection;91;3;86;0\nWireConnection;91;4;92;0\nWireConnection;91;7;84;0\nWireConnection;69;0;63;0\nWireConnection;69;1;108;3\nWireConnection;7;0;137;0\nWireConnection;7;1;2;5\nWireConnection;7;3;10;0\nWireConnection;7;4;12;0\nWireConnection;7;7;141;0\nWireConnection;156;0;117;6\nWireConnection;95;0;99;0\nWireConnection;95;1;97;0\nWireConnection;95;2;94;0\nWireConnection;136;0;134;0\nWireConnection;173;0;168;0\nWireConnection;173;1;171;3\nWireConnection;173;3;172;0\nWireConnection;173;4;182;0\nWireConnection;173;6;186;0\nWireConnection;173;7;164;0\nWireConnection;150;0;117;7\nWireConnection;202;0;201;6\nWireConnection;112;0;103;0\nWireConnection;94;0;89;0\nWireConnection;94;1;85;0\nWireConnection;99;0;100;0\nWireConnection;99;1;98;0\nWireConnection;186;0;185;0\nWireConnection;10;0;144;0\nWireConnection;162;0;161;0\nWireConnection;60;0;105;0\nWireConnection;60;1;45;0\nWireConnection;122;0;125;0\nWireConnection;122;1;123;0\nWireConnection;122;2;121;0\nWireConnection;147;0;53;6\nWireConnection;303;0;299;0\nWireConnection;133;0;130;0\nWireConnection;200;0;261;0\nWireConnection;107;0;67;0\nWireConnection;140;0;138;0\nWireConnection;53;1;44;0\nWireConnection;106;0;108;5\nWireConnection;106;1;122;0\nWireConnection;137;0;134;0\nWireConnection;192;0;83;7\nWireConnection;176;0;191;0\nWireConnection;111;0;103;0\nWireConnection;304;0;300;0\nWireConnection;63;0;65;0\nWireConnection;63;1;60;0\nWireConnection;63;2;42;0\nWireConnection;115;0;116;0\nWireConnection;128;0;111;0\nWireConnection;128;1;117;5\nWireConnection;128;3;107;0\nWireConnection;128;4;110;0\nWireConnection;128;7;115;0\nWireConnection;120;0;116;0\nWireConnection;294;0;175;0\nWireConnection;149;0;53;8\nWireConnection;172;0;174;0\nWireConnection;178;0;170;0\nWireConnection;178;1;181;0\nWireConnection;42;0;43;0\nWireConnection;42;1;59;0\nWireConnection;4;0;135;0\nWireConnection;4;1;2;3\nWireConnection;4;3;10;0\nWireConnection;4;4;12;0\nWireConnection;4;7;139;0\nWireConnection;168;0;165;0\nWireConnection;190;0;171;7\nWireConnection;123;0;126;0\nWireConnection;123;1;102;0\nWireConnection;188;0;185;0\nWireConnection;118;0;116;0\nWireConnection;191;0;171;8\nWireConnection;86;0;113;0\nWireConnection;148;0;53;7\nWireConnection;28;0;22;0\nWireConnection;28;1;23;0\nWireConnection;28;2;24;0\nWireConnection;175;0;180;0\nWireConnection;175;1;178;0\nWireConnection;175;2;177;0\nWireConnection;157;0;302;0\nWireConnection;157;1;303;0\nWireConnection;157;2;304;0\nWireConnection;157;3;305;0\nWireConnection;132;0;130;0\nWireConnection;59;0;149;0\nWireConnection;293;0;28;0\nWireConnection;177;0;169;0\nWireConnection;177;1;176;0\nWireConnection;305;0;301;0\nWireConnection;24;0;7;0\nWireConnection;24;1;27;0\nWireConnection;65;0;56;0\nWireConnection;65;1;54;0\nWireConnection;180;0;173;0\nWireConnection;180;1;179;0\nWireConnection;182;0;174;0\nWireConnection;302;0;298;0\nWireConnection;166;0;165;0\nWireConnection;193;0;83;6\nWireConnection;92;0;113;0\nWireConnection;208;0;216;6\nWireConnection;155;0;156;0\nWireConnection;93;0;101;0\nWireConnection;171;1;174;0\nWireConnection;88;0;90;0\nWireConnection;199;0;219;0\nWireConnection;189;0;171;6\nWireConnection;79;0;108;4\nWireConnection;79;1;95;0\nWireConnection;125;0;127;0\nWireConnection;125;1;155;0\nWireConnection;117;1;67;0\nWireConnection;6;0;136;0\nWireConnection;6;1;2;4\nWireConnection;6;3;10;0\nWireConnection;6;4;12;0\nWireConnection;6;7;140;0\nWireConnection;126;0;112;0\nWireConnection;126;1;117;4\nWireConnection;126;3;107;0\nWireConnection;126;4;110;0\nWireConnection;126;7;120;0\nWireConnection;181;0;190;0\nWireConnection;201;1;276;0\nWireConnection;167;0;165;0\nWireConnection;127;0;119;0\nWireConnection;127;1;117;3\nWireConnection;127;3;107;0\nWireConnection;127;4;110;0\nWireConnection;127;7;118;0\nWireConnection;12;0;144;0\nWireConnection;41;0;192;0\nWireConnection;187;0;185;0\nWireConnection;58;0;44;0\nWireConnection;54;0;147;0\nWireConnection;57;0;44;0\nWireConnection;251;0;253;0\nWireConnection;216;1;262;0\nWireConnection;240;0;267;0\nWireConnection;240;1;211;0\nWireConnection;242;0;217;0\nWireConnection;224;0;229;5\nWireConnection;224;1;220;0\nWireConnection;261;0;215;8\nWireConnection;105;0;132;0\nWireConnection;105;1;53;4\nWireConnection;105;3;57;0\nWireConnection;105;4;58;0\nWireConnection;105;7;46;0\nWireConnection;232;0;221;0\nWireConnection;232;1;222;0\nWireConnection;232;2;223;0\nWireConnection;227;0;243;0\nWireConnection;227;1;207;0\nWireConnection;213;0;212;0\nWireConnection;231;0;208;0\nWireConnection;284;0;281;0\nWireConnection;239;0;244;0\nWireConnection;239;1;203;0\nWireConnection;214;0;276;0\nWireConnection;205;0;201;7\nWireConnection;245;0;235;0\nWireConnection;245;1;201;4\nWireConnection;245;3;214;0\nWireConnection;245;4;258;0\nWireConnection;245;6;291;0\nWireConnection;245;7;246;0\nWireConnection;288;0;285;0\nWireConnection;277;0;256;0\nWireConnection;260;0;250;0\nWireConnection;218;0;254;0\nWireConnection;257;0;256;0\nWireConnection;212;0;215;6\nWireConnection;243;0;218;0\nWireConnection;243;1;201;5\nWireConnection;243;3;214;0\nWireConnection;243;4;258;0\nWireConnection;243;6;292;0\nWireConnection;243;7;251;0\nWireConnection;233;0;270;0\nWireConnection;233;1;231;0\nWireConnection;271;0;256;0\nWireConnection;234;0;255;0\nWireConnection;234;1;230;0\nWireConnection;275;0;262;0\nWireConnection;238;0;245;0\nWireConnection;238;1;204;0\nWireConnection;97;0;91;0\nWireConnection;97;1;41;0\nWireConnection;203;0;202;0\nWireConnection;230;0;209;0\nWireConnection;207;0;206;0\nWireConnection;259;0;250;0\nWireConnection;109;0;101;0\nWireConnection;229;1;236;0\nWireConnection;247;0;217;0\nWireConnection;27;0;2;8\nWireConnection;264;0;278;0\nWireConnection;241;0;233;0\nWireConnection;241;1;234;0\nWireConnection;241;2;240;0\nWireConnection;258;0;276;0\nWireConnection;255;0;273;0\nWireConnection;255;1;216;4\nWireConnection;255;3;280;0\nWireConnection;255;4;275;0\nWireConnection;255;6;283;0\nWireConnection;255;7;266;0\nWireConnection;246;0;253;0\nWireConnection;237;0;250;0\nWireConnection;252;0;237;0\nWireConnection;252;1;215;3\nWireConnection;252;3;242;0\nWireConnection;252;4;247;0\nWireConnection;252;6;286;0\nWireConnection;252;7;271;0\nWireConnection;248;0;253;0\nWireConnection;223;0;265;0\nWireConnection;223;1;200;0\nWireConnection;228;0;226;0\nWireConnection;228;1;225;0\nWireConnection;228;2;224;0\nWireConnection;204;0;205;0\nWireConnection;296;0;228;0\nWireConnection;273;0;279;0\nWireConnection;22;0;4;0\nWireConnection;22;1;25;0\nWireConnection;287;0;285;0\nWireConnection;274;0;279;0\nWireConnection;272;0;279;0\nWireConnection;290;0;289;0\nWireConnection;110;0;67;0\nWireConnection;265;0;259;0\nWireConnection;265;1;215;5\nWireConnection;265;3;242;0\nWireConnection;265;4;247;0\nWireConnection;265;6;288;0\nWireConnection;265;7;257;0\nWireConnection;283;0;281;0\nWireConnection;291;0;289;0\nWireConnection;179;0;189;0\nWireConnection;292;0;289;0\nWireConnection;220;0;239;0\nWireConnection;220;1;238;0\nWireConnection;220;2;227;0\nWireConnection;269;0;260;0\nWireConnection;269;1;215;4\nWireConnection;269;3;242;0\nWireConnection;269;4;247;0\nWireConnection;269;6;287;0\nWireConnection;269;7;277;0\nWireConnection;222;0;269;0\nWireConnection;222;1;199;0\nWireConnection;219;0;215;7\nWireConnection;226;0;241;0\nWireConnection;226;1;229;3\nWireConnection;266;0;278;0\nWireConnection;221;0;252;0\nWireConnection;221;1;213;0\nWireConnection;267;0;274;0\nWireConnection;267;1;216;5\nWireConnection;267;3;280;0\nWireConnection;267;4;275;0\nWireConnection;267;6;284;0\nWireConnection;267;7;263;0\nWireConnection;225;0;229;4\nWireConnection;225;1;232;0\nWireConnection;280;0;262;0\nWireConnection;235;0;254;0\nWireConnection;55;0;48;0\nWireConnection;98;0;193;0\nWireConnection;210;0;216;8\nWireConnection;308;0;104;0\nWireConnection;211;0;210;0\nWireConnection;263;0;278;0\nWireConnection;244;0;249;0\nWireConnection;244;1;201;3\nWireConnection;244;3;214;0\nWireConnection;244;4;258;0\nWireConnection;244;6;290;0\nWireConnection;244;7;248;0\nWireConnection;286;0;285;0\nWireConnection;209;0;216;7\nWireConnection;206;0;201;8\nWireConnection;96;0;90;0\nWireConnection;135;0;134;0\nWireConnection;36;2;82;0\nWireConnection;249;0;254;0\nWireConnection;145;0;5;0\nWireConnection;68;0;82;0\nWireConnection;270;0;272;0\nWireConnection;270;1;216;3\nWireConnection;270;3;280;0\nWireConnection;270;4;275;0\nWireConnection;270;6;282;0\nWireConnection;270;7;264;0\nWireConnection;309;2;158;0\nWireConnection;23;0;6;0\nWireConnection;23;1;26;0\nWireConnection;215;1;217;0\nWireConnection;5;0;315;0\nWireConnection;315;0;36;0\nWireConnection;315;1;309;0\nWireConnection;315;2;36;0\nWireConnection;315;3;309;0\nWireConnection;159;0;158;0\nWireConnection;282;0;281;0\nWireConnection;184;0;183;0\nWireConnection;61;0;80;0\nWireConnection;306;0;104;0\nWireConnection;307;0;104;0\nWireConnection;77;0;306;0\nWireConnection;77;1;61;0\nWireConnection;73;0;80;0\nWireConnection;31;0;157;0\nWireConnection;76;0;74;0\nWireConnection;295;0;70;0\nWireConnection;72;0;307;0\nWireConnection;72;1;75;0\nWireConnection;64;0;78;0\nWireConnection;78;0;308;0\nWireConnection;78;1;73;0\nWireConnection;80;0;81;0\nWireConnection;75;0;80;0\nWireConnection;50;0;77;0\nWireConnection;71;0;72;0\nWireConnection;33;0;31;1\nWireConnection;0;0;157;0\nWireConnection;34;0;31;2\nWireConnection;35;0;31;3\nWireConnection;32;0;31;0\nASEEND*/\n//CHKSM=DC3AB08472A21A32907C6A155EB8627E743376BD" + m_functionName: + m_description: Based on "Procedural Stochastic Textures by Tiling and Blending" + by Thomas Deliot and Eric Heitz + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 1 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 12 + m_customNodeCategory: Rust + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Procedural Sample.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Procedural Sample.asset.meta new file mode 100644 index 0000000..060ad5a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Procedural Sample.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f5379ff72769e2b4495e5ce2f004d8d4 +timeCreated: 1602845933 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Projection.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Projection.asset new file mode 100644 index 0000000..7e81b27 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Projection.asset @@ -0,0 +1,39 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Projection + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=18101\n468;180;1104;762;1212.968;431.7589;1.20154;True;False\nNode;AmplifyShaderEditor.DotProductOpNode;1;-592,-80;Inherit;False;2;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0,0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleDivideOpNode;3;-416,-80;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DotProductOpNode;2;-592,96;Inherit;False;2;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0,0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;5;-848,-80;Inherit;False;A;4;0;True;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;4;-256,0;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.FunctionInput;6;-848,16;Inherit;False;B;4;1;True;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.FunctionOutput;0;0,0;Inherit;False;True;-1;Out;0;False;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nWireConnection;1;0;5;0\nWireConnection;1;1;6;0\nWireConnection;3;0;1;0\nWireConnection;3;1;2;0\nWireConnection;2;0;6;0\nWireConnection;2;1;6;0\nWireConnection;4;0;3;0\nWireConnection;4;1;6;0\nWireConnection;0;0;4;0\nASEEND*/\n//CHKSM=B9F0AEDF37A53545406238C555E2DAE90B6FC153" + m_functionName: + m_description: Returns the result of projecting the value of input A onto a straight + line parallel to the value of input B + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 16 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Projection.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Projection.asset.meta new file mode 100644 index 0000000..d34e340 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Projection.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3249e2c8638c9ef4bbd1902a2d38a67c +timeCreated: 1589968069 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Radial Shear.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Radial Shear.asset new file mode 100644 index 0000000..eac209d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Radial Shear.asset @@ -0,0 +1,42 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Radial Shear + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity + Asset Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=17500\n747;81;640;789;142.1275;882.7152;1.3;True;False\nNode;AmplifyShaderEditor.FunctionInput;1;-114,-240.5;Inherit;False;UV;2;0;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionInput;4;816,-48;Inherit;False;Offset;2;3;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.Vector2Node;10;624,-16;Inherit;False;Constant;_Vector2;Vector + 2;0;0;Create;True;0;0;False;0;0,0;0,0;0;3;FLOAT2;0;FLOAT;1;FLOAT;2\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;21;823.5911,-159.5089;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;23;868.5839,-379.9765;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;22;301.9583,-397.5442;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.Vector2Node;9;128,-64;Inherit;False;Constant;_Vector1;Vector + 1;0;0;Create;True;0;0;False;0;10,10;0,0;0;3;FLOAT2;0;FLOAT;1;FLOAT;2\nNode;AmplifyShaderEditor.FunctionInput;3;304,-64;Inherit;False;Strength;2;2;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;16;1024,-224;Inherit;False;3;3;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;2;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionInput;2;-130,-121.5;Inherit;False;Center;2;1;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.Vector2Node;6;-288,-128;Inherit;False;Constant;_Vector0;Vector + 0;0;0;Create;True;0;0;False;0;0.5,0.5;0,0;0;3;FLOAT2;0;FLOAT;1;FLOAT;2\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;11;48,-192;Inherit;False;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.DotProductOpNode;12;272,-207;Inherit;False;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;18;272,-304;Inherit;False;FLOAT2;1;0;FLOAT2;0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.NegateNode;20;533.0646,-334.0239;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DynamicAppendNode;19;684.8169,-283.6713;Inherit;False;FLOAT2;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;15;480,-128;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.TexCoordVertexDataNode;5;-304,-256;Inherit;False;0;2;0;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.FunctionOutput;0;1168,-224;Inherit;True;True;-1;Out;0;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nWireConnection;1;0;5;0\nWireConnection;4;0;10;0\nWireConnection;21;0;19;0\nWireConnection;21;1;15;0\nWireConnection;23;0;22;0\nWireConnection;22;0;1;0\nWireConnection;3;0;9;0\nWireConnection;16;0;23;0\nWireConnection;16;1;21;0\nWireConnection;16;2;4;0\nWireConnection;2;0;6;0\nWireConnection;11;0;1;0\nWireConnection;11;1;2;0\nWireConnection;12;0;11;0\nWireConnection;12;1;11;0\nWireConnection;18;0;11;0\nWireConnection;20;0;18;0\nWireConnection;19;0;18;1\nWireConnection;19;1;20;0\nWireConnection;15;0;12;0\nWireConnection;15;1;3;0\nWireConnection;0;0;16;0\nASEEND*/\n//CHKSM=A89AF2681F84C95F847B2DABF2152AEDA506C9E8" + m_functionName: + m_description: Creates a radial shear warp based on given UVs + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 14 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Radial Shear.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Radial Shear.asset.meta new file mode 100644 index 0000000..ae5f48f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Radial Shear.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c6dc9fc7fa9b08c4d95138f2ae88b526 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/RadialUVDistortion.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/RadialUVDistortion.asset new file mode 100644 index 0000000..ee08750 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/RadialUVDistortion.asset @@ -0,0 +1,37 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: RadialUVDistortion + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=13706\n234;92;1307;805;1057.718;-728.6741;2.742884;True;False\nNode;AmplifyShaderEditor.CommentaryNode;59;277.4049,1612.7;Float;False;1535;395;;11;47;50;53;52;51;48;55;54;58;56;57;Ring + Panner;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;27;-1156.5,-315;Float;False;1765;958;;20;19;12;15;1;11;13;16;18;17;3;5;8;9;10;21;23;24;25;80;81;Normal + map 1 Panner/Size;1,1,1,1;0;0\nNode;AmplifyShaderEditor.CommentaryNode;46;-1152,800;Float;False;1692;591.2493;;13;32;34;39;38;36;33;31;29;70;69;78;79;86;Radial + Math;1,1,1,1;0;0\nNode;AmplifyShaderEditor.PannerNode;18;-218.5,203;Float;False;3;0;FLOAT2;0,0;False;2;FLOAT2;1,0;False;1;FLOAT;1.0;False;1;FLOAT2\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;16;-499.5,260;Float;False;2;2;0;FLOAT;0.0;False;1;FLOAT;0.0;False;1;FLOAT\nNode;AmplifyShaderEditor.ComponentMaskNode;3;-713.5,-240;Float;False;True;False;True;True;1;0;FLOAT2;0,0,0,0;False;1;FLOAT\nNode;AmplifyShaderEditor.DynamicAppendNode;10;16,-80;Float;False;FLOAT2;4;0;FLOAT;0.0;False;1;FLOAT;0.0;False;2;FLOAT;0.0;False;3;FLOAT;0.0;False;1;FLOAT2\nNode;AmplifyShaderEditor.PannerNode;19;-213.5,487;Float;False;3;0;FLOAT2;0,0;False;2;FLOAT2;0,1;False;1;FLOAT;1.0;False;1;FLOAT2\nNode;AmplifyShaderEditor.DynamicAppendNode;24;271.5,348;Float;False;FLOAT2;4;0;FLOAT;0.0;False;1;FLOAT;0.0;False;2;FLOAT;0.0;False;3;FLOAT;0.0;False;1;FLOAT2\nNode;AmplifyShaderEditor.ComponentMaskNode;23;10.5,476;Float;False;False;True;True;True;1;0;FLOAT2;0,0,0,0;False;1;FLOAT\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;17;-518.5,501;Float;False;2;2;0;FLOAT;0.0;False;1;FLOAT;0.0;False;1;FLOAT\nNode;AmplifyShaderEditor.ComponentMaskNode;5;-709.5,65;Float;False;False;True;True;True;1;0;FLOAT2;0,0,0,0;False;1;FLOAT\nNode;AmplifyShaderEditor.ComponentMaskNode;21;-0.5,205;Float;False;True;False;True;True;1;0;FLOAT2;0,0,0,0;False;1;FLOAT\nNode;AmplifyShaderEditor.TextureCoordinatesNode;81;-515.3643,364.2482;Float;False;0;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;FLOAT;FLOAT;FLOAT;FLOAT\nNode;AmplifyShaderEditor.SimpleAddOpNode;25;454.5,190;Float;False;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0.0,0;False;1;FLOAT2\nNode;AmplifyShaderEditor.PannerNode;54;1156.405,1662.7;Float;False;3;0;FLOAT2;0,0;False;2;FLOAT2;1,0;False;1;FLOAT;1.0;False;1;FLOAT2\nNode;AmplifyShaderEditor.PannerNode;55;1151.405,1851.699;Float;False;3;0;FLOAT2;0,0;False;2;FLOAT2;0,1;False;1;FLOAT;1.0;False;1;FLOAT2\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;52;919.5789,1859.739;Float;False;2;2;0;FLOAT;0.0;False;1;FLOAT;0.0;False;1;FLOAT\nNode;AmplifyShaderEditor.TextureCoordinatesNode;80;-490.1459,-126.2656;Float;False;0;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;FLOAT;FLOAT;FLOAT;FLOAT\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;8;-168,-227;Float;False;2;2;0;FLOAT;0.0;False;1;FLOAT;0.0;False;1;FLOAT\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;9;-157,48;Float;False;2;2;0;FLOAT;0.0;False;1;FLOAT;0.0;False;1;FLOAT\nNode;AmplifyShaderEditor.FractNode;38;208,944;Float;False;1;0;FLOAT;0.0;False;1;FLOAT\nNode;AmplifyShaderEditor.FunctionInput;29;-736,960;Float;False;UV + Channel;2;6;False;1;0;FLOAT2;0,0;False;1;FLOAT2\nNode;AmplifyShaderEditor.SimpleDivideOpNode;36;24.17026,866.1562;Float;False;2;0;FLOAT;0.0;False;1;FLOAT;0.0;False;1;FLOAT\nNode;AmplifyShaderEditor.TextureCoordinatesNode;78;-976,1024;Float;False;0;-1;2;3;2;SAMPLER2D;;False;0;FLOAT2;1,1;False;1;FLOAT2;0,0;False;5;FLOAT2;FLOAT;FLOAT;FLOAT;FLOAT\nNode;AmplifyShaderEditor.TauNode;70;-134.649,977.495;Float;False;0;1;FLOAT\nNode;AmplifyShaderEditor.Vector2Node;79;-1136,1040;Float;False;Constant;_Vector1;Vector + 1;0;0;2,2;0;3;FLOAT2;FLOAT;FLOAT\nNode;AmplifyShaderEditor.ATan2OpNode;34;-139.461,862.9785;Float;False;2;0;FLOAT;0.0;False;1;FLOAT;0.0;False;1;FLOAT\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;67;2008.955,1176.914;Float;False;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2\nNode;AmplifyShaderEditor.FunctionInput;47;327.4049,1740.699;Float;False;Ring + panner speed;2;5;False;1;0;FLOAT2;1,1;False;1;FLOAT2\nNode;AmplifyShaderEditor.ComponentMaskNode;63;1601.903,863.11;Float;False;True;True;False;False;1;0;COLOR;0,0,0,0;False;1;FLOAT2\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;64;1860.937,863.1101;Float;False;2;2;0;FLOAT2;0,0;False;1;FLOAT;0,0;False;1;FLOAT2\nNode;AmplifyShaderEditor.ComponentMaskNode;50;572.5789,1870.739;Float;False;False;True;True;True;1;0;FLOAT2;0,0,0,0;False;1;FLOAT\nNode;AmplifyShaderEditor.Vector2Node;69;-750.9933,1135.168;Float;False;Constant;_Vector0;Vector + 0;0;0;1,1;0;3;FLOAT2;FLOAT;FLOAT\nNode;AmplifyShaderEditor.SimpleAddOpNode;66;2122.934,960.8027;Float;False;2;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2\nNode;AmplifyShaderEditor.ComponentMaskNode;57;1396.404,1844.699;Float;False;False;True;True;True;1;0;FLOAT2;0,0;False;1;FLOAT\nNode;AmplifyShaderEditor.WireNode;62;881.3285,841.1897;Float;False;1;0;FLOAT2;0,0;False;1;FLOAT2\nNode;AmplifyShaderEditor.ComponentMaskNode;56;1395.404,1666.7;Float;False;True;False;True;True;1;0;FLOAT2;0,0;False;1;FLOAT\nNode;AmplifyShaderEditor.ComponentMaskNode;48;556.5789,1678.739;Float;False;True;False;True;True;1;0;FLOAT2;0,0,0,0;False;1;FLOAT\nNode;AmplifyShaderEditor.SamplerNode;61;1273.3,858.6689;Float;True;Property;_TextureSample0;Texture + Sample 0;0;0;None;True;0;False;white;Auto;False;Object;-1;Auto;Texture2D;6;0;SAMPLER2D;;False;1;FLOAT2;0,0;False;2;FLOAT;0.0;False;3;FLOAT2;0,0;False;4;FLOAT2;0,0;False;5;FLOAT;1.0;False;5;COLOR;FLOAT;FLOAT;FLOAT;FLOAT\nNode;AmplifyShaderEditor.FunctionInput;11;-1097.5,295;Float;False;Noise + map panner speed;2;2;False;1;0;FLOAT2;0,0;False;1;FLOAT2\nNode;AmplifyShaderEditor.FunctionInput;65;1581.182,996.3248;Float;False;Combined + Noise Map Strength;1;3;False;1;0;FLOAT;1.0;False;1;FLOAT\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;31;-593.5078,943.7484;Float;False;2;0;FLOAT2;0,0;False;1;FLOAT2;0.0,0;False;1;FLOAT2\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;51;929.3787,1738.541;Float;False;2;2;0;FLOAT;0.0;False;1;FLOAT;0.0;False;1;FLOAT\nNode;AmplifyShaderEditor.ComponentMaskNode;33;-384,944;Float;False;False;True;True;True;1;0;FLOAT2;0,0,0,0;False;1;FLOAT\nNode;AmplifyShaderEditor.SimpleTimeNode;15;-773.5,372;Float;False;1;0;FLOAT;1.0;False;1;FLOAT\nNode;AmplifyShaderEditor.DynamicAppendNode;58;1645.404,1804.699;Float;False;FLOAT2;4;0;FLOAT;0.0;False;1;FLOAT;0.0;False;2;FLOAT;0.0;False;3;FLOAT;0.0;False;1;FLOAT2\nNode;AmplifyShaderEditor.FunctionInput;1;-1106.5,-75;Float;False;Noise + map size;2;1;False;1;0;FLOAT2;1,1;False;1;FLOAT2\nNode;AmplifyShaderEditor.SimpleTimeNode;53;652.579,1790.739;Float;False;1;0;FLOAT;1.0;False;1;FLOAT\nNode;AmplifyShaderEditor.DynamicAppendNode;39;339.0049,1105.292;Float;False;FLOAT2;4;0;FLOAT;0.0;False;1;FLOAT;0.0;False;2;FLOAT;0.0;False;3;FLOAT;0.0;False;1;FLOAT2\nNode;AmplifyShaderEditor.ComponentMaskNode;32;-384,864;Float;False;True;False;True;True;1;0;FLOAT2;0,0,0,0;False;1;FLOAT\nNode;AmplifyShaderEditor.FunctionInput;60;974.1886,744.1376;Float;False;Noise + Map;9;0;False;1;0;SAMPLER2D;0.0;False;1;SAMPLER2D\nNode;AmplifyShaderEditor.LengthOpNode;86;-146.1864,1204.794;Float;False;1;0;FLOAT2;0,0,0,0;False;1;FLOAT\nNode;AmplifyShaderEditor.ComponentMaskNode;12;-814,240;Float;False;True;False;True;True;1;0;FLOAT2;0,0,0,0;False;1;FLOAT\nNode;AmplifyShaderEditor.FunctionInput;68;1781.573,1218.733;Float;False;Texture + Coordination;2;4;False;1;0;FLOAT2;1,1;False;1;FLOAT2\nNode;AmplifyShaderEditor.ComponentMaskNode;13;-800,512;Float;False;False;True;True;True;1;0;FLOAT2;0,0;False;1;FLOAT\nNode;AmplifyShaderEditor.FunctionOutput;0;2475.644,909.1371;Float;False;True;UV + Output;0;1;0;FLOAT2;0,0;False;0\nWireConnection;18;0;81;0\nWireConnection;18;1;16;0\nWireConnection;16;0;12;0\nWireConnection;16;1;15;0\nWireConnection;3;0;1;0\nWireConnection;10;0;8;0\nWireConnection;10;1;9;0\nWireConnection;19;0;81;0\nWireConnection;19;1;17;0\nWireConnection;24;0;21;0\nWireConnection;24;1;23;0\nWireConnection;23;0;19;0\nWireConnection;17;0;15;0\nWireConnection;17;1;13;0\nWireConnection;5;0;1;0\nWireConnection;21;0;18;0\nWireConnection;25;0;10;0\nWireConnection;25;1;24;0\nWireConnection;54;0;39;0\nWireConnection;54;1;51;0\nWireConnection;55;0;39;0\nWireConnection;55;1;52;0\nWireConnection;52;0;53;0\nWireConnection;52;1;50;0\nWireConnection;8;0;3;0\nWireConnection;8;1;80;1\nWireConnection;9;0;80;2\nWireConnection;9;1;5;0\nWireConnection;38;0;36;0\nWireConnection;29;0;78;0\nWireConnection;36;0;34;0\nWireConnection;36;1;70;0\nWireConnection;78;0;79;0\nWireConnection;34;0;32;0\nWireConnection;34;1;33;0\nWireConnection;67;0;68;0\nWireConnection;67;1;58;0\nWireConnection;63;0;61;0\nWireConnection;64;0;63;0\nWireConnection;64;1;65;0\nWireConnection;50;0;47;0\nWireConnection;66;0;64;0\nWireConnection;66;1;67;0\nWireConnection;57;0;55;0\nWireConnection;62;0;25;0\nWireConnection;56;0;54;0\nWireConnection;48;0;47;0\nWireConnection;61;0;60;0\nWireConnection;61;1;62;0\nWireConnection;31;0;29;0\nWireConnection;31;1;69;0\nWireConnection;51;0;48;0\nWireConnection;51;1;53;0\nWireConnection;33;0;31;0\nWireConnection;58;0;56;0\nWireConnection;58;1;57;0\nWireConnection;39;0;38;0\nWireConnection;39;1;86;0\nWireConnection;32;0;31;0\nWireConnection;86;0;31;0\nWireConnection;12;0;11;0\nWireConnection;13;0;11;0\nWireConnection;0;0;66;0\nASEEND*/\n//CHKSM=6E93501F5310904D0620611C1184B482F2F90DC7" + m_functionName: + m_description: "Radial UV Distortion originally created by:\nYoeri - Luos_83 - Vleer\r\n + Luos@woodenswordstudios.com" + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_nodeCategory: 3 + m_customNodeCategory: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/RadialUVDistortion.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/RadialUVDistortion.asset.meta new file mode 100644 index 0000000..4c5e3c3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/RadialUVDistortion.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 051d65e7699b41a4c800363fd0e822b2 +timeCreated: 1510748744 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Random Range.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Random Range.asset new file mode 100644 index 0000000..e13bf2b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Random Range.asset @@ -0,0 +1,41 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Random Range + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=17803\n388;132;1046;800;1433.178;491.644;1.608637;True;False\nNode;AmplifyShaderEditor.SinOpNode;6;-544,176;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;8;-640,272;Inherit;False;Constant;_Float0;Float + 0;0;0;Create;True;0;0;False;0;43758.55;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.DotProductOpNode;4;-704,176;Inherit;False;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;1;-928,176;Inherit;False;Seed;2;0;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.Vector2Node;5;-976,256;Inherit;False;Constant;_Vector0;Vector + 0;0;0;Create;True;0;0;False;0;12.9898,78.233;0,0;0;3;FLOAT2;0;FLOAT;1;FLOAT;2\nNode;AmplifyShaderEditor.FunctionInput;3;-256,80;Inherit;False;Max;1;2;False;1;0;FLOAT;1;False;1;FLOAT;0\nNode;AmplifyShaderEditor.LerpOp;10;-64,0;Inherit;False;3;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;2;-256,0;Inherit;False;Min;1;1;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;7;-400,176;Inherit;False;2;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FractNode;9;-256,176;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;0;128,0;Inherit;False;True;-1;Out;0;False;1;0;FLOAT;0;False;1;FLOAT;0\nWireConnection;6;0;4;0\nWireConnection;4;0;1;0\nWireConnection;4;1;5;0\nWireConnection;10;0;2;0\nWireConnection;10;1;3;0\nWireConnection;10;2;9;0\nWireConnection;7;0;6;0\nWireConnection;7;1;8;0\nWireConnection;9;0;7;0\nWireConnection;0;0;10;0\nASEEND*/\n//CHKSM=66CE582F1B0E5425FE558D38A8279477232CEB3A" + m_functionName: + m_description: Returns a pseudo-random number value based on input Seed that is + between the minimum and maximum values defined by inputs Min and Max respectively + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 9 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Random Range.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Random Range.asset.meta new file mode 100644 index 0000000..bfb6cb3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Random Range.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7b754edb8aebbfb4a9ace907af661cfc +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Reconstruct World Position From Depth.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Reconstruct World Position From Depth.asset new file mode 100644 index 0000000..470c293 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Reconstruct World Position From Depth.asset @@ -0,0 +1,52 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Reconstruct World Position From Depth + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity + Asset Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=18810\n-1974;79;1023;876;1214.631;642.8694;1;True;False\nNode;AmplifyShaderEditor.ComponentMaskNode;44;-1216,-480;Inherit;False;True;True;True;False;1;0;FLOAT4;0,0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.CustomExpressionNode;72;-818,-477;Inherit;False;float3 + result = In@$#if !defined(ASE_SRP_VERSION) || ASE_SRP_VERSION <= 70301$result + *= float3(1,1,-1)@$#endif$return result@;3;False;1;True;In;FLOAT3;0,0,0;In;;Inherit;False;InvertDepthDir;True;False;0;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionSwitchByPipeline;74;-545.1306,-416.3694;Inherit;False;4;0;FLOAT3;0,0,0;False;3;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;2;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionNode;67;-2576,-384;Inherit;False;Non + Stereo Screen Pos;-1;;3;1731ee083b93c104880efc701e11b49b;0;1;23;FLOAT4;0,0,0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.ComponentMaskNode;45;-1216,-368;Inherit;False;False;False;False;True;1;0;FLOAT4;0,0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DynamicAppendNode;39;-1936,-384;Inherit;False;FLOAT3;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;1;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;43;-1376,-416;Inherit;False;2;2;0;FLOAT4x4;0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1;False;1;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.StaticSwitch;38;-2208,-208;Float;False;Property;_Keyword0;Keyword + 0;3;0;Fetch;True;0;0;0;False;0;False;0;0;0;False;UNITY_REVERSED_Z;Toggle;2;Key0;Key1;Fetch;False;True;9;1;FLOAT;0;False;0;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.ScaleAndOffsetNode;40;-1776,-384;Inherit;False;3;0;FLOAT3;0,0,0;False;1;FLOAT;2;False;2;FLOAT;-1;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.CustomExpressionNode;75;-764.631,-319.8694;Inherit;False;float3 + result = In@$#if !defined(ASE_SRP_VERSION) || ASE_SRP_VERSION <= 70301 || ASE_SRP_VERSION + == 70503 || ASE_SRP_VERSION >= 80301 $result *= float3(1,1,-1)@$#endif$return + result@;3;False;1;True;In;FLOAT3;0,0,0;In;;Inherit;False;InvertDepthDirURP;True;False;0;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.ScreenDepthNode;69;-2576,-208;Inherit;False;1;False;1;0;FLOAT4;0,0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;64;-2272,-384;Inherit;False;FLOAT2;1;0;FLOAT2;0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.DynamicAppendNode;42;-1552,-384;Inherit;False;FLOAT4;4;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;1;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.ScreenPosInputsNode;70;-2896,-304;Inherit;False;0;False;0;5;FLOAT4;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.OneMinusNode;37;-2368,-144;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMultiplyOpNode;50;-125.0509,-462.7967;Inherit;False;2;2;0;FLOAT4x4;0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1;False;1;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.CameraToWorldMatrix;48;-349.0508,-494.7968;Inherit;False;0;1;FLOAT4x4;0\nNode;AmplifyShaderEditor.DynamicAppendNode;49;-285.0508,-414.7967;Inherit;False;FLOAT4;4;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;1;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.CameraProjectionNode;41;-1664,-480;Inherit;False;unity_CameraInvProjection;0;1;FLOAT4x4;0\nNode;AmplifyShaderEditor.SimpleDivideOpNode;46;-976,-432;Inherit;False;2;0;FLOAT3;0,0,0;False;1;FLOAT;0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.CustomExpressionNode;73;-826.1306,-195.3694;Inherit;False;float3 + result = In@$#if !defined(ASE_SRP_VERSION) || ASE_SRP_VERSION <= 70301 || ASE_SRP_VERSION + == 70503 || ASE_SRP_VERSION >= 80301 $result *= float3(1,1,-1)@$#endif$return + result@;3;False;1;True;In;FLOAT3;0,0,0;In;;Inherit;False;InvertDepthDirHD;True;False;0;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.FunctionOutput;0;68,-460;Inherit;False;True;-1;XYZW;0;False;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nWireConnection;44;0;43;0\nWireConnection;72;0;46;0\nWireConnection;74;0;72;0\nWireConnection;74;3;72;0\nWireConnection;74;1;75;0\nWireConnection;74;2;73;0\nWireConnection;67;23;70;0\nWireConnection;45;0;43;0\nWireConnection;39;0;64;0\nWireConnection;39;1;64;1\nWireConnection;39;2;38;0\nWireConnection;43;0;41;0\nWireConnection;43;1;42;0\nWireConnection;38;1;69;0\nWireConnection;38;0;37;0\nWireConnection;40;0;39;0\nWireConnection;75;0;46;0\nWireConnection;69;0;70;0\nWireConnection;64;0;67;0\nWireConnection;42;0;40;0\nWireConnection;37;0;69;0\nWireConnection;50;0;48;0\nWireConnection;50;1;49;0\nWireConnection;49;0;74;0\nWireConnection;46;0;44;0\nWireConnection;46;1;45;0\nWireConnection;73;0;46;0\nWireConnection;0;0;50;0\nASEEND*/\n//CHKSM=6A4B01665D41BCF1E3EAAF86BFFB414B6783C5E1" + m_functionName: + m_description: Reconstructs world position from the depth of the scene. If depth + is unconnected a default screen depth will be calculated. For best results, zwrite + should be OFF and ztest should be ALWAYS. + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_customEdited: 0 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 9 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Reconstruct World Position From Depth.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Reconstruct World Position From Depth.asset.meta new file mode 100644 index 0000000..1ff88bc --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Reconstruct World Position From Depth.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e7094bcbcc80eb140b2a3dbe6a861de8 +timeCreated: 1507625018 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Rectangle.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Rectangle.asset new file mode 100644 index 0000000..ce3fc58 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Rectangle.asset @@ -0,0 +1,38 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Rectangle + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=17902\n-1462;-64;1004;726;585.2094;505.7291;2.101326;True;False\nNode;AmplifyShaderEditor.FunctionInput;3;-272,80;Inherit;False;Height;1;2;False;1;0;FLOAT;0.5;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;2;-272,0;Inherit;False;Width;1;1;False;1;0;FLOAT;0.5;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DynamicAppendNode;10;-80,0;Inherit;False;FLOAT2;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.ScaleAndOffsetNode;7;-288,-128;Inherit;False;3;0;FLOAT2;0,0;False;1;FLOAT;2;False;2;FLOAT;-1;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.TexCoordVertexDataNode;4;-688,-128;Inherit;False;0;2;0;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.FunctionInput;1;-464,-128;Inherit;False;UV;2;0;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.AbsOpNode;18;-80,-128;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;11;96,-64;Inherit;False;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.BreakToComponentsNode;16;720,-64;Inherit;False;FLOAT2;1;0;FLOAT2;0,0;False;16;FLOAT;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4;FLOAT;5;FLOAT;6;FLOAT;7;FLOAT;8;FLOAT;9;FLOAT;10;FLOAT;11;FLOAT;12;FLOAT;13;FLOAT;14;FLOAT;15\nNode;AmplifyShaderEditor.SimpleMinOpNode;15;960,-64;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SaturateNode;17;1088,-64;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FWidthOpNode;14;272,32;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleDivideOpNode;13;416,-64;Inherit;False;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.OneMinusNode;12;560,-64;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionOutput;0;1248,-64;Inherit;False;True;-1;Out;0;False;1;0;FLOAT;0;False;1;FLOAT;0\nWireConnection;10;0;2;0\nWireConnection;10;1;3;0\nWireConnection;7;0;1;0\nWireConnection;1;0;4;0\nWireConnection;18;0;7;0\nWireConnection;11;0;18;0\nWireConnection;11;1;10;0\nWireConnection;16;0;12;0\nWireConnection;15;0;16;0\nWireConnection;15;1;16;1\nWireConnection;17;0;15;0\nWireConnection;14;0;11;0\nWireConnection;13;0;11;0\nWireConnection;13;1;14;0\nWireConnection;12;0;13;0\nWireConnection;0;0;17;0\nASEEND*/\n//CHKSM=B118B72CF8CE06CB57B6E2BDED3062642C9B7509" + m_functionName: + m_description: Creates a rectangle shape with a specified size + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 9 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Rectangle.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Rectangle.asset.meta new file mode 100644 index 0000000..d285854 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Rectangle.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6b23e0c975270fb4084c354b2c83366a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Rejection.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Rejection.asset new file mode 100644 index 0000000..a90bbeb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Rejection.asset @@ -0,0 +1,41 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Rejection + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=18104\n-1705;-353;1296;693;1041;283.5;1;True;False\nNode;AmplifyShaderEditor.FunctionInput;4;-560,96;Inherit;False;B;4;1;True;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.FunctionInput;3;-560,0;Inherit;False;A;4;0;True;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.FunctionNode;1;-368,80;Inherit;False;Projection;-1;;1;3249e2c8638c9ef4bbd1902a2d38a67c;0;2;5;FLOAT4;0,0,0,0;False;6;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;2;-176,0;Inherit;False;2;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nNode;AmplifyShaderEditor.FunctionOutput;0;0,0;Inherit;False;True;-1;Out;0;False;1;0;FLOAT4;0,0,0,0;False;1;FLOAT4;0\nWireConnection;1;5;3;0\nWireConnection;1;6;4;0\nWireConnection;2;0;3;0\nWireConnection;2;1;1;0\nWireConnection;0;0;2;0\nASEEND*/\n//CHKSM=3BD893037EAFB176DD5A4C61C6A15D4B88CB7106" + m_functionName: + m_description: Returns the result of the projection of the value of input A onto + the plane orthogonal, or perpendicular, to the value of input B. The value of + the rejection vector is equal to the original vector, the value of input A, minus + the value of the Projection of the same inputs + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 16 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Rejection.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Rejection.asset.meta new file mode 100644 index 0000000..6eb73f2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Rejection.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ea6ca936e02c9e74fae837451ff893c3 +timeCreated: 1589968229 +licenseType: Store +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Replace Color.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Replace Color.asset new file mode 100644 index 0000000..243f775 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Replace Color.asset @@ -0,0 +1,46 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Replace Color + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity + Asset Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=17500\n731;73;658;709;498.7031;575.9198;1.332954;True;False\nNode;AmplifyShaderEditor.FunctionSwitch;12;160,-208;Inherit;False;Compare + Alpha;True;0;2;-1;In 0;In 1;Object;-1;9;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;4;FLOAT;0;False;5;FLOAT;0;False;6;FLOAT;0;False;7;FLOAT;0;False;8;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleDivideOpNode;24;603.7781,-62.30967;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SaturateNode;20;752,-64;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.LerpOp;21;959.2881,-109.705;Inherit;True;3;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;2;FLOAT;0;False;1;COLOR;0\nNode;AmplifyShaderEditor.WireNode;23;314.2856,-334.9587;Inherit;False;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.SimpleMaxOpNode;18;432,48;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;19;304,128;Inherit;False;Constant;_Float2;Float + 2;0;0;Create;True;0;0;False;0;1E-05;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;5;288,16;Inherit;False;Fuzziness;1;4;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;10;144,16;Inherit;False;Constant;_Float1;Float + 1;0;0;Create;True;0;0;False;0;0;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;16;416,-160;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.ColorNode;8;528,-432;Inherit;False;Constant;_Color2;Color + 2;0;0;Create;True;0;0;False;0;0,0,0,0;0,0,0,0;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.ColorNode;6;-608,-192;Inherit;False;Constant;_Color0;Color + 0;0;0;Create;True;0;0;False;0;0,0,0,0;0,0,0,0;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.FunctionInput;1;-416,-192;Inherit;False;In;5;0;False;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.FunctionInput;2;-416,0;Inherit;False;From;5;1;False;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.ColorNode;7;-608,0;Inherit;False;Constant;_Color1;Color + 1;0;0;Create;True;0;0;False;0;0,0,0,0;0,0,0,0;True;0;5;COLOR;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.DistanceOpNode;11;-160,-64;Inherit;False;2;0;COLOR;0,0,0,0;False;1;COLOR;0,0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SwizzleNode;14;-176,-176;Inherit;False;FLOAT3;0;1;2;3;1;0;COLOR;0,0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.SwizzleNode;13;-176,-272;Inherit;False;FLOAT3;0;1;2;3;1;0;COLOR;0,0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.DistanceOpNode;15;0,-240;Inherit;False;2;0;FLOAT3;0,0,0;False;1;FLOAT3;0,0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.WireNode;22;-142.4747,-355.8744;Inherit;False;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.RangedFloatNode;9;144,-96;Inherit;False;Constant;_Float0;Float + 0;0;0;Create;True;0;0;False;0;0;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;3;768,-304;Inherit;False;To;5;2;False;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nNode;AmplifyShaderEditor.FunctionInput;4;272,-96;Inherit;False;Range;1;3;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;0;1224.459,-102.2181;Inherit;False;True;-1;Out;0;False;1;0;COLOR;0,0,0,0;False;1;COLOR;0\nWireConnection;12;0;15;0\nWireConnection;12;1;11;0\nWireConnection;24;0;16;0\nWireConnection;24;1;18;0\nWireConnection;20;0;24;0\nWireConnection;21;0;3;0\nWireConnection;21;1;23;0\nWireConnection;21;2;20;0\nWireConnection;23;0;22;0\nWireConnection;18;0;5;0\nWireConnection;18;1;19;0\nWireConnection;5;0;10;0\nWireConnection;16;0;11;0\nWireConnection;16;1;4;0\nWireConnection;1;0;6;0\nWireConnection;2;0;7;0\nWireConnection;11;0;1;0\nWireConnection;11;1;2;0\nWireConnection;14;0;2;0\nWireConnection;13;0;1;0\nWireConnection;15;0;13;0\nWireConnection;15;1;14;0\nWireConnection;22;0;1;0\nWireConnection;3;0;8;0\nWireConnection;4;0;9;0\nWireConnection;0;0;21;0\nASEEND*/\n//CHKSM=6A90827C59AE8E0E59809A229392575842D7BEF8" + m_functionName: + m_description: Replaces colors from given In which are equal to From to color To + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 9 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Replace Color.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Replace Color.asset.meta new file mode 100644 index 0000000..53b47d9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Replace Color.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 896dccb3016c847439def376a728b869 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Rounded Rectangle.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Rounded Rectangle.asset new file mode 100644 index 0000000..9d384bb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Rounded Rectangle.asset @@ -0,0 +1,46 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: Rounded Rectangle + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity + Asset Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=17500\n776;81;858;790;239.8782;396.9632;2.892348;True;False\nNode;AmplifyShaderEditor.FunctionInput;1;616.5462,415.359;Inherit;False;UV;2;0;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.FunctionInput;3;-32,352;Inherit;False;Height;1;2;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.DynamicAppendNode;21;189.5313,424.008;Inherit;False;FLOAT2;4;0;FLOAT;0;False;1;FLOAT;0;False;2;FLOAT;0;False;3;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;23;482.2314,693.308;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleSubtractOpNode;22;1300.805,516.7463;Inherit;False;2;0;FLOAT2;0,0;False;1;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.WireNode;36;1147.975,717.6099;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.GetLocalVarNode;26;1280,640;Inherit;False;25;Radius;1;0;OBJECT;;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleAddOpNode;24;1472,560;Inherit;False;2;2;0;FLOAT2;0,0;False;1;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleMaxOpNode;27;1648,608;Inherit;False;2;0;FLOAT2;0,0;False;1;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.RangedFloatNode;28;1472,688;Inherit;False;Constant;_Float6;Float + 6;0;0;Create;True;0;0;False;0;0;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.LengthOpNode;29;1776,608;Inherit;False;1;0;FLOAT2;0,0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleDivideOpNode;30;1936,624;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.GetLocalVarNode;31;1744,704;Inherit;False;25;Radius;1;0;OBJECT;;False;1;FLOAT;0\nNode;AmplifyShaderEditor.OneMinusNode;32;2096,576;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FWidthOpNode;34;2096,704;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleDivideOpNode;33;2288,608;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;7;-192,352;Inherit;False;Constant;_Float1;Float + 1;0;0;Create;True;0;0;False;0;0.5;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.SaturateNode;35;2416,624;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;6;-176,240;Inherit;False;Constant;_Float0;Float + 0;0;0;Create;True;0;0;False;0;0.5;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;8;-256,96;Inherit;False;Constant;_Float2;Float + 2;0;0;Create;True;0;0;False;0;0.1;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.TexCoordVertexDataNode;5;427.5291,412.736;Inherit;False;0;2;0;5;FLOAT2;0;FLOAT;1;FLOAT;2;FLOAT;3;FLOAT;4\nNode;AmplifyShaderEditor.RangedFloatNode;18;624,496;Inherit;False;Constant;_Float4;Float + 4;0;0;Create;True;0;0;False;0;2;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;19;640,592;Inherit;False;Constant;_Float5;Float + 5;0;0;Create;True;0;0;False;0;-1;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.ScaleAndOffsetNode;17;800,448;Inherit;False;3;0;FLOAT2;0,0;False;1;FLOAT;1;False;2;FLOAT;0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.AbsOpNode;20;1014.086,440.2351;Inherit;True;1;0;FLOAT2;0,0;False;1;FLOAT2;0\nNode;AmplifyShaderEditor.SimpleMinOpNode;11;288,128;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.AbsOpNode;12;160,208;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.AbsOpNode;13;240,320;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMinOpNode;14;448,192;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.SimpleMaxOpNode;15;624,224;Inherit;False;2;0;FLOAT;0;False;1;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.RangedFloatNode;16;464,320;Inherit;False;Constant;_Float3;Float + 3;0;0;Create;True;0;0;False;0;1E-05;0;0;0;0;1;FLOAT;0\nNode;AmplifyShaderEditor.RegisterLocalVarNode;25;784,272;Inherit;False;Radius;-1;True;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.AbsOpNode;9;160,96;Inherit;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;4;-112,96;Inherit;False;Radius;1;3;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.ScaleNode;10;16,96;Inherit;False;2;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;2;-32,240;Inherit;False;Width;1;1;False;1;0;FLOAT;0;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionOutput;0;2544,624;Inherit;False;True;-1;Out;0;False;1;0;FLOAT;0;False;1;FLOAT;0\nWireConnection;1;0;5;0\nWireConnection;3;0;7;0\nWireConnection;21;0;2;0\nWireConnection;21;1;3;0\nWireConnection;23;0;21;0\nWireConnection;22;0;20;0\nWireConnection;22;1;36;0\nWireConnection;36;0;23;0\nWireConnection;24;0;22;0\nWireConnection;24;1;26;0\nWireConnection;27;0;24;0\nWireConnection;27;1;28;0\nWireConnection;29;0;27;0\nWireConnection;30;0;29;0\nWireConnection;30;1;31;0\nWireConnection;32;0;30;0\nWireConnection;34;0;30;0\nWireConnection;33;0;32;0\nWireConnection;33;1;34;0\nWireConnection;35;0;33;0\nWireConnection;17;0;1;0\nWireConnection;17;1;18;0\nWireConnection;17;2;19;0\nWireConnection;20;0;17;0\nWireConnection;11;0;9;0\nWireConnection;11;1;12;0\nWireConnection;12;0;2;0\nWireConnection;13;0;3;0\nWireConnection;14;0;11;0\nWireConnection;14;1;13;0\nWireConnection;15;0;14;0\nWireConnection;15;1;16;0\nWireConnection;25;0;15;0\nWireConnection;9;0;10;0\nWireConnection;4;0;8;0\nWireConnection;10;0;4;0\nWireConnection;2;0;6;0\nWireConnection;0;0;35;0\nASEEND*/\n//CHKSM=6DC878F2DF725F7361203E76F473DF65D786CAD0" + m_functionName: + m_description: Creates a round rectangle shape from a given size and radius + m_additionalIncludes: + m_additionalIncludes: [] + m_outsideIncludes: [] + m_additionalPragmas: + m_additionalPragmas: [] + m_outsidePragmas: [] + m_additionalDirectives: + m_validData: 0 + m_isDirty: 0 + m_moduleName: ' Additional Directives' + m_independentModule: 1 + m_additionalDirectives: [] + m_shaderFunctionDirectives: [] + m_nativeDirectives: [] + m_nativeDirectivesIndex: -1 + m_nativeDirectivesFoldout: 0 + m_directivesSaveItems: [] + m_nodeCategory: 9 + m_customNodeCategory: + m_previewPosition: 0 + m_hidden: 0 diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Rounded Rectangle.asset.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Rounded Rectangle.asset.meta new file mode 100644 index 0000000..01c3ee8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/Rounded Rectangle.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8679f72f5be758f47babb3ba1d5f51d3 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/SRP Additional Light.asset b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/SRP Additional Light.asset new file mode 100644 index 0000000..a8a58be --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/ShaderFunctions/SRP Additional Light.asset @@ -0,0 +1,79 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 78b2425a2284af743826c689403a4924, type: 3} + m_Name: SRP Additional Light + m_EditorClassIdentifier: + m_functionInfo: "// Made with Amplify Shader Editor\n// Available at the Unity Asset + Store - http://u3d.as/y3X \n/*ASEBEGIN\nVersion=17503\n385;373;1413;749;2027.142;507.6773;1.942238;True;False\nNode;AmplifyShaderEditor.FunctionInput;14;-736,368;Inherit;False;Specular + Color;3;3;False;1;0;FLOAT3;1,1,1;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.WorldNormalVector;12;-1116,127;Inherit;False;False;1;0;FLOAT3;0,0,1;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3\nNode;AmplifyShaderEditor.WorldNormalVector;4;-1312,288;Inherit;False;False;1;0;FLOAT3;0,0,1;False;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3\nNode;AmplifyShaderEditor.Vector3Node;10;-1472,128;Inherit;False;Constant;_Vector0;Vector + 0;0;0;Create;True;0;0;False;0;0,0,1;0,0,0;0;4;FLOAT3;0;FLOAT;1;FLOAT;2;FLOAT;3\nNode;AmplifyShaderEditor.FunctionInput;18;-736,448;Inherit;False;Smoothness;1;4;False;1;0;FLOAT;0.5;False;1;FLOAT;0\nNode;AmplifyShaderEditor.FunctionInput;15;-736,272;Inherit;False;View + Dir;3;2;False;1;0;FLOAT3;0,0,0;False;1;FLOAT3;0\nNode;AmplifyShaderEditor.CustomExpressionNode;22;-496,208;Inherit;False;float3 + Color = 0@$#ifdef _ADDITIONAL_LIGHTS$int numLights = GetAdditionalLightsCount()@$for(int + i = 0@ i= 1 ) + return lerp( l4, m4, zoomLerp ); + else if ( i.color.a >= 0.75 ) + return lerp( l3, m3, zoomLerp ); + else if ( i.color.a >= 0.5 ) + return lerp( l2, m2, zoomLerp ); + else + return l1; + } + ENDCG + } + } +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Shaders/Unlit-ColoredAlpha.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Shaders/Unlit-ColoredAlpha.shader.meta new file mode 100644 index 0000000..528ef29 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Shaders/Unlit-ColoredAlpha.shader.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 50fc796413bac8b40aff70fb5a886273 +timeCreated: 1491397480 +licenseType: Store +ShaderImporter: + defaultTextures: + - _MainTex: {fileID: 2800000, guid: 02f71419854c0d845a930c9e0a0bf775, type: 3} + - _SecondTex: {fileID: 2800000, guid: 03a7d169469c1af41bb03241a7b7e23d, type: 3} + - _ThirdTex: {fileID: 2800000, guid: c3512c25766a40245ac94c6b1722d76e, type: 3} + - _FourthTex: {fileID: 2800000, guid: e0f922c44762291498cc62e0917609be, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates.meta new file mode 100644 index 0000000..f5784b7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 211faf49d0bea6c4081e4e1135d19686 +folderAsset: yes +timeCreated: 1481126944 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/CustomRTTemplates.unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/CustomRTTemplates.unitypackage.meta new file mode 100644 index 0000000..0ca30b9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/CustomRTTemplates.unitypackage.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 191365b4aece81443875ae2bb7243b55 +timeCreated: 1539791396 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/HDSRPTemplates.unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/HDSRPTemplates.unitypackage.meta new file mode 100644 index 0000000..f46c626 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/HDSRPTemplates.unitypackage.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9a5e61a8b3421b944863d0946e32da0a +timeCreated: 1531836588 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/LWSRPTemplates.unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/LWSRPTemplates.unitypackage.meta new file mode 100644 index 0000000..89ca7fe --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/LWSRPTemplates.unitypackage.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4c816894a3147d343891060451241bfe +timeCreated: 1520621352 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy.meta new file mode 100644 index 0000000..55a974e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6e848a1cd56b4c4489af03626db2de58 +folderAsset: yes +timeCreated: 1527085590 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/DefaultUnlit.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/DefaultUnlit.shader new file mode 100644 index 0000000..3af44f2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/DefaultUnlit.shader @@ -0,0 +1,86 @@ +Shader /*ase_name*/ "Hidden/Templates/Legacy/DefaultUnlit" /*end*/ +{ + Properties + { + _MainTex ("Sprite Texture", 2D) = "white" {} + _Color ("Tint", Color) = (1,1,1,1) + /*ase_props*/ + } + + SubShader + { + Tags { "RenderType"="Opaque" } + LOD 100 + Cull Off + + /*ase_pass*/ + Pass + { + CGPROGRAM + #ifndef UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX + //only defining to not throw compilation error over Unity 5.5 + #define UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input) + #endif + + #pragma target 3.0 + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + /*ase_pragma*/ + + struct appdata + { + float4 vertex : POSITION; + float4 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + UNITY_VERTEX_INPUT_INSTANCE_ID + /*ase_vdata:p=p;uv0=tc0.xy;uv1=tc1.xy*/ + }; + + struct v2f + { + float4 vertex : SV_POSITION; + float4 texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + /*ase_interp(1,):sp=sp.xyzw;uv0=tc0.xy;uv1=tc0.zw*/ + }; + + uniform sampler2D _MainTex; + uniform fixed4 _Color; + /*ase_globals*/ + + v2f vert ( appdata v /*ase_vert_input*/) + { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.texcoord.xy = v.texcoord.xy; + o.texcoord.zw = v.texcoord1.xy; + + // ase common template code + /*ase_vert_code:v=appdata;o=v2f*/ + + v.vertex.xyz += /*ase_vert_out:Local Vertex;Float3*/ float3(0,0,0) /*end*/; + o.vertex = UnityObjectToClipPos(v.vertex); + return o; + } + + fixed4 frag (v2f i /*ase_frag_input*/) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + + fixed4 myColorVar; + // ase common template code + /*ase_frag_code:i=v2f*/ + + myColorVar = /*ase_frag_out:Frag Color;Float4*/fixed4(1,0,0,1)/*end*/; + return myColorVar; + } + ENDCG + } + } + CustomEditor "ASEMaterialInspector" +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/DefaultUnlit.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/DefaultUnlit.shader.meta new file mode 100644 index 0000000..0548163 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/DefaultUnlit.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6e114a916ca3e4b4bb51972669d463bf +timeCreated: 1496328687 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/Lit.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/Lit.shader new file mode 100644 index 0000000..eed3b73 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/Lit.shader @@ -0,0 +1,2302 @@ +Shader /*ase_name*/ "Hidden/Legacy/Lit" /*end*/ +{ + Properties + { + /*ase_props*/ + //_TransmissionShadow( "Transmission Shadow", Range( 0, 1 ) ) = 0.5 + //_TransStrength( "Trans Strength", Range( 0, 50 ) ) = 1 + //_TransNormal( "Trans Normal Distortion", Range( 0, 1 ) ) = 0.5 + //_TransScattering( "Trans Scattering", Range( 1, 50 ) ) = 2 + //_TransDirect( "Trans Direct", Range( 0, 1 ) ) = 0.9 + //_TransAmbient( "Trans Ambient", Range( 0, 1 ) ) = 0.1 + //_TransShadow( "Trans Shadow", Range( 0, 1 ) ) = 0.5 + //_TessPhongStrength( "Tess Phong Strength", Range( 0, 1 ) ) = 0.5 + //_TessValue( "Tess Max Tessellation", Range( 1, 32 ) ) = 16 + //_TessMin( "Tess Min Distance", Float ) = 10 + //_TessMax( "Tess Max Distance", Float ) = 25 + //_TessEdgeLength ( "Tess Edge length", Range( 2, 50 ) ) = 16 + //_TessMaxDisp( "Tess Max Displacement", Float ) = 25 + //_SpecularHighlights("Specular Highlights", Float) = 1.0 + //_GlossyReflections("Reflections", Float) = 1.0 + } + + SubShader + { + /*ase_subshader_options:Name=Additional Options + Option:Workflow,InvertActionOnDeselection:Specular,Metallic:Metallic + Metallic:ShowPort:Metallic + Specular:ShowPort:Specular + Specular:SetDefine:_SPECULAR_SETUP 1 + Option:Surface:Opaque,Transparent:Opaque + Opaque:SetPropertyOnSubShader:RenderType,Opaque + Opaque:SetPropertyOnSubShader:RenderQueue,Geometry + Opaque:SetPropertyOnSubShader:ZWrite,On + Opaque:HideOption: Blend + Opaque:HideOption: Dither Shadows + Opaque:HideOption: Refraction Model + Transparent:SetPropertyOnSubShader:RenderType,Transparent + Transparent:SetPropertyOnSubShader:RenderQueue,Transparent + Transparent:SetPropertyOnSubShader:ZWrite,Off + Transparent:ShowOption: Blend + Transparent:ShowOption: Dither Shadows + Transparent:ShowOption: Refraction Model + Option: Blend:Alpha,Premultiply,Additive,Multiply,Translucent,Custom:Alpha + Alpha:SetPropertyOnPass:ForwardBase:BlendRGB,SrcAlpha,OneMinusSrcAlpha + Alpha:SetPropertyOnPass:ForwardAdd:BlendRGB,SrcAlpha,One + Alpha:SetDefine:_ALPHABLEND_ON 1 + Premultiply:SetPropertyOnPass:ForwardBase:BlendRGB,One,OneMinusSrcAlpha + disable,Premultiply,Additive,Multiply,Translucent,Custom:SetPropertyOnPass:ForwardAdd:BlendRGB,One,One + Premultiply:SetDefine:_ALPHAPREMULTIPLY_ON 1 + Additive:SetPropertyOnPass:ForwardBase:BlendRGB,One,One + Multiply:SetPropertyOnPass:ForwardBase:BlendRGB,DstColor,Zero + disable,Premultiply,Additive,Multiply,Translucent,Custom:RemoveDefine:_ALPHABLEND_ON 1 + disable,Alpha,Additive,Multiply,Translucent,Custom:RemoveDefine:_ALPHAPREMULTIPLY_ON 1 + disable,Translucent:SetPropertyOnPass:ForwardBase:BlendRGB,One,Zero + Option: Refraction Model:None:None + None,disable:HidePort:ForwardBase:Refraction Index + None,disable:HidePort:ForwardBase:Refraction Color + None,disable:RemoveDefine:_REFRACTION_ASE 1 + None,disable:RemoveDefine:ASE_NEEDS_FRAG_SCREEN_POSITION + Legacy:ShowPort:ForwardBase:Refraction Index + Legacy:ShowPort:ForwardBase:Refraction Color + Legacy:SetDefine:_REFRACTION_ASE 1 + Legacy:SetDefine:ASE_NEEDS_FRAG_SCREEN_POSITION + Option: Dither Shadows:false,true:true + true:SetDefine:UNITY_STANDARD_USE_DITHER_MASK 1 + false,disable:RemoveDefine:UNITY_STANDARD_USE_DITHER_MASK 1 + Option:Two Sided:On,Cull Back,Cull Front:Cull Back + On:SetPropertyOnSubShader:CullMode,Off + Cull Back:SetPropertyOnSubShader:CullMode,Back + Cull Front:SetPropertyOnSubShader:CullMode,Front + Option:Deferred Pass:false,true:true + true:IncludePass:Deferred + false:ExcludePass:Deferred + Option:Transmission:false,true:false + false:RemoveDefine:_TRANSMISSION_ASE 1 + false:HidePort:ForwardBase:Transmission + false:HideOption: Transmission Shadow + true:SetDefine:_TRANSMISSION_ASE 1 + true:ShowPort:ForwardBase:Transmission + true:ShowOption: Transmission Shadow + true:SetOption:Deferred Pass,0 + Field: Transmission Shadow:Float:0.5:0:1:_TransmissionShadow + Change:SetMaterialProperty:_TransmissionShadow + Change:SetShaderProperty:_TransmissionShadow,_TransmissionShadow( "Transmission Shadow", Range( 0, 1 ) ) = 0.5 + Inline,disable:SetShaderProperty:_TransmissionShadow,//_TransmissionShadow( "Transmission Shadow", Range( 0, 1 ) ) = 0.5 + Option:Translucency:false,true:false + false:RemoveDefine:_TRANSLUCENCY_ASE 1 + false:HidePort:ForwardBase:Translucency + false:HideOption: Translucency Strength + false:HideOption: Normal Distortion + false:HideOption: Scattering + false:HideOption: Direct + false:HideOption: Ambient + false:HideOption: Shadow + true:SetDefine:_TRANSLUCENCY_ASE 1 + true:ShowPort:ForwardBase:Translucency + true:ShowOption: Translucency Strength + true:ShowOption: Normal Distortion + true:ShowOption: Scattering + true:ShowOption: Direct + true:ShowOption: Ambient + true:ShowOption: Shadow + true:SetOption:Deferred Pass,0 + Field: Translucency Strength:Float:1:0:50:_TransStrength + Change:SetMaterialProperty:_TransStrength + Change:SetShaderProperty:_TransStrength,_TransStrength( "Strength", Range( 0, 50 ) ) = 1 + Inline,disable:SetShaderProperty:_TransStrength,//_TransStrength( "Strength", Range( 0, 50 ) ) = 1 + Field: Normal Distortion:Float:0.5:0:1:_TransNormal + Change:SetMaterialProperty:_TransNormal + Change:SetShaderProperty:_TransNormal,_TransNormal( "Normal Distortion", Range( 0, 1 ) ) = 0.5 + Inline,disable:SetShaderProperty:_TransNormal,//_TransNormal( "Normal Distortion", Range( 0, 1 ) ) = 0.5 + Field: Scattering:Float:2:1:50:_TransScattering + Change:SetMaterialProperty:_TransScattering + Change:SetShaderProperty:_TransScattering,_TransScattering( "Scattering", Range( 1, 50 ) ) = 2 + Inline,disable:SetShaderProperty:_TransScattering,//_TransScattering( "Scattering", Range( 1, 50 ) ) = 2 + Field: Direct:Float:0.9:0:1:_TransDirect + Change:SetMaterialProperty:_TransDirect + Change:SetShaderProperty:_TransDirect,_TransDirect( "Direct", Range( 0, 1 ) ) = 0.9 + Inline,disable:SetShaderProperty:_TransDirect,//_TransDirect( "Direct", Range( 0, 1 ) ) = 0.9 + Field: Ambient:Float:0.1:0:1:_TransAmbient + Change:SetMaterialProperty:_TransAmbient + Change:SetShaderProperty:_TransAmbient,_TransAmbient( "Ambient", Range( 0, 1 ) ) = 0.1 + Inline,disable:SetShaderProperty:_TransAmbient,//_TransAmbient( "Ambient", Range( 0, 1 ) ) = 0.1 + Field: Shadow:Float:0.5:0:1:_TransShadow + Change:SetMaterialProperty:_TransShadow + Change:SetShaderProperty:_TransShadow,_TransShadow( "Shadow", Range( 0, 1 ) ) = 0.5 + Inline,disable:SetShaderProperty:_TransShadow,//_TransShadow( "Shadow", Range( 0, 1 ) ) = 0.5 + Option:Cast Shadows:false,true:true + true:IncludePass:ShadowCaster + false,disable:ExcludePass:ShadowCaster + true:ShowOption: Use Shadow Threshold + false:HideOption: Use Shadow Threshold + Option: Use Shadow Threshold:false,true:false + true:ShowPort:ForwardBase:Alpha Clip Threshold Shadow + false,disable:HidePort:ForwardBase:Alpha Clip Threshold Shadow + Option:Receive Shadows:false,true:true + true:SetDefine:ASE_NEEDS_FRAG_SHADOWCOORDS + false:RemoveDefine:ASE_NEEDS_FRAG_SHADOWCOORDS + Option:GPU Instancing:false,true:true + true:SetDefine:pragma multi_compile_instancing + false:RemoveDefine:pragma multi_compile_instancing + Option:LOD CrossFade:false,true:true + true:SetDefine:pragma multi_compile __ LOD_FADE_CROSSFADE + false:RemoveDefine:pragma multi_compile __ LOD_FADE_CROSSFADE + Option:Built-in Fog:false,true:true + true:SetDefine:pragma multi_compile_fog + false:RemoveDefine:pragma multi_compile_fog + true:SetDefine:ASE_FOG 1 + false:RemoveDefine:ASE_FOG 1 + Option:Ambient Light:false,true:true + true:RemoveDefine:ASE_NO_AMBIENT 1 + false:SetDefine:ASE_NO_AMBIENT 1 + Option:Meta Pass:false,true:true + true:IncludePass:Meta + false,disable:ExcludePass:Meta + Option:Add Pass:false,true:true + true:IncludePass:ForwardAdd + false,disable:ExcludePass:ForwardAdd + Option:Override Baked GI:false,true:false + true:ShowPort:ForwardBase:Baked GI + false:HidePort:ForwardBase:Baked GI + true:SetDefine:ASE_BAKEDGI 1 + false:RemoveDefine:ASE_BAKEDGI 1 + Option:Extra Pre Pass:false,true:false + true:IncludePass:ExtraPrePass + false,disable:ExcludePass:ExtraPrePass + Option:Tessellation:false,true:false + true:SetDefine:TESSELLATION_ON 1 + true:SetDefine:pragma require tessellation tessHW + true:SetDefine:pragma hull HullFunction + true:SetDefine:pragma domain DomainFunction + true:ShowOption: Phong + true:ShowOption: Type + false,disable:RemoveDefine:TESSELLATION_ON 1 + false,disable:RemoveDefine:pragma require tessellation tessHW + false,disable:RemoveDefine:pragma hull HullFunction + false,disable:RemoveDefine:pragma domain DomainFunction + false,disable:HideOption: Phong + false,disable:HideOption: Type + Option: Phong:false,true:false + true:SetDefine:ASE_PHONG_TESSELLATION + false,disable:RemoveDefine:ASE_PHONG_TESSELLATION + true:ShowOption: Strength + false,disable:HideOption: Strength + Field: Strength:Float:0.5:0:1:_TessPhongStrength + Change:SetMaterialProperty:_TessPhongStrength + Change:SetShaderProperty:_TessPhongStrength,_TessPhongStrength( "Phong Tess Strength", Range( 0, 1 ) ) = 0.5 + Inline,disable:SetShaderProperty:_TessPhongStrength,//_TessPhongStrength( "Phong Tess Strength", Range( 0, 1 ) ) = 0.5 + Option: Type:Fixed,Distance Based,Edge Length,Edge Length Cull:Fixed + Fixed:SetDefine:ASE_FIXED_TESSELLATION + Fixed,Distance Based:ShowOption: Tess + Distance Based:SetDefine:ASE_DISTANCE_TESSELLATION + Distance Based:ShowOption: Min + Distance Based:ShowOption: Max + Edge Length:SetDefine:ASE_LENGTH_TESSELLATION + Edge Length,Edge Length Cull:ShowOption: Edge Length + Edge Length Cull:SetDefine:ASE_LENGTH_CULL_TESSELLATION + Edge Length Cull:ShowOption: Max Displacement + disable,Distance Based,Edge Length,Edge Length Cull:RemoveDefine:ASE_FIXED_TESSELLATION + disable,Fixed,Edge Length,Edge Length Cull:RemoveDefine:ASE_DISTANCE_TESSELLATION + disable,Fixed,Distance Based,Edge Length Cull:RemoveDefine:ASE_LENGTH_TESSELLATION + disable,Fixed,Distance Based,Edge Length:RemoveDefine:ASE_LENGTH_CULL_TESSELLATION + disable,Edge Length,Edge Length Cull:HideOption: Tess + disable,Fixed,Edge Length,Edge Length Cull:HideOption: Min + disable,Fixed,Edge Length,Edge Length Cull:HideOption: Max + disable,Fixed,Distance Based:HideOption: Edge Length + disable,Fixed,Distance Based,Edge Length:HideOption: Max Displacement + Field: Tess:Float:16:1:32:_TessValue + Change:SetMaterialProperty:_TessValue + Change:SetShaderProperty:_TessValue,_TessValue( "Max Tessellation", Range( 1, 32 ) ) = 16 + Inline,disable:SetShaderProperty:_TessValue,//_TessValue( "Max Tessellation", Range( 1, 32 ) ) = 16 + Field: Min:Float:10:_TessMin + Change:SetMaterialProperty:_TessMin + Change:SetShaderProperty:_TessMin,_TessMin( "Tess Min Distance", Float ) = 10 + Inline,disable:SetShaderProperty:_TessMin,//_TessMin( "Tess Min Distance", Float ) = 10 + Field: Max:Float:25:_TessMax + Change:SetMaterialProperty:_TessMax + Change:SetShaderProperty:_TessMax,_TessMax( "Tess Max Distance", Float ) = 25 + Inline,disable:SetShaderProperty:_TessMax,//_TessMax( "Tess Max Distance", Float ) = 25 + Field: Edge Length:Float:16:2:50:_TessEdgeLength + Change:SetMaterialProperty:_TessEdgeLength + Change:SetShaderProperty:_TessEdgeLength,_TessEdgeLength ( "Edge length", Range( 2, 50 ) ) = 16 + Inline,disable:SetShaderProperty:_TessEdgeLength,//_TessEdgeLength ( "Edge length", Range( 2, 50 ) ) = 16 + Field: Max Displacement:Float:25:_TessMaxDisp + Change:SetMaterialProperty:_TessMaxDisp + Change:SetShaderProperty:_TessMaxDisp,_TessMaxDisp( "Max Displacement", Float ) = 25 + Inline,disable:SetShaderProperty:_TessMaxDisp,//_TessMaxDisp( "Max Displacement", Float ) = 25 + Option:Fwd Specular Highlights Toggle:false,true:false + true:SetShaderProperty:_SpecularHighlights,[ToggleOff] _SpecularHighlights("Specular Highlights", Float) = 1.0 + false:SetShaderProperty:_SpecularHighlights,//[ToggleOff] _SpecularHighlights("Specular Highlights", Float) = 1.0 + true:SetDefine:pragma shader_feature _SPECULARHIGHLIGHTS_OFF + false:RemoveDefine:pragma shader_feature _SPECULARHIGHLIGHTS_OFF + Option:Fwd Reflections Toggle:false,true:false + true:SetShaderProperty:_GlossyReflections,[ToggleOff] _GlossyReflections("Reflections", Float) = 1.0 + false:SetShaderProperty:_GlossyReflections,//[ToggleOff] _GlossyReflections("Reflections", Float) = 1.0 + true:SetDefine:pragma shader_feature _GLOSSYREFLECTIONS_OFF + false:RemoveDefine:pragma shader_feature _GLOSSYREFLECTIONS_OFF + Option:Disable Batching:False,True,LOD Fading:False + False:SetPropertyOnSubShader:DisableBatching,False + True:SetPropertyOnSubShader:DisableBatching,True + LOD Fading:SetPropertyOnSubShader:DisableBatching,LODFading + Option:Vertex Position,InvertActionOnDeselection:Absolute,Relative:Relative + Absolute:SetDefine:ASE_ABSOLUTE_VERTEX_POS 1 + Absolute:SetPortName:ForwardBase:15,Vertex Position + Relative:SetPortName:ForwardBase:15,Vertex Offset + Absolute:SetPortName:ExtraPrePass:3,Vertex Position + Relative:SetPortName:ExtraPrePass:3,Vertex Offset + Port:ForwardBase:Alpha Clip Threshold + On:SetDefine:_ALPHATEST_ON 1 + Port:ForwardBase:Alpha Clip Threshold Shadow + On:SetDefine:_ALPHATEST_SHADOW_ON 1 + */ + Tags{ "RenderType" = "Opaque" "Queue" = "Geometry+0" "DisableBatching" = "False" } + LOD 0 + + Cull Back + AlphaToMask Off + ZWrite On + ZTest LEqual + ColorMask RGBA + /*ase_stencil*/ + /*ase_all_modules*/ + + CGINCLUDE + #pragma target 3.0 + + float4 FixedTess( float tessValue ) + { + return tessValue; + } + + float CalcDistanceTessFactor (float4 vertex, float minDist, float maxDist, float tess, float4x4 o2w, float3 cameraPos ) + { + float3 wpos = mul(o2w,vertex).xyz; + float dist = distance (wpos, cameraPos); + float f = clamp(1.0 - (dist - minDist) / (maxDist - minDist), 0.01, 1.0) * tess; + return f; + } + + float4 CalcTriEdgeTessFactors (float3 triVertexFactors) + { + float4 tess; + tess.x = 0.5 * (triVertexFactors.y + triVertexFactors.z); + tess.y = 0.5 * (triVertexFactors.x + triVertexFactors.z); + tess.z = 0.5 * (triVertexFactors.x + triVertexFactors.y); + tess.w = (triVertexFactors.x + triVertexFactors.y + triVertexFactors.z) / 3.0f; + return tess; + } + + float CalcEdgeTessFactor (float3 wpos0, float3 wpos1, float edgeLen, float3 cameraPos, float4 scParams ) + { + float dist = distance (0.5 * (wpos0+wpos1), cameraPos); + float len = distance(wpos0, wpos1); + float f = max(len * scParams.y / (edgeLen * dist), 1.0); + return f; + } + + float DistanceFromPlane (float3 pos, float4 plane) + { + float d = dot (float4(pos,1.0f), plane); + return d; + } + + bool WorldViewFrustumCull (float3 wpos0, float3 wpos1, float3 wpos2, float cullEps, float4 planes[6] ) + { + float4 planeTest; + planeTest.x = (( DistanceFromPlane(wpos0, planes[0]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[0]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[0]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.y = (( DistanceFromPlane(wpos0, planes[1]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[1]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[1]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.z = (( DistanceFromPlane(wpos0, planes[2]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[2]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[2]) > -cullEps) ? 1.0f : 0.0f ); + planeTest.w = (( DistanceFromPlane(wpos0, planes[3]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos1, planes[3]) > -cullEps) ? 1.0f : 0.0f ) + + (( DistanceFromPlane(wpos2, planes[3]) > -cullEps) ? 1.0f : 0.0f ); + return !all (planeTest); + } + + float4 DistanceBasedTess( float4 v0, float4 v1, float4 v2, float tess, float minDist, float maxDist, float4x4 o2w, float3 cameraPos ) + { + float3 f; + f.x = CalcDistanceTessFactor (v0,minDist,maxDist,tess,o2w,cameraPos); + f.y = CalcDistanceTessFactor (v1,minDist,maxDist,tess,o2w,cameraPos); + f.z = CalcDistanceTessFactor (v2,minDist,maxDist,tess,o2w,cameraPos); + + return CalcTriEdgeTessFactors (f); + } + + float4 EdgeLengthBasedTess( float4 v0, float4 v1, float4 v2, float edgeLength, float4x4 o2w, float3 cameraPos, float4 scParams ) + { + float3 pos0 = mul(o2w,v0).xyz; + float3 pos1 = mul(o2w,v1).xyz; + float3 pos2 = mul(o2w,v2).xyz; + float4 tess; + tess.x = CalcEdgeTessFactor (pos1, pos2, edgeLength, cameraPos, scParams); + tess.y = CalcEdgeTessFactor (pos2, pos0, edgeLength, cameraPos, scParams); + tess.z = CalcEdgeTessFactor (pos0, pos1, edgeLength, cameraPos, scParams); + tess.w = (tess.x + tess.y + tess.z) / 3.0f; + return tess; + } + + float4 EdgeLengthBasedTessCull( float4 v0, float4 v1, float4 v2, float edgeLength, float maxDisplacement, float4x4 o2w, float3 cameraPos, float4 scParams, float4 planes[6] ) + { + float3 pos0 = mul(o2w,v0).xyz; + float3 pos1 = mul(o2w,v1).xyz; + float3 pos2 = mul(o2w,v2).xyz; + float4 tess; + + if (WorldViewFrustumCull(pos0, pos1, pos2, maxDisplacement, planes)) + { + tess = 0.0f; + } + else + { + tess.x = CalcEdgeTessFactor (pos1, pos2, edgeLength, cameraPos, scParams); + tess.y = CalcEdgeTessFactor (pos2, pos0, edgeLength, cameraPos, scParams); + tess.z = CalcEdgeTessFactor (pos0, pos1, edgeLength, cameraPos, scParams); + tess.w = (tess.x + tess.y + tess.z) / 3.0f; + } + return tess; + } + ENDCG + + /*ase_pass*/ + Pass + { + Name "ExtraPrePass" + Tags { "LightMode" = "ForwardBase" } + + Blend One Zero + Cull Back + ZWrite On + ZTest LEqual + Offset 0,0 + ColorMask RGBA + /*ase_stencil*/ + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile_fwdbase + #ifndef UNITY_PASS_FORWARDBASE + #define UNITY_PASS_FORWARDBASE + #endif + #include "HLSLSupport.cginc" + #ifndef UNITY_INSTANCED_LOD_FADE + #define UNITY_INSTANCED_LOD_FADE + #endif + #ifndef UNITY_INSTANCED_SH + #define UNITY_INSTANCED_SH + #endif + #ifndef UNITY_INSTANCED_LIGHTMAPSTS + #define UNITY_INSTANCED_LIGHTMAPSTS + #endif + #include "UnityShaderVariables.cginc" + #include "UnityCG.cginc" + #include "Lighting.cginc" + #include "UnityPBSLighting.cginc" + #include "AutoLight.cginc" + + /*ase_pragma*/ + struct appdata { + float4 vertex : POSITION; + float4 tangent : TANGENT; + float3 normal : NORMAL; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + /*ase_vdata:p=p;t=t;n=n;uv1=tc1.xyzw;uv2=tc2.xyzw*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct v2f { + #if UNITY_VERSION >= 201810 + UNITY_POSITION(pos); + #else + float4 pos : SV_POSITION; + #endif + #if defined(UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS) && UNITY_VERSION >= 201810 && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + UNITY_LIGHTING_COORDS(2,3) + #elif defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if UNITY_VERSION >= 201710 + UNITY_SHADOW_COORDS(2) + #else + SHADOW_COORDS(2) + #endif + #endif + #ifdef ASE_FOG + UNITY_FOG_COORDS(4) + #endif + float4 tSpace0 : TEXCOORD5; + float4 tSpace1 : TEXCOORD6; + float4 tSpace2 : TEXCOORD7; + /*ase_interp(8,):sp=sp.xyzw;sc=tc2;wn.xyz=tc5.xyz;wt.xyz=tc6.xyz;wbt.xyz=tc7.xyz;wp.x=tc5.w;wp.y=tc6.w;wp.z=tc7.w*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + /*ase_globals*/ + + /*ase_funcs*/ + + v2f VertexFunction (appdata v /*ase_vert_input*/ ) { + UNITY_SETUP_INSTANCE_ID(v); + v2f o; + UNITY_INITIALIZE_OUTPUT(v2f,o); + UNITY_TRANSFER_INSTANCE_ID(v,o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + /*ase_vert_code:v=appdata;o=v2f*/ + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = /*ase_vert_out:Vertex Offset;Float3;3;-1;_VertexP*/defaultVertexValue/*end*/; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.vertex.w = 1; + v.normal = /*ase_vert_out:Vertex Normal;Float3;4;-1;_VertexNormalP*/v.normal/*end*/; + v.tangent = /*ase_vert_out:Vertex Tangent;Float4;5;-1;_VertexTangentP*/v.tangent/*end*/; + + o.pos = UnityObjectToClipPos(v.vertex); + float3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz; + fixed3 worldNormal = UnityObjectToWorldNormal(v.normal); + fixed3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz); + fixed tangentSign = v.tangent.w * unity_WorldTransformParams.w; + fixed3 worldBinormal = cross(worldNormal, worldTangent) * tangentSign; + o.tSpace0 = float4(worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x); + o.tSpace1 = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y); + o.tSpace2 = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z); + + #if UNITY_VERSION >= 201810 && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + UNITY_TRANSFER_LIGHTING(o, v.texcoord1.xy); + #elif defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if UNITY_VERSION >= 201710 + UNITY_TRANSFER_SHADOW(o, v.texcoord1.xy); + #else + TRANSFER_SHADOW(o); + #endif + #endif + + #ifdef ASE_FOG + UNITY_TRANSFER_FOG(o,o.pos); + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float4 tangent : TANGENT; + float3 normal : NORMAL; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + /*ase_vcontrol*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( appdata v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.tangent = v.tangent; + o.normal = v.normal; + o.texcoord1 = v.texcoord1; + o.texcoord2 = v.texcoord2; + /*ase_control_code:v=appdata;o=VertexControl*/ + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = /*ase_inline_begin*/_TessValue/*ase_inline_end*/; float tessMin = /*ase_inline_begin*/_TessMin/*ase_inline_end*/; float tessMax = /*ase_inline_begin*/_TessMax/*ase_inline_end*/; + float edgeLength = /*ase_inline_begin*/_TessEdgeLength/*ase_inline_end*/; float tessMaxDisp = /*ase_inline_begin*/_TessMaxDisp/*ase_inline_end*/; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, UNITY_MATRIX_M, _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, UNITY_MATRIX_M, _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, UNITY_MATRIX_M, _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + v2f DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + appdata o = (appdata) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.tangent = patch[0].tangent * bary.x + patch[1].tangent * bary.y + patch[2].tangent * bary.z; + o.normal = patch[0].normal * bary.x + patch[1].normal * bary.y + patch[2].normal * bary.z; + o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z; + o.texcoord2 = patch[0].texcoord2 * bary.x + patch[1].texcoord2 * bary.y + patch[2].texcoord2 * bary.z; + /*ase_domain_code:patch=VertexControl;o=appdata;bary=SV_DomainLocation*/ + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].normal * (dot(o.vertex.xyz, patch[i].normal) - dot(patch[i].vertex.xyz, patch[i].normal)); + float phongStrength = /*ase_inline_begin*/_TessPhongStrength/*ase_inline_end*/; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + v2f vert ( appdata v ) + { + return VertexFunction( v ); + } + #endif + + fixed4 frag (v2f IN /*ase_frag_input*/ + #ifdef _DEPTHOFFSET_ON + , out float outputDepth : SV_Depth + #endif + ) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(IN); + + #ifdef LOD_FADE_CROSSFADE + UNITY_APPLY_DITHER_CROSSFADE(IN.pos.xy); + #endif + + #if defined(_SPECULAR_SETUP) + SurfaceOutputStandardSpecular o = (SurfaceOutputStandardSpecular)0; + #else + SurfaceOutputStandard o = (SurfaceOutputStandard)0; + #endif + /*ase_local_var:wt*/float3 WorldTangent = float3(IN.tSpace0.x,IN.tSpace1.x,IN.tSpace2.x); + /*ase_local_var:wbt*/float3 WorldBiTangent = float3(IN.tSpace0.y,IN.tSpace1.y,IN.tSpace2.y); + /*ase_local_var:wn*/float3 WorldNormal = float3(IN.tSpace0.z,IN.tSpace1.z,IN.tSpace2.z); + /*ase_local_var:wp*/float3 worldPos = float3(IN.tSpace0.w,IN.tSpace1.w,IN.tSpace2.w); + /*ase_local_var:wvd*/float3 worldViewDir = normalize(UnityWorldSpaceViewDir(worldPos)); + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + UNITY_LIGHT_ATTENUATION(atten, IN, worldPos) + #else + /*ase_local_var:sc*/half atten = 1; + #endif + + /*ase_frag_code:IN=v2f*/ + float3 Color = /*ase_frag_out:Color;Float3;0;-1;_ColorP*/fixed3( 0, 0, 0 )/*end*/; + float Alpha = /*ase_frag_out:Alpha;Float;1;-1;_AlphaP*/1/*end*/; + float AlphaClipThreshold = /*ase_frag_out:Alpha Clip Threshold;Float;2;-1;_AlphaClipP*/0.5/*end*/; + + float4 c = float4( Color, Alpha ); + + #ifdef _ALPHATEST_ON + clip( Alpha - AlphaClipThreshold ); + #endif + + #ifdef _DEPTHOFFSET_ON + outputDepth = IN.pos.z; + #endif + + #ifdef ASE_FOG + UNITY_APPLY_FOG(IN.fogCoord, c); + #endif + return c; + } + ENDCG + } + + /*ase_pass*/ + Pass + { + /*ase_main_pass*/ + Name "ForwardBase" + Tags { "LightMode" = "ForwardBase" } + + Blend One Zero + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile_fwdbase + #ifndef UNITY_PASS_FORWARDBASE + #define UNITY_PASS_FORWARDBASE + #endif + #include "HLSLSupport.cginc" + #ifndef UNITY_INSTANCED_LOD_FADE + #define UNITY_INSTANCED_LOD_FADE + #endif + #ifndef UNITY_INSTANCED_SH + #define UNITY_INSTANCED_SH + #endif + #ifndef UNITY_INSTANCED_LIGHTMAPSTS + #define UNITY_INSTANCED_LIGHTMAPSTS + #endif + #include "UnityShaderVariables.cginc" + #include "UnityCG.cginc" + #include "Lighting.cginc" + #include "UnityPBSLighting.cginc" + #include "AutoLight.cginc" + + /*ase_pragma*/ + struct appdata { + float4 vertex : POSITION; + float4 tangent : TANGENT; + float3 normal : NORMAL; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + /*ase_vdata:p=p;t=t;n=n;uv1=tc1.xyzw;uv2=tc2.xyzw*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct v2f { + #if UNITY_VERSION >= 201810 + UNITY_POSITION(pos); + #else + float4 pos : SV_POSITION; + #endif + #if defined(LIGHTMAP_ON) || (!defined(LIGHTMAP_ON) && SHADER_TARGET >= 30) + float4 lmap : TEXCOORD0; + #endif + #if !defined(LIGHTMAP_ON) && UNITY_SHOULD_SAMPLE_SH + half3 sh : TEXCOORD1; + #endif + #if defined(UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS) && UNITY_VERSION >= 201810 && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + UNITY_LIGHTING_COORDS(2,3) + #elif defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if UNITY_VERSION >= 201710 + UNITY_SHADOW_COORDS(2) + #else + SHADOW_COORDS(2) + #endif + #endif + #ifdef ASE_FOG + UNITY_FOG_COORDS(4) + #endif + float4 tSpace0 : TEXCOORD5; + float4 tSpace1 : TEXCOORD6; + float4 tSpace2 : TEXCOORD7; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 screenPos : TEXCOORD8; + #endif + /*ase_interp(9,):sp=sp.xyzw;sc=tc2;wn.xyz=tc5.xyz;wt.xyz=tc6.xyz;wbt.xyz=tc7.xyz;wp.x=tc5.w;wp.y=tc6.w;wp.z=tc7.w;spu=tc8*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + /*ase_globals*/ + + /*ase_funcs*/ + + v2f VertexFunction (appdata v /*ase_vert_input*/ ) { + UNITY_SETUP_INSTANCE_ID(v); + v2f o; + UNITY_INITIALIZE_OUTPUT(v2f,o); + UNITY_TRANSFER_INSTANCE_ID(v,o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + /*ase_vert_code:v=appdata;o=v2f*/ + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = /*ase_vert_out:Vertex Offset;Float3;15;-1;_Vertex*/defaultVertexValue/*end*/; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.vertex.w = 1; + v.normal = /*ase_vert_out:Vertex Normal;Float3;16;-1;_VertexNormal*/v.normal/*end*/; + v.tangent = /*ase_vert_out:Vertex Tangent;Float4;17;-1;_VertexTangent*/v.tangent/*end*/; + + o.pos = UnityObjectToClipPos(v.vertex); + float3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz; + fixed3 worldNormal = UnityObjectToWorldNormal(v.normal); + fixed3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz); + fixed tangentSign = v.tangent.w * unity_WorldTransformParams.w; + fixed3 worldBinormal = cross(worldNormal, worldTangent) * tangentSign; + o.tSpace0 = float4(worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x); + o.tSpace1 = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y); + o.tSpace2 = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z); + + #ifdef DYNAMICLIGHTMAP_ON + o.lmap.zw = v.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #endif + #ifdef LIGHTMAP_ON + o.lmap.xy = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #endif + + #ifndef LIGHTMAP_ON + #if UNITY_SHOULD_SAMPLE_SH && !UNITY_SAMPLE_FULL_SH_PER_PIXEL + o.sh = 0; + #ifdef VERTEXLIGHT_ON + o.sh += Shade4PointLights ( + unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0, + unity_LightColor[0].rgb, unity_LightColor[1].rgb, unity_LightColor[2].rgb, unity_LightColor[3].rgb, + unity_4LightAtten0, worldPos, worldNormal); + #endif + o.sh = ShadeSHPerVertex (worldNormal, o.sh); + #endif + #endif + + #if UNITY_VERSION >= 201810 && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + UNITY_TRANSFER_LIGHTING(o, v.texcoord1.xy); + #elif defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if UNITY_VERSION >= 201710 + UNITY_TRANSFER_SHADOW(o, v.texcoord1.xy); + #else + TRANSFER_SHADOW(o); + #endif + #endif + + #ifdef ASE_FOG + UNITY_TRANSFER_FOG(o,o.pos); + #endif + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + o.screenPos = ComputeScreenPos(o.pos); + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float4 tangent : TANGENT; + float3 normal : NORMAL; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + /*ase_vcontrol*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( appdata v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.tangent = v.tangent; + o.normal = v.normal; + o.texcoord1 = v.texcoord1; + o.texcoord2 = v.texcoord2; + /*ase_control_code:v=appdata;o=VertexControl*/ + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = /*ase_inline_begin*/_TessValue/*ase_inline_end*/; float tessMin = /*ase_inline_begin*/_TessMin/*ase_inline_end*/; float tessMax = /*ase_inline_begin*/_TessMax/*ase_inline_end*/; + float edgeLength = /*ase_inline_begin*/_TessEdgeLength/*ase_inline_end*/; float tessMaxDisp = /*ase_inline_begin*/_TessMaxDisp/*ase_inline_end*/; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, UNITY_MATRIX_M, _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, UNITY_MATRIX_M, _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, UNITY_MATRIX_M, _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + v2f DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + appdata o = (appdata) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.tangent = patch[0].tangent * bary.x + patch[1].tangent * bary.y + patch[2].tangent * bary.z; + o.normal = patch[0].normal * bary.x + patch[1].normal * bary.y + patch[2].normal * bary.z; + o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z; + o.texcoord2 = patch[0].texcoord2 * bary.x + patch[1].texcoord2 * bary.y + patch[2].texcoord2 * bary.z; + /*ase_domain_code:patch=VertexControl;o=appdata;bary=SV_DomainLocation*/ + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].normal * (dot(o.vertex.xyz, patch[i].normal) - dot(patch[i].vertex.xyz, patch[i].normal)); + float phongStrength = /*ase_inline_begin*/_TessPhongStrength/*ase_inline_end*/; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + v2f vert ( appdata v ) + { + return VertexFunction( v ); + } + #endif + + fixed4 frag (v2f IN /*ase_frag_input*/ + #ifdef _DEPTHOFFSET_ON + , out float outputDepth : SV_Depth + #endif + ) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(IN); + + #ifdef LOD_FADE_CROSSFADE + UNITY_APPLY_DITHER_CROSSFADE(IN.pos.xy); + #endif + + #if defined(_SPECULAR_SETUP) + SurfaceOutputStandardSpecular o = (SurfaceOutputStandardSpecular)0; + #else + SurfaceOutputStandard o = (SurfaceOutputStandard)0; + #endif + /*ase_local_var:wt*/float3 WorldTangent = float3(IN.tSpace0.x,IN.tSpace1.x,IN.tSpace2.x); + /*ase_local_var:wbt*/float3 WorldBiTangent = float3(IN.tSpace0.y,IN.tSpace1.y,IN.tSpace2.y); + /*ase_local_var:wn*/float3 WorldNormal = float3(IN.tSpace0.z,IN.tSpace1.z,IN.tSpace2.z); + /*ase_local_var:wp*/float3 worldPos = float3(IN.tSpace0.w,IN.tSpace1.w,IN.tSpace2.w); + /*ase_local_var:wvd*/float3 worldViewDir = normalize(UnityWorldSpaceViewDir(worldPos)); + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + UNITY_LIGHT_ATTENUATION(atten, IN, worldPos) + #else + /*ase_local_var:sc*/half atten = 1; + #endif + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + /*ase_local_var:spu*/float4 ScreenPos = IN.screenPos; + #endif + + /*ase_frag_code:IN=v2f*/ + o.Albedo = /*ase_frag_out:Albedo;Float3;0;-1;_Albedo*/fixed3( 0.5, 0.5, 0.5 )/*end*/; + o.Normal = /*ase_frag_out:Normal;Float3;1;-1;_Normal*/fixed3( 0, 0, 1 )/*end*/; + o.Emission = /*ase_frag_out:Emission;Float3;2;-1;_Emission*/half3( 0, 0, 0 )/*end*/; + #if defined(_SPECULAR_SETUP) + o.Specular = /*ase_frag_out:Specular;Float3;3;-1;_Specular*/fixed3( 0, 0, 0 )/*end*/; + #else + o.Metallic = /*ase_frag_out:Metallic;Float;4;-1;_Metallic*/0/*end*/; + #endif + o.Smoothness = /*ase_frag_out:Smoothness;Float;5;-1;_Smoothness*/0/*end*/; + o.Occlusion = /*ase_frag_out:Occlusion;Float;6;-1;_Occlusion*/1/*end*/; + o.Alpha = /*ase_frag_out:Alpha;Float;7;-1;_Alpha*/1/*end*/; + float AlphaClipThreshold = /*ase_frag_out:Alpha Clip Threshold;Float;8;-1;_AlphaClip*/0.5/*end*/; + float AlphaClipThresholdShadow = /*ase_frag_out:Alpha Clip Threshold Shadow;Float;9;-1;_AlphaClipShadow*/0.5/*end*/; + float3 BakedGI = /*ase_frag_out:Baked GI;Float3;10;-1;_BakedGI*/0/*end*/; + float3 RefractionColor = /*ase_frag_out:Refraction Color;Float3;11;-1;_RefractionColor*/1/*end*/; + float RefractionIndex = /*ase_frag_out:Refraction Index;Float;12;-1;_RefractionIndex*/1/*end*/; + float3 Transmission = /*ase_frag_out:Transmission;Float3;13;-1;_Transmission*/1/*end*/; + float3 Translucency = /*ase_frag_out:Translucency;Float3;14;-1;_Translucency*/1/*end*/; + + #ifdef _ALPHATEST_ON + clip( o.Alpha - AlphaClipThreshold ); + #endif + + #ifdef _DEPTHOFFSET_ON + outputDepth = IN.pos.z; + #endif + + #ifndef USING_DIRECTIONAL_LIGHT + fixed3 lightDir = normalize(UnityWorldSpaceLightDir(worldPos)); + #else + fixed3 lightDir = _WorldSpaceLightPos0.xyz; + #endif + + fixed4 c = 0; + float3 worldN; + worldN.x = dot(IN.tSpace0.xyz, o.Normal); + worldN.y = dot(IN.tSpace1.xyz, o.Normal); + worldN.z = dot(IN.tSpace2.xyz, o.Normal); + worldN = normalize(worldN); + o.Normal = worldN; + + UnityGI gi; + UNITY_INITIALIZE_OUTPUT(UnityGI, gi); + gi.indirect.diffuse = 0; + gi.indirect.specular = 0; + gi.light.color = _LightColor0.rgb; + gi.light.dir = lightDir; + + UnityGIInput giInput; + UNITY_INITIALIZE_OUTPUT(UnityGIInput, giInput); + giInput.light = gi.light; + giInput.worldPos = worldPos; + giInput.worldViewDir = worldViewDir; + giInput.atten = atten; + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + giInput.lightmapUV = IN.lmap; + #else + giInput.lightmapUV = 0.0; + #endif + #if UNITY_SHOULD_SAMPLE_SH && !UNITY_SAMPLE_FULL_SH_PER_PIXEL + giInput.ambient = IN.sh; + #else + giInput.ambient.rgb = 0.0; + #endif + giInput.probeHDR[0] = unity_SpecCube0_HDR; + giInput.probeHDR[1] = unity_SpecCube1_HDR; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) + giInput.boxMin[0] = unity_SpecCube0_BoxMin; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + giInput.boxMax[0] = unity_SpecCube0_BoxMax; + giInput.probePosition[0] = unity_SpecCube0_ProbePosition; + giInput.boxMax[1] = unity_SpecCube1_BoxMax; + giInput.boxMin[1] = unity_SpecCube1_BoxMin; + giInput.probePosition[1] = unity_SpecCube1_ProbePosition; + #endif + + #if defined(_SPECULAR_SETUP) + LightingStandardSpecular_GI(o, giInput, gi); + #else + LightingStandard_GI( o, giInput, gi ); + #endif + + #ifdef ASE_BAKEDGI + gi.indirect.diffuse = BakedGI; + #endif + + #if UNITY_SHOULD_SAMPLE_SH && !defined(LIGHTMAP_ON) && defined(ASE_NO_AMBIENT) + gi.indirect.diffuse = 0; + #endif + + #if defined(_SPECULAR_SETUP) + c += LightingStandardSpecular (o, worldViewDir, gi); + #else + c += LightingStandard( o, worldViewDir, gi ); + #endif + + #ifdef _TRANSMISSION_ASE + { + float shadow = /*ase_inline_begin*/_TransmissionShadow/*ase_inline_end*/; + #ifdef DIRECTIONAL + float3 lightAtten = lerp( _LightColor0.rgb, gi.light.color, shadow ); + #else + float3 lightAtten = gi.light.color; + #endif + half3 transmission = max(0 , -dot(o.Normal, gi.light.dir)) * lightAtten * Transmission; + c.rgb += o.Albedo * transmission; + } + #endif + + #ifdef _TRANSLUCENCY_ASE + { + float shadow = /*ase_inline_begin*/_TransShadow/*ase_inline_end*/; + float normal = /*ase_inline_begin*/_TransNormal/*ase_inline_end*/; + float scattering = /*ase_inline_begin*/_TransScattering/*ase_inline_end*/; + float direct = /*ase_inline_begin*/_TransDirect/*ase_inline_end*/; + float ambient = /*ase_inline_begin*/_TransAmbient/*ase_inline_end*/; + float strength = /*ase_inline_begin*/_TransStrength/*ase_inline_end*/; + + #ifdef DIRECTIONAL + float3 lightAtten = lerp( _LightColor0.rgb, gi.light.color, shadow ); + #else + float3 lightAtten = gi.light.color; + #endif + half3 lightDir = gi.light.dir + o.Normal * normal; + half transVdotL = pow( saturate( dot( worldViewDir, -lightDir ) ), scattering ); + half3 translucency = lightAtten * (transVdotL * direct + gi.indirect.diffuse * ambient) * Translucency; + c.rgb += o.Albedo * translucency * strength; + } + #endif + + //#ifdef _REFRACTION_ASE + // float4 projScreenPos = ScreenPos / ScreenPos.w; + // float3 refractionOffset = ( RefractionIndex - 1.0 ) * mul( UNITY_MATRIX_V, WorldNormal ).xyz * ( 1.0 - dot( WorldNormal, WorldViewDirection ) ); + // projScreenPos.xy += refractionOffset.xy; + // float3 refraction = UNITY_SAMPLE_SCREENSPACE_TEXTURE( _GrabTexture, projScreenPos ) * RefractionColor; + // color.rgb = lerp( refraction, color.rgb, color.a ); + // color.a = 1; + //#endif + + c.rgb += o.Emission; + + #ifdef ASE_FOG + UNITY_APPLY_FOG(IN.fogCoord, c); + #endif + return c; + } + ENDCG + } + + /*ase_pass*/ + Pass + { + /*ase_hide_pass*/ + Name "ForwardAdd" + Tags { "LightMode"="ForwardAdd" } + ZWrite Off + Blend One One + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma skip_variants INSTANCING_ON + #pragma multi_compile_fwdadd_fullshadows + #ifndef UNITY_PASS_FORWARDADD + #define UNITY_PASS_FORWARDADD + #endif + #include "HLSLSupport.cginc" + #if !defined( UNITY_INSTANCED_LOD_FADE ) + #define UNITY_INSTANCED_LOD_FADE + #endif + #if !defined( UNITY_INSTANCED_SH ) + #define UNITY_INSTANCED_SH + #endif + #if !defined( UNITY_INSTANCED_LIGHTMAPSTS ) + #define UNITY_INSTANCED_LIGHTMAPSTS + #endif + #include "UnityShaderVariables.cginc" + #include "UnityCG.cginc" + #include "Lighting.cginc" + #include "UnityPBSLighting.cginc" + #include "AutoLight.cginc" + + /*ase_pragma*/ + struct appdata { + float4 vertex : POSITION; + float4 tangent : TANGENT; + float3 normal : NORMAL; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + /*ase_vdata:p=p;t=t;n=n;uv1=tc1.xyzw;uv2=tc2.xyzw*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct v2f { + #if UNITY_VERSION >= 201810 + UNITY_POSITION(pos); + #else + float4 pos : SV_POSITION; + #endif + #if UNITY_VERSION >= 201810 && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + UNITY_LIGHTING_COORDS(1,2) + #elif defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if UNITY_VERSION >= 201710 + UNITY_SHADOW_COORDS(1) + #else + SHADOW_COORDS(1) + #endif + #endif + #ifdef ASE_FOG + UNITY_FOG_COORDS(3) + #endif + float4 tSpace0 : TEXCOORD5; + float4 tSpace1 : TEXCOORD6; + float4 tSpace2 : TEXCOORD7; + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + float4 screenPos : TEXCOORD8; + #endif + /*ase_interp(9,):sp=sp.xyzw;sc=tc1;wn.xyz=tc5.xyz;wt.xyz=tc6.xyz;wbt.xyz=tc7.xyz;wp.x=tc5.w;wp.y=tc6.w;wp.z=tc7.w;spu=tc8*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + #ifdef _TRANSMISSION_ASE + float _TransmissionShadow; + #endif + #ifdef _TRANSLUCENCY_ASE + float _TransStrength; + float _TransNormal; + float _TransScattering; + float _TransDirect; + float _TransAmbient; + float _TransShadow; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + /*ase_globals*/ + + /*ase_funcs*/ + + v2f VertexFunction (appdata v /*ase_vert_input*/ ) { + UNITY_SETUP_INSTANCE_ID(v); + v2f o; + UNITY_INITIALIZE_OUTPUT(v2f,o); + UNITY_TRANSFER_INSTANCE_ID(v,o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + /*ase_vert_code:v=appdata;o=v2f*/ + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = /*ase_vert_out:Vertex Offset;Float3;11;-1;_Vertex*/defaultVertexValue/*end*/; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.vertex.w = 1; + v.normal = /*ase_vert_out:Vertex Normal;Float3;12;-1;_VertexNormal*/v.normal/*end*/; + v.tangent = /*ase_vert_out:Vertex Tangent;Float4;13;-1;_VertexTangent*/v.tangent/*end*/; + + o.pos = UnityObjectToClipPos(v.vertex); + float3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz; + fixed3 worldNormal = UnityObjectToWorldNormal(v.normal); + fixed3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz); + fixed tangentSign = v.tangent.w * unity_WorldTransformParams.w; + fixed3 worldBinormal = cross(worldNormal, worldTangent) * tangentSign; + o.tSpace0 = float4(worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x); + o.tSpace1 = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y); + o.tSpace2 = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z); + + #if UNITY_VERSION >= 201810 && defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + UNITY_TRANSFER_LIGHTING(o, v.texcoord1.xy); + #elif defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + #if UNITY_VERSION >= 201710 + UNITY_TRANSFER_SHADOW(o, v.texcoord1.xy); + #else + TRANSFER_SHADOW(o); + #endif + #endif + + #ifdef ASE_FOG + UNITY_TRANSFER_FOG(o,o.pos); + #endif + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + o.screenPos = ComputeScreenPos(o.pos); + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float4 tangent : TANGENT; + float3 normal : NORMAL; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + /*ase_vcontrol*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( appdata v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.tangent = v.tangent; + o.normal = v.normal; + o.texcoord1 = v.texcoord1; + o.texcoord2 = v.texcoord2; + /*ase_control_code:v=appdata;o=VertexControl*/ + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = /*ase_inline_begin*/_TessValue/*ase_inline_end*/; float tessMin = /*ase_inline_begin*/_TessMin/*ase_inline_end*/; float tessMax = /*ase_inline_begin*/_TessMax/*ase_inline_end*/; + float edgeLength = /*ase_inline_begin*/_TessEdgeLength/*ase_inline_end*/; float tessMaxDisp = /*ase_inline_begin*/_TessMaxDisp/*ase_inline_end*/; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, UNITY_MATRIX_M, _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, UNITY_MATRIX_M, _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, UNITY_MATRIX_M, _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + v2f DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + appdata o = (appdata) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.tangent = patch[0].tangent * bary.x + patch[1].tangent * bary.y + patch[2].tangent * bary.z; + o.normal = patch[0].normal * bary.x + patch[1].normal * bary.y + patch[2].normal * bary.z; + o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z; + o.texcoord2 = patch[0].texcoord2 * bary.x + patch[1].texcoord2 * bary.y + patch[2].texcoord2 * bary.z; + /*ase_domain_code:patch=VertexControl;o=appdata;bary=SV_DomainLocation*/ + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].normal * (dot(o.vertex.xyz, patch[i].normal) - dot(patch[i].vertex.xyz, patch[i].normal)); + float phongStrength = /*ase_inline_begin*/_TessPhongStrength/*ase_inline_end*/; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + v2f vert ( appdata v ) + { + return VertexFunction( v ); + } + #endif + + fixed4 frag ( v2f IN /*ase_frag_input*/ + #ifdef _DEPTHOFFSET_ON + , out float outputDepth : SV_Depth + #endif + ) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(IN); + + #ifdef LOD_FADE_CROSSFADE + UNITY_APPLY_DITHER_CROSSFADE(IN.pos.xy); + #endif + + #if defined(_SPECULAR_SETUP) + SurfaceOutputStandardSpecular o = (SurfaceOutputStandardSpecular)0; + #else + SurfaceOutputStandard o = (SurfaceOutputStandard)0; + #endif + /*ase_local_var:wt*/float3 WorldTangent = float3(IN.tSpace0.x,IN.tSpace1.x,IN.tSpace2.x); + /*ase_local_var:wbt*/float3 WorldBiTangent = float3(IN.tSpace0.y,IN.tSpace1.y,IN.tSpace2.y); + /*ase_local_var:wn*/float3 WorldNormal = float3(IN.tSpace0.z,IN.tSpace1.z,IN.tSpace2.z); + /*ase_local_var:wp*/float3 worldPos = float3(IN.tSpace0.w,IN.tSpace1.w,IN.tSpace2.w); + /*ase_local_var:wvd*/float3 worldViewDir = normalize(UnityWorldSpaceViewDir(worldPos)); + #if defined(ASE_NEEDS_FRAG_SHADOWCOORDS) + UNITY_LIGHT_ATTENUATION(atten, IN, worldPos) + #else + /*ase_local_var:sc*/half atten = 1; + #endif + #if defined(ASE_NEEDS_FRAG_SCREEN_POSITION) + /*ase_local_var:spu*/float4 ScreenPos = IN.screenPos; + #endif + + + /*ase_frag_code:IN=v2f*/ + o.Albedo = /*ase_frag_out:Albedo;Float3;0;-1;_Albedo*/fixed3( 0.5, 0.5, 0.5 )/*end*/; + o.Normal = /*ase_frag_out:Normal;Float3;1;-1;_Normal*/fixed3( 0, 0, 1 )/*end*/; + o.Emission = /*ase_frag_out:Emission;Float3;2;-1;_Emission*/half3( 0, 0, 0 )/*end*/; + #if defined(_SPECULAR_SETUP) + o.Specular = /*ase_frag_out:Specular;Float3;3;-1;_Specular*/fixed3( 0, 0, 0 )/*end*/; + #else + o.Metallic = /*ase_frag_out:Metallic;Float;4;-1;_Metallic*/0/*end*/; + #endif + o.Smoothness = /*ase_frag_out:Smoothness;Float;5;-1;_Smoothness*/0/*end*/; + o.Occlusion = /*ase_frag_out:Occlusion;Float;6;-1;_Occlusion*/1/*end*/; + o.Alpha = /*ase_frag_out:Alpha;Float;7;-1;_Alpha*/1/*end*/; + float AlphaClipThreshold = /*ase_frag_out:Alpha Clip Threshold;Float;8;-1;_AlphaClip*/0.5/*end*/; + float3 Transmission = /*ase_frag_out:Transmission;Float3;9;-1;_Transmission*/1/*end*/; + float3 Translucency = /*ase_frag_out:Translucency;Float3;10;-1;_Translucency*/1/*end*/; + + #ifdef _ALPHATEST_ON + clip( o.Alpha - AlphaClipThreshold ); + #endif + + #ifdef _DEPTHOFFSET_ON + outputDepth = IN.pos.z; + #endif + + #ifndef USING_DIRECTIONAL_LIGHT + fixed3 lightDir = normalize(UnityWorldSpaceLightDir(worldPos)); + #else + fixed3 lightDir = _WorldSpaceLightPos0.xyz; + #endif + + fixed4 c = 0; + float3 worldN; + worldN.x = dot(IN.tSpace0.xyz, o.Normal); + worldN.y = dot(IN.tSpace1.xyz, o.Normal); + worldN.z = dot(IN.tSpace2.xyz, o.Normal); + worldN = normalize(worldN); + o.Normal = worldN; + + UnityGI gi; + UNITY_INITIALIZE_OUTPUT(UnityGI, gi); + gi.indirect.diffuse = 0; + gi.indirect.specular = 0; + gi.light.color = _LightColor0.rgb; + gi.light.dir = lightDir; + gi.light.color *= atten; + + #if defined(_SPECULAR_SETUP) + c += LightingStandardSpecular( o, worldViewDir, gi ); + #else + c += LightingStandard( o, worldViewDir, gi ); + #endif + + #ifdef _TRANSMISSION_ASE + { + float shadow = /*ase_inline_begin*/_TransmissionShadow/*ase_inline_end*/; + #ifdef DIRECTIONAL + float3 lightAtten = lerp( _LightColor0.rgb, gi.light.color, shadow ); + #else + float3 lightAtten = gi.light.color; + #endif + half3 transmission = max(0 , -dot(o.Normal, gi.light.dir)) * lightAtten * Transmission; + c.rgb += o.Albedo * transmission; + } + #endif + + #ifdef _TRANSLUCENCY_ASE + { + float shadow = /*ase_inline_begin*/_TransShadow/*ase_inline_end*/; + float normal = /*ase_inline_begin*/_TransNormal/*ase_inline_end*/; + float scattering = /*ase_inline_begin*/_TransScattering/*ase_inline_end*/; + float direct = /*ase_inline_begin*/_TransDirect/*ase_inline_end*/; + float ambient = /*ase_inline_begin*/_TransAmbient/*ase_inline_end*/; + float strength = /*ase_inline_begin*/_TransStrength/*ase_inline_end*/; + + #ifdef DIRECTIONAL + float3 lightAtten = lerp( _LightColor0.rgb, gi.light.color, shadow ); + #else + float3 lightAtten = gi.light.color; + #endif + half3 lightDir = gi.light.dir + o.Normal * normal; + half transVdotL = pow( saturate( dot( worldViewDir, -lightDir ) ), scattering ); + half3 translucency = lightAtten * (transVdotL * direct + gi.indirect.diffuse * ambient) * Translucency; + c.rgb += o.Albedo * translucency * strength; + } + #endif + + //#ifdef _REFRACTION_ASE + // float4 projScreenPos = ScreenPos / ScreenPos.w; + // float3 refractionOffset = ( RefractionIndex - 1.0 ) * mul( UNITY_MATRIX_V, WorldNormal ).xyz * ( 1.0 - dot( WorldNormal, WorldViewDirection ) ); + // projScreenPos.xy += refractionOffset.xy; + // float3 refraction = UNITY_SAMPLE_SCREENSPACE_TEXTURE( _GrabTexture, projScreenPos ) * RefractionColor; + // color.rgb = lerp( refraction, color.rgb, color.a ); + // color.a = 1; + //#endif + + #ifdef ASE_FOG + UNITY_APPLY_FOG(IN.fogCoord, c); + #endif + return c; + } + ENDCG + } + + /*ase_pass*/ + Pass + { + /*ase_hide_pass*/ + Name "Deferred" + Tags { "LightMode"="Deferred" } + + AlphaToMask Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma target 3.0 + #pragma exclude_renderers nomrt + #pragma skip_variants FOG_LINEAR FOG_EXP FOG_EXP2 + #pragma multi_compile_prepassfinal + #ifndef UNITY_PASS_DEFERRED + #define UNITY_PASS_DEFERRED + #endif + #include "HLSLSupport.cginc" + #if !defined( UNITY_INSTANCED_LOD_FADE ) + #define UNITY_INSTANCED_LOD_FADE + #endif + #if !defined( UNITY_INSTANCED_SH ) + #define UNITY_INSTANCED_SH + #endif + #if !defined( UNITY_INSTANCED_LIGHTMAPSTS ) + #define UNITY_INSTANCED_LIGHTMAPSTS + #endif + #include "UnityShaderVariables.cginc" + #include "UnityCG.cginc" + #include "Lighting.cginc" + #include "UnityPBSLighting.cginc" + + /*ase_pragma*/ + struct appdata { + float4 vertex : POSITION; + float4 tangent : TANGENT; + float3 normal : NORMAL; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + /*ase_vdata:p=p;t=t;n=n;uv1=tc1.xyzw;uv2=tc2.xyzw*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct v2f { + #if UNITY_VERSION >= 201810 + UNITY_POSITION(pos); + #else + float4 pos : SV_POSITION; + #endif + float4 lmap : TEXCOORD2; + #ifndef LIGHTMAP_ON + #if UNITY_SHOULD_SAMPLE_SH && !UNITY_SAMPLE_FULL_SH_PER_PIXEL + half3 sh : TEXCOORD3; + #endif + #else + #ifdef DIRLIGHTMAP_OFF + float4 lmapFadePos : TEXCOORD4; + #endif + #endif + float4 tSpace0 : TEXCOORD5; + float4 tSpace1 : TEXCOORD6; + float4 tSpace2 : TEXCOORD7; + /*ase_interp(8,):sp=sp.xyzw;wn.xyz=tc5.xyz;wt.xyz=tc6.xyz;wbt.xyz=tc7.xyz;wp.x=tc5.w;wp.y=tc6.w;wp.z=tc7.w*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + #ifdef LIGHTMAP_ON + float4 unity_LightmapFade; + #endif + fixed4 unity_Ambient; + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + /*ase_globals*/ + + /*ase_funcs*/ + + v2f VertexFunction (appdata v /*ase_vert_input*/ ) { + UNITY_SETUP_INSTANCE_ID(v); + v2f o; + UNITY_INITIALIZE_OUTPUT(v2f,o); + UNITY_TRANSFER_INSTANCE_ID(v,o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + /*ase_vert_code:v=appdata;o=v2f*/ + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = /*ase_vert_out:Vertex Offset;Float3;10;-1;_Vertex*/defaultVertexValue/*end*/; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.vertex.w = 1; + v.normal = /*ase_vert_out:Vertex Normal;Float3;11;-1;_VertexNormal*/v.normal/*end*/; + v.tangent = /*ase_vert_out:Vertex Tangent;Float4;12;-1;_VertexTangent*/v.tangent/*end*/; + + o.pos = UnityObjectToClipPos(v.vertex); + float3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz; + fixed3 worldNormal = UnityObjectToWorldNormal(v.normal); + fixed3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz); + fixed tangentSign = v.tangent.w * unity_WorldTransformParams.w; + fixed3 worldBinormal = cross(worldNormal, worldTangent) * tangentSign; + o.tSpace0 = float4(worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x); + o.tSpace1 = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y); + o.tSpace2 = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z); + + #ifdef DYNAMICLIGHTMAP_ON + o.lmap.zw = v.texcoord2.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; + #else + o.lmap.zw = 0; + #endif + #ifdef LIGHTMAP_ON + o.lmap.xy = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + #ifdef DIRLIGHTMAP_OFF + o.lmapFadePos.xyz = (mul(unity_ObjectToWorld, v.vertex).xyz - unity_ShadowFadeCenterAndType.xyz) * unity_ShadowFadeCenterAndType.w; + o.lmapFadePos.w = (-UnityObjectToViewPos(v.vertex).z) * (1.0 - unity_ShadowFadeCenterAndType.w); + #endif + #else + o.lmap.xy = 0; + #if UNITY_SHOULD_SAMPLE_SH && !UNITY_SAMPLE_FULL_SH_PER_PIXEL + o.sh = 0; + o.sh = ShadeSHPerVertex (worldNormal, o.sh); + #endif + #endif + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float4 tangent : TANGENT; + float3 normal : NORMAL; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + /*ase_vcontrol*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( appdata v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.tangent = v.tangent; + o.normal = v.normal; + o.texcoord1 = v.texcoord1; + o.texcoord2 = v.texcoord2; + /*ase_control_code:v=appdata;o=VertexControl*/ + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = /*ase_inline_begin*/_TessValue/*ase_inline_end*/; float tessMin = /*ase_inline_begin*/_TessMin/*ase_inline_end*/; float tessMax = /*ase_inline_begin*/_TessMax/*ase_inline_end*/; + float edgeLength = /*ase_inline_begin*/_TessEdgeLength/*ase_inline_end*/; float tessMaxDisp = /*ase_inline_begin*/_TessMaxDisp/*ase_inline_end*/; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, UNITY_MATRIX_M, _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, UNITY_MATRIX_M, _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, UNITY_MATRIX_M, _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + v2f DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + appdata o = (appdata) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.tangent = patch[0].tangent * bary.x + patch[1].tangent * bary.y + patch[2].tangent * bary.z; + o.normal = patch[0].normal * bary.x + patch[1].normal * bary.y + patch[2].normal * bary.z; + o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z; + o.texcoord2 = patch[0].texcoord2 * bary.x + patch[1].texcoord2 * bary.y + patch[2].texcoord2 * bary.z; + /*ase_domain_code:patch=VertexControl;o=appdata;bary=SV_DomainLocation*/ + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].normal * (dot(o.vertex.xyz, patch[i].normal) - dot(patch[i].vertex.xyz, patch[i].normal)); + float phongStrength = /*ase_inline_begin*/_TessPhongStrength/*ase_inline_end*/; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + v2f vert ( appdata v ) + { + return VertexFunction( v ); + } + #endif + + void frag (v2f IN /*ase_frag_input*/ + , out half4 outGBuffer0 : SV_Target0 + , out half4 outGBuffer1 : SV_Target1 + , out half4 outGBuffer2 : SV_Target2 + , out half4 outEmission : SV_Target3 + #if defined(SHADOWS_SHADOWMASK) && (UNITY_ALLOWED_MRT_COUNT > 4) + , out half4 outShadowMask : SV_Target4 + #endif + #ifdef _DEPTHOFFSET_ON + , out float outputDepth : SV_Depth + #endif + ) + { + UNITY_SETUP_INSTANCE_ID(IN); + + #ifdef LOD_FADE_CROSSFADE + UNITY_APPLY_DITHER_CROSSFADE(IN.pos.xy); + #endif + + #if defined(_SPECULAR_SETUP) + SurfaceOutputStandardSpecular o = (SurfaceOutputStandardSpecular)0; + #else + SurfaceOutputStandard o = (SurfaceOutputStandard)0; + #endif + /*ase_local_var:wt*/float3 WorldTangent = float3(IN.tSpace0.x,IN.tSpace1.x,IN.tSpace2.x); + /*ase_local_var:wbt*/float3 WorldBiTangent = float3(IN.tSpace0.y,IN.tSpace1.y,IN.tSpace2.y); + /*ase_local_var:wn*/float3 WorldNormal = float3(IN.tSpace0.z,IN.tSpace1.z,IN.tSpace2.z); + /*ase_local_var:wp*/float3 worldPos = float3(IN.tSpace0.w,IN.tSpace1.w,IN.tSpace2.w); + /*ase_local_var:wvd*/float3 worldViewDir = normalize(UnityWorldSpaceViewDir(worldPos)); + /*ase_local_var:sc*/half atten = 1; + + /*ase_frag_code:IN=v2f*/ + o.Albedo = /*ase_frag_out:Albedo;Float3;0;-1;_Albedo*/fixed3( 0.5, 0.5, 0.5 )/*end*/; + o.Normal = /*ase_frag_out:Normal;Float3;1;-1;_Normal*/fixed3( 0, 0, 1 )/*end*/; + o.Emission = /*ase_frag_out:Emission;Float3;2;-1;_Emission*/half3( 0, 0, 0 )/*end*/; + #if defined(_SPECULAR_SETUP) + o.Specular = /*ase_frag_out:Specular;Float3;3;-1;_Specular*/fixed3( 0, 0, 0 )/*end*/; + #else + o.Metallic = /*ase_frag_out:Metallic;Float;4;-1;_Metallic*/0/*end*/; + #endif + o.Smoothness = /*ase_frag_out:Smoothness;Float;5;-1;_Smoothness*/0/*end*/; + o.Occlusion = /*ase_frag_out:Occlusion;Float;6;-1;_Occlusion*/1/*end*/; + o.Alpha = /*ase_frag_out:Alpha;Float;7;-1;_Alpha*/1/*end*/; + float AlphaClipThreshold = /*ase_frag_out:Alpha Clip Threshold;Float;8;-1;_AlphaClip*/0.5/*end*/; + float3 BakedGI = /*ase_frag_out:Baked GI;Float3;9;-1;_BakedGI*/0/*end*/; + + #ifdef _ALPHATEST_ON + clip( o.Alpha - AlphaClipThreshold ); + #endif + + #ifdef _DEPTHOFFSET_ON + outputDepth = IN.pos.z; + #endif + + #ifndef USING_DIRECTIONAL_LIGHT + fixed3 lightDir = normalize(UnityWorldSpaceLightDir(worldPos)); + #else + fixed3 lightDir = _WorldSpaceLightPos0.xyz; + #endif + + float3 worldN; + worldN.x = dot(IN.tSpace0.xyz, o.Normal); + worldN.y = dot(IN.tSpace1.xyz, o.Normal); + worldN.z = dot(IN.tSpace2.xyz, o.Normal); + worldN = normalize(worldN); + o.Normal = worldN; + + UnityGI gi; + UNITY_INITIALIZE_OUTPUT(UnityGI, gi); + gi.indirect.diffuse = 0; + gi.indirect.specular = 0; + gi.light.color = 0; + gi.light.dir = half3(0,1,0); + + UnityGIInput giInput; + UNITY_INITIALIZE_OUTPUT(UnityGIInput, giInput); + giInput.light = gi.light; + giInput.worldPos = worldPos; + giInput.worldViewDir = worldViewDir; + giInput.atten = atten; + #if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON) + giInput.lightmapUV = IN.lmap; + #else + giInput.lightmapUV = 0.0; + #endif + #if UNITY_SHOULD_SAMPLE_SH && !UNITY_SAMPLE_FULL_SH_PER_PIXEL + giInput.ambient = IN.sh; + #else + giInput.ambient.rgb = 0.0; + #endif + giInput.probeHDR[0] = unity_SpecCube0_HDR; + giInput.probeHDR[1] = unity_SpecCube1_HDR; + #if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION) + giInput.boxMin[0] = unity_SpecCube0_BoxMin; + #endif + #ifdef UNITY_SPECCUBE_BOX_PROJECTION + giInput.boxMax[0] = unity_SpecCube0_BoxMax; + giInput.probePosition[0] = unity_SpecCube0_ProbePosition; + giInput.boxMax[1] = unity_SpecCube1_BoxMax; + giInput.boxMin[1] = unity_SpecCube1_BoxMin; + giInput.probePosition[1] = unity_SpecCube1_ProbePosition; + #endif + + #if defined(_SPECULAR_SETUP) + LightingStandardSpecular_GI( o, giInput, gi ); + #else + LightingStandard_GI( o, giInput, gi ); + #endif + + #ifdef ASE_BAKEDGI + gi.indirect.diffuse = BakedGI; + #endif + + #if UNITY_SHOULD_SAMPLE_SH && !defined(LIGHTMAP_ON) && defined(ASE_NO_AMBIENT) + gi.indirect.diffuse = 0; + #endif + + #if defined(_SPECULAR_SETUP) + outEmission = LightingStandardSpecular_Deferred( o, worldViewDir, gi, outGBuffer0, outGBuffer1, outGBuffer2 ); + #else + outEmission = LightingStandard_Deferred( o, worldViewDir, gi, outGBuffer0, outGBuffer1, outGBuffer2 ); + #endif + + #if defined(SHADOWS_SHADOWMASK) && (UNITY_ALLOWED_MRT_COUNT > 4) + outShadowMask = UnityGetRawBakedOcclusions (IN.lmap.xy, float3(0, 0, 0)); + #endif + #ifndef UNITY_HDR_ON + outEmission.rgb = exp2(-outEmission.rgb); + #endif + } + ENDCG + } + + /*ase_pass*/ + Pass + { + /*ase_hide_pass*/ + Name "Meta" + Tags { "LightMode"="Meta" } + Cull Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma skip_variants FOG_LINEAR FOG_EXP FOG_EXP2 + #pragma shader_feature EDITOR_VISUALIZATION + #ifndef UNITY_PASS_META + #define UNITY_PASS_META + #endif + #include "HLSLSupport.cginc" + #if !defined( UNITY_INSTANCED_LOD_FADE ) + #define UNITY_INSTANCED_LOD_FADE + #endif + #if !defined( UNITY_INSTANCED_SH ) + #define UNITY_INSTANCED_SH + #endif + #if !defined( UNITY_INSTANCED_LIGHTMAPSTS ) + #define UNITY_INSTANCED_LIGHTMAPSTS + #endif + #include "UnityShaderVariables.cginc" + #include "UnityCG.cginc" + #include "Lighting.cginc" + #include "UnityPBSLighting.cginc" + #include "UnityMetaPass.cginc" + + /*ase_pragma*/ + struct appdata { + float4 vertex : POSITION; + float4 tangent : TANGENT; + float3 normal : NORMAL; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + /*ase_vdata:p=p;t=t;n=n;uv1=tc1.xyzw;uv2=tc2.xyzw*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + struct v2f { + #if UNITY_VERSION >= 201810 + UNITY_POSITION(pos); + #else + float4 pos : SV_POSITION; + #endif + #ifdef EDITOR_VISUALIZATION + float2 vizUV : TEXCOORD1; + float4 lightCoord : TEXCOORD2; + #endif + /*ase_interp(3,):sp=sp.xyzw*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + /*ase_globals*/ + + /*ase_funcs*/ + + v2f VertexFunction (appdata v /*ase_vert_input*/ ) { + UNITY_SETUP_INSTANCE_ID(v); + v2f o; + UNITY_INITIALIZE_OUTPUT(v2f,o); + UNITY_TRANSFER_INSTANCE_ID(v,o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + /*ase_vert_code:v=appdata;o=v2f*/ + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = /*ase_vert_out:Vertex Offset;Float3;4;-1;_Vertex*/defaultVertexValue/*end*/; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.vertex.w = 1; + v.normal = /*ase_vert_out:Vertex Normal;Float3;5;-1;_VertexNormal*/v.normal/*end*/; + v.tangent = /*ase_vert_out:Vertex Tangent;Float4;6;-1;_VertexTangent*/v.tangent/*end*/; + + #ifdef EDITOR_VISUALIZATION + o.vizUV = 0; + o.lightCoord = 0; + if (unity_VisualizationMode == EDITORVIZ_TEXTURE) + o.vizUV = UnityMetaVizUV(unity_EditorViz_UVIndex, v.texcoord.xy, v.texcoord1.xy, v.texcoord2.xy, unity_EditorViz_Texture_ST); + else if (unity_VisualizationMode == EDITORVIZ_SHOWLIGHTMASK) + { + o.vizUV = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw; + o.lightCoord = mul(unity_EditorViz_WorldToLight, mul(unity_ObjectToWorld, float4(v.vertex.xyz, 1))); + } + #endif + + o.pos = UnityMetaVertexPosition(v.vertex, v.texcoord1.xy, v.texcoord2.xy, unity_LightmapST, unity_DynamicLightmapST); + + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float4 tangent : TANGENT; + float3 normal : NORMAL; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + /*ase_vcontrol*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( appdata v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.tangent = v.tangent; + o.normal = v.normal; + o.texcoord1 = v.texcoord1; + o.texcoord2 = v.texcoord2; + /*ase_control_code:v=appdata;o=VertexControl*/ + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = /*ase_inline_begin*/_TessValue/*ase_inline_end*/; float tessMin = /*ase_inline_begin*/_TessMin/*ase_inline_end*/; float tessMax = /*ase_inline_begin*/_TessMax/*ase_inline_end*/; + float edgeLength = /*ase_inline_begin*/_TessEdgeLength/*ase_inline_end*/; float tessMaxDisp = /*ase_inline_begin*/_TessMaxDisp/*ase_inline_end*/; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, UNITY_MATRIX_M, _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, UNITY_MATRIX_M, _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, UNITY_MATRIX_M, _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + v2f DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + appdata o = (appdata) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.tangent = patch[0].tangent * bary.x + patch[1].tangent * bary.y + patch[2].tangent * bary.z; + o.normal = patch[0].normal * bary.x + patch[1].normal * bary.y + patch[2].normal * bary.z; + o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z; + o.texcoord2 = patch[0].texcoord2 * bary.x + patch[1].texcoord2 * bary.y + patch[2].texcoord2 * bary.z; + /*ase_domain_code:patch=VertexControl;o=appdata;bary=SV_DomainLocation*/ + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].normal * (dot(o.vertex.xyz, patch[i].normal) - dot(patch[i].vertex.xyz, patch[i].normal)); + float phongStrength = /*ase_inline_begin*/_TessPhongStrength/*ase_inline_end*/; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + v2f vert ( appdata v ) + { + return VertexFunction( v ); + } + #endif + + fixed4 frag (v2f IN /*ase_frag_input*/ + #ifdef _DEPTHOFFSET_ON + , out float outputDepth : SV_Depth + #endif + ) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(IN); + + #ifdef LOD_FADE_CROSSFADE + UNITY_APPLY_DITHER_CROSSFADE(IN.pos.xy); + #endif + + #if defined(_SPECULAR_SETUP) + SurfaceOutputStandardSpecular o = (SurfaceOutputStandardSpecular)0; + #else + SurfaceOutputStandard o = (SurfaceOutputStandard)0; + #endif + + /*ase_frag_code:IN=v2f*/ + o.Albedo = /*ase_frag_out:Albedo;Float3;0;-1;_Albedo*/fixed3( 0.5, 0.5, 0.5 )/*end*/; + o.Normal = fixed3( 0, 0, 1 ); + o.Emission = /*ase_frag_out:Emission;Float3;1;-1;_Emission*/half3( 0, 0, 0 )/*end*/; + o.Alpha = /*ase_frag_out:Alpha;Float;2;-1;_Alpha*/1/*end*/; + float AlphaClipThreshold = /*ase_frag_out:Alpha Clip Threshold;Float;3;-1;_AlphaClip*/0.5/*end*/; + + #ifdef _ALPHATEST_ON + clip( o.Alpha - AlphaClipThreshold ); + #endif + + #ifdef _DEPTHOFFSET_ON + outputDepth = IN.pos.z; + #endif + + UnityMetaInput metaIN; + UNITY_INITIALIZE_OUTPUT(UnityMetaInput, metaIN); + metaIN.Albedo = o.Albedo; + metaIN.Emission = o.Emission; + #ifdef EDITOR_VISUALIZATION + metaIN.VizUV = IN.vizUV; + metaIN.LightCoord = IN.lightCoord; + #endif + return UnityMetaFragment(metaIN); + } + ENDCG + } + + /*ase_pass*/ + Pass + { + /*ase_hide_pass*/ + Name "ShadowCaster" + Tags { "LightMode"="ShadowCaster" } + ZWrite On + ZTest LEqual + AlphaToMask Off + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma skip_variants FOG_LINEAR FOG_EXP FOG_EXP2 + #pragma multi_compile_shadowcaster + #ifndef UNITY_PASS_SHADOWCASTER + #define UNITY_PASS_SHADOWCASTER + #endif + #include "HLSLSupport.cginc" + #ifndef UNITY_INSTANCED_LOD_FADE + #define UNITY_INSTANCED_LOD_FADE + #endif + #ifndef UNITY_INSTANCED_SH + #define UNITY_INSTANCED_SH + #endif + #ifndef UNITY_INSTANCED_LIGHTMAPSTS + #define UNITY_INSTANCED_LIGHTMAPSTS + #endif + #if ( SHADER_API_D3D11 || SHADER_API_GLCORE || SHADER_API_GLES || SHADER_API_GLES3 || SHADER_API_METAL || SHADER_API_VULKAN ) + #define CAN_SKIP_VPOS + #endif + #include "UnityShaderVariables.cginc" + #include "UnityCG.cginc" + #include "Lighting.cginc" + #include "UnityPBSLighting.cginc" + + /*ase_pragma*/ + struct appdata { + float4 vertex : POSITION; + float4 tangent : TANGENT; + float3 normal : NORMAL; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + /*ase_vdata:p=p;t=t;n=n;uv1=tc1.xyzw;uv2=tc2.xyzw*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct v2f { + V2F_SHADOW_CASTER; + /*ase_interp(2,):sp=sp.xyzw*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + #ifdef UNITY_STANDARD_USE_DITHER_MASK + sampler3D _DitherMaskLOD; + #endif + #ifdef TESSELLATION_ON + float _TessPhongStrength; + float _TessValue; + float _TessMin; + float _TessMax; + float _TessEdgeLength; + float _TessMaxDisp; + #endif + /*ase_globals*/ + + /*ase_funcs*/ + + v2f VertexFunction (appdata v /*ase_vert_input*/ ) { + UNITY_SETUP_INSTANCE_ID(v); + v2f o; + UNITY_INITIALIZE_OUTPUT(v2f,o); + UNITY_TRANSFER_INSTANCE_ID(v,o); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + + /*ase_vert_code:v=appdata;o=v2f*/ + #ifdef ASE_ABSOLUTE_VERTEX_POS + float3 defaultVertexValue = v.vertex.xyz; + #else + float3 defaultVertexValue = float3(0, 0, 0); + #endif + float3 vertexValue = /*ase_vert_out:Vertex Offset;Float3;3;-1;_Vertex*/defaultVertexValue/*end*/; + #ifdef ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + v.vertex.w = 1; + v.normal = /*ase_vert_out:Vertex Normal;Float3;4;-1;_VertexNormal*/v.normal/*end*/; + v.tangent = /*ase_vert_out:Vertex Tangent;Float4;5;-1;_VertexTangent*/v.tangent/*end*/; + + TRANSFER_SHADOW_CASTER_NORMALOFFSET(o) + return o; + } + + #if defined(TESSELLATION_ON) + struct VertexControl + { + float4 vertex : INTERNALTESSPOS; + float4 tangent : TANGENT; + float3 normal : NORMAL; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + /*ase_vcontrol*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct TessellationFactors + { + float edge[3] : SV_TessFactor; + float inside : SV_InsideTessFactor; + }; + + VertexControl vert ( appdata v ) + { + VertexControl o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_TRANSFER_INSTANCE_ID(v, o); + o.vertex = v.vertex; + o.tangent = v.tangent; + o.normal = v.normal; + o.texcoord1 = v.texcoord1; + o.texcoord2 = v.texcoord2; + /*ase_control_code:v=appdata;o=VertexControl*/ + return o; + } + + TessellationFactors TessellationFunction (InputPatch v) + { + TessellationFactors o; + float4 tf = 1; + float tessValue = /*ase_inline_begin*/_TessValue/*ase_inline_end*/; float tessMin = /*ase_inline_begin*/_TessMin/*ase_inline_end*/; float tessMax = /*ase_inline_begin*/_TessMax/*ase_inline_end*/; + float edgeLength = /*ase_inline_begin*/_TessEdgeLength/*ase_inline_end*/; float tessMaxDisp = /*ase_inline_begin*/_TessMaxDisp/*ase_inline_end*/; + #if defined(ASE_FIXED_TESSELLATION) + tf = FixedTess( tessValue ); + #elif defined(ASE_DISTANCE_TESSELLATION) + tf = DistanceBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, tessValue, tessMin, tessMax, UNITY_MATRIX_M, _WorldSpaceCameraPos ); + #elif defined(ASE_LENGTH_TESSELLATION) + tf = EdgeLengthBasedTess(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, UNITY_MATRIX_M, _WorldSpaceCameraPos, _ScreenParams ); + #elif defined(ASE_LENGTH_CULL_TESSELLATION) + tf = EdgeLengthBasedTessCull(v[0].vertex, v[1].vertex, v[2].vertex, edgeLength, tessMaxDisp, UNITY_MATRIX_M, _WorldSpaceCameraPos, _ScreenParams, unity_CameraWorldClipPlanes ); + #endif + o.edge[0] = tf.x; o.edge[1] = tf.y; o.edge[2] = tf.z; o.inside = tf.w; + return o; + } + + [domain("tri")] + [partitioning("fractional_odd")] + [outputtopology("triangle_cw")] + [patchconstantfunc("TessellationFunction")] + [outputcontrolpoints(3)] + VertexControl HullFunction(InputPatch patch, uint id : SV_OutputControlPointID) + { + return patch[id]; + } + + [domain("tri")] + v2f DomainFunction(TessellationFactors factors, OutputPatch patch, float3 bary : SV_DomainLocation) + { + appdata o = (appdata) 0; + o.vertex = patch[0].vertex * bary.x + patch[1].vertex * bary.y + patch[2].vertex * bary.z; + o.tangent = patch[0].tangent * bary.x + patch[1].tangent * bary.y + patch[2].tangent * bary.z; + o.normal = patch[0].normal * bary.x + patch[1].normal * bary.y + patch[2].normal * bary.z; + o.texcoord1 = patch[0].texcoord1 * bary.x + patch[1].texcoord1 * bary.y + patch[2].texcoord1 * bary.z; + o.texcoord2 = patch[0].texcoord2 * bary.x + patch[1].texcoord2 * bary.y + patch[2].texcoord2 * bary.z; + /*ase_domain_code:patch=VertexControl;o=appdata;bary=SV_DomainLocation*/ + #if defined(ASE_PHONG_TESSELLATION) + float3 pp[3]; + for (int i = 0; i < 3; ++i) + pp[i] = o.vertex.xyz - patch[i].normal * (dot(o.vertex.xyz, patch[i].normal) - dot(patch[i].vertex.xyz, patch[i].normal)); + float phongStrength = /*ase_inline_begin*/_TessPhongStrength/*ase_inline_end*/; + o.vertex.xyz = phongStrength * (pp[0]*bary.x + pp[1]*bary.y + pp[2]*bary.z) + (1.0f-phongStrength) * o.vertex.xyz; + #endif + UNITY_TRANSFER_INSTANCE_ID(patch[0], o); + return VertexFunction(o); + } + #else + v2f vert ( appdata v ) + { + return VertexFunction( v ); + } + #endif + + fixed4 frag (v2f IN /*ase_frag_input*/ + #ifdef _DEPTHOFFSET_ON + , out float outputDepth : SV_Depth + #endif + #if !defined( CAN_SKIP_VPOS ) + , UNITY_VPOS_TYPE vpos : VPOS + #endif + ) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(IN); + + #ifdef LOD_FADE_CROSSFADE + UNITY_APPLY_DITHER_CROSSFADE(IN.pos.xy); + #endif + + #if defined(_SPECULAR_SETUP) + SurfaceOutputStandardSpecular o = (SurfaceOutputStandardSpecular)0; + #else + SurfaceOutputStandard o = (SurfaceOutputStandard)0; + #endif + + /*ase_frag_code:IN=v2f*/ + o.Normal = fixed3( 0, 0, 1 ); + o.Occlusion = 1; + o.Alpha = /*ase_frag_out:Alpha;Float;0;-1;_Alpha*/1/*end*/; + float AlphaClipThreshold = /*ase_frag_out:Alpha Clip Threshold;Float;1;-1;_AlphaClip*/0.5/*end*/; + float AlphaClipThresholdShadow = /*ase_frag_out:Alpha Clip Threshold Shadow;Float;2;-1;_AlphaClipShadow*/0.5/*end*/; + + #ifdef _ALPHATEST_SHADOW_ON + if (unity_LightShadowBias.z != 0.0) + clip(o.Alpha - AlphaClipThresholdShadow); + #ifdef _ALPHATEST_ON + else + clip(o.Alpha - AlphaClipThreshold); + #endif + #else + #ifdef _ALPHATEST_ON + clip(o.Alpha - AlphaClipThreshold); + #endif + #endif + + #if defined( CAN_SKIP_VPOS ) + float2 vpos = IN.pos; + #endif + + #ifdef UNITY_STANDARD_USE_DITHER_MASK + half alphaRef = tex3D(_DitherMaskLOD, float3(vpos.xy*0.25,o.Alpha*0.9375)).a; + clip(alphaRef - 0.01); + #endif + + #ifdef _DEPTHOFFSET_ON + outputDepth = IN.pos.z; + #endif + + SHADOW_CASTER_FRAGMENT(IN) + } + ENDCG + } + /*ase_pass_end*/ + } + CustomEditor "ASEMaterialInspector" +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/Lit.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/Lit.shader.meta new file mode 100644 index 0000000..39509d8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/Lit.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ed95fe726fd7b4644bb42f4d1ddd2bcd +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/MultiPassUnlit.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/MultiPassUnlit.shader new file mode 100644 index 0000000..b0eab5d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/MultiPassUnlit.shader @@ -0,0 +1,289 @@ +Shader /*ase_name*/ "Hidden/Templates/Legacy/Multi Pass Unlit" /*end*/ +{ + Properties + { + /*ase_props*/ + } + + SubShader + { + Tags { "RenderType"="Opaque" } + LOD 100 + + Cull Off + CGINCLUDE + #pragma target 3.0 + ENDCG + + /*ase_pass*/ + Pass + { + /*ase_main_pass*/ + Name "ForwardBase" + Tags { "LightMode"="ForwardBase" } + + /*ase_all_modules*/ + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile_fwdbase + #define UNITY_PASS_FORWARDBASE + #include "UnityCG.cginc" + /*ase_pragma*/ + /*ase_globals*/ + + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + UNITY_VERTEX_INPUT_INSTANCE_ID + /*ase_vdata:p=p;n=n*/ + }; + + struct v2f + { + float4 pos : SV_POSITION; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + /*ase_interp(1,):sp=sp.xyzw*/ + }; + + v2f vert ( appdata v /*ase_vert_input*/) + { + v2f o; + UNITY_INITIALIZE_OUTPUT(v2f,o); + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + + /*ase_vert_code:v=appdata;o=v2f*/ + + v.vertex.xyz += /*ase_vert_out:Local Vertex;Float3;_Vertex*/ float3(0,0,0) /*end*/; + o.pos = UnityObjectToClipPos(v.vertex); + #if ASE_SHADOWS + #if UNITY_VERSION >= 560 + UNITY_TRANSFER_SHADOW( o, v.texcoord ); + #else + TRANSFER_SHADOW( o ); + #endif + #endif + return o; + } + + float4 frag (v2f i /*ase_frag_input*/) : SV_Target + { + float3 outColor; + float outAlpha; + + /*ase_frag_code:i=v2f*/ + + outColor = /*ase_frag_out:Color;Float3;_Color*/float3(1,1,1)/*end*/; + outAlpha = /*ase_frag_out:Alpha;Float;_Alpha*/1/*end*/; + clip(outAlpha); + return float4(outColor,outAlpha); + } + ENDCG + } + + /*ase_pass*/ + Pass + { + Name "ForwardAdd" + Tags { "LightMode" = "ForwardAdd" } + ZWrite Off + Blend One One + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile_fwdadd_fullshadows + #define UNITY_PASS_FORWARDADD + #include "UnityCG.cginc" + /*ase_pragma*/ + /*ase_globals*/ + + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + UNITY_VERTEX_INPUT_INSTANCE_ID + /*ase_vdata:p=p;n=n*/ + }; + + struct v2f + { + float4 pos : SV_POSITION; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + /*ase_interp(1,):sp=sp.xyzw*/ + }; + + v2f vert ( appdata v /*ase_vert_input*/) + { + v2f o; + UNITY_INITIALIZE_OUTPUT(v2f,o); + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + + /*ase_vert_code:v=appdata;o=v2f*/ + + v.vertex.xyz += /*ase_vert_out:Local Vertex;Float3;_Vertex*/ float3(0,0,0) /*end*/; + o.pos = UnityObjectToClipPos(v.vertex); + #if ASE_SHADOWS + #if UNITY_VERSION >= 560 + UNITY_TRANSFER_SHADOW( o, v.texcoord ); + #else + TRANSFER_SHADOW( o ); + #endif + #endif + return o; + } + + float4 frag (v2f i /*ase_frag_input*/) : SV_Target + { + float3 outColor; + float outAlpha; + + /*ase_frag_code:i=v2f*/ + + outColor = /*ase_frag_out:Color;Float3;_Color*/float3(1,1,1)/*end*/; + outAlpha = /*ase_frag_out:Alpha;Float;_Alpha*/1/*end*/; + clip(outAlpha); + return float4(outColor,outAlpha); + } + ENDCG + } + + /*ase_pass*/ + Pass + { + Name "Deferred" + Tags { "LightMode" = "Deferred" } + + /*ase_all_modules*/ + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile_prepassfinal + #define UNITY_PASS_DEFERRED + #include "UnityCG.cginc" + /*ase_pragma*/ + /*ase_globals*/ + + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + UNITY_VERTEX_INPUT_INSTANCE_ID + /*ase_vdata:p=p;n=n*/ + }; + + struct v2f + { + float4 pos : SV_POSITION; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + /*ase_interp(1,):sp=sp.xyzw*/ + }; + + v2f vert ( appdata v /*ase_vert_input*/) + { + v2f o; + UNITY_INITIALIZE_OUTPUT(v2f,o); + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + + /*ase_vert_code:v=appdata;o=v2f*/ + + v.vertex.xyz += /*ase_vert_out:Local Vertex;Float3;_Vertex*/ float3(0,0,0) /*end*/; + o.pos = UnityObjectToClipPos(v.vertex); + #if ASE_SHADOWS + #if UNITY_VERSION >= 560 + UNITY_TRANSFER_SHADOW( o, v.texcoord ); + #else + TRANSFER_SHADOW( o ); + #endif + #endif + return o; + } + + void frag (v2f i /*ase_frag_input*/, out half4 outGBuffer0 : SV_Target0, out half4 outGBuffer1 : SV_Target1, out half4 outGBuffer2 : SV_Target2, out half4 outGBuffer3 : SV_Target3) + { + /*ase_frag_code:i=v2f*/ + + outGBuffer0 = /*ase_frag_out:GBuffer0;Float4*/0/*end*/; + outGBuffer1 = /*ase_frag_out:GBuffer1;Float4*/0/*end*/; + outGBuffer2 = /*ase_frag_out:GBuffer2;Float4*/0/*end*/; + outGBuffer3 = /*ase_frag_out:GBuffer3;Float4*/0/*end*/; + } + ENDCG + } + + /*ase_pass*/ + Pass + { + /*ase_hide_pass:SyncP*/ + Name "ShadowCaster" + Tags { "LightMode"="ShadowCaster" } + ZWrite On + ZTest LEqual + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile_shadowcaster + #define UNITY_PASS_SHADOWCASTER + #include "UnityCG.cginc" + /*ase_pragma*/ + /*ase_globals*/ + + struct appdata + { + float4 vertex : POSITION; + float3 normal : NORMAL; + UNITY_VERTEX_INPUT_INSTANCE_ID + /*ase_vdata:p=p;n=n*/ + }; + + struct v2f + { + V2F_SHADOW_CASTER; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + /*ase_interp(1,):sp=sp.xyzw*/ + }; + + + v2f vert ( appdata v /*ase_vert_input*/) + { + v2f o; + UNITY_INITIALIZE_OUTPUT(v2f,o); + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + + /*ase_vert_code:v=appdata;o=v2f*/ + + v.vertex.xyz += /*ase_vert_out:Local Vertex;Float3;_Vertex*/ float3(0,0,0) /*end*/; + TRANSFER_SHADOW_CASTER_NORMALOFFSET(o) + return o; + } + + float4 frag (v2f i /*ase_frag_input*/) : SV_Target + { + float3 outColor; + float outAlpha; + + /*ase_frag_code:i=v2f*/ + + outColor = /*ase_frag_out:Color;Float3;_Color*/float3(1,1,1)/*end*/; + outAlpha = /*ase_frag_out:Alpha;Float;_Alpha*/1/*end*/; + clip(outAlpha); + SHADOW_CASTER_FRAGMENT(i) + } + ENDCG + } + /*ase_pass_end*/ + } + CustomEditor "ASEMaterialInspector" +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/MultiPassUnlit.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/MultiPassUnlit.shader.meta new file mode 100644 index 0000000..aab11e9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/MultiPassUnlit.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e1de45c0d41f68c41b2cc20c8b9c05ef +timeCreated: 1496328687 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/Particle Alpha Blend.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/Particle Alpha Blend.shader new file mode 100644 index 0000000..c501235 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/Particle Alpha Blend.shader @@ -0,0 +1,123 @@ +Shader /*ase_name*/ "Hidden/Templates/Legacy/Particles Alpha Blended" /*end*/ +{ + Properties + { + _TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5) + _MainTex ("Particle Texture", 2D) = "white" {} + _InvFade ("Soft Particles Factor", Range(0.01,3.0)) = 1.0 + /*ase_props*/ + } + + + Category + { + SubShader + { + Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" "PreviewType" = "Plane" } + Blend SrcAlpha OneMinusSrcAlpha + ColorMask RGB + Cull Off + Lighting Off + ZWrite Off + ZTest LEqual + /*ase_pass*/ + Pass { + + CGPROGRAM + #ifndef UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX + #define UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input) + #endif + + #pragma vertex vert + #pragma fragment frag + #pragma target 2.0 + #pragma multi_compile_instancing + #pragma multi_compile_particles + #pragma multi_compile_fog + /*ase_pragma*/ + + #include "UnityCG.cginc" + + struct appdata_t + { + float4 vertex : POSITION; + fixed4 color : COLOR; + float4 texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + /*ase_vdata:p=p;uv0=tc0;c=c*/ + }; + + struct v2f + { + float4 vertex : SV_POSITION; + fixed4 color : COLOR; + float4 texcoord : TEXCOORD0; + UNITY_FOG_COORDS(1) + #ifdef SOFTPARTICLES_ON + float4 projPos : TEXCOORD2; + #endif + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + /*ase_interp(3,):sp=sp.xyzw;uv0=tc0;c=c*/ + }; + + + #if UNITY_VERSION >= 560 + UNITY_DECLARE_DEPTH_TEXTURE( _CameraDepthTexture ); + #else + uniform sampler2D_float _CameraDepthTexture; + #endif + + //Don't delete this comment + // uniform sampler2D_float _CameraDepthTexture; + + uniform sampler2D _MainTex; + uniform fixed4 _TintColor; + uniform float4 _MainTex_ST; + uniform float _InvFade; + /*ase_globals*/ + + v2f vert ( appdata_t v /*ase_vert_input*/ ) + { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + /*ase_vert_code:v=appdata_t;o=v2f*/ + + v.vertex.xyz += /*ase_vert_out:Offset;Float3*/ float3( 0, 0, 0 ) /*end*/; + o.vertex = UnityObjectToClipPos(v.vertex); + #ifdef SOFTPARTICLES_ON + o.projPos = ComputeScreenPos (o.vertex); + COMPUTE_EYEDEPTH(o.projPos.z); + #endif + o.color = v.color; + o.texcoord = v.texcoord; + UNITY_TRANSFER_FOG(o,o.vertex); + return o; + } + + fixed4 frag ( v2f i /*ase_frag_input*/ ) : SV_Target + { + UNITY_SETUP_INSTANCE_ID( i ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( i ); + + #ifdef SOFTPARTICLES_ON + float sceneZ = LinearEyeDepth (SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos))); + float partZ = i.projPos.z; + float fade = saturate (_InvFade * (sceneZ-partZ)); + i.color.a *= fade; + #endif + + /*ase_frag_code:i=v2f*/ + + fixed4 col = /*ase_frag_out:Color;Float4*/2.0f * i.color * _TintColor * tex2D(_MainTex, i.texcoord.xy*_MainTex_ST.xy + _MainTex_ST.zw )/*end*/; + UNITY_APPLY_FOG(i.fogCoord, col); + return col; + } + ENDCG + } + } + } + CustomEditor "ASEMaterialInspector" +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/Particle Alpha Blend.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/Particle Alpha Blend.shader.meta new file mode 100644 index 0000000..8880a98 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/Particle Alpha Blend.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0b6a9f8b4f707c74ca64c0be8e590de0 +timeCreated: 1496654572 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/PostProcess.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/PostProcess.shader new file mode 100644 index 0000000..e862731 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/PostProcess.shader @@ -0,0 +1,94 @@ +Shader /*ase_name*/ "Hidden/Templates/Legacy/PostProcess" /*end*/ +{ + Properties + { + _MainTex ( "Screen", 2D ) = "black" {} + /*ase_props*/ + } + + SubShader + { + Tags{ } + + ZTest Always + Cull Off + ZWrite Off + + /*ase_pass*/ + Pass + { + CGPROGRAM + + #pragma vertex vert_img_custom + #pragma fragment frag + #pragma target 3.0 + #include "UnityCG.cginc" + /*ase_pragma*/ + + struct appdata_img_custom + { + float4 vertex : POSITION; + half2 texcoord : TEXCOORD0; + /*ase_vdata:p=p;uv0=tc0*/ + }; + + struct v2f_img_custom + { + float4 pos : SV_POSITION; + half2 uv : TEXCOORD0; + half2 stereoUV : TEXCOORD2; + #if UNITY_UV_STARTS_AT_TOP + half4 uv2 : TEXCOORD1; + half4 stereoUV2 : TEXCOORD3; + #endif + /*ase_interp(4,):sp=sp.xyzw;uv0=tc0.xy;uv1=tc1;uv2=tc2;uv3=tc3*/ + }; + + uniform sampler2D _MainTex; + uniform half4 _MainTex_TexelSize; + uniform half4 _MainTex_ST; + + /*ase_globals*/ + + v2f_img_custom vert_img_custom ( appdata_img_custom v /*ase_vert_input*/ ) + { + v2f_img_custom o; + /*ase_vert_code:v=appdata_img_custom;o=v2f_img_custom*/ + o.pos = UnityObjectToClipPos( v.vertex ); + o.uv = float4( v.texcoord.xy, 1, 1 ); + + #if UNITY_UV_STARTS_AT_TOP + o.uv2 = float4( v.texcoord.xy, 1, 1 ); + o.stereoUV2 = UnityStereoScreenSpaceUVAdjust ( o.uv2, _MainTex_ST ); + + if ( _MainTex_TexelSize.y < 0.0 ) + o.uv.y = 1.0 - o.uv.y; + #endif + o.stereoUV = UnityStereoScreenSpaceUVAdjust ( o.uv, _MainTex_ST ); + return o; + } + + half4 frag ( v2f_img_custom i /*ase_frag_input*/) : SV_Target + { + #ifdef UNITY_UV_STARTS_AT_TOP + half2 uv = i.uv2; + half2 stereoUV = i.stereoUV2; + #else + half2 uv = i.uv; + half2 stereoUV = i.stereoUV; + #endif + + half4 finalColor; + + // ase common template code + /*ase_frag_code:i=v2f_img_custom*/ + + finalColor = /*ase_frag_out:Frag Color;Float4*/half4( 1, 1, 1, 1 )/*end*/; + + return finalColor; + } + ENDCG + } + } + CustomEditor "ASEMaterialInspector" +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/PostProcess.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/PostProcess.shader.meta new file mode 100644 index 0000000..010915c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/PostProcess.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c71b220b631b6344493ea3cf87110c93 +timeCreated: 1499337997 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/Sprites-Default.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/Sprites-Default.shader new file mode 100644 index 0000000..555eba9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/Sprites-Default.shader @@ -0,0 +1,114 @@ +Shader /*ase_name*/"Hidden/Templates/Legacy/Sprites Default"/*end*/ +{ + Properties + { + [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {} + _Color ("Tint", Color) = (1,1,1,1) + [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0 + [PerRendererData] _AlphaTex ("External Alpha", 2D) = "white" {} + /*ase_props*/ + } + + SubShader + { + Tags + { + "Queue"="Transparent" + "IgnoreProjector"="True" + "RenderType"="Transparent" + "PreviewType"="Plane" + "CanUseSpriteAtlas"="True" + } + + Cull Off + Lighting Off + ZWrite Off + Blend One OneMinusSrcAlpha + + /*ase_pass*/ + Pass + { + CGPROGRAM + #ifndef UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX + #define UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input) + #endif + #pragma vertex vert + #pragma fragment frag + #pragma target 3.0 + #pragma multi_compile _ PIXELSNAP_ON + #pragma multi_compile _ ETC1_EXTERNAL_ALPHA + #include "UnityCG.cginc" + /*ase_pragma*/ + + struct appdata_t + { + float4 vertex : POSITION; + float4 color : COLOR; + float2 texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + /*ase_vdata:p=p;uv0=tc0.xy;c=c*/ + }; + + struct v2f + { + float4 vertex : SV_POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + /*ase_interp(1,):sp=sp.xyzw;uv0=tc0.xy;c=c*/ + }; + + uniform fixed4 _Color; + uniform float _EnableExternalAlpha; + uniform sampler2D _MainTex; + uniform sampler2D _AlphaTex; + /*ase_globals*/ + + v2f vert( appdata_t IN /*ase_vert_input*/ ) + { + v2f OUT; + UNITY_SETUP_INSTANCE_ID(IN); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT); + UNITY_TRANSFER_INSTANCE_ID(IN, OUT); + /*ase_vert_code:IN=appdata_t;OUT=v2f*/ + + IN.vertex.xyz += /*ase_vert_out:Offset;Float3*/ float3(0,0,0) /*end*/; + OUT.vertex = UnityObjectToClipPos(IN.vertex); + OUT.texcoord = IN.texcoord; + OUT.color = IN.color * _Color; + #ifdef PIXELSNAP_ON + OUT.vertex = UnityPixelSnap (OUT.vertex); + #endif + + return OUT; + } + + fixed4 SampleSpriteTexture (float2 uv) + { + fixed4 color = tex2D (_MainTex, uv); + +#if ETC1_EXTERNAL_ALPHA + // get the color from an external texture (usecase: Alpha support for ETC1 on android) + fixed4 alpha = tex2D (_AlphaTex, uv); + color.a = lerp (color.a, alpha.r, _EnableExternalAlpha); +#endif //ETC1_EXTERNAL_ALPHA + + return color; + } + + fixed4 frag(v2f IN /*ase_frag_input*/ ) : SV_Target + { + UNITY_SETUP_INSTANCE_ID( IN ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + /*ase_frag_code:IN=v2f*/ + fixed4 c = /*ase_frag_out:Color;Float4*/SampleSpriteTexture (IN.texcoord) * IN.color/*end*/; + c.rgb *= c.a; + return c; + } + ENDCG + } + } + CustomEditor "ASEMaterialInspector" +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/Sprites-Default.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/Sprites-Default.shader.meta new file mode 100644 index 0000000..560e691 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/Sprites-Default.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0f8ba0101102bb14ebf021ddadce9b49 +timeCreated: 1500572363 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/UIDefault.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/UIDefault.shader new file mode 100644 index 0000000..d537951 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/UIDefault.shader @@ -0,0 +1,133 @@ +Shader /*ase_name*/"Hidden/Templates/Legacy/UIDefault"/*end*/ +{ + Properties + { + [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {} + _Color ("Tint", Color) = (1,1,1,1) + + _StencilComp ("Stencil Comparison", Float) = 8 + _Stencil ("Stencil ID", Float) = 0 + _StencilOp ("Stencil Operation", Float) = 0 + _StencilWriteMask ("Stencil Write Mask", Float) = 255 + _StencilReadMask ("Stencil Read Mask", Float) = 255 + + _ColorMask ("Color Mask", Float) = 15 + + [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0 + /*ase_props*/ + } + + SubShader + { + Tags + { + "Queue"="Transparent" + "IgnoreProjector"="True" + "RenderType"="Transparent" + "PreviewType"="Plane" + "CanUseSpriteAtlas"="True" + } + + Stencil + { + Ref [_Stencil] + Comp [_StencilComp] + Pass [_StencilOp] + ReadMask [_StencilReadMask] + WriteMask [_StencilWriteMask] + } + + Cull Off + Lighting Off + ZWrite Off + ZTest [unity_GUIZTestMode] + Blend SrcAlpha OneMinusSrcAlpha + ColorMask [_ColorMask] + + /*ase_pass*/ + Pass + { + Name "Default" + CGPROGRAM + #ifndef UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX + #define UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input) + #endif + #pragma vertex vert + #pragma fragment frag + #pragma target 3.0 + + #include "UnityCG.cginc" + #include "UnityUI.cginc" + + #pragma multi_compile __ UNITY_UI_CLIP_RECT + #pragma multi_compile __ UNITY_UI_ALPHACLIP + + /*ase_pragma*/ + + struct appdata_t + { + float4 vertex : POSITION; + float4 color : COLOR; + float2 texcoord : TEXCOORD0; + UNITY_VERTEX_INPUT_INSTANCE_ID + /*ase_vdata:p=p;uv0=tc0.xy;c=c*/ + }; + + struct v2f + { + float4 vertex : SV_POSITION; + fixed4 color : COLOR; + half2 texcoord : TEXCOORD0; + float4 worldPosition : TEXCOORD1; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + /*ase_interp(2,):sp=sp.xyzw;uv0=tc0.xy;c=c;uv1=tc1.xyzw*/ + }; + + uniform fixed4 _Color; + uniform fixed4 _TextureSampleAdd; + uniform float4 _ClipRect; + uniform sampler2D _MainTex; + /*ase_globals*/ + + v2f vert( appdata_t IN /*ase_vert_input*/ ) + { + v2f OUT; + UNITY_SETUP_INSTANCE_ID( IN ); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT); + UNITY_TRANSFER_INSTANCE_ID(IN, OUT); + OUT.worldPosition = IN.vertex; + /*ase_vert_code:IN=appdata_t;OUT=v2f*/ + + OUT.worldPosition.xyz += /*ase_vert_out:Offset;Float3*/ float3( 0, 0, 0 ) /*end*/; + OUT.vertex = UnityObjectToClipPos(OUT.worldPosition); + + OUT.texcoord = IN.texcoord; + + OUT.color = IN.color * _Color; + return OUT; + } + + fixed4 frag(v2f IN /*ase_frag_input*/ ) : SV_Target + { + UNITY_SETUP_INSTANCE_ID( IN ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( IN ); + + /*ase_frag_code:IN=v2f*/ + half4 color = /*ase_frag_out:Color;Float4*/(tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color/*end*/; + + #ifdef UNITY_UI_CLIP_RECT + color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect); + #endif + + #ifdef UNITY_UI_ALPHACLIP + clip (color.a - 0.001); + #endif + + return color; + } + ENDCG + } + } + CustomEditor "ASEMaterialInspector" +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/UIDefault.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/UIDefault.shader.meta new file mode 100644 index 0000000..0d8bdf7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/UIDefault.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 5056123faa0c79b47ab6ad7e8bf059a4 +timeCreated: 1496313583 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/Unlit.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/Unlit.shader new file mode 100644 index 0000000..46cd41e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/Unlit.shader @@ -0,0 +1,103 @@ +Shader /*ase_name*/ "Hidden/Templates/Unlit" /*end*/ +{ + Properties + { + /*ase_props*/ + } + + SubShader + { + /*ase_subshader_options:Name=Additional Options + Option:Vertex Position,InvertActionOnDeselection:Absolute,Relative:Relative + Absolute:SetDefine:ASE_ABSOLUTE_VERTEX_POS 1 + Absolute:SetPortName:1,Vertex Position + Relative:SetPortName:1,Vertex Offset + */ + + Tags { "RenderType"="Opaque" } + LOD 100 + + /*ase_all_modules*/ + + /*ase_pass*/ + Pass + { + Name "Unlit" + Tags { "LightMode" = "ForwardBase" } + CGPROGRAM + + #ifndef UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX + //only defining to not throw compilation error over Unity 5.5 + #define UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input) + #endif + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile_instancing + #include "UnityCG.cginc" + /*ase_pragma*/ + + struct appdata + { + float4 vertex : POSITION; + float4 color : COLOR; + /*ase_vdata:p=p;c=c*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + }; + + struct v2f + { + float4 vertex : SV_POSITION; + #ifdef ASE_NEEDS_FRAG_WORLD_POSITION + float3 worldPos : TEXCOORD0; + #endif + /*ase_interp(1,):sp=sp.xyzw;wp=tc0*/ + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + }; + + /*ase_globals*/ + + v2f vert ( appdata v /*ase_vert_input*/) + { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + + /*ase_vert_code:v=appdata;o=v2f*/ + float3 vertexValue = float3(0, 0, 0); + #if ASE_ABSOLUTE_VERTEX_POS + vertexValue = v.vertex.xyz; + #endif + vertexValue = /*ase_vert_out:Vertex Offset;Float3*/vertexValue/*end*/; + #if ASE_ABSOLUTE_VERTEX_POS + v.vertex.xyz = vertexValue; + #else + v.vertex.xyz += vertexValue; + #endif + o.vertex = UnityObjectToClipPos(v.vertex); + + #ifdef ASE_NEEDS_FRAG_WORLD_POSITION + o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz; + #endif + return o; + } + + fixed4 frag (v2f i /*ase_frag_input*/) : SV_Target + { + UNITY_SETUP_INSTANCE_ID(i); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); + fixed4 finalColor; + #ifdef ASE_NEEDS_FRAG_WORLD_POSITION + /*ase_local_var:wp*/float3 WorldPosition = i.worldPos; + #endif + /*ase_frag_code:i=v2f*/ + + finalColor = /*ase_frag_out:Frag Color;Float4*/fixed4(1,1,1,1)/*end*/; + return finalColor; + } + ENDCG + } + } + CustomEditor "ASEMaterialInspector" +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/Unlit.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/Unlit.shader.meta new file mode 100644 index 0000000..0c928b0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/Unlit.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0770190933193b94aaa3065e307002fa +timeCreated: 1496328687 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/UnlitLightmap.shader b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/UnlitLightmap.shader new file mode 100644 index 0000000..236a6ab --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/UnlitLightmap.shader @@ -0,0 +1,127 @@ +Shader /*ase_name*/ "Hidden/Templates/Legacy/UnlitLightmap" /*end*/ +{ + Properties + { + /*ase_props*/ + } + + SubShader + { + Tags { "RenderType"="Opaque" } + LOD 100 + /*ase_all_modules*/ + CGINCLUDE + #ifndef UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX + #define UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input) + #endif + ENDCG + Pass + { + /*ase_main_pass*/ + Tags{ "LightMode" = "VertexLMRGBM" "RenderType" = "Opaque" } + Name "Unlit LM" + CGPROGRAM + #pragma target 2.0 + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + /*ase_pragma*/ + + struct appdata + { + float4 vertex : POSITION; + UNITY_VERTEX_INPUT_INSTANCE_ID + /*ase_vdata:p=p*/ + }; + + struct v2f + { + float4 vertex : SV_POSITION; + UNITY_VERTEX_INPUT_INSTANCE_ID + UNITY_VERTEX_OUTPUT_STEREO + /*ase_interp(0,):sp=sp.xyzw*/ + }; + + /*ase_globals*/ + + v2f vert ( appdata v /*ase_vert_input*/) + { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + UNITY_TRANSFER_INSTANCE_ID(v, o); + /*ase_vert_code:v=appdata;o=v2f*/ + + v.vertex.xyz += /*ase_vert_out:Local Vertex;Float3;_Vertex*/ float3(0,0,0) /*end*/; + o.vertex = UnityObjectToClipPos(v.vertex); + return o; + } + + fixed4 frag (v2f i /*ase_frag_input*/) : SV_Target + { + UNITY_SETUP_INSTANCE_ID( i ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( i ); + fixed4 finalColor; + /*ase_frag_code:i=v2f*/ + + finalColor = /*ase_frag_out:Frag Color;Float4;_Color*/fixed4(1,1,1,1)/*end*/; + return finalColor; + } + ENDCG + } + + Pass + { + /*ase_hide_pass*/ + Tags{ "LightMode" = "VertexLM" "RenderType" = "Opaque" } + Name "Unlit LM Mobile" + CGPROGRAM + #pragma target 2.0 + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + /*ase_pragma*/ + + struct appdata + { + float4 vertex : POSITION; + UNITY_VERTEX_INPUT_INSTANCE_ID + /*ase_vdata:p=p*/ + }; + + struct v2f + { + float4 vertex : SV_POSITION; + UNITY_VERTEX_OUTPUT_STEREO + /*ase_interp(0,):sp=sp.xyzw*/ + }; + + /*ase_globals*/ + + v2f vert ( appdata v /*ase_vert_input*/) + { + v2f o; + UNITY_SETUP_INSTANCE_ID(v); + UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); + /*ase_vert_code:v=appdata;o=v2f*/ + + v.vertex.xyz += /*ase_vert_out:Local Vertex;Float3;_Vertex*/ float3(0,0,0) /*end*/; + o.vertex = UnityObjectToClipPos(v.vertex); + return o; + } + + fixed4 frag (v2f i /*ase_frag_input*/) : SV_Target + { + UNITY_SETUP_INSTANCE_ID( i ); + UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX( i ); + fixed4 finalColor; + /*ase_frag_code:i=v2f*/ + + finalColor = /*ase_frag_out:Frag Color;Float4;_Color*/fixed4(1,1,1,1)/*end*/; + return finalColor; + } + ENDCG + } + } + CustomEditor "ASEMaterialInspector" +} diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/UnlitLightmap.shader.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/UnlitLightmap.shader.meta new file mode 100644 index 0000000..38c7e30 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/Legacy/UnlitLightmap.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 899e609c083c74c4ca567477c39edef0 +timeCreated: 1528987785 +licenseType: Store +ShaderImporter: + defaultTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/PPStackTemplates.unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/PPStackTemplates.unitypackage.meta new file mode 100644 index 0000000..d2aa6b0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/PPStackTemplates.unitypackage.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f86c907c9d9e85846835ba31e656bd60 +timeCreated: 1550245105 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy).meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy).meta new file mode 100644 index 0000000..1d7537c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy).meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: cc9e432e1a0a4764f80870c080173cb7 +folderAsset: yes +timeCreated: 1520621311 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/HDSRPTemplates 3xx (Legacy).unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/HDSRPTemplates 3xx (Legacy).unitypackage.meta new file mode 100644 index 0000000..36f907a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/HDSRPTemplates 3xx (Legacy).unitypackage.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4dc1afbcc68875c4780502f5e6b80158 +timeCreated: 1540292246 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: \ No newline at end of file diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/HDSRPTemplates 4xx (Legacy).unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/HDSRPTemplates 4xx (Legacy).unitypackage.meta new file mode 100644 index 0000000..723e586 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/HDSRPTemplates 4xx (Legacy).unitypackage.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5d615bf612f33364e96fb9fd2959ae9c +timeCreated: 1555497476 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/HDSRPTemplates 572 (Legacy).unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/HDSRPTemplates 572 (Legacy).unitypackage.meta new file mode 100644 index 0000000..e1e2fdf --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/HDSRPTemplates 572 (Legacy).unitypackage.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f51b7b861facbc3429fcc5f1f6f91183 +timeCreated: 1557327368 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/HDSRPTemplates 5xx (Legacy).unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/HDSRPTemplates 5xx (Legacy).unitypackage.meta new file mode 100644 index 0000000..7083290 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/HDSRPTemplates 5xx (Legacy).unitypackage.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2d7fe4f7c19e90f41b893bc01fc17230 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/HDSRPTemplates 6xx (Legacy).unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/HDSRPTemplates 6xx (Legacy).unitypackage.meta new file mode 100644 index 0000000..152e7ef --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/HDSRPTemplates 6xx (Legacy).unitypackage.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e137dba02f4d0f542ab09dcedea27314 +timeCreated: 1583243128 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/HDSRPTemplates 7xx - 9xx (Legacy).unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/HDSRPTemplates 7xx - 9xx (Legacy).unitypackage.meta new file mode 100644 index 0000000..3c74694 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/HDSRPTemplates 7xx - 9xx (Legacy).unitypackage.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3aeabe705b70b154ea99893f91351100 +timeCreated: 1607957446 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/LWSRPTemplates 3xx (Legacy).unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/LWSRPTemplates 3xx (Legacy).unitypackage.meta new file mode 100644 index 0000000..e46ecb3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/LWSRPTemplates 3xx (Legacy).unitypackage.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b53d2f3b156ff104f90d4d7693d769c8 +timeCreated: 1540215707 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/LWSRPTemplates 4xx (Legacy).unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/LWSRPTemplates 4xx (Legacy).unitypackage.meta new file mode 100644 index 0000000..5dc9074 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/LWSRPTemplates 4xx (Legacy).unitypackage.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3e8eabcfae1e5aa4397de89fedeb48db +timeCreated: 1555497476 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/README.txt b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/README.txt new file mode 100644 index 0000000..e2c4956 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/README.txt @@ -0,0 +1,36 @@ +Both High Definition and Lightweight rendering pipelines are in development and in a preview state, so Amplify Shader Editor may have some nodes that are not fully updated for them. +At the moment there are, for each SRP, two separate packages inside Amplify Shader Editor. They contemplate two major SRP versions that exist at the moment. +For Unity 2018.2 and below, users can only install v3.x.x for both HD and LW rendering pipelines and as such they will need to unpack the unity packages containing the 3xx (Legacy) tag. +For Unity 2018.3, users can only install v4.x.x for both HD and LW rendering pipelines and as such they will need to unpack the unity packages containing the 4xx (Legacy) tag. +For Unity 2019.1 and above, users can only install v5.x.x for both HD and LW rendering pipelines and as such they will need to unpack the unity packages NOT containing the (Legacy) tag. + +Unity 2018.2.x, HD and LW v3.x.x: +* HDSRPTemplates 3xx (Legacy).unitypackage + * HD PBR + * HD Unlit + +* LWSRPTemplates 3xx (Legacy).unitypackage + * Lightweight PBR + * Lightweight Unlit + +Unity 2018.3.x, HD and LW v4.x.x: +* HDSRPTemplates 4xx (Legacy).unitypackage + * HD Lit + * HD PBR + * HD Unlit + +* LWSRPTemplates 4xx (Legacy).unitypackage + * Lightweight PBR + * Lightweight Unlit + +Unity 2019.1.x, HD and LW v5.x.x: +* HDSRPTemplates.unitypackage + * HD Lit + * HD PBR + * HD Unlit + +* LWSRPTemplates.unitypackage + * Lightweight PBR + * Lightweight Unlit + +Upon unpacking, the templates they may not be instantly available at the ( Create > Amplify Shader > ... ) menu over you project view, but a user can create p.e. a new Amplify Surface Shader, go to its Shader Type menu over the left Node Properties window and select its newly installed template. \ No newline at end of file diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/README.txt.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/README.txt.meta new file mode 100644 index 0000000..0357e65 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/README.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2700348f89ce70c45a61d215e6999fee +timeCreated: 1541774040 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/USRPTemplates 7xx - 9xx (Legacy).unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/USRPTemplates 7xx - 9xx (Legacy).unitypackage.meta new file mode 100644 index 0000000..a042bad --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/SRP (Legacy)/USRPTemplates 7xx - 9xx (Legacy).unitypackage.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f54faaaf4faf8784183ede7f87dfeb23 +timeCreated: 1608224299 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/USRPTemplates.unitypackage.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/USRPTemplates.unitypackage.meta new file mode 100644 index 0000000..cc3f5dd --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Templates/USRPTemplates.unitypackage.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 57fcea0ed8b5eb347923c4c21fa31b57 +timeCreated: 1569420442 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures.meta new file mode 100644 index 0000000..f2b28c6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c7eb84ba37e424945bd8c7221dc5b55a +folderAsset: yes +timeCreated: 1481126944 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/About.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/About.png new file mode 100644 index 0000000..55b5017 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/About.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/About.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/About.png.meta new file mode 100644 index 0000000..1caa32d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/About.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 8aba6bb20faf8824d9d81946542f1ce1 +timeCreated: 1481127003 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/Icon64.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/Icon64.png new file mode 100644 index 0000000..d8f46d3 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/Icon64.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/Icon64.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/Icon64.png.meta new file mode 100644 index 0000000..0ca0e8c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/Icon64.png.meta @@ -0,0 +1,82 @@ +fileFormatVersion: 2 +guid: 2c6536772776dd84f872779990273bfc +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 64 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/black.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/black.png new file mode 100644 index 0000000..bc9d9b9 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/black.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/black.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/black.png.meta new file mode 100644 index 0000000..47736ae --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/black.png.meta @@ -0,0 +1,59 @@ +fileFormatVersion: 2 +guid: 7a170cdb7cc88024cb628cfcdbb6705c +timeCreated: 1481126998 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/blue.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/blue.png new file mode 100644 index 0000000..3d77530 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/blue.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/blue.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/blue.png.meta new file mode 100644 index 0000000..bf20fa3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/blue.png.meta @@ -0,0 +1,59 @@ +fileFormatVersion: 2 +guid: 826f80ee0ad07444c8558af826a4df2e +timeCreated: 1481127000 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/flat.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/flat.png new file mode 100644 index 0000000..ce71188 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/flat.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/flat.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/flat.png.meta new file mode 100644 index 0000000..723b460 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/flat.png.meta @@ -0,0 +1,59 @@ +fileFormatVersion: 2 +guid: 194a51ad3c0179644abea3f196c5ebe6 +timeCreated: 1481126977 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/green.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/green.png new file mode 100644 index 0000000..2128cfb Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/green.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/green.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/green.png.meta new file mode 100644 index 0000000..be19036 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/green.png.meta @@ -0,0 +1,59 @@ +fileFormatVersion: 2 +guid: 352167e52fa3b0c43ac690f5e2debc2b +timeCreated: 1481126984 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/grey.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/grey.png new file mode 100644 index 0000000..4c317fd Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/grey.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/grey.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/grey.png.meta new file mode 100644 index 0000000..43efb49 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/grey.png.meta @@ -0,0 +1,59 @@ +fileFormatVersion: 2 +guid: 31d5a2d79390ab542a81a6699a999758 +timeCreated: 1481126984 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/red.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/red.png new file mode 100644 index 0000000..47fd9a4 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/red.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/red.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/red.png.meta new file mode 100644 index 0000000..d3d0d16 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/red.png.meta @@ -0,0 +1,59 @@ +fileFormatVersion: 2 +guid: af5ab63a69b074347be0e4c17fb9dc1b +timeCreated: 1481127009 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/white.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/white.png new file mode 100644 index 0000000..393b83b Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/white.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/white.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/white.png.meta new file mode 100644 index 0000000..d361ab0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/Textures/white.png.meta @@ -0,0 +1,59 @@ +fileFormatVersion: 2 +guid: 37e6f91f3efb0954cbdce254638862ea +timeCreated: 1481126984 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI.meta new file mode 100644 index 0000000..a5bdca4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b4971ff9c9d7bfd488d84e355318f683 +folderAsset: yes +timeCreated: 1481126944 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons.meta new file mode 100644 index 0000000..2652961 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f0f8f4a0c1ef2d14d975ace997712605 +folderAsset: yes +timeCreated: 1481126946 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/AddToList.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/AddToList.png new file mode 100644 index 0000000..996a714 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/AddToList.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/AddToList.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/AddToList.png.meta new file mode 100644 index 0000000..3596781 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/AddToList.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: cccc116a6334dc1428687697c5a11d58 +timeCreated: 1481127016 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Checkmark.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Checkmark.png new file mode 100644 index 0000000..fa6b9dc Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Checkmark.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Checkmark.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Checkmark.png.meta new file mode 100644 index 0000000..8c8f28f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Checkmark.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: e9c4642eaa083a54ab91406d8449e6ac +timeCreated: 1506956323 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: 5 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CircularToggle_OFF_Dark.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CircularToggle_OFF_Dark.png new file mode 100644 index 0000000..af81db4 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CircularToggle_OFF_Dark.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CircularToggle_OFF_Dark.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CircularToggle_OFF_Dark.png.meta new file mode 100644 index 0000000..10bde39 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CircularToggle_OFF_Dark.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 1aaca50d084b0bb43854f075ce2f302b +timeCreated: 1526466929 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CircularToggle_ON_Dark.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CircularToggle_ON_Dark.png new file mode 100644 index 0000000..da7b066 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CircularToggle_ON_Dark.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CircularToggle_ON_Dark.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CircularToggle_ON_Dark.png.meta new file mode 100644 index 0000000..17e618a --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CircularToggle_ON_Dark.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: ac0860a6a77e29d4091ba790a17daa0f +timeCreated: 1526466092 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CleanupOFF.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CleanupOFF.png new file mode 100644 index 0000000..18a8f62 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CleanupOFF.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CleanupOFF.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CleanupOFF.png.meta new file mode 100644 index 0000000..6dc17c9 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CleanupOFF.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: f62c0c3a5ddcd844e905fb2632fdcb15 +timeCreated: 1481127028 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CleanupOFFNew.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CleanupOFFNew.png new file mode 100644 index 0000000..f3d4d94 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CleanupOFFNew.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CleanupOFFNew.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CleanupOFFNew.png.meta new file mode 100644 index 0000000..9a6ba5e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CleanupOFFNew.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: df0f2e2030492c14d9237317aef419cd +timeCreated: 1481127018 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CleanupON.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CleanupON.png new file mode 100644 index 0000000..b5f6667 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CleanupON.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CleanupON.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CleanupON.png.meta new file mode 100644 index 0000000..616afa0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CleanupON.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 615d853995cf2344d8641fd19cb09b5d +timeCreated: 1481126993 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CleanupONNew.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CleanupONNew.png new file mode 100644 index 0000000..53ae18c Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CleanupONNew.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CleanupONNew.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CleanupONNew.png.meta new file mode 100644 index 0000000..6d1f63f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CleanupONNew.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: e86ba70d2363b9443beac28a6a370b87 +timeCreated: 1481127021 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CustomExpAddIconActive.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CustomExpAddIconActive.png new file mode 100644 index 0000000..ce67536 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CustomExpAddIconActive.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CustomExpAddIconActive.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CustomExpAddIconActive.png.meta new file mode 100644 index 0000000..554a30f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CustomExpAddIconActive.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 52bbe770f45f531419e44a69be67ccba +timeCreated: 1498144034 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CustomExpAddIconNormal.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CustomExpAddIconNormal.png new file mode 100644 index 0000000..256c479 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CustomExpAddIconNormal.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CustomExpAddIconNormal.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CustomExpAddIconNormal.png.meta new file mode 100644 index 0000000..9aa4918 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CustomExpAddIconNormal.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 7eb057fdbf020504fb6c9c3c78031e5e +timeCreated: 1498144034 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CustomExpRemoveIconActive.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CustomExpRemoveIconActive.png new file mode 100644 index 0000000..7a45197 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CustomExpRemoveIconActive.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CustomExpRemoveIconActive.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CustomExpRemoveIconActive.png.meta new file mode 100644 index 0000000..3034b68 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CustomExpRemoveIconActive.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 1ba096552f9cbbb418ee2286856bb352 +timeCreated: 1498144034 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CustomExpRemoveIconNormal.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CustomExpRemoveIconNormal.png new file mode 100644 index 0000000..0327400 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CustomExpRemoveIconNormal.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CustomExpRemoveIconNormal.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CustomExpRemoveIconNormal.png.meta new file mode 100644 index 0000000..ca97280 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/CustomExpRemoveIconNormal.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 839cb1530f95ad14ab58762161a9cb06 +timeCreated: 1498144034 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/FitView.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/FitView.png new file mode 100644 index 0000000..b3b1dd9 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/FitView.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/FitView.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/FitView.png.meta new file mode 100644 index 0000000..924177e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/FitView.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 1def740f2314c6b4691529cadeee2e9c +timeCreated: 1481126978 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/FocusNode.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/FocusNode.png new file mode 100644 index 0000000..ae4dd15 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/FocusNode.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/FocusNode.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/FocusNode.png.meta new file mode 100644 index 0000000..78dc8da --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/FocusNode.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: da673e6179c67d346abb220a6935e359 +timeCreated: 1481127018 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Help.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Help.png new file mode 100644 index 0000000..6c55f1a Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Help.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Help.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Help.png.meta new file mode 100644 index 0000000..dfb1fde --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Help.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 066674048bbb1e64e8cdcc6c3b4abbeb +timeCreated: 1481126971 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Help2.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Help2.png new file mode 100644 index 0000000..46b80b3 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Help2.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Help2.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Help2.png.meta new file mode 100644 index 0000000..e499d50 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Help2.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 77af20044e9766840a6be568806dc22e +timeCreated: 1488470300 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ItemCleanupOFF.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ItemCleanupOFF.png new file mode 100644 index 0000000..3bf7e28 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ItemCleanupOFF.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ItemCleanupOFF.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ItemCleanupOFF.png.meta new file mode 100644 index 0000000..8923ad7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ItemCleanupOFF.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 8b6b4ff52c49a2a43a602895465e107c +timeCreated: 1481127003 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ItemCleanupON.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ItemCleanupON.png new file mode 100644 index 0000000..2c5ee35 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ItemCleanupON.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ItemCleanupON.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ItemCleanupON.png.meta new file mode 100644 index 0000000..67db3ec --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ItemCleanupON.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: f4d31aa109c919d4595094f627510932 +timeCreated: 1481127025 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Library.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Library.png new file mode 100644 index 0000000..465a008 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Library.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Library.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Library.png.meta new file mode 100644 index 0000000..7df33cb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Library.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 9a81d7df8e62c044a9d1cada0c8a2131 +timeCreated: 1481127004 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/LiveOFF.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/LiveOFF.png new file mode 100644 index 0000000..52c92d4 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/LiveOFF.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/LiveOFF.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/LiveOFF.png.meta new file mode 100644 index 0000000..b29c03e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/LiveOFF.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: bb16faf366bcc6c4fbf0d7666b105354 +timeCreated: 1481127011 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/LiveON.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/LiveON.png new file mode 100644 index 0000000..d792d28 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/LiveON.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/LiveON.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/LiveON.png.meta new file mode 100644 index 0000000..57c5503 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/LiveON.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 6a0ae1d7892333142aeb09585572202c +timeCreated: 1481126996 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/LivePending.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/LivePending.png new file mode 100644 index 0000000..524e87a Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/LivePending.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/LivePending.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/LivePending.png.meta new file mode 100644 index 0000000..b146db2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/LivePending.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: e3182200efb67114eb5050f8955e1746 +timeCreated: 1481127019 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MaximizeWindow.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MaximizeWindow.png new file mode 100644 index 0000000..27d01c5 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MaximizeWindow.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MaximizeWindow.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MaximizeWindow.png.meta new file mode 100644 index 0000000..2d1168d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MaximizeWindow.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 7a1fd3f5fef75b64385591e1890d1842 +timeCreated: 1481126998 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotLeftOff.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotLeftOff.png new file mode 100644 index 0000000..78d327e Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotLeftOff.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotLeftOff.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotLeftOff.png.meta new file mode 100644 index 0000000..2c2774b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotLeftOff.png.meta @@ -0,0 +1,63 @@ +fileFormatVersion: 2 +guid: 9f2d5e61dd9821b44a410f36519781d7 +timeCreated: 1489663385 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + buildTargetSettings: + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -3 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotLeftOffHover.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotLeftOffHover.png new file mode 100644 index 0000000..bc019a8 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotLeftOffHover.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotLeftOffHover.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotLeftOffHover.png.meta new file mode 100644 index 0000000..473f525 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotLeftOffHover.png.meta @@ -0,0 +1,63 @@ +fileFormatVersion: 2 +guid: 6f3901bfd2342774ba74e117e43d6db7 +timeCreated: 1489663938 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + buildTargetSettings: + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -3 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotLeftOn.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotLeftOn.png new file mode 100644 index 0000000..4aec22d Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotLeftOn.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotLeftOn.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotLeftOn.png.meta new file mode 100644 index 0000000..a3bc748 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotLeftOn.png.meta @@ -0,0 +1,63 @@ +fileFormatVersion: 2 +guid: 4c872bb553406fe44a9d0046a0ef9bc5 +timeCreated: 1489662998 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + buildTargetSettings: + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -3 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotLeftOnHover.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotLeftOnHover.png new file mode 100644 index 0000000..af773f4 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotLeftOnHover.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotLeftOnHover.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotLeftOnHover.png.meta new file mode 100644 index 0000000..c12a3d3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotLeftOnHover.png.meta @@ -0,0 +1,63 @@ +fileFormatVersion: 2 +guid: 7ef06ce40d713d34790e78278ee82dea +timeCreated: 1489663938 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + buildTargetSettings: + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -3 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotMidOff.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotMidOff.png new file mode 100644 index 0000000..94c1cad Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotMidOff.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotMidOff.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotMidOff.png.meta new file mode 100644 index 0000000..a010f2f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotMidOff.png.meta @@ -0,0 +1,63 @@ +fileFormatVersion: 2 +guid: eaf512a569994074b9b268ff098b0f03 +timeCreated: 1489663385 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + buildTargetSettings: + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -3 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotMidOffHover.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotMidOffHover.png new file mode 100644 index 0000000..2b1e15c Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotMidOffHover.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotMidOffHover.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotMidOffHover.png.meta new file mode 100644 index 0000000..77daf75 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotMidOffHover.png.meta @@ -0,0 +1,63 @@ +fileFormatVersion: 2 +guid: c86cb249299fb7249b5ee7fb27ef1951 +timeCreated: 1489663938 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + buildTargetSettings: + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -3 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotMidOn.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotMidOn.png new file mode 100644 index 0000000..08a870b Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotMidOn.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotMidOn.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotMidOn.png.meta new file mode 100644 index 0000000..b440060 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotMidOn.png.meta @@ -0,0 +1,63 @@ +fileFormatVersion: 2 +guid: 133e79bed45185d408f4c5410f89dded +timeCreated: 1489662998 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + buildTargetSettings: + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -3 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotMidOnHover.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotMidOnHover.png new file mode 100644 index 0000000..315747b Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotMidOnHover.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotMidOnHover.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotMidOnHover.png.meta new file mode 100644 index 0000000..8ec7c94 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotMidOnHover.png.meta @@ -0,0 +1,63 @@ +fileFormatVersion: 2 +guid: 542d7546736ddd244a145ef7103678fb +timeCreated: 1489663938 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + buildTargetSettings: + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -3 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotRightOff.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotRightOff.png new file mode 100644 index 0000000..1517b42 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotRightOff.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotRightOff.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotRightOff.png.meta new file mode 100644 index 0000000..7a358ff --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotRightOff.png.meta @@ -0,0 +1,63 @@ +fileFormatVersion: 2 +guid: bfcecef29876cc54db85363cf2feebb2 +timeCreated: 1489663385 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + buildTargetSettings: + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -3 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotRightOffHover.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotRightOffHover.png new file mode 100644 index 0000000..9f7e57c Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotRightOffHover.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotRightOffHover.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotRightOffHover.png.meta new file mode 100644 index 0000000..4e68ae3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotRightOffHover.png.meta @@ -0,0 +1,63 @@ +fileFormatVersion: 2 +guid: df6fb8448a382c743bd124cc0da55113 +timeCreated: 1489663604 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + buildTargetSettings: + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -3 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotRightOn.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotRightOn.png new file mode 100644 index 0000000..265ae07 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotRightOn.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotRightOn.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotRightOn.png.meta new file mode 100644 index 0000000..bcdde12 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotRightOn.png.meta @@ -0,0 +1,63 @@ +fileFormatVersion: 2 +guid: 3821e905373e9fb4aac56ad254ba5769 +timeCreated: 1489662832 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + buildTargetSettings: + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -3 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotRightOnHover.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotRightOnHover.png new file mode 100644 index 0000000..e636847 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotRightOnHover.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotRightOnHover.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotRightOnHover.png.meta new file mode 100644 index 0000000..9044f16 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MiniBotRightOnHover.png.meta @@ -0,0 +1,63 @@ +fileFormatVersion: 2 +guid: d3098ebd60a35494e9977bd96b923298 +timeCreated: 1489663938 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + buildTargetSettings: + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -3 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MinimizeWindow.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MinimizeWindow.png new file mode 100644 index 0000000..bbb0921 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MinimizeWindow.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MinimizeWindow.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MinimizeWindow.png.meta new file mode 100644 index 0000000..20aa6ed --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/MinimizeWindow.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 2aae9a02747d74d46bf98a15ac5c9b21 +timeCreated: 1481126984 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/New.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/New.png new file mode 100644 index 0000000..8dc9857 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/New.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/New.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/New.png.meta new file mode 100644 index 0000000..4dd2709 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/New.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 1bd93c39ca74ac041b79ae289e9b9f08 +timeCreated: 1481126977 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Open.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Open.png new file mode 100644 index 0000000..0d1ba82 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Open.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Open.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Open.png.meta new file mode 100644 index 0000000..e7503e3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Open.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: d8b538796c7980843b59d62dbcdebef5 +timeCreated: 1481127018 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/OpenListedShader.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/OpenListedShader.png new file mode 100644 index 0000000..19b5b31 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/OpenListedShader.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/OpenListedShader.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/OpenListedShader.png.meta new file mode 100644 index 0000000..ff29cce --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/OpenListedShader.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: a66917730dccde947a01140dc04b9e59 +timeCreated: 1481127005 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/OpenSourceCodeOFF.PNG b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/OpenSourceCodeOFF.PNG new file mode 100644 index 0000000..f93eae3 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/OpenSourceCodeOFF.PNG differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/OpenSourceCodeOFF.PNG.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/OpenSourceCodeOFF.PNG.meta new file mode 100644 index 0000000..5258ce3 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/OpenSourceCodeOFF.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: f7e8834b42791124095a8b7f2d4daac2 +timeCreated: 1481127028 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/OpenSourceCodeON.PNG b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/OpenSourceCodeON.PNG new file mode 100644 index 0000000..21394db Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/OpenSourceCodeON.PNG differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/OpenSourceCodeON.PNG.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/OpenSourceCodeON.PNG.meta new file mode 100644 index 0000000..338ef2d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/OpenSourceCodeON.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 8b114792ff84f6546880c031eda42bc0 +timeCreated: 1481127003 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Options.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Options.png new file mode 100644 index 0000000..9295dcb Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Options.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Options.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Options.png.meta new file mode 100644 index 0000000..6b30fb1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/Options.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 36aa64354f0ba4844af761a937eea4df +timeCreated: 1481126984 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/RemoveFromList.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/RemoveFromList.png new file mode 100644 index 0000000..8d9c0bd Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/RemoveFromList.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/RemoveFromList.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/RemoveFromList.png.meta new file mode 100644 index 0000000..6aff920 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/RemoveFromList.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 75f68506ba820564ea85b2620d78c097 +timeCreated: 1481126998 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ResetInspectorIcon.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ResetInspectorIcon.png new file mode 100644 index 0000000..89cb506 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ResetInspectorIcon.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ResetInspectorIcon.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ResetInspectorIcon.png.meta new file mode 100644 index 0000000..2c9ee1c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ResetInspectorIcon.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: a51794475a883744db8d524cee84e5fc +timeCreated: 1481127005 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/SaveOFF.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/SaveOFF.png new file mode 100644 index 0000000..99b4558 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/SaveOFF.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/SaveOFF.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/SaveOFF.png.meta new file mode 100644 index 0000000..4327db0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/SaveOFF.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 4e4a13447ac514c4ca21e7232bac5486 +timeCreated: 1481126990 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/SaveON.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/SaveON.png new file mode 100644 index 0000000..d98884c Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/SaveON.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/SaveON.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/SaveON.png.meta new file mode 100644 index 0000000..94e941c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/SaveON.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 2c938a89586d41f4081284e4b25243c2 +timeCreated: 1481126984 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/SelectionAsTemplate.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/SelectionAsTemplate.png new file mode 100644 index 0000000..b0eef87 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/SelectionAsTemplate.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/SelectionAsTemplate.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/SelectionAsTemplate.png.meta new file mode 100644 index 0000000..fb719f4 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/SelectionAsTemplate.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 8148796947da07d49906f1201f417a60 +timeCreated: 1481127000 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ShaderSelectOFF.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ShaderSelectOFF.png new file mode 100644 index 0000000..80640b3 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ShaderSelectOFF.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ShaderSelectOFF.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ShaderSelectOFF.png.meta new file mode 100644 index 0000000..e2982cf --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ShaderSelectOFF.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: ce7d95fa4e635f943a73ce1b19312cc5 +timeCreated: 1481127016 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ShaderSelectON.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ShaderSelectON.png new file mode 100644 index 0000000..ceb781f Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ShaderSelectON.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ShaderSelectON.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ShaderSelectON.png.meta new file mode 100644 index 0000000..ac50fe7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ShaderSelectON.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: e737e4bfd0859a946b0c5feddb61d29f +timeCreated: 1481127019 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ShareOFF.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ShareOFF.png new file mode 100644 index 0000000..82805ea Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ShareOFF.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ShareOFF.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ShareOFF.png.meta new file mode 100644 index 0000000..def19ac --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/ShareOFF.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: bc5bd469748466a459badfab23915cb0 +timeCreated: 1560784373 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/SliderHoriz.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/SliderHoriz.png new file mode 100644 index 0000000..f995de6 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/SliderHoriz.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/SliderHoriz.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/SliderHoriz.png.meta new file mode 100644 index 0000000..fd71d59 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/SliderHoriz.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 4cabb2d6785b8aa4db0c0a34e1e00f04 +timeCreated: 1481126990 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: 1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/TakeScreenshotOFF.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/TakeScreenshotOFF.png new file mode 100644 index 0000000..b38c88e Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/TakeScreenshotOFF.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/TakeScreenshotOFF.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/TakeScreenshotOFF.png.meta new file mode 100644 index 0000000..b41d15f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/TakeScreenshotOFF.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 7587de2e3bec8bf4d973109524ccc6b1 +timeCreated: 1560359851 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/TransparentPixel.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/TransparentPixel.png new file mode 100644 index 0000000..427fb75 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/TransparentPixel.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/TransparentPixel.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/TransparentPixel.png.meta new file mode 100644 index 0000000..f20de9f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/TransparentPixel.png.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: 1004d06b4b28f5943abdf2313a22790a +timeCreated: 1496682298 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/UpdateOFF.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/UpdateOFF.png new file mode 100644 index 0000000..4855786 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/UpdateOFF.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/UpdateOFF.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/UpdateOFF.png.meta new file mode 100644 index 0000000..f16fd17 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/UpdateOFF.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 99d70ac09b4db9742b404c3f92d8564b +timeCreated: 1481127004 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/UpdateOutdated.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/UpdateOutdated.png new file mode 100644 index 0000000..ffc3484 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/UpdateOutdated.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/UpdateOutdated.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/UpdateOutdated.png.meta new file mode 100644 index 0000000..54e5175 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/UpdateOutdated.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: cce638be049286c41bcbd0a26c356b18 +timeCreated: 1481127016 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/UpdateUpToDated.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/UpdateUpToDated.png new file mode 100644 index 0000000..a60c435 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/UpdateUpToDated.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/UpdateUpToDated.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/UpdateUpToDated.png.meta new file mode 100644 index 0000000..db066db --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Buttons/UpdateUpToDated.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: ce30b12fbb3223746bcfef9ea82effe3 +timeCreated: 1481127016 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas.meta new file mode 100644 index 0000000..9cfcde5 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c956b1443ae5df54485c68a775928f3e +folderAsset: yes +timeCreated: 1481126946 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/CircleBackground.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/CircleBackground.png new file mode 100644 index 0000000..961d196 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/CircleBackground.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/CircleBackground.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/CircleBackground.png.meta new file mode 100644 index 0000000..80bf31b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/CircleBackground.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: c560c5d8ca4c353409caf2ec204f3a19 +timeCreated: 1566998352 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/Grid128.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/Grid128.png new file mode 100644 index 0000000..b71a704 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/Grid128.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/Grid128.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/Grid128.png.meta new file mode 100644 index 0000000..211cf27 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/Grid128.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 881c304491028ea48b5027ac6c62cf73 +timeCreated: 1481127003 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: 4 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/LineTex 2.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/LineTex 2.png new file mode 100644 index 0000000..4f94e41 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/LineTex 2.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/LineTex 2.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/LineTex 2.png.meta new file mode 100644 index 0000000..f0ef6b0 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/LineTex 2.png.meta @@ -0,0 +1,84 @@ +fileFormatVersion: 2 +guid: 03a7d169469c1af41bb03241a7b7e23d +timeCreated: 1486740437 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 1 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 0 + mipMapFadeDistanceEnd: 10 + 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: + filterMode: 1 + aniso: 4 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: 5 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/LineTex 3.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/LineTex 3.png new file mode 100644 index 0000000..ef9865b Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/LineTex 3.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/LineTex 3.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/LineTex 3.png.meta new file mode 100644 index 0000000..fb6886d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/LineTex 3.png.meta @@ -0,0 +1,84 @@ +fileFormatVersion: 2 +guid: c3512c25766a40245ac94c6b1722d76e +timeCreated: 1491391706 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 1 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: -1 + aniso: 4 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: 5 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/LineTex 4.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/LineTex 4.png new file mode 100644 index 0000000..9e91366 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/LineTex 4.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/LineTex 4.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/LineTex 4.png.meta new file mode 100644 index 0000000..a8c3128 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/LineTex 4.png.meta @@ -0,0 +1,84 @@ +fileFormatVersion: 2 +guid: e0f922c44762291498cc62e0917609be +timeCreated: 1491397409 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 1 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 1 + aniso: 4 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: 5 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/LineTex.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/LineTex.png new file mode 100644 index 0000000..69c7e0d Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/LineTex.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/LineTex.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/LineTex.png.meta new file mode 100644 index 0000000..832ec72 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/LineTex.png.meta @@ -0,0 +1,84 @@ +fileFormatVersion: 2 +guid: 02f71419854c0d845a930c9e0a0bf775 +timeCreated: 1486740437 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 1 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 7 + mipMapFadeDistanceEnd: 10 + 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: + filterMode: 2 + aniso: 4 + mipBias: -1 + wrapMode: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: 5 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/MainCanvasTitleBg.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/MainCanvasTitleBg.png new file mode 100644 index 0000000..2f696ad Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/MainCanvasTitleBg.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/MainCanvasTitleBg.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/MainCanvasTitleBg.png.meta new file mode 100644 index 0000000..5fc7030 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/MainCanvasTitleBg.png.meta @@ -0,0 +1,96 @@ +fileFormatVersion: 2 +guid: bdb42c87b8801e94e886c5c0d60b3014 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + 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: 0 + aniso: -1 + mipBias: -1 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + 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: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 54 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/Material.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/Material.png new file mode 100644 index 0000000..e73d6b0 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/Material.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/Material.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/Material.png.meta new file mode 100644 index 0000000..3dd5a98 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/Material.png.meta @@ -0,0 +1,96 @@ +fileFormatVersion: 2 +guid: 157b94751c138d84bbe1768c672b5168 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + 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: 0 + aniso: -1 + mipBias: -1 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + 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: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 54 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/MaterialModeIcon.PNG b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/MaterialModeIcon.PNG new file mode 100644 index 0000000..95efd60 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/MaterialModeIcon.PNG differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/MaterialModeIcon.PNG.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/MaterialModeIcon.PNG.meta new file mode 100644 index 0000000..afabc46 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/MaterialModeIcon.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 5725fa8ee04e1be449af059f5735cd81 +timeCreated: 1481126993 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/MaterialModeIconOFF.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/MaterialModeIconOFF.png new file mode 100644 index 0000000..ebb3589 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/MaterialModeIconOFF.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/MaterialModeIconOFF.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/MaterialModeIconOFF.png.meta new file mode 100644 index 0000000..38d362e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/MaterialModeIconOFF.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 7040748e1c49b9648aeeefef41c8a3d5 +timeCreated: 1481126996 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/SelectionBox.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/SelectionBox.png new file mode 100644 index 0000000..8e841e4 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/SelectionBox.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/SelectionBox.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/SelectionBox.png.meta new file mode 100644 index 0000000..6d30ffb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/SelectionBox.png.meta @@ -0,0 +1,96 @@ +fileFormatVersion: 2 +guid: a702c1245d15ddb48b8fba73bf951a65 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + 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: 0 + aniso: 1 + mipBias: -1 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + 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: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 54 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/Shader.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/Shader.png new file mode 100644 index 0000000..4dd6cb3 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/Shader.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/Shader.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/Shader.png.meta new file mode 100644 index 0000000..0ef85a2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/Shader.png.meta @@ -0,0 +1,96 @@ +fileFormatVersion: 2 +guid: 555b6a287b4121b479d412e6ea92bb2e +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + 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: 0 + aniso: -1 + mipBias: -1 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + 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: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 54 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderFunction.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderFunction.png new file mode 100644 index 0000000..2092772 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderFunction.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderFunction.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderFunction.png.meta new file mode 100644 index 0000000..f168898 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderFunction.png.meta @@ -0,0 +1,96 @@ +fileFormatVersion: 2 +guid: 94cd628d3d8e07d40a85d82b3fdad15d +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + 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: 0 + aniso: -1 + mipBias: -1 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + 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: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 54 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderFunctionIcon.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderFunctionIcon.png new file mode 100644 index 0000000..2d13391 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderFunctionIcon.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderFunctionIcon.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderFunctionIcon.png.meta new file mode 100644 index 0000000..c84615b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderFunctionIcon.png.meta @@ -0,0 +1,96 @@ +fileFormatVersion: 2 +guid: 50be8291f9514914aa55c66c49da67cf +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 1 + 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: 2 + aniso: 1 + mipBias: -1 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + 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: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 5 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + androidETC2FallbackOverride: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 54 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderFunctionModeIcon.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderFunctionModeIcon.png new file mode 100644 index 0000000..a7724e9 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderFunctionModeIcon.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderFunctionModeIcon.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderFunctionModeIcon.png.meta new file mode 100644 index 0000000..d1d0180 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderFunctionModeIcon.png.meta @@ -0,0 +1,96 @@ +fileFormatVersion: 2 +guid: 68897d376b60748438e0ae3474ebe558 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + 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: 0 + 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: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 54 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderFunctionModeIconOFF.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderFunctionModeIconOFF.png new file mode 100644 index 0000000..5312858 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderFunctionModeIconOFF.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderFunctionModeIconOFF.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderFunctionModeIconOFF.png.meta new file mode 100644 index 0000000..9735d2b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderFunctionModeIconOFF.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: ff637d399b504ac4999b770f24ef4d56 +timeCreated: 1494003400 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderModeIcon.PNG b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderModeIcon.PNG new file mode 100644 index 0000000..fe8ea72 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderModeIcon.PNG differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderModeIcon.PNG.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderModeIcon.PNG.meta new file mode 100644 index 0000000..1e94d8f --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderModeIcon.PNG.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: f4ca92d9e50d06049b7ccec2c438754d +timeCreated: 1481127025 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderModeIconOFF.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderModeIconOFF.png new file mode 100644 index 0000000..f0282e4 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderModeIconOFF.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderModeIconOFF.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderModeIconOFF.png.meta new file mode 100644 index 0000000..aa63312 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderModeIconOFF.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: df81b9531d8ef704f96072ce6910db68 +timeCreated: 1481127018 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderModeMatIcon.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderModeMatIcon.png new file mode 100644 index 0000000..a2ac1b0 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderModeMatIcon.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderModeMatIcon.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderModeMatIcon.png.meta new file mode 100644 index 0000000..d7ffa71 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/ShaderModeMatIcon.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 6f410c15ce9be2741bae77a30a336748 +timeCreated: 1481126996 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/TransparentOverlay.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/TransparentOverlay.png new file mode 100644 index 0000000..c43bb10 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/TransparentOverlay.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/TransparentOverlay.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/TransparentOverlay.png.meta new file mode 100644 index 0000000..bc2108b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Canvas/TransparentOverlay.png.meta @@ -0,0 +1,96 @@ +fileFormatVersion: 2 +guid: 8c4a7fca2884fab419769ccc0355c0c1 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + 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: 0 + 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: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 54 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes.meta new file mode 100644 index 0000000..bc11f3d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2bec2ea1b48d47846930d3eedd9a80ca +folderAsset: yes +timeCreated: 1481126945 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/BlueNormalBase.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/BlueNormalBase.png new file mode 100644 index 0000000..8c81b52 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/BlueNormalBase.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/BlueNormalBase.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/BlueNormalBase.png.meta new file mode 100644 index 0000000..1c13e09 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/BlueNormalBase.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 60c283ffa9a758646ab70a2fe7ff5f71 +timeCreated: 1483554830 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: 1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/BlueNormalBaseLeft.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/BlueNormalBaseLeft.png new file mode 100644 index 0000000..3e25124 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/BlueNormalBaseLeft.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/BlueNormalBaseLeft.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/BlueNormalBaseLeft.png.meta new file mode 100644 index 0000000..ee8cd74 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/BlueNormalBaseLeft.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 330fd0c8f074a3c4f8042114a61a73d9 +timeCreated: 1522611116 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: 4 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/BlueNormalBaseSquare.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/BlueNormalBaseSquare.png new file mode 100644 index 0000000..2ddfe24 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/BlueNormalBaseSquare.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/BlueNormalBaseSquare.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/BlueNormalBaseSquare.png.meta new file mode 100644 index 0000000..d9fa5ac --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/BlueNormalBaseSquare.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: d179c8744f837da49ab92aae04d1ae1c +timeCreated: 1520606221 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/BlueNormalHeader.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/BlueNormalHeader.png new file mode 100644 index 0000000..66d50c6 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/BlueNormalHeader.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/BlueNormalHeader.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/BlueNormalHeader.png.meta new file mode 100644 index 0000000..2e78ec1 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/BlueNormalHeader.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: bd910a1d744309b499b59062db7891ab +timeCreated: 1483555205 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/ButtonBackground.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/ButtonBackground.png new file mode 100644 index 0000000..a5d9baa Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/ButtonBackground.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/ButtonBackground.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/ButtonBackground.png.meta new file mode 100644 index 0000000..15a665b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/ButtonBackground.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: b57dd36838fb19c449fd4559efe3f800 +timeCreated: 1487608374 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: 5 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/CommentNodeBase.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/CommentNodeBase.png new file mode 100644 index 0000000..a960d70 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/CommentNodeBase.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/CommentNodeBase.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/CommentNodeBase.png.meta new file mode 100644 index 0000000..163cb26 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/CommentNodeBase.png.meta @@ -0,0 +1,96 @@ +fileFormatVersion: 2 +guid: b2be9c55e7e7ba447967677c82b2cb23 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + 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: 0 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 0 + 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: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: iPhone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: 54 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/CommentaryResizeIcon.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/CommentaryResizeIcon.png new file mode 100644 index 0000000..c4034d0 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/CommentaryResizeIcon.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/CommentaryResizeIcon.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/CommentaryResizeIcon.png.meta new file mode 100644 index 0000000..3feafe2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/CommentaryResizeIcon.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 5321bd2b79632764286f28503db80815 +timeCreated: 1481126991 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: 5 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/CommentaryResizeIconInv.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/CommentaryResizeIconInv.png new file mode 100644 index 0000000..bf96dc9 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/CommentaryResizeIconInv.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/CommentaryResizeIconInv.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/CommentaryResizeIconInv.png.meta new file mode 100644 index 0000000..cb3575d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/CommentaryResizeIconInv.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: b52bc320a2ff91446978a893ec738134 +timeCreated: 1481127009 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: 5 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/FlatBackground.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/FlatBackground.png new file mode 100644 index 0000000..393b83b Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/FlatBackground.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/FlatBackground.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/FlatBackground.png.meta new file mode 100644 index 0000000..86eb564 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/FlatBackground.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 44efd0011d6a9bc4fb0b3a82753dac4e +timeCreated: 1481126984 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GraphButton.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GraphButton.png new file mode 100644 index 0000000..38fe4e6 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GraphButton.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GraphButton.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GraphButton.png.meta new file mode 100644 index 0000000..76350fc --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GraphButton.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 2b3b7485f95e8a44dab3fa9610f56cbb +timeCreated: 1513873202 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GraphButtonActive.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GraphButtonActive.png new file mode 100644 index 0000000..67cce68 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GraphButtonActive.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GraphButtonActive.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GraphButtonActive.png.meta new file mode 100644 index 0000000..8e8e14d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GraphButtonActive.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: dd3411e8d9927d3429d5872dbdbd752b +timeCreated: 1513877265 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GraphPopup.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GraphPopup.png new file mode 100644 index 0000000..89ea7dd Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GraphPopup.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GraphPopup.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GraphPopup.png.meta new file mode 100644 index 0000000..400f36b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GraphPopup.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 2ae607812d722ec46b48647c2a800779 +timeCreated: 1515435226 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GrayNormalHeader.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GrayNormalHeader.png new file mode 100644 index 0000000..a1f1ca7 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GrayNormalHeader.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GrayNormalHeader.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GrayNormalHeader.png.meta new file mode 100644 index 0000000..fab11a7 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GrayNormalHeader.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 9e88b336bd16b1e4b99de75f486126c1 +timeCreated: 1481127004 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: 5 + maxTextureSize: 2048 + textureSettings: + filterMode: 1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GrayNormalHeaderSquare.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GrayNormalHeaderSquare.png new file mode 100644 index 0000000..a150e5b Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GrayNormalHeaderSquare.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GrayNormalHeaderSquare.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GrayNormalHeaderSquare.png.meta new file mode 100644 index 0000000..328f79c --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/GrayNormalHeaderSquare.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: b16188b8a3dee8146bd9cb0bde234a24 +timeCreated: 1520606407 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/NoPreview.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/NoPreview.png new file mode 100644 index 0000000..77a8e4b Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/NoPreview.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/NoPreview.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/NoPreview.png.meta new file mode 100644 index 0000000..28815f6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/NoPreview.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 750b1bd7ba8bd28489650de6d0a95cc5 +timeCreated: 1487590795 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 1 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: 3 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/NodeSelected.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/NodeSelected.png new file mode 100644 index 0000000..abb8c70 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/NodeSelected.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/NodeSelected.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/NodeSelected.png.meta new file mode 100644 index 0000000..891c14b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/NodeSelected.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 24fb767323009c143a4e744a2025a27e +timeCreated: 1481126983 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: 5 + maxTextureSize: 2048 + textureSettings: + filterMode: 1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/NodeSelectedSquare.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/NodeSelectedSquare.png new file mode 100644 index 0000000..7db9036 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/NodeSelectedSquare.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/NodeSelectedSquare.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/NodeSelectedSquare.png.meta new file mode 100644 index 0000000..326cfc6 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/NodeSelectedSquare.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 080a030f87555fe419ecc1fb9f509118 +timeCreated: 1520612755 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/ObjectPickerBackgroundOutline.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/ObjectPickerBackgroundOutline.png new file mode 100644 index 0000000..7d59445 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/ObjectPickerBackgroundOutline.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/ObjectPickerBackgroundOutline.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/ObjectPickerBackgroundOutline.png.meta new file mode 100644 index 0000000..13ecffb --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/ObjectPickerBackgroundOutline.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: c1912a55d2f211d468ddeb7b1386dd41 +timeCreated: 1487618370 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: 5 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 1 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/PopupPicker.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/PopupPicker.png new file mode 100644 index 0000000..8c826a9 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/PopupPicker.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/PopupPicker.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/PopupPicker.png.meta new file mode 100644 index 0000000..4d05be2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/PopupPicker.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: d2384a227b4ac4943b73c8151393e502 +timeCreated: 1515513996 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + 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: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/PreviewOff.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/PreviewOff.png new file mode 100644 index 0000000..e336ea4 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/PreviewOff.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/PreviewOff.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/PreviewOff.png.meta new file mode 100644 index 0000000..97da0a2 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/PreviewOff.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 1f3a46793c375864ab816c0d78061e4e +timeCreated: 1486488219 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/PreviewOn.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/PreviewOn.png new file mode 100644 index 0000000..0b8ed9d Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/PreviewOn.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/PreviewOn.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/PreviewOn.png.meta new file mode 100644 index 0000000..704441e --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/PreviewOn.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: dae54b5aa457b474e8a1599de1073d26 +timeCreated: 1486488219 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/PropertyPicker.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/PropertyPicker.png new file mode 100644 index 0000000..f8bbfe6 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/PropertyPicker.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/PropertyPicker.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/PropertyPicker.png.meta new file mode 100644 index 0000000..60b4b85 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/PropertyPicker.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 94816692c85001f4dab01ec3666943c0 +timeCreated: 1486470997 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 0 + mipMapFadeDistanceEnd: 10 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/SliderButton.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/SliderButton.png new file mode 100644 index 0000000..29e767a Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/SliderButton.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/SliderButton.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/SliderButton.png.meta new file mode 100644 index 0000000..f016d54 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/SliderButton.png.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: dd563e33152bb6443b099b4139ceecb9 +timeCreated: 1501088039 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/WhitePortOutline.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/WhitePortOutline.png new file mode 100644 index 0000000..dcd640d Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/WhitePortOutline.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/WhitePortOutline.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/WhitePortOutline.png.meta new file mode 100644 index 0000000..b16ea8b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/WhitePortOutline.png.meta @@ -0,0 +1,84 @@ +fileFormatVersion: 2 +guid: 56277f370fb77a448a152bcd2e3a9077 +timeCreated: 1481126991 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 1 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 1 + 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: 5 + maxTextureSize: 2048 + textureSettings: + filterMode: 1 + aniso: 4 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/WhitePortSolid.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/WhitePortSolid.png new file mode 100644 index 0000000..b755f5e Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/WhitePortSolid.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/WhitePortSolid.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/WhitePortSolid.png.meta new file mode 100644 index 0000000..9ead42d --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/WhitePortSolid.png.meta @@ -0,0 +1,84 @@ +fileFormatVersion: 2 +guid: 8113366f9f7cec647878e3af2fb98922 +timeCreated: 1481127000 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 1 + enableMipMap: 1 + sRGBTexture: 0 + linearTexture: 1 + fadeOut: 0 + borderMipMap: 0 + 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: 5 + maxTextureSize: 2048 + textureSettings: + filterMode: 1 + aniso: 4 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + - buildTarget: WebGL + maxTextureSize: 2048 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/WireNodeSelection.png b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/WireNodeSelection.png new file mode 100644 index 0000000..9dd1e73 Binary files /dev/null and b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/WireNodeSelection.png differ diff --git a/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/WireNodeSelection.png.meta b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/WireNodeSelection.png.meta new file mode 100644 index 0000000..44efba8 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Plugins/EditorResources/UI/Nodes/WireNodeSelection.png.meta @@ -0,0 +1,58 @@ +fileFormatVersion: 2 +guid: bfe0b03d5d60cea4f9d4b2d1d121e592 +timeCreated: 1504005445 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/AmplifyShaderEditor/Readme.txt b/Assets/AmplifyShaderEditor/Readme.txt new file mode 100644 index 0000000..9ee1064 --- /dev/null +++ b/Assets/AmplifyShaderEditor/Readme.txt @@ -0,0 +1,90 @@ +About + + Amplify Shader Editor (c) Amplify Creations, Lda. All rights reserved. + + Amplify Shader Editor is a node-based shader creation tool for Unity 5 + + Redistribution of Amplify Shader Editor is frowned upon. If you want to share the + software, please refer others to the official product page: + + http://amplify.pt/unity/amplify-shader-editor/ + +Description + + Amplify Shader Editor is a node-based shader creation tool inspired by industry leading + editors. An open and tightly integrated solution, it provides a familiar and consistent + development environment that seamlessly blends with Unitys UI conventions and Shader use. + +Features + + * Intuitive, familiar interface + * Node based creation + * Full source-code + * Extensive node library + * Growing sample collection + * Open to user requests and contributions + * Integrated Texture Array Creator tool + * Node API + * Custom Shader Templates + * SRP HD and Lightweight support + +Supported Platforms + + * All platforms + +Minimum Requirements + + Software + + Unity 5+ + +Quick Guide Amplify Shader Editor + + 1) Open the editor canvas located in the main menu under Window > Amplify Shader Editor > Open Canvas. + 2) Create an Amplify Shader via the Menu under Assets > Create > Shaders > Amplify Surface shader. + 3) Double-click an ASE shader to open it in the ASE canvas. + 4) Create a new material and set its shader to the newly created Amplify Shader. + 5) Node and shader properties are on the left side, node list on the right. + 6) Drag out nodes from the node palette list on the right, or right-click anywhere in the canvas to open + a simpler searchable node list. + 7) Data flows from left to right, drag wires from node Input/Output ports to create connections. + 8) The 4 buttons on the main canvas next to the node and shader properties on the upper-left area serve as the main + save and update buttons. Button 1: Update and Save shader, Button 2: LIVE mode, automatically updates + and saves the active shader, Button 3: Remove disconnected nodes, Button 4: Open shader in text editor. + 9) Quick access to current shader or material in use by hitting bottom left and or right buttons on main canvas + 10) Consult the Manual below for detailed information. + +Quick Guide Texture Array Creator + + 1) Open the tool in the main menu under Window > Amplify Shader Editor > Texture Array Creator + 2) Specify the desired Width and Height for the Texture Array through the X and Y Size + 3) Configure your texture properties + 4) Set your array Name and Path + 5) Add elements to the array by hitting the (+) button over the Texture List area and assign textures to them + 6) Hit the Build Array button on the top of the window to build your new Texture Array + 7) Please notice that you can't load previously created texture arrays into the tool so maintain it open until all the tweaks on the array are done + +Documentation + + Please refer to the following website for an up-to-date online manual: + + http://amplify.pt/unity/amplify-shader-editor/manual + +Nodes + + Please refer to the following website for a searchable node list: + + http://amplify.pt/unity/amplify-shader-editor/nodes + + +Feedback + + To file error reports, questions or suggestions, you may use + our feedback form online: + + http://amplify.pt/contact + + Or contact us directly: + + For general inquiries - info@amplify.pt + For technical support - support@amplify.pt (customers only) diff --git a/Assets/AmplifyShaderEditor/Readme.txt.meta b/Assets/AmplifyShaderEditor/Readme.txt.meta new file mode 100644 index 0000000..9e4e00b --- /dev/null +++ b/Assets/AmplifyShaderEditor/Readme.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1b2d5cde00ee97c46b03020eb630dc2d +timeCreated: 1481127071 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Controller.controller b/Assets/Controller.controller new file mode 100644 index 0000000..6058579 --- /dev/null +++ b/Assets/Controller.controller @@ -0,0 +1,138 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1107 &-5936275164443214524 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Layer2 + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: 2710690602907316626} + m_Position: {x: 270, y: 150, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: 2710690602907316626} +--- !u!91 &9100000 +AnimatorController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Controller + serializedVersion: 5 + m_AnimatorParameters: + - m_Name: animSpeed + m_Type: 1 + m_DefaultFloat: 1 + m_DefaultInt: 0 + m_DefaultBool: 0 + m_Controller: {fileID: 9100000} + m_AnimatorLayers: + - serializedVersion: 5 + m_Name: Base Layer + m_StateMachine: {fileID: 1917244892325702502} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} + - serializedVersion: 5 + m_Name: Layer2 + m_StateMachine: {fileID: -5936275164443214524} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} +--- !u!1107 &1917244892325702502 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Base Layer + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: 8321995038595102421} + m_Position: {x: 260, y: 170, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: 8321995038595102421} +--- !u!1102 &2710690602907316626 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: clip2 + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: 882c60c955de4f24ab7bbe6ba32a59ea, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!1102 &8321995038595102421 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: clip + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: 82294251fb277ec408c8be9afa890897, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: diff --git a/Assets/Controller.controller.meta b/Assets/Controller.controller.meta new file mode 100644 index 0000000..b9ae1e4 --- /dev/null +++ b/Assets/Controller.controller.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7246327de0f250c4f86276bece4ffd47 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Davinci.meta b/Assets/Davinci.meta new file mode 100644 index 0000000..6358017 --- /dev/null +++ b/Assets/Davinci.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 60e61c9deac64431ba89fcf6045a1cd3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Davinci/Scripts.meta b/Assets/Davinci/Scripts.meta new file mode 100644 index 0000000..a4a6e66 --- /dev/null +++ b/Assets/Davinci/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 80c7be556956649f59a566705e1e5deb +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Davinci/Scripts/Davinci.cs b/Assets/Davinci/Scripts/Davinci.cs new file mode 100644 index 0000000..28ad89b --- /dev/null +++ b/Assets/Davinci/Scripts/Davinci.cs @@ -0,0 +1,659 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Text; +using UnityEngine; +using UnityEngine.Events; +using UnityEngine.UI; +#if UNITY_2018_3_OR_NEWER +using UnityEngine.Networking; +#endif + +/// +/// Davinci - A powerful, esay-to-use image downloading and caching library for Unity in Run-Time +/// v 1.2 +/// Developed by ShamsDEV.com +/// copyright (c) ShamsDEV.com All Rights Reserved. +/// Licensed under the MIT License. +/// https://github.com/shamsdev/davinci +/// +public class Davinci : MonoBehaviour +{ + private static bool ENABLE_GLOBAL_LOGS = true; + + private bool enableLog = false; + private float fadeTime = 1; + private bool cached = true; + + private enum RendererType + { + none, + uiImage, + renderer, + sprite + } + + private RendererType rendererType = RendererType.none; + private GameObject targetObj; + private string url = null; + + private Texture2D loadingPlaceholder, errorPlaceholder; + + private UnityAction onStartAction, + onDownloadedAction, + OnLoadedAction, + onEndAction; + + private UnityAction onDownloadProgressChange; + private UnityAction onErrorAction; + + private static Dictionary underProcessDavincies + = new Dictionary(); + + private string uniqueHash; + private int progress; + + private bool success = false; + + static string filePath = Application.persistentDataPath + "/" + + "davinci" + "/"; + + + /// + /// Get instance of davinci class + /// + public static Davinci get() + { + return new GameObject("Davinci").AddComponent(); + } + + /// + /// Set image url for download. + /// + /// Image Url + /// + public Davinci load(string url) + { + if (enableLog) + Debug.Log("[Davinci] Url set : " + url); + + this.url = url; + return this; + } + + /// + /// Set fading animation time. + /// + /// Fade animation time. Set 0 for disable fading. + /// + public Davinci setFadeTime(float fadeTime) + { + if (enableLog) + Debug.Log("[Davinci] Fading time set : " + fadeTime); + + this.fadeTime = fadeTime; + return this; + } + + /// + /// Set target Image component. + /// + /// target Unity UI image component + /// + public Davinci into(Image image) + { + if (enableLog) + Debug.Log("[Davinci] Target as UIImage set : " + image); + + rendererType = RendererType.uiImage; + this.targetObj = image.gameObject; + return this; + } + + /// + /// Set target Renderer component. + /// + /// target renderer component + /// + public Davinci into(Renderer renderer) + { + if (enableLog) + Debug.Log("[Davinci] Target as Renderer set : " + renderer); + + rendererType = RendererType.renderer; + this.targetObj = renderer.gameObject; + return this; + } + + public Davinci into(SpriteRenderer spriteRenderer) + { + if (enableLog) + Debug.Log("[Davinci] Target as SpriteRenderer set : " + spriteRenderer); + + rendererType = RendererType.sprite; + this.targetObj = spriteRenderer.gameObject; + return this; + } + + #region Actions + public Davinci withStartAction(UnityAction action) + { + this.onStartAction = action; + + if (enableLog) + Debug.Log("[Davinci] On start action set : " + action); + + return this; + } + + public Davinci withDownloadedAction(UnityAction action) + { + this.onDownloadedAction = action; + + if (enableLog) + Debug.Log("[Davinci] On downloaded action set : " + action); + + return this; + } + + public Davinci withDownloadProgressChangedAction(UnityAction action) + { + this.onDownloadProgressChange = action; + + if (enableLog) + Debug.Log("[Davinci] On download progress changed action set : " + action); + + return this; + } + + public Davinci withLoadedAction(UnityAction action) + { + this.OnLoadedAction = action; + + if (enableLog) + Debug.Log("[Davinci] On loaded action set : " + action); + + return this; + } + + public Davinci withErrorAction(UnityAction action) + { + this.onErrorAction = action; + + if (enableLog) + Debug.Log("[Davinci] On error action set : " + action); + + return this; + } + + public Davinci withEndAction(UnityAction action) + { + this.onEndAction = action; + + if (enableLog) + Debug.Log("[Davinci] On end action set : " + action); + + return this; + } + #endregion + + /// + /// Show or hide logs in console. + /// + /// 'true' for show logs in console. + /// + public Davinci setEnableLog(bool enableLog) + { + this.enableLog = enableLog; + + if (enableLog) + Debug.Log("[Davinci] Logging enabled : " + enableLog); + + return this; + } + + /// + /// Set the sprite of image when davinci is downloading and loading image + /// + /// loading texture + /// + public Davinci setLoadingPlaceholder(Texture2D loadingPlaceholder) + { + this.loadingPlaceholder = loadingPlaceholder; + + if (enableLog) + Debug.Log("[Davinci] Loading placeholder has been set."); + + return this; + } + + /// + /// Set image sprite when some error occurred during downloading or loading image + /// + /// error texture + /// + public Davinci setErrorPlaceholder(Texture2D errorPlaceholder) + { + this.errorPlaceholder = errorPlaceholder; + + if (enableLog) + Debug.Log("[Davinci] Error placeholder has been set."); + + return this; + } + + /// + /// Enable cache + /// + /// + public Davinci setCached(bool cached) + { + this.cached = cached; + + if (enableLog) + Debug.Log("[Davinci] Cache enabled : " + cached); + + return this; + } + + /// + /// Start davinci process. + /// + public void start() + { + if (url == null) + { + error("Url has not been set. Use 'load' funtion to set image url."); + return; + } + + try + { + Uri uri = new Uri(url); + this.url = uri.AbsoluteUri; + } + catch (Exception ex) + { + error("Url is not correct."); + return; + } + + if (rendererType == RendererType.none || targetObj == null) + { + error("Target has not been set. Use 'into' function to set target component."); + return; + } + + if (enableLog) + Debug.Log("[Davinci] Start Working."); + + if (loadingPlaceholder != null) + SetLoadingImage(); + + if (onStartAction != null) + onStartAction.Invoke(); + + if (!Directory.Exists(filePath)) + { + Directory.CreateDirectory(filePath); + } + + uniqueHash = CreateMD5(url); + + if (underProcessDavincies.ContainsKey(uniqueHash)) + { + Davinci sameProcess = underProcessDavincies[uniqueHash]; + sameProcess.onDownloadedAction += () => + { + if (onDownloadedAction != null) + onDownloadedAction.Invoke(); + + loadSpriteToImage(); + }; + } + else + { + if (File.Exists(filePath + uniqueHash)) + { + if (onDownloadedAction != null) + onDownloadedAction.Invoke(); + + loadSpriteToImage(); + } + else + { + underProcessDavincies.Add(uniqueHash, this); + StopAllCoroutines(); + StartCoroutine("Downloader"); + } + } + } + + private IEnumerator Downloader() + { + if (enableLog) + Debug.Log("[Davinci] Download started."); + +#if UNITY_2018_3_OR_NEWER + UnityWebRequest www = UnityWebRequestTexture.GetTexture(url); + yield return www.SendWebRequest(); +#else + var www = new WWW(url); +#endif + + while (!www.isDone) + { + if (www.error != null) + { + error("Error while downloading the image : " + www.error); + yield break; + } + +#if UNITY_2018_3_OR_NEWER + progress = Mathf.FloorToInt(www.downloadProgress * 100); +#else + progress = Mathf.FloorToInt(www.progress * 100); +#endif + if (onDownloadProgressChange != null) + onDownloadProgressChange.Invoke(progress); + + if (enableLog) + Debug.Log("[Davinci] Downloading progress : " + progress + "%"); + + yield return null; + } + +#if UNITY_2018_3_OR_NEWER + if (www.error == null) + File.WriteAllBytes(filePath + uniqueHash, www.downloadHandler.data); +#else + if (www.error == null) + File.WriteAllBytes(filePath + uniqueHash, www.bytes); +#endif + + www.Dispose(); + www = null; + + if (onDownloadedAction != null) + onDownloadedAction.Invoke(); + + loadSpriteToImage(); + + underProcessDavincies.Remove(uniqueHash); + } + + private void loadSpriteToImage() + { + progress = 100; + if (onDownloadProgressChange != null) + onDownloadProgressChange.Invoke(progress); + + if (enableLog) + Debug.Log("[Davinci] Downloading progress : " + progress + "%"); + + if (!File.Exists(filePath + uniqueHash)) + { + error("Loading image file has been failed."); + return; + } + + StopAllCoroutines(); + StartCoroutine(ImageLoader()); + } + + private void SetLoadingImage() + { + switch (rendererType) + { + case RendererType.renderer: + Renderer renderer = targetObj.GetComponent(); + renderer.material.mainTexture = loadingPlaceholder; + break; + + case RendererType.uiImage: + Image image = targetObj.GetComponent(); + Sprite sprite = Sprite.Create(loadingPlaceholder, + new Rect(0, 0, loadingPlaceholder.width, loadingPlaceholder.height), + new Vector2(0.5f, 0.5f)); + image.sprite = sprite; + + break; + + case RendererType.sprite: + SpriteRenderer spriteRenderer = targetObj.GetComponent(); + Sprite spriteImage = Sprite.Create(loadingPlaceholder, + new Rect(0, 0, loadingPlaceholder.width, loadingPlaceholder.height), + new Vector2(0.5f, 0.5f)); + + spriteRenderer.sprite = spriteImage; + break; + } + + } + + private IEnumerator ImageLoader(Texture2D texture = null) + { + if (enableLog) + Debug.Log("[Davinci] Start loading image."); + + if (texture == null) + { + byte[] fileData; + fileData = File.ReadAllBytes(filePath + uniqueHash); + texture = new Texture2D(2, 2); + //ImageConversion.LoadImage(texture, fileData); + texture.LoadImage(fileData); //..this will auto-resize the texture dimensions. + } + + Color color; + + if (targetObj != null) + switch (rendererType) + { + case RendererType.renderer: + Renderer renderer = targetObj.GetComponent(); + + if (renderer == null || renderer.material == null) + break; + + renderer.material.mainTexture = texture; + float maxAlpha; + + if (fadeTime > 0 && renderer.material.HasProperty("_Color")) + { + color = renderer.material.color; + maxAlpha = color.a; + + color.a = 0; + + renderer.material.color = color; + float time = Time.time; + while (color.a < maxAlpha) + { + color.a = Mathf.Lerp(0, maxAlpha, (Time.time - time) / fadeTime); + + if (renderer != null) + renderer.material.color = color; + + yield return null; + } + } + + break; + + case RendererType.uiImage: + Image image = targetObj.GetComponent(); + + if (image == null) + break; + + Sprite sprite = Sprite.Create(texture, + new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f)); + + image.sprite = sprite; + color = image.color; + maxAlpha = color.a; + + if (fadeTime > 0) + { + color.a = 0; + image.color = color; + + float time = Time.time; + while (color.a < maxAlpha) + { + color.a = Mathf.Lerp(0, maxAlpha, (Time.time - time) / fadeTime); + + if (image != null) + image.color = color; + yield return null; + } + } + break; + + case RendererType.sprite: + SpriteRenderer spriteRenderer = targetObj.GetComponent(); + + if (spriteRenderer == null) + break; + + Sprite spriteImage = Sprite.Create(texture, + new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f)); + + spriteRenderer.sprite = spriteImage; + color = spriteRenderer.color; + maxAlpha = color.a; + + if (fadeTime > 0) + { + color.a = 0; + spriteRenderer.color = color; + + float time = Time.time; + while (color.a < maxAlpha) + { + color.a = Mathf.Lerp(0, maxAlpha, (Time.time - time) / fadeTime); + + if (spriteRenderer != null) + spriteRenderer.color = color; + yield return null; + } + } + break; + } + + if (OnLoadedAction != null) + OnLoadedAction.Invoke(); + + if (enableLog) + Debug.Log("[Davinci] Image has been loaded."); + + success = true; + finish(); + } + + public static string CreateMD5(string input) + { + // Use input string to calculate MD5 hash + using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create()) + { + byte[] inputBytes = Encoding.ASCII.GetBytes(input); + byte[] hashBytes = md5.ComputeHash(inputBytes); + + // Convert the byte array to hexadecimal string + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < hashBytes.Length; i++) + { + sb.Append(hashBytes[i].ToString("X2")); + } + return sb.ToString(); + } + } + + private void error(string message) + { + success = false; + + if (enableLog) + Debug.LogError("[Davinci] Error : " + message); + + if (onErrorAction != null) + onErrorAction.Invoke(message); + + if (errorPlaceholder != null) + StartCoroutine(ImageLoader(errorPlaceholder)); + else finish(); + } + + private void finish() + { + if (enableLog) + Debug.Log("[Davinci] Operation has been finished."); + + if (!cached) + { + try + { + File.Delete(filePath + uniqueHash); + } + catch (Exception ex) + { + if (enableLog) + Debug.LogError($"[Davinci] Error while removing cached file: {ex.Message}"); + } + } + + if (onEndAction != null) + onEndAction.Invoke(); + + Invoke("destroyer", 0.5f); + } + + private void destroyer() + { + Destroy(gameObject); + } + + + /// + /// Clear a certain cached file with its url + /// + /// Cached file url. + /// + public static void ClearCache(string url) + { + try + { + File.Delete(filePath + CreateMD5(url)); + + if (ENABLE_GLOBAL_LOGS) + Debug.Log($"[Davinci] Cached file has been cleared: {url}"); + } + catch (Exception ex) + { + if (ENABLE_GLOBAL_LOGS) + Debug.LogError($"[Davinci] Error while removing cached file: {ex.Message}"); + } + } + + /// + /// Clear all davinci cached files + /// + /// + public static void ClearAllCachedFiles() + { + try + { + Directory.Delete(filePath, true); + + if (ENABLE_GLOBAL_LOGS) + Debug.Log("[Davinci] All Davinci cached files has been cleared."); + } + catch (Exception ex) + { + if (ENABLE_GLOBAL_LOGS) + Debug.LogError($"[Davinci] Error while removing cached file: {ex.Message}"); + } + } +} \ No newline at end of file diff --git a/Assets/Davinci/Scripts/Davinci.cs.meta b/Assets/Davinci/Scripts/Davinci.cs.meta new file mode 100644 index 0000000..d74abd2 --- /dev/null +++ b/Assets/Davinci/Scripts/Davinci.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0bdb01a2c8c314f3aa67316e12ee5c83 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor.meta b/Assets/Editor.meta new file mode 100644 index 0000000..7867005 --- /dev/null +++ b/Assets/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a7ed60dc0bf39fb48a6c0aad1d931937 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/AvatarMaker.cs b/Assets/Editor/AvatarMaker.cs new file mode 100644 index 0000000..b4b65ad --- /dev/null +++ b/Assets/Editor/AvatarMaker.cs @@ -0,0 +1,40 @@ +using UnityEditor; +using UnityEngine; + +namespace Infrastructure.Editor +{ + public class AvatarMaker + { + [MenuItem("CustomTools/MakeAvatarMask")] + private static void MakeAvatarMask() + { + GameObject activeGameObject = Selection.activeGameObject; + + if (activeGameObject != null) + { + AvatarMask avatarMask = new AvatarMask(); + + avatarMask.AddTransformPath(activeGameObject.transform); + + var path = string.Format("Assets/{0}.mask", activeGameObject.name.Replace(':', '_')); + AssetDatabase.CreateAsset(avatarMask, path); + } + } + + [MenuItem("CustomTools/MakeAvatar")] + private static void MakeAvatar() + { + GameObject activeGameObject = Selection.activeGameObject; + + if (activeGameObject != null) + { + Avatar avatar = AvatarBuilder.BuildGenericAvatar(activeGameObject, ""); + avatar.name = activeGameObject.name; + Debug.Log(avatar.isHuman ? "is human" : "is generic"); + + var path = string.Format("Assets/{0}.ht", avatar.name.Replace(':', '_')); + AssetDatabase.CreateAsset(avatar, path); + } + } + } +} diff --git a/Assets/Editor/AvatarMaker.cs.meta b/Assets/Editor/AvatarMaker.cs.meta new file mode 100644 index 0000000..51d8969 --- /dev/null +++ b/Assets/Editor/AvatarMaker.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b3908e8bec00280449aad82fd59cfe1d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/CreateAssetBundles.cs b/Assets/Editor/CreateAssetBundles.cs new file mode 100644 index 0000000..a8a9f5e --- /dev/null +++ b/Assets/Editor/CreateAssetBundles.cs @@ -0,0 +1,24 @@ +using UnityEditor; +using System.IO; + +public class CreateAssetBundles +{ + [MenuItem("Assets/Build selected as AssetBundle")] + static void BuildAssetBundle() + { + string assetBundleDirectory = "Assets/AssetBundles/"; + if (!Directory.Exists(assetBundleDirectory)) + { + Directory.CreateDirectory(assetBundleDirectory); + } + BuildPipeline.BuildAssetBundle(Selection.activeObject, new UnityEngine.Object[] { Selection.activeObject }, assetBundleDirectory + Selection.activeObject.name, + BuildAssetBundleOptions.UncompressedAssetBundle, + EditorUserBuildSettings.activeBuildTarget); + } + + [MenuItem("Assets/Build selected as AssetBundle", true)] + static bool CheckAssetBundlePossible() + { + return Selection.activeObject != null; + } +} \ No newline at end of file diff --git a/Assets/Editor/CreateAssetBundles.cs.meta b/Assets/Editor/CreateAssetBundles.cs.meta new file mode 100644 index 0000000..ea9d2c6 --- /dev/null +++ b/Assets/Editor/CreateAssetBundles.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7f056bf9df981654780ad064d7184821 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/FateFont.meta b/Assets/FateFont.meta new file mode 100644 index 0000000..ce4a7ed --- /dev/null +++ b/Assets/FateFont.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dd5cbef288c882c4e84f75778c01afbe +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/FateFont/FGO-Main-Font SDF.asset b/Assets/FateFont/FGO-Main-Font SDF.asset new file mode 100644 index 0000000..0e031da --- /dev/null +++ b/Assets/FateFont/FGO-Main-Font SDF.asset @@ -0,0 +1,4887 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!28 &-3736618144138935144 +Texture2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: FGO-Main-Font Atlas + m_ImageContentsHash: + serializedVersion: 2 + Hash: 00000000000000000000000000000000 + m_ForcedFallbackFormat: 4 + m_DownscaleFallback: 0 + m_IsAlphaChannelOptional: 0 + serializedVersion: 2 + m_Width: 1024 + m_Height: 1024 + m_CompleteImageSize: 1048576 + m_MipsStripped: 0 + m_TextureFormat: 1 + m_MipCount: 1 + m_IsReadable: 1 + m_IsPreProcessed: 0 + m_IgnoreMasterTextureLimit: 0 + m_StreamingMipmaps: 0 + m_StreamingMipmapsPriority: 0 + m_VTOnly: 0 + m_AlphaIsTransparency: 0 + m_ImageCount: 1 + m_TextureDimension: 2 + m_TextureSettings: + serializedVersion: 2 + m_FilterMode: 1 + m_Aniso: 1 + m_MipBias: 0 + m_WrapU: 0 + m_WrapV: 0 + m_WrapW: 0 + m_LightmapFormat: 0 + m_ColorSpace: 0 + m_PlatformBlob: + image data: 1048576 + _typelessdata: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030608090c0e0e0c09080603000000000000000000000000000000000000030608090c0e0e0c09080603000000000000000000000000000000000000030608090c0e0e0c090806030000000000000000000000000000000000000003060707070707070707070707070707070707070707070707070707070707070707070707070707070707070707070603000000000000000000000000000000020507080806060305060708070501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105070708070501000000030506070807060400000000000000000000000000000000040607060400000300000306070606030000000000000000000000000000000000000305060706040000030000040607060400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000305060809090a0a0a090908080706040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010406070a0d0f1011121211100f0e0b080705020000000000000000000000000003040404030100000000000000000000000000000000000000000000000000000000000000000000000000000000000000030506080b0d0f101112121212110f0e0d0a070604010000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060607090909080807070604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080b0d0e0f101111100f0d0b07060401000000000000030506070604000000000306070706030000000000000000000000000000000000000005050400000305060706040000000000000000000000000000000000000000000000000000000000000000000000000000000000000406070604000003030303040405050601000000000000000000000000000000000002050708070606030000030000040607060400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040607060503000000000406070604000000000000000000000000000000000000000000000000000000000000000000000000000000010300000306060706050300000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a0f121515191a1b191615130f0a040000000000000000000000000000040a0f121515191a1a191515120f0a040000000000000000000000000000040a0f131516191b1a191515120f0a03000000000000000000000000000000060b101213131313131313131313131313131313131313131313131313131313131313131313131313131313131313131312100b06000000000000000000000002090e1214151413120f1213141414110d080200000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d1113141414110d08060b0f121314151312100c07000000000000000000000000070c10121312100c070f060c10121313120f0b060000000000000000000000000000060b0f12131312100c070f070c10121312100c0700000000000000000000000000000000000000000000000000000000000000000000000000000001050708060b0f1213141516161717161615141413110d070b09070604000000000000000000000000000000000000000000000000000000000000000000000000000001070d111314171a1c1d1e1f1f1e1d1c1a181414110e0905030000000000030608090d10111110100d0b07070501000000000000000000000000000000000000000000000000000000000000000000000205060b0f121315181a1b1d1e1e1f1f1e1d1c1b19171413110d0806030000000000000000000000000000000000000000000000000000000000000000000002060808060b0f1213141516151514141313100c070c0a07060401000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000407080e111414181a1b1c1d1e1e1d1c1a171413110d08050100060b0f12131312100c07060c1012131312100b060000000000000000000000000003060809121211060b0f12131312100c070000000000000000000000000000000000000000000000000000000000000000000000000000070c10121312100c07100f101011111112120e0d0b0703000000000000000000000002090e1114141413120f0b0610070c10131313100c07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c10131313120f0b06070c10121312100c0700000000000000000000000000000000000000000000000000000000000000010507070b0c0e10060b0f12131413120f0b060e0c0a080706030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f151b1f21222627272622211f1b150f0a0400000000000000000000040a0f151b1f21222627272622211f1b150f0a0400000000000000000000040a0f151b1f21222627272622211f1b150f0a040000000000000000000000020a11171c1f2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201f1c17110a020000000000000000050d141a1e202121201f1c1f202121201e19140d0500000000000000000000000000000000000000000000000000000000000000000000000000000000040c13191d202121201e191c1c171b1f202121201f1c18120b030000000000000000030b12181c1f201f1c181c1c1c171c1f20201f1c17110a0200000000000000000000020a11171b1f20201f1c181d1c1d181c1f201f1c18120b03000000000000000000000000000000000000000000000000000000000000000000000306080d11141417171b1f202122232324232322222121201d181a18161313100c0706040100000000000000000000000000000000000000000000000000000000000000040a0f13181d20212326292a2b2c2b2a2928272421201e1913120f0b0600040a0f1315161a1d1e1e1d1c1a171413110d080200000000000000000000000000000000000000000000000000000000000003090e1114171b1f20222526282a2b2b2c2c2b2a2928262321201d191312100b0600000000000000000000000000000000000000000000000000000000000406090e12141518171c1f2021222222222121201f1c181b19161413110d0706040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000040b101316191e2021252628292a2b2a2a28262421201d1913110d0a11171b1f20201f1c181d1c171c1f20201f1c17110a02000000000000000000040a0f1315161f1e1d1c171b1f20201f1c18120b0300000000000000000000000000000000000000000000000000000000000000000000030b12181c1f201f1c181d1d1c1c1d1d1e1e1f1f1a1917130e08010000000000000000050d141a1e202121201f1c171c1d1d181c1f201f1c18120b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b12181c1f20201f1b171b1c181c1f201f1c18120b0300000000000000000000000000000000000000000000000000000002080d11131417191b1d1e171c1f2020201f1b171c1b1917151312100c060603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060e151b20262b2e2f323434332f2e2b26201b150f070000000000000000070e151b20262b2e2f323434322f2e2b26201b150e070000000000000000070f161b20262b2e2f333434322f2e2b26201b150e06000000000000000000020c141c23282b2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2b28231c140c02000000000000050f171f252a2d2e2e2d2b282b2d2e2e2d2a251e170e050000000000000000000000000000000000000000000000000000000000000000000000000000040e161e24292d2e2e2d2a25292922272b2d2d2e2d2c28231c150c030000000000020b0c151c23282c2d2c282329292923282c2d2d2b28221c140b020000000000000000020b141b22272b2d2d2c282329292a23282c2d2c28231c150c0a01000000000000000000000000000000000000000000000000000000000001050a0f1315191e20212422272b2d2e2f2f303030302f2e2e2d2c2924272523201f1c181413110d070401000000000000000000000000000000000000000000000000000003090e161b1d24292c2d3033363738393837363534312e2d2a25201f1b17110b0e151b1f222227292b2b2a29272421201d19130f0a040000000000000000000000000000000000000000000000000000060c1014191e2022272b2d2f31333536373838393837363533302d2c2924201f1c17110f0a03000000000000000000000000000000000000000000000001070c1013141a1e21222522282b2d2e2f2f2f2e2e2d2d2c282327262321201d181413110d0804000000000000000000000000000000000000000000000000000000000000000000000000000000050b10161b2022252a2d2e31333435363737363533312d2c2924201e19141b22272b2d2d2c2823292923282c2d2d2b28231c140c0300000000000000070e151b1f22222c2b2a2922272b2d2d2c28231c150c0600000000000000000000000000000000000000000000000000000000000000040c0c151c23282c2d2c28232a2929292a2a2b2b2b2c2726231f19120b02000000000000060e171f252a2d2e2e2d2b282229292a23282c2d2c28231d150c09010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080c151d23282c2d2d2b2722282923282c2d2c28231c150c0800000000000000000000000000000000000000000000000000050c13191d2021242628292b22282b2d2d2d2b27222927262422201f1c1713120f0b0603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008101820262b31373a3c3f41413f3c3b37322b272019100900000000000008101920272b31373a3c3f41413f3c3a37312b262019100800000000000009101920272b32373b3c3f41413f3c3a37312b262018100800000000000000000a141e262e34383a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a38342e261e140a0000000000020c17212930363a3b3b39383337393a3b3936302920170e05000000000000000000000000000000000000000000000000000000000000000000000000020c1620283035393a3b39363036362d3337393a3b3a38342e271e150b00000000010b151d1e272e34383a38342e3636362e34383a3938332d261d140a00000000000000020b141d262d3337393a38342e3636362e34383a38342e271e1c130a00000000000000000000000000000000000000000000000000000002080d11161b1f22252a2d2e312d3337393b3c3c3d3d3d3c3c3b3b3a39352f33322f2d2c282321201d1813110d07010000000000000000000000000000000000000000000000060e141a21272c2f35393a3d404243444545444342413e3b3a36302d2b27221b171a20272b2e2f33363737373634312e2d2a251e1b160c070000000000000000000000000000000000000000000000060c11171c1f252a2d2d3337393b3e4042434445454545444241403d3a39352f2d2b28231c1b16100b060000000000000000000000000000000000000003090e12181d1f20262b2e2f322d3338393a3c3c3c3b3b3a3a38342e3432302d2c292421201d1913100c070100000000000000000000000000000000000000000000000000000000000000000000040b10161c21272c2f3036393b3e4041424344444342403e3a39352f2d2a251d262d3337393a38342e36362e34383a3a38342e261e150c03000000000007101920262b2e2f383837362d3337393a38342e271e1810060000000000000000000000000000000000000000000000000000000000000c161e1e272e34383a38342e373636363637373838393433302b241d140b0100000000061018202930363a3b3a3938332d3636372e34383a38342e271e1b1309000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000811191e272e34383a3937332d35362e34383a38342e271e1a11080000000000000000000000000000000000000000000000050e161e252a2d2e31333436372d3338393a3937332d363432302f2d2c2823201f1c17120f0b06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008121a222a32373c4347484c4d4e4c4947433c37322b221b12090000000008121a222b32373c4347484c4d4d4c4847433c37322a221a12080000000009121b222b32373c4347494c4e4d4c4847433c37322a221a120800000000000006111c2630383f44464646464646464646464646464646464646464646464646464646464646464646464646464646464646464646443f3830261c1106000000000a141e29333b4246484746443f4446474746413b322920170d02000000000000000000000000000000000000000000000000000000000000000000000008131e28323a414647474641434342433f444647484644403930271c120700000009131d272f3039404446444043434242433f444646443f382f261c11060000000000000a141d262f383f44464644404443424344404446444039302d251c110700000000000000000000000000000000000000000000000003090e13191e20272b2e3036393b3d403f4446474849494a4a4949484747454142403e3c3a38342e2d2c2924201d18130f0a040000000000000000000000000000000000000000090f181f262b32383a4145474a4d4f5051525251504f4d4b4746423d3937332d2822262b32373b3c404344444343403e3a3936302c272118120b0300000000000000000000000000000000000000030a11171c23282c30363a3b3f4446484b4d4e505151525251504f4e4c4a4745413d3a38342e2c271f1c17110b06000000000000000000000000000000050b10151a1d24292c2d31373a3b3f423f44464748494848474746454042413f3d3a39352f2d2c29241f1c18120e090200000000000000000000000000000000000000000000000000000000000000070c161b21272c32383b3d4146474b4d4e4f505151504f4d4a4745413a3936302a2f383f4446464440444342433f444646443f3830261e150a00000000040e19222a32373b3c45454443433f444646444039302a22180e0400000000000000000000000000000000000000000000000000000000060f1e2830303940444644404444434243434444444545413f3c362e261d1208000000040e18222a333b4246474746443f4342434444404546454039302d251b11060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050f19232b303940454646443f42414344404446444039302c231a1005000000000000000000000000000000000000000000020c1620283036393a3e3f414344453f44464746443f4443413f3d3b3a38342e2d2b28221f1c17110d08020000000000000000000000000000000000000000000000000000000000000000000000000000000000000007101a242c343c43474e5355595a5a5955534e47433d342d241b1107000007111a242c343c43474e5355595a5a5955534e47433c342c241a1107000008111b242d343d43474e5355595a5a5955534e47433c342c241a100700000000000b17232e38424a50535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353504a42382e23170b00000006111c26303b454d52545453504a50535454524c443b32291f140900000000000000000000000000000000000000000000000000000000000000000000010d1924303a444c525454524c504f4f50495053545453514a42392e23180c0000030f1a252f3941424a5153514a504f4f4f504a505353504a42382d22170b000000000006111b262f384149505353514a51504f50514a5153514a423f372d23180d0100000000000000000000000000000000000000000002080d151a1e252a2d32373b3c4146474a4d4950535455565657565655555454514b4f4d4b494645403d3a39352f2c29241d1b15100b05000000000000000000000000000000000109121b212a31373d43484b515456595c5d5e5f5e5d5c5b5a5754524d4a46443f38332d31373c4347494d505151504f4d4a4746413a383228231d150c030000000000000000000000000000000001070c151c23282e34383b4246474950535558595b5d5e5e5f5f5e5d5c5b595654514c4a46443f3838322b28231c17110a02000000000000000000000003090e161c1f262b2f35393a3e4247484b4e4a50535455555555545453514b4f4e4c494745413e3a39352f2c29231d1a140c0701000000000000000000000000000000000000000000000000000000030b121821272c33383d4448494d525458595b5c5d5e5d5d5b595754514c4746413a36384149505353514a51504f504a505353504a423830261c11060000000a15202a343c4347495251504f5049505353514a423c342a20150a000000000000000000000000000000000000000000000000000000030e1822303a42424a5153514a5150504f4f5050515152524d4c4740382e24190e0300000a15202a343c454d52545453504a504f5050514b5153514b433f372d23180d01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b16212b353d424b51535350494f4e4f504a5153514a423e352c21160b00000000000000000000000000000000000000000008131e28323a4146474a4c4e5051514a505353535049514f4e4c4a4846443f3c3938332d2b28221c19130d080200000000000000000000000000000000000000000000000000000000000000000000000000000000020b19222c363e464e53585f6265676766625f58544e463e362d23190c03030c19232c363e464e54585f6265676765625f58544e463e362c23190c02030c19232d363e464e54585f6266676765625f58534e463e362c22190b0200000003101c28343f4a545c6060606060606060606060606060606060606060606060606060606060606060606060606060606060606060605c544a3f34281c100300000b17232e38424d575e6161605b545b6061615e564d443b3025190e0200000000000000000000000000000000000000000000000000000000000000000005111d2935414c565d61615e565d5c5c5d535b606061605c544a4034281c1004000814202b37414b53545c605c545d5c5c5c5c545c60605b544a3f33281c0f03000000000b17222d384149535b60605c545d5c5c5d5d545c605c5451493f352a1e12060000000000000000000000000000000000000000040c131920262b3036393d4347494c5254575a535b6061626263636363626161605d555b5a585653514b4a4745413a39352f2b26201c160e0902000000000000000000000000000009131b242d333c42464f54555d606366696a6b6c6b6a69686764615e5657535049443f383c42474e54555a5c5e5e5d5c5a5754524c48433d342e271e150b000000000000000000000000000000040c13181e262e34383f44464d5254535b6062646668696a6b6b6c6b6a69686663605d555653504a48433d38342e27221b140b02000000000000000000060e151a21282c3137394045474b4e5355585b545b6061626262616160605c545c5a595654514b4a4745413a38342f2a251f18120b0300000000000000000000000000000000000000000000000000040c151d232832383d44484f5456565e6164666768696a6a69686664605d5554524c4642424a535b60605c545d5c5c5d545c60605c544a42382e23170c0000030f1b26323c464e54555f5e5d5c5c535b60605c544e463c32261b0f0000000000000000000000000000000000000000000000000000000a15202a34424c54545c605c545e5d5c5c5c5d5d5e5e5e5f5a58524a40362b1f130700030f1b26313c464e575e6161605b545d5c5c5d5e555c605c5551493f34291e120600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c27333d474f545c60605b535b5b5c5d545c605c544f473e33281c100400000000000000000000000000000000000000010d1925303a444c525457595b5c5e5e5f5b6060605b5f5e5c5a59575553504a4946443f3938332d29241e19130c070100000000000000000000000000000000000000000000000000000000000000000000000000000a141d2b343e4850585f626a6f727474726f6a62605850483e352b1e150b0a151e2b353e48505860626a6f727474726f6a625f5850483e352b1e140a0b151e2b353e48505860626a6f727474726f6a625f5850483e342b1d140a00000006121f2b3844505c666d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d665c5044382b1f12060003101c28343f4a545e696e6e6c666a656c6d6e685e564d42362a1e11050000000000000000000000000000000000000000000000000000000000000000000713202d3946525d686d6e686a696969696a656c6d6e6d665c5144382c1f1206000b1824303c48535d64666d666a69696969696a666d6c665b5044382b1f1206000000030f1b27333f49535b656c6d666b6a6969696a6b666d66635b51463a2e22160900000000000000000000000000000000000001080e161e242931373a4146474e5456565e61646669656c6e6f6f7070706f6f6e6e6d676a68666562605c545754514b4745403a37322c27211a140d0500000000000000000000000008121b252d363e454d53596063676d7073757677787877767574716e696763605b53504a42454d5358606266696a6a6a696764615e56544e45403930271d120700000000000000000000000000050d161d242930383f444a5053565e6165656c6e71737576777878787877757473706d676763605c54544f46443f38332d261d140a0000000000000001070f1820262b33383c42474b515358575f6265686a666c6d6f6f6f6e6e6d6d666a68676563605d555754514c47454039363029241d150d060000000000000000000000000000000000000000000000050e161e272e343d44484f5559606367686e71737475767777767573716d6765615e56524d4a545c656c6d666b6a69696a6b666d6d665c544a3f34281c10030006131f2b37434e585f626b6b6a69696a656c6d665f584e43372b1c110600000000000000000000000000000000000000000000000000020f1a26313c46545e66666d666b6b6a696969696a6a6b6b6c67645c52473c3023170b0006121f2b37434e585f696e6d6c666a6969696a6b6b676d67625b51463a2e2216090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202c38444f5960666d6c65696868696a6b666d6661594f44382c2014070000000000000000000000000000000000000005111d2a36414c565e61646667696a6b6b666c6d6c656b6b6967656362605c545653504a46443f38353029251e18120b0300000000000000000000000000000000000000000000000000000000000000000000000006111c262f3d46505a616a6f767b7f80817f7c766f6a615a50473d30271c12111c26303d47505a616a6f767c7f80807f7c766f6a615a50473d30261c11121d27303d47505a616a6f767c7f81807f7b766f6a615a50463d2f261c1106000013202d3946535f6c76787979797979797979797979797979797979797979797979797979797979797979797979797979797979797978766c5f5346392d20130006121f2b3844505c666e7b7a79787778797a7a76695e52463a2d2014070000000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a7a7877767675767778797a7b796d6053463a2d201307000e1a2733404c59646f747978777676757576767879786c605346392d20130600000005121f2b3744505b656c787979787776757677787979726d63574a3e3125180c0000000000000000000000000000000000040c1319202830353c42474c525458606267686e70737677797a7b7c7c7d7d7c7c7b7a7a78777573716f6d666663605d5553514b47433c38332a251f170f0800000000000000000000050e1a242d373f4850575f616b6f757a7d808283848585848382807e7b7774706c65605b54504f575f626a6f73767777767673716d68626058514b43392e23180c000000000000000000000000070f171f282f353d424a50545c6064696e7175797b7e80818384848585848382817f7d7a7774706d6663605953504a443f382f261b11060000000000040c1218212a31373e44484d53555d6065686a6e72757778797a7b7c7b7b7a7a797877757472706d676864605d5553514b46423b352f271f17110a020000000000000000000000000000000000000000050e172028303940454f545960636b7073777a7e8081828384848382807d7a75716d68615e57515c666d7879797877767576777879786d665c5044382c1f1206000815222e3b47545f6a6f7878777676777879796f6a5f5347382e23170c0000000000000000000000000000000000000000000000000006121f2b37434e586670767979787777767576767777777878746e64584c3f3326190d000815212e3a47535f6a767b7a7978777675767777787979726d62564a3e3124180b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916222f3c4854606b707979787675747677787979706b6155483c2f231609000000000000000000000000000000000000000713202d3946525e686d7172747677787879797a79797877767472706e6d666663605b5453504a46413a353029241d150d0700000000000000000000000000000000000000000000000000000000000000000000000b17222d38424e58616c717c82888c8d8d8c88837c716c61594f42392e231817232e38424f59616c717c83888c8d8d8c88837c716c61594f42382e231718232e39424f59616c717c83888c8d8d8c88827c706c61584e42382d22170b000013202d394653606c79868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686796c605346392d2013000713202d3a4653606d788687868483848687887b6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000000020f1b2835424e5b68758187858483828283848586878784776b5e5144382b1e11000e1b2835414e5b687481868584838282828383848683776a5e5144372b1e110400000613202d394653606c788386858484838283848585877f7266594c3f3326190c00000000000000000000000000000000060d161e2429323a41454e53565e61666a6f73777a7d80828485878889898a898988888787858382807e7c797673706d6764605d55534e48443d363029211a12090000000000000000020c16202c363f49515a61696e767c8286898c8f90919291908f8e8d8a8784817d78716c66615a5960696e757c808384848382807d7a756f6a605c554b4034281c1004000000000000000000000710192129313a40454f545c60666d71767b7e8285888b8c8e909191929291908f8e8c898684817d79746f6b64605c54504941382d22170b00000000040d161d2429333c42474f55575f61676d7175787b7e818485868788888888878786858382817f7c7a7774716d6765605c55524d4540393128231c140c03000000000000000000000000000000000000040d172029323a424b515960636b70767c8084878b8c8e8f909190908e8c8a86827e7a756e69605d606d78848685848483828384858684786d6053463a2d201307000916222f3c4955626f7c8584838283848586867c6f62544a3f34281c10030000000000000000000000000000000000000000000000000814212e3a47535f6a768286858584838382828383848485858074675a4d4134271a0e000915222f3c4855626f7c878786858483828383848586867f7265584c3f3225190c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1723303d4a5663707d86868483828182838486867d7063574a3d3024170a000000000000000000000000000000000000000714212e3a4754616d7a7d7f81838484858686868685858482817f7d7b7976736f6c6663605b54524c46413a352f271f18120b030000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a54606a717e868f94989a9a999590867e716b60544a4034281c1c28343f4a54606b717e869094989a9a989490867e716b60544a3f34281c1c2834404b54606b717e879095999a9a98948f867e706a60544a3f33281c0f030013202d394653606c79869393939393939393939393939393939393939393939393939393939393939393939393939393939393939386796c605346392d2013000714202d3a4753606d7a8698929190919299887c6f6255493c2f2216090000000000000000000000010507070a0808060200000000000000000000000003101d2a3643505d697683909290908f8f90919292999286796c5f5346392c201300111e2b3844515e6b7784919290908f8f8f8f90919285796c5f5246392c1f130600000713202d3a4653606d7986959291908f8f909091928f8276695c4f4336291c100000000000000000000000000000000710181f282f353e444c52575f62686d73787c8084878a8d8f9192989595969696969594949892908e8d8b898683807d7a75716d67625f58544f46423b332c241b12090000000000000008131e28323e48515b626c717b83898e9299999c9d9e9f9e9d9c9b9a9796918d8a837e78716c60606b6f7b82888d8f9191908f8d8a86827c736d675c5145382c1f1306000000000000000000061019222b333b434b515960666d71797d82878b8f929897999b9c9d9e9e9f9e9d9c9b999993908d8985807c77716d66605b53493f33271b0f030000010c161f282f353f454d53596163696e74797e8285888b8e909293999595959494939792908f8d8c898684817e7a76716d67615e57514b433d342e261e150c0300000000000000000000000000000000020b161f29323b444c545c606b70767d83898d909597999a9b9c9d9d9c9b9999928f8b87817b736d67616d7a87969291908f8f90919296867a6d6053473a2d20140700091623303c4956636f7d8991908f8f9091928d8174665c5044382c1f12070000000000000000000000000000000000000000000000000815222f3b4855626e7b8894929291908f8f8f90909191919083776a5d5044372a1d11000a1623303d495663707c8999939291908f8f909192928d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c9291908e8e8f9091928c7f7366594c403326190d00000000000000000000000000000000000003101d2a3643505d6976838a8c8e8f919192929893989292918f8d8c8a888583807c7974706c66615d56524c4540393128231c150c050000000000000000000000000000000000000000000000000000000000000006121f2b3844505b666f7c8792989fa6a7a7a79f9992877d70665c5144382c1f1f2c3844505c666f7d8792989fa6a7a7a69f9892877d6f665c5044382b1f1f2c3845515c66707d8792999fa7a7a7a69f9892867c6f665b5044382b1f12060013202d394653606c7986939fa0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a09f9386796c605346392d2013000613202d394653606c7786939f9e9d9e9f95887b6e6255483b2f22150800000000000000000002080d111314171514120f09030000000000000000000003101c2936434f5c6976828f9c9d9c9c9c9c9d9e9f9f9285786c5f5245392c1f1200111e2a3744515d6a7784909d9d9c9c9c9c9c9d9e9285786b5f5245382c1f1205000006131f2c3845515c677986989f9e9d9c9c9c9d9e9b8f8275685c4f4235291c0f0000000000000000000000000000081019222a313a414550565d606a6e747a8084898d919697999c9d9fa3aaa2a3a3a3a2a2a1aaa29f9d9b99989892908d8a86827e7a756f6a636059524d453e362d241b0d040000000000010d1925303a44505a626d727e8690949b9fa3aba8a9aaababaaa9a8a7a8a09d9a95908a847e756d6a6f7d868e93999c9d9d9d9c9a99928e8780796d6053463a2d2013070000000000000000060f18222b343c454d555d606b70787e848a8f939a9c9fa2aaa6a8a9a6a4a3a2a2a3a4a6aba49f9d9a97918d89837e78726c655b5044372b1f1205000007121d283139404551575f626b70767b80858b8e9297989b9d9e9fa4aba2a2a1a1a9a19e9d9b9a989a93918e8a86827e79736e69605d554f443f3830271e150d030000000000000000000000000000000a141d28313b444d565e666d747d838990959a9da0a7a6a7a8a9a7a5a3a2aba39f9c99938e868079706b6d7a87949f9e9d9c9c9d9e9f9886796c605346392d201306000915222f3b4854606b7683909c9c9c9d9e9e9285796d6053463a2e23180c000000000000000000000000000000000000000000000006121f2b37434e586673808c999f9e9e9d9c9c9c9c9d9d9e978b7e7164584b3e3125180b000916232f3c4956626f7c89959f9e9d9c9c9c9d9e9e9a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060605050504040303030202020202020202020202020202020c1926323f4c5965727f8c989e9c9b9b9c9d9e998c7f7266594c3f3326190c05040000000000000000000000000000000005121e2b3845515e6b788491999a9c9d9e9e9fa3aaa29f9e9e9c9a989698928f8c8985817d78726d68615e56514b433d342e271e170e060000000000000000000000000000000000000000000000000000000000000613202d394653606c78839099a2aab0b3b4b1aba3999184796d6053463a2d20202d3a4653606d78849199a3aab0b3b3b0aaa3999184786d6053463a2d20202d3a4653606d79849199a3abb1b4b3b0aaa2989083786c605346392d2013060013202d394653606c7986939fa2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a29f9386796c605346392d20130005121f2b3744505b657985929fabaaaba194877b6e6154483b2e2115080000000000000000050c13191d20212322211f1a150e06000000000000000000030f1c2936424f5c6975828f9ca8a9a9a8a9aaabab9e9185786b5e5245382b1f1200101d2a3743505d6a7683909da9a9a9a8a8a9a99e9185786b5e5245382b1f1205000004101c2834404b5f6c7986929fabaaa9a8a9aaa89b8e8175685b4f4235281c0f0000000000000000000000000008111a222b343c434c515a62686d747b81868c91969a9ea0a8a6a9aaacaeafacabaaa9a9a9aaabacabaaa8a6aaa39f9c9998928f8a86817c76706b615e5750483e362d1f160c010000000005111d2a36414c56616c727f8b92989fa6acafb5b5b5afaca8a19e9c9b9b9d9fa3a09d96918a81796f7c8692989ea5a9aaaaa9a9aba39f99938b7e7265584b3f3225180c00000000000000030d17212a343c464e575e676d747d848b91969c9fa4acabaeaca7a09d99989695959697999c9ea2a9a9a19e9a95908a847f776c605346392d20130600010d18242f39434b515b62696e767d82878d92979b9ea1a9a8a9a6a5a4a3a3a4a5a7a9ababaaa8a7aca49f9d9b99928f8b85807b736d676159504a423930271f150b010000000000000000000000000006111b262f3a434d565e686d78808990949d9fa7aaacb1aba8a09d9a98969596979a9ea19f98928c847d726d7a8794a0abaaa9a8a9aa9f928679655b5044372b1f12050007131f2c38434f59636f7c89949fa9aaaba197897d7063544b4034281c1004000000000000000000000000000000000000000000000814212e3a47535f6a7784919daaabaaaaa9a8a9a9aaaa9e9184796d6053463a2d201307000915222f3c4855626f7b8895a2abaaa9a8a9aaaaa79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004080a0a1312121211111010100f0f0f0f0f0f0f0e0e0e0e0e0e0e0e0e0e1925323f4c5865727f8b98a5a9a8a7a9aaa5988c7f7265594c3f3226191112100706040100000000000000000000000004111e2b3744515e6a7784919da7a9aaababacaeb4aeacabaaa9a7a5aaa29f9c9997928e89847f7a746d68605d554f444039302920180f0700000000000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a95a0abb4bcc0c0bdb4aba0968a7e7164574a3e312424313d4a5764707d8a96a0abb4bcc0c0bcb4aba0958a7d7064574a3d312424313e4b5764717e8a96a0abb5bdc0c0bcb4aaa095897d7063564a3d3023170a0013202d394653606c79869395959595959595959595959595959595959595959595959595959595959595959595959595959595959386796c605346392d201300030f1b27333f495e6b7885919eabb6ada094877a6d6154473a2e21140700000000000001090e171e252a2d2e302f2e2b2620180f0a0100000000000000020f1c2835424f5b6875828e9ba8b5b5b5b6b7b7aa9e9184776b5e5144382b1e1100101d2a3643505d697683909ca9b6b5b5b5b6aa9e9184776b5e5144382b1e11050000000c18232e45525f6c7885929fabb7b6b5b6b4a79b8e8174685b4e4135281b0e00000000000000000000000007101a232c343d464e555d606c717a80878e92989ea1a8aaacb2b5afaca9aca49f9e9d9c9c9c9d9e9fa2aaa6a9acaeaca9aaa39f9b98928e88827d756e69615a50483e31281d1207000000000713202d3946525e68717e87939fa2aab0b9bbbcb4aba49f9a96918f8e8f9092989c9fa09d938e837a829098a2aaafb6b7b7b1acaca49fa4998c807366594d4033261a0d000000000000010b151f29333c464e5860696e79818991969ea1a8acafb0aaa39f9a95908d8b8a88898a8a8c8f92979b9fa3aba7a09d96918b7e7164584b3e3125180b0004101d2935404b555d606d727b828a8f939a9fa2a9abaaa39f9c9a9897969797989a9c9ea1a9abacb2afacaaaba39f9c97928d868079706b605c544b433931271d1207000000000000000000000000000b17222d38414b555e686e7a838d929c9fa6abb1b7ada79f9d96918d8b8a88898b8d91969da09f9691877f737a8794a0adb7b6b5b6ab9f9285786c5f493f33271b0f0300030f1b27323d4854606b76828f9ca5afb3a99b8e8174665c5145382c1f1307000000000000000000000000000000000000000000000815222f3b4855626e7b8895a0acb8b7b6b6b5b5b6aea2988c7f72665c5145382c1f1306000815222e3b4855616e7b8894a1aeb7b6b5b6b6b4a79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b101416171f1f1f1e1e1e1d1d1c1c1c1c1c1c1b1b1b1b1b1b1b1b1b1b1b1b1b25323f4b5865727e8b98a5b1b5b4b5b2a5988b7f7265584c3f32251e1e1e1d1413110d08010000000000000000000005111d2935414c566b7885919eabb4aeaba9a7a4a2a1a1a49fa4a1a2a4a6a9a9a9a19e9a96918c86807a726d676059514a423b332a21191007000000000000000000000000000000000000000000000000000000000e1b2734414e5a6774808d9aa7b1bdc6cecfc6bdb2a89b8e8175685b4e4235282835414e5b6874818e9ba8b2bdc6cfcec6bdb1a79a8e8174675b4e4134282835424e5b6875818e9ba8b2bdc6cfcec6bcb1a79a8d8074675a4e4134271b0e0013202d394653606c79868888888888888888888888888888888888888888888888888888888888888888888888888888888888888886796c605346392d201300000b17222d44515e6a7784919daab7ada093867a6d6053473a2d20140700000000000009131b20293036393a3d3b3a37312a211c130a00000000000000020f1b2835424e5b6875818e9ba8b4c1c2c3c3b7aa9d9084776a5d5144372a1e1100101c2936434f5c6976828f9ca9b5c2c2c2b7aa9d9184776a5e5144372b1e1104000000071f2c3845525f6b7885929eabb8c2c2c1b4a79a8e8174675b4e4134281b0e0000000000000000000000060f19222c353e464f585f676d757e858d92999fa3aaacb2b7b3adaba39f9c989a9391908f8f909091929897999c9fa3abacaeaeacaaa29f9b948f89827b716c615a5043392f24180d01000005111e2a36414c56616d7a859299a4aeb4bcc2bdb4aaa299938e888483828283868a8f949d9f9e95908590959faab4bcc1bcb1a7a09d9a939a988b7e7165584b3e3225180b00000000000007121d27313b454e58606a6f7b838d929da0a8adb2b9ada69f98928d8883807e7d7c7c7d7e808285898e92999fa4aca8a0978a7d7064574a3d3124170a000613202c3945515d676d757f878f949c9fa4acaba39f9c9892908d8b8a898a8a8b8d8f9297999ea1a8adb2b7b5aeaca9a19e98928c847d736d665c554b43392f23180f060000000000000000000000030f1b27333f49535d676e7a8390959da4abb0b8b4aea49c95908a84807f7d7c7c7e81848a90959ca199928b807a8794a0adbac2c2b8ab9e9185786b5e52452d22170b0000000a16212c38444f59626f7c88939eabb5ab9f9285796d6053463a2f24180c00000000000000000000000000000000000000000006121f2b37434e5866737f8c99a7b1bcc4c3c2c2c0b6ac9f92867a6d61544b4034281c1004000814212e3b4754616e7a8794a1adbac3c2c2c0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000000000000000000000000000000000000000810171c2023242c2c2c2b2b2a2a2a2929292928282828282828282828282828282828323e4b5865717e8b98a4b1bec1beb2a5988b7f7265584c3f322a2a2b2b2a21201d19130c040000000000000000000713202d3946525d687986929faaaaa29f9c9a989695949a939a9495979a9c9fa3ababa8a09e98928d857f796f6b605c544d453c332b22191007000000000000000000000000000000000000000000000000000000101c2936434f5c6976828f9ca9b5c2cfd8d8cfc3b6a99d9083766a5d5043372a2a3643505d697683909ca9b6c3cfd8d8cfc2b6a99c8f8376695c504336292a3743505d6a7683909da9b6c3cfd8d8cfc2b5a99c8f8276695c4f4336291c100013202d3946535f6c767c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c766255493c2f2216090000061d2a3744505d6a7783909daab6aea39986796d6053463a2d201307000000000007101b252d323a4146474a4847433c332e251c1007000000000000010e1b2834414e5b6774818e9aa7b4c1cdcfc3b6a99d9083766a5d5043372a1d10000f1c2935424f5c6875828f9ba8b5c2cec3b6aa9d9083776a5d5044372a1d1104000005121e2b3845515e6b7884919eabb7c4cdc0b3a79a8d8074675a4d4134271a0e00000000000000000000040d18212b343e474f59606a6f7a818b92979fa3abaeb4b9b4aea9a19e99928f8b89868483838283848485888a8c8f92999b9fa3abadb2aeaca69f9c938f867e716c61554b4035291d100400000714202d3946525e6874808d98a2abb5bfc5c0b5aba2989287817c78767575767a7d828990959c9f9791979fa7b1bcc5c5b8aca095908886888c897c6f6356493c302316090000000000020b18232f39434d575f6a6f7c8590959da4acb2b9b5ada39c949086807c777371706f6f70717376797d81868e939aa1a9a095877a6d6154473a2e211407000714202d3a4753606d79818c92999fa6acaca59e99928f8a8683807e7d7d7d7e7f808285888c91969ea1a9afb5bbb9b3adaaa29f96918880786d675c554b40342921180e03000000000000000000040f19222b3744505b656d798390959fa7aeb7bcb4aba39f928c837d787472706f707174787d838c929ba39f928d828f9ca9b5c2cfc4b7aa9e9184776b5e5144382b1e06000000040f1b27323d4754606a75828f99a4afada2978a7d7063554b4035291d100400000000000000000000000000000000000000000814212e3a47535f6a7784919daab7c3ced0cfc8bbafa49a8d8174685e5242392e23180c00000714212d3a4754606d7a8793a0b4bfcbcfcdc0b4a79a8d8174675a4e4134271b0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000008111a21282d303139393838383737363636353535353535353535353535353535353535353e4b5865717e8b98a4b1becbbeb1a5988b7e7265584b3f3637373838372d2c29241e160d0400000000000000000714212e3a4754616d7a8799a09e9998928f8d8b89888786868787888a8d9092999da0a7acaaa29f97928c847d736d665e574e453d342b22190f050000000000000000000000000000000000000000000000000000101d2a3643505d697683909ca9b6c3d0dbddd0c3b7aa9d9084776a5d5144372a2a3744505d6a7783909daab6c3d0dbdcd0c3b6a99d9083766a5d5043372a2a3744515d6a7784909daab7c3d1dcdccfc3b6a99c908376695d5043362a1d10000815222e3b4754606a6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6a6054473b2e2215080003101d293643505c6976838f9ca9b6ac9f928679665c5044382b1f120600000000020b19222d373f444c52545655534e463f372e22190b020000000000010e1b2734414e5a6774818d9aa7b4c0cdcfc2b6a99c8f8376695c504336291d10000f1c2835424f5b6875828e9ba8b5c1cec3b6a99d9083766a5d5043372a1d1004000004111e2b3744515e6a7784919daab7c4cdc0b3a69a8d8073675a4d4034271a0d000000000000000000010c161f2a333d474f59616b6f7c848e939ea1a9afb5bab9b1aaa39f97918c86827f7c7a78777676767778797b7d8082868a8e92999ea1a8adb3b0aba59e9892877e71675d5145392c20130600000814212e3b4754616e7a86929faab3bdc7c7bbafa49992867d746f6a696868676d70767c838c929fa19ea1a9b1b9c2cbc0b5ab9d90837c797b8081776c605346392d20130600000000000a141d2934404b555f696f7c859297a0a7aeb8bdb6ada39c918c827b736f6a6665636262636466666d70747b81889197a09d918477685e5246392d201307000b1825313e4b5864717e8b939fa3abafa8a09e938e87827d7976737271707071727476797c7f848a91979fa4abb4bcbeb9b4aea8a19a938c82796d675c51453f332a1f14090000000000000000000a15202a36424d57606c77828f95a0a7b1b9c0baaea399928a8076706c666563626364666c7078808b919ba39c948f949eaab7c3d0c3b7aa9d9084776a5d5144372a1e11040000000a16212b37434e58626f7c87939facb3a99b8e8175675d5145382c1f140900000000000000000000000000000000000000000815222f3b4855626e7b8895a0acb8c5d5ddd2c6b9ac9f93877b6e62564c4130271d120700000713202d3a4653606d798699a3aebac7d3cdc0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000000000000000000000000000000000005101a232c33393c3d4645454544444343434242424242424241414141414141414141414141414b5864717e8b97a4b1becabeb1a4988b7e7165584b434344444445433a39352f281f160c01000000000000000a1623303d495663707c899696918d898582807e7c7b7a7a797a7b7b7d8083868b90959ea1a8aea9a29f96918780786e695f574e463d342b21170d04000000000000000000000000000000000000000000000000000f1c2835424f5b6875818e9baab4bfcad1d2cbbfb4aa9c8f8276695c4f4336292935424f5c6875828f9baab4bfcad2d1cabfb4aa9b8f8275685c4f4235292936434f5c6976828f9cabb4bfcbd2d1cabfb4aa9b8e8175685b4f4235281c0f0006131f2b37434e586062626262626262626262626262626262626262626262626262626262626262626262626262626262626262626260584e43372b1f130600030f1c2936424f5c6975828f9ca8b5ab9f9285786c5f4a3f34281c1003000000000a141d2b343f4951565e6163625f5851493f342b1d140a0000000000010e1a2734414d5a6774808d9aa7b3c0cdcfc2b5a89c8f8275695c4f4236291c0f000e1b2835414e5b6874818e9ba7b4c1cec2b6a99c8f8376695c504336291d1003000004111e2a3744515d6a7784909daab7c3ccbfb3a6998c807366594d4033261a0d00000000000000000008131e28313c454f59616b707d8591969ea5adb3bbc0b7afa79f98928c857f7a76726f6d676a6969696a656c6e7073767a7d81868c91969ea2a9afb5afaaa29992857a6d6053473a2d20140700000b1825323e4b5865717e8b99a3aebcc5d0c6b9ac9f93877d706b625f585b555d60646a6f78808b939aa4adb3bbc2cbc7bbafa399897c6f6d6e73746c655b5044372b1f12050000000006111b262f3845515c676e7b859297a1a9b1b9c0b9aea49c918c7f786e69625f58585755565757545c6063696e747d8590959b8f827568564c41362a1d1105000b1825323e4b5865717e8b98a5aeaea59e969189817b75716d676765646364646567656c6f73787e848d9399a2aab4bcc6bfbab2aca49f948f82796d605b51453b31261a0e0400000000000000030f1b27323a46535f69727f8b949ea7b1b9c2bbafa59f92877e736d64605b54575556545b60666d737f8b909ba59e9c9ea6b0bbc7d0c3b6aa9d9083776a5d5044372a1d1104000000040f1b27323c47535f6a75818e9aa4afac9f9285796d6053473b30251a0e0000000000000000000000000000000000000006121f2b37434e5866737f8c99a7b1bcc8d4d4c8bcb1a79c8f8275695f53443a301e150b00000006121f2b3844505c667986929facb9c5d2cdc0b4a79a8d8174675a4e4134271b0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000b17212c353e44494a52525251515150504f4f4f4f4f4f4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e5764717e8a97a4b1bdcabeb1a4978b7e7164584f505050515151504745413a31281e1308000000000000000c1926333f4c5966727f8c8f8a84807c797674716f6e6e6d6c6d6e6f7173767a7f838a91969da4aeada8a099938d837b6e6a60584e463d33291f160b020000000000000000000000000000000000000000000000000c1825323f4b5865727f8b98a2aebac0c5c5c0baaea3988c7f7266594c3f332626323f4c5965727f8c98a2aebac0c5c5c0baaea2988b7f7265584c3f322526333f4c5966727f8c99a3aebac0c5c5c0baaea2988b7f7265584b3f3225180c00030f1b27323c464e54555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555544e463c32271b0f0300020f1b2835424e5b6875818e9ba8b4ab9e9285786b5f52452e23170b0000000006111b262f3d46515b62686d706e6a635b51463d2f261c110600000000000d1a2733404d5a6673808d99a6b3c0cccec1b5a89b8e8275685b4f4235281c0f000e1b2834414e5b6774818e9aa7b4c1cdc2b5a89c8f8275695c4f4236291c0f03000004101d2a3743505d6a7683909da9b6c3ccbfb2a6998c7f7366594c403326190d0000000000000000040e19242f3a434d57606b707d869297a0a8afb9bec0b6aea59e9590867f79736d686562605d555c5c5d535b60616466676d71757a7f848b92979fa4abb2b4aba197887b6e6155483b2e22150800020f1c2935424f5c6875828f9babb5bfcec8bcb1a79a8d81746b6059534e4f4b51535860666d737f88939fa5afbac6d2c5b9ac9f9286796c60626668605b53493f33271b0f03000000000b17222d38414e58606d79839097a1a9b3bbc3bdb1a79c928c7f736c665f57534e4b4a49494a4b4a5053575e616b707b8390968e8174675b4e413025190d01000815222f3b4855626e7b8897a1ada49d938e847c756e6964605c55585756575758535b6062666c717a80879298a2aab4bcc6c4beb6afa69e948e81756d62574d42362a20150a0000000000000006131f2b37434e58616e7b86929fa6b0b9c3beb3a99e938b7f726c635b53504a4a49494a50545c606d727e8b939da8a9aab0b8c2cccfc3b6a99c908376695d5043362a1d1003000000000a15202b37434e58626e7c87939facaea2988a7d7164574d42362a1b11060000000000000000000000000000000000000815212e3a47535f6a7784909daab7c3ced9d1c4b8aca095897d7063574d4232281e0c0300000003101c28343f4a5f6c7885929fabb8c5d2cdc0b4a79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000000000000000000000000000004101c28333e474f55575f5f5f5e5e5d5d5d5c5c5c5c5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b64717d8a97a4b0bdcabdb1a4978a7e71645c5c5c5d5d5d5e5e5d54524c433a2f24190d010000000000020f1b2835424e5b68758186827d78736f6d66676563626160606061626467686d72777e848d929fa2aab2aba49f9590847c6f6a60584e453b31281d140a0000000000000000000000000000000000000000000000000714212e3a4754616d7a85929fa5afb5b9b9b5afa69f92867b6e6154483b2e21212e3b4754616e7b86929fa6afb5b9b9b5afa69f92867b6e6154473b2e21212e3b4854616e7b86929fa6afb6b9b9b5afa59f92857a6d6154473a2e21140700000a15202b343c434749494949494949494949494949494949494949494949494949494949494949494949494949494949494949494947433c342b20150a0000010e1b2834414e5b6774818e9aa7b4ab9e9184786b5e5145382b1e06000000000b17222d38414e58626d727a7d7b726d63584e42382d22170b02000000000d1a2633404d596673808c99a6b3bfcccec1b4a79b8e8174685b4e4135281b0e000e1b2734414e5a6774818d9aa7b4c0cdc2b5a89b8f8275685c4f4235291c0f02000003101d2a3643505d697683909ca9b6c3cbbfb2a5988c7f7265594c3f3226190c00000000000000020c16202935414c565f696f7d869298a2a9b2bac1c0b7aea49d938e837b736d67615e565653514b504f504950535557555d6064686d73797f858d9399a0a8afab9e9285796c605346392d2013060005111d2935414c566b7884919eabb7c4d1c4b8ab9f95887b6e61594f4743424045474e545c606d727e8b939eaab6c2d1c4b8ab9e918578665b55595b53504941382d22170b00000000030f1b27333f4953606a74808d95a0a9b3bbc5c0b5ab9f958d80736d605b544d47433e3d3c3c3d3e3f44464d535960696e7a84918d8073665a4d4033271a0800000814212e3a47535f6a7885919ea49d928d81796f6b615f5753514b4b4a4a4a4b4c495053545b60686d747d869298a2aab4bfcbc7c0bbb0a69e938b7f72695f53463c32261b0f010000000000000815222e3b4754606a75818e98a3aeb8c1c6b9ada1978f81756d625a5246443f3d3c3d3f444a505b626c74818e96a1adb7bbc2cad3cfc2b5a99c8f8276695c4f4336291c100300000000040f1b26313c47535f6a75828f9ba6b0aa9c8f8275695e5246382d22170b000000000000000000000000000000000004101c2834404a54626f7b8895a0acb8c5d5d5c9bdb2a99d9083776b6054453c3120160c00000000000b17232e45525e6b7885919eabb8c4d1cdc0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000000000000000000000000000000000814202d39444f5961646c6c6b6b6b6a6a6969696868686868686868686868686868686868686868686868717d8a97a4b0bdcabdb0a4978a7d7168686969696a6a6b6b6a605d564c4135291d11040000000000000916232f3c4956626f7c7b76706c6663605c5458565554535354545557565e61656c7179808a9298a2aab4afa79f9691857c6f6a60574d433a2f261b110600000000000000000000000000000000000000000000000713202d3946525e68727f8c939fa3abacacaba49f948d8073695e53463a2d21202d3a46525e6973808c949fa4abacacaba39f948c7f73685e5246392d20212d3a46535e6973808d949fa4acacacaba39f938c7f72685e5246392d2013070000040e19222b32373b3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3b37322b22190e040000010d1a2734404d5a6773808d9aa6b3aa9d9184776a5e5144372b1e11040000030f1b27333f4953606a727f8789887f726a60544a3f33281e1308000000000c1926333f4c5966727f8c99a5b2bfcccdc1b4a79a8e8174675b4e4134281b0e000e1a2734414d5a6774808d9aa7b3c0cdc1b5a89b8e8275685b4f4235281c0f02000003101d293643505c6976838f9ca9b6c2cbbeb2a5988b7f7265584c3f3225190c0000000000000008131e28323a45525d686e7b859298a2aab3bbc4c2b9afa59d928d81796e69605c55524c494745404343433f4446484a4c5154565e61666d727a808791969ea5a89c8f8275655b5044372b1f1205000713202d3946525d687986929facb9c5d0c3b6a99d908376695f53473d373135393d424a505b626c75818e9ba8b4c1cec4b7ab9e9184786b5e4a4d4e46443f382f261b11060000000005121f2b3744505b656f7c88939fa7b1bbc5c7bbafa3999083786c605b504a423c3731302f2f302e34383b42464f575e686e7c868c7f7266594c3f3326190c000006121e2b37424e576875828f9b9d928d80756d676059534d4745403f3e3d3d3e3f3f44464a50565d606b6f7d869298a3aebac3ceccc1b8afa59f92867b6e61584e43372b1d1207000000000005111e2a36414c56626f7c89939eaab4bfcabeb3a99e92857a6d615b51484038332d2f2d33383f44515a606d7a84919ea7b1bcc8d4dbcfc2b5a89c8f8275695c4f4236291c0f0300000000000a15202b37434e58626f7c89949fabac9f92867b6e6153493f33271b0f0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c121f2c3844515c6673808d9aa7b1bcc8d4d2c5b9ada1968a7e7164594f44332a1f0e040000000000061e2b3844515e6b7784919eaab7c4d1cdc0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303c4955616c70797878787777767676757575757575757474747474747474747474747474747474747d8a97a3b0bdcabdb0a3978a7d74757575767677777778766d685d5245392c2013060000000000000815222e3b4754606a6f6e6963605b5453514a4b49484747464748484a4c52545a61676d737e869298a3abb5b1a8a19792867d6f695e554b41382d22170b020000000000000000000000000000000000000000000005111d2a36414c56606c77818d92999d9f9f9e99938d82786d60574d42362a1e1e2a36424d56606c78828d93999e9f9f9e99928d82786c60564d41362a1e1e2a36424d57606d78828d939a9e9f9f9d99928d81776c60564c41362a1d110500000007101920272b2e2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2e2b2720191007000000000d192633404c5966737f8c99a6b2aa9d9083776a5d5044372a1d110400030e18212b3744505b656f7c88939993887c6f665b50443a3025190b020000000c1926323f4c5965727f8c98a5b2bfcbcdc0b3a79a8d8074675a4d4134271a0e000d1a2734404d5a6773808d9aa6b3c0cdc1b5a89b8e8275685b4f4235281c0f02000003101d293643505c6976838f9ca9b6c2cbbeb2a5988b7f7265584c3f3225190c000000000000010d1925303a44505a606d7a849197a2aab4bcc5c5bbb1a79d938d80756d675f57514b46413c3a39352f362d3337393b3d4145474c52545c60686d737c848e939da49b8e81756853493f33271b0f03000714212e3a4754616d7a8799a3aebbc7cdc0b4a79a8d817467574d42352b26292c30383f44515a63707c8996a3afbcc9c4b7ab9e9184786b5e5145413937332d261d140a00000000000613202d394653606c7883909aa4afb9c3cbbfb5ab9f92877c6f665b50443f382f2b262422232423282b31363d454d565f6a707d847d7063574a3d3024170a0000020e1a2631414e5b6874818e9b948d80746e605d554f46423c38342f313031312d3337393f444c5259606b707d86929fa8b2bdc8d4cac1baaea3988f82756a5f5347392f24180d01000000000714202d3946525e6875818e9ba5afbcc6c6baada2978c7f72685d52493f362b28222222282e343f45525d68707d8a959fabb8c5cfdacec2b5a89b8f8275685c4f4235291c0f020000000000030f1a26313c4754606a76828f9ca7afa3998c7f73655b5044372b1f1919191919191919191919191919191919191919202d3a4653606d7985929eabb8c3ced6cabfb4aa9e9184796d6053463d3220180e000000000004111e2b3744515e6a7784919daab7c4d0cdc0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707e86858584848483838282828282828181818181818181818181818181818181818181828f9ca9b6c2cfc2b6a99c8f8281818282838383848484837a6d6054473a2d21140700000000000006131f2b37434e586062615f5753504a4644403e3c3b3b3a393a3b3c3e41464750555c606c717d869299a3afbbb2a9a19892857b6e675d53493f33271e140800000000000000000000000000000000000000000000010d1925303a44505b656d7880878d919292918d8780786d665c50453b31251a1925303b44505b666d7880878d919292918d8780786d665b50443b3025191a25313b44505c666d7880878d919292918d8780786d655b50443a3025190d0100000000070e151b1f22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221f1b150e0700000000000c1926323f4c5965727f8c98a5b2a99c908376695d5043362a1d1003000915202935414c55606c7883909aa49a9083786c60564c41362a1d140a0000000c1925323f4c5865727f8b98a5b2becbcdc0b3a69a8d8073675a4d4034271a0d000d1a2733404d5a6673808d99a6b3c0ccc1b4a89b8e8175685b4e4235281b0f02000003101c2936434f5c6976828f9ca9b5c2cbbeb1a5988b7e7265584b3f3225180c00000000000005111d2935414c56616c75818e96a0a9b3bcc6cabeb3a99f958e81776c605c554d45403935302d2c29242922272b2d2e2f35393a41464b51565d606b6f79818d929f9a8e8174675b4e412d22170b00000714212e3a4754616d7a8799a3aebbc7cbbeb1a5988b7e7265584b3f31251b1d1f262e343f4855626f7b8895a2aebbc8c4b7ab9e9184786b5e5145382d2b27221b140b020000000006131f2b37434e5864707d8a95a0acb6c0cbc7bbaea3998d80736a5f544a3f332d261d1b17161617171c1f252a333b444e58606b7077706b6155483c2f231609000000091a2734414d5a6774808d989082786d605c514b433d37312c29232423242422272b2d333a41454f59606b737f8c96a0acb8c3ced7cbbfb4aa9e94887c6f62554b4035291d1004000000000814212e3b4754616e7a86929facb9c1cec5b8ab9f92857a6d60564c41372d241c1716171c232935414c56616b7683909da9b3bec9d5cec1b5a89b8e8275685b4f4235281c0f020000000000000a15202b37434e5863707d89959fabab9e9184786c6053463a302525252525252525252525252525252525252525252a36424d5664707d8a97a1adb9c6d5d3c6baaea2988c7f72665c5144382c1f1206000000000004111e2a3744515d6a7784909daab7c3d0cdc0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b929291919090908f8f8f8f8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8f949fabb7c3d0c4b7ab9f948f8e8e8f8f8f9090909191897d7063564a3d3023170a000000000000030f1b27323d464e545655534d46443f3a38342e302f2e2d2d2d2e2f3036393e434b515a616b707d87929fa6b0bbb3aaa1979083796d655b50443b3025190e050000000000000000000000000000000000000000000008131e27333f49535c666d737b8084868684817c746d665c544a3f33291f14141f28333f4a545c666d747c8084868684807c746d665c544a3f32291f14141f28343f4a545c666d747c8184868684807b736d665c53493f32281e1308000000000000040a0f131516161616161616161616161616161616161616161616161616161616161616161616161616161616161616161615130f0a040000000000000c1825323f4b5865727e8b98a5b1a99c8f8376695c504336291d1003030d1a26313945515d67717e8b959fac9f958b7e72685e52463d2f261c110600000c1825323f4b5865727e8b98a5b1becbccc0b3a6998d8073665a4d4033271a0d000d1a2733404d5a6673808d99a6b3c0ccc1b4a79b8e8174685b4e4135281b0e020000030f1c2936424f5c6975828f9ca8b5c2cbbeb1a4988b7e7165584b3e3225180b0000000000020d17202d3946525e68717e8a939ea8b2bbc5cec6b9ada2979083786d655b514b433c342f292520201d181c171b1f202224292c30363940454c525960676d77808b93998e8174685b4e4135281b0600000613202d394653606c7986929facb9c5cabdb1a4978a7e7164574b3e31241810141c232f3c4855626f7b8895a2aebbc8c4b7ab9e9184786b5e5145382b1f1b17110a0200000000000815212e3b47535f6a7683909da7b1bec7d2c5b9ac9f92867a6e61584e42382d221c140b0a0909060b10141a2129323c464f5960636a6361594f44382c2014070000000d1a2733404d5a6673808d92867b6e665c5045413a312b261f1c1817171718171b1f22282f353d474f59606d7984919da7b1bcc8d4d1c6bcb0a69a8d8174675d5145392c20130600000004111d2935414c5565727f8b99a3aebac7c9beb3a99a8d8073685d52443a30241b0f0b060b1119242f3a434f5964717e8b97a1adb9c6d2cec1b4a89b8e8175685b4e4235281b0f02000000000000030f1b27323d4854606b7683909da7aca196897d7063564c4136323232323232323232323232323232323232323232323a46525e6975828f9ca9b3bec9d5ccc0b5ab9f92867a6d60544a4034281c1004000000000004111d2a3744505d6a7783909daab6c3d0cdc0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a979e9e9e9d9d9c9c9c9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9c9fa6b0bbc7d3c7bbb0a69f9c9b9b9b9c9c9c9d9d9e95897c6f6256493c2f231609000000000000000a16202b343d4347494846423b38332d2c28232322212020212122252a2d313940455059616b727f8c949faab4bcb3a9a0958f82776c60564c41362a21160b00000000000000000000000000000000000000000000020b17222d38414a545c606a6e7477797977746f6a605c544a42382e21170d0b17222d38424a545c606a6f7477797977746f6a605c544a42382d20170d0c17232e38424b545c606a6f7477797977746e6a605c544a41382d20160c02000000000000000003060809090909090909090909090909090909090909090909090909090909090909090909090909090909090909090908060300000000000000000b1825323e4b5865717e8b98a4b1a89c8f8275695c4f4236291c0f010b151f2b37434e58606d7a85919ea7b1a79e92857a6d61584e42382d22170b02000b1825323e4b5865717e8b98a4b1becbccbfb2a6998c7f7366594c403326190d000d1a2633404d596673808c99a6b3bfccc1b4a79a8e8174675b4e4134281b0e010000020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e7164584b3e3125180b000000000009141f2b37424d57616d7a85929fa5afbac4cdc8bdb2a89e92857b6e665c534940393129231d191413110d070b0f121315191d20252a2e343a41454f555d656c737f87928e8275685b4f4235281c0f020005121f2b3744505b657884919eabb7c4cabdb0a3978a7d7064574a3d312417070a15222f3c4855626f7b8895a2aebbc8c4b7ab9e9184786b5e5145382b1e0f0b06000000000000000916222f3c4955626f7c88959fabb9c3d0c9beb3a99b8e8275685e52463c2f261c110a02000000000003090f17202a333d474f54565e57554f473e33281c10040000000c1926333f4c5966727f8c8d8073695e544a3f352f281f1a14100c070a0a060b0f12171e2429353d45515c66707d8995a0acb8c7d2d8cfc1b8ab9f9285796d6053473a2d2014070000000613202c3945515d6776828f9cabb4bfcbc6b9ada197897c6f62564c4132281e120900000008131e28313e4653606d7985929eabb8c5d0cec1b4a79b8e8174685b4e4135281b0e02000000000000000a15202c38444f5964707d8a95a0aca89b8e8175685e52463f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f4754616e7b86929facb9c5cfd4c7bbafa4998d8074685d5242392e23180c00000000000004101d2a3743505d6a7683909da9b6c3d0cdc0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4abaaaaa9a9a9a8a8a8a8a8a8a8a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a9abb0b8c2ccd8cdc2b8b0aba9a7a8a8a8a9a9aaaaa195887b6e6255483b2f22150800000000000000040f19222b32373b3c3b3a36312b28221f1c181615141413141515191d20272f343e474f59606c77828f98a3aebabbb1a79e948b7e72685e52463e33281c10040000000000000000000000000000000000000000000006111b262f38424a50585f62676a656c6567625f58514a423930261c0f0506111c262f38424a50585f6267656c6c6567625f58504a42382f261c0e0506111c263039424b51585f6267656c656a67625f58504a42382f261b0e0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1a89b8e8275685b4f4235281c0f07121d27313947535f6a73808d97a1adb9ada2978e81746a60544a3f33281e1308000b1825313e4b5864717e8b97a4b1becaccbfb2a5998c7f7266594c3f3326190c000d192633404c5966737f8c99a6b2bfccc1b4a79a8e8174675b4e4134281b0e010000020f1c2835424f5b6875828e9ba8b5c1cabdb1a4978a7e7164574b3e3124180b00000000020e1a25303a47535f6974808d97a2adb7c1ccd2c5b9aca0968b7f72695e544a41382f271f18120d080604010000030506080d1113191d23282f353d434b535b606d727e868e8175685b4e4235281b0f0200030f1b27333f49536a7683909da9b6c3cfbeb1a4978b7e7164584b3e2f24180e0915222f3c4855626f7b8895a2aebbc8c4b7ab9e9184786b5e5145382b1e12000000000000000005121e2a36424d576773808d9aa7b1bccbd2c6b9ada197897d7063564c41342a1d140a000000000000000000050e18212b353d444849514a48443e352c21160b000000000c1825323f4b5865727e8b857a6d61564d42382e241d160d090400000000000003060b1319232834404b54606b7784919dacb6c0ccd8d3c6baaea2988b7e7164584b3e2f24180d0100000714212d3a4754606d7a86929facb9c5d1c5b8ab9e9285796c6053463a2f20160c00000000010c161f2c3845515c6773808d9aaab4bfcbcec1b4a79b8e8174685b4e4135281b0e020000000000000004101c27333d4653606c7883909da9ac9f92867a6d61544c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4f5966727f8c99a3afbbc7d6d2c6b9ac9f93877b6e61564c4130271c120700000000000003101d2a3643505d697683909ca9b6c3cfcdc0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000000000000000000000000000000000c1926323f4c5965727f8c98a4aeb7b7b6b6b5b5b5b5b5b5b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b6b7bbc2cad4ded4cac2bbb7b6b4b4b5b5b6b6b6aea194877b6e6154483b2e211508000000000000000007101920272b2e2f2e2d2a261f1c1712100c07080807060708080d11151d2329353e44505b656e7b86929faab4bfb9b0a69f92857a6e61594f44382c21160b00000000000000000000000000000000000000000000000a141d2630383f444e53555a535b605b5355534e44403930271e150a00000a141d2630383f444e5355535b60605b5355534e443f3830261d140a00000a151e27303940454e5355535b605b535a55534e443f3830261d140a0000000000000000000000000000000000000000000000030607080a0c0e0f0f1010100f0e0d0d0c09070604000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0a79b8e8174685b4e4135281b0e0c18232f3943505a626e7c87929fa9b3beb3a99f93877c6f665b50443a3025190b020b1824313e4b5764717e8a97a4b1bdcacbbfb2a5988c7f7265594c3f3226190c000c1926333f4c5966727f8c99a5b2bfccc0b4a79a8d8174675a4e4134271b0e010000020f1b2835424e5b6875818e9ba8b4c1cabdb0a4978a7d7164574a3e3124170b0000000005111e2a36424d57616e7b86929fa9b3bec9d3c7bcb0a69e9184796d60574d42392f261d150d0701000000000000000000000104080d12181e242931394149505b626c707c837d7063574a3d3024170a0000000b17222d414e5b6874818e9ba9b3becabfb2a5988c7f7265554b403529201a1415222f3c4855626f7b8895a2aebbc8c4b7ab9e9184786b5e5145382b1e1205000000000000000714212d3a46535e697884919eabb7c2cdd1c5b8ab9e9285786c6053463b3020180b0200000000000000000000060f19232b32383b3d443d3c38332c231a1005000000000814212e3b4754616e7a827d70685e52443b30261c130c040000000000000000000001081118232e39424f5965727f8c9aa4afbbc8d4d6cabeb3aa9b8e817568554b4035291d100400000a1623303d495663707d8999a3afbbc7cec1b4a79b8e8174665b5044382b1f1204000000000004101c2834404b5563707d8998a3aebac7cdc1b4a79a8e8174675b4e4134281b0e0100000000000000000b161f2b3744505b65717e8b97a1ada3998b7f7265585858585858585858585858585858585858585858585858585858606b7784919eabb5c0cbd4c8bcb1a79b8f8275695f53443a301e150b0000000000000003101d293643505c6976838f9ca9b6c2cfcdc0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c88929da7b1bdc3c3c2c2c2c2bcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcc0c1c5cad2dae3dcd4ccc7c3c2bfbfc0c0c1c2bbaea295887b6f6255483c2f221509000000000000000000070f161b1f222322211e1a140f0b060400000000000000000001050b12182327333f49535f6973808d98a2aebac1baada2978e81756b6155483d32271b0f0300000000000000000000000000000000000000000000020b141e262e343c4347484d49505350494847433c342e271e150c030000020b151e262e343c4347484950535350494847433c342e261e150b020000030c151e272e343c43474949505350494d4847433c342e261e140b02000000000000000000000000000000000000000105060b1012131517191b1c1c1c1d1c1c1b1a1918161413100c0706040000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0a79a8e8174675b4e4134281b0e101c2934404b55616c76828f99a3aebbc4bbafa49a9083786c60564c4135291d140a0b1724313e4a5764717d8a97a4b0bdcacbbeb1a5988b7e7265584b3f3225180c000c1926333f4c5966727f8c99a5b2bfccc0b3a79a8d8074675a4d4134271a0e010000020e1b2835414e5b6874818e9ba7b4c1cabdb0a3978a7d7064574a3d3124170a000000000714202d3a46525e6975818e99a3aebbc5cfd0c4b7ab9f948a7d71665c51453b30271d140b0300000000000000000000000000000000070c13191f272f383f44515a616a6f76706b6155483c2f23160a000000061724303d4a5763707d8a97a1adb9c6c2b5a89b8f8275675d51453b322a25201d222f3c4855626f7b8895a2aebbc8c4b7ab9e9184786b5e5145382b1e1205000000000000000815212e3b4854616e7b8796a1acb9c5d4cfc2b5a89c8f8275655b5044372b1f120600000000000000000000000007111921272c2f3037302f2c28211a110800000000000714202d3946525e686e75706b60564c4132291e140a010000000000000000000000000007121d27303d4754616e7a87939facb9c6d2dbd0c4b7aa9d918477675d5145392c20130600000c1926333f4c5966727f8c99abb5c0cbcbbeb2a5988b7f7265544a3f33281c0f030000000000000c18232e3a4753606d7986929facb8c5cdc0b4a79a8d8174675a4e4134271b0e010000000000000000030f1b27333f4953606d7985919eaaab9d9184776a656565656565656565656565656565656565656565656565656565656f7c8996a0acbdc7d1d1c4b8ab9f95897c6f63574d4232281e0c030000000000000003101c2936434f5c6976828f9ca9b5c2cfcdc0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000000000000000000000000000000000815212e3b47535f6a74808d95a0abb4bfcbc1bbb6b5afafafafafafafafafafafafafafafafafafafafafafb3b5b9c0c8d2dcd4cac2bbb7b5b2b2b3b3b4b5b6afa296897c6f6356493c3023160900000000000000000000040a0f1315161514120e090300000000020507080a0b0d0d0e0e0d071117222d38414d57606d7a86929facb8c3beb3a99e938a7d7063594f44382c1f15090000000000000000000000000000000000000000000000020c141c232831373a3b413f4446443f3c3a373128231c150c0300000000030c151c232831373a3c3f444646443f3c3a373128231c150c0300000000030c151d232832373b3c3f4446443f413b3a373128231c140c0200000000000000000000000000000000000004080d1113171c1f20222426282829292a29282827262523201f1c181413100c07010000000000000000000000000000000000000a1723303d4a5663707d8996a3b0a79a8d8074675a4d4134271a0c19232c3845515c67707d8a949fabb5bfccc0b6ac9f958b7e72685e52463d2f261c11061724313d4a5764707d8a97a3b0bdcacbbeb1a4988b7e7165584b3e3225180b000c1926323f4c5965727f8c98a5b2bfcbc0b3a69a8d8073675a4d4034271a0d010000010e1b2834414e5b6774818e9aa7b4c1c9bdb0a3968a7d7063574a3d3024170a00000004101c2834404a54616e7b86929fabb5bfcdd6cabeb3a99c9083766c61544a4033291e150b0200000000000000000000000000000000000001080d151d262d333f4850586062696361594f44382c2014070000000713202d3a4653606d7985929eaab4bfc5b8ab9f9285796d60574d443d36312c29242f3c4855626f7b8895a2aebbc8c4b7ab9e9184786b5e5145382b1e1205000000000000000b1824313e4b5764717e8a97a8b2bdc9d5ccbfb2a5998c7f726653493f33271b0f0300000000000000000000000000070f161b2022232b2423201c16100800000000000005111e2a36414d565e61686360594f443a3020170c020000000000000000000000000000000b15202d3946525e687784919daab7c4d0ddd2c6b9ac9f93867a6d6053473a2d20140700020f1c2835424f5b6875828e9ba8b5c1d1cbc0b5ab96897c706356493d2d22170b0000000000000007131f2c3845515c6776828f9ca9b5c2cdc0b4a79a8d8174675a4e4134271b0e010000000000000000000b17222d3845515c66737f8c98a3aca095897c727272727272727272727272727272727272727272727272727272727274818e9ba8b2bdcfd5c9beb3a99d9083776b6054453c3120160c0000000000000000030f1c2936424f5c6975828f9ca8b5c2cfcdc0b4a79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000000000000000000000000000006131f2b37434e58606d79839099a3aebac1b7afaaa8a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a6a8aeb6c0cad5ccc2b8b0aba9a5a6a6a7a8a8a9aaa3978a7d7064574a3d3124170a00000000000000000000000003060809080705020000020507090e1214151618191a1a1a191818171b262f3b45525d6874818e9ba7b1bcc5bbafa59d9083776b6054483c31261a0e000000000000000000000000000000000000000000000000020a111720262b2e2f2d33373937332d2e2b262018120b03000000000000030a111720262b2e2d3337393937332d2e2b262017110a03000000000000030b121820262b2e2d33373937332d2f2e2b262017110a020000000000000000000000000000000001070c1013191d2023282b2d2f313334353636363635343433322f2d2c2923201f1c18120f0a04000000000000000000000000000000000a1623303d495663707c8996a3afa6998d8073665a4d4033271a151e2a36424d57606d7984919ea6b0bdc6d1c7beb1a79e92857a6d61584e42382d22170b1724303d4a5763707d8a96a3b0bdc9cabeb1a4978b7e7164584b3e3125180b000c1925323f4c5865727f8b98a5b2becbc0b3a69a8d8073675a4d4034271a0d010000010e1b2734414e5a6774818d9aa7b4c0c9bcb0a396897d7063564a3d3023170a00000006121f2c3844515c6673808c99a3afbdc6d1d2c6b9ada1978a7d70635a5042392e21170c03000000000000000000000000000000000000000000030b141b2227363e464e54565d57554f473e33281c100400000006121f2c3844515c6674818d98a2aebac2baada2978c7f72695f564e46423b39352f2f3c4855626f7b8895a2aebbc8c4b7ab9e9184786b5e5145382b1e1205000000000000000d1a2734404d5a6773808d9aa6b3c0cedac9bcafa396897c706356493d2d22170b000000000000000000000000000000040b101316161e171614100b0500000000000000020e1925303b444d52545b56544f473d32281e0e050000000000000000000000000000000005111e2a36414c566874818e9ba7b4c1cedad4c7bbafa499897c6f6256493c2f2316090003101c28343f4a546a7683909da9b6c3d0c7bbafa399877a6d6154473a2e2114060000000000000004101c2934404b556673808c99a6b3bfccc0b3a79a8d8074675a4d4134271a0e0100000000000000000006111b2834404b54616e7a86929faca79c8f827f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f86929facb8c3ced2c6b9ada1978a7e7164594f44332a1f0e040000000000000000020f1c2935424f5c6875828f9ba8b5c2cecdc0b4a79a8d8174675a4e4134271b0e01000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b26323c45515c666f7c86929fa6b0bcafa59e9b969696969696969696969696969696969696969696969a9ca4aeb9c5d1c7bbb0a69f9c9999999a9b9c9c9d9e978b7e7164584b3e3125180b000000000000000000000000000000000000000003080e1114141a1e21212325262727272625242321202935414c56626f7c89959fabb8c4c1b8ab9f95897c6f63574d42372b1b110600000000000000000000000000000000000000000000000000060b151a1f212222272b2d2b2722211f1b150c0700000000000000000000060c151b1f2122272b2d2d2b2722211f1a150c0600000000000000000000070c151b1f2122272b2d2b272222211f1a150b060000000000000000000000000000000001070d12181d1f24292d2e34383a3b3d3f414242434343424140403f3c3a38342f2d2c29231d1b150e09020000000000000000000000000000091623303c4956636f7c8996a2afa6998c7f7366594c403326191c26303846535e69737f8c96a1acb8c2cfd8d0c3b9ada2978e81746a60544a3f33281e131723303d4a5663707d8996a3b0bcc9cabdb0a4978a7d7164574a3e3124170b000c1925323f4c5865727f8b98a5b2becbc0b3a69a8d8073675a4d4034271a0d010000010e1b2734414e5a6774818d9aa7b4c0c9bcb0a396897d7063564a3d3023170a0000000713202d3a4653606d7985929eabb5c0cfd8d1c5b8ab9e9285796d6053463e30271c0f050000000000000000000000000000000000000000000000020a1117242c343d434749504a48443e352c21170b0000000004101c2834404a54616e7b86929fa6b0b9beb3a99f92857b6e686058534d4745403e3c3c4855626f7b8895a2aebbc8c4b7ab9e9184786b5e5145382b1e1205000000000000000f1c2935424f5c6875828f9ba8b5c2ced6cabfb4aa94877a6e6154473b2e21140600000000000000000000000000000000000407090a110a0907040000000000000000000008141f29323b4146474f4a48443d352b20160c0000000000000000000000000000000000020e1925303f4c5965727f8c98a5b2bfcbd8d7ccc0b5ab968a7d7063574a3d3024170a0006121f2b3844505c667885919eabb8c4d1c5b9ac9f928679685e5246392d20130700000000000000000c18232f3e4b5764717e8a97a4b1bdd0c0b3a69a8d8073675a4d4034271a0d01000000000000000000000c18232e3946525e6874818e9ba6ab9f948f8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b9298a2aebac6d7cbc0b5ab9e9285796d6053463d3220180e000000000000000000020f1c2835424f5b6875828e9ba8b5c1cecdc0b4a79a8d8174675a4e4134271b0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000a15202834404b545f6a727f8c949faab4aa9e938f898989898989898989898989898989898989898989898d929ca8b5c1cec3b7ab9f948f8c8c8d8d8e8f909091928c7f7265594c3f3226190c000000000000000000000000000000000000060b0f14191e2021252a2d2e303233333434333231302e2d2a2f3a4754606a7783909daab6c3c8bcb1a79b8f8275695f5347382d22170b000000000000000000000000000000000000000000000000000003090f121415171b1f201f1b1715120f0a04000000000000000000000000030a0f1215171b1f20201f1b1715120f0a03000000000000000000000000040a0f1315171b1f201f1b171514120f090300000000000000000000000000000001070d12181d24292c3035393a3f4446484a4c4e4f4f4f504f4f4e4d4c4b494745403e3a38342f2b27201a140d05000000000000000000000000000916222f3c4955626f7c8895a2afa5998c7f7266594c3f332617232e38424f59616e7b86929fa8b2bdcad4cfc9c6beb3a99f93877c6f665b50443a3025191623303d495663707c8996a3afbcc9cabdb0a3978a7d7064574a3d3124170a000c1925323f4c5865727f8b98a5b2becbc0b3a69a8d8073675a4d4034271a0d010000010e1b2734414e5a6774818d9aa7b4c0c9bcb0a396897d7063564a3d3023170a0000030f1c28333f4a5463707d8997a1adbdc7d1d5c9beb3a99a8d8174665c5044382c1e150b000000000000000000000000000000000000000000000000000006111a222b32373b3c433d3c38332c231a100500000000000c18232e3946535f69727f8b949fa7b0bbbaada29791837a6f6a615e5753514b4a49474855626f7b8895a2aebbc8c4b7ab9e9184786b5e5145382b1e120500000000000000111e2a3744515d6a7784909daab7c3d0d3c6baaea29886796d6053463a2d201307000000000000000000000000000000000000000000040000000000000000000000000000020d1720293036393b423d3c38332b231a0e04000000000000000000000000000000000000081825313e4b5864717e8b97a4b1becad7ddd2bdb0a4978a7d7164574a3e3124170b000713202d3a4653606d7986939facb9c6d1c5b8ab9e9285786b564c41362a1e110500000000000000000716222f3c4955626f7c8895aab4bfcac0b3a6998d8073665a4d4033271a0d000000000000000000000007121d2a36414c56626f7c88949faba69f9c9898989898989898989898989898989898989898989898989898989898989fa2aab4bfcad3c7bbafa3998c8073665c5145382c1f1306000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecdc0b4a79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000000000000000000000000000000040c18232e39424e58606c78829098a2aea89b8f827d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d808d9aa6b3c0cdc2b5a99c8f827f7f8080818283848485847c6f6255483c2f22150900000000000000000000000000000000020a11171b1f252a2d2e31363a3b3d3e40404141403f3e3d3b3a363037434e5865727e8b98a8b2bdc9c3b9ac9f93877b6e6253493f33271b0f03000000000000000000000000000000000000000000000000000000020608060b0f1213120f0b060603000000000000000000000000000000000306060b0f121313120f0b060603000000000000000000000000000000000306060b0f1213120f0b0608060200000000000000000000000000000000070c12181d24292f35393a4146474a50535557595b5b5c5c5d5c5b5b5a59585653514b4b4745403937322a251f170e090000000000000000000000000915222f3c4855626f7b8895a2aea5988b7f7265584c3f32251c28343f4a54606b75818e98a2aebac4cecdc4beb9b8b7afa49a9083786c60564c4135291d1423303c4956636f7c8996a2afbcc9c9bdb0a3968a7d7063574a3d3024170a000c1925323f4c5865727f8b98a5b2becbc0b3a69a8d8073675a4d4034271a0d010000010e1b2734414e5a6774818d9aa7b4c0c9bcb0a396897d7063564a3d3023170a000006121f2b3844505b6674818d9aa9b3becfd9d2c6b9ada197897c7063544a3f34281a0c0300000000000000000000000000000000000000000000000000000008101920272b2e2f36302f2c28211a110800000000000007121c2a36424d57606c77828f959ea6afb5b3a9a09591847c746e6964605d555755545255626f7b8895a2aebbc8c4b7ab9e9184786b5e5145382b1e120500000000000000121e2b3845515e6b7884919eabb7c4d1d2c5b8ac9f928579665c5144382c1f120600000000000000000000000000000000000000000000000000000000000000000000000000050e171f252a2d2e35302f2c27211a1108000000000000000000000000000000000000000a1724303d4a5763707d8a96a3b0bdc9d6d7cbbeb1a4988b7e7165584b3e3225180b000714202d3a4753606d7a869aa4afbbc8d1c4b7ab9e9184786b5e51453025190d0100000000000000000714202d3a4753606d7a8698a2aebac7c0b3a6998d8073665a4d4033271a0d0000000000000000000000000d1925303b47535f6a7683909ca8b0aba9a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5acaeb4bcc6d0d2c5b9ac9f92867b6e61544b4034281c1004000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecdc0b4a79a8d8174675a4e4134271b0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d27303c44505b666e7b86929fa6ac9f92867c7070707070707070707070707070707070707070717e8b97a4b1becabfb2a6998c7f73737374757576777878786f6a5f53473a2e211508000000000000000000000000000002080b141b22272b3036393b3f424648494b4c4d4d4d4c4b4b4a4746423d3a3d4854616e7b8796a0acb9c5c8bbafa49a8d8074655b5044372b1f120500000000000000000000000000000000000000000000000000000000000000000305060503000000000000000000000000000000000000000000000000030506060503000000000000000000000000000000000000000000000000030506050300000000000000000000000000000000000000030b12181d24292f35394045474c5254545c60626466676869696969686767666562605c555753514b47433c363029201b120b02000000000000000000000815222f3b4855626e7b8895a1aea4988b7e7165584b3e3225222c3844505c66707d89939eaab4bfcccfc4bbb2adababadac9f958b7e71685e52463d2f261c23303c4956636f7c8996a2afbcc9c9bcb0a396897d7063564a3d3023170a000c1925323f4c5865727f8b98a5b2becbc0b3a69a8d8073675a4d4034271a0d010000010e1b2734414e5a6774818d9aa7b4c0c9bcb0a396897d7063564a3d3023170a00000613202d394653606c7985919eabb8c4cfded1c4b8ab9e9185796c605346392e2317060000000000000000000000000000000000000000000000000000000000070f161b1f22232a2423201c17100800000000000000000e1a26313b44505b656d7a838f949fa3abb0b1a7a0969187817b75716d67666462605d56626f7b8895a2aebbc8c4b7ab9e9184786b5e5145382b1e120500000000000000121f2c3845525f6b7885929eabb8c5d1d1c4b7ab9e9184786b544a4034281c10040000000000000000000000000000000000000000000000000000000000000000000000000000050d14191e2021282322201c160f0800000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdcad6d6cabdb0a3978a7d7064574a3d3124170a000714212e3a4754616d7a8794a0b6c0ccd1c4b7aa9e9184776b5e5144382b1e080000000000000000000613202c3945515d677985929facb8c5c0b3a6998d8073665a4d4033271a0d00000000000000000000000008141e2b37434e5864707d8a96a1acb7b4aba39f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa3abb5babfc6ced4c8bcb1a79b8e8175695e5242392e23180c00000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecdc0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e28333f4a545f69717e8b939ea9a3999083796d636363636363636363636363636363636364717e8b97a4b1becabfb2a6998c7f736666676869696a6b6c6b625f584e43372b1f120600000000000000000000000000040c13191d262d33373b4146474c4d53545658595a5a5a5958575654524d4a474546535e697784919eaab7c4ccc0b6ac9e9184786c605346392d201308000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c151d23282f353940454b5153565d6165666d6e707274757576767675747373726f6d676864605c55544e46423b332d251d140b020000000000000000000815222f3b4855626e7b8895a1aea4978b7e7164584b3e31252a36414c56606d7883909da5afbcc6d0c9beb2a9a19e9ea1a8a79e92857a6d61584e42382d2223303c4956636f7c8996a2afbcc9c9bcb0a396897d7063564a3d3023170a000c1925323f4c5865727f8b98a5b2becbc0b3a69a8d8073675a4d4034271a0d010000010e1b2734414e5a6774818d9aa7b4c0c9bcb0a396897d7063564a3d3023170a00000916222f3c4955626f7c8897a1adb9c6d2dacdc1b4a79a8e8174665b5044382b1f1206000000000000000000000000000000000000000000000000000000000000040a0f1315161d171614100b0500000000000000000009141f27333f49535d686d79828d92999fa6acafa8a199938e87827e7a7673716f6d686a686f7b8895a2aebbc8c4b7ab9e9184786b5e5145382b1e120500000000000000121f2c3945525f6c7885929fabb8c5d2d0c3b7aa9d9084776a5d51442e23180c0000000000000000000000000000000000000000000000000000000000000000000000000000000002080e1114141c171614100b050000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1becbd8d5c9beb3a995887c6f6255493c2f221609000815212e3b4854616e7b8794aab4bfcad1c4b8ab9e9185786b5e52452f24180d01000000000000000004111d2935404b556b7885929eabb8c5c0b3a6998d8073665a4d4033271a0d000000000000000000000000020f1b26323c4653606d7884919eaab4aea399929292929292929292929292929292929292929292929292929299a3aebbc7d0d7d1c4b8aba095897c6f63564d4230271d120700000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecdc0b4a79a8d8174675a4e4134271b0e01000000000000000001010101020202030303030404040401000000000000000000000000000000000000030c17222d38424d57626c75828f97a1aba0958d80736b6055565656565656565656565656565864717e8b97a4b1becabfb2a6998c7f73665a5a5b5c5d5d5e5f5e55534e463c31261b0f03000000000000000000000000070e161e24292f383f44464c525458575e6163656666676766656463615e565653514b4d576774818e9aa7b4c1d0c7b9ada197887c6f6255493c3025190e02000000000000000000000000000000000000000000000000000000000000000000000000000000000000030506080b0d0e10111212121211100e0b0906060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e272e343940454b51555d6065686d7176797b7d7f8182828283828281807f7e7c797774716d67626058524d453f372f261d140a0000000000000000000815222f3b4855626e7b8895a1aea4978b7e7164584b3e31262f3846525e68727f8b95a0acb7c1cecfc6b9ada197919196a1ada2978e81746a60544a3f332823303c4956636f7c8996a2afbcc9c9bcb0a396897d7063564a3d3023170a000c1925323f4c5865727f8b98a5b2becbc0b3a69a8d8073675a4d4034271a0d010000010e1b2734414e5a6774818d9aa7b4c0c9bcb0a396897d7063564a3d3023170a00000c1925323f4c5865727f8b98a9b3bec9d5d8ccc0b6ac988b7e7265544a3f33281c0f03000000000000000000000000000000000000000000000000000000000000000003060809100a0a07040000000000000000000000030b17222d38414c565d676d7880878f949c9fa4acaba49f99928f8a8683807d7c7a787675747c8895a2aebbc8c4b7ab9e9184786b5e5145382b1e120500000000000000121f2b3845525e6b7885919eabb8c4d1d0c4b7aa9d9184776a5e51442d22170b000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080f0a0907040000000000000000000000000000000000000000000008111d2935414b556673808c99a6b3bfccd9d2c6b9ada197877a6e6154473b2e211408000714202d3a4753606d7a8698a2aebac7d2c5b8ab9f9285786c554b4135291d11040000000000000000010d18242f44515e6b7784919eaab7c4c0b3a6998d8073665a4d4033271a0d000000000000000000000000000a151f2b3844505c66727f8c98a2aeac9f928685858585858585858585858585858585858585858585858587929facb9c5d2d5c9beb3a99d9083776b6054443b301e150b0000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecdc0b4a79a8d8174675a4e4134271b0e0c0c0c0c0c0c0c0d0d0d0e0e0e0e0f0f0f101010101111110d0d0b070300000000000000000000000000000006111c262f3b45505a616d7a85929ea5a79f93877d6f675d5149494949494949494949494b5864717e8b97a4b1becabfb2a6998c7f7366594d4e4f50515152524847433c342a20150a000000000000000000000000081019202830353d41495053565e616568696e707173737474737271706e696763605c55515764717e8a97aab4bfcbc9beb2a9998c7f7366564c41362a1e110500000000000000000000000000000000000000000000000000000000000000000000000000000105060b0f121315181a1b1d1e1e1f1f1e1d1c1b181513120f0b06040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d27303940454b51555d60676d71767a7e8286888a8c8e8e8f8f908f8e8e8d8c8b898684817e79746f6a615e57514940382f261c120900000000000000000815222f3b4855626e7b8895a1aea4978a7e7164574b3e312d38414e58616d7a85929fa7b1bcc9d1c6bdb0a69e918484919ea6a99f93877c6f665b50443a3025303c4956636f7c8996a2afbcc9c9bcb0a396897d7063564a3d3023170a000c1925323f4c5865727f8b98a5b2becbc0b3a69a8d8073675a4d4034271a0d010000010e1b2734414e5a6774818d9aa7b4c0c9bcb0a396897d7063564a3d3023170a0004101d2935404b556875818e9ba8b4c1cfdad4c8bbafa49a897c6f6256493c2d22170b00000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000006111b262f3a444c555d666d737c828a8f939a9ea1a8aba39f9c9992908d8a888785838280808d9aa6b3c0cdc4b7ab9e9184786b5e5145382b1e120500000000000000111e2b3844515e6b7784919eaab7c4d1d1c4b7ab9e9184786b5e493f33271b0f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000002010000000000000002050b101a232c3945515d6776838f9ca9b6c2cfdcd1c4b8ab9e9185796c605346392d201306000613202c3945515d677985929facb8c5d2c5b8ac9f928579675d5145392c201306000000000000000000071e2a3744515d6a7784909daab7c3c0b3a6998d8073665a4d4033271a0d0000000000000000000000000003101c28343f4a54606d7a86929faca89b8e8179797979797979797979797979797979797979797979797983909ca9b6c3cfd2c6b9ada1978b7e7164594f4332291f0c030000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecdc0b4a79a8d8174675a4e4134271b18181818181919191a1a1a1a1b1b1b1c1c1c1c1d1d1d1d1e1e1a1917130e080100000000000000000000000000000a141d29333f46525e68707d8a939da8a4999184796d60594f443d3d3d3d3d3d3d3d3e4b5864717e8b97a4b1becabfb2a5998c7f7266594c424243444545453c3a37312a22180e040000000000000000000000081119222b323a41464f535b6063686e7275787b7c7e7f8080807f7e7e7d7b7773706d67605c54616e7b8898a3aebac7cfc3b6a99d908376685e5246392d20140700000000000000000000000000000000000000000000000000000000000000000000000003080d1113171b1f2022242628292b2b2c2c2b2a29282522201f1c1713100c0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232e39434b51555d60676d72797e82868b8f929897999a9b9c9c9c9c9b9a9a99989992908e8a85817c756e69625b524a40382e241b0e04000000000000000815222f3b4855626e7b8895a1aea4978a7d7164574a3e31333f4953606a74818e97a2adb9c3cecbbfb5ab9f948a7e7e8a949faba4999083786c60564c413529303c4956636f7c8996a2afbcc9c9bcafa396897c706356493d3023160a000c1925323f4c5865727f8b98a5b2becbc0b3a69a8d8073675a4d4034271a0d010000010e1b2734414e5a6774818d9aa7b4c0c9bcb0a396897d7063564a3d3023170a0006131f2c3945515d677784919eaab7c4d1ddd2c6b9ac9f93867a6d6053473a2d201406000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d28323a434b545c606a6f767d82878d9196989b9ea1a9a39f9d9997959792908e8d8d929da9b5c1d1c4b7ab9e9184786b5e5145382b1e120500000000000000101d2a3743505d6a7683909da9b6c3d0d1c5b8ab9e928578655b5044372b1f1205000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105090b0b0f0e0d0c0b0b0b0c090e12161b222834404b55606d7a86929facb9c5d2d5c9beb3a99a8e8174655b5044372b1f12050004111d2935404b556b7884919eabb7c4d1c7baaea398877a6d6054473a2d211407000000000000000003101c28343f4a546b7884919eabb7c4c0b3a6998d8073665a4d4033271a0d00000000000000000000000000000b17232e3845525d6874818d9aa4ac9f92867a6d6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6e7b88949fabb7c4d0cbc0b5ab9e9285796d6053473d3220170d000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecdc0b4a79a8d8174675a4e4134272525252525252526262627272727282828292929292a2a2a2b2b2726231f19120b0200000000000000000000000000020b17212a36414c56616c74818e96a1aba0968d81746b61564c41353030303030313e4b5864717e8b97a4b1becabfb2a5998c7f7266594c3f3636373839382f2e2b26201810060000000000000000000000071119232b343c444c525960656c70767a7f828587898b8c8d8d8d8c8b8a898784807d79726d6660606c7985929facb8c5d2c6b9ac9f93877a6e6154473b2e21140800000000000000000000000000000000000000000000000000000000000000000000060b0f13191e2022272b2d2f313335363738383938373634322f2d2b28221f1c18120e09030000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b555c60676d72797f858b8f92999c9fa3aaa5a5a4a3a3a4a5a8a7a6a6aba39f9d9b97928d88827b726d645c524a40362d20160c020000000000000815222f3b4855626e7b8895a1aea3978a7d7064574a3d313744505b656f7c87939fa9b3becbd3c7bbaea3998f827676828f99a3ab9f958b7e71685e52463d2f303c4956636f7c8996a2afbcc9c9bcafa396897c706356493d3023160a000c1925323f4c5865727f8b98a5b2becbc0b3a69a8d8073675a4d4034271a0d010000010e1b2734414e5a6774818d9aa7b4c0c9bcb0a396897d7063564a3d3023170a000714202d3a4753606d7a8696a0acb8c5d2ddd1c4b7aa9e918477675d5145392c20130600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b1620283139424a50585f626c70767b8084888b8f929796989b9c9e9fa2a19e9d9b9a9a9da4aeb9c5d1c4b7ab9e9184786b5e5145382b1e1205000000000000000f1b2835424e5b6875818e9ba8b4c1ced2c5b9ac9f9286796c605346392d201306000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c111517181c1b191818181718191a1e21272c343d45515c67717e8b99a3aebbc7d3d0c7b9ada1978a7d706353493f33271b0f0300010d18242f43505d6a7683909da9b6c3d0cbbfb4aa95887b6f6255483c2f221509000000000000000006121f2c3844505c667885929fabb8c5c0b3a6998d8073665a4d4033271a0d000000000000000000000000000006111c2935414c56626e7b87939faca3988b7f7265585f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5c6673808d9aa6b0bcc7d3c7bbafa3998d8073675c5145382c1f1305000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecdc0b4a79a8d8174675a4e41343232323232323232323333333434343435353536363636373737373433302b241c140b0100000000000000000000000000060f1925303a44505a606d7984919aa4a89d928a7d70685d52453d3027232325313e4b5864717e8b97a4b1becabfb2a5998c7f7266594c3f332a2a2b2c2b22211f1b150e060000000000000000000000050e19232b353d464e565d616b70787d82868b8f9297969899999a9a9998979695908d89857f79716d66667784909daab7c3d0c8bbafa49a8a7d7164574a3e312417060000000000000000000000000000000000000000000000000000000000000000020a11171b1f252a2d2d3337393b3e40414344454545454443413e3c3938332d2c28231d1a140e0903000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c676d72797f858c92979c9fa3a9a19e9c999897969697999b9ea1a8acafacaaa9a29f9a938f857f746e645c52483f32281e13080000000000000815222f3b4855626e7b8895a1aea3968a7d7063574a3d35414c55606c7883909aa4afbcc5d0c9bdb2a89f92877b6e6f7c87929fa9a79e92857a6d61584e41382d3c4956636f7c8996a2afbcc9c9bcafa396897c706356493d3023160a000c1925323f4c5865727f8b98a5b2becbc0b3a69a8d8073675a4d4034271a0d010000010e1b2834414e5b6774818e9aa7b4c1c9bcb0a396897d7063564a3d3023170a000815222f3b4855626e7b8895a8b2bdc8d4dbcec1b5a89b8e827568554b4035291d11040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040e161f2730383f444e535a6164696e73787b7e828587898c8e8f919298959698999a9b9ea5afbac6d1c4b7ab9e9184786b5e5145382b1e1205000000000000000d1a2633404d596673808c99a6b3bfced3c7baaea399877a6e6154473b2e21140800000000000000000000000000000000000306070b08070502000000000000000000000000000000000000000000000000000000000911181d212425282726252524242526262a2d32383f464f59606d7984919eabb5bfcbd2c7beb2a89e9185796d6053473a2d22170b000000071c2936424f5c6975828f9ca8b5c2d0d0bdb0a3968a7d7063574a3d3024170900000000000000000713202d3a4653606d7986939facb9c6c0b3a6998d8073665a4d4033271a0d0000000000000000000000000000000d19242f3a47535f6975828f9ca7aa9d9084776a6054525252525252525252525252525253606d7985929eabb8c2cdd2c5b9ac9f92867b6e61554b4034291c1004000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecdc0b4a79a8d8174675a4e413f3f3f3f3f3f3f3f3f3f3f4040404141414142424243434343444444403f3c362e261c1208000000000000000000000000000008131e29323e45515d676f7d88939fa8a49e91847a6d60594f43392e231825313e4b5864717e8b97a4b1becabfb2a5998c7f7266594c3f33261e1e1f1f1515120f0a040000000000000000000000020b17202b353d474f5860686d757d838a8f92999b9ea1a9a4a6a6a7a7a6a5a4a7a09d9a97918b847e786e6975828e9ba8b5c1ceccc0b6ac998c7f7366594c402e23170c00000000000000000000000000000000000000000000000000000000000003090b141b22272b3036393a3f4446484b4d4e505151525251504f4e4b4846443f3a38342e2a251f1a140d07010000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d797f858c92979ea1a9a19e9a97928f8c8b8a8a8a8a8c8e91969b9fa3abb1b3adaba59e98928b80746e645a50443a3024190d0000000000000815222f3b4855626e7b8895a1aea3968a7d7063574a3d3945515d67717e8b959facb6c0cecec6b9aca1968d80736a6a74808d97a1ada1978e81746a6053493f333c4956636f7c8996a2afbcc9c9bcafa396897c706356493d3023160a000c1925323f4c5865727f8b98a5b2becbc0b3a69a8d8073675a4d4034271a0d010000020f1b2835424e5b6875818e9ba8b4c1c9bcafa396897c706356493d3023160a000a1724303d4a5763707d8a96a3b0bdced9dacdc0b3a79a8d8074675a4d412f24180d01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d151e262e343c43475055575f6166696e7275787a7d7f8183848587888a8b8c8d8e939eaab6c2d1c4b7ab9e9184786b5e5145382b1e1205000000000000000b1724313e4a5764717e8a97a8b2bdc8d4cbbfb4ab95897c6f6256493c2f231608000000000000000000000000000000060c101213181514120e09020000000000000000000000000000000000000000000000000009121b22292e313235343332313131323331363a3d44485158616b727f8c96a1adbdc6d1ccc0b6aca0968b7f72675c5145382c1b11060000000d1a2733404d5a6673808d99aab4bfcbcbbeb2a5988b7f7265584c3f30251a0e02000000000000000815222f3b4855626e7b8899a4afbbc7c0b3a6998d8073665a4d4033271a0d00000000000000000000000000000008131e2b37424d5763707d8995a0aca095897c6f62554b4146464646464646464646424d5764717d8a97a1adb9c6d4c8bcb1a79b8e8275695e5243392f23180c00000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecdc0b4a79a8d8174675a4e4b4b4b4b4b4b4b4b4b4c4c4c4d4d4d4d4e4e4e4f4f4f4f5050505051514d4c4740382e24190e0300000000000000000000000000020d17202935414b55606b74808d96a1aca1978e81746b60554b4034281d25313e4b5864717e8b97a4b1becabfb2a5998c7f7266594c3f33261912121209080603000000000000000000000000000a141d29323d474f59606a6f7a818990959c9fa3ababadb3b0aba9aca49f9e9f9fa4aca9a19e96918b837b7173808d99a6b3c0ccd2c1b5a89b8e827568544a3f34281c100300000000000000000000000000000000000000000000000000000000050d141a1d262d33373a4146474950535557595b5c5e5e5f5f5e5d5c5b585553504a4645403936302a251f18130c0400000000000000000000000000000000000000000000000000000000000000000000000e1b2734414e5a6774808c92979ea1a9a29f97928d888582807e7e7d7d7e7f8184898e92999fa7afbab8afaaa29f928d80736c62564c4135291d120700000000000815222f3b4855626e7b8895a1aea396897d7063564a3d424e57606d7a85919ea7b1bec7d0c6bcb0a69e9184796d60606d7a85919ea7a99f93877c6f655b50443a3c4956636f7c8996a2afbcc9c9bcafa396897c706356493d3023160a000c1925323f4c5865727f8b98a5b2becbc0b3a69a8d8073675a4d4034271a06000000020f1c2835424f5b6875828e9ba8b5c1c8bcafa295897c6f6256493c2f231609000c1825323f4b5865727e8b98a5b1becbd8d9ccbfb3a6998c807366594d4033261a070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c262f383f44464444494d5355575f616568686e7072747677797a7b7d7e7f80818e9ba8b4c1cec4b7ab9e9184786b5e5145382b1e1205000000000000000814212e3b4754616e7b8796a0acb9c5d2d1beb1a4978b7e7164584b3e3025190d01000000000000000000000000030a11171c1f202421201e1a140d05000000000000000000000000000000000000000000000006111b242d343a3d3e4241403f3e3e3e3f3f404246484f545b626a707d87929fa8b2bdcfcac1bbafa49a9184796d60554b4034291c0a000000000a1723303d4a5663707d8998a3aebac7cec1b4a79b8e817468574d42362a1e1205000000000000000b1824313e4b5764717e8a97abb5c0ccc0b3a6998d8073665a4d4033271a0d000000000000000000000000000000010e1a26313c4854606b7784919da9a79a8e8174675d51453939393939393939393a46535e6976828f9ca9b3bec9d1c4b8aca095897c6f63574d4231271d120700000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecdc0b4a79a8d8174675a58585858585858585858585959595a5a5a5a5b5b5b5c5c5c5c5d5d5d5e5e5a58524a40362b1f13070000000000000000000000000000050e18242f3a434f59606d7984919ea5a99f93887d70675c51453c2f2625313e4b5864717e8b97a4b1becabfb2a5998c7f7266594c3f3326190c06050000000000000000000000000000000006111c262f3b444f59606b707c848e939da0a7acafb5b8b1aca69f9c979a939292939a979b9fa2a19e9590857e747f8c98a5b2bfcbd0c3b7aa9d908477665c5044382c1f1206000000000000000000000000000000000000000000000000000000060f171f252a2f383f44464c5254535b6062646668696a6b6b6c6b6a69676562605b5453514b46423b363129241d160d07000000000000000000000000000000000000000000000000000000000000000000000e1b2835414e5b6874818e9ba1a9a69f97928c85807c78757372717070717275787c818790959ea5afb9bcb3aea49d928b7e71685d5245392e23180c00000000000815222f3b4855626e7b8895a1aea396897c706356493d47535f6a73808d97a1adb9c2d0cabfb4aa9e948a7d70675d5d68717e8b959faba4999083786c60554b413c4956636f7c8996a2afbcc9c9bcafa396897c706356493d3023160a000c1925323f4c5865727f8b98a5b2becbc0b3a69a8d8073675a4d402e23170b000000030f1c2936424f5c6975828f9ca8b5c2c8bbaea195887b6e6255483b2f221508000d1a2633404d596673808c99a6b3bfccd9d8cbbfb2a5988c7f7265594c3f3226190c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222d38424a5053504a424246484d535558565e61636568696b686d6f70717274798693a0adb9c6c4b7ab9e9184786b5e5145382b1e1205000000000000000714202d3a46525e697784919eaab7c3cecdc0b3a79a8d807467564c4135291d11050000000000000000000000030c151c23282c2d312e2d2a251f170f05000000000000000000000000000000000000000000010c18222d363f454a4b4f4e4c4b4b4b4a4b4c4d4d53555960636d727c869299a3afbac4cac0b8afa59f93887d70665c5143392f23180c000000000714202d3a4753606d7986929facb8c5d1c4b7aa9e918477695e52463a2d20150a00000000000005111e2a36424d576673808d99a6b3c0d2c0b3a6998d8073665a4d4033271a0d000000000000000000000000000000000915202c38444f5965727e8b97a2ac9f92857a6d6054473c31262c2c2c2c28343f4a54616e7b87939facb9c5cfcabeb3a99d9083776b6054453b301f150b0100000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecdc0b4a79a8d8174676565656565656565656565656566666667676767686868696969696a6a6a6a67645c52473c3023170b00000000000000000000000000000007131d28313d45515d67707d89939da9a49a9184796d60584e42382d22313e4b5864717e8b97a4b1becabfb2a5988c7f7265594c3f3226190c0000000000000000000000000000000000000b17222d38424c56606b707d8691969ea5acb1b9bbb7afa7a09d94908a8886858586888a8e92989fa39f97928a807e8b98a4b1becbd2c5b9ac9f9286796d6053463a2d20130700000000000000000000000000000000000000000000000000020a1117212931363e41495053565e6165656c6e717374767778787878777674716f6c6663605c54524d46423b352f281f1910090000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98aba49d948f857f79736f6a6966656463636466656c6f747b838e939ea7b1bcbebaaea49e92857a6d60554b4034281c1004000000000815222f3b4855626e7b8895a1aea296897c6f63564943505a626e7b87929fa9b3becbd3c7baaea2988f82756c615556606c78839099a4ab9f958b7e71675d51453c4956636f7c8996a2afbcc9c9bcafa296897c6f6356493c30231609000c1925323f4c5865727f8b98a5b2becbc1b4a79b8e817468544a3f34281c1003000004101d2a3743505d6a7683909da9b6c3cabeb3aa94877a6e6154473b2e211408000d1a2734404d5a6773808d9aa6b3c0cdd9d7cbbeb1a4988b7e7165584b3e3225180b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a545b605b545249403c4246484b4d525456595b5c565d61626365666e7a8794a1adbac7c4b7aa9e9184776b5e5144382b1e11050000000000000005111e2a36424d566773808d9aa7b1bcc8d0c3b6a99d908376685e5246392d20150a00000000000000000000000a151e262e34383a3e3b3a36302921170d02000000000000000000000000000000000000000005111d29343f485056585b5a595858575758595a575f61656b6f767f879298a2abb5c0c5beb9aea59e938c7f736b61544a4031271d12070000000006131f2c3845515c6776828f9cabb5c0cbc5b9aca096877b6e6154483c31261a0b0200000000000714202d3a46525e697683909da9b6c3ccc0b3a6998d8073665a4d4033271a0d0000000000000000000000000000000003101c27333d4753606d7985929faba2988b7e7165584e43372b1d1f1f1f2b3844505c6673808c9aa4afbbc8d2c6b9ada2978b7e7165594f4433291f0d030000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecdc0b4a79a8d81747272727272727272727272727272727373737474747475757576767676777777736e64584c3f3326190d000000000000000000000000000000010c161f2935404b55606b74818e97a1aca0968c80736a5f544a3f3328313e4b5864717e8b97a4b1becabfb2a5988c7f7265594c3f3226190c0000000000000000000000000000000000030f1c28333f4a545e68707d869298a1a8afb8bcc1b7afa59d959088837e7b7a7878797b7e81868c9298a1a29f928d85929eabb8c5d1d3c7baaea399887b6e6255483b2f221508000000000000000000000000000000000000000000000000020b141b2227333b42464f535b6063686d7175797b7e80818384848585848382817e7b7974706d66615e57534d45403a312b221b120900000000000000000000000000000000000000000000000000000000000000000915222f3c4855626f7b8899a39c928d827b726d67626058595857575757535b6062696e78818e959fabb8c3c0b9ada1978d8074675c5145382c1f1306000000000815222f3b4855626e7b8895a1aea295897c6f6256494b55616c76828f99a3aebbc4cfc8bdb2a89f92867b6e615a50505b656f7c87939fa9a79e91857a6d60574d424956636f7c8996a2afbcc9c9bcafa296897c6f6356493c30231609000c1925323f4c5865727f8b98a5b2becbc2b6a99c8f8376665c5044382b1f150b030005121e2b37424d576b7884919eabb7c4c6baaea298867a6d6053473a2d201407000e1b2734414e5a6774818d9aa7b4c0cddad7cabdb0a4978a7d7164574a3e3124170b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505b666c66635b52463d373a3b3f4146474a4c4e504c5254555758626f7b8895a2aebbc8c3b6a99d9083766a5d5043372a1d100400000000000000020e1925303c4955626f7c8895a0acb8c4cec5b9ac9f92867a6d6154473c32261b0e0400000000000000000107111c2630383f44464b4846423b33291f140900000000000000000000000000000000000000000915212e3a45505a62656867666564646465666768696e71767c828b9299a2aab4bdc0bbb3ada49d938f81776c60594f42392e1f150b010000000004101c2934404b5566727f8c99a3afbbc7c9bdb2a8978b7e7164584e43372b1d140a00000000061018212e3b4754616e7b87939facb9c6ccc0b3a6998d8073665a4d4033271a0d00000000000000000000000000000000000b161f2c3945515d6773808d99a3aa9d9083766a5f5347392f231813202d3a4653606d7984919eacb6c0cccbc0b5ab9e9285796d6053473d3220170d000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecfc3b6a99c90827e7e7e7e7e7e7e7e7e7e7e7e7e7f7f7f80808080818181828282828383838384848073675a4d4034271a0d01000000000000000000000000000000040d18242f3a434f59606d7a85919ea5a89f92877c6f665b50443b31313e4b5864717e8b97a4b1becabfb2a5988c7f7265594c3f3226190c00000000000000000000000000000000020c16202b3844505b666e7a859198a2aab2bac1c3b9afa59d938e837c76716e6d67666d6e71757a80869197a0a49d979297a2adb9c6d2d7cbbfb4ab968a7d7063574a3d3024170a0000000000000000000000000000000000000000000000020b141d262d333e454d535961656c70757a7e8285888a8c8e8f9191929291908f8e8b8885817d79736e69615e57514b433d342d241b1108000000000000000000000000000000000000000000000000000000000000000613202d394653606c7986929f928d80776e69605d55544e4d4b4b4a4a4b495053575f666d7983909da7b1bcc8beb3a99f9285796d6053463a2d201307000000000815222f3b4855626e7b8895a1aea295897c6f625649515c67707d8a949fabb5bfcdcec5b8aca0968c7f73695f53474953606a74818d97a2ada1978d8073695f53474956636f7c8996a2afbcc9c9bcafa296897c6f6356493c30231609000c1925323f4c5865727f8b98a5b2becbc5b8ab9e9285796d6053463d30271d150c070714212d3a46535f697985929facb8c5c5b8ab9f928578675d5145392c201306000e1b2835414e5b6874818e9ba7b4c1cedad6c9bcb0a396897d7063564a3d3023170a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b55606c78736e63584e43392f2e3036393b3d3f4143414647484a56636f7c8996a2afbcc9c2b5a89b8f8275685c4f4235291c0f0200000000000000000915222e3b47545f6a7783909da8b2bdc9c7bbafa3998b7e7165584e43372b20160c04000000000000040c1218232e38424a50535754524d453b30251a0e02000000000000000000000000000000000000000b1724313d4a56626c717574737271717172727375787b7e83898f949fa3abb4bcbab6afa9a29e928d81796d655b50473e30271c0d030000000000000c18232f3b4855616e7b87929facb6c0ccc2b6a99c8f83766a5f53473c2f261c110a0604070e18222c38444f5965727e8b9aa4afbbc8ccc0b3a6998d8073665a4d4033271a0d000000000000000000000000000000000004101d2935404b55616e7b87929fac9f95887c6f62554b4034291c1e2a36414d5663707d8a96a1adbec7d2c7bbafa3998d8073675d5145382c1f1305000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1ced0c4b7ab9f94908b8b8b8b8b8b8b8b8b8b8b8b8b8b8c8c8c8d8d8d8d8e8e8e8f8f8f8f909090919184776b5e5144382b1e11050000000000000000000000000000000007131d28313d45525d68717e8a939ea9a3999083786c60574d4236313e4b5864717e8b97a4b1becabfb2a5988c7f7265594c3f3226190c0000000000000000000000000000000008131e2a36424d57606c78828f97a1aab4bcc4c7bdb1a79e938e81796f6a6462605c5c606264686d737c859095a0a9a29ea2a9b3becad6dcd1bdb1a4978a7e7164574b3e3124180b00000000000000000000000000000000000000000000000a141d262f383f4450575e616b70787d82868b8f929897999b9c9d9e9e9f9e9d9c9a9897928e8a85807b756e69605d554e463e362d231a0f0500000000000000000000000000000000000000000000000000000000000006121f2b3844505b66788592948d80736c655e56514b4743403f3e3d3d3e3f44464d545c676f7c8995a0acb8c5c5baaea298897d7063564a3d3023170a000000000815222f3b4855626e7b8895a1aea295887c6f62554d57606d7984919ea6b0bdc6d0c5bcafa59e9184796d60574d42414e58616d7a85929ea7a99f92877b6e62594f4956636f7c8996a2afbcc9c9bcafa296897c6f6356493c30231609000c1925323f4c5865727f8b98a5b2becbc6b9ada197897d7063584e43392f271e18131315222e3b4855616e7b8898a3aebac7c3b6a99c90837669554b4035291d1004000f1c2835424f5b6875828e9ba8b5c1cedbd6c9bcb0a396897d7063564a3d3023170a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c67788480736a60554b40342d262a2d2e3032353035393a3d4a5763707d8a96a3b0bdc9c1b4a79a8e8174675b4e4134281b0e01000000000000000006131f2b37434e5864717e8b96a0acb9c1cbc0b5ab9c8f82766a5f53473d32281e160d0a070506060b0f161d2429343f4a545c6064615e574d42362a1e1205000000000000000000000000000000000000000b1825323e4b5865717e82817f7e7e7e7d7e7f808284888b90959c9fa6aeb4b7b4aeaca49f97928b80786d675d53493f352c1e150b000000000000000714212d3a46535f6975818e9aa4afbbc7c4b7ab9f94887b6e62574d42382d221b1312111318202a343c4855616b7783909dacb6c0ccccc0b3a6998d8073665a4d4033271a0d0000000000000000000000000000000000000c18242f3946535e6975828f9ca8a79a8d8074675c5145382c1f202d3946525e6875828f9ba8b2bdd0d2c5b9ac9f92877b6e61554b4035291d1004000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1ced3c7bbb0a69f9c9898989898989898989898989898989999999a9a9a9a9b9b9b9c9c9c9c9d9d9c908376695d5043362a1d100300000000000000000000000000000000010c161f2935414c56616c75818e97a2ab9f958b7f72695e53463e323e4a5764717d8a97a4b0bdcabfb2a5988c7f7265594c3f3226190c000000000000000000000000000000010d1925303a46535e69737f8c949fa9b3bcc6ccc0b5aba0958e81756d675f58555351505355565d606a6f7b839097a1adabadb3bbc5cfdbd8cbbeb1a5988b7e7265584b3f3225180c0000000000000000000000000000000000000000000006111b262f384149505a61696e767d83898f92999b9fa2aaa6a7a6a3aaa29f9fa2aaa5a9a29f9b97928d86817b736d67605850483e352b21160b000000000000000000000000000000000000000000000000000000000000030f1c28333f4a546a7784918f82786c605b534d4540393732323130302d33373c424b55606b7784909daab7c3cabeb4aa9a8d8074675a4d4134271a0e000000000815222f3b4855626e7b8895a1aea295887b6f6255535e69737f8c96a1acb8c2cfcabfb4aa9e93897d70675c51453b3c46525e68727e8b95a0aca3998f82756b61544b56636f7c8996a2afbcc9c9bcafa296897c6f6356493c30231609000c1925323f4c5865727f8b98a5b2becbc9beb3a99b8e81756a60554b42393029242020212834404b5564717e8a97aab4bfcbc0b3a79a8d8074675a4d412f24180d01000e1b2835414e5b6874818e9ba7b4c1cedad6cabdb0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7986877c6f675c51453f382f28232123262824292d323e4b5865717e8b98a4b1becabeb3aa998c807366594d4033261a0d000000000000000000030f1b26323c4653606d7884919ea6b0bbc5c7b7ab9f94887c6f62594f443a30281f1a1413111213171b1f282f353e44505c666d716e695e52463a2d20140700000000000000000000000000000000000003101d293643505c6976828e8d8c8b8b8a8a8b8c8d8e9196989d9fa7abb0b2adabaaa29f9a938e857e746c665d554b41382d231a0c030000000000000005121e2a36424d57626f7c87939facb6c0c7bbb0a69a8d8074695f544a3f332b26201f1d202329323c46515b63707d8a95a0acbec7d2ccc0b3a6998d8073665a4d4033271a0d00000000000000000000000000000000000007121d2a36424d5763707d8a96a1ab9f9285796d6053473c312627333f4953616e7b86929facb9c4cfc8bdb1a89b8f8275695e5343392f24180c00000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1ced8cdc2b8b0aba9a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a6a6a6a7a7a7a7a8a8a8a9a9a9a9a89b8f8275685c4f4235291c0f020000000000000000000000000000000000040d1924303a44505a616e7a85929fa6a79f92867b6e615a50443a3d4a5764707d8a97a3b0bdcabeb2a5988b7f7265584c3f3225190c00000000000000000000000000000005111d2935414c56616e7b86929fa6b0bbc4cec7bbafa4999083796d605c554e4847454446484c525860696e7b85929ea5afb9bec5cdd7e1d8ccbfb2a5998c7f7266594c3f3326190c000000000000000000000000000000000000000000061017222d384149535b606c717b828a90959b9fa3ababaaa8a09d9996949892929895989b9fa2a9a29f99928e8680796f6a625a50473d33271c10040000000000000000000000000000000000000000000000000000000000000b17222d43505d6a768390857b6e665b5049413b352f2b272524242422272b3039434f596875818e9ba8b4c1d0c2b5a89c8f8275695c4f4236291c0f000000000815222f3b4855626e7b8895a1aea195887b6e625559616e7b86929fa8b2bdcad3c6baaea2988e81756b60554b403335414c56606c7883909aa4ab9e948a7d70665c5156636f7c8996a2afbcc9c8bcafa295897c6f6256493c2f231609000c1925323f4c5865727f8b98a5b2becbcfc5b9ac9f93877c6f675c544a423b352f2d2d2e303945515c6774818d9aa7b4c0c8bcb1a7988b7e7165584b3e3225180700000e1b2734414e5a6774818d9aa7b4c0cddad7cabdb1a4978a7e7164574b3e3124180b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a879083796d605c504a423a342e2a25242322232b37434e586774818e9aa7b4c1c6baaea298897c6f6356493c30231609000000000000000000000a151f2c3844505c66717e8a949ea9b3bdc7bbb0a69b8e81756b60564c433a312b2621201d1f2022272b31394045515b606d787e7b6e6154483b2e211508000000000000000000000000000000000000020f1c2935424f5c6875828f9a999897979798999a9b9ea1a8a9abb1b2ada8a19e9b98928e87817a716c605b544b43392f261b11080000000000000000020e1a26313b47535f6a75828f9aa4afbbc2c2b8ac9f92867b6e665b50443f37322d2b292c2f343c444e58626d7683909da7b1bcd0d9ccc0b3a6998d8073665a4d4033271a0d000000000000000000000000000000000000010e1a25313b4653606d7984919eaba2978a7e7164574d42372b2b3744505b65727f8c99a3afbbc7d1c5b8aca095897d7063574d4231271d120700000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1ced8cdc2b9b0aba9a5a5a5a5a5a5a5a5a5a5a5a5a5a5a6a6a6a7a7a7a8a8a8a9a9a9aaaaaaaba89b8e8275685b4f4235281c0f0200000000000000000000000000000000000008131e28323e46525e68717e8b949faaa2988f82756c61564c413d4a5663707d8996a3b0bcc9beb2a5988b7f7265584c3f3225190c0000000000000000000000000000000713202d3946525e6874808d99a3aeb8c2cdcbc0b5ab9f93877c6e675d514b433c3a38383a3b41454e575e69707d8a939eaab6c2cdd7dfe9d9ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000020b182227333f49535b656c737e858f949da0a7acafaca59e9b96918c898886858586888b8f92989ea1a8a39f98928d847c716c62594f44382c201407000000000000000000000000000000000000000000000000000000000000061c2935424f5c687582897e71695e544a3f382f29241d1b18181a1e21272c3137404b556773808d9aa6b3c0cdc3b6aa9d9083776a5d5044372a1d11000000000815222f3b4855626e7b8895a1aea194887b6e6154606b75818e98a2aebac4cec8bcb1a79f92867b6e61594f43392e303a44505b666f7c87939faaa69d9184796d605656636f7c8996a2afbcc9c8bcafa295897c6f6256493c2f231609000c1925323f4c5865727f8b98a5b2becbd4c8bbafa49a9083796d665c544d45403b3a3a3b3c434c56606d7985929eabb8c5c5b8aca095887b6f6255483c2f22150900000d1a2733404d5a6673808d99a6b3c0ccd9d7cabeb1a4978b7e7164584b3e3125180b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b88958e81746e605b544c4440393630312f2f2e343c47545f6a7784919daab7c4c5b8ab9f9285796d6053463a2d2013070000000000000000000003101c28343f4a54616c75828f97a1abb5c0c2b6aa9e93897d70685e554b433d37312e2d2a2b2d2d33373d434b515a626d74818a7f7366594c403326190d000000000000000000000000000000000000020f1c2935424f5c6875828f9ba6a5a4a4a4a5a5a6a8abadb2b6b8b2a8a19e96918e8b85817c746d68625a504a423931271d140a0000000000000000000009141f2b37434e58626f7c87939fa7b1bbc5baaea3989083786c605a5147433c393835393a40454e565f6a727e8b959fabb9c3cdd9ccc0b3a6998d8073665a4d4033271a0d0000000000000000000000000000000000000009141f2b3844505c6673808c99a3a99c8f8376695f5347392e2d394653606c7884919eabb5c0cbcabfb4aa9d9184776b6054453b311f150b0100000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1ced3c7bcb0a69f9c989898989898989898989898989999999a9a9a9b9b9b9c9c9c9d9d9d9e9e9e9c908376695d5043362a1d1003000000000000000000000000000000000000020c16202a36414c56626c76828f98a2aa9e948a7e71685d52453d495663707c8996a3afbcc9beb2a5988b7f7265584c3f3225190c0000000000000000000000000000000714212e3a4754616d7a86929fabb5bfcad4c7bbafa3998e81746a5f554b4039312d2c2b2d2f353d454d56616c75818e9ba6b0bbc7d3dfe6dacdc0b3a79a8d8074675a4d4134271a0e00000000000000000000000000000000000000000a141d2a343c44505b656c77808a92989fa6acb1b1a8a19e938e8884807c7b7a79797a7b7e82868c91969fa3aaa39f9691877e716b6054483c2f2216090000000000000000000000000000000000000000000000000000000000000915222f3c4855626f7c7d716c61574d42382d261d18171c1f20262a2d32383c4347515d6775818e9ba8b4c1cec4b7ab9e9184786b5e5145382b1e12000000000815222f3b4855626e7b8895a1aea194887b6e615c66707d89939eaab4bfcccdc5b8aca0958c7f72695e52473d302728333f4a54606b74818e98a2aca0968c7f72685e56636f7c8996a2afbcc9c8bcafa295897c6f6256493c2f231609000c1925323f4c5865727f8b98a5b2becbd8ccc0b6aca0958e81786d665e56514b48464647494e555e68717e8a97a1adb9c6c0b5ab9d9083776a5f53473a2e21150800000d192633404c5966737f8c99a6b2bfccd9d8cbbeb1a5988b7e7265584b3f3225180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c8995938d80736c665e56514a46423f3d3c3c3d3f444f59626f7c8895a0acb8c5bcb1a79b8f8275665c5044382c1f120600000000000000000000000c17232e3842505a616e7b859299a4afbbc0baafa59e91847a6d675d554f47433d3a3936383a3b3f44464e555d606c727f8c8d8074675a4d4134271a0e01000000000000000000000000000000000003101c2936434f5c6976828f9ca4a3a3a3a4a5a7aaacb2b9bbc0b9ada196918a84827e7a746f6a615e5650443f382f271f150b0200000000000000000000030f1b26313c4754606a73808d959fa9b3bebfb4aa9f958c7f726c625b534e4846444045474b51585f696f7c86929fa7b1bcc7cfd9ccc0b3a6998d8073665a4d4033271a0d0000000000000000000000000000000000000003101c28343f4a54616e7b86929fac9f94887b6e61544a403435414c5663707d8996a0acbdc7d1c6baaea2988b7f7265594f4433291f0d030000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1ced0c4b7ab9f94908b8b8b8b8b8b8b8b8b8b8b8b8c8c8c8d8d8d8e8e8e8e8f8f8f909090919191929184776b5e5144382b1e110500000000000000000000000000000000000000040e1925303b44505a616e7b86929fa6a69e91857a6d60584e424956636f7c8996a2afbcc9beb2a5988b7f7265584c3f3225190c000000000000000000000000000005111e2a36414d566673808c98a2aebdc6d1d2c5b9ac9f92877b6e61584e43392f27201f1f202429333b44505a626f7c88949fabb7c4d0dde7dacdc1b4a79a8e8174675b4e4134281b0e0000000000000000000000000000000000000006111c262f3c46515b606c77818d929fa2aab0b8b1a79f96918a817c7773706e6d67676d6e72757a7f848c9298a0a7a8a09992877d7063564a3d3023170a0000000000000000000000000000000000000000000000000000000000000815212e3b47535f6a6f706b615a50453b2f261c1d2023282b2d31363a3d44484e535b606d7985929eabb8c5d0c3b6aa9d9083776a5d5044372a1d11000000000815222f3b4855626e7b8895a1aea194877b6e61606d7883909da5afbcc6d0c5bbafa59d9083786d60574d42352b1e222d38424f59616e7a85929fa7a89f92857a6e6158636f7c8996a2afbcc9c8bcafa295897c6f6256493c2f231609000c1925323f4c5865727f8b98a5b2becbcec3b9b1aca79e938e81786e69605d555553535455585f676d7a84919ea9b3bec7bbafa3998c7f7265584e43372b1f120600000b1825323e4b5865717e8b98a4b1bed0dbd8ccbfb2a5998c7f7266594c3f3326190c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a979c928d80786d68605c54524d4b4a49494a4a5057606b74818e9ba8b1bdc2b8ab9f958a7d7164544a3f34281c1003000000000000000000000006111c26303e46535e69707d87939fa3afb5bdb9aca1968f82796d676059534e494746414446474950535860676d747e87928e8174675b4e4134281b0800000000000000000000000000000000000004101d2a3743505d6a768390979796969697989b9ea0a8acafb5b7ab9e91847d7875716d67625f58524c443f332d261d150d030000000000000000000000000a15202b37434e58606d78839097a2acb6bebcb1a79f92877e726d625f585553504b5153555c606a6f7b849198a3acafb5bdc7d1ccc0b3a6998d8073665a4d4033271a0d00000000000000000000000000000000000000000b17232e3846525e6975828f9ca8a6998d8073665c5144383946525e6875818e9ba8b2bdcfd2c5b8ac9f92867a6d6054473d3321170d000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecfc3b6a99c90827f7f7f7f7f7f7f7f7f7f7f7f7f7f7f8080808181818282828383838484848585858074675a4d4134271a0e01000000000000000000000000000000000000000008141e29323e46535e69727f8b949faaa1978d81746a60544a4955626f7c8895a2afbbc8beb2a5988b7f7265584c3f3225190c00000000000000000000000000000714202d3946525e687784919daab4bfcfd8cfc2b6a99c8f8276695f53463c31271d15131213192029323e47535f6a76828f9ca9b6c2ced9e5dbcec1b5a89b8e8275685b4f4235281c0f000000000000000000000000000000000000000b17222d38424e58626d74808d939ca4aeb3bbb1a79f9590847d756f6a666361605d5d606265686d7279808690959ea5aba39a8c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000006121f2b37434e585f6263605950483e33291f24292c2e34383a3c4246484f54585f626d73808d97a1adb9c6cfc2b5a89c8f8275695c4f4236291c0f000000000815222f3b4855626e7b8895a1ada194877a6e6168727f8b95a0acb7c1cecabeb3a99d93897d6f665c50453b30231a1c262f3d46525e68727f8c95a0aca2988e81746a60636f7c8996a2afbcc9c8bcafa295897c6f6256493c2f231609000c1925323f4c5865727f8b98a5b2becbc8bcb1a7a09d9f9d938e827b736d67636160606162656a6f79828f96a1adbbc5bdb2a99f92867a6e6154473c31261b0f0300000a1623303d495663707c8996aab4bfcad6dacdc0b3a79a8d8074675a4d4134271a0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a49c928d827a726d66615e575857565556545c606a707d87929facb9c2b9afa59d9083786c605346392e23170c000000000000000000000000000a151e2a36424d57606b727f8b919fa3abb3bcb2a89f948f8279706b625f585654524c505354535b60636a6f79818a92998e8275685b4f422f24190d01000000000000000000000000000000000004111d2a3744505d6a77838b8b8a8a89898a8b8e91969b9fa4abb1ada196918a837e79716c65605851443f3830261c140b0300000000000000000000000000030f1b27323d44505c666e7b85929aa4acb5bdbbafa39992877f766f6a6562605b555d6062676d727c849196a0a39fa3abb5c0cbccc0b3a6998d8073665a4d4033271a0d000000000000000000000000000000000000000006111c2a36424d5763707d8a96a1ab9e9185796d6053463b3a4754616d7a86929facb9c4cec8bcb1a79a8e8174685d5245392c201305000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecdc0b4a79a8d81747272727272727272727272727273737374747475757576767677777778787879746e64584c3f33261a0d000000000000000000000000000000000000000000020d17202a36424d57606c77829098a3a99f93887c6f665c504855626f7b8895a2aebbc8beb1a5988b7e7265584b3f3225180c00000000000000000000000000000814212e3b4754616e7a8795a0acbcc6d0d5c9bdb2a8988b7e7265574d42342a1f150b0606080e17202b37434e5864717e8b97a7b1bcc8d4e0dacec1b4a79b8e8174685b4e4135281b0e000000000000000000000000000000000000030f1c28333f4a545f6a727f8b929da5aebabeb3a9a09590837a706b625f5856555351515355565e61676d737b838e939da4a9968a7d7063574a3d3024170a000000000000000000000000000000000000000000000000000000000000030f1b26323c464e535556544f473e362c282c2f35393a3f4446494d53555960636a6e757f8c929ca9b3becacabfb4aa9a8d8174675a4e4134271b0e000000000815222f3b4855626e7b8895a1ada094877a6d616d7a85929fa7b1bcc9d0c7baada2978e81746b60544a3f33291f11141d2a36414c56606d7883919da5aa9f93877c6f65636f7c8996a2afbcc9c8bcafa295897c6f6256493c2f231609000c1925323f4c5865727f8b98a5b2becbc5b8aca09590939a9d9490857f7974706e6d6d6e6f72767c838f949fa8b2bdc0b9ada1968e8174685e5246392a20150a0000000814212e3b4754616e7a8798a2aebac6d3dbcec2b5a89b8f8275685c4f422f24190d01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8a49c948f857e79726e6966656462626364666d727c859299a3afbbbab1a79e93897d70655b5044372b1c110600000000000000000000000000030c1a25313b454f59626d727f8b9299a2a9b0b9b0a69f948f847d756f6a6663615e565c606164656c6f757c848e939f9c8f827669564c4135291d11040000000000000000000000000000000000000915222f3c4855626f7c7e7e7d7d7c7c7d7e8184898e9399a0a7b0a8a19e95908b847e786f6a625b504a42382e2317100600000000000000000000000000000a152028343f4a545e69707e88939aa3abb3bbb5aba399928c827c76716e6c666a676d6f72797e869196a0a2999299a3afbbc7ccc0b3a6998d8073665a4d4033271a0d0000000000000000000000000000000000000000000e1a25303b4653606d7984919eaba1978a7d7064574d42434f5965727f8b98a3aebac7d1c4b8ab9f95887c6f62564c4135291d1104000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecdc0b4a79a8d81746765656565656565656565656666666767676868686969696a6a6a6b6b6b6c6c67645c52473c3024170b00000000000000000000000000000000000000000000050e1a25313b44505b656e7b86929fa7a49a9083786d60574d55626e7b8895a1aebbc8beb1a5988b7e7265584b3f3225180c00000000000000000000000000000b1824313e4b5764717e8a97a7b1bcced8d2c5b9ada196877a6e6154473b3121180d03000000050e1b26323c4754616e7b8795a0acb8c5d1dedacdc0b3a79a8d8074675a4d4134271a0e00000000000000000000000000000000000006121f2b3844505b666f7c86929fa4aeb7bfb9ada19791837a6d686159534e494847454547484c52555d60696e79818d929da197877a6d6154473a2e211407000000000000000000000000000000000000000000000000000000000000000a15202a343c4347484a48443d35292e34383a4145474a505356575f61656b6f757b828c919ba4aebbc5cfc6baaea2988a7e7164574b3e3124180b000000000815222f3b4855626e7b8895a1ada093877a6d6a74818e97a2adb9c3cec7bdb1a79f92857a6d61594f42382e20170d0b1925303b44505c66707d89939eaaa49a9083786c636f7c8996a2afbcc9c8bbafa295887c6f6255493c2f221609000c1925323f4c5865727f8b98a5b2becbc3b7aa9d908388939f9f98928c85817d7b79797a7c7f828790959fa6b0babeb6afa49e91847a6d60564c41362a180e040000000714202d3946525e687985929facb8c5d2dcd0c3b6a99d9083766a554c4135291d110400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3845525e6b7885919ea1a9a69f97918b847f7b777372706f6f707174797e869297a1abb5bab0a89f958f81756b6053493f33271b0a00000000000000000000000000000009141f29333d47515b636d727f8792979fa6adb2b0a69f969189817c7772706d686b666d6e7073787c828991969da59e918477685d5245392c2013060000000000000000000000000000000000000815212e3a47535f6a6f717171707070717274777c818791959ea6b0ada79f9d96918a837c726d605c544a3f342822180e0400000000000000000000000000040c17232e38424d57616c717f889299a1a9b0b9b5aba39f948f87837e7b797877787a7c7f858b9298a1a1979286929facb9c5ccc0b3a6998d8073665a4d4033271a0d00000000000000000000000000000000000000000009141f2b3844505c66737f8c99a3a99c8f8275695e52464854606b7784919daab4bfcbcabeb3a99d9083766a6054443a2f24190d01000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecdc0b4a79a8d8174675a5858585858585858585959595a5a5a5b5b5b5b5c5c5c5d5d5d5e5e5e5f5f5a58524a40362b1f1307000000000000000000000000000000000000000000000009141f27333f49535f69737f8c95a0aba0958c7f72695e5354616e7b8794a1aebac7beb1a5988b7e7265584b3f3225180c00000000000000000000000000010e1b2834414e5b6774818e9aa7b4c1cedad1c4b7ab9e918478685e5246392d20140600000000000a15202d3a46525e697784919daab7c4d0ddd9ccbfb3a6998c807366594d4033261a0d000000000000000000000000000000000004101c2834404b54606c78839098a3aeb6c0bcb1a79e92857b6e685e564f47433d3b3a39393a3b41464b51575f676d77808d929e918578685e5246392d20130700000000000000000000000000000000000000000000000000000000000000040e18222a32373b3c3d3c38333035394045464c5254545c606366696e72767c82878f939ba3adb6c0cdcabfb4aa9f92857a6d6053473a2d201407000000000815222f3b4855626e7b8895a1ada093877a6d6f7c87939fa9b3becbccc0b5ab9f958b7e72685e52473d30261c0e0508141e28343f4a54606b75818e98a2ac9f958b7e71676f7c8996a2afbcc9c8bbafa295887c6f6255493c2f221609000c1925323f4c5865727f8b98a5b2becbc0b3a69a8d80808d929fa29f97928e8a88868687888b8f9299a0a7b0b8bab3aca49f928a7d70685d52443b302519060000000005111e2a36414d56697683909ca9b6c3d1dcd1c4b8ab9e918478675d5145392c201306000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020f1c2935424f5c6875828b92979fa3a9a19e96918b8783807e7d7c7c7d7e81858b9298a1a9b3b4aea69f969083796d60594f41382d22170b000000000000000000000000000000030d17212b353f49515b636d727d858f949ea1a8adb0a8a19e938e88837f7c7a797878797b7d8084898f949da0a8aca096877a6d6054473a2d21140700000000000000000000000000000000000006121f2b37434e585f626564646363636465686a6f747c838f949ea6b0b1aba9a19e9590877f746d665c50443f342a20150a000000000000000000000000000006111c26303b45505a626d717e8792979ea6acb2b5afa69f9a938f8b888584848586888c91979fa2a09791857e8a97a4b0bdcac0b3a6998d8073665a4d4033271a0d00000000000000000000000000000000000000000003101c28343f4a54616e7b86929fac9f93877b6e61544a4c55636f7c8995a0acbcc6d1c6baada2978b7e7164584e4332281e130800000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecdc0b4a79a8d8174675a4e4c4c4c4c4c4c4c4c4c4c4c4d4d4d4e4e4e4f4f4f5050505151515252524d4c4740382f24190e030000000000000000000000000000000000000000000000030b17222d38414d57606d78839099a4a79f92867b6e615a54616e7a8794a1adbac7beb1a5988b7e7265584b3f3225180c0000000000000000000000000004111d2a3744505d6a7783909daab6c3d0dbcfc2b5a89c8f827569564d41362a1e1105000000000005111e2a36424d576875818e9ba8b4c1cedbd8cbbfb2a5988c7f7265594c3f3226190c000000000000000000000000000000000006131f2c3845515c66717e8b95a0aab4bfc4b8ab9f958b7e71695e564c433e37312e2d2c2c2d30353940454d555d656c74808d949084776a564c41362a1d1105000000000000000000000000000000000000000000000000000000000000000006101820262b2e2f302f2e343a41464b5153565d6064666d6f73777b7f83898f939a9ea5adb5bfc8ccc1baaea2988e8175675d5145392c201306000000000815222f3b4855626e7b8895a1ada093867a6d7883909aa4afbbc5d0c7bbafa4999083786c60564c41352b1e150a00020c17232e38424f59616e7b86929fa8a79e91847a6d6f7c8996a2afbcc9c8bbafa295887c6f6255493c2f221609000c1925323f4c5865727f8b98a5b2becbc0b3a69a8d8079808c9299a0a29e9a969a939a9495989c9fa3abb1b8b4aea9a19a938b80736c61564c4132291e140800000000020e192530404d5a6673808d99abb4bfcbd7d2c6b9ac9f93867a6d6054473a2d211407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d787f858d92999fa2a8a19e9895908d8b8a8988898b8e92979fa2aab3adaaa39f948f847a6d675d51473d2f261b110600000000000000000000000000000000050f1a232d373f49515b626b707b828b91969ea1a9acaca59e9b95908c898786858586878a8d91969c9ea6acaca69f96897c706356493d3023160a000000000000000000000000000000000000030f1b26313c464e535558585757565657585860626a6f79828f949faab4b8b2ada79f99928b80786d605b51463c32261b0f0500000000000000000000000000000a151e29333e48505a626c717d858f949ea1a8acb2b0aca49f9c9898929190919795999ea1a29f9590857c7a8794a0adbac7c0b3a6998d8073665a4d4033271a0d000000000000000000000000000000000000000000000b17232e3846525e6975828f9ca8a4998c7f73665b50515d6774818e9ba7b1bccfd2c5b8ab9f9285796d6053473c3220160c0100000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecdc0b4a79a8d8174675a4e413f3f3f3f3f3f3f3f3f40404041414142424243434344444445454546413f3c362f261d13080000000000000000000000000000000000000000000000000006111b262f3c44515c666f7c87939fa8a2988f82756c6155616d7a8794a0adbad2beb1a5988b7e7265584b3f3225180c0000000000000000000000000004101d2935404b556b7884919eabb7c4d1d9ccc0b3a6998d8073665a4d403025190e020000000000020e1a2530404d596673808c99a6b3bfccd9d8cbbeb1a5988b7e7265584b3f3225180c00000000000000000000000000000000000713202d3a4653606d7984919ea7b1bcc6bdb2a89d9083786c60564d443a312b26222020202025292f353c434b535b606d78828f8f8376695c50433025190d01000000000000000000000000000000000000000000000000000000000000000000060e151b1f21222a303940454c52545c6064686d7175797c8084888b90959c9fa4acafb7bfc7c7c0bbafa59f92867b6e61554b4035291d1004000000000815222f3b4855626e7b8895a1aca0938679717e8b959facb6c0cdc9beb3a99f93877c6f665b50443a3023190c03000006111c26303d46535e69737f8c96a1aca1978d80736f7c8996a2afbcc9c8bbafa295887c6f6255493c2f221609000c1925323f4c5865727f8b98a5b2becbc0b3a69a8d8073747f8790959da0a8aca49fa4a1a2a5a9acafb3adabaaa29f9792887f736e635a50433a2f20170d020000000000081723303d4a5663707d8999a3aebac7d3d4c8bbafa49a897c6f6356493c302316090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505c666d727a80868e92989d9fa7a7a09d999897959596979a9ea1a9adaba9a29f98928b827b6e685e554b40352b1d140a00000000000000000000000000000000000008111b252e373f49515961696e767e848c91969c9fa3abaaa7a09d999698929292939a979a9ea0a8abaaa29f9b948f897d7063564a3d3023170a000000000000000000000000000206080808070a15202a343c4347484b4b4a4a49494a4b4e545860676d79829098a2aebabdb9b1aba39f928d80746d63584e43372b21160b0000000000000000000000000000030c17212c363f48505a626b707b828b91969ea0a8aaacafaca9aaa29f9e9d9ea1a9aba39f97928b837b6f7a8794a0adbac7c0b3a6998d8073665a4d4033271a0d0000000000000000000000000000000000000000000006111c2a36424d5763707d8a96a1ab9e9184786c605354606d7a85929facb8c3cec7bbb0a69a8d8074675d5145382c1f13040000000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecdc0b4a79a8d8174675a4e41343232323232323233333334343435353536363637373738383839393433302b241d140b0100000000000000000000000000000000000000000000000000000a141d2834404a54606a74808d96a1aa9e948a7e71675d606d7a8693a0b5c0ccbeb1a5988b7e7265584b3f3225180c0000000000000000000000000006131f2c3945515d677985929facb8c5d2d8cbbeb1a5988b7e7265584b3f3225180800000000000000091825313e4b5864717e8b97a4b1becad7d7ccc0b5ab978a7e7164574b3e3124180b0000000000000000000000000000000005111e2a36414c5664717e8b97a1adb9c3c5b9aca196897d70665b50443b32281f1b1514131314191d242931394149505c666d7a858f8275685c4f4235291c080000000000000000000000000000000000000000000000000000000000000000000000040a121b242c343c434b51565d61666d71767a7e8185898d9095989d9fa7acafb6bec1cac3beb6afa59e938b7f72695f5343392f24180d01000000000815222f3b4855626e7b8895a1afa49a86797a85919ea7b1bec7cfc7b9ada1978d81746a60544a3f32291e1107000000000a151e2a36424d57606d7984919ea7a99f92867b6f7c8996a2afbcc9c8bbafa295887c6f6255493c2f221609000c1925323f4c5865727f8b98a5b2becbc0b3a69a8d80736d727c838b91959a9ea1a8a6a7a7a8a7a6a5a9a29f9b98928c857e726d635c52473e31281e0e050000000000000714202d3a4753606d7986929facb9c5d0d8ccc0b6ac988b7f7265584c3f31261a0e0200000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000003101c28343f4a545c60686d737b81858b9095989b9ea1a9a5a3a2a2a3a4a7a7a6a9a29f9c97928d867f776e695e564c43392f23190b020000000000000000000000000000000000000009131c252e373f474f575e616c71797f848a8f92999b9ea0a8a4a5aaa39f9e9e9fa4aca6a4a8a19e9a98928e88827d706b6054483c2f221609000000000000000000000003090f1214151514120e18222a31373a3c3e3e3e3d3d3d3e3f43474e555d676e7b86929fa7b1bcc2bdb5aea49d928c7f726a5f53473d33271c10000000000000000000000000000000050f1a242d363f48505960696e767e848b91969a9ea0a8a5a7a8a9a9a8a6aba39f9c99928d857f786e6d7a8794a0adbac7c0b3a6998d8073665a4d4033271a0d00000000000000000000000000000000000000000000000e1a25303b4653606c7884919eaba196897d7063565865727e8b98a2aebac6d0c3b7ab9f94887b6e62554b4035291d10040000000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecdc0b4a79a8d8174675a4e4134272525252525262626272727282828282929292a2a2a2b2b2b2c2c2726241f19130b02000000000000000000000000000000000000000000000000000000020b18232e39424e58606d7984919ea5a69e9184796d60606d798699a4afbbc7beb1a4988b7e7165584b3e3225180b000000000000000000000000000714202d3a4753606d7a8698a2aebac7d3d7cabeb1a4978b7e7164584b3e3125180b000000000000000a1724313d4a5764707d8a97a3b0bdcad6d4c7bbafa499887c6f6255493c2f221609000000000000000000000000000000000714202d3946525e687783909da9b2becbc4b7ab9e9184786c60544a3f322920160d0a070606080d12181f272f383f4a545e68727f8a8174675b4e4134281b0e010000000000000000000000000000000000000000000000000000000000000000000008111b242d363e464e555c60686d73797e82868a8e9297999da0a7a9abb1b9bbc0c7c5bebab2aca49f938e81776c60574d4231281d120700000000000815222f3b4855626e7b8895a1ac9f938679808d97a1adb9c2d0c7bdb0a69e92857a6d60584e42382d20170d0000000000030c1a25313b45515c67717e8a959faca3998f82757c8996a2afbcc9c8bbafa295887c6f6255493c2f221609000c1925323f4c5865727f8b98a5b2becbc0b3a69a8d8073676a6f787e84898e919697999a9b9b9a99989797928f8b857f7a716c625b524a40352c1f160c0000000000000006131f2c3845515d6776828f9caab4becad6d2c1b4a79a8e817467574d42362a1e120500000000000000000000000000000000000000000000000000000000010406070e0b0b09050100000000000000000000000000000000000b17232e38424a50565d60696e747a7e83888c8f919797999a9a9b9c9c9b9a999897928f8b85807b726c655e564d443a31281d11080000000000000000000000000000000000000000010a131c252d353d454d525a62676d72797d82868a8e91969698999b9b9c9c9c9c9b9a9a989696918d8a86817c76706b61594f44382c20140700000000000000000000060e151a1f212222211e1a141820262b2e2f3231313030303132373c434b555e69727f8c95a0acb8c6c6bfbbaea59f93877c6f62594f44382c1d120700000000000000000000000000000008111b242d363f474f575e616c71797f84898d919697999b9b9c9c9b999899928f8b86807a726d666d7a8794a0adbac7c0b3a6998d8073665a4d4033271a0d000000000000000000000000000000000000000000000009141f2b3844505b66737f8c99a3a89b8e8275685e5f6a7783909daab4bfcac9beb2a99c8f8276695f5343392f24180c000000000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecdc0b4a79a8d8174675a4e4134271b191919191919191a1a1a1b1b1b1c1c1c1d1d1d1e1e1e1f1f1f1a1a17130e0801000000000000000000000000000000000000000000000000000000000007121c27303d45515d67707d8a939ea9a1968d80746a60667986939facb9c6beb1a4988b7e7165584b3e3225180b000000000000000000000000000814212e3b4754616e7a8794aab4bfcad6d6cabdb0a3978a7d7064574a3d3124170a000000000000000a1723303d4a5663707d8996a3b0bcc9d6d2c6b9ac9f93867a6d6053473a2d201407000000000000000000000000000000000814212e3b4754616e7a87959fabbbc4cabeb3a9998c8073655b5042382d20170e09090909090909070d151d262e38424c56606c777e7c6f6255493c2f22160900000000000000000000000000000000000000000000000000000000000000000000050e1a232d363e4850585f676d727a80858a8f92999b9fa2a9aaacb1b6b8bcc2c8c5beb9b3aea8a09a938d81786d655b50453c311f160c0100000000000815222f3b4855626e7b8895a1ac9f92867b87929fa9b3becbcbc0b5ab9f948b7e71685d52463d2f261c0e0500000000000009141f2934404b55616c7683909aa4ab9e94897d7c8996a2afbcc9c8bbaea295887b6f6255483c2f221509000c1925323f4c5865727f8b98a5b2becbc0b3a69a8d80736760666c71777c8184888a8c8d8e8e8e8d8c8b8985827f7a736d67615a514940382e231a0d040000000000000004101d2935404b5564717e8a98a2aebac7d2d0c4b7aa9d918477695f53463a2d211408000000000000000000000000000000000000000000000000000001080d1113141b181715110c060000000000000000000000000000000006111c2630383f444c52575f61676d71767b7f8285888a8c8d8e8f908f8e8d8d8b8885827e79736e69605b534d443b32291f160c00000000000000000000000000000000000000000000010a131b232c333b424650555c60666d70767a7e818487898b8c8e8f8f908f8f8e8e8d8b898784817d79756f6a6361594f473d33271c1004000000000000000000060f1820262b2e2f2e2d2a261f18151b1f212225252424232324272b313a434d57606d7883909dabb4bfcbcbc0bbafa4998f82766b605448392e23180c0000000000000000000000000000000009121b242d353d454d525a61666d72777c8184888a8c8e8f8f8f8e8d8b8a86827e7a746d6860616d7a8794a0adbac7c0b3a6998d8073665a4d4033271a0d0000000000000000000000000000000000000000000000030f1c28333f4a54616e7b86929fac9f92867a6d61626f7c88959fabbcc6d0c6b9ada1978a7d7164574d4231271d1207000000000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecdc0b4a79a8d8174675a4e4134271b0e0c0c0c0c0c0d0d0d0e0e0e0f0f0f101010111111121212130e0d0b070300000000000000000000000000000000000000000000000000000000000000000b151e2935404b55616b75818e97a2a99f93877c6f666c7985929facb8c5beb1a4988b7e7165584b3e3225180b000000000000000000000000000714202d3a4753606d7a8698a2aebac6d3d6c9bcb0a396897d7063564a3d3023170a000000000000000a1724313d4a5764707d8a97a3b0bdcad6d1c4b7aa9e918477675d5145382c1f1306000000000000000000000000000000000b1824313e4b5764717e8a97a7b1bccdc6b9ada297887b6e6253493f2f261c161616161616161616161616141c26303a44505b656c716f6a5f53473b2e211508000000000000000000000000000000000000000000000000000000000000000000020c16202c353e48505a616a6f797f858d92979c9fa3ababadb3b7b8bcc3c4c5c2bbb7b3adaaa29f96918880776d665c53493f332a1f0d040000000000000815222f3b4855626e7b8895a1ac9f9286828f99a3aebbc4cfc7bbafa3999083786c60564c41342b1d140a00000000000000030c18232f3943505a626f7c87939faaa69d91837d8996a3afbcc9c8bbafa295887c6f6255493c2f221609000c1925323f4c5865727f8b98a5b2becbc0b3a69a8d807367545b60646b7074787b7d7f80818281807f7e7c7975726d68605d5550483f372e261c11080000000000000000000c18242f3a4753606d7985929facb6c0ccd1c5b8aca096887b6e6155483b3025190e00000000000000000000000000000000000000000000000000040c13191d2021282524211d181109000000000000000000000000000000000a141e262e343a41454d53555d60656a6f7275787b7e7f80818283828181807e7b7976726d67615f575049413b322920170d0400000000000000000000000000000000000000000000000109111a212930363e434b51545c6064686d7175777a7d7e808182828383828281807e7c7a7874706d67625f58554f473e352b21160b000000000000000000030e18212a31373a3b3b3a36312a211910121515181817171616171b1f28313b44505c66727e8b99a3aebac7d3ccc0b5ab9f94897d7063544b4034281c10040000000000000000000000000000000009121b232b333b424650545c60656b6f74777b7d7f8182838381807f7d7a75716d68615e56616d7a8794a0adbac7c0b3a6998d8073665a4d4033271a0d0000000000000000000000000000000000000000000000000b17222d3846525e6975828f9ba8a3998c7f72656774818d9aa7b1bccecbc0b5ab9e9184796d6053463c3120150b01000000000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecdc0b4a79a8d8174675a4e4134271b0e01000000000000010101020202030303040404050505060601000000000000000000000000000000000000000000000000000000000000000000000000030c18242f3a434f59616d7a85929fa6a4999083786d6c7885929fabb8c5beb1a4988b7e7165584b3e3225180b0000000000000000000000000006131f2c3945515d677985929facb8c5d2d6c9bdb0a3968a7d7063574a3d3024170a000000000000000b1825323e4b5865717e8b98a4b1becbd7cec2b5a89b8f827568554b4035291d100400000000000000000000000000000006121e2b37424e576874818e9ba7b4c1cdc5b8ab9e9285786a5f5341382d222222222222222222222222222222222227333f49535b6064625f584e43372b1f130600000000000000000000000000000000000000000000000000000000000000000008131e28323e47505a626c717c838c92979ea1a9acafb5b8babec3c5c4c3bdb8b7b0aba9a19e98928c847d746c655c544a41382d21180e000000000000000915222f3c4855626f7b8895a2aea298928f949fabb5bfcdc9bdb2a99f92877c6f655b50443a3022190b02000000000000000007121d27313e4754606a75818e98a2aca0958f828f9ba8b5c2cec8bbafa295887c6f6255493c2f221609000c1925323f4c5865727f8b98a5b2becbc0b3a69a8d8073675a505359606367696e7073747475747372716f6d6665615e56514b433e362d251c140a0000000000000000000007131f2c3945515d6774818e9aa4afbbc8d4c8bdb2a8988b7f7265564c41362a1c11060000000000000000000000000000000000000000000000040d161e24292c2d3532312e29221b1209000000000000000000000000000000020c141c23282f353b42464b5153585f626568696e71727374757676757473716e6c6565605d55534d443f382f2920170e050000000000000000000000000000000000000000000000000000080f171f252a313940454a5053565d606468686d707173747576767675757473716f6d686763605d55534e48443e352c231a0f050000000000000000000915202a333c4347484846423b332b22190b08090b0b0b0a0a0a0a0d161f28343f4a54616d7a86929facb9c5d2d2c7bdb0a69b8e8174665c5145382c1f13060000000000000000000000000000000000091119212930363e424b515359606367696e707274757676757372706d6864615d565254616d7a8794a0adbac7c0b3a6998d8073665a4d4033271a0d00000000000000000000000000000000000000000000000006111c2a36424d5763707d8a96a1ab9d9184776b6d7985929fabb8c3cdc7bbafa3998c8073665c5044382c1f120300000000000000000000000000000000000000000000020f1c2835424f5b6875828e9ba8b5c1cecdc0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007131d28313e46525e68717e8b949faaa0958b7f72697885929eabb8c5beb1a4988b7e7165584b3e3225180b0000000000000000000000000004101d2935404b556b7784919eaab7c4d1d7cabdb0a4978a7d7164574a3e3124170b000000000000000c1926333f4c5966727f8c99a5b2bfccd7cbbfb5ab998c807366594d402f24180c000000000000000000000000000000000814212e3a47535f6a7884919eabb8c4cfc2b6a99c8f837669584e432f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2d38414950535755534e463c32261b0c050000000000000000000000000000000000000000000000000000000000000000010d1925303a44505a626c717e8691959fa2a9adb3b9bbc0c5c6c5c2bcb8b6b2acaaa69f9c97928c858079706b605b534a42382f261b0f06000000000000000916222f3c4955626f7c8895a2b4aaa29f9c9fa6b0bdc6cfc6b9ada1968d80736a5f53493f32281e1007000000000000000000010b151f2b37434e58616e7b86929fa9a89e938f939eaab6c3cfc8bbafa295887c6f6255493c2f221609000c1925323f4c5865727f8b98a5b2becbc0b3a69a8d8073675a4d464f5456575f6164666768686766656462605c5454524c45413a312c241b130a010000000000000000000004101d2935404b55626f7c87939facb9c1cecec2b5a89c8f8275685e5246382d22170b00000000000000000000000000000000000000000000020b161f282f35393a413e3d3a342d241b1106000000000000000000000000000000020a11171e242931363a4045474e535559575f61646667676869696867666562605b5353514b46423b332d261d170e0500000000000000000000000000000000000000000000000000000000050d141a1f272f34383f44464c525457565d616365666868696969696867676563615e565753514b47433c38332c231a1108000000000000000000020f1a26313c464e535555534d453d342b1d140a0000000000000000040d17232e3846525d6875828f9ba8b5c2ced9d0c2b8ac9f9285796d6053463a2d201307000000000000000000000000000000000000070f171f252a30394045464f5456575f6164666868696968666564605d5654524c4754616d7a8794a0adbac7c0b3a6998d8073665a4d4033271a0d000000000000000000000000000000000000000000000000000e1a25303b4653606c7884919eaba096897c6f717e8b97a2adbac6d2c5b9ac9f92877b6e61544a3f34281c100300000000000000000000000000000000000000000000020f1c2935424f5c6875828f9ba8b5c2cecdc0b4a79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f2a36414c56626c76828f98a2a79f92867b6e7884919eabb7c4beb1a4978b7e7164584b3e3125180b00000000000000000000000000000c18242f43505d697683909ca9b6c3cfd7cabdb1a4978a7e7164574b3e3124180b00000000000004111d2935414c566875818e9ba8b4c1ced3c7bbaea3998a7d7164574a3e31241707000000000000000000000000000000000815222f3b4855626e7b8896a1adb9c5cdc0b3a69a8d8073675a4d403c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3f44464b4947433c342e261e170f050000000000000000000000000000000000000000000000000000000000000005111d2a36414c56616c717e889298a0a7adb3b9bec5c7c5bfbab8b5b1abaaa8a09d9994908b857f7a736d6760595049413830261d140a00000000000000000916232f3c4956626f7c8995a2afb4aeaca9abb0b8c2cfc6bdb0a69e9184796d60584e41382d20160c0000000000000000000000030d1b27323d46525e6973808c96a1ada59e9b9ea5afbbc6d2c8bbafa295887c6f6255493c2f221609000c1926323f4c5965727f8c98a5b2bfcbc0b3a69a8d8073675a4d404448494d535557595a5b5b5b5a59585653504a4746413a352f281f1a1209010000000000000000000000000c18242f3947535f6a75828f9ba5afbcc5d0c5b9ac9f92867a6e61544a3f33281d12070000000000000000000000000000000000000000000a141d28313a4145474e4b4a453f362d22180c0100000000000000000000000000000000060b13191f262a2f35393c4347484c4d535557595a5b5c5d5c5b5a5a585553504947454039363127221b140b0500000000000000000000000000000000000000000000000000000000000003090d151d23292e34383a4145474b4c52545658595b5c5c5d5c5c5b5b5a585654524c4a4745403937322c28211a11080000000000000000000006121f2b37434e585f62615f574e463d2f261c1106000000000000000006111c2935414c5665727f8c98a5b2bfd1dcd3c6baaea298887c6f6255493c2f22160900000000000000000000000000000000000000050d141a1e272e34383d4348494d535557595b5c5c5c5b5a585754524c4746414754616d7a8794a0adbac7c0b3a6998d8073665a4d4033271a0d0000000000000000000000000000000000000000000000000009141f2b3844505b66737f8c99a4a89b8e81747683909ca9b3becac8bdb2a89b8f8275695e5242382e23170c0000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfcdc0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d1925303a44505a616e7b86929fa7a2988f82757784919eaab7c4beb1a4978b7e7164584b3e3125180b0000000000000000000000000000071c2835424f5b6875828e9ba8b5c1ced9cbbeb2a5988b7f7265584c3f322519060000000000000613202c3945525d687784919eaab7c4d1d2c5b9ac9f92867a6d6054473a2d211407000000000000000000000000000000000a1723303d4a5663707d8996a9b2bdc9cabeb1a4978b7e7164584b49494949494949494949494949494949494949494949494949494949494846443f38302921170d030000000000000000000000000000000000000000000000000000000000000713202d3946525e68707e87929aa2aab1babec5c6bfbab9b4aeaca8a79f9d9996918c88837e79736d68605d554f443f382f261e150b0200000000000000000916232f3c4956626f7c8995a2afbfbab8b5b7bbc2cacbbfb4ab9f948a7e71675d51463c2f261b0e040000000000000000000000000a16202a36424d57606d7984919ea7afaaa8aaafb7c1ccd7c8bcafa295897c6f6256493c2f231609000c1926323f4c5965727f8c98a5b2bfcbc0b3a79a8d8074675a4d41383b3d4247484a4c4d4e4f4e4d4c4b4946443f3a39363029241d160d08000000000000000000000000000007121d2b37434e58626f7c88939eaab4becac7bbafa3998c7f72665b5044392e23180c030000000000000000000000000000000000000006111c262f3a434c51545b585650483f34291d1105000000000000000000000000000000000001080d141a1d24292c31373a3c3f4246484b4c4d4e4f504f4e4e4d4b4846443f3a39352f2a261f17110a02000000000000000000000000000000000000000000000000000000000000000000030b12181c23282c3035393a3e414647494b4d4e4f4f50504f4f4e4d4b494746413d3a38352f2b26201c16100800000000000000000000000814212e3a47535f6a6e6e6960584e42382d22170b0200000000000000000d1924303c4956636f7c8996abb5bfcbd7d6cabfb4aa978b7e7164584b3e3125180b000000000000000000000000000000000000000003090c151d23282c32383b3c4246484a4c4e4f50504e4d4c4a4745413a393b4754616e7a8794a1adbac7c0b3a69a8d8073675a4d4034271a0d01000000000000000000000000000000000000000000000000030f1c28333f4a54616e7b87939fac9f92867a7b88949fabbcc5d0c5b9aca096897d7063574d4230261c1106000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9b6c2cfcdc0b4a79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000010202030403000000000000000000000000000000000000000000000000000000000000000000000008131e29323f46535f69727f8c95a0aa9e938a7d7784919daab7c4beb1a4978b7e7164584b3e3125180b00000000000000000000000000000c1925323f4c5865727f8b98a8b2bdc8d4ccc0b3a6998d8073665a4d402e23170b0000000000000714212d3a4754606d7a86939facb9c6d2ccc0b5ab9c8f8276685d5245392c201306000000000000000000000000000000000b1825313e4b5864717e8b97a4b1becfc9bdb0a3968a7d7063575555555555555555555555555555555555555555555555555555555555555553504a423b33291f1409000000000000000000000000000000000000000000000000000000000005121e2a36424d57616d7a859299a3acb4bcc3c4bdb9b4aeacaaa29f9b9895908c8884807b76716d67605d56514b433d332d261d150c03000000000000000000091623303c4956636f7c8996a2afbcc7c5c2c3c7ccd3c7baaea3998f82766c61554b41342a1d140a00000000000000000000000000040e1a25303b45515d67717e8b95a0abb6b5b6bbc1c9d3d5c8bcafa295897c6f6256493c2f231609000c1926333f4c5966727f8c99a5b2bfccc0b3a79a8d8074675a4d41342f31373a3b3d4041414241403f3e3c3a38342e2d2a251e18130c04000000000000000000000000000000010f1b26313c47545f6a75828e98a2aebac2cbc0b5ab9e9184786c60554b4034281e150b020000000000000000000000000000000000071017222d38424c555d606865625a50453a2e2115090000000000000000000000000000000000000003090e13181d20262b2e2f31363a3b3e3f40414243434241403e3b3937332d2c29241d1a140b0600000000000000000000000000000000000000000000000000000000000000000000000001070c11171c1f24292c2d3035393a3d3e404142434343424241403e3c3a3935302d2c29241d1b15100b05000000000000000000000004111d2935404b55626e7c7b6f6a60544a3f33281d140a00000000000000000814212e3a4754616d7a8799a3aebbc7d3dbd0bfb3a6998c807366594d4033261a0d00000000000000000000000000000000000000000000030b12181c1f272c2f31363a3b3d3f4142434342403f3d3a39352f2e3b4854616e7b8794a1aebac7c0b3a69a8d8073675a4d4034271a0d01000000000000000000000000000000000000000000000000000b17222d3846525e6976828f9caaa2988b7f808d9aa6b0bccecbbfb4aa9e9184786c6053463b3020150a00000000000000000000000000000000000000000000000003101d2a3643505d697683909ca9b6c3cfcdc0b4a79a8d8174675a4e4134271b0e0909090909090909090909090a0a0a0a0a0a0b0b0c0d0d0e0e0f1010100706040100000000000000000000000000000000000000000000000000000000000000020d17202a36424d57606d78839099a3a59e91847a83909daab6c3beb1a4978b7e7164584b3e3125180b00000000000000000000000000000815222e3b4855616e7b8896a0acb9c5d2cec1b4a89b8e817568544a3f34281c100300000000000a1623303d495663707c899aa4afbbc8d4c7bbafa4998b7e7165564c4135291d1104000000000000000000000000000000000c1926323f4c5965727f8c98a5b2bfcbc9bcafa296897c6f636262626262626262626262626262626262626262626262626262626262626262605c544d453b31251a0e02000000000000000000000000000000000000000000000000000000000714202d3a46525e6974818e97a2abb5bec6c1bbb2adaba39f9b98928f8b87837f7b77736e6964605d55524c4540393127221b140b03000000000000000000000a1623303d495663707c8996a3afbcc9d2cfd0d3d5c9bdb2a89f92867b6e625a50433a2f22180b02000000000000000000000000000009141f2935404b55606c7883909da5afbdc6c6ccd3dbd5c8bcafa295897c6f6256493c2f231609000d192633404c5966737f8c99a6b2bfccc0b4a79a8d8174675a4e413427262b2d2e3133343535343332312f2d2b2823201d19130d070100000000000000000000000000000000000a15202b37434e58616e7b86929fa6b0bbc4c7b9aca1968a7e71675c51453c30271d140b030000000000000000000000000000020810192228333f4a545d676d74716c62564a3d3124170b00000000000000000000000000000000000000000001070d11151a1f2122262a2d2e31333434353636353433322f2d2b2722201d18120e090300000000000000000000000000000000000000000000000000000000000000000000000000000000060c1013191d202124292d2e30323335353636363635343432302e2d2925201f1d18120f0a04000000000000000000000000000613202c3945515d677885867c6f665b50443b2f261b110a020000000000000613202d394653606c7986929facb9c5d2dacdc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000000070c10161b1f22262a2d2e313335353636353332312d2c29242e3b4854616e7b8794a1aebac7c0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000000000006111c2a36424d5764717e8a98a2aa9d908385929eabb8c2cdc7baaea3988c7f72655b5044372b1f120300000000000000000000000000000000000000000000000004101d2a3743505d6a7683909da9b6c3d0cdc0b4a79a8d8174675a4e4134271b15151515151515151516161616161617171717171819191a1b1b1c1c1d1d1413110d0801000000000000000000000000000000000000000000000000000000000000050e1a26313b44505c666f7c87929fa8a1968d8083909da9b6c3beb1a4978b7e7164584b3e3125180b00000000000000000000000000000714212d3a46535f697784919eaab7c2cdcfc3b6a99c908376665c5044382b1f12060000000003101c28343f4a5465727f8c98acb6c0ccd2c6b9ac9f93867a6d6154473a2f24190d01000000000000000000000000000000000d1a2733404d5a6673808d99a6b3c0ccc8bbaea295887b6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6d665e574d42362a1e1205000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b87939fa9b3bdc7c1b7afa9a19e99928e8985827e7b77726e6a66615f5753514b45413a352f2c28231c150c03000000000000000000000a1623303d495663707c8996a3afbcc9d6dcddd8cec6b9aca1968c8073695f53483e31281d1006000000000000000000000000000000030d18242f3944505b656f7d89939eabb4bfcbd7dde5d5c8bcafa295897c6f6256493c2f231609000d192633404c5966737f8c99a6b2bfccc0b4a79a8d8174675a4e4134271a1e212224262728282827262523201f1c1713110d080200000000000000000000000000000000000000040f1b26323c46525e69727f8b949fa9b3bdc7bdb2a89e9184796d60584e42392f261d150c07010000000000000000000000070c1319222b343c44505b666d79817e7165584b3e32251807000000000000000000000000000000000000000000000001040a0f1215151a1e212224262728292a292827272522201f1b1713100d0701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003080d111314191d20212325262829292a2929282827252321201d191413100c07010000000000000000000000000000000714202d3a4753606d7a869083786c60564c41382d221b140b03000000000005121f2b3744505b657885919eabb8c4d1dacdc1b4a79a8e8174675b4e4134281b0e0100000000000000000000000000000000000000000000000000040a0f13151a1e21222426282929292827252421201d222e3b4855616e7b8894a1aebbc7c0b3a79a8d8074675a4d4134271a0e0100000000000000000000000000000000000000000000000000000e1a25303b4753606d7985929faba095909297a1adb9c6d2c5b8ac9f92867a6d6153493f33271b0f0300000000000000000000000000000000000000000000000004111d2a3744505d6a7783909daab6c3d0cdc0b4a79a8d8174675a4e41342722222222222222222222222323232323232424242425252627272829292a2921201d19130c0400000000000000000000000000000000000000000000000000000000000009141f28343f4a54606a73808d96a0a89f928684919eabb8c4bdb1a4978a7e7164574b3e3124180b000000000000000000000000000005121e2b37424d576774808d9aa7b1bcc7d2c5b8ac9f9285796d6053463a2d2013090000000006121f2c3844505c6675828e9ba8b5c1d2c9beb3a99c8f8376685e5246392d1e130800000000000000000000000000000000000e1b2834414e5b6774818e9aa7b4c1cdcabdb0a3978a7e7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7b786e695e53463a2d211407000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b9aa4afbbc5c1b7afa59e96918c86827d7975716e6966625f5855534d4745403935393a3a38342e271e150b000000000000000000000a1723303d4a5663707d8996a3b0bcc9d6e7dbd0c6bcb0a69e9184796d60574d42362c1f160c000000000000000000000000000000000007121d27333f4953606b75828f99a3aebac6d0dbe7d5c9bcafa296897c6f6356493c30231609000d1a2633404d596673808c99a6b3bfccc1b4a79a8e8174675b4e4134281b12141517191a1b1c1b1a1918161312100b060501000000000000000000000000000000000000000000000a15202a36424d57606c78839097a1abb5c0c4b9aca1968c7f726a5f544b42382e271e18120e090604000000000306080d12181e2429343d464f59606c78828e83776a5d50442e23180c0000000000000000000000000000000000000000000000000000030608090e12141518191a1b1c1d1c1b1b1a181513120f0b060401000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010407080d11131416181a1b1c1c1d1d1c1c1b1a18161413110d0806040000000000000000000000000000000000000814212e3b4754616e7a87958b7e71685e53493f332d261d15100b0606030408121f2c3844515c667885929eabb8c5d1d9ccc0b3a6998d8073665a4d4033271a0d000000000000000000000000000000000000000000000000000000000307090e12141517191b1c1d1d1b1a1917141315222e3b4855616e7b8894a1aebbc7c0b4a79a8d8174675a4e4134271b0e01000000000000000000000000000000000000000000000000000009141f2c3945515d6774818e9aa8a7a09d9ea1a9b3bec9c8bcb1a79b8e8174685e5241382d22170b0000000000000000000000000000000000000000000000000004111e2b3744515e6a7784919daab7c4d0cdc0b4a79a8d8174675a4e41342f2f2f2f2f2f2f2f2f2f2f2f2f2f3030303030303131313233333435353637362d2c29241e160d040000000000000000000000000000000000000000000000000000000000030c17232e38424e58606d7984919ea5a399929197a1adb9c6bdb1a4978a7e7164574b3e3124180b0000000000000000000000000000020e1a26313d495663707d89959fabb7c2cdc6baaea298887b6f6255483c30251a0e020000000713202d3a4653606d7985929fabb8c5d2c6b9ada1978b7e7265564c41362a1e0c0100000000000000000000000000000000000f1b2835424e5b6875818e9ba8b4c1cecbbeb2a59a908a88888888888888888888888888888888888888888888888888888888888888888888857b6e6154483b2e21150800000000000000000000000000000000000000000000000000000004101c2834404b54697683909cacb6c0c6bdafa59e938e847f7a75706d6665615e5755534e4846423b39353a4145474644403930271c12070000000000000000000a1724303d4a5763707d8a96a3b0bdc9d6e2d6cabfb4aa9e938a7d70675d51453c31241a0d040000000000000000000000000000000000010b17222d38414f59616e7b86929faab4bfcad6e2d5c9bcafa296897c6f6356493c30231609000d1a2733404d5a6673808d99a6b3c0ccc1b4a79b8e8174685b4e4135281b0e08080a0d0e0e0f0e0d0c0b090706030000000000000000000000000000000000000000000000000000040e1a25303b44505b666e7b859199a3afbbbfbdb2a89f92867c6e665c544a40393029241d1a1413100c07060c101213191c232830353e464e58606b727f8c9184786b544a4034281c10040000000000000000000000000000000000000000000000000000000000020507080b0c0d0e0f10100f0e0d0b080605030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010507070a0b0d0e0f1010100f0f0e0d0b09070705010000000000000000000000000000000000000000000815222f3b4855626e7b889592857a6e655b50443f382f271f1c17131210101319202d3a4653606d7986939facb9c6d2d8cbbeb1a5988b7e7265584b3f3225180c00000000000000000000000000000000000000000000000000000000000000020507080a0c0e0f10100f0d0c0a070815222f3b4855626e7b8895a1aebbc8c0b4a79a8d8174675a4e4134271b0e01000000000000000000000000000000000000000000000000000004101d2935404b55636f7c8996a0acacaaabadb3bbc5cfc4b8aca095897c6f62564c412f261b11060000000000000000000000000000000000000000000000000005111e2b3844515e6b7784919eaab7c4d1cdc0b4a79a8d8174675a4e413c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3d3d3d3d3d3d3e3e3f40404141424343433a39352f281f160c01000000000000000000000000000000000000000000000000000000000006111c26303c45515d67707d89939ea9a39f9ea1a9b2bec9bdb1a4978a7e7164574b3e3124180b0000000000000000000000000000000916222f3b4854606b7683909da6b0bbc7cabfb4aa988b7e7265574d42362a1e1408010006101d2935404b5563707c8997a2adbac6c9beb2a99e9185796d6053473a3025190d0000000000000000000000000000000000000e1b2734414e5a6774818d9aa7b4c0cdcec2b6aba29a97959595959595959595959595959595959595959595959595959595959595959595978b7e7265584b3f3225180c00000000000000000000000000000000000000000000000000000006131f2c3845515c667885929eabb8c5bfb4ab9e938e817a726d6863605c5454524d4847433c3a3631363e444c525453514a42392e23180c0000000000000000000a1724303d4a5763707d8a96a3b0bdc9d6dbd3c7baaea2988f82756b61554b40332a1f12080000000000000000000000000000000000000006111b262f3d46535f6974808d98a2aebac6d0dbd5c9bcafa296897c6f6356493c30231609000d1a2733404d5a6673808d99a6b3c0ccc1b4a79b8e8174685b4e4135281b0e02000000010202010000000000000000000000000000000000000000000000000000000000000000000009141f28333f4a545e69707d87929fa3adbbc0baaea2989083786d665b514b433b352f2a26201f1d181b1b171c1f20252a2e343a41455058606a707d8792928578665c5144382c1f12060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c8995978f82776c605b50494139312b2823201f1c1c1f252935404b55626f7c899aa4afbbc8d4d4c8bcb1a7978a7d7064574a3d3124170a000000000000000000000000000000000000000000000000000000000000000000000000000202030302000000000915222f3c4855626f7b8895a2aebbc8c1b4a79a8e8174675b4e4134281b0e010000000000000000000000000000000000000000000000000000000c18242f394854606b7784919eacb6b7b8b9bec5cdcabeb3aa9d9083776a6054443a301d140a000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cdc0b4a79a8d8174675a4e484848484848484848484848484949494949494a4a4a4a4a4b4c4c4d4e4e4f4f50504745413a31281e13080000000000000000000000000000000000000000000000000000000000000a151e2935404b55606b74818e97a1adacabadb2bbc4cfbdb1a4978a7e7164574b3e3124180b0000000000000000000000000000000713202c38444f5963707d89949fabb7c0ccc2b5a99c8f8276695e52463b302519130e0c1117222c3945515d6774808d9aa9b3becac5b9ada1978c7f72675c514538291e13080000000000000000000000000000000000000d1a2633404d596673808c99a6b3bfccd2c7bcb2aaa4a2a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a2a2a2a2a2a2a2a2a2a2a2a9988b7e7165584b3e3225180b0000000000000000000000000000000000000000000000000000000713202d3a4653606d7986939facb9c6baaea3998f81786d68615e5653514b4746423b3a37312d2a333e4850565d60605c544a4034281c100400000000000000000a1724313d4a5764707d8a97a3b0bdcad6d4c8bdb2a89f92867b6e61594f43392f21180e0000000000000000000000000000000000000000000a141d2a36424d57616e7a86929faab4bfcad6d5c9bcafa296897c6f6356493c30231609000d1a2734404d5a6773808d9aa6b3c0cdc1b4a89b8e8175685b4e4235281b0f020000000000000000000000000000000000000000000000000000000000000000000000000000000000020b17222d38424d57606b727f8b919ca4afb5bdb4aaa0958e81786c605c554d45403936312d2c2924282723282c2d30363940444c525a616a6f7c8592999286796d6053463a2d2013090000000000000000000000020507080f0f0f0f0e0e0e0e0e0d0d0d0d0d0e0e0e0e0f0f0f0f0e0e0d0c0c0b0b0a0907060401000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a979f948d80736d605b534b433e38342e2d2b28292c30353e45515d6773808c99acb6c0ccd8d1c5b8aca095887b6e6255483b2f221508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915222f3c4855626f7b8895a2aebbc8c1b4a79a8e8174675b4e4134281b0e0100000000000000000000000000000000000000000000000000000007121d2c38434f5966737f8c9aa4afbbc5c6c9cfd3c6baaea2988b7e7165584e4332281e0b02000000000000000000000000000000000000000000000000000005121f2c3845525f6b7885929eabb8c5d1cdc0b4a79a8d8174675a555555555555555555555555555555565656565656575757575858595a5a5b5c5c5d5c54524c433a2f24190d010000000000000000000000000000000000000000000000000000000000030c18242f39434f59616d7a85929ea6b0b8b9bec4cdcabdb1a4978a7e7164574b3e3124180b00000000000000000000000000000004101c27323d4854606b76828f9ca5afbac3c6b9ac9f93877b6e61564c41362a241e1a181b222834404b55606d7985929fabb8c5c5bbb0a69e91847a6d60554b403429170d020000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2bed2cdc1b5aaa09995949494949494949494949494949494949494949494969c9fa6b0afafafafafafa4978a7d7164574a3e3124170b0000000000000000000000000000000000000000000000000000000814212e3b4754616e7a879aa4afbbc5b9ac9f92867b6e665d56524c4645403b3a36302e2b2628313b45505a61686d6d665c5144382c1f120600000000000000000b1724313e4a5764717d8a97a4b0bdcad7cec5b8aca0968c7f72695e53473e31271d0f06000000000000000000000000000000000000000000020b1a26313b46525e6873808d98a2aebac5d0dbc9bcafa396897c706356493d3023160a000e1a2734414d5a6774808d9aa7b3c0cdc1b4a89b8e8175685b4e4235281b0f0200000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c262f3b454f59626d727f8c929fa4abb4bcb1a79e938d80756d675f57514b46423c3a38352f34342e34383a3c41464a51565d606c717d859297a299887c6f6255493c31251a0e02000000000000000003090e1214151b1c1c1b1b1b1b1b1a1a1a1a1a1a1a1b1b1b1b1c1c1c1b1a1a1919181717151413100d07090706040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b546774808d9aa69c928c7f736c655d555046443f3b3a383434383a41464f59606d7985919eabb8c4d2d7cbc0b5ab9d908377695f53473a2e211408000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c8895a2afbbc8c1b4a79b8e8174685b4e4135281b0e02000000000000000000000000000000000000000000000000000000010f1b27323d4854616e7b87939facb9c5d0d5dad2c5b8ab9f92857a6d6053473d3220160c00000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabb8c5d2cdc0b4a79a8d817467626262626262626262626262626262626262636363636363646464656666676868696a69605d564c4135291d110400000000000000000000000000000000000000000000000000000000000007121d27313d46525e68717e8a949eaab4bfc9cfd6cabdb1a4978a7e7164574b3e3124180b000000000000000000000000000000000b16212c38444f59636f7c89939da8b2bbc5bbafa4998c7f73685e52463f352f2a2623282d333d45515c67727e8b97a2adbac7bdb3a99f948a7e71675d5143392f231805000000000000000000000000000000000000000b1824313e4b5764717e8a97acb6c0ccc9bdb1a4998e89878787878787878787878787878787878787878787898f949fabb7bbbbbbbbafa396897d706356493d3023160a0000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8799a3aebac2b5a89c8f8275695e544c46413a38342e2d2a25212328323a434d57616c707a786d6053463a2d20130700000000000000000b1724313e4a5764717d8a97a4b0bdcad0c5bcafa59d9184796d60574d42352c1f150b000000000000000000000000000000000000000000000009141f2a36414c56616d7a86929faab4becad6c9bcafa396897c706356493d3023160a000e1a2734414d5a6774808d9aa7b3c0cdc1b5a89b8e8275685b4f4235281c0f02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d29333d47515b636d73808c9399a2aab2bbafa59d928d81796e69605d55534d49474540424141423f4446494c52545c60686d757e869297a1a9988b7e7165574d42362a1e120500000000000000050d141a1e21212828282828282827272727272727272728282828292828272726252524242220201d1819161413100d07060400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c667783909daaa49b918c80776d67615a53504a4846443f4045474c5259616b73808c97a1adb9c6d2cfc6bbafa3998c7f7266574d42372b1e1206000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c8995a2afbcc8c1b4a79b8e8174685b4e4135281b0e02000000000000000000000000000000000000000000000000000000000a16212d3a46535e6976828f9caab4bfcad6d3c7bbb0a69a8d8074675d5145392c20130400000000000000000000000000000000000000000000000000000006121f2c3844515c667986929facb9c5d2cdc0b4a79a8d81746f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f70707070707071717273737474757676766d685d5245392c201306000000000000000000000000000000000000000000000000000000000000010b151f2935414c56616c76828f98a2aebac3cfd9cabdb0a4978a7d7164574a3e3124170b0000000000000000000000000000000005101c27333d4854606b74818e96a0a9b3bcc0b5ab9f92857a6e615a5145413a36312e34383f444f59606d7984919ea9b3bec0b5aba1978f82766c61554b4131271d1207000000000000000000000000000000000000000a1723303d4a5663707d899aa4afbbc8c8bcafa295897c7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7b7c828f9ca9b6c2c8c8bbafa295887c6f6255493c2f2216090000000000000000000000000000000000000000000000000000000613202c3945515d677986929facb9c0b3a79a8d807467564d423a36302c2823202024292e343c444c565f69707e867f7265594c3f3226190c00000000000000000b1824313e4b5764717e8a97a4b1bdcacabeb4aa9e93897d70665c51453b31231a0d030000000000000000000000000000000000000000000000030e1925303b46525e6873808d98a2aebac5d0c9bcafa396897c706356493d3023160a000e1b2734414e5a6774818d9aa7b4c0cdc2b5a89b8f8275685c4f4235291c0f0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b17202b353f49515b636d737f879298a0a8afb6aea49d938e837b726d67615f575653514b4f4e4e4e4a505355565e61666d727a818a9298a1a9a99c8f8276695e53463a2d211407000000000000050f171f252a2d2e3535353535343434343434333334343434353535353534343333323231302f2d2c2924252320201d181313100c07030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7986929fabada39b928c8179716c63605c545453504a4b5153565e616b707d87929fa9b3bec9cec5bcb2a89f92877b6e6154483c31261a0e02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c8995a2afbcc8c1b4a89b8e8175685b4e4235281b0f020000000000000000000000000000000000000000000000000000000005121e2a36424d5764717e8b98a2aebac6d3d0c4b7ab9f94887b6f62554b4035291d11040000000000000000000000000000000000000000000000000000000713202d3a4653606d798699a3afbbc7d3cec1b5a89b8e817c7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7c7c7c7c7c7c7d7d7d7d7d7e7f7f808181828283827a6d6054473a2d21140700000000000000000000000000000000000000000000000000000000000000030d1925303a44505a616e7b86929fa7b1bdc7d1cabdb0a4978a7d7164574a3e3124170b00000000000000000000000000000000000b16212c38444f59606d79849197a2aab3bcbaada2978e81756c625b524c464241414044495059606b73808d96a0acbbbfbaafa49992857b6e615a50433a2f1f150b01000000000000000000000000000000000000000714212d3a4754606d7a86939facb9c6c8bbafa295887c6f6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6f7c8995a2afbcc8c9bdb2a894877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000004111d2935414b556a7784919daab7c0b3a6998d807366564c4138302d2c28282b2d2f353940444e565d686e7b858d8073675a4d4034271a0600000000000000000b1825313e4b5864717e8b97a4b1bed0c7baaea2988e81756b60544b4033291f11080000000000000000000000000000000000000000000000000008141e2a36414c56616d7a85929fa9b3becac9bcb0a396897d7063564a3d3023170a000e1b2834414e5b6774818e9aa7b4c1cdc2b5a89b8f8275685c4f4235291c0f020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e19232d373f49525b636d727e8691969fa4acb2aea59e9590867f79736e696563605d555b5b5a5b545c606265686d72797e848e939fa3aab3ac9f93877b6e6154483b2e2115080000000000030d17212931363a3b424242424141414141404040404041414141424242424141403f3f3e3e3d3c3a39352f32302d2c2924201f1c1812100c060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c6677849199a3abada49c938e847e76706d666361605c54555c6063686d737d869299a3afbbc4cdc5bcb4aaa0968d8073695e53463a2a2015090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091623303c4956636f7c8996a2afbcc9c1b4a89b8e8175685b4e4235281b0f0200000000000000000000000000000000000000000000000000000000020e1a25313b4753606d7985929facb8c4cec9beb3a99c9083766a5f53433a2f24180d010000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0b5c0cbd7cfc3b6aa9e938e8888888888888888888888888888888888888989898989898a8a8a8a8b8b8c8d8d8e8f8f90887b6f6255483c2f221509000000000000000000000000000000000000000000000000000000000000000008131e28323e46535e69727f8c959fabb5c0cbcabdb0a4978a7d7164574a3e3124170b0000000000000000000000000000000000050f1b27323d45515d676e7c859298a2a9b2bab3a99e938a7e726d605d56534d4e4e4a51535b606b707d87929fa8b2bdb4aea39f93877d70695e52483e31281d0d0300000000000000000000000000000000000000000713202c3945525d687784909daab7c3d2bcafa396897c7063616161616161616161616161616161616161626e7b8895a1aebbc8c5b9aca096877a6d6054473a2d211407000000000000000000000000000000000000000000000000000000010d18242f414e5a6774818d9aa8b2bdb5a89b8f8275685e524a423d3a38343338393b40454a51585f686d7a83908e8174685b4e412d22170b00000000000000000b1825313e4b5864717e8b97a4b1bec7beb1a79f92867b6e61594f42392e21170d0000000000000000000000000000000000000000000000000000020d1925303a46525e6873808c97a2adbac5cfbcb0a396897d7063564a3d3023170a000e1b2835414e5b6874818e9ba7b4c1cec2b5a89c8f8275695c4f4236291c0f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007111b252e374049525b636c707c848d939aa0a8adafa79f98928c85807b75726f6d67696867676869666d6f71757a7f848b91969ea5aeb4b5afa4998c7f7366594c403326190d000000000009141f29333b4246484e4f4f4e4e4e4e4e4d4d4d4d4d4d4d4e4e4e4e4f4f4f4e4d4d4c4c4b4a4a48474540413f3c3a39352f2d2c28231f1c17110e09020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b5463707d879299a0a8aea59e96918a837d7974706e6d666a6a676d70747a80889298a2abb5c0c8c1bbb3aaa2989184796d60574d42362a180e0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1723303d4a5663707d8996a3b0bcc9c1b5a89b8e8275685b4f4235281c0f02000000000000000000000000000000000000000000000000000000000009141f2c3945515d6774818e9ba8b2bdc9c6b9ada1978a7e7164584e4331281d1307000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbad1cbc7c5baafa59e9b95959595959595959595959595959595959595959696969696969797979899999a9b9b9c98877a6d6054473a2d2114070000000000000000000000000000000000000000000000000000000000000000020c16202a36424d57606d78839099a3afbbc3c6bdb0a4978a7d7164574a3e3124170b0000000000000000000000000000000000000a16212935404b555f6a6f7d869297a1a8b0b9afa59f92877f736d68615f575b5b545c60656c717d859299a3afbbb3aba39f918b7f726b60574d42362c1f160c00000000000000000000000000000000000000000004111d2935414c566774818d9aacb6c0ccbeb1a4978b7e7164585454545454545454545454545454545455626f7c8895a2afbbc8c4b7aa9e918477675d5145392c20130600000000000000000000000000000000000000000000000000000000071724313d4a5764707d8a96a1acb9b9ac9f92867a6e615c544f494645403f4446484b51545c606a6e7a8390958f827569544a3f33281c0f03000000000000000b1825323e4b5865717e8b98a4b1bec0b6aca0958c7f72695e52473d30271d0f0500000000000000000000000000000000000000000000000000000008131e2935414c56606d7a85929fa9b3bebcbcb0a396897d7063564a3d3023170a000f1c2835424f5b6875828e9ba8b5c1cec2b6a99c8f8376695c504336291d10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009131c252e374049515a616a6f79808891969ea1a9adaaa29f97928d87827f7c7a7776757474757677797c7e82868b91969ea1a9afb8b0aba49f948d8074675a4d4134271a0e01000000020e1a25313b454d53545b5b5b5b5b5b5b5a5a5a5a5a5a5a5a5a5b5b5b5b5c5b5b5a5a59585857575553514b4e4c494745403d3a38342e2c28231c1a140f09030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232e394855616b717e8791959fa2aaa8a19e94908985817d7b7978777778797d80868d939aa2aab4bdc3bdb8afa9a29892867c6f675c51453b31251a060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a96a3b0bdc9c2b5a89c8f8275695c4f4236291c0f03000000000000000000000000000000000000000000000000000000000004101d2935404b55636f7c8996a0acb9bfc0b5ab9e9285796d6053463c3120160c01000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebababfbab9b8b8afaaa8a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a3a3a3a3a3a3a4a4a5a6a6a7a7a89f928578685d5245392c201307000000000000000000000000000000000000000000000000000000000000000000040e1a25313b44505c666f7c87929fa8b2b8b9bbb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000040d18242f3a434e58606b6f7d8591969ea6adb3afa399928b807a746e6969686769666d71787e869297a2abb5afa9a199928b7f726d62594f453b30241b0d04000000000000000000000000000000000000000000010d1924303e4a5764717e8a9aa4afbbc8c0b3a79a8d807467554b47474747474747474747474747474956636f7c8996a2afbcc9c1b4a89b8e817568554c4135291d1104000000000000000000000000000000000000000000000000000000000713202d3a4653606d7884919ea6b0baaea3998f81756d6660595553514b4a505354555d60666d727c8490959d908376665b5044382b1f1206000000000000000c1825323f4b5865727e8b98a5afb1b3afa49a9083786d60564d42352b1e150b00000000000000000000000000000000000000000000000000000000020d1925303a45525d68737f8c97a2adaeafb0afa396897c706356493d3023160a000f1c2935424f5c6875828f9ba8b5c2cec3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c252e373f4750585f676d747d848b92979ea1a9aba9a29f99938f8b8986848282818181828385888b8f92999ea1a8adb2aeaca69f99938d82796d6054473a2d2114070000000005121e2a36424d575e6168686868686767676767676666676767676868686868676766666565646362605d555b585653514b494645403a38342e2a251f1a150d08020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d2c38444f59616c717c848d92989fa3aba69f9c97928e8987868583838486898d92989fa4acb4bcbab8b1aca59e9792867d706a60554b4033291f14090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0bdcac2b6a99c8f8376695c504336291d10030000000000000000000000000000000000000000000000000000000000000c18242f394653606c7884919eacaeb4b0afa4998d8073665c5145382c1f130400000000000000000000000000000000000000000000000000000000000915222f3c4855626f7b8895a2aeadadb4aeacabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababacacacafb5adaeaeafab9e918478655b5044372b1f12050000000000000000000000000000000000000000000000000000000000000000000009141f28343f4a545f6a73808d96a0ababacafb5a3978a7d7064574a3d3124170a0000000000000000000000000000000000000007131d28313c464f59606b6f7c848f939ea1a9adaba39f928d85807b787574747677797e838a9298a2a9b0aca49f9791877e726d625b51473d33291f120900000000000000000000000000000000000000000000000814212e3b4754616e7b87939facb9c3c3b6a99c908376675d51453b3b3b3b3b3b3b3b3b3b3b3b3d4a5764707d8a97a3b0bdcabfb4aa988b7e7265584b3f2f24190d010000000000000000000000000000000000000000000000000000000006121f2b3844505c66727e8b949fa8b2b4ab9e938d80786f6b6562605c55545b606164676d72797f8691969f9f9285796c605346392d201306000000000000000c1825323f4b5865727e8b98aba2a4a6a99f93877c6f665c50443b3023190c03000000000000000000000000000000000000000000000000000000000008131e2935414c56606d7a85929fa8a2a2a4a6a295897c6f6256493c2f231609000f1c2936424f5c6975828f9ca8b5c2cfc3b6a99d9083766a5d5043372a1d10040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c252d353e464e555d606b70787f858c91979d9fa7a9aba49f9c989992908f8e8e8d8e8f909298989c9fa3abacaeabaaa39f9b948f8780796d675d5145392c201306000000000714212d3a46535e696e7575757574747474747373737373747474747575757574747372727171706f6d676a676563605d555653514b46443f3836302b262019130b0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101c28333e47505a616a6f7980868d92999ea1a8a9a19e9a9699939190909192999a9fa2aaafb6b6b4aeaca8a09d938f857c706b60584e43392f21170d030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1bdcac3b6a99d9083766a5d5043372a1d100400000000000000000000000000000000000000000000000000000000000007121f2b3744505b65737f8c9a9fa3aaa3a69f93877b6e61544b4034281c100400000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c8895aba1a1a0a0a39f9f9e9e9e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9e9e9e9e9e9e9e9f9f9f9f9fa3a0a1a1a2a2a39f9286796c605346392d20130600000000000000000000000000000000000000000000000000000000000000000000030b17232e38424e58606d798491999d9e9fa4aba3978a7d7064574a3d3124170a00000000000000000000000000000000000000010c161f2a333d474f59606a6f7a828b91979fa2a9aba49d98928d88848281818284868b90959fa3aaaca69f9a938e857d716c625b51483f352c21170d0000000000000000000000000000000000000000000000000714202d3946525e6875828f9ca7b1bcc5b8ac9f92867a6d6053473b312e2e2e2e2e2e2e2e2e323f4c5965727f8c98a5b2bfc6baaea298887c6f6255493c2f221608000000000000000000000000000000000000000000000000000000000003101c28343f4a54606c78828f96a1a8b0afa59d928d837c76726f6d676a6a666c6e7174797e848c9298a0a8a297887c6f6255483c2f221509000000000000000c1925323f4c5865727f8b999495979a9c978e81746b60544a3f32291f1108000000000000000000000000000000000000000000000000000000000000020d1924303a45515d67737f8c9594959697999c95887b6f6255483c2f22150900101d293643505c6976838f9ca9b6c2ccc3b7aa9d9084776a5d5144372a1e1104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c232c343c434b515960666d727a7f858b9095999d9fa7a6a8aba39f9d9c9b9a9a9b9c9d9fa2aaa8acaaa8aaa29f9c98928e89827c736d675d554b4135291d1104000000000815212e3b4854616e7b818282818181818180808080808080818181818282828180807f7f7e7d7d7b7a787674726f6d676663605c5553504a46423b373129251e17110a0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17212c353e4850585f676d737b81868c91969a9ea1a9a7aba49f9e9d9d9e9fa3abacaeb4aeacaaaaa29f9b959189827b6f6a60594f463d31271d0f05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbc3b7aa9d9084776a5d5144372a1e1104000000000000000000000000000000000000000000000000000000000000030f1b27333f4953616e7b879192989497999c8f8275695e5342392e23180c000000000000000000000000000000000000000000000000000000000000091623303c4956636f7c899995949493939992929291919191919191919191919191919191919191919191919191929292929292999394949596969799877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000000000006111c26303c45515c67707d878f90919399989b978a7d7064574a3d3124170a0000000000000000000000000000000000000000040d18212b353d474f585f686d757e858c92979da0a7aaa29f9a96918f8e8e8f9192999da0a7aaa39f9b949087817a6f6b625a51493f362d231a0f0500000000000000000000000000000000000000000000000005111e2a36414d5663707d8995a0acb8c4baaea2988a7e7164574d42362a212121212121212935414c566774818d9aa7b4c0c5b8ac9f9285796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000b17232e3844505b666e7b8491969fa6acaea49d959089837f7c7978777778797b7e81858b91969fa3aaa9a1988b7f7265584c3f3225190c000000000000000a1623303d495663707d868687898b8d8f91857a6d61594f42382e20170d000000000000000000000000000000000000000000000000000000000000000008131e2935414c55616d7a83868788898a8c8f91887b6e6155483b2e22150800101d2a3643505d697683909ca9b6bebfc1b7aa9d9184776a5e5144372b1e110400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a111a222a313940454f545c60686d73797e83888c9095979a9d9fa2aaa4a5a5a6a6a6a5a5a4a3aaa29f9d9b9998928f8b86817c766f6a605c554b433a2f24180d01000000000c1925323f4c5865727f8b8e8e8e8e8e8e8d8d8d8d8d8d8d8d8d8e8e8e8e8f8e8e8d8d8c8b8b8a8a88868583817f7c7a7673706d6763605c54524d47433c353028221c140b050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005101a232c363e464e555d60696e747b7f848a8e9197999c9ea1a8a4a5a6a7a7a7a6a5a5aaa39f9d9a98928e8a847d756e6960584f473d342b1f150b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bebfc1b7aa9e9184776b5e5144382b1e0600000000000000000000000000000000000000000000000000000000000000000b17222d3846535e697380848587888a8d8f8a7d7063574d4230271d12070000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b878888878787868686858584848484848484848484848484848484848484848484848585858585858586868787888889898a8a887c6f6255483c2f2215090000000000000000000000000000000000000000000000000000000000000000000000000a141e2934404b55606b717e82838586888b8e918a7d7064574a3d3124170a000000000000000000000000000000000000000000060f19232b353d464e565d606c717a80858b9095999c9fa2a8a19e9c9b9a9c9e9fa3a49f9e9a98928e89837d746d68605950483f372d241b110800000000000000000000000000000000000000000000000000020e1925303b4854606b7784919da8b2bdbfb4aa9b8f8275695f53463c31281d16141414202c3945525d687683909ca9b6c3bcb1a79b8e8175665c5044382b1f120600000000000000000000000000000000000000000000000000000000000006111c28333f4a545e696e7b848f949da0a8aca79f9d95908c88868584848586878b8e92979ea0a8a9a19e97928b7e7165584b3e3225180b000000000000000916222f3b4854606b70787a7b7c7e8082847e71685e52473d30261c0e050000000000000000000000000000000000000000000000000000000000000000020d19242f3a46525e686d777a7a7b7c7d80828585796d6053473a2d20140700111d2a3744505d6a7783909daaafb1b2b4b7ab9e9184786b5e5145382b1e12050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000810181f282f353d424a51565d60666d71767b7f83878a8d9092989597989899999998989797969892908e8c8985827e7a756f6b626058514b433a31281d130700000000000c1825323f4b5865727e8b989b9b9b9a9a9a9a9a9a99999a9a9a9a9b9b9b9b9b9a9a999998989796959792908e8b898683807c7975706d66615e57534e46413a332d261d170e070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008111a242c343c434b51565e61686e73787d8185888c8f9196969798999a9b9a999998979892908e8b86817d78706b615e574e463d352b22190d0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926323f4c5965727f8c98a5afb1b2b4b6ab9e9185786b5e52452e23170c000000000000000000000000000000000000000000000000000000000000000006111b2a36424d57646e7378797a7b7d808381786c6053463b3120150b000000000000000000000000000000000000000000000000000000000000000714212d3a46535f696e7a7b7b7b7a7a7a7979787878777777777777777777777777777777777777777778787878787878797979797a7a7b7b7c7d7d7e7e786d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000000000000020c18232f39434f59616c71767678797b7e8184847b6e6154483b2e21150800000000000000000000000000000000000000000000071019232b343c444c525a61676d737a7f83888c8f92979698999a9a9b9a9999979a93918e8a86817c766f6b615e564f463f362d251b120900000000000000000000000000000000000000000000000000000008141f2c38444f5965727e8b96a1adb9c1b9ac9f92867b6e61584e433a2f281f1c1a1e27313a4754606d7a86929facb9c5b7ab9f95897c6f62544a3f34281c1003000000000000000000000000000000000000000000000000000000000000000b17222d38424d575f696e7a828a91959da0a8a9a79f9d989992919190929399979b9ea1a9a39f9c97928c857f776c605346392d201306000000000000000713202c38444f5960656c6d6e6f71737677716c61564c41342b1e150a0000000000000000000000000000000000000000000000000000000000000000000008131e2935414c565e61676d6e6f6f71737578786d675d5145392c20130600111e2a3744515d6a7784909da1a3a4a6a7aaab9e9185786b5e5245382b1f120500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d161d2429303940444c52545c6064696e72767a7d80838587898a8b8c8c8d8c8c8b8a8a89878583827f7c7975716d68636059544e45403931281f160c0100000000000b1825313e4b5864717e8b97a4a8a7a7a7a7a7a6a6a6a6a6a7a7a7a7a7a6a6a5a5a4a4a5a5a4a4a3a9a19e9d9a989992908d8985817d79736e69625f58524c443f382f29201910090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008121a222a313940454d52565e61666d7074787c7f828487898b8c8c8d8e8d8d8c8b8a888683817e7a75706d666059534d453d342b231910070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c99a1a3a4a6a7aaab9f9285786c5f4a3f34281c100300000000000000000000000000000000000000000000000000000000000000000e1a25313b45525c64676b676d6e707376756c665b5044382b1f12030000000000000000000000000000000000000000000000000000000000000005121e2a36424d575f686e6f6e6e6e6d6d6c656c6b6b6b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6b6b6b6b6b6b6b6c6c6c6c666d6d6e6e6f6f707071716d665c5044382c1f12060000000000000000000000000000000000000000000000000000000000000000000000000007121d27313d47505a6164696a666d6e717477776e695e53463a2d2114070000000000000000000000000000000000000000000000071119222a323a414550555d60676d72777b7f828588898b8c8d8e8e8d8c8c8b898684817d7a756f6a636059524c443d342d241b13090000000000000000000000000000000000000000000000000000000002101c27333d4753606d7984919ea5afbabbaea3998e81756a5f564c423a312b28262a3039434e5864717d8a99a3afbbbdb2a89d9083766a605442382e23170b000000000000000000000000000000000000000000000000000000000000000006111c262f3b454d575f686d787e848a9195999c9fa3ababa39f9e9d9d9e9fa4aba8a09d9b99928f8a857f79726c655b5044372b1f12050000000000000004101c27333d474f535b606061626467696b64615a50443a3022190c0300000000000000000000000000000000000000000000000000000000000000000000010d1925303a444c52555d606162636466696b6b605d554b4035291d100400111e2b3844515e6b77849194949697999b9d9f9e9285786b5f5245382c1f12050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c12181e272e343a41454b5153575f6166686e707376787a7c7d7e7f7f807f7f7e7e7d7c7a797775726f6d6665605d56544f47433d342f271f160d040000000000000b1824313e4b5764717e8a97a4b1b4b4b4b4b3b3b1a7a09d9c9c9b9a9a99999898979798999a9c9ea1a9a8a9a7aba39f9d9998928e8a85807b746e6a615e56504a423a322b221b1209000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000810181f272f353b42464d52545c6063656c6f7375787a7c7e7f80808181807f7e7d7b797774716d6763605c544f46423b332b22191107000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2633404d596673808c94949697999a9d9f9f928679665c5044382c1f1206000000000000000000000000000000000000000000000000000000000000000009141f2933404a52585a555d606164666968605b544a3f33281c0f0300000000000000000000000000000000000000000000000000000000000000020e1a26313b454d565e61626261616060605b5f5f5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5f5f5f5f5f5c60606161626363646464605c544a3f34281c100300000000000000000000000000000000000000000000000000000000000000000000000000010b151f2b353e485055575c545c606265686a6a615e574d42362a1e1205000000000000000000000000000000000000000000000000071018202830353e434b51555d6065696e7275797b7d7e8080818180807f7e7c7a7874706d67626058544f46413a322b221b12090100000000000000000000000000000000000000000000000000000000000b161f2c3945515d67707d8a939ea8b2bcb5ab9f93877c6f685d544b433c383331363a414b55606a76828f9cabb5c0b9aca0968a7e7164584e4330261c11060000000000000000000000000000000000000000000000000000000000000000000a141d29333b454d565e666c71787e84888c90929997999a9b9c9c9c9b9a99989696918e8b86827d79726d67605b53493f33271b0f0300000000000000000b16212b353d41495053535456585a5c5e575550483e32291e100700000000000000000000000000000000000000000000000000000000000000000000000008131e28323a41464b515354555657595c5e5f53514b43392f24180d01000f1c2936424f5c697582888788898b8c8e9093999285796c5f5246392c1f130600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c151c23282f35394045464d5355565e6164676a686d6f717272737373727271706f6e686a686662605c5454524c48443d373229231d150d04000000000000000b1724313e4a5764717d8a97a4b0bdc1c1c0c0b8aca095908f8f8e8e8d8d8c8c8b8b8b8b8c8d8f9197989b9fa3abacaca9aaa29f9b97928d86817b746d68605b544c443d342d241b120900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070d151d242930363b41464a5053535b60626669686d70717273747474737272716f6d666764605d5553504a423d3631292119100700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e878788898b8c8e9092999986796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000000030d17212e3840474c4d4b515455575a5c5b53504a42382d22170b00000000000000000000000000000000000000000000000000000000000000000009141f2a333b444c52545555545454535350495251515151515151515151515151515151515151515151515252525252524b515354545555565657575753504a42382e23170c000000000000000000000000000000000000000000000000000000000000000000000000000000030d19232c363e45494a4f4a515355585b5e5e54534d453b31251a0e0200000000000000000000000000000000000000000000000000060e161e2429313a41454b5153575f6166656c6e707273737474747372716f6d676764605d55544e48443d353028201910090000000000000000000000000000000000000000000000000000000000000004101d2935404b55616c75828f96a0aab4bbafa49a91847a6d665d554e46443f4242464c525c676f7c88949fabbdb9afa59e9184786d6053463d3220140a00000000000000000000000000000000000000000000000000000000000000000000020b17212a333b444c545b60666c71777b7f8386888b8d8e8e8f908f8e8d8c8b8a8784817e7a75716d66605d55504941382d22170b000000000000000000050f19232b2f383f44464748494b4d4f514b49453e362c20170c00000000000000000000000000000000000000000000000000000000000000000000000000020c1620283035394045474748494a4d4f52524745403931281d120700000613202d394653606c787b7a7b7c7e7f818486898c86796c5f5246392c1f13060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b12181e24292e34383c4246484c5254575a565e61626465656666666565646463615e565b595653504a4745413a38322b272018120b0300000000000000000a1724313d4a5764707d8a97a3b0bdcacdcdc3b6aa9d90838382818180807f7f7e7e7e7e7f818385888b8f92999ea1a8adb2aeaca9a19e99928e87817a716c665e564e463e362d241b120900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b12181f252a3036383f44464950535559565e61636465666768676666656462605c545854514b46443f38302a251f170f070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1724313d4a56626c717b7a7b7c7e7f818386898b86796d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000050f1c262e363c3f40414547484a4d504e46443f382f261c1106000000000000000000000000000000000000000000000000000000000000000000030e18212a323b41464748484847474746443f45454444444444444444444444444444444444444444454545454545454640454647474848494a4a4b4a46443f3830261c11060000000000000000000000000000000000000000000000000000000000000000000000000000000007111a242c33393c3e43404446484b4e51514846423b33291f1409000000000000000000000000000000000000000000000000000000040c13191f282f353a4045474d5355535b60616365666767686766666462605d555753514b47433d383229251e160e070000000000000000000000000000000000000000000000000000000000000000000c18242f3943505a606d7a849198a2aab3b6aca0968f82786d675f5853504a4f4d53565e616d7983909da6b0bab1a79d93897d70665c5044382b1f12020000000000000000000000000000000000000000000000000000000000000000000000050f18212a323a424a50545b60646a6f72767a7c7e80818282838281807f7e7d7a7774726e6864605c54514b443f382f261b1106000000000000000000000711191d262d3337393a3b3c3e4043443e3d39342c241a0e050000000000000000000000000000000000000000000000000000000000000000000000000000040e161e25292f35383a3b3c3c3e404245453a39352f281f160c01000006121f2b3844505b666c6e6d6e70717374777a7c7f7e7164574a3e3124170b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c13191d23282c31373a3b4146474a4d4c525456575859595a59595857575654524c4f4c4946443f3a39352f2c27211b160c07010000000000000000000a1723303d4a5663707d8996a3b0bcc9d4c8bbaea195887b767575747473737272717172727476787b7e82868c91969ea1a8afb6b3adaba39f9a938e857e786d68605850483e362d241b11080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c14191f252a2e34383a3f4446494c4c5254565859595a5b5a5a5958575553504a4b4745413a38342e261e1a140d05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915212e3a45505a62696e6d6e7071737477797c7f7e71675d5145382c1f1306000000000000000000000000000000000000000000000000000000000000000000000b141c242b30332f35393a3b3d4043423938332d261d140a0000000000000000000000000000000000000000000000000000000000000000000000060f1820293036393b3c3b3b3b3a3a3937332d383837373737373737373737373737373737373838383838383839392e34383a3a3b3b3c3c3d3d3e3e3a38342e261e150a00000000000000000000000000000000000000000000000000000000000000000000000000000000000008121a22282d30312e34383a3b3e4144443b3a36312921170d030000000000000000000000000000000000000000000000000000000002080d161d24292f35393c424748495053555658595a5b5b5a5959585653514b4a4745403937322c272119130c040000000000000000000000000000000000000000000000000000000000000000000007121d27313e45525d686f7c869298a2a9b2b2a89e948f81796f6a63605b545b575f61686d75818e959fabb8b1a89f958e81746b60544a3f34281c1003000000000000000000000000000000000000000000000000000000000000000000000000060f1820292f383f444a5053585f6266676d6f7173747576767574737372706d686865615e5653514b454039332d261d140a000000000000000000000000070b141b22272b2d2d2e2f3134363831302d28221a120800000000000000000000000000000000000000000000000000000000000000000000000000000000040c13191d24292c2d2e2f3031333638382d2c29241d160d04000000030f1c28333f4a545b6061616163646668676d6f72716c6155493c3023170a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001080d12181c1f262b2d3036393b3d40414647494a4b4c4c4d4c4c4b4b4a49474641423f3c3a38342e2c29241e1b160f0a0400000000000000000000000a1623303d495663707c8996a3afbcc9d4c8bbaea195887b6e6968676766666565646465666769696e72757a7f848b91969fa4acb3b9b5aeaca49f97928b827a6f6a615a50483e362d23190e05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090e14191c23282b2d3337393c40414647494b4c4d4d4e4e4d4c4b4a4846443f3e3a39352f2c28231c150c0903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111d29343f4850575e61616163646667676d6f72716c62554b4035291d100400000000000000000000000000000000000000000000000000000000000000000000020b12191f232624292c2d2e313336352d2b28221c140b02000000000000000000000000000000000000000000000000000000000000000000000000060e171e252a2d2e2f2f2e2e2d2d2d2b27222b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2c2c2c23282c2d2d2e2e2f30303131312d2c28231c150c03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000810171c21232423282c2d2f323537372e2d2a251f170f0500000000000000000000000000000000000000000000000000000000000000040c13181d24292c31373a3b3f4446484a4b4d4d4e4e4d4d4c4b494745403d3a39352f2b27201b160d08020000000000000000000000000000000000000000000000000000000000000000000000010b151f2935414c565f6a707d869297a0a8afb0a69e938f837c75706c66696869696e737a828e939da7b1afa7a0969083796d60594f42382e23170b0000000000000000000000000000000000000000000000000000000000000000000000000000060e171d262d33383f44464e5355555d6062646667686969696867666563615d565854524c46454039352f27221b140b0200000000000000000000000000020a11171b1f202021232527292b2423211d17100800000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d12181d1f202122232426292b2c20201d18120c0400000000000b17222d38424a5053555455565859555d60636564615a5045392d211408000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c10141a1e21252a2d2e313035393a3c3e3f3f4040403f3f3e3d3c3b393630332f2d2b2823201d19130f0b0400000000000000000000000000091623303c4956636f7c8996a2afbcc9d4c8bbaea195887b6e625b5b5a5a595958585858595a575f6165686d72797e848d939aa1a9b1b9bbb6afa9a29e948f847c716c615a50483e352b20170c0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080e11171c1f22272b2d2f3035393a3d3e3f40414141403f3f3e3c3a38342e2d2c29241f1c17110a0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c18222d363f454d52545455565859555c60626564625a5043392f24180c00000000000000000000000000000000000000000000000000000000000000000000000001080e131719181d20212224272928201f1c17110a020000000000000000000000000000000000000000000000000000000000000000000000000000050d14191e2021222221212120201f1b171e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1f1f1f1f1f181c1f20212122222323242424201f1c17110a03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050c11141717181c1f202225282b2b21211e1a140d0500000000000000000000000000000000000000000000000000000000000000000001070d13181d20262b2d2d3337393b3d3f4040414141403f3e3c3a39352f2d2c29241d1b150f0a040000000000000000000000000000000000000000000000000000000000000000000000000000030d19242f3a444e58606b707d8591969da5abafa59e959187827d7977757576787b80848f949da5afaba59d9590847a6e675c51473d30261c1106000000000000000000000000000000000000000000000000000000000000000000000000000000050b141c22282d33383c4347484b515355585a5b5b5c5d5c5b5a59585754524c4b4746413b38342e29241d17110a0200000000000000000000000000000000060b0f1213141516181a1c1e181714110c0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c101314141516171a1c1f1f1413100d070100000000000006111c262f383f4446484748494b4c4b51535659575550483e33281c1105000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004090e1214191e20212425292d2e2f31323233333332323131302e2d2a252623201f1c1713110d08010000000000000000000000000000000916222f3c4955626f7c8895a2afbbc8d4c8bbaea195887b6e62554e4d4d4c4c4b4b4b4b4c4e4d5355565e61666d7179808891979fa7b0b8c0bbb3ada69f9691877e716c615a50473d33291e150a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b1012171b1f202225292d2e30313233343534333332312f2d2c282321201d1813100c060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111b242d333b4246484748494b4c4b51535658585650483f31271d1207000000000000000000000000000000000000000000000000000000000000000000000000000003070b070d11131415171a1d1b13120f0b06000000000000000000000000000000000000000000000000000000000000000000000000000000000002080e11141415151514141413120f0b121111111111111111111111111111111111111111121212121212070c1013131414151516171718171312100c060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004080a070c10121315181b1e1e1514120e090300000000000000000000000000000000000000000000000000000000000000000000000001070d11151a1e2122272b2d2e303233343435343333312f2d2c292420201d18120f0a04000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e28323c464f59606b707c848e939da0a7aba8a09a938f89868482828384878c91979ea6aca7a09d938e837a6e685e554b40352c1e140a0000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171c22282b31373a3c404547494b4d4e4f4f504f4e4d4c4b4a4746413f3b3936302c28231d18120b0600000000000000000000000000000000000000000305060708090b0d10110b0a080500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000406070809090b0d0f1212070604010000000000000000000a141d262d3338393b3a3b3d3e40404547494c4a49453e362c22170c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205080d11141417191d202123242526262726262524242321201e1919161312100b06040100000000000000000000000000000000000915222f3c4855626f7b8895a2aebbc8d4c8bbaea195887b6e6255484140403f3f3e3e3f3f414246484c52545c60676d747d8590959fa6b0b8c2beb9b0a8a19992877e716c61594f453b30261c11060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060b0f121316191d2021232526262728272726252422201f1c171413110d07030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b212930363a3b3a3b3d3e40404547494c4b49453f362d1f150b0100000000000000000000000000000000000000000000000000000000000000000000000000000000000001040607080a0d100f0606030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205070809080808070706050300000504040404040404040404040404040404040505050505050506000004060707080809090a0a0b0b0706030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040607080b0e111108070502000000000000000000000000000000000000000000000000000000000000000000000000000000000104090e1214171b1f2022232526272828272626252320201d181413100d070100000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c16202a343d474f59606a6e7a818990959c9fa6aca49f9c9892918f8e9091939a9ea1a9a7a09d95908a81796d685e564d43392f231a0c0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b11171c1f262b2e2f35383a3c3e4041424343424140403f3d3a3935302e2d2a251f1c18120d070100000000000000000000000000000000000000000000000000000000010305000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003050500000000000000000000000000020b141c22282b2d2e2e2e30312f35393a3c3f3e3c39332c241a1005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001050708080d11131416171819191a1919181817161414110e08090706030000000000000000000000000000000000000000000815222f3b4855626e7b8895a1aebbc8d4c8bbaea195887b6e6255483b333332323131323331363a3b41464a51555d606b6f7b838f949fa6b0b9c3c2bab2aba39993877e716b60574d42382e23170c02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030506080d1113141618191a1a1b1b1a191817151312100c0606040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090f171f252a2d2e2e2e30312f34383a3c3f3e3d39342d241b0d0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000206060b0f12131517181a1a1b1b1a1a1918161413100d0706040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d18222b353d474f585f676d747d838a8f94999c9fa3aaa39f9d9c9b9c9e9fa4a39f9d9995908a837d746d675e564d443b31271d110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f151a1f2124292c2d2f3133343536363635343332302e2d292421201e1914100c070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171c1f20222122232524292c2d303231302d28221a1208000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001050707090b0c0c0d0d0d0c0c0b0a090807050200000000000000000000000000000000000000000000000000000815212e3b4854616e7b8794a1aebac7d4c8bbaea195887b6e6255483b2f26262525252526262a2d30363940444b515960696e79828f949fa7b1bbc5c4bdb5aba49993877d70695e544a3f34281f140900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010507070a0b0c0d0e0e0e0d0c0c0b0907060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d141a1e20212122232523292c2d2f3231302d29221b1209000000000000000000000000000000000000000000000000000000000000000000000000030506070808090908080706040000000000000000000000000000000000000000000000000000000000000000000000000002070b0d0d0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0e0908060300000000000000000000000000000000000000000000000000000000000000000004060708090a0a090808070604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030506080a0c0d0d0e0e0e0d0c0b0907060401000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000071019232b353d464e555d606b70787d83888c909299989a9b9c9c9c9b9a99989992908c89837d77706b605d554c443b32291f150b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a0f1215181d1f202225272828292a29282726252421201d191414110e0804000000000000000000000000000000000000000000000003060707060400000505040404030302020202020202020202020202020202020203030303030304040404040404050505050505050606050000000000000000000000000000000000000000000000000000000000000000000000000000060b0f12131514151618181d202023262423211c171008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7d4c8bbaea195887b6e6255483b2f221918181818191a1e21252a2e343a40454f575e676d79828f95a0a9b3becac6bdb5aba49992857b6e665c50443b30251a0e0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e12141514151618181c1f2023252524211d1711090000000000000000000000000000000000000000000000000000000000000000030607060b0f1213141415161515141313100c0707070501000000000000000000000000000000000000000000000000000000000000080e1317191a1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1b1615130f0a040000000000000000000000000000000000000000000000000002050708070c101314151617171615141313100c070b0806050300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000071119232b343c434c515960656c70767b7f8386898b8d8e8f8f8f8e8d8c8b8a8683807c78706c636159514b433a322920170d030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306070c10131416181a1b1c1c1d1c1b1a1918171413110d080705020000000000000000000000000000000000000000000000060b1012131313100c07121111111010100f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f101010101010101111111111111112121212121212120a0907040000000000000000000000000000000000000000000000000000000000000000000000000306060807080a070d1013141619171714110c050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040607090b0d0f1011111110100f0d0b09060503000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a8794a0adbac7d3c8bbaea195887b6e6255483b2f22150c0b0b0c090e1214191c23282f353d454d555d676d79839097a1adb9c1cdc7bdb5aba1979082786d60574d42362a20150a000000000000000000000000000000000000000000000000000000000000000406070708090a0a09080807060401000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030506070603000002010000030506070604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205070807080a070c1013141619181715110c0600000000000000000000000000000000000000000000000000000000000003060b10121316171b1f2021212222222221201f1c18171413110d08050100000000000000000000000000000000000000000000000000020a12191f2326272929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292822221f1b150f070000000000000000000000000000000000000000000305090e12141517181d1f2021222323232221201f1c181a181513120f0b06060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004060707080909080707060400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081119222a313a41454f535b6064696e73767a7c7e80818283838281807f7d7a7673706c65615a554f454039312920170e050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040607090b0d0e0f10100f0e0d0d0c0a0707050100000000000000000000000000000000000000000000000000020a11171c1f20201f1c181f1e1e1e1d1d1d1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1d1d1d1d1d1d1d1e1e1e1e1e1e1e1f1f1f1f1f1f171614100b0500000000000000000000000000000000000000000000000000000000000000000000000000000000000001040607090c0b0a08050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105070c10121316181a1c1d1d1e1e1d1d1b1a181513120f0b0604010000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0adbad1dcc8bbaea195887b6e6255483b2f221508000000000205080d12181d2429333b434b555d676e7b85929ea5afbbc5d0c7bdb3a99f948c7f73695e52463c32271b0f020000000000000000000000000000000000000000000000010407070a070c10121314151616161615141413100d070b0907060400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f12131312100c060f0e060b0f12131313100c070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040607090c0b0b0805010000000000000000000000000000000000000000000000000000000000060b0f12171c1f202322272b2d2d2e2f2f2f2e2e2d2c28232421201d1913110d080200000000000000000000000000000000000000000000000a141c242a2f3334353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535352f2e2b2720191007000000000000000000000000000000000000060b0f12131a1e21212424292c2d2e2f30302f2f2e2d2c2823272422201f1b1715120f0a05010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001040607090c070c1012131415151615141312100c070b0907060400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f181f282f353d41495053575f6166676d6f71737575767675747372706d686663605b535048443e352f271f170e050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c141c23282b2d2d2c28232c2b2b2a2a2a292929292929292929292929292929292929292929292929292a2a2a2a2a2a2a2b2b2b2b2b2b2b2c2c2c2c2423201c1610080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d1113181c1f20232527292a2a2b2b2a2928262522201f1b1713110d0701000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0b5bfcbd7c8bbaea195887b6e6255483b2f2215080000000000000000070c131820293139434b555f69707d8a939ea9b3bec9d0c5bbb0a69f92867b6e61584e43372b1e130800000000000000000000000000000000000000000104080d1113141619181c1f20212222232322222120201d181a18151313100c07040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171b1f20201f1c171c1c1b1c171b1f20201f1c18120b0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c11171c1f23282b2d302d3337393a3b3b3c3c3b3b3a38342e312e2d2a25201e19130f0903000000000000000000000000000000000000000006101c262e363b3f40424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242413c3b37322b22190f04000000000000000000000000000003090e11171b1f20252a2d2e312f35383a3b3c3d3d3c3b3b3a38342e34312f2d2b2722211f1b15110d080200000000000000000000000000000000000000000000000000000000000000000000000000000000000206080d11131416181b181c1f20212122222221201f1c181b18161313100c07050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d161e24292f383f44464d5355555d60636567686969696867666563605d5656535049413e383329241d150d050000000000000000000000000000000000000000040607060400000303000004060706040000000000000000000000000000000000000406070604000003000003060706060300000000000000000000000000000000000000000000000000000000000000060f181e262e34383a3a38342e38383837373736363535353535353535353535353535353535353636363636363737373737373738383838383838393938302f2c28211a110800000000000000000000000406070604000003000003060607060300000000000000000000000000000004060706060300000300000406070604000000000000000000000000000000000306070706030000030000040607060400000000000000000000000000000000000000000000000000000000040a0f13191d2023282c2d2f3234353637373737363533312f2d2b2722201d18130f0a0300000000000000000000000000000000000000000000000613202d394653606c798699a3aebbc7d3c8bbaea195887b6e6255483b2f22150800000000000000000001070e171f273139434d57616b74818e97a1adb9c4cfcdc2baaea2988e81746a6054473a3025190d01000000000000000000000000000000000001080d1113191d2021232623282c2d2e2e2f30302f2f2e2d2c2924272522201f1c1813110d080300000000000000000000000000000000000000000000000000000000000000000000000000000000030b141b22272b2d2d2c28232928282922272b2d2d2c28231d150c0900000000000000000000000000000000000504040300000406070604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b12181c22282b2e34383a3c3f3f444647474849484847464540413e3a3936302d2a251e1a150d08020000000000000000000000000000000000030e18222e3840474b4d4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4e4947433c342b20150a000000000000000000000000040a0f141a1b22272b2d31363a3b3e4140454748494a4a49484746454043413e3b3937332d2e2b26201d19130e09030000000000000000000000000000000000000000000000000000000000000000000000000205090f1214191d202123252723282c2d2e2e2f2f2e2e2d2c2823272522201f1c1814110e0904010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c13191d262d33373c4246484b515356585a5b5c5c5c5b5a59585754524c4946443f382f2c282118120b0300000000000000000000000000000000000000070c10121312100c070f0f070c10131313100c070000000000000000000000000000070c10121312100c070f060c10121313120f0b0600000000000000000000000000000000000000000000000000000000030e18212a30383f444646454045454544444443434342424242424242424242424242424242424242434343434343434444444444444445454545454545453d3c38332c231a10050000000000000000070c10121312100c070f060b0f12131312100c060000000000000000000000070c10121313120f0b0610070c10121312100c07000000000000000000000000060b1012131312100b060f070c10121312100c07000000000000000000000000000000000000000000000000040a0f161b1e252a2d2e34383a3c3e404243444444434342403e3c3937332d2c29241d1b150e090300000000000000000000000000000000000000000005121f2b3744505b657986929facb9c5d2c8bbaea195887b6e6255483b2f2215080000000000000000000000050d151f28313b454f59616d7a85929ea8b2bdc9d5cabfb4aa9f93877c6f62564c41362a1d1105000000000000000000000000000000040a0f13191d2024292c2d30322e34383a3a3b3c3d3d3c3b3b3a39352f34312f2d2c2823201d19130f0b0600000000000000000000000000000000000000000000000000000000000000000000000000030d151d262d3337393a38342e363534352d3337393a38342e271e1b1209000000000000000000000002060a0c0c11111010070c10131313100c07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d151d24292d3338393f4446494c4950535454555555555453514b4d4a4746413a3936302b262019130d05000000000000000000000000000000000a15202a34404a52585a5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5b55544e463c32271b0f0300000000000000000003090e151b1f262b2d3337393c4246484a4d4b51535455565656555453514b504d4b4846443f3c3a37312d2a251e1a140d0801000000000000000000000000000000000000000000000000000000000000000002090e11151a1f2124292c2d3032342e34383a3a3b3c3c3b3a3a38342e34322f2d2c2823201e1914110d07010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001080b141b22272b31373a3b404547494b4d4e4f50504f4e4d4c4a4745413d3937332d261d1c160c0701000000000000000000000000000000000000030b12181c1f201f1c181d1c1c1c181c1f201f1c18120b0300000000000000000000030b12181c1f201f1c181c1c1c171c1f20201f1c17110a0200000000000000000000000000000000000000000000000000000915202a333c424a505353514b52525151515050504f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f50505050505050515151515151515252525252524a48443e352c21160b000000000000030b12181c1f201f1c181c1c1c171c1f20201f1c17110a0300000000000000030b12181c1f20201f1c171c1c1d181c1f201f1c18120b030000000000000000020a11171c1f20201f1c171d1c1d181c1f201f1c18120b03000000000000000000000000000000000000000001080d151b21272c3036393a404446494b4d4f5050515150504e4d4b4846443f3a39352f2b26201a150c070000000000000000000000000000000000000000030f1b27333f495f6c7985929facb8c5d2c8bbaea195887b6e6255483b2f221508000000000000000000000000030d161f29333e46525d68727f8c96a1adb9c6d0d0c6bbafa49a8e8175685e5246392d20150a0000000000000000000000000002080d151b1e24292c2f35393a3d3f42404446474849494949484747454043403e3c3a38342e2c29241f1c17110b0600000000000000000000000000000000000000000000000000000000000000000000010b151f272f383f444646443f4443424142433f444646454039302d241b1006000000000000000000070d121618191e1e1d1d1c181c1f201f1c18120b060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d14191f272f35383f44464a50535659535b6060616262626161605c555a5754524c4746413a37312a251e170e060000000000000000000000000000030f1b26313c46525c6467686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686260584e43372b1f13060000000000000000070c141a20262b3137383f4446494d5354575a555d6061626363626261605c555d5a57555350494847433c3936302a251f19130c04000000000000000000000000000000000000000000000000000000000001080d141a1e20262b2e2f35393a3c3f414340444647484849484746444043413e3c3a38342e2d2a25201d18130b060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171b1f262b2d2f35393a3c3e40424243434241403f3d3a39352f2d2b27221b140b0b0500000000000000000000000000000000000000080c151c23282c2d2c28232929292923282c2d2c28231d150c0700000000000000020a0c151c23282c2d2c282329292923282c2d2d2b28221c140b02000000000000000000000000000000000000000000000000020f1a26313c464e545c60605c5f5f5f5e5e5d5d5d5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5d5d5d5d5d5d5d5e5e5e5e5e5e5e5f5f5f5f57554f473e33281c1004000000040c0c151c23282c2d2c282329292922282b2d2d2c28231c150c050000000000070c151c23282c2d2d2b282229292a23282c2d2c28231c150c08000000000000060c141c23282b2d2d2b282329292a23282c2d2c28231c150c09010000000000000000000000000000000000040c131920272b32383a4146474a515356585a5c5d5d5e5e5d5c5b5958555350494745413a37312b261f18120b03000000000000000000000000000000000000000b17222d45525f6b7885929eabb8c5d1c8bbaea195887b6e6255483b2f22150800000000000000000000000000040d17212935414c56606d7984919eaab4bfcad6ccc0b6ac9f92867a6d6154473c31261b0f030000000000000000000000040c131920262b2f35393a414547494c4e4a5153545555565655555453514b4f4d4b484645403a3935302b28221c17110a02000000000000000000000000000000000000000000000000000000000000000007121d2731394149505353504a504f4f4e4f5049505353514b423e362d22170c00000000000000010a11181e2225262b2b2a292923282c2d2c28231d17110a020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070e171e252a313940454a5053545c60636668656c6d6e6e6f6f6e6e6d67696764615e5654524c47433c3630292017110a0200000000000000000000000006121f2b37434e58646e73757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575746f6a6054473b2e221508000000000000030b12181f252a32373c424649505356575e6164676a676d6e6f70706f6e6e6d676b6a676462605b5355534e4746413a363129241e160d06000000000000000000000000000000000000000000000000000000070c13191f252a2d31373a3b414547494b4e504a515354545555555453514a504e4b494645403b3a36302c29241d17110a020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f141a1e2124292c2d3032343536363635343332302d2c2924201f1b17110a02000000000000000000000000000000000000000008111a1e272e34383a38342e363636362e34383a38342e271e1910070000000000000a141c1e272e34383a38342e3636362e34383a3938332d261d140a00000000000000000000000000000000000000000000000006121f2b37434e585f666d6d666c6c6b6b6b6a6a6a69696868686868686868686868686868686868686969696969696a6a6a6a6a6a6a6b6b6b6b6b6b6b6c6c6b6361594f44382c2014070000020c161e1e272e34383a38342e3636362d3338393a38342e261e160e050000000711191e272e34383a3938332d3636372e34383a38342e271e1a110800000000060f181e262e34383a3a38342e3636372e34383a38342e271e1b130900000000000000000000000000000000060d161e242932373d43484c5254545c6062656768696a6a6a6a6968666462605b5354514b47433c373128231d150c05000000000000000000000000000000000000121f2b3845525e6b7885919eabb8c4d1c8bbaea195887b6e6255483b2f2215080000000000000000000000000000060f1924303a45515c67727f8b98a2aebac7d3d2c7baaea3998c7f7266584e43372b1f120600000000000000000000070e161e242931373a4145474c525456595b545c606161626363626261605d555c5a585553514b4745413a38332d27221b140b07000000000000000000000000000000000000000000000000000000000000000c18242f39434b535b60605c545d5c5b5b5c5d535b60605c5450483e34291d11050000000000000a131c232a2e323338373736362e34383a38342e28221c140b02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081019202930363e434b51545b6063666d6f727577797a7a7b7c7b7b7a79787674716d6865615e56534e46413a3228231c140c0300000000000000000000000815212e3a47535f6a7380828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282817c6f6255493c2f2216060000000000030c151c232831363c43474d53535b606367696e717477797a7b7c7d7d7c7b7a7979787674716e6c6566625f5854524c46423b352f281f17110a020000000000000000000000000000000000000000000000030b12181e242930363a3c4347484c515456585a5d545c60616162626161605c545d5a585553514b4746423b39352f28231c140c0801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e1214181d202023252728292929282726252421201d1913120f0b0600000000000000000000000000000000000000000005101a232c30394044464440434342424343404546454039302b22190f040000000008121c262e3039404446444043434242433f444646443f382f261c110600000000000000000000000000000000000000000000000814212e3a47535f6a6e787979797878787777777676767575757575757575757575757575757575757576767676767676777777777777777878787878787878706b6155483c2f23160900000a141e28303039404446444043434242433f444646443f38302820160c0200040f19232b303940444646443f4443434344404446444039302c241a10050000030e18212a30383f444646443f4443424344404446444039302d251b110600000000000000000000000000000810181f282f353d43474f54565e6165666d6f7173757677777776767573716f6c6564605d55534e47423c342e271e170f070000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f22150800000000000000000000000000000008131e2934404b55606d7a86929facb8c5d0d7cbbfb4ab9e9184776a5f53473a2e211507000000000000000000081119202830353c43474c5254565d606365686a666d6d6e6f70706f6e6e6d676b69676462605c5454524c46443f38332d261d191107010000000000000000000000000000000000000000000000000000000004101d2935404b555d656c6d666b6a69686768696a656c6d66625a5045392d211508000000000007111c252e353a3e3f444443434243404546454039332d261d140a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008121a232b323b414650555d60666c7075797c7f81838587878888888887868482807d7a77726d68625f58524c443e342e261e150d03000000000000000000000915222f3c4855626f7c888f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8e8276695c4f432d22170b00000000000b151e272e343b42464e53575f61656c6f74787b7e808385868788898989888786858583807e7b7976736f6a66615e56534d45413a3127221b140b03000000000000000000000000000000000000000000060c151d23282f353b4246474e5355555d60636567696b666d6d6e6f6f6e6d6d666b6a676562605c5454524d4745403a342e261e19130c040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205070d11131416181a1b1c1d1d1c1b1a19171413110d08050300000000000000000000000000000000000000000000000b17222c363e424a5153514a50504f4f4f504b5153514b423d342b20160a000000020e19242e3840424a5153514a504f4f4f504a505353504a42382d22170b00000000000000000000000000000000000000000000000815222f3b4855626e7c8586868685858484848383838282828282828282828282828282828282828282828283838383838383848484848484848585858585857d7063574a3d3024170a0004101b26303a42424a5153514a504f4f4f4f4a505353504a423a32281e1308000b16212b353d424a515353504a504f4f50514a5153514a423e362c22170b000009141f2a333c424a505353504a50504f50514a5153514a423f372d23180d0100000000000000000000000009121a222a313a41454e54596063686d7276797c7e808283838484838381807e7b7975716d67625f58534d45403930292119100700000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f221508000000000000000000000000000000020c18232f3945525d6874818e9baab3becad6d1c6b9aca096887b6f6255483c2e23180c000000000000000008111a232b323a41454e53565d6065686d7072757779797a7b7c7c7c7c7b7a7a79787673716f6d6664605d5653504a443f382f2b2318120b0300000000000000000000000000000000000000000000000000000006131f2c3845515d676d7879787877767574757677787979716c6256493d3024170a00000000020d18232e373f464b4c515150504f504b5153514b443f382f261c110600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008121a242c353d444c525a61676d72787d8285898c8e90929894959595949a93918f8d8a87837f7a756e6a615e5650443f3830271f150c030000000000000000000a1724313d4a5764707d8a979b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9083776a53493f33271b0f0300000007121c27303940444d53585f62696e73787c8184878a8d90929894959696959594989291908d8a888583807c77736d68615e57514c433d332d261d150d0300000000000000000000000000000000000000080f181e272e343a41454d5254585f6266676d6f7274767879797a7b7b7c7b7a7979787674716f6d6665615e5653514b443f383029241e160d06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001040607090b0d0f0f10100f0e0d0c0a070604010000000000000000000000000000000000000000000000000004101c28333e4850545c605c545d5c5c5c5c5d545c605c544e463d32271b0f03000007131f2a36404a52545c605c545d5c5c5c5c545c60605b544a3f33281c0f03000000000000000000000000000000000000000000000b1724313e4a5764717d8a979392929291919090908f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f90909090909090919191919191919292928b7f7265584c3f3225190c000915212c38424c54545c605c545d5c5c5c5c545b60605c544c443a3025190d030f1b27323d474f545c60605b545d5c5c5d5e545c605c5450483e33281c1004020e1a26313c454d545c60605c545d5c5c5d5e545c605c5451493f34291e1206000000000000000000000009121b242c343c434c515860626b6f757a7f8285898b8d8f90909191908f8e8c8b8885827e7a746f6a615f57514b423b332b22191107000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f2215080000000000000000000000000000000007121d2935414c5663707d8998a2aebac6d3d5c9bdb2a8988c7f7265554b4034281c100400000000000008111a242c353d444c52585f62686d71767a7c7f81848586878888898988888786868582807e7c7975716d6864605b545049413d3529241d150d0300000000000000000000000000000000000000000000000000000714202d3a4753606d7984868584838282818283848586867e7164584b3e3125180b0000000006121e2a353f495157595e5e5d5c5c5d555c605c55504a42382d22170b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008111a242c363e474f565e616c71797f848a8e9297999b9d9fa2aaa1a2a2a1a49f9e9c9a9a93908c86817b746d68615a504a423931271e150b0000000000000000000b1824313e4b5764717e8a97a7a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a89e918477655b5044372b1f12050000000c18232e39424a51575e616a6f767b8084898e9196979a9d9fa2aaa2a3a3a2a1aaa39f9e9d9a9797928f8c88847f7a746e69605d554f443f382f271f150c03000000000000000000000000000000000008111a212a303940454c52575e61666a6e73777a7c7e818385858687878888888786858583817e7c7976726e6964605d55504a423d352f281f180f06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814202d3944505a61666d666a6969696969696a666d6660584e43382b1f130600000b17232f3b47525c64666d666a69696969696a666d6c665b5044382b1f1206000000000000000000000000000000000000000000000a1724303d4a5763707d8a969f9f9f9e9e9e9d9d9d9c9c9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9c9c9c9c9c9c9d9d9d9d9d9d9d9e9e9e9e9e9e9e9f978a7d7064574a3d3124170a000d1925313d49545e65666d666a696969696969666c6d665e564c41362a1d110713202c38444f5960666d6c666b6a69696a6b6b666d66615a5044392d20140805121e2b37424d575f666d6d666b6a69696a6a6b666d66625b51463a2e2215090000000000000000000008121b242d363e464e555d606a6f767c82868b8f9298989a9b9c9d9d9d9d9c9b999797928f8b86817c756e69605c544d453d342b231910070000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f22150800000000000000000000000000000000010d1924303a4653606d7985929fabb8c5d2d9cec2b5a99c8f8276675c5145382c1f13060000000000050e1a242c363e474f565d606a6f757a7e8386898c8e90929894949596969595949993918f8d8b8886827e7a76716c66605b534f473f352f271f150c03000000000000000000000000000000000000000000000000000915222f3c4855626f7b88969291908f8e8e8f909192928e8175685b4e4235281b0f000000000a16222e3a46515b63666b6a6a69696a6b676d67605b544a3f33281c1106000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050f19232c363e48505960686e767e848c91969b9fa2a9a79f9d9997969596979a9ea1a8aca49f9d99928e87817a716c605c544b433930271d12070000000000000000091623303c4956636f7c8995a0a7b1b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5ac9f9286796c605346392d201306000004101c2834404a545c60696e747c82888c91969a9ea1a8a7aaa9a8a7a6a7a8a9abadaeacaba9a7a9a29f9c9996918c86817b736d6760595049413931271e150b0200000000000000000000000000000008111a232c333c434b51565d60696e73777b7f8487898b8d90919298949495959494989291908d8b8886837f7b76716d67605c544f45413a312a211810060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060707060300000000000000000000000000000000000000000000000000000000000000000000000a1623303c4955616c707979777676757576767779796f6a6054473b2e22150800000d1926333f4b58646e737978777676757576767879786c605346392d201306000000000000000000000000000000000000000000000a1623303d495663707c8996a3acabababaaaaaaa9a9a9a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a9a9a9a9a9a9a9aaaaaaaaaaaaaaabababababa295887c6f6255493c2f221609000f1b2835414e5a6570767978777676757576767779796d685e5246392d20130915222f3b4854606b6f797978777776767677787979706c6155493c3023160a0714212d3a46535f696e787978787776757677787979726d62564a3e3124180b00000000000000000007101a242d363f4850585f676d747c83898f92999c9fa2aaa39f9e9c9b9b9c9ea1a9a9a29e9b98928e87827b736d665e574e463d352b22190f0500000000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f221508000000000000000000000000000000000008131f2c3845515c6675828e9ba8b5c1d1dcd2c5b8ac9f9285796d6053463a2d20130700000000020d17202c363e48505960686d747c82868b90939a989b9b9993918f8e8d8c8d8e8f9093999a9a9798928f8b86827e78716c6560595145403931271e150b000000000000000000000000000000000000000000000000000815222e3b4855616e7b88949f9e9d9c9b9a9b9c9d9e9a8e8174675b4e4134281b0e000000000c1825323e4b57636d72777776767576777979766c665b5044382e23170c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c17212b353e48505a616b6f7a828a91969ea0a8aba49f9b95908c8a8988898a8d91969ea0a8acaba39f99938e857e746d665d554b42392e23180f05000000000000000613202d394653606c78839095a0a7b0b8c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2baaea399877a6e6154473b2e211408000006121f2c3844515c666d737b81878f94999ea1a8abababa39f9d9b9a9a9a9b9c9ea1a8a7abadb3b3adaba9a8a09d98928e86807a706b605b534b433930271d140a000000000000000000000000000007101a242c353e454d555c60686d737b8084888c909596989a9c9e9fa3aaa1a2a2a1aaa29f9e9d9a989992908c87827e7a726d666059524c433c332a22180f060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010406070a060c1012131312100b060b09080603000000000000000000000000000000000000000000000000000000000a1724313d4a5764707e8685848383828282838485867c6f6256493c2f23160900000d1a2734404d5a677380878584838282828383848683776a5e5144372b1e1104000000000000000000000000000000000000000000091623303c4956636f7c8996a2afb8b8b7b7b7b6b6b0aaa9a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a6a6a7a7a8a8a8a9a9aaaaabacafb5aeafb0aea194887b6e6155483b2e22150800101c2936434f5c6976828685848382828282838486857a6d6154473a2e2114091623303c4956636f7d8686858483828283848586867e7064574a3d3124170a0815222e3b4855616e7b8586858483838283848586867f7265584c3f3225190c0000000000000000040e19232c363f48505a616a6f7a818790949b9fa3aba49f9c999291908e8f909297999ea2a9aaa29f9a938f8680796e6960584f473d342b21170c02000000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f221508000000000000000000000000000000000004101c2834404b5465727e8b98aab4bfcbd7d3c6baaea298897c6f6256493c2f2316090000000008141e29323e48505a616b707a80878e92989c9f9f98928e8a86848281808080818283868a8e92989f9f9c99928f8a847e78706b625b514b433930271d12070000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1abaaa9a8a7a8a9aaa79a8d8074675a4d4134271a0e000000000c1926333f4c5966727f84848383828384858682786c60544a3f34281d1207000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a151e29333d47505a616c717d858f949ea1a8aca9a199938e8983807d7c7c7c7e80848b91969ea5afafaba49f97928a80786d675d544b40342821170b0200000000000005121f2b3744505b656e7b8390959fa6b0b8c1c9c7c0bbb9b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b8b8b9bbbfbababbbbbcbdbebfc0c1bfb4ab95897c6f6256493c2f23160900000713202d3a4653606d7880868e93999fa6abacaaa29f9a9992908e8d8d8d8e8f9196969a9ea1a9acb2b8b6b2acaaa29f98928d847d736c655c554b43392f261c1106000000000000000000000000050e19222c363e474f575f676d727a80868c9195999da0a7a5a7a9aba39f9d9c9b9b9c9d9ea1a9a8a7aba39f9d99938f8b857f78706b605d564d453c342a21180d04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070d101314171b171c1f20201f1c171b181515120f0a0603000000000000000000000000000000000000000000000000000d192633404c5966737f8c9291908f8f8f8f9091928a7d7064574a3d3124170a0000101d2a3743505d6a7683909290908f8f8f8f90919285796c5f5246392c1f13060000000000000000000000000000000000000000000916222f3c4955626f7c8895a2afbbc5c4c4c3bbb0a69f9c98989898989898989898989898989898989999999a9a9b9b9c9c9d9d9e9f9fa4a1a2a2a4a5a296897c6f6356493c3023160900121f2c3945525f6c7885929290908f8f8f8f909192887b6e6155483b2e22150c1926323f4c5965727f8c939291908f8f909192928d8074675a4d4134271a0e0b1724313e4a5764717d8a939291908f8f909191928f8175685c4f4235291c0f00000000000000020c16202b353e48505a626c717c848d93999fa6aca8a09a938f8a86848381828385888c92979fa4acaca49f98928c837b6f6a60594f463d33291e140a000000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f2215080000000000000000000000000000000000000c18232e3c4955626f7c8898a3aebac7d3d6cabfb4aa978b7e7164584b3e3125180b000000020e1925303b44505a616c707d858d92999fa3a299928d86817d7a7776747373737475777a7d81868d9298a0a39f9c95918a837d726d605d554b43392e23180f0500000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0b5b6b5b5b4b5b6b3a6998d8073665a4d4033271a0d000000000c1925323f4c5865727f8b91908f8f909192948a7e71665c5044392e23180c01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c26303b454f59616c717e8791979fa6adb1a7a0979187827c7673716f6f707173797e848e939da5afb5afa9a19e928d82796d665c51453f33291d140a000000000000030f1b27333f49535e696e7a8390949fa6afb7c1bdb5afacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababacaeb5adaeaeafafb0b1b2b4b5b6b1a4978a7e7164574b3e3124180700000b1724313e4a5764717d8a92989fa4abb0a9a29f98928e8986838281808181828487898d92979da0a8aeb4bdb8b4aeaaa39f96918880776d675c554b42382d22170c0300000000000000000000020d17202b343e48505961696e797f858d92989da0a7aaacada9a19e9a999291908e8e8f909297979b9fa3aaacaba49f9c97928b837d756d685f574e463c332a1f160c01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d12181d2020242823282c2d2d2b2823272522211f1a15120f0a0400000000000000000000000000000000000000000000000c1926333f4c5966727f8c999d9c9c9c9c9c9c9d96897d7063564a3d3023170a0000101d293643505c6976838f9c9d9c9c9c9c9c9d9e9285786b5f5245382c1f12050000000000000000000000000000000000000000000815222f3b4855626e7b8895a1aebbc8d1d1c3b7aa9f948f8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8c8c8d8d8e8e8f8f8f90909192939994959697989a978a7d7164574a3e3124170b00121f2b3845525e6b7885919e9d9c9c9c9c9c9c9e94877a6e6154473b2e21140c1825323f4b5865727e8b989f9e9d9c9c9d9e9e998d8073665a4d4033271a0d0a1724303d4a5763707d8a969f9e9d9c9c9d9d9e9b8e8175685b4e4235281b0f0000000000000008131e28323d47505a626c717e8691969fa4abb0a69e969187827e797776757576797b80858d939aa3aaafaaa39f9590857d706b60584e453b30261c11060000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f2215080000000000000000000000000000000000000713202d3a4653606d7986929facb9c5d2dbd0bfb3a6998c807366594d4033261a0d00000005111e2a36414c56616c707e8692979fa3aaa2979287807a74706d6769676766676869686d70747a808690959ea6a7a09d9590877f756d675d554b40342821170d02000000000000000000000000000000000000000000000713202d3a4653606d798699a3afbbc2c1c1c2bfb2a6998c7f7366594c403326190d000000000714202d3a4753606d7984919d9c9c9d9e9f9e9184786d60554b4034281d120700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c17232e38424d57606b717e879299a1a9b0b2a8a09590857c756f6a666463626364666d7178818e939da7b1bbb3ada49d948f82786d605a50453b2f261c11060000000000000b17222d38414d565e686d79828f949ea5afb7b5aba39f9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9e9e9f9fa3a0a0a1a1a2a3a4a5a6a7a8a9aba6998d8073665a4d402e23180c0000091623303c4956636f7c8998a2aaafafa69f97928c85817c7976757473747576787a7d81858a91969fa3abb2babfbab4aea8a19a938d81796d675c544a3f33281e150b0000000000000000000008141f29323d46505a616b707b838c92979fa2aaacb1afa9a19e97918d8a8684838281828385878a8e92989fa2a9afaca9a29e959089817a6e695f584e453c31281d120700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050c13191d24292c2d31342e34383a3a38342e34322f2e2b26211f1b15100b040000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5a9a9a8a8a9a9a296897c6f6356493c3023160900000f1c2936424f5c6975828f9ca8a9a9a8a8a9a99e9184786b5e5145382b1e12050000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4cfc2b5a99c8f827f7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7f7f80808081818282838384848586878788898a8c8d8e8b7f7265584c3f3225190c00111e2b3844515e6b7784919eaaa9a9a8a8a9a9a093877a6d6054473a2d21140b1825313e4b5864717e8b97a4aaaaa9a9a9aaa6998c7f7366594c403326190d0a1623303d495663707c8996a3abaaa9a8a9aaa79a8e8174675b4e4134281b0e000000000000010d1925303a444f59616c717e879298a0a8afb0a69e938f847c76716d67696868656c6f737980889298a3abb4aea79f9792867d706a60574d42382e23170b0200000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f22150800000000000000000000000000000000000006121f2c3844515c667783909daab7c3d0dbcec1b5a89b8e8275685b4f4235281c070000000714202d3946525e68707e879298a1a9aea29892857d746e6864605d555b5a595a5b565d6064686d737b838f949ea6aca7a099928c81796d675c51453f33291f14090000000000000000000000000000000000000000000006121f2c3844515c667986929facb9c5cecdcbbfb2a5988c7f7265594c3f3226190c0000000006131f2c3945515d67707d89939ea9a9aaaca0968b7e71675c5145392f24180c0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a545e69707d879299a3abb2b5aba09690837b6f6a62605857565556545c60666d78818e959fabb5beb9aea69e948e81756c62574d42382d22170b00000000000006111b262f3b444d565e676d79828e939da5aeafa399929191919191919191919191919191919191919292999394949595969798999a9b9d9fa29c8f827669544b4034281c1004000713202d3a4653606d7985929fababa39f948f857f7974706d67686767676869686d7074797e848c9299a1a8b2bac4bfbab2aca49f938e82796d665b50443d30271c12070000000000000000020e1925303b444f59616c707d8690959fa2a9aeb4b5afa59e96918b84807d7a777675757576787b7d81868c92979ea5adb3ada7a09d938e847b6f6a5f574d43392f24180d040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090e171e252a2f35393a3d41433f444646443f43413e3c3a37312e2b26201b160f0700000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1b6b5b5b5afa295887c6f6255493c2f22160900000f1c2835424f5b6875828e9ba8b5b5b5b5b6aa9d9184776a5e5144372b1e11040000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7d4ccbfb3a6998c80737272727272727272727272727272727272737374747575757676777778797a7b7b7c7d7f8082837d7063574a3d3024170a00111e2a3744515d6a7784909daab6b5b5b5b5aea39986796d6053463a2d20130b1824313e4b5764717e8a97a4b1b6b5b5b6b2a5988c7f7265594c3f3226190c0916232f3c4956626f7c8995a2afb6b6b5b6b4a79a8d8074675a4e4134271b0e00000000000005111d2935414c56606b717e889299a3aab2b3a99f948f817a6f6a64605c555b535b6062676d747e869299a3afbab1a9a29892867c6f695e544a3f34281f140900000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f22150800000000000000000000000000000000000004101c2834404a546875828f9ba8b5c2cedbd0c3b7aa9d9084776a5d51442e23180c000005121e2a36424d57616e7a859299a3aab1a79f92867c706b615e5654514c4e4d4d4d4e4c5254565e616a6e79828f949faab1aba39f938e83796d605a50453b30251a0e0000000000000000000000000000000000000000000004101c2834404a5f6c7885929fabb8c5d2d8cbbeb1a5988b7e7265584b3f3225180c0000000004101d2935404b55616b74818e97a1adb7b2a89e9184796d60554b4035291e13080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030e18212c3844505c666e7b859299a3abb5bbafa3999184796e696058544e4a4949494a51545c666d77839099a3afbbc0b8b0a69e938b7e71695e544a3f33281c11060000000000000a141d29323b444c555d676d78818e939da4ac9f92878484848484848484848484848484848484858586868787878888898a8b8c8d8e90929795928578665c5145382c1f13060006121f2c3844505c6675828f9ba9a199928c827a736d6763605c555a5a5a5b565d6163666d71787f879196a0a8b2bbc5c4beb6afa59e948e81786c60594f42392e23180c010000000000000005111e2a36414d56606b707e879298a0a7adb3bab5aba39f938e847f7974706d67696868696a696e71757a7f858e939ca3adb9b1aca59e9691857c6f695f554b40352921160a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121a20293036394045474a4e504a505353504a504e4b4847433c3a37312c2721191107000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1bec2c2bbaea195887b6e6255483b2f22150800000f1b2835424e5b6875818e9ba8b4c1c2c2b7aa9d9084776a5d5144372a1e11040000000000000000000000000000000000000000000714212d3a4754606d7a8793a0adbad1dcccbfb3a6998c8073666565656565656565656565656565656666666767686869696a6a6b656c6d6e6f6f7172747577706b6155483c2f23160900101d2a3743505d6a7683909da9b6c2c2c2b9ac9f928679665c5044382c1f120a1724313d4a5764707d8a97a3b0bdc2c2beb1a5988b7e7265584b3f3225180c0915222f3c4855626f7b8895a2aebbc2c2c0b3a69a8d8073675a4d4034271a0d0000000000050f19232d3946525e686f7d86929aa3abb4b9ada1979082786d68605853514b4e495053555d606c707d87929fa7b1bbb3aaa29892857b6e665c50443b3025190e02000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f221508000000000000000000000000000000000000000c18232e414d5a6774808d9aa7b3c0cddad2c5b8ab9f9285786c5f4a4034281c1004000714212d3a46535f6975828f97a1abb4aca0958b7f726a6059524c47454141404040414145474c52575f676d79829098a2aeb5afa59e958e81746c62574d42362a1d1207000000000000000000000000000000000000000000000c18232e45525f6b7885929eabb8c5d1d7cabeb1a4978b7e7164584b3e3125180b00000000000c18242f39434f59616d7a85919ea5afb9ada1968b7f72675d51453a2f24190d03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915202a36424d57606d78839097a1abb5bdb3a99f92877c6f675e574e48433e3c3c3d40444a545c656f7c87929facb9c2c1b8afa59f92867b6e665b5044382e23170c000000000000020b172029323a434c555d666d78818d929ca4a3998e8179777777777777777777777777777777787879797a7a7b7b7c7c7d7e7f8182838587898a86796d6053463a2d2013070003101c28343f4a5465727f8c98a19792877f776d68605d5553514b4e4d4e4e4c5254545c60666d727c849196a0a9b3becac7c0bbafa69e938c80736b60544a4034281d1207000000000000040e18222d3946525e686f7d879299a2aab1babebbafa399928b8179726d6763605d555b5b5c575e6164686d727a818c919ba3adb7b8afa8a09792857b6e675d51453d32271b0f05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008121a242c323a41464b5153575b5d545c60605c545d5a5855534e4847433c38322b23190f060000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0bdcac7bbaea194887b6e6155483b2e22150800000e1b2834414e5b6774818e9aa7b4c1cdc3b6a99d9083766a5d5043372a1d10040000000000000000000000000000000000000000000714202d3a4753606d7a8693a0b5c0cbd7ccbfb3a6998c80736659585858585858585858585858585859595a5a5b5b5c5c5c5d5d5e5b6060616263646567686a6361594f44382c20140700101d293643505c6976838f9ca9b6c2cfc5b8ab9f9285786c5f4a3f34281c100a1723303d4a5663707d8996a3b0bcc9cbbeb1a4988b7e7165584b3e3225180b0815222e3b4855616e7b8894a1aebbc7ccbfb3a6998c807366594d4033261a0d00000000000b16212c38444f59616d7a859198a3acb5bdb1a79e91857a6e665d564e464540423f44464b515a616b737f8c95a0acb8bcb4aaa1979083786d60564d42362a1e1408000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f22150800000000000000000000000000000000000000071926323f4c5965727f8c98a5b2bfcbd8d2c5b9ac9f928679665c5144382c1f1206000815222e3b4855616e7b87939fa9b3b7aa9d9183776d62584f46413b39352f3433343035393a41464e555d676e7a85929faab4bbafa79d928b7e71695e5246392e23180c00000000000000000000000000000000000000000000071e2b3845515e6b7884919eabb7c4d1d7cabdb0a4978a7d7164574a3e3124170b000000000007121d27313d46525d68717e8a939ea9b3b2a89e9185796d60564c4135291f1409000000000000000000000000000000000000000000000000000000000000000000000000000000000000020f1a26313a46535f69727f8c959fa9b3bdb9ada1978c7f736a60554d453d3832302f2e3439424a535f6a74808d9aa7b1bcc8c1baaea2989082786c60544a3f34281c1003000000000000050e172028313a434b545c666d77808d929ca49d938e827a6e696a6a6a6a6a6a6a6a6a6a6a6b6b6c666d6d6d6e6e6f70717273747576787a7c7e7c6f665c5145382c1f130600000c17232e3e4b5865717e8b989892857d736c655e56514b474540414041424146474a50545c606a6f7b849197a2adbac1cfccc1b8afa59f92877d6f665c5144392f23180c0000000000000a15202c38444f59616e7a859199a3abb4bcc3b9aea49f92877f746d67605c5553514b4f4e4f4d5354565d60686e757f8b919ba5afbbbab2a9a1979083796d60594f44382c21160b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006101a242c363e444c52555d606467696b666d6d666b6a6765625f5855534e48443d352b21180e0300000000000000000000000000000000000a1724303d4a5763707d8a96a3b0bdc9c7baada194877a6e6154473b2e21140800000e1a2734414d5a6774808d9aa7b3c0cdc2b6a99c8f8376695c504336291d10030000000000000000000000000000000000000000000613202d394653606c798699a3afbbc7d4ccbfb3a6998c807366594d4b4b4b4b4b4b4b4b4b4b4b4b4c4c4d4d4d4e4e4f4f5050514950535454555657595a5b5d57554f473e33281c1004000f1c2936424f5c6975828f9ca8b5c2cfc4b8ab9e9185786b5e52452e23170c091623303c4956636f7c8996a2afbcc9cabdb1a4978a7e7164574b3e3124180b0814212e3b4754616e7a8794a1adbac7ccbfb2a5998c7f7266594c3f3326190c0000000004101c27333c4854606b75818e97a1aab4beb8aca0958a7d70685e544c443c38342e33373940455059606c7883909da7b1bcbcb3a99f958c7f73695e52463b3025190e010000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f221508000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1becbd8d3c7bbaea39986796d6053463a2d201307000d1a2633404d596673808c9aa4afbbb5ab998c7f72665b51463d36302c292427262724292c30363c434b555e68727f8b98a2aebab9afa59f92867b6e61554b4034281c1004000000000000000000000000000000000000000004111e2b3744515e6a7784919daab7c4d0d6c9bdb0a3968a7d7063574a3d3024170a0000000000010b151f2935414c56616c75818e97a2adb9ada1978c7f72685d52453b31251a0e04000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b37434e58616e7b86929fa7b1bbbfb4aa9e9285796d60584e433b332c27232223283038414e58626e7b88959fabb8c4cabeb4aa9f948b7f72665c5044382c1f150a00000000000000050e161f283139424b545c656c74808c929ca49d9490837b6f6a60595e5e5e5e5e5e5e5e5e5e5f5c6060616162626364656667686a686d6f716f6a60544b4034281c10040000061724313d4a5764707d8a9892867c706b605b534c45403a38342f34343035393a3f444a50585f696e7b85929fa5afbdc7d1cac1bbafa3999184786d60554b4034291c100400000000030f1b26323c4854606b75818e97a1abb4bdc5bcb1a79d928b7e726d605d55514b4745404242424246484c52565e616d727f8b939ea9b3bebbb3a9a0958e81746b6054483d33271c10010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040e18222c363e4850565e61676d7074767778797978787674716f6a66625f58544f473d332a1f150900000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c6baada093877a6d6054473a2d21140700000d1a2733404d5a6673808d99a6b3c0ccc2b5a89c8f8275695c4f4236291c0f0300000000000000000000000000000000000000000005121f2b3744505b657986929facb9c5d2ccbfb3a6998c807366594d403f3f3f3f3f3f3f3f3f3f3f3f3f404041414242424343443f4446474848494a4c4d4f504a48443e352c21160b00000f1c2835424f5b6875828e9ba8b5c1cec4b7aa9e9184776b5e5144382b1e060916222f3c4955626f7c8895a2afbbc8cabdb0a3978a7d7064574a3d3124170a0714212e3a4754616d7a8794a0adbac7cbbfb2a5988c7f7265594c3f3226190c000000000713202c38444f5963707d89939ea9b2bcbeb3a99d9083786c60564d423a322c2823272b2f353e44505b66717d8a95a0acb8c5bbb1a79f92867b6e61564c41362a1e13080000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f221508000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1becad7d7cbbfb5ab94877a6d6154473a2e21140700101d293643505c6976828f9cacb6bbafa399887b6e6155483f342a25201d191a1a1a191d20252a3139434c56606d7985929fabb8c0baaea3988d8073675c5145382c1f1306000000000000000000000000000000000000000004111d2a3744505d6a7783909daab6c3d0d6c9bcb0a396897d7063564a3d3023170a000000000000030d1924303a44505a616e7a85929fa6b0b3a99e92857a6d60574d42362a20150a00000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3a47535f6a75818e98a2aeb9c3baaea2988c7f73675d51463d3129211b1616181e262f3c47535f6a7683909da9b6c3d0c5bcb0a69e9184796d6053463d32271b0f0300000000000000050d161f273039424a535b606e73808c929ca49f9591847c6f6b615a5151515151515151524a50535454545555565758595a5b565d6162646260584e42392e23180c0000000a1623303d495663707c8992867d6f6a60595049413a352f2c2923272724292d2e34383f444e575f69707d8a939eabb5c0cbd7cbc0b5aba0968b7f72675c5145382c1f13080000000006131f2b37434e5863707d89939ea9b3bdc6c4b8ab9f958d80736c625b514b45403a39352f3531363a3b41454c525b636d75818e97a1adb9c5bbb1a79d93897d6f63594f44382c1d120700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a15202a343e48505a61686d747a7d818384858686858483817e7b77736f6a6360594f453c31261a0e0200000000000000000000000000000000091623303c4956636f7c8996a2afbcc9c8bbafa49a86796d6053463a2d20130700000d1a2633404d596673808c99a6b3bfccc1b5a89b8e8275685b4f4235281c0f02000000000000000000000000000000000000000000030f1b27333f495f6c7985929facb8c5d2ccbfb3a6998c807366594d40333232323232323232323232333333343435353636372d3337393a3b3c3c3e3f4142443d3c38332c231a100500000e1b2835414e5b6874818e9ba7b4c1cec3b7aa9d9084776a5d5144372a1e110915222f3c4855626f7b8895a2aebbc8c9bcb0a396897d7063564a3d3023170a0714202d3a4753606d7a8693a0adb9d2cbbeb1a5988b7e7265584b3f3225180c000000000916222f3c4854606b7683909ca5afbbc4b9ada1978a7e71655b50443b3028201c181b1f2429333f4a54606c7883909dabb5bfc2baaea3988d8074685e52463a2f24190d0100000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f221508000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0bdcad7dcd1baaea194877b6e6154483b2e21150800111e2b3844515e6b7784919eaab7b9ac9f9286796c605346392d201914110d080d080d1113191f27313b45515d6775818e9ba8b4c1bfb4aa9e9285796d6053463a2d201307000000000000000000000000000000000000000004101d2a3743505d6a7683909da9b6c3d0d6c9bcafa396897c706356493d3023160a0000000000000008131e28323e46525e68717e8b949eaab4ada1978d8073695e53463c32271b0c0200000000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b55626e7b87939faab4bfc5b8ac9f92867a6d60554b40342b1f170f0a070c141d2b37424e5765727f8b98aab4bfcacec2b9ada1968a7d7164584e43372b1f13060000000000000000040d151e2730384149505c636e73808c929ca4a09691857d706c625b514a4244444444453f44464747484849494a4b4c4e4f4c5254565756544e463d30271d12070000000915222f3c4855626f7c88877d706b60584f443f382f29241f1c181a1b191d2023282e343c454d57616b75818e99a3afbbc7d4d1c7bdb2a89e9285796d6053473a3025190d010000000815212e3b47535f6a76828f9ca5afbbc4c7bbb0a69d9083786d605a51454039342f2c292428252a2d2f353b4146515b616d7a85929eabb8c2c3b9afa59d9083776b605448392f24180d01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b26313c46505a616c717a81868a8e90919293939291908d8b8884807c76706b60574d42372b1e1206000000000000000000000000000000000916232f3c4956626f7c8995a2afbcc8c6b9ac9f938679665c5144382c1f120600000d192633404c5966737f8c99a6b2bfccc1b4a89b8e8175685b4e4235281b0f02000000000000000000000000000000000000000000000b17222d46525f6c7985929facb8c5d2ccbfb3a6998c807366594d403326252525252525252525252626272728282929292a22272b2d2d2e2f303132343537302f2c28211a11080000000e1b2834414e5b6774818e9aa7b4c1cdc3b6aa9d9083776a5d5044372a1d110815222f3b4855626e7b8895a1aebbc8c9bcafa396897c706356493d3023160a0713202d3a4653606d798693a0b6c0cccbbeb1a4988b7e7165584b3e3225180b00000007131f2c38434f5963707d89949fabb7c1c5b8ab9e9285796d6053493f32291e16100c0f1218222d3844505b65717e8a99a3aebbc7bfb4aa9f92867a6e61554c4135291d110400000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f221508000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0bdcad7d4c8bbaea195887b6e6255483b2f22150800121f2b3845525e6b7884919eabb8b7ab9e918478665b5044382b1f120804010001000104080d151f2935404b5565727f8c98a5b2bfc6b9ada1978b7e7164584b3e3125180b000000000000000000000000000000000000000003101d2a3643505d697683909ca9b6c3cfd5c9bcafa296897c6f6356493c3023160900000000000000020c16202a36414c56626c76828f98a2aeb3a99f92867b6e61584e43372b1e140a00000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3945515d6774818e99a4afbcc6c2b5a89c8f8275685d5243392f22190d050000020b1a26313c4855626f7b8898a2aebac6d3c9bdb2a89c9083766a6054473b2e221507000000000000000000030c151e262f383f44525b636e73808c929ca4a19792867e726d605c544c443c34382e34383a3a3a3b3b3c3d3e3f404142414647494b4947433d342b1e150b000000000714202d3a4753606d79837d706b61594f463d332d261d1813100c07080d1113171c2328333c454f59616e7b87929facb9c3ced9cfc3b9ada1978b7e7164564c41362a1d11050000000916222f3c4955626f7c88949fabb7c1cdc4b7ab9f94897d70665c50483f352f29231f1d181b1a1e21242930363f46525e68737f8c99a7b1bcc8c1b8aca095897d7063554b4035291d100400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b37434e58616c717e858e92989a9c9e9f9f9f9f9e9d9a9896918d88827d70695f53473a2d211408000000000000000000000000000000000916222f3c4955626f7c8895a2afbbc8c5b9ac9f9286796c5f4a4034281c100400000c1926333f4c5966727f8c99a5b2bfccc1b4a89b8e8175685b4e4235281b0f0200000000000000000000000000000000000000000000121f2c3945525f6c7885929fabb8c5d2ccbfb3a6998c807366594d4033261a181818181818181819191a1a1a1b1b1c1c1d1d171b1f2021212223242627282a2423201c161008000000000e1b2734414e5a6774818d9aa7b4c0cdc3b6a99d9083766a5d5043372a1d100815222e3b4855616e7b8894a1aebbc7c9bcafa396897c706356493d3023160a0613202d394653606c79869aa4afbbc8cabeb1a4978b7e7164584b3e3125180b0000000915222f3b4854606b7683909ca6b0bcccc0b6ac9b8e8175665c5041382d20170c04000307111c27333f4953606d7a86929facb9c5c6baaea2988d8073675d5145392c20130600000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f221508000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1becad7d4c7baaea194877b6e6154483b2e21150800101d2a3743505d6a7683909da9b6b6aa9d9083776a564c4135291d110b0c0c0d0d0e080d11131419242f3e4b5764717e8a97a4b1bdc9beb3a99b8e8174685b4e4135281b0e000000000000000000000000000000000000000003101d293643505c6976838f9ca9b6c2cfd5c8bbafa295887c6f6255493c2f2216090000000000000000040e1925303b44505a616e7b86929fa6b0aea3988e81756a6054473e30261c110600000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7985929fabb5c0cabeb3a9988b7e7265564c4131271d1007000000000913202d3a4653606d7985929facb8c5d2cfc4b7ab9f94897c6f6256493c2f24180d01000000000000000000030c141d262d334049525b636e73808c929ca4a29892877f746d665e564e463e3528282c2d2d2e2e2f2f30313233343035393a3c3e3c3b37322b22190c030000000006131f2c3945515d676d76706c61594f473d3427221b140b07040000000105060b1117212a333e46525e6975828f9ba8b2bdc8d4d5c9beb3a99c908376685e5246392d201307000004101d2935404b556673808c99a6b0bbc9cbc0b5ab9c8f83766b60544a3f3629241d1813100c090e1214191e252a36414c56616e7b88959fabb8c4c8bcb1a79b8f8275675d5145392c2013060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815212e3a47535f6a717e8792979fa3aaa9aaabacacababa9a7a8a09e99948f877b6e6155483b2e221508000000000000000000000000000000000915222f3c4855626f7b8895a2aebbc8c5b8ac9f9285796c5f52462e23180c0000000c1926323f4c5965727f8c98a5b2bfcbc1b4a79b8e8174685b4e4135281b0e0200000000000000000000000000000000000000000005121f2c3845525f6b7885929eabb8c5d1ccbfb3a6998c807366594d4033261a0d0c0c0c0c0c0c0c0c0c0d0d0e0e0f0f0f10060b0f12131415151617191a1c1d171614100b0500000000000e1a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d100815212e3b4854616e7b8794a1aebac7c9bcafa296897c6f6356493c3023160906121f2b3844505b667986939facb9c6cabeb1a4978b7e7164584b3e3125180b000000091623303c4956636f7c89949fabb8c2c8bbafa49a8b7e7164544a3f2f261b0e05000000000b17222d3845515d6776838f9ca9b6c2cabfb4aa9f92867a6d6054473a2d21140900000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f221508000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1becbd8d7cbbfb4ab94877a6d6154473a2e211407000e1a2734414d5a6774808d9aa6b0b8ab9e928578685d5245392c20171818191a1a1b1b191d2021252a333f4a5465727f8c98a5b2bfcfc3b7aa9d9084776a5d5144372a1e11000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cfd5c8bbaea295887b6f6255483c2f22150900000000000000000008141e29323e46535e69727f8b949faab4aa9f93877c6f62594f42382e23170b0200000000000000000000000000000000000000000000000000000000000000000000000004111d2935414c5664717e8a98a2aebdc7c6baada297877b6e6154483b3021150b000000000006121f2b3844505c667683909ca9b6c3cfd3c7bcb0a6998d807366554b4035291d110400000000000000000000020b141b2227374049525b636e73808c929ca4a399938c81786d685f584f473f342e27202121212222232425262724292d2e2f312f2e2b2720191007000000000004101d2935404b555d606a6461594f473e352b2217110a02000000000000000000060f18212a36424d5763707d8996a0acb8c5d2dacfc5b9ac9f93877a6d6154473a2e21140700000613202c3945515d677784909daab7c2cdc7bbafa3998a7d7164594f42382e2418120c070400000205080d141925303a46535f697683909da9b6c3cdc3b9ac9f92867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b37434e58626f7c869299a2a9aeb4b6b7b8b1abaaa6a4a3a4a5a6a69f998a7d7064574a3d3124170a000000000000000000000000000000000815222f3b4855626e7b8895a1aebbc8c5b8ab9f9285786c5f5245392c1f070000000c1925323f4c5865727f8b98a5b2becbc1b4a79a8e8174675b4e4134281b0e0100000000000000000000000000000000000000000005121f2b3845525e6b7885919eabb8c4d1ccbfb3a6998c807366594d4033261a0d00000000000000000000000101020203030000030506070809090b0c0e0f110a090704000000000000000d1a2734404d5a6773808d9aa6b3c0cdc2b6a99c8f8376695c504336291d100815212e3b4854616e7b8794a1aebac7c8bcafa295897c6f6256493c2f231609030f1c28333f4a5f6c7986929facb9c5cabdb1a4978a7e7164574b3e3124180b000005111e2a36414d566773808d9aa6b0bccbc6b9ac9f93867a6e6154473b2e21140a000000000006111b2935414c5565727f8c98acb6c0ccc6baaea2988a7d7064574a3d31261a0e02000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f221508000000000000000000000000000000000000000c1926323f4c5965727f8c98a5b2bfcbd8d3c7baaea39986796d6053463a2d20130700091623303c4956636f7c89949fabb5ada197877a6d6054473d3229242525262627272824292c2d30363c44505b6674818d9aa7b4c0cdc5b8ab9e9285786b5f5245382c1f120000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfd4c8bbaea195887b6e6255483b2f221508000000000000000000020d17202a36424d57606c77829098a3aeafa49a8f82766b61544a3f34281e13080000000000000000000000000000000000000000000000000000000000000000000000000613202c3945525d6875828f9baab4bfd0c5b8ab9f928578695e53463a2d211403000000000003101c28343f4a546774818e9aa7b4c1cdd8cdc2b6a99d908376675d5145392c2013060000000000000000000000020a1117252e374049525c636e73808c929ca4a49f938e827a6f6a61595144403930282018151516161718191b191d2021232423221f1b150f07000000000000000c18242f39434b51535d57554f473e352c23191006000000000000000000000000060f1a25303b4854606b7784919eaab7c4d1ddd4c8bbafa49a8a7e7164574b3e3124180700000714202d3a4753606d7a86939facb9c6d2c5b9ac9f92867a6d6054473d30261c120701000000000000000208131e2a36424d576774818d9aa7b4c0cdc7baaea3988a7d7064574a3d3124170a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815212e3a47535f6a75828f99a3abb3babfbeb6afa79f9d9998969798999c9e99887c6f6255493c2f221609000000000000000000000000000000000815222f3b4855626e7b8895a1aebbc8c5b8ab9e9285786b5f5245382c1f120500000c1825323f4b5865727e8b98a5b1becbc1b4a79a8e8174675b4e4134281b0e0100000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000001020400000000000000000000000d1a2733404d5a6673808d99a6b3c0ccc2b5a99c8f8276695c4f4336291c100814212e3b4754616e7a8794a1adbac7c8bbafa295887c6f6255493c2f221609000b17222d46525f6c7985929facb8c5cabdb0a4978a7d7164574a3e3124170b00000714202d3946525e687783909daab7c2cdc4b7ab9e918478685e5246392d2014020000000000000d19242f3c4955626f7c889aa4afbbc8cabfb4aa9a8d817467574d42362a1e1205000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f221508000000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfccd9d2c5b9ac9f928679665c5145382c1f1306000915222f3b4854606b76839099a4afb3a9978a7e7164594f443b3131313232333434352f35393a3c41464e57606c7884919eaab7c4d1c5b9ac9f9286796c5f5346392c20130000000000000000000000000000000000000000020f1c2935424f5c6875828f9ba8b5c2ced4c7bbaea194887b6e6155483b2e22150800000000000000000000050e1a25313b44505b656e7b86929fa7b1ac9f948a7d70665c50443a3024190d0400000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a86929facb9c5d0c3b6a99c90837669574d42362a1e12050000000000000b17232e404c5966737f8c99a6b2bfccd9d2c5b9ac9f92867a6d6053473a2d2014070000000000000000000000000006131c252e374049525c636e73808c929da5a59d9490847c706b625b514a423a322a221a11090a0b0c0d080d11131416181615130f0a04000000000000000007121d273139404547504a49443e352c231a1107000000000000000000000000000009141f2c38444f596774818d9aa7b4c0d1dcd8ccc0b6ac9a8e8174675b4e412e23180c00000916232f3c4956626f7c899aa4afbbc8cfc3b6a99c908376685d5245392b1e140a00000000000000000000020e1a2631404c5966737f8c99a6b2bfcccbbfb4aa998d8073665a4d4033271a0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915222f3c4855626f7c88949eabb4bdc5c0b6aca49f95908d8b898a8b8d8f929286796d6053473a2d201407000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7c4b8ab9e9185786b5e5245382b1f120500000c1825323f4b5865727e8b98a5b1becbc0b4a79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000005111e2b3844515e6b7784919eaab7c4d1ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3bfccc2b5a89c8f8275695c4f4236291c0f0714212e3a4754616d7a8794a0adbac7c8bbaea295887b6f6255483c2f22150900121f2c3945525f6c7885929fabb8c5cabdb0a3978a7d7064574a3d3124170a00000814212e3b4754616e7a8795a0acb8c5cfc2b6a99c8f837669564c41362a1e11050000000000000814202d3a4753606d7a86939facb9c6d0c4b7aa9e918477695f53463a2d211407000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f221508000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0cddad1c5b8ab9e9285786b544b4034281c10040007131f2c38444f59636f7c87939fa5aea99c9083766b60564d433e3e3e3f3f4040414242414547494d52585f69717d8a96a0acb9c5d1c4b8ab9e9185786b5e5245382b1f120000000000000000000000000000000000000000020f1c2835424f5b6875828e9ba8b5c1ced4c7baaea194877b6e6154483b2e211508000000000000000000000009141f27333f49535f69727f8c959fabb0a69d9183786d60564c41352920150a00000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b98a3aebac7cdc1b4a79a8e8174675b4e4131251a0e02000000000000061825323e4b5865717e8b98a4b1becbd7d3c7bbafa399897d7063564a3d3023170a00000000000000000000000000000a131c252e374049525c636e73808d939ea6a69f9691867d726d605c544c443c342c231b12060000000001050707090b0908060300000000000000000000010b151f272f35393a433d3c39332c231a110800000000000000000000000000000003101c27333e4b5764717e8a97abb5c0cbd7ddd2c3b6a99c90837669544a4034281c1004000b1824313e4b5764717e8a97acb6c0ccccc0b3a6998d807366564c4135291a0c020000000000000000000000091825313e4b5864717e8b97a4b1becad1c2b5a89c8f8275695c4f4236291c0f03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c99a6b0bdc6c8bbafa49a938b83807e7d7d7e808285878174675d5145382c1f1306000000000000000000000000000000000815212e3b4854616e7b8794a1aebac7c4b7ab9e9184786b5e5145382b1e120500000b1825323e4b5865717e8b98a4b1becbc0b4a79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000004111e2b3744515e6a7784919daab7c4d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfccc2b5a89b8f8275685c4f4235291c0f0714212d3a4754606d7a8793a0adbac6c8bbaea195887b6e6255483b2f22150806121f2c3945525f6c7885929fabb8c5c9bdb0a3968a7d7063574a3d3024170a00000b1825313e4b5864717e8b97a7b1bcc8cdc1b4a79a8e8174675b4e413025190d0100000000000006131f2c3945515d677784919eaab7c4d1c5b9aca096887b6e6155483b2e221508000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f221508000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfdbd0c3b6aa9d9083776a5d50442e23180c0000030f1b27323d4854606b73808d939da4ab9f94897d6f685e554e4a4b4b4b4c4d4d4e4e4f4c515456565e616a6e7b84919ea8b2bdc8d0c3b6a99d9083766a5d5043372a1d100000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced4c7baada194877a6e6154473b2e2114080000000000000000000000030b17222d38414d57606d78839099a3aeaca0958b7e72685d52463c32261b0d0400000000000000000000000000000000000000000000000000000000000000000004101d2935404b556875828e9baab4bfcbccc0b3a6998d8073665a4d4033271a09000000000000000a1724303d4a5763707d8a96a3b0bdc9d6d7cbc0b5ab998c7f7366594c403326190d0000000000000000000000000000010a131c252e37404a525c606c77818e949ea7a8a09892877f746d665e564e463e352d2417110a020000000000000000000000000000000000000000000000030d151d24292c2d3731302d28211a110800000000000000000000000000000000000b15212e3b4854616e7b8799a3afbbc7d3ded1c5b8ab9e928578665c5144382c1f1206000c1825323f4b5865727e8b98a5b1bed2cbbeb1a5988b7e7265584b3f2f24190c0000000000000000000000010b1724313e4a5764717d8a97a4b0bdcad1c4b7aa9e9184776b5e5144382b1e110500000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c1cfc6b9ac9f93887e7773717071727376787a746f64554b4035291d1004000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7c4b7aa9e9184776b5e5144382b1e110500000b1825313e4b5864717e8b97a4b1becac0b3a79a8d8074675a4d4134271a0e0100000000000000000000000000000000000000000004111e2a3744515d6a7784909daab7c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5b2bfccc1b5a89b8e8275685b4f4235281c0f0714202d3a4753606d7a8693a0adb9c6c8bbaea195887b6e6255483b2f22150805121f2c3845525f6b7885929eabb8c5c9bdb0a3968a7d7063574a3d3024170a00020e1b2835414e5b6874818e9ba7b4c1cecbbfb2a5988c7f7265594c3f322619080000000000000004101d2935404b556975828f9ca8b5c2cfc8bdb2a8988b7e7165584b3e3225180b000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f22150800000000000000000000000000000000000005121e2a36424d576a7784909daab7c3d0dbcec1b4a89b8e8175685b4e4235281b070000000a16212c38434f59606d78818d929da4a69e91847a6e6760585757585859595a5a5b5c555d606266686e747c849196a1adbac3ceccc0b5ab9b8e8275685b4f4235281c0f0000000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1ced3c7baada094877a6d6154473a2e21140700000000000000000000000006111b262f3c44505c666f7c87929fa8b1a79e92857a6d61584e43372b1f160c0100000000000000000000000000000000000000000000000000000000000000000613202c3945515d677784919daab7c4d1ccbfb2a5998c7f7266594c3f3326190c000000000000000a1623303d495663707c8996a3afbcc9d6dcd1c0b4a79a8d8174675a4e4134271b0e000000000000000000000000000000010a131c252e374044505b656d78828f959fa7aaa299938c81786d685f584f473f3628221c140b030000000000000000000000000000000000000000000000030b12181d1f202a2423201c1710080000000000000000000000000000000000000613202d394653606c7986929facb9c5d2dfd2c6b9ada19786796d6053463a2d201307000c1926333f4c5966727f8c99a5b2bfcccabdb0a4978a7d7164574a3e3124170800000000000000000000000a101c2934404b5565727f8b98a5b2becbd1c5b8ab9e9285786b5f5245382c1f1205000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a546a7784919daab7c4cabeb3a99b8e81746c66656364656669696e69645d5343392f24180c00000000000000000000000000000000000714212e3a4754616d7a8794a0adbac7c4b7aa9d9184776a5e5144372b1e110400000b1824313e4b5764717e8a97a4b1bdcac0b3a69a8d8073675a4d4034271a0d0100000000000000000000000000000000000000000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926323f4c5965727f8c98a5b2bfcbc1b4a89b8e8175685b4e4235281b0f0713202d3a4653606d798693a0acb9c6c7bbaea194887b6e6155483b2e22150805121f2b3845525e6b7885919eabb8c4c9bcb0a396897d7063564a3d3023170a0003101d293643505c6976838f9ca9b6c2cfcabeb1a4978b7e7164584b3e3125180b00000000000000000c18242f414e5b6774818e9aa7b4c1cdcebfb2a6998c7f7366594c403326190d000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f2215080000000000000000000000000000000000000714202d3a46525e697985929facb8c5d2d9ccbfb2a6998c7f7366594c403326190d000000040f1b27323d44505c666d78808d929da0a1969082796f6a646464646565666767686869676d6f72767b80879196a1a8b2bdccd4c7bbafa4998c7f7366594c403326190d0000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0cdd3c6baada093877a6d6054473a2d211407000000000000000000000000000a141d28343f4a545f6a73808c96a0acada1978d80746a5f53473e31281d120700000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a86939facb9c6d2cbbfb2a5988c7f7265594c3f3226190c00000000000000091623303c4956636f7c8996a2afbcc9d5dbcec1b5a89b8e8275685b4f4235281c0f00000000000000000000000000000000010a131c2527333f49535c666d79829095a0a8aba49f938e827a6f6a6159504840332d261d150d04000000000000000000000000000000000000000000000001070c1013141d171614100b050000000000000000000000000000000000000005121f2b3744505b657885919eabb8c4d1ded5c9beb3a994877a6d6154473a2e211407000c1825323f4b5865727e8b98a5b1bed1c9bcafa296897c6f6356493c302316090000000000000000000107131c252c3845515c6774818e9ba7b4c1ced2c5b9ac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505b667885929eabb8c5c6baada297877b6e615a585657585a565e615e56534b4131271d120700000000000000000000000000000000000714212e3a4754616d7a8794a0adbac7c3b7aa9d9084776a5d5144372a1e110400000b1824313e4b5764717e8a97a4b1bdcac0b3a69a8d8073675a4d4034271a0d0100000000000000000000000000000000000000000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2becbc1b4a79b8e8174685b4e4135281b0e0713202d3a4653606d798693a0acb9c6c7baaea194877b6e6154483b2e21150805121f2b3845525e6b7885919eabb8c4c9bcafa396897c706356493d3023160a0003101c28343f4a546a7784909daab7c3d0cabdb0a4978a7d7164574a3e3124170b0000000000000000071a2734414d5a6774808d9aa7b3c0cdcdc0b4a79a8d8174675a4e4134271b0e000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f2215080000000000000000000000000000000000000815212e3b4854616e7b8798a2aebac6d3d5c9bdb2a8978a7d7164574a3e3124170b000000000a162128343f4a545c666c74808991969f9f9590837c73717171717272737374757576787a7c7f83878d9299a1a8b2bac4cfccc0b6ac9f93877b6e6154483b2e2115080000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdd3c6b9ada093867a6d6053473a2d20140700000000000000000000000000020b17232e38424e58606d7984919da5afa99f92877c6f625a5043392f24180d03000000000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c8999a4afbbc7d4ccbfb2a5998c7f7266594c3f3326190c000000000000000916222f3c4955626f7c8895a2afbbc8d5dccfc2b6a99c8f8376695c504336291d100000000000000000000000000000000000010a1317222d38414a545d676d7a839096a1a9afa59d9490847c706b625a51443f382f271f160d0400000000000000000000000000000000000000000000000000040607100a0a0804000000000000000000000000000000000000000000030f1b27333f49536a7784909daab7c3d0dddacfbaaea194877b6e6154483b2e211508000a1724313d4a5764707d8a97abb5bfcbc9bcafa296897c6f6356493c302316090000000000000000040c1218252a36414c56606d7985929eabb8c5d1d2c5b8ac9f9285796c5f5246392c1f13060000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c7986939facb9c6c5b8ab9f928578695e524b4a4a4b4d4d5254524d4441392f1f150b0100000000000000000000000000000000000714212d3a4754606d7a8793a0adbac6c3b6aa9d9083776a5d5044372a1d110400000b1724313e4a5764717d8a97a4b0bdcac0b3a69a8d8073675a4d4034271a0d0100000000000000000000000000000000000000000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2becbc1b4a79b8e8174685b4e4135281b0e0713202d3a4653606d798693a0acb9c6c7baaea194877b6e6154483b2e21150805121e2b3845515e6b7884919eabb7c4c9bcafa396897c706356493d3023160a0006121f2b3844505c667885929eabb8c5d1c9bdb0a3968a7d7063574a3d3024170a00000000000000000d1a2633404d596673808c99a6b3bfcccec1b5a89b8e8275685b4f4235281c0f000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f2215080000000000000000000000000000000000000b1724313e4a5764717d8a97aab4bfcad6d2c5b9ada196887b6e6255483b2f22150800000000040b17232e38424a545b606e737d848c92989f959187807d7d7e7e7e7f8080818182838487898c9093999fa3abb2bac4cccac1bbafa49a8f8276695e53463a2d2114070000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d201307000000000000000000000000000006111c26303c45515c67707d89939ea9afa3999082766c61554b4035291f1409000000000000000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b98abb5c0ccd7ccc0b3a6998d8073665a4d4033271a0d000000000000000a1623303d495663707c8996a3afbcc9d6ddd0c3b7aa9d9084776a5d5144372a1e110000000000000000000000000000000000000006111b262f38424b555d686e7b849197a1abafa69f9691867d716c635b504a423931281f160d040000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000b17222d434f5c6976828f9ca9b5c2cfdcd7cbc0b5ab94877a6e6154473b2e211408000916232f3c4956626f7c8999a3aebbc7c9bdb0a3968a7d7063574a3d3024170a00000000000000070d161d2429373f46525e68727f8c97a1adb9c6d2d0c4b7aa9d9184776a5e5144372b1e11040000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a8799a4afbbc7c3b6aa9d9083776a574d423d3e3f4042464746423b322f271d0d030000000000000000000000000000000000000714212d3a4754606d7a8793a0adbac6c3b6aa9d9083776a5d5044372a1d110400000b1724313e4a5764717d8a97a4b0bdcac0b3a69a8d8073675a4d4034271a0d0100000000000000000000000000000000000000000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2becbc1b4a79b8e8174685b4e4135281b0e0713202d3a4653606d798693a0acb9c6c7baaea194877b6e6154483b2e21150805121e2b3845515e6b7884919eabb7c4c9bcafa396897c706356493d3023160a000713202d3a4653606d7886939facb9c6d2c9bcafa296897c6f6356493c3023160900000000000000000c1926323f4c5965727f8c98a5b2bfcbcfc2b6a99c8f8376695c504336291d10000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f221508000000000000000000000000000000000005111e2a36414c566773808d9aa6b3c0d0dbd1c4b8ab9e9184786a5f53473a2e211408000000000006111c263038424a505c646b70797f86929fa099928d8a8a8a8b8b8c8c8d8d8e8f8f919695999c9fa4abafb5bdc4cac5bebaafa69f93887d7063574d42362a1e12050000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d2013070000000000000000000000000000000a141e2834404b55606b75818e97a2adab9f948a7e71675d51453b31261a0c030000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0d2ddcdc0b3a79a8d8074675a4d4134271a08000000000000000b1724313e4a5764717d8a97a4b0bdcad7dccfc3b6a99c908376695d5043362a1d1000000000000000000000000000000000000000000a141d263039434c565e696e7b859299a3afb0a8a09892877e736d605b544b433a31281f160d030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061d2a3643505d697683909ca9b6c3cfdcd4c7bbafa399877a6d6054473a2d211407000714212d3a4754606d7a86929facb9c5d0beb1a4978b7e7164584b3e312518090000000000030b12181f282f353f49525b616e7a85929fa9b3bec9d5cfc2b5a99c8f8276695c4f4336291c10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1b5c0ccc3b6a99c908376695d504330313230363a3b3a363029201d150b000000000000000000000000000000000000000714212d3a4754606d7a8793a0adbac6c3b6aa9d9083776a5d5044372a1d110400000b1724313e4a5764717d8a97a4b0bdcac0b3a69a8d8073675a4d4034271a0d0100000000000000000000000000000000000000000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2becbc1b4a79b8e8174685b4e4135281b0e0713202d3a4653606d798693a0acb9c6c7baaea194877b6e6154483b2e21150805121e2b3845515e6b7884919eabb7c4c9bcafa396897c706356493d3023160a000814212e3b4754616e7a8799a4afbbc7d4c8bcafa295897c6f6256493c2f23160900000000000000000b1825323e4b5865717e8b98a4b1becbd0c4b7aa9d9184776a5e5144372b1e11000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f22150800000000000000000000000000000000000713202d3946525e687683909da9b6c3d0d7cbc0b5ab9b8e817468584e43372b1f12060000000000000a141e262f3845515c676d787e829098a3aba39f99979797979898999a9a9b9b9c9ea1a8a5a9acafb5bbc0c7c5bebab4aea59e948c80736b6054453b31251a0e020000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d201307000000000000000000000000000000020c18232e39434f59616e7a85929fa7b0a69e9184796d60574d42362a1e150b000000000000000000000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cfdacec1b4a79b8e8174685b4e413024190d010000000000000c1825323f4b5865727e8b98a5b1becbd8dbcec2b5a89b8f8275685c4f4235291c0f0000000000000000000000000000000000000000020b151e27313a444d575f69707d87929fa5afb2aaa299928b7f746c665c554c433a31281f150c0300000000000000000000000000000000000000000000000000000000010300000000000000000000000000000000000000000004111d2935414c566a7784909daab7c3d0ddd2c5b9ac9f9286796c605346392d201306000613202c3945515d6776828f9caab4bfcbbfb2a5998c7f7266594c3f31261a0e000000040a0c151d232831394045515b636e74818e98a2aebbc5cfd5c9bdb2a89a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbad2c3b6a99c908376695d5043362a25252a2d2e2d2a251f170e0b02000000000000000000000000000000000000000714212d3a4754606d7a8793a0adbac6c3b6aa9d9083776a5d5044372a1d110400000b1724313e4a5764717d8a97a4b0bdcac0b3a69a8d8073675a4d4034271a0d0100000000000000000000000000000000000000000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2becbc1b4a79b8e8174685b4e4135281b0e0713202d3a4653606d798693a0acb9c6c7baaea194877b6e6154483b2e21150805121e2b3845515e6b7884919eabb7c4c9bcafa396897c706356493d3023160a000714212e3a4754616d7a8799a3aebbc7d3c9bcafa396897c706356493d3023160a00000000000000000b1824313e4b5764717e8a97a4b1bdcad0c3b7aa9d9084776a5d5144372a1e11000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f22150800000000000000000000000000000000000714212e3a4754616d7a86929facb9c5d2d3c7bbafa3998a7e7164574a3e31261a0f020000000000000713202c38444f59606d79818a90949faab4afaca6a4a4a4a4a5a5a6a6a7a8a8a9abadb2b2b6b9bbc0c3c0bcb8b3aeaaa29f938e82786c60594f4433291f1409000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d2013070000000000000000000000000000000007121d27303d46525e68727e8b959fabada1968c8073695f53463d30271c12070000000000000000000000000000000000000000000000000000000004101d2a3743505d6a7683909da9b6c3d0dccfc2b6a99c8f837669564c4135291d11040000000000000d192633404c5966737f8c99a6b2bfccd9dacdc1b4a79a8e8174675b4e4134281b0e000000000000000000000000000000000000000000030c151f28323b454d57606b727f8c939ea7b1b3aba39f918c80786d675d564c433a31271e150c020000000000000000000000000000000000000000000000030608090e100c07060400000000000000000000000000000000000613202c3945525d687885919eabb8c4d1ddd1c4b7aa9e918477655b5044372b1f12050004111d2935414c5565727f8b98a3aebac6c1b5a89b8e827568574d42372b1c1207030a0f151b1e272e343c434b515b626d73808c939eaab4becdd6d2c5b9ada196897c706356493d3023160a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7c3b6a99c908376695d5043362a1d191e2021201e19140d050000000000000000000000000000000000000000000714212d3a4754606d7a8793a0adbac6c3b6aa9d9083776a5d5044372a1d110400000b1724313e4a5764717d8a97a4b0bdcac0b3a69a8d8073675a4d4034271a0d0100000000000000000000000000000000000000000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2becbc1b4a79b8e8174685b4e4135281b0e0713202d3a4653606d798693a0acb9c6c7baaea194877b6e6154483b2e21150805121e2b3845515e6b7884919eabb7c4c9bcafa396897c706356493d3023160a000613202d394653606c7886929facb9c5d2cabdb0a3978a7d7064574a3d3124170a00000000000000000b1825323e4b5865717e8b98a4b1becbcfc2b5a99c8f8276695c4f4336291c10000000000005121f2b3845525e6b7885919eabb8c4d1c8bbaea195887b6e6255483b2f2215080000000000000000000000000000000009121e2b37424d5765727e8b99a3afbbc7d4d2c5b9ac9f92867a6d6154473a2e211409000000000000000916222f3b4854606b75828f939c9fa6b0bcbbb9b3b0b0b1b1b1b2b3b3b4b4b5b6b8b9bdbfbec0bbb9b7b3b1acaaa29f98928a81796d665b50473d3321170d03000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d20130700000000000000000000000000000000000b151e2a36414c56606c78839099a3afa89f92867b6e61594f42392e23180c0200000000000000000000000000000000000000000000000000000004111e2b3744515e6a7784919daab7c4d0ddd1c4b8ab9e918578685d5245392c2013070000000000010e1a2734414d5a6774808d9aa7b3c0cddad9ccbfb3a6998c807366594d4033261a0d00000000000000000000000000000000000000000000030d162029333c454f59626d75818e959fa9b3b5afa39c928d81796d685d554b433930271e140b020000000000000000000000000000000000000000040a0f1215151a1c181312100c070000000000000000000000000000000714212d3a4754606d7a86939facb9c6d2dbcfc2b5a89c8f82756953493f33271b0f0300010d19242f3b4754616e7a86929faab4bfc4b8ab9e918578695f5347392e23180b0f151b20262b303940454e555d606d727f8b929ca5afbcc5d0d6cabeb3a99e9184786c605346392d201306000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7c3b6a99c908376695d5043362a1d0e11141414110e0902000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0adbac6c3b6aa9d9083776a5d5044372a1d110400000b1724313e4a5764717d8a97a4b0bdcac0b3a69a8d8073675a4d4034271a0d0100000000000000000000000000000000000000000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2becbc1b4a79b8e8174685b4e4135281b0e0713202d3a4653606d798693a0acb9c6c7baaea194877b6e6154483b2e21150805121e2b3845515e6b7884919eabb7c4c9bcafa396897c706356493d3023160a0005121f2b3744505b657885919eabb8c4d1cbbeb1a4988b7e7165584b3e3225180b00000000000000000c1925323f4c5865727f8b98a5b2becbcec1b4a89b8e8175685b4e4235281b0f000000000005121f2c3845525f6b7885929eabb8c5d1c8bbaea195887b6e6255483b2f221508000000000000000000000000000000050f1b242e3a47535f697683909cabb5c0cbd4c8bdb1a89b8e8275685e5246392d201307000000000000000a1623303d495663707d89949ea5abb0b8c2c5bebab8b7b6b6b6b6b6b7b7b6b6b5b5b4b4b3b1b5afacaaa7a7a09d98928d867e756d675d544a3f352b210f0500000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d2013070000000000000000000000000000000000030c1925303b44505b666f7c87929fa8aea3988f82756b61544a4034281e140800000000000000000000000000000000000000000000000000000003101c28343f4a546b7885919eabb8c4d1ded2c6b9ada197877a6d6054473a2d211409000000000005111d2a36414c566875828e9ba8b5c1cedbd6cabfb4aa988b7f7265584c3f3225190c0000000000000000000000000000000000000000000000040e17202a333d47515b606d79839097a1abb5bbada49d938f827a6d675d554b423930261d140a00000000000000000000000000000000000000060e151b1f2122272925201f1c18120b06000000000000000000000000070f1c28333f4a5463707d8a99a4afbbc7d4d6cabfb4aa998d8073665a4d402d22170b0000000814202d3946525e6873808d98a2aebac1b9ada197887b6e62544a4034281d171b1f262b32373d434b51575f676d757f88939fa4aeb7c1ced6cdc4b9ada2978d8073665b5044382b1f1206000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7c3b6a99c908376695d5043362a1d100507080705020000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0adbac6c3b6aa9d9083776a5d5044372a1d110400000b1724313e4a5764717d8a97a4b0bdcac0b3a69a8d8073675a4d4034271a0d0100000000000000000000000000000000000000000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2becbc1b4a79b8e8174685b4e4135281b0e0713202d3a4653606d798693a0acb9c6c7baaea194877b6e6154483b2e21150805121e2b3845515e6b7884919eabb7c4c9bcafa396897c706356493d3023160a00030f1b27333f49536a7783909daab6c3d0cbbfb2a5988c7f7265594c3f3226190c00000000000000000c1926333f4c5966727f8c99a5b2bfcccdc0b3a69a8d8073675a4d4034271a0d000000000006121f2c3945525f6c7885929fabb8c5d2c8bbaea195887b6e6255483b2f2215080000000000000000000000000000050e17212a36424d57626e7b87939facb9c6d1d1c5b8aca095897d7063564c4135291d110500000000000004101c2834404a546975828f9ca6afb7bcc1bbb6b3adabaaaaa9a9a9a9aaaaaaa9a9a8a8a7a6a4aba49f9d9a9795908b85807b716c605d554b42382d231a0f0000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d20130700000000000000000000000000000000000008141e28333f4a545f6a73808d96a1adaa9e93897d70665c51443b3025190b02000000000000000000000000000000000000000000000000000006121f2b3844505c667985929facb8c5d2dfd5c9beb3a996897c6f6356493c31261a0e02000000000713202d3946525e687784919eaab7c4d1ddd3c6baaea298897c706356493d3023160a000000000000000000000000000000000000000000000000050e18212b353f45515c676e7b859299a3afbbb6aea59e949082796d675c544b42382f261b1106000000000000000000000000000000000006101820262b2e2f3436322d2c28231c17110e090704010000000003050b1119222b3844505b6673808d99abb5c0ccd7d3c6baaea298897c706356493d3023160600000005111e2a36414c56616d7a86929fa6b0babeb2a9998d8073665c51443a2f2622272b31373c43474f555c606a6e79818c939aa4afb6bfc9d2cec4bbb1a79e92857a6d61544a3f33281c0f03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7c3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0adbac6c3b6aa9d9083776a5d5044372a1d110400000b1724313e4a5764717d8a97a4b0bdcac0b3a69a8d8073675a4d4034271a0d0100000000000000000000000000000000000000000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2becbc1b4a79b8e8174685b4e4135281b0e0713202d3a4653606d798693a0acb9c6c7baaea194877b6e6154483b2e21150805121e2b3845515e6b7884919eabb7c4c9bcafa396897c706356493d3023160a00000b17222d434f5c6976828f9ca9b5c2d1ccbfb3a6998c807366594d4033261a0900000000000000000d1a2633404d596673808c99a6b3bfccccc0b5ab998c7f7266594c3f3326190c00000000000613202c3946535f6c7986929facb9c5d2c8bbaea195887b6e6255483b2f22150800000000000000000000000000060e162029333b46535f6974818e99a4afbbc7d4c8bcb1a79d9184776b6054443a3025190d0100000000000006121f2c3844515c667884919eabb7c1c1b7afaaa9a29f9e9d9c9c9c9d9d9d9d9c9c9b9b9a9997969993908d8a87837f7a746e69615a514b433a2f261c11080000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d201307000000000000000000000000000000000000020b17222d38424e58606d7984919ea6b0a69d9184786d60564c41362a1d140a00000000000000000000000000000000000000000000000000000713202d3a4653606d798698a2aebac6d3dfdacfc0b3a6998d807366574d42362a1e1308000000000714212e3a4754616d7a8796a0acb9c5d2dfd2c5b8ac9f9285796d6053463a2d20130700000000000000000000000000000000000000000000000000060f19232934404b555e69707d87929fa7b1bdb7afa69f958f82796d665c544a41382d22170f06000000000000000000000000000000030c18222a31373a3c41433f3a38342e28221c1a1413110d080d060b0f12131c2327333f4953606c7884919eaab7c4d2ddd2c5b8ac9f9285796d6053463a2d201307000000020e1925303b46525e68727f8c949ea8b2bab8ab9e9185796d60564c41382e2d33373c43474e545960676d737b838e939fa4acb6c0c8d1cec6bcb2a99f958b7e72685e5242382d22170b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7c3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0adbac6c3b6aa9d9083776a5d5044372a1d110400000b1724313e4a5764717d8a97a4b0bdcac0b3a69a8d8073675a4d4034271a0d0100000000000000000000000000000000000000000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2becbc1b4a79b8e8174685b4e4135281b0e0713202d3a4653606d798693a0acb9c6c7baaea194877b6e6154483b2e21150805121e2b3845515e6b7884919eabb7c4c9bcafa396897c706356493d3023160a0000061a2734414d5a6774808d9aabb4bfcbcdc0b3a79a8d8074675a4d4131261a0e02000000000000010e1b2734414e5a6774818d9aa7b4c0cdc7bbafa4998a7d7164574a3e3124170b000000000006131f2c3845515c67798699a3aebac7d3c8bbaea195887b6e6255483b2f2215080000000000000000000000030a0f182028323b45505a616e7b87929fabb5c0ccccc4b8aca0958b7e7165594f4432281e1308000000000000000713202d3a4653606d7986939facb9c4baafa59e9b97929190908f9090909190908f8f8e8e8c8b89888684807d7a77726d67615e575045403a31281d140a000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d2013070000000000000000000000000000000000000006111c262f3c45515d67707d8a949eaaaca0968c7f72685e52463d2f261c1106000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693aab4bfcad6e2ddd0c3b7aa9d908477695f53463a3025190f06000006101d2935404b5564707d8a97a8b2bdc9d5d9d0c2b5a89b8f8275665c5144382c1f12060000000000000000000000000000000000000000000000000000071118232f39434d57606b73808c95a0abb5c0b8b0a79f948f82786d665c53493f332721180b0200000000000000000000000000000b151e2a343c4347484d4f4b46444039332d2b2621201d191a191a171b1f20272c353d44505b65707d8a96a0acb9c5d2d3c7bbb0a69a8e8174665c5145382c1f13060000000008141e2a36414c56626d75828f96a1a8b2b9ada1978b7e72685e53493f38383f44464e53585f626b70797f8691959ea5afb6bec7d2cdc5bcb4aaa1969083786c60564c412f261c110600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7c3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0adbac6c3b6aa9d9083776a5d5044372a1d110400000b1724313e4a5764717d8a97a4b0bdcac0b3a69a8d8073675a4d4034271a0d0100000000000000000000000000000000000000000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2becbc1b4a79b8e8174685b4e4135281b0e0713202d3a4653606d798693a0acb9c6c7baaea194877b6e6154483b2e21150805121f2b3845525e6b7885919eabb8c4c9bcafa396897c706356493d3023160a00000a1724303d4a5763707d8a99a3aebac7cec2b5a89b8f827568574d42362a1e120500000000000004101c2834404a546976828f9ca9b5c2cfc6b9ac9f93867a6d6154473a2e21140700000000000713202d3a4653606d798693a0b4bfcbd7c8bbaea195887b6e6255483b2f221508000000000000000104060b0f151a212a323a444d57616c75828f99a3afbdc7cfc4baafa59d9083786d6053463d3220160c020000000000000006121f2c3844515c667885929fabb8bdb2a89e938f88858483838383838484838382828181807e7c7b797774716d6865605d55534d453e352f281f160b02000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d20130700000000000000000000000000000000000000000a141d2935404b55616c75828f98a2aea89f92857a6e61584e42382d22170b020000000000000000000000000000000000000000000000000613202d394653606c798699a3aebac7d3e0ded1c5b8aca095887b6e61564c41362a2117100c080f18222c3945515d6775818e9ba8b4c1ced9d2c7beafa5988b7f7265544a4034281c100400000000000000000000000000000000000000000000000000000007121d27313b454f59606d78839099a3afbbc2b9b0a69e948f81786d655b50443e33291d140a0000000000000000000000000007121c27303c464e53555a5c5853514a443f3837312d2c292427262622272b2d32383f474f58606c7883909da8b2bdc8d4ccc3b7ab9f94897c6f62544b4034281c100400000000020d1925303a44515b616d7a849196a1a8b1b3a99f92857a6d655b504a4245495053585f626a6f757d848c9298a0a7afbbc0c7d0cbc3bbb3aaa29891847b6e665b50443a301d140a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7c3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0adbac6c3b6aa9d9083776a5d5044372a1d110400000b1724313e4a5764717d8a97a4b0bdcac0b3a69a8d8073675a4d4034271a0d0100000000000000000000000000000000000000000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2becbc1b4a79b8e8174685b4e4135281b0e0714202d3a4753606d7a8693a0adb9c6c7baaea194877b6e6154483b2e21150805121f2c3845525f6b7885929eabb8c5c9bcafa396897c706356493d3023160a00000714202d3a4753606d7a86929facb9c5d1c4b8ab9e918578695f53463a2d21140700000000000006121f2c3844515c667784919eaab7c4d0c3b6a99d908376685d5246392d20130700000000000714212d3a4754606d7a8793a0adbad1dcc8bbaea195887b6e6255483b2f221508000105070709080d1113171b1f262b333c444c565e69717e8a939eabb5c0d0c6bdb2a89e93897d70665c5044382b1f1204000000000000000004101c2834404a546976828f9ca8b2b9aca0968f817c7977777676767677777776767575747371706e6d666764615e5653514b46423b3329241d160d0400000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d2013070000000000000000000000000000000000000000020b18242f3a43505a616e7b86929fa7aea2988e81746a60544a3f33281e130800000000000000000000000000000000000000000000000006121f2b3844505b667986929facb9c5d2dfe0d4c8bcb1a79a8d8073685e52463d3329211c171719212834404b55606d7985929facb8c5d2d8ccc0b6ac9e93887b6e6155483b2e23180c00000000000000000000000000000000000000000000000000000000010b151f29333d44515c666f7c87929fa7b1bdc2b8b0a69e938e81776c60594f453b2f261b11060000000000000000000000000c18232e39424e585f62676965605c54504a47423d3a3935303433332d3337393d44485059606a727f8c959fabbac3cecec3baafa59c9083766a605442392e23180c00000000000008131e29323f46525d686e7b8491969fa7afada2978f81776c605c544e51535b60636a6f757c828991969fa3aab1b9c1cccfc7c0bbb1a9a19892867c6f695e544a3f32281e0b020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7c3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0adbac6c3b6aa9d9083776a5d5044372a1d110400000b1724313e4a5764717d8a97a4b0bdcac0b4a79a8d8174675a4e4134271b070000000000000000000000000000000000000000000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2becbc1b4a79b8e8174685b4e4135281b0e0714212e3a4754616d7a8794a0adbac7c7baaea194877b6e6154483b2e21150804101c2834404b556c7985929facb8c5c9bcafa396897c706356493d3023160a00000613202c3945515d6776838f9cabb5c0cbc6b9ada197887b6e6155483b2e22150b0000000000000713202d3a4653606d7986929facb9c5c9bdb2a8998c807366564c4135291d110500000000000714212e3a4754616d7a8794a0adbac7d3c8bbaea195887b6e6255483b2f221511080d1113141618191d2022272b31373e454d565e686e7b85929fa5afbdc7cbbfb4aba1968e81756b60544a3f34281c10030000000000000000000c18232e3f4c5965727f8c96a0acb7aa9e9184786f6c656a6969696a6a6a6a696968686766646361605c545754524c4745403a3631292118130c040000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d20130700000000000000000000000000000000000000000007131d28313e46535e69727f8c95a0acaa9f93877c6f665b50443a3025190c020000000000000000000000000000000000000000000000030f1c28333f4a5f6c7885929fabb8c5d2dee4d9cec3b8ac9f92867a6d61594f453b332c282324252a333c45515c67717e8a98a2aebac6d3d4c8bbafa49a8f8275695f53463a2d1c12070000000000000000000000000000000000000000000000000000000000030d17212834404a545f6a73808c95a0abb5c0c1b8afa59e938c7f736b61574d41382d22170b020000000000000000000004101c2834404a545f6a6f7476726d66605b54534d4a47454142414040413f4446484f545a626b6f7c87929fa7b1bccccec5bcb2a89d93897c6f62584e4330271d1207000000000000020d17202935414c565f696e7b8490959fa4aca99e938d80746d6660585d60656c70767c82878f949ea0a8aeb4bcc3cbc8c3bdb5afa7a09792867d706a5f574d42382d20160c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7c3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0adbac6c3b7aa9d9084776a5d5144372a1e110400000b1724313e4a5764717d8a97a4b0bdcac1b4a89b8e8175685b4e422f24180d01000000000406070a0807050200000000000000000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2becbc1b4a79b8e8174685b4e4135281b070815212e3b4854616e7b8794a1aebac7c7baaea194877b6e6154483b2e21150806131f2c3845515c677986929facb9c5c8bbaea295887b6f6255483c2f221509000004111d2935404b5566727f8c99a3afbbc7c9beb3a9978a7e7164574b3e33271c0b0200000000000916222f3c4955626f7c8899a3afbbc7c5b9ada196897c706356493d3024190d0100000000000814212e3b4754616e7a8794a1adbac7d4c8bbaea195887b6e6255483b2f221e1e1f191d2021232424292c2d33373c434750575f686d7a849197a2adb8c1cbbfbaaea39991847a6d61594f42382e23170b000000000000000000000713202d3a4653606d7984919ea3ada89b8f827566605b535d5c5d5d5d5e5d5d5c5c5b5b5958565553514a4a4746413a39352f2a251f170f0701000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d201307000000000000000000000000000000000000000000010c161f2a36424d57606d7883909aa4afa49a9083786c60564c41362a1e140a0000000000000000000000000000000000000000000000000b17222d45525f6b7885929eabb8c5d1deddd4cdc6baaea2988d80736b60574d453e38342e3130363c454e58606d7984919eaab4bfcad6cbc0b5ab9f93877c6f62574d42362a1e0b00000000000000000000000000000000000000000000000000000000000000050f18232e39424e58606d79839099a4afbbc7c1b7afa59f93887d70695f53493f33271f14090000000000000000000006121f2c3844515c666f7c80827e79716c66625f575754524c4e4d4c4d4e495053555960636c717d859299a3aeb9c2cdc5bcb3a9a0968e81746a6054463d321e150b0000000000000000050e1924303a444d575f696e7b838d939aa0a7a59d928d80786f6a65676d72787d82878e939a9ea6acb2babfc6c6c3bcb8b1aba39f9591857c706b61584e453b2f261c0e04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7c3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a8794a0adbac7c3b7aa9d9084776a5d5144372a1e110400000b1724313e4a5764717d8a97a4b0bdcac2b5a89c8f827569554b4035291d10040000070c101313171514120e09030000000000000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2becbc1b4a89b8e8175685b4e422f24180d0815222f3b4855626e7b8895a1aebbc8c7baaea194877b6e6154483b2e2115080713202d3a4653606d798699a3afbbc7cbc0b5ab94877b6e6154483b2e2115080000010d18242f3b4855616e7b87929fabb5c0ccc0b4a79a8d817467594f44382c1d140a0000000005111d2935404b5566727f8c99abb5c0c9beb3a99e9184796d6053463a2d2013080000000000000815222e3b4855616e7b8894a1aebbc7d4c8bbaea195887b6e6255483b2f232b2b2b252a2d2e2f313035393a3f44464e535a61696e7a839096a0a9b3bec6bfbaada39f92877c6f685d52473d30261c11060000000000000000000006131f2c3845515c67707d8a919ca3a99c9083766a5f57595a5b5b5a5a59585654524d4e4d4b49484644403e3a3936302c29241d1a140d050000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d20130700000000000000000000000000000000000000000000040d1a25313b44515c666f7d88939fa9ac9f958b7e71685e52463d30261c11060000000000000000000000000000000000000000000000061e2b3744515e6a7784919daab7c4d0ddd4cbc2bcb7b4aa9f92877d70695f575046443f3f3d3e41464e575f6a727f8c96a0acbcc5d0cbc2bbafa3998e81756a5f53453b31261a0e000000000000000000000000000000000000000000000000000000000000000007121c27303c45515c666f7c87939fabb5c0ccc1bbafa49a92857b6e655b50443b30251a0e030000000000000000000713202d3a4653606d79858d8f8b847e78736e696663605d565b5a59595a535b6062656b70767e879297a1abb5bfcac3bbb3aaa2979184796d60584e43342b200c0300000000000000000008131e28323c454d575f696e78808890959ea1a49d928d827c7672747a7f848a8f939a9fa4acb0b8bdc3c6bfbab8b1aba7a099928d837b6f6a61594f463c33291d140a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7c3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7c4b7aa9d9184776a5e5144372b1e110400000b1824313e4b5764717e8a97a4b1bdcac3b6aa9d908377675d5145392c2013070a0f12181c1f202422211e1a140e0600000000000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926323f4c5965727f8c98a5b2bfcbc2b5a99c8f827669554b4135291d110a1723303d4a5663707d8996a3b0bcc9c8bbaea295887b6f6255483c2f2215070815222e3b4855616e7b8894abb5c0cbc7bbafa399877a6d6054473a2d2114070000000714212d3a46535f6975818e99a4afbbc7c4b7aa9d9184776b6155483c2f261b11080300040c17212c3945515d6776828f9ca9b6c2c6b9ada1978b7f72665c5144382c1f12060000000000000815222f3b4855626e7b8895a1aebbc8d4c8bbaea195887b6e6255483b342e3738383036393a3c3e3f414547495053585f626c717b8490959fa8b2bbc4bcb4aea39b918b7f726a60564c41352b1e140a000000000000000000000004101c2834404b55616c727f8c919fa29f93877c6f6965666768686767666563615e575a5653504a48443e38332d2a25201d18130e0903000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d201307000000000000000000000000000000000000000000000009141f2834404a54606b74818e97a2ada79e92857a6d61584e42382e23170b0200000000000000000000000000000000000000000003101d293643505c6976838f9ca9b6c2cfd8cdc2b8b0aba9aaa39992857b6e69615a53504a4b4a4b4c52575f696e7c86929fa8b2bdcecbc2b9afa59f92877c6e62584e43332a1f14090000000000000000000000000000000000000000000000000000000000000000000b151e2834404b54606a75818e99a4afbbc7ccc0b6aca2979082776c60574d42362a2015090000000000000000000714212d3a4754606d7a87979c96918a84807b7673706d6869686766666768656c6f72767d838b9299a1a9b3bdc6bfbab1a9a29892857c6f675d51463d3222190f00000000000000000000020c16202a333c454d575e666d737d838b91969b9f9d949088827f80858b91969c9fa4acafb6bec1c5bebab4aeaca79f9d95908780796e6960584f473e342a21170b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7c3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b8794a1aebac7c4b7aa9e9184776b5e5144382b1e110500000b1824313e4b5764717e8a97a4b1bdcac5b9ac9f92867a6d6053473a2f241816171b1d23282c2d312e2d2a261f180f06000000000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5b2bfccc3b7aa9d908477675d5145392c2014091825323e4b5865717e8b98a4b1becbc9bcafa396897c706356493d2f23180c0a1623303d495663707c8996a3afbcd1c5b9ac9f928679675d5145392c20130600000005121e2b37424d57626e7b87939fabb5c0c5b8aca096897d7063584e41382d2219130f0c10161e28343f4a54606d7a86929facb9c5beb3a99e9185796d60544a4034281c10040000000000000916222f3c4955626f7c8895a2afbbc8d4c8bbaea195887b6e62554844404544444545414647494b4c4c5254535b60636a6f767e8591969fa7b1bac1bab2aaa39f918c7f726d62584e443a3023190c020000000000000000000000000c18232e3943505a636d737f8b92979e9991847b72727374757574737372706e696a6763605c54554f48443e37322a2218120b030000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d2013070000000000000000000000000000000000000000000000030c18232e39424f59616d7a85929fa7ada2978e81746a60544a3f34281e1408000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c7bcb0a69f9c9da0a19790837b706c64605c54585758565e616a6e7b859198a2aebac4cbc1b9b1a79d938b7f726a5f53463c3121180e03000000000000000000000000000000000000000000000000000000000000000000030c18232e39424e58626e7c87939facb6c0ccc7beb3a99f948b7f72695e52463c31261a0e0100000000000000000613202c3945515d677885929ea09e96918c8883807d7a777675747373747576797c7f838990949fa3abb3bbc2bcb4aea79f9792867d706a5f554b40342b2010070000000000000000000000040e18212a333b454d545c606b70787e848a8f92999f9c948f8c8d92989ea0a8acafb6bbc0c7c5bcb3adaaa29f9b95908a837c736d675f574e463e352c22190f050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7c3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b8794a1aebac7c4b7ab9e9184786b5e5145382b1e120500000b1825313e4b5864717e8b97a4b1becac7bbafa399897c7063554b403529242324272b2e34383a3d3b3a36312a21180e030000000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfccc5b9ac9f92867a6d6054473b30251a101c28343f4a546673808c99a6b3bfcccbbeb1a5988b7e7265554b4034291d12071825313e4b5864717e8b97a4b1becac4b7ab9e9184786b554b4135291d1104000000020e1a26313c47535f6975818e99a3afbbc2bdb2a89c8f82766a5f53493f3329241f1c181c2028303944505c66727f8b99a3aebac3b9ada1978c7f72675d5142392e23180c000000000000000916232f3c4956626f7c8995a2afbcc8d4c8bbaea195887b6e625553514a51515152524c5254565759565d6064656c6f757c828a9297a0a8b1b9bdb9afa8a198928b7f726d625b51463d32281e11070000000000000000000000000007121d27303e48515b636d737e858f949e9691867f7e7f81828181807f7f7d7b787673706d66636159554f47433c3428231c150c0300000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000007121c27303d46525e68727f8b95a0aca99f93877c6f665c50443b3025190c030000000000000000000000000000000000000000010d1a2734404d5a6773808d9aa6b3c0cdd0c4b7ab9f949091959ea09590857d75706d666665646466686d737c849197a1aab4bec6bfbbafa79f958e81746d62584e43342a200f06000000000000000000000000000000000000000000000000000000000000000000000007121d27303c47535f6a75818e9aa4afbbc8d0c5bcb0a69f92867b6e61574d42372b1d1307000000000000000004111d2935414b556a7683909da9a8a19e9995908c8a86848281807f8081828385888c90949c9fa6aeb4bdbab8b0aaa29f9590857d706b60584e433a2f22190f00000000000000000000000000060f18212a333b424a515960666c71797d8287929fa69f9c989a9fa2aaacb2b9bbc0c7c8c6beb3a9a29f98928e89837d786f6a605c554d453d342c231a1007000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7c3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7c4b8ab9e9185786b5e5245382b1f120500000c1825323f4b5865727e8b98a5b1becbcbc0b5ab9a8d8074675d51453d352f30303237394045464a4846423b332a1f14090000000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3bfccc7bbafa3998a7d7063574d42362a21171f2b3844505c6675828f9ca8b5c2cfcec1b5a89b8e8275675c5145392e2318131d2935414c566774808d9aa7b3c0cdc1b5a89b8e8275685b4f422f24180d010000000009141f2b37424d57626e7b87929fa7b1bbc3b7ab9f94887c6f655b50443e352f2b2823282c323a424d57606d7984919eabb4bfb9afa59e9285796d60554b4030271c120700000000000000091623303c4956636f7c8996a2afbcc9d4c8bbaea195887b6e6260605c545e5e5e5e5f565e6162646667686d7174787c82878f949fa2a9b2bab9b2aca59e9691867e726d635b51493f342b20160c0000000000000000000000000000000b151e2c363f49515b636c717b828f96a198928b8b8c8d8e8e8d8d8c8b89878583807c7975706b636159534e463f342e271e150b02000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000b151e2a36414c56606d7883909da5afa49a9083786d60564c41362a1e150a0000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2bed0cfc3b6a99c9082848f949ca097928a827d79757372707173767a80869196a1a9b2bcc0bbb5aea59d959083796d605b51463c3122180e000000000000000000000000000000000000000000000000000000000000000000000000000b151e2b37434e58626f7c87939facb9c5cfcec2baaea2988e8174695f53473a2f24180d0100000000000000010d18242f424f5b6875828e9ba8b2acaba79f9d999a93918f8e8d8c8c8d8e8f9297989c9fa6abb0bab8b4aeaca69f98928c837c6f6b60594f463c31281d10070000000000000000000000000000060f182129303940444f545b60686d737a808d9aa7aba9a5a7acaeb4b9bdc3c8c7c0bbb9baada297928b85817d77706c655f58514b433b332b221a110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7c3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b8895a1aebbc8c5b8ab9e9285786b5f5245382c1f120500000c1925323f4c5865727f8b98a5b2becbd1c5b8ab9f92857a6d60584e45403d3c3d3e43474b51535755534d453b31261a0e0200000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2733404d5a6673808d99a6b3c0cccbc0b5ab9b8e8175695e52463d332920202d3a4653606d7985929fabb8c5d2d0c5b8ab9f9285796d60544b403429231f222c3945525d687783909daab6c3cabfb4aa988c7f7265594c3f322619070000000000030e1a26313c47535f6a73808c959fa9b2bcbbb0a69c8f82776c60595045413a38332e34383d444c545e69717e8b96a1acbdbab1a79e938a7e71675d5143392f1e150b00000000000000000a1723303d4a5663707d8996a3b0bcc9d4c8bbaea195887b6e6e6d6d666b6b6a6b6b6b6c686d6f717274767a7e8185898f939a9fa6adb3b8b2aca8a09e938e847c716c635b51493f372d22190e040000000000000000000000000000010c161f2a343c464e575f676d747c84919ea29f9898999a9b9b9a9a9998969892908d8985817d77706b625f585044403930271d140a000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000030c1925303a44505c66707d89939eaaaca0958b7f72685e52463d30261c110600000000000000000000000000000000000000000a1723303d4a5663707d8996a9b3becacfc2b5a89c8f827a828c929fa29f948f8a8481807e7d7e7f82868c9298a1a8b2bbbbb6afaba39f938e837a6e675c51493f342a201006000000000000000000000000000000000407090a0807050200000000000000000000000000030c1a26313c47535f6a75818e9ba9b3bec9d5cabfb4aa9f92877b6e62554b4035291d11040000000000000000071a2733404d5a6673808d99a6b3b2a9a19ea1a9a49f9d9c9b9a99999a9b9c9ea1a9a9abb0b4b4aeacaaa29f9a948f867f786e6a60594f473d342a1f160c000000000000000000000000000000020b161f29333b454d565d606c717a80868d929da9b5b6b2b3b8babfc5c7c4bdb9b6afacafab9f92857e7975706b64605b534e4540393129211910080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7c3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000915222f3c4855626f7b8895a2aebbc8c5b8ab9f9285786c5f5245392c1f060000000c1926323f4c5965727f8c98a5b2bfcbd3c6baada2978c7f736a6058514b4a494a4b4e54555c6064615f574d42362a1e120500000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2734404d5a6773808d9aa6b3c0cdd1c5b9ac9f92867b6e61594f453b322c2d35414c56626f7c8998a2aebac6cec6bfbaada2978b7e71665c51453d342f2c2d343c4754606d7a86929facb9c5c6baaea298897c6f6356493c302316090000000000000915202b37424e57606d78839096a1aab3bbb7aa9f948c7f736b625a524c46443f424045464e565d666e7b85929fa8b2bab2a8a0958e81746c61554b4031271d0c0300000000000000000a1724303d4a5763707d8a96a3b0bdc9d1c9bdb0a3968a7d7b7a7a797978787777787879797a7c7e7f8183868a8e92979b9fa4acb0b7b1aba8a19e969189817a6f6a625a51493f372d241b100700000000000000000000000000000007131d28313c464e585f696e7980879196a1adabaaa29f9b969992929794989c9f9d9a97928e8a837d776f6a625a514a42392f261b11060000000000000000000000000000000000000406070604000000000000010e1a2734414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000008131e28343f4a54606b75818e98a2aea79f92857a6e61594f42382e23170c02000000000000000000000000000000000000000814212e3b4754616e7b8797a2adbac6cfc3b6a99c90837677808a92989f9e9c97918e8d8b8a8b8c8f92989fa3aab2b8b5afaca49f99928b81796e685e554b40372d22180e000000000000000000000000000000050b101416171514120e09030000000000000000000000000a15202b37434e58636f7c8997a1adb9c6d2d0c6bbafa3998e8174675d5145392c20130600000000000000000b1825323e4b5865717e8b98a4b1ada1969196989b9ea1a8a5a7a6a6a7a8a9abadacabaaa9a8aaa29f9c98928e88827b726d665f584f473d352b22180d040000000000000000000000000000000a141d28313b454d575e686d757e858d92989da4aeb9c2bfc0c5c6c6bfbab8b2acaca49fa4aca2979288837f7a746d68605b544c443c342a21180e050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7c3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c8895a2afbbc8c5b8ac9f9285796c5f52462e23170c0000000c1926333f4c5966727f8c99a5b2bfcccfc5bbb3a99f92877c6f6a605d5557565758586062676d706e695f53463a2d21140700000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1a2734414d5a6774808d9aa7b3c0cdd3c7bbaea3998e81746b60574d443d39393f45525d6874818d9aaab4becac6bcb4aeaca99d9184796d60594f45403a38393e46515b65727f8b99a3afbbc7c5b8ac9f9285796d6053473a2d201407000000000000030e1a26313c44505c666e7b849198a2a9b2bab0a69f93877d716c605d5653504a4e4b51535860686d78839097a2adb9b1a8a0969083796d605a5043392f1f150b0000000000000000000a1724313d4a5764707d8a97a3b0bdc4c4c4c3b2a59a908a8887878686858484848585858687898a8c8e9092999b9ea1a9acafb2acaaa79f9d96918b847d756d68605850483f372e251b1209000000000000000000000000000000010d18242f3a434e585f6a6f7b838d9399a1a9afa69f98928e8987868586888b90949ea1a29f9b95908a837c716c605c544a41382d22170b04000000000000000000000000000001070c10131413100c0703000000010e1a2734414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d2013070000000000000000000000000000000000000000000000000000020b17232e38424f59616e7b86929fa8ada2978e81746b60544a3f34281f1409000000000000000000000000000000000000000714202d3a46525e697885929fabb8c5d0c3b7aa9d9084776c737e858e939a9fa19e9b99989797999c9fa3aaaeb4aeacaba49f9a938e877f746d675e564d43392e251b0f060000000000000000000000000000080f161c20232322211e1a140e060000000000000000000000030f1a26313c4653606d7985929eabb8c5d0d7cbc0b5ab9f92857a6d6053473a2d22170b00000000000000000a1723303d4a5663707d8996abb5ab9e9184888b8e919696989a9b9c9d9e9fa4a39f9e9d9d9b9898928f8b86817c766e69605c544e463d352b2319100600000000000000000000000000000006111b262f3a434d575f696e7a818b92979fa2aaaeb6c0cbcdc7c3bcb8b4aeaca8a09e9a939a9ea1a29a93908c85807a726c665e564e463c332a20170d0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7c3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c8995a2afbcc8c5b9ac9f9286796c5f4a3f34281c100300000d192633404c5966737f8c99a6b2bfcccabeb3a9a29e9991857c726d676563636365676a6f74797d7b6e6155483b2e22150800000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1b2734414e5a6774818d9aa7b4c0cdd7cbbfb5ab9f93887d70695e564f474546475059606d7a86929facb8c5c6bcb4aaa39fa3a0968c80736b6159514b474546474f58626d7784919dabb5c0c7bcb1a79a8e8174675c5145382c1f13060000000000000009152028343f4a545e696f7c869297a1a8b0b9afa49992867e746d6862605b545b555c60646a6f7a828f959fa9b3aea79f9691847b6e675d51483e31271d0d030000000000000000000b1824313e4b5764717e8a97a4b1b8b8b7b7b7b6aba29a96949493999292919191919292939a9597999a9c9fa3ababadacaaa8a8a09e9a95908b847e79706b615e564e463f362e251c130a0000000000000000000000000000000004111d2935404b555f6a6f7c8590959fa4abafa59e949086817d7a79787a7b7e838a9197a0a8a79f9d9590867e746d665c53493f332720150a00000000000000000000000000030b12181d1f201f1d18120f0b0600010e1a2734414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000006111c26303d46525e69737f8c96a0aca99e93897d6f665c50443b30251a0c0300000000000000000000000000000000000005111e2a36424d57697683909ca9b6c3d1c4b8ab9e918578686c717a818790959b9fa3aba5a3a4a6a9aaa9a8a7aaa29f9c99938e87817c726d605c554d443b30271d1309000000000000000000000000000008111a21272c2f302e2d2b261f180f0600000000000000000000000a151f2b3844505c6674818e9baab4bfcad6d1c7baaea2988b7e716553493f33271b0f03000000000000000815222e3b4855616e7b8899a3afa194877b7b7e828487898c8d8e8f9192939a99929291908e8b8885837e7a746f6a615f57504a423c342b23191107000000000000000000000000000000000b17222d38414c555f696e7b838e939ea1a9aeb4bcc0c8c8c2bcb8b1acaaa39f9b96918c868a91979ea49f9d98928d857e786d685f584e453c32291f140800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7c3b6a99c908376695d5043362a1d10030000000000000000000000000000000000000000000000000000000000091623303c4956636f7c8996a2afbcc9c6b9ac9f938679665c5044382c1f120600000d1a2633404d596673808c99a6b3bfccc6b9ada29792979791867f7a7571706f707174777c81858a7f7265594c3f3226190600000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1b2835414e5b6874818e9ba7b4c1cecec4bab2aca49a91847b6e686059545252545a626c74808d98a2aebac6bfb4aaa2989298a09f92877d706b605c555351525459616a727e8b95a0acbdc7c4b8ab9f95887c6f62554b4034291c100400000000000000030c17232e38424d575f6a6f7c8591969ea6adb3aba298928b817a746f6c66686869676d71767c848f949ea7b1aca49d9590847b6e695e554b40362c1f150b000000000000000000000b1825313e4b5864717e8b97a4ababababaaaaaaa9a9a9a3a1a1aba39f9e9e9d9e9e9e9f9fa4aca4a5a7a9a9a8a6aba49f9d9b9896918d88837e79726d676059524c443d342d241c130a01000000000000000000000000000000030e18212c3945515d676f7c859297a0a7afb1a79e938f827b75706e6c676d6e71767d859196a0a9aba7a098928b80786d655b50443c31261b0f040000000000000000000000040d151d24292c2d2c29241f1c17110a020e1a2734414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000a141e2a36424d57606d7984919ea6afa59d9083786d60574d42362a1e150b000000000000000000000000000000000000020e1a2530404d5a6673808d99abb5c0cbc6b9ada197877a6d60686e747c838a8f9299999a9b9c9d9e9d9c9b9a9998928f8b87817c756f6a625b514b433b32291e150b0100000000000000000000000000050f1a232c33383c3d3b3a37312a21180b020000000000000000000003101c28343f4a5464707d8a98a2aebac7d3d6cabfb4aa9c8f8275655b5044372b1f1205000000000000000713202d3a4653606d7986929faca296897c6f7275787a7c7f808183848586878786858483817e7c7976726d67625f58534d443f38302a2219110700000000000000000000000000000000030f1b27333f49535d676e7b8491959ea5adb3babfc6cac3bcb8b1aba7a09d98928e89847f7b7d858f939ea5aaa29f97928b827a6f6a5f574e443b3025190d04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7c3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c8bbafa49a86796d6053463a2d20130700000d1a2734404d5a6773808d9aa6b3c0cdc5b8ab9e9285919798928c85817e7d7c7d7e8184898d928d8073665a4d402d22170b00000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1b2835424e5b6875818e9ba8b4c1cec9bdb2a8a19e9f9691837a706b63605d5e61646c717e8a929daab4bfc3baaea29892859095a09992867d736d6762605c5d61646b707c86929fa8b1bdc4baafa59d9083766a5f5443392f23180c00000000000000000006111c26303b454e58606a6f7c848f949ea1a9aeaaa29f938e86807c797675757678797e828791969ea6ada8a19e928d837a6e695e564d43392f241a0d03000000000000000000000b1825323e4b5865717e8b989f9f9e9e9e9d9d9d9d9c9c9c9d9d9d9d9d9e9e9e9e9e9f9f9f9fa39f9e9e9d9c9c9a979993918e8c8884807b76716d66605c554f46413a322b221b120a01000000000000000000000000000000000915202b37434e58606d79849197a1a9b1b8aca0958f81786e696361605d6061656b707a849197a2adb1aaa39f928e81776c60584e43372b20150a00000000000000000000040e161f272f35383a38352f2b28221c140b091a2734414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000000020c1a25303b45515c67707d8a949fabaca0958c7f72695e52463d30271d1207000000000000000000000000000000000000091723303d4a5663707d8999a3afbbc7c9beb3a996897c6f635e616a6f787d8286898c8d8e8f9091908f8e8d8c8985827f7b756f6a625f5851454039312920170c0300000000000000000000000000000b16212c353d44484a4846423c332a1d140a00000000000000000000000b17232e3a4753606d7986929facb8c5d2dbd0c5b8ab9f9285796c605346392d2013060000000000000006121f2c3844505c667884919eaba4978b7e716568686d70727475767778797a7a7978777675726f6d6665605d55544e46423c342e261e180f07000000000000000000000000000000000005121f2b3744505b656d79849196a0a8afb9bec5cac6bfbab1aca79f9d95908b86817d78736e717a818e939ea7aea9a29e948f847c6f6a5f564d41362a1f160c010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7c3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a96a3b0bdc9ccc0b6a093867a6d6053473a2d20140700000e1a2734414d5a6774808d9aa7b3c0cdc1b4a79b8e8185919e9f97928e8b8a898a8b8d91959a9a8e81746753493f33271b0f03000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1c2935424f5c6875828f9ba8b5c2cec5b9aca19691939a9591857d76706d68686d71767e87929fa4aebcc2b9b0a69f92867b839097a19892878079736f6d67686d70757d859298a2aebac3bbb2a89d938a7d7063584e4331271d1207000000000000000000000a151e29333c464e58606a6f7a828b92979fa2aaaca59d98928d88858382818384868a8f939aa1a8a9a29e96918a81796e685e574d443b31271d120800000000000000000000000c1925323f4c5865727f8b93929292919191909090909090909090919191919192929292929399929291908f8f8d8b888684827f7b77736f6a65605c54514b433d363029201910090000000000000000000000000000000000020f1a26313b4754606a74818e96a0a9b3bbb0a69d9083796d665f5754535153555961686e7b85929fa8b2b4aea59d938c7f726a5f53473c31261b0f030000000000000000020c162028313940454745403938332d261d1a151a2734414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000009141f2834404b55616c76828f99a3aea79f92867b6e61594f42392e23180c0300000000000000000000000000000000000714202d3a4753606d7a86929facb9c5cfbeb1a4988b7e7165585860656c70757a7d7f8082838484838281807f7c7975726e69625f58534e463f342f271f170e05000000000000000000000000000004101c27333d474f555655534d453c2f261b11060000000000000000000006131f2c3845515d6776828f9ca9b5c2cfdcd3c6baada297887b6f6255483c2f2215090000000000000003101c28343f4a546976838f9ca9a6998c7f7366565e6163656768696a666d6e6d6c656a6a686562605c5454514c47433c373128231c140c06000000000000000000000000000000000004101d2935404b55606c77818f96a0a8b1bac1c9cbc3bcb4aea7a09d95908a837f7a75706c6561686d78818e959faab3ada69f9691857c6e685e52463e31281d13070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7c3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0bdcad2baada094877a6d6154473a2e21140700000e1b2834414e5b6774818e9aa7b4c1cdc1b4a89b8e817f8b949ea29f9b98969696989a9da0a89d908376655b5044372b1f1205000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000101c2936434f5c6976828f9ca9b5c2cfc4b7ab9e918487939f979188827d7a78797a7e828b9299a3aeb6c0bbb0a79e948c7f727b859197a199928d84807b7a78797a7d82879297a2aab4bfbbb2a9a1968e81746b6155463c321f150b0100000000000000000000030c17212a343d464e585f686d777e858d92989ea1a8aaa29f9a9892908f8e909192999c9fa4a7a09d97928c847d746d675e564d453b32291f150b0000000000000000000000000916232f3c4956626f7c8686858585858484848383838383838384848484848585858585868686868584838382807e7c7a7775726e6967625f5853514a454039302a251e170e0700000000000000000000000000000000000006121f2b37434e58626f7c87939fa8b2bbb7ab9f94897c6f675d544d47464547484f565f69727f8b96a1acb9baafa59f92867c6f62584e43372b1f1206000000000000000008131e28323a434b5153514b46443f382f2b2620182734414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000030c18232e39434f59626e7b87929fa9aea2988e81756b60544b4034281f140900000000000000000000000000000000000613202c3945515d677683909ca9b6c2cdc0b3a79a8d807467564e535b6063676d7073747576777877767574726f6d6665615f57534e47433c3429231d150d050000000000000000000000000000000714202c38444f596063615f574d41382d22170b0000000000000000000004101d2935404b556774808d9aa7b3c0cddad6cabeb3a9978a7d7064574a3d3124170a00000000000000000c17232e414e5b6774818e9aa7a79b8e8174685b525456595a5b5c545c606160605b535d5b585553504a4745413a37322b261f17110a0200000000000000000000000000000000000006131f2c3845515d67717e8b939ea8b2bac3ccc9c1b9b1aaa29f959089837d77726d6863605b565d666d78839098a3aeb9b0a8a09791847a6e615a50433a2f24180d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060814212e3b4754616e7a8794a1adbac7c3b6a99c908376695d5043362a1d100a0a0a0807050200000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1bdcac7baaea194877b6e6154483b2e21150800000f1b2835424e5b6875818e9ba8b4c1d0c2b5a89b8f8278828f959fa7a8a4a3a2a3a4a7aaacac9f9285796c605346392d201306000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000101d2a3643505d697683909ca9b6c3cbc1b5a89b8e81808d949f9a938f8a878585878a8f949fa3abb4beb6afa69f958f82786d6f7c8591969f9f96918c88868585878a8f9399a2a9b3bcb9b1a9a19791847a6d60594f44342a200d03000000000000000000000000050f18222b343d464e565d656c717a80868c91969a9d9fa3aaa29f9c9b9b9c9e9fa3a39f9c9995908c857f79706b605c554d443b332920170d030000000000000000000000000815222e3b4754606a6f787979787878787777777676767676777777777778787878787979797979787777767573716f6d676865625f5755534e46444039342e271e19130d05000000000000000000000000000000000000000814212e3a47535f6a76828f9aa4afbac0b5ab9c8f82766b60554b423b39383a3e444d57606d7984919eabb7c0baaea3998f82756a5f53473a2e21150700000000000000010d1924303a444c555d605d5553504a423e373129242734414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000007121d27303e47535f6973808d97a1adaa9e93897d70665c51453b31251a0c030000000000000000000000000000000004111d2935404b5565727f8c98a7b1bcc8c3b6a99d908376685e52495053555d6063666768696a6b6a6968676663605c5455534d47433c37312a2218120b03000000000000000000000000000000000916232f3c4855606b706e695f53493f33271b0f03000000000000000000000c18242f3f4b5865727e8b98a5b1becbd8dbcfbeb1a5988b7e7265584b3f3225180c0000000000000000061926333f4c5966727f8c99a5a99c90837669544b47494c4d4e504a50535454535049504e4b4946443f3a39352f2b26201a140b0600000000000000000000000000000000000000000714202d3a4753606d7984919ea5afbac3ccc9c1b7afa7a098928c837d76706b65605d5653504c545c666e7b86929fabb5bab2a9a1969082766c61554b4135291d110400000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b10121316212e3b4754616e7a8794a1adbac7c3b6a99c908376695d5043362a1d161717171414110e09020000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1bdbfc0bbaea195887b6e6255483b2f22150800000f1c2935424f5c6875828f9ba8b5bfbcbeb6a99c8f83767a8390959da4acb1afb0b1b4b7b8aea298887c6f6255493c2e23170b000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000111e2a3744515d6a7784909daab7babfbdb5a89c8f82798290969f9f9c9697929298979c9fa6aeb4b8b1aca49f9490837a6d666a6f7b8490949fa19e999a93929298979b9fa4abb3b9b2ada7a09691857c6f675d51473e3322190e0000000000000000000000000000071019222b343c444c535b60686d747a8084898d90929997999a9b9b9b9a9a999798928f8c88847f7a736d676159514b433b322921170e050000000000000000000000000006131f2b38434e5860656c656c6c6b6b6b6a6a6a6a6969696a6a6a6a6a6b6b6b6b6b6c6c6c666c666b6b6a6969676462605d555955534d4847433c38342e28231d150c080200000000000000000000000000000000000000000815222f3b4855626e7b88949facb6c0bbafa3998b7e7164594f4339302d2c2d323c45515c6673808d99aab4bfbfb4ab9e94887c6f6255483c2f24180d0100000000000005111d2935414c565d676d6764605b545047423c352f2734414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000b151e2b37424d57606d7a85919ea7afa59d9184796d60574d42362a1e150b00000000000000000000000000000000010d18242f3b4854616e7b87959fabb8c5c6b9ac9f93867a6d61544744464b515356595a5b5c5d5e5d5c5b5a595653514a4846423c37312b2620181007010000000000000000000000000000000004101d2935404b5563707d7b6e655b5044372b1f130800000000000000000000071724313e4a5764717d8a97a4b0bdcad7d9ccbfb2a6998c7f7366594c403326190d00000000000000000b1824313e4b5764717e8a97a4ab9e918478665c51453d3f4142433f4446474746443f43423f3c3a38342e2c29241e1b150e0903000000000000000000000000000000000000000006121f2b37434e5865727f8c96a1adb7c1cccbc1b7afa59e9590867f78706b63615954524c4644424a545f6973808d99a3aebbbbb2a89f948b7e71675d5145392c2013080000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171c1f2023242e3b4754616e7a8794a1adbac7c3b6a99c908376695d5043362a232323242421201e1a140d0500000000000000000000000000000000000000000c1925323f4c5865727f8b98a5afb1b2b3b6afa295887c6f6255493c2f22160900000f1c2936424f5c6975828f9ca8aeb4b0b1b3aa9d9083776d7a838d929da0a7acafb6b4b5b4b4aa998c7f7366544a3f34281c10030004111d2a3744505d6a7783909daab6c3d0ccc0b3a6998d8073665a4d4033271a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000111e2b3844515e6b7784919eaaacaeb4b0b2a99c8f83767a8490959fa2a9a19e9fa2aaa9abb0b4aeaca79f9a938d827a6d685d5f696e7a828c92999fa4a49f9e9fa2aaa8acafb5aeaca9a19e9590847c6f6a60554c41352c211007000000000000000000000000000000071019222a323a414950565e61686d73787c808386898a8c8d8e8e8e8e8d8c8a888683807b77726d67605d554f454039302920170f050000000000000000000000000000030f1b27323d464e535b605b5f5f5f5e5e5e5d5d5d5d5d5d5d5d5d5e5e5e5e5e5f5f5f5f5f5b605b5f5e5d5c5c5a585553514b4c4847423c3a37312c28231c18120b0300000000000000000000000000000000000000000004111d2935404b556673808d99a6b0bec5b9ac9f92867a6d6054473d3127201f202834404b54626f7c8898a2aebac6bdb0a6998d807366554b4035291d10040000000000000713202d3946525d686d7977716c66615a534d45413a332d414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000030c1a26313c45515d67717e8b959fabaca0968c7f72695e53463e30271d1207000000000000000000000000000000000714212d3a46535e697683909daab3bec7bbafa4998a7e7164544a3f39404547494c4d4f505151504f4e4d4c494644403b3a37312b26201b150e060000000000000000000000000000000000000613202c3945515d67788483786c6053463a3025190d030000000000000000000a1723303d4a5663707d8996a3b0bcc9d6d9ccbfb2a6998c7f7366594c403326190d00000000000000000916232f3c4956626f7c8995abac9f9386796d6053463a3234352e34383a3b3a3937332d35322f2d2b2823201d19130f0a04000000000000000000000000000000000000000000000815212e3a47535f6a7784919ea9b2bdc9d0c3b9afa59e938e837b726d666059554f4745413a3738424d57616e7b86929facb9c4bab0a69e91857a6d6054473a3024190d01000000000000000000000000000000000000000000000000000000000000000000000000000000020c141c23282b2d3030303b4754616e7a8794a1adbac7c3b6a99c908376695d5043362f30303031312e2d2a251f170e05000000000000000000000000000000000000000c1926323f4c5965727f8c98a1a2a4a5a7a9aba296897c6f6356493c302316090000101d293643505c6976838f9c9fa2aaa3a4a7a99d918477686d79808990959c9fa4aca8a8a7a6a89c908376665c5044382b1f12060004111e2a3744515d6a7784909daab7c3d0ccc0b3a6998d8073665a4d4033271a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000121f2b3845525e6b7885919d9e9fa3aba3a6a89d9083766e7a838c92989ea1a8a7a8a9a9a8a7aaa29f9b95908880796d685d56575f686e7880868f939a9ea1a9a7a8a9a9a8a7aba39f9c97918b837b6f6a60584e433a2f231a10000000000000000000000000000000000007101820282f383f444c52565e61656c6f73767a7c7e7f8081828181807f7d7c7976736f6a65605d55514b433e342e271e170e05000000000000000000000000000000000a16202b343d41495053504952525251515150505050505050515151515152525252524a5053504a5150504f4d4b494745403f3b3a37312e2b261f1c18120c0700000000000000000000000000000000000000000000000613202c3945515d677784909daab7c2c4b7aa9d918477685d5245392b1f151318232e394653606c7985929facb8c5c1b7aa9d918477675d5145392c2013060000000000000714212e3a4754616d7a86837e78706c625f57514b443f38414d5a6774808d9aa7b3c0cdd3c6b9aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000000915202935414b55606c78839099a4afa89f92867b6e61594f43392e23180c0300000000000000000000000000000005121e2a36424d5765727f8b98a2aebac7c0b5ab9b8e8174665b50443835393a3d404142434445444342413f3c3a38342e2d2b261f1a150f0a03000000000000000000000000000000000000000714202d3a4753606d7a86897d7063564c41362a1f14090000000000000000000a1623303d495663707c8996a3afbcc9d6d7cbbeb1a4988b7e7165584b3e3225180b00000000000000000815212e3b4854616e7b8799a4afa499887b6e6155483b2e272823282c2d2e2d2d2b2722282522201f1c1713110d08010001000000000000000000000000000000000000000000000915222f3c4855626f7b8896a0acbbc4cfc7beb1a79e938e81796e69605c544f48443e3935302b303c46525e6976828f9ca9b5c2c2b9ada1978b7e7164564c4135291d11050000000000000000000000000000000000000000000000000000000000000000000000000000000a141e262e34383a3d3d3d3c4754616e7a8794a1adbac7c3b6a99c908376695d50433c3c3c3d3d3d3d3b3a36302920170d020000000000000000000000000000000000000d192633404c5966737f8c94949697989a9c9fa296897c706356493d3023160a0000101d2a3743505d6a7683909192989596989a9d9e9185786b676d747d838a8f939a9a9b9b9a9997969186796d6053463a2d2013070004111e2b3744515e6a7784919daab7c4d0cdc0b3a69a8d8073675a4d4034271a0d010000000000000000000000000000000000000000000000000000000000000000000000000000000000121f2c3945525f6c788591909192999597999b9d908477686d787f868d9196989a9b9c9c9c9b9898928e89837d746d675d564c4d565e666d737b82878d9197989a9b9c9c9b9a9999928f8b847e786e695f584e463d31281e1108000000000000000000000000000000000000060e161d262d333a41464c52535b606367676d6f717374747575747472716f6d6666625f5853514b4540393128231d150c050000000000000000000000000000000000040f19222b2f383f4446443f45454545444444434343434344444444444545454545463f4446443f44444342403e3c3a38352f2f2e2b26211f1a15100c07000000000000000000000000000000000000000000000000000714202d3a4753606d7a86939facb9c6c1b5a89b8e827568564c413529190d07121f2b3844505b667783909daab6c3c6b9ac9f93867a6d6053473a2d2014070000000000000815222f3b4855626e7b88908a847d766e69605d55504941414d5a6774808d9aa7b3c0cdd3c6b9ada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000030d18242f3a44505b656f7c87939fa9aea2988f82756b61554b4034281f1409000000000000000000000000000000020e1a25313b4753606d7a85929fabb5c0c4b8ab9e9185786c6053463c312c2d303334353637383736353433302d2c2823211e1a140f0a030000000000000000000000000000000000000000000915222f3c4855626f7b888e8275685e52463c31261a100700000000000000000b1724313e4a5764717d8a97a4b0bdcad7d6cabdb0a3978a7d7064574a3d3124170a00000000000000000713202d3a4653606d7986939facab96897d7063564a3d30231b171c1f202121201f1b171b18161312100b060e0e0e0e0e0e0c0706030000000000000000000000000000000000000c1926333f4c5966727f8c99a8b2bdcdccc0b6aca0958f81776d675f57504a423d38332c29241f2a36424d5766737f8c99abb5c0c9beb3a99c8f8276685d5246392d201307000000000000000000000000000000000000000000000000000000000000000000000000000006111c2630383f4446494a4a494954616e7a8794a1adbac7c3b6a99c908376695d5048494949494a4a4a4746423b33291f14090000000000000000000000000000000000000b1825313e4b5864717e878787898a8c8d8f9298968a7d7063574a3d3024170a00000d1a2733404d5a6673808585858788898b8d90929285786c5d606b70787e82878a8d8e8e8e8c8b88847e71665c5044382b1f12060005111e2b3844515e6b7784919eaab7c4d1cdc0b3a79a8d8074675a4d4134271a0e0100000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2734404d5a6773808484848687888a8c8f919184786b666d737a8084898b8d8f8f908f8e8c8985827d77706b605d554c44444c545c60696e757b8185898b8d8f8f8f8e8d8c8a86827f79716c665e574e463d342b1f160c0000000000000000000000000000000000000000040b141b222730353a414649505356555d60626466676868686767666462605c5455534e4745403a352f271f18120b03000000000000000000000000000000000000000710191d262d33373937332d3838383737373736363637373737373838383838392d33383938332d37363634312f2d2c292422211e1a15120f0a04000000000000000000000000000000000000000000000000000000091623303c4956636f7c8999a4afbbc7c0b3a79a8d8074675a4d412f24190e030f1c28333f4a546875828e9ba8b5c1c7bbafa499887c6f6255493c2f2216090000000000000815212e3b4854616e7b879495918a827b736d67605b534e464d5a6774808d9aa7b3c0cdd3c6baada093877a6d6054473a2d21140700000000000000000000000304020100000000000000000000000000000000000007131d27333f4953606a74818e97a2adaa9e938a7d70675c51453b31261a0d030000000000000000000000000000000914202c3945515d6774808d99a3afbbc6b9ada1978a7d7063574d42372b2023262728292a2b2a2928272623201f1c1814120e09030000000000000000000000000000000000000000000004101c2834404b5564717e8a92867a6d61574d42372b22190f06000000000000000c1825323f4b5865727e8b98a5b1becbd8d5c9beb3a995897c6f6256493c2f231609000000000000000006121f2c3844505c667885919eaba5988b7e7265584b3f32251b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b181312100b06000000000000000000000000000000020f1c2935424f5c6875828f9ba8b5c2cec8bbafa49a9083796d655d554d443f38302c28201d191a25303d495663707c8999a3afbbc7c4b9ac9f92867a6d6154473a2e21140700000000000000000000000000000000000000000000000000000000000000000000000000000b17232e38424a5053565756565555616e7a8794a1adbac7c3b6a99c908376695d55555556565656575754524d453b30251a0e0200000000000000000000000000000000000a1724303d4956616c717b7a7b7c7e7f808385888a8a7d7064574a3d3124170a00000c1926323f4b58636e737978797a7b7d7e8083858885786b5e5960666c71767b7e80818281807e7c77716c62544a3f34281c10030005121e2b3845515e6b7884919eabb7c4d1cdc0b4a79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000000000000000000000000000000000d1926333f4c58646e73777778797a7c7d7f82848783766a5c60686e73787c7e8182838382817f7d7a75706b636059514b433a3b424a50575f626a6e74787c7e8182838382807f7d7a76726d67605b544d453c342b22190d04000000000000000000000000000000000000000000020a11171e25293036383f4446494b51535657595a5b5b5b5b5a59575553514b4847433c39352f29241d150d0700000000000000000000000000000000000000000000070b141b22272b2d2b27222c2b2b2b2a2a2a2a2a2a2a2a2a2b2b2b2b2b2c2c2c22282b2d2b28222a2929272522201f1d181514120e09060300000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97abb5c0ccbfb3a6998c807366594d4033261a08000b17222d414e5b6774818e9aa7b4c1ccc0b5ab96897c706356493d3023160a000000000000091623303c4956636f7c8996a09d948f878079716c655f58524c5a6774808d9aa7b3c0cdd3c7baada094877a6d6154473a2e211407000000000000000205070810110f0e0c0b0a090808070604000004040403030303010b17222d38414e58616d7a85929fa7afa59e9184796d60574d42362a1f150b01000000000000000000000000000004111d2935404b55616e7b87929faab4bfbeb3a99c8f8276695f53473a302519191a1c1d1e1e1d1c1b1a19161312100c07050306070603000000000000000000000000000000000000000006131f2c3845515c6774818e998d8073695f53463f342b21181007010000000005101d2935404b556673808d99a6b3c0ccd9d2c6b9ada197877b6e6154483b2e211508000000000000000003101c28343f4a546a7783909daaa6998d8073665a4d4033272727272727272727272727272727272727272727272727272725201f1c17110a020000000000000000000000000004101d2a3743505d6a7683909da9b6c3d0c6b9ac9f93877c6f675d534b433b342e261e1c16110d14202d3a4753606d7a86929facb9c5c7bbafa399897c6f6356493c302316090000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a545c60636363636262616e7a8794a1adbac7c3b6a99c9083766961616262626363636464615e574d42362a1e110500000000000000000000000000000000000815212d3945505a61696e6e6e6f71727476797b7e7f796d6054473a2d21140700000a17232f3b47525c63666c6b686d6e70717476797b7a6d61544f545b6064686e717375757473716f6a64625a5042382e23170b000005121f2b3845525e6b7885919eabb8c4d1cdc1b4a79a8e8174675b4e4134281b0e0100000000000000000000000000000000000000000000000000000000000000000000000000000000000b1723303b47525c64676b6a656c6d6f707375787a796d6053565e61656c6f7274757676757472706d67636159544f4540393130383f444d53585f62656c6f7274757676757473706d6765605d55504a423b332a22191007000000000000000000000000000000000000000000000000060b13191e252a2d3337393c404547494b4c4d4e4f4e4e4d4c4a494645403c3a37312c29241d18120b03000000000000000000000000000000000000000000000000020a11171b1f201f1b171f1f1e1e1e1d1d1d1d1d1d1d1e1e1e1e1e1f1f1f1f171c1f201f1c171d1d1c1a18161413100c0708060200000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1bed2bfb2a5998c7f7266594c3f3326190c00061a2734414d5a6774808d9aa7b3c0d2bdb0a3978a7d7064574a3d3124170a0000000000000c1825323f4b5865727f8b98a5a69f99928d847e786f6a615e565a6774808d9aa7b3c0cdd4c7baada194877b6e6154473b2e211408000000000003090e1214151d1d1c1b1918161615141413100c071111101010100f0f06111b262f3c46525e68727f8b95a0acaca0968c7f73695f53463e31271d12070000000000000000000000000000010d18242f3a46535f6974818e98a2aebac3b9ac9f93877b6e62564c41362a1f150b0f10111211100f0e0c0907060400060b10121312100b06000000000000000000000000000000000004101c2934404b55606d7984919e92867b6e615a50463d332a2218130d080502050d17202c3945515d677683909ca9b6c3cfdcd1c5b8ab9e9285796c605346392d2013060000000000000000000c17232e424f5c6975828f9ca8a89b8e8275685b4f422f3434343434343434343434343434343434343434343434343434322d2b28231c140c0200000000000000000000000005121e2b3845515e6b7884919eabb7c4cfc2b5a89c8f82756a5f554b41393128231c150c0b0406131f2c3845515d677885929eabb8c5cbc0b5ab978a7d7164574a3e3124170b0000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505c666d7070706f6f6f6e6e7a8794a1adbac7c3b6a99c9083766e6e6e6f6f6f6f707070706e695e52463a2d201407000000000000000000000000000000000005111d28343e4850575e61616163646567656c6e71726d675d5145392c201306000007131f2a36404a52585a5f565d6062636567666d6e6d685e52464a5053565e6164676868676664625f585650483e30261c1106000005121f2c3845525f6b7885929eabb8c5d1cec1b4a79b8e8174685b4e4135281b0e02000000000000000000000000000000000000000000000000000000000000000000000000000000000007131f2b36404a52585a5e535b606162646668686d6d675c514c52535b6062656768696969686563605d55554f48443d352f27262e343c42474e53535b6062656768696968676664605d5553514b443f382f2921181007000000000000000000000000000000000000000000000000000002080d13191b22272b2d2f35393a3c3e404141424241413f3e3c3a38342e2e2b26201d18130c0701000000000000000000000000000000000000000000000000000000060b0f1213120f0b1212121111111010101010111111111112121212120b0f1213120f0b06100f0d0b09070604000000000000000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1bdd2bfb3a6998c807366594d4033261a06000e1b2834414e5b6774818e9aa7b4c1c9bcafa296897c6f6356493c30231609000000000000101c2936434f5c6976828f9caaadaba39f97918b837c746d68605c6774808d9aa7b3c0cdd4c7bbaea194887b6e6155483b2e22150800000000050d141a1e21212a2a2927262523222221201f1d181e1e1d1d1d1d1c1c1c1c1b141d2a36414c56606d7883909da5afa89f92867b6e615a5043392f24180c03000000000000000000000000000007131d2a36424d57616e7b86929fa8b2bdbbafa49a8d8074685e52463d31271d120700040504030201000000040a0f11171c1f201f1c17110a0200000000000000000000000000000006131f2c3845515c67727f8b97a1998f82756c62584e453c3429241d1914110e11161f29323b4753606d7a86929facb9c5d2d6cbbfb4aa9a8e8174665b5044382b1f1206000000000000000000061b2834414e5b6774818e9aa7aa9d9083776a554c414141414141414141414141414141414141414141414141414141413f3a38342e261e140a00000000000000000000000006131f2c3946525f6c7985929facb8c5cbbfb4aa968a7d7063584e43392f281f17110a03000004101d2935404b556b7784919eaab7c4d1bfb2a5988c7f7265594c3f3226190c000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d787d7d7d7c7c7b7b7a7c8895a2aebbc8c3b6a99d90837a7a7b7b7b7c7c7c7c7d7d7d7b6e6154473b2e2114080000000000000000000000000000000000000c17222d363e454d52545454565759535b60626465605d554b4135291d11040000020e19242e3840474b4d524c5254555658545c6062615e564c413f44464d5254575a5b5b5b595855534e49453e362d1e140a00000006121f2c3945525f6c7885929fabb8c5d2cec1b4a89b8e8175685b4e4235281b0f020000000000000000000000000000000000000000000000000000000000000000000000000000000000030e19242e3840474c4d5149505354555759565e61605c554b414649505356585a5c5c5d5c5b595653514b48443d383329241d1c232831373c434749505356585a5c5c5c5b5a595754514c47454039332d261d170f06000000000000000000000000000000000000000000000000000000000002080d11171b1f2024292c2d2f313334353535343433312f2d2c2823211f1b15110d0701000000000000000000000000000000000000000000000000000000000000000305060503000005050404040403030304040404040505050505000003060606030000030301000000000000000000000000000000000000000000000000000000000000000000000000000000000000091623303c4956636f7c8996abb5c0ccc0b3a69a8d8073675a4d402e23170b000f1c2935424f5c6875828f9ba8b5c2c8bcb1a794877b6e6154483b2e211508000000000000121f2c3845525f6b788592989ea1a9aca9a19e949087817a726d666774808d9aa7b3c0cdd4c8bbaea195887b6e6255483b2f221508000000050f171f252a2d2e363735343331302f2e2e2d2c29242b2a2a2a2a292929292828282825303a44505c66707d89939eaaaea3988f82756c61554b4035291f15090000000000000000000000000000010e1a26313b46525e6873808c96a0abb5c0b6ac9f92857a6d61594f43392f231811080200000000000004090e161b1c23282b2d2b28231c140c0200000000000000000000000000000714202d3a4753606d7984919ea99e938b7e716a60574e463d352f2924201e191e2028313b44505a64717e8b99a3aebbc7d3d3c7baaea3988a7d7064544a3f33281c0f030000000000000000000d192633404c5966737f8c99a6ab9e928578675d514e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4b46443f3830261c1106000000000000000000000006121f2c3945525f6c7885929fabb8c5c7baaea398877b6e6154483c31281d160d0600000000000c18242f44515e6a7784919daab7c4ccbfb2a5998c7f7266594c3f3326190c00000000000000000000000000000000000000000000000000000000000000000000000000091623303c4956636f7c898a898988888887888e98a4b0bcc9c4b8ab9f9590878787888888898989898a8a8276695c4f4336291c1003000000000000000000000000000000000006101b242d333b4246474748494b4c49505355575954514b433a2f24180d0100000008121c262e363b3f4046414547484a4b4a50535554524c443a33383b4146474a4d4e4f4e4d4b4947433c39342d241b0c0200000006131f2c3946525f6c7985929facb8c5d2cec1b5a89b8e8275685b4f4235281c0f0200000000000000000000000000000000000000000000000000000000000000000000000000000000000008121c262e363b3f40443f444647494a4c4c525453514b4339383f4446494b4e4f50504f4e4c4a4745403938332c27211812111720262b3137383f4446494b4e4f50504f4d4c4a4745413a39352f28221c140b05000000000000000000000000000000000000000000000000000000000000000000060b0f1213181d2020232426272828282827262422201f1c1815120f0a040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8899a4afbbc7c1b4a89b8e817568544a3f34281c1003101d2a3643505d697683909ca9b6c3c5b8aca095867a6d6053473a2d2014070000000000000c1926323f4c5965727f868c91979da0a8aca69f99938d857f786f6b74808d9aa7b3c0cdd5c8bbaea295887c6f6255483c2f2215090000030d17212931363a3b434442413f3e3d3c3b3b3a39352f373737373636363635353535343434343f4a54606b75818e98a2aeaa9e948a7d70675d51453c31261a0d04000000000000000000000000000009141f2a36414d56606d79849199a3afbbbaaea2988e81746b60554b4034292319130d07060607070c10151a21272c2e34383a38342e261e140a00000000000000000000000000000a1623303d495663707c8996a1ada69f92867c6f695f584f45413a352f2d2a252a2d323a434c56616c7783909dabb5bfcbd6cabfb4aa9f92867a6d6053473a2d22170b000000000000000000000b1825323e4b5865717e8b98a4ada297877a6d605a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5853504a42382e23170b000000000000000000000005111e2b3844515e6b7784919eaab7c4c5b8ac9f9285796c605346392d20160b04000000000005121e2a36424d576b7885929eabb8c5cabdb1a4978a7e7164574b3e3124180b000000000000000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b88999696959594949598a0aab5c0ccc7bcb1a79f9d94949494959595969696978e8275685b4f4235281c0f0200000000000000000000000000000000000009121b202930363a3b404547494b4a4846484b4c4745413a31281d130700000000000a141c242a2f32332f35393a3b3d3e3f4446484746413a32282b3036393b3e40424241403e3c3b37322d29221b1209000000000613202c3946535f6c7986929facb9c5d2cec2b5a89b8f8275685c4f4235291c0f02000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a141c242b3033342d3337393a3c3d4041464747454039312d3337393c3f4142434342413f3d3a39352f2c27211c160c07060c151a20262b2d3337393c3f414243434241403d3a39352f2c29241d17110a020000000000000000000000000000000000000000000000000000000000000000000000000305070d1113141618191a1b1c1b1b1a1917161313100c07060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000030606060300000000000000000000000000030000030606060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7986939facb9c6c3b6aa9d908377665c5044382b1f1307111e2a36414c566a7784909daab7c3c3b7aa9d908477675c5145382c1f13060000000000000b1825313e4a57626d727a7f858b91969da0a7aba49f97928b837c7574808d9aa7b3c0cdd5c8bcafa295897c6f6256493c2f231609000009141f29333b42464850504f4e4c4b49494847474540454444444343434342424242414141414141424f59616e7b86929fa8b0a69e9184796d60574d42372b1f160c0100000000000000000000000000030e1925303b45515d676f7c87929fa6b0b9b3aa9e93897d70675c51453e3529241e181413131415181d1f262b3238383f4446443f3830261c1106000000000000000000000000000815212e3b4854616e7b87939fa7aea39891847b6f6a6059514b45413b3a3630363a3e444c555e68717e8a95a0acbdc6d1cfc6baaea2988e8175675d5145392c1c1106000000000000000000000a1724303d4a5763707d8a96a3b3a995887b6f67676767676767676767676767676767676767676767676767676767676765605c544a3f34281c100300000000000000000000030f1c2936424f5c6975828f9ca8b5c2c5b8ac9f928579675d5145392c2013060000000000000714212d3a46535f697986929facb9c5c9beb3a996897c6f6356493c30231609000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c7986929fa2a2a2a1a1a2a4aab2bcc6d1cdc2b9b1aba9a0a1a1a1a2a2a2a2a3a39a8d8174675a4e4134271b0e01000000000000000000000000000000000000050e18222a323a41454b515356585755534e49443e39352f281f160c010000000000020a12191f23262724292c2d2f302e34383a3b3a39363029201f252a2d2e313435353433312f2e2b26201d171109000000000006121f2c3844505c667986939facb9c6d2cfc2b5a89c8f8275695c4f4236291c0f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a12191f23262722272b2d2e2f313035393a3a38342f2722272b2d2f3234353636363532302d2c29241d1c16100b05000003090e151a1b22272b2d2f3234353636353433312d2c2924201d18120b06000000000000000000000000000000000000000000000000000000000000000000000000000000000001040607090b0d0e0e0f0f0e0e0c0b09070604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000307090910060b0f1213120f0b0600000000000002070a0c0d10060b0f1213120f0b0600000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c6776838f9caab4bfc5b8ac9f9285796d6053463a2f24181515202d3946525e687885919eabb8c4bdb2a8998c807366554b4034291c10040000000000000916222e3a46515b62686d72797e848a90959ea1a8a9a29e959089817a808d9aa7b3c0cdd5c9bcafa296897c6f6356493c3023160900020e1a25313b454d53545d5d5c5a59585655555453514b515151505050504f4f4f4f4e4e4e4e4e4e4e4e4e535e69737f8c96a1acaca1968c8073695f53473e31281d1307000000000000000000000000000008141f2935404b55606a73808c949fa7b1bbafa59e9184796d605a50473f35302924212020212224292c31373d43484a5053504a42382e23170b000000000000000000000000000714202d3a46525e6974818d95a0a7aaa19691847c706b605d55524c4746424342464750565d676e7a85929ea7b1bccfd0c6bdb2a89f92867b6e61554b4035291d0a00000000000000000000000916222f3c4955626f7c8895a2afa3978a7d74747474747474747474747474747474747474747474747474747474747474726d665c5044382b1f120600000000000000000000000d192633404c5966737f8c99a7b1bcc6baaea298877a6d6054473a2e23170e0703000001050d15222e3b4855616e7b8899a3afbbc7c6b9ada197877b6e6154483b2e211508000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a86939f9f9f9f9e9e9ea1a9b2bdc9d5cbbfb4aaa39f9e9e9e9f9f9f9fa39fa09a8e8174675b4e4134281b0e010000000000000000000000000000000000020d17202a343c444c52555d60636464625f58555044403930271c12070000000000000000080e1317191a191d2021222323282b2d2f2e2d2a251e1714191e20212427282828262522211f1b15110c060000000000000713202d3a4653606d798699a4afbbc7d4cfc2b5a99c8f8276695c4f4336291c1003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001080e1317191a171b1f2021222425292d2e2d2c29231d171b1f2023252729292a2928262320201d1812100b05000000000000030a0f11171b1f202325272929292827262421201d1913100d0701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f1315161d1c171c1f201f1c17110a02000000070e1317191a1d1b171c1f201f1c17110a020000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b5565717e8b98a3aebac4baaea298897c6f63554b413529232122242e3a4754616d7a8797a1adb9c6b9aca196887c6f6255493c2f23180c0000000000000006121e29353f4951565d60676d71787d838b91969fa2aaa7a09d938e8583919daab7c4d0d6c9bcafa396897c706356493d3023160a0005121e2a36424d575e61696a6867666463626161605d555e5e5d5d5d5d5c5c5c5c5b5b5b5b5a5a5a5a5a5a5a57606d7984919ea6b0a89f92867b6e625a50433a2f24180d0300000000000000000000000000020c18242f39434e58606d78828f95a0a9b2b9aca0968d80736c62595046413a352f2d2c2d2e2f2f35383c42474f54545c605c544a3f34281c100300000000000000000000000005121e2a36424d57606d79839095a0a7a8a19691857d746d67605d5654524d504d52545a61686d79828f97a1adb9c3cfc7beb5aba1968c8073695e5343392f24180d00000000000000000000000815212e3b4854616e7b8794aab4a99c9082818181818181818181818181818181818181818181818181818181818181817f786d6053463a2d20130700000000000000000000000916222f3c4955626f7c8895a0acb8c3bfb4aa95897c6f62544a3f34282018120f0b080d11171f2935414c5664717e8b97abb5c0cbc4b8ab9e9185796c605346392d201306000000000000000000000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b88999a93929292919196a1adb9c5d2c7baaea3989291919292929292999393938f8275695c4f4236291c0f03000000000000000000000000000000000009141f29333c464e565d60676d7071716e6a64615a514a42392e23180c05000000000000000002070a0c080d1113141517171c1f202221201d19130c080e111414171a1b1c1b1a181615130f0a0400000000000000000714212d3a4754606d7a8793a0b5c0ccd7cfc2b6a99c8f8376695c504336291d10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003070b0d060b0f1213141617191d2021201f1c18120b0f121316181b1c1d1d1c1b19171413100d07010000000000000000000000060b0f121316181b1c1d1d1c1a19171413110d08040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070f161b1f2223292922282b2d2b28221c140b0c030a12191f232627292822282b2d2b28221c140b08000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232e3a4754606d7a86929fa8b2bdbfb4aa9a8d8073675d51453d342e2e2e3036424d5764717d8a97a9b3bebdb1a79e9184786a6054473b2e1d120f0a040000000000010d18232d373f444c52555c60656c70787e848c92989fa3aba59e98929195a0acb8c5d1d6c9bdb0a3968a7d7063574a3d3024170a000714212d3a46535e696e767775747271706f6e6e6d676c6b6a6a6a6a69696969686868686767676767676767676767707d8a949fabaea3998f82766c61554b40352920150a000000000000000000000000000007121d27313d44505c666d79839096a0a8b1b2a89c928b7e716c625a524c45413b3a39393a3c3d4045474e53596063666d665c5044382b1f1206000000000000000000000000020e1a25303b45515c676e7a8390959ea5a9a1979289817a726d6864615e565d565e61656c717a828f949fa9b3beccc4bdb5aca3999184796d60574d4231281d120700000000000000000000000714202d3a4753606d7a8698a2aeab9f94908d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d897d706356493d3023160a00000000000000000000000815212e3b47535f6a7784919da7b1bcbfb3a6998c8073665c50443b3229241f1b171a191d2029313946525e6874818e9ba7b4c1c7bdb1a79a8d8073665b5044382b1f1206000000000000000000000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c878686868685858584919eabb8c4d1c5b9ac9f92868485858585858686868686868074675a4e4134271b0e0100000000000000000000000000000000020e1a25303b454e585f686d74797c7e7d7b77716c605c544a40342822170b000000000000000000000000000104060708060b101213151413110d080200020507080b0d0f0f0e0d0b09080603000000000000000000000714212e3a4754616d7a8794a0adbad2ddd0c3b6a99d9083766a5d5043372a1d1004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000305060709080d1113141413100c0701030506090c0e0f10100f0e0c0a07060401000000000000000000000000000000030506090c0e0f10100f0e0d0a0706040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007101921272c2f3036352d33383938332d261d1e150c141c242a2f323336352d33383938332d261d1a11080000000000000000000000000000000000000000000000000000000000000000000000000000000713202c3945525d6874818d96a1adb9bfb8ab9e92857a6d60594f45403c3b3b3c4146525e6975818e9ba8b4beb4aba0958b7e7265584e43372b221f1b160f07000000000007111b252d323a41454b51535b60666c71797f858d92999fa7aaa29f9da0a7b1bcc8d4d6cabdb0a3978a7d7064574a3d3124170a000815212e3b4854616e7b838382817f7e7c7c7b7a7a79787877777776767676757575757474747474747474747474747476838f9ca9b4ab9f948a7e71675d51453c31261a0c0200000000000000000000000000010b151f28343f4a545d676e7b849196a0a7afaea49f92877e716c615d56514b4847454647484a4b5153575f626b6f76786d6053463a2d2013070000000000000000000000000009141f2834404b555e686e7a838f939fa3a9a29e938e847f7a74716e696b6a6a696e72767e8490949fa6b0bbc5c0bbb2aba39a92877d70675d51453b311f160c01000000000000000000000006131f2c3845515c677985929facb0a69f9c9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a988b7e7165584b3e3225180b000000000000000000000006131f2b37434e5864717e8b95a0aab4bfb7aa9e9184786d60574d443c352f2b272226252a2d323a434d57616d7a86929facb8c5c0b5ab9f95887b6e62544a3f33281c0f03000000000000000000000000000000000000000000000000000000000000000000000000000815212e3b47535f6a6f797a7979797878787b8794a1aebac7c3b6a99d9083787878787879797979797a7a746e64584c4033261a0d000000000000000000000000000000000005111e2a36424d575f6a6f7a8085898b8a88837e746d665c51443e33281c1004000000000000000000000000000000000000000306070807070501000000000000000001020201000000000000000000000000000000000815212e3b4854616e7b8794a1aebac7d4d0c3b6aa9d9083776a5d5044372a1d11040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001050707070604000000000000000001020303030200000000000000000000000000000000000000000000000000000102030302010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040f19222b32383b3c4342413f4446443f382f30271e141c262e353b3f404341413f4446443f382f2c231a1005000000000000000000000000000000000000000000000000000000000000000000000000000004111d2935414c56606d7a84919ea4adbbb9ada2978c7f736b6058514b494848494c525b616e7b87929facb9b5aca3999183786d6053463c322f2e2c2721191007000000000009131b202830353940454950545b60676d727a808790959fa2aaacaaacb1b9c3ced9d7cabdb1a4978a7e7164574b3e3124180b000a1724313d4a5764707d8a908f8d8c8b898888878686858484848383838382828282818181818181818181818181818181828f9ca9b5b0a69e9184796d60584e43372b1e140a0000000000000000000000000000030d17232e38424c555e696e7b8490959ea5aeaea39992877e756d68605d5555545153545556555d60646a6e757c8285786b5e5245382b1f1205000000000000000000000000030c18232e39434c565e686d7a818c92999fa7a59d97918c85817e7a78777677787b7f838a91969fa6b0b8c2beb6afa8a09992887e716b60554b4033291f0d0400000000000000000000000004101c2934404b556b7884919eabb7b0aba9a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a5988c7f7265594c3f322619090000000000000000000000030f1b26323c4653606d78839198a2aebab9aca0968b7f72695e564e45403937332d333036393e444c555f69737f8c98a2aebac3bbafa3999083766a5f5342382d22170b000000000000000000000000000000000000000000000000000000000000000000000000000006131f2b37434e585f666d6d6d666c6c6b6e7b8895a1aebbc8c3b7aa9d9084776b6b6c6c6c6c666c6d6d6d67645c52473c3024170b00000000000000000000000000000000000714202d3a46525e696f7c848d9298979795908a81786d605a5044392d20150a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b8895a1aebbc8d3d0c4b7aa9d9184776a5e5144372b1e110400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a16212b343d434849504f4d4a5053504a42423930251b242e3840474b4d504e4d4a5053504a423e362c22170b0000000000000000000000000000000000000000000000000000000000000000000000000000010d19242f3a45515d67707d89929ca3afb5b3a99f92877d6f6a605c5556545556565d606d75818e99a3afb2aba39a92877c6f665c514445453c3b38322b22190f040000000001090e161e24292e34383f444a50555d60686d747c838b92989ea5adb3bbc1cad0d7d7cabeb1a4978b7e7164584b3e3125180b000916232f3c4956626f7c89959b9a9997969594949992929191909090908f8f8f8f8e8e8e8e8d8d8d8d8d8d8d8d8d8d8d8d8f949fabb7b9ada1968d80736a5f53473e30261c1106000000000000000000000000000006111c26303a434d575f696e7b838f939fa3aaaba399928b817a726d676462605d6061626366676d71767b81898f85786b5e5245382b1f12050000000000000000000000000007121d27303b444c565e686d757f8790959ea1a9a19e98928e8b878584838485878b90959ea1a8b0b9bab8b0aca49f9691877e716c62594f43392f21170d00000000000000000000000000000c18232f44505d6a7783909daab6bbb7b6b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b3a69a8d8073675a4d4031261a0e0200000000000000000000000a151f2b3844505c666f7c86929fa4aebab2a89f92857b6e685f58514b46443f4040414146474f565e676e7b86929faab4bfb9b1a79f92877c6f62584e432f261c11060000000000000000000000000000000000000000000000000000000000000000000000000000030f1b26323c464e545c6060605c5f5f626f7b8895a2aebbc8c4b7aa9d9184776a5f5f5f5f5f5b606060605d55524a41362b1f14080000000000000000000000000000000007131f2c38434e58616e7b8591969fa2aaa7a09d938e81746c6155493c31261b0f030000000000000000040607070705010001000104060707070501000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c8895a2afbbc5c7cbc4b7ab9e9184786b5e5145382b1e06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306070807060401000300000306070606030000000000000000000000000000000000000000000000000000000000010406070d0b08070501000303040000040607070604000000000000000000000000000000000106090b0c0e0e0e0e0e0d0d0d0d0d0d0d0d0d0e0e0e0e0e0e0f0f0f0f0f0f0e0e0d0c0c0b0a0a080706040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27323d464f54565c5c5a545b605b54534b42372c202a35404a52575a5c5b5a545b605b5450483e33281c1004000000000000000000000000000000000000000000000000000000000000000000000000000008131e2935414c55616b73808c919fa3abb0aea39991857c726d67646361616364686d757f8c939eabb2a8a19992887e716a5f54504a52514948433d342b21160a000000000000040c13191d23282d33383f444b51565e616a6f787f868f939ea1a9afbabec5cdcfcbbeb1a4988b7e7165584b3e3225180b000814212e3b4754616e7a8794a1a7a5a4a3a2a1a1a39f9f9e9d9d9d9d9c9c9c9c9b9b9b9b9a9a9a9a9a9a9a9a9a9a9a9a9a9c9fa6b0bbbdb2a89f92877c6f625a5042382e23170b0000000000000000000000000000000a151e28313b454d575f696e7a818b92989fa6aba39f938e857f7a75716e6d676c6d6f707376797e83888e938f8275685c4f4235291c0f0200000000000000000000000000000b151e29323b444c565d606d727c838b92979ea1a9a29f9b9798929190919297989d9fa7acb2b6b3adaba69f9a938d847d716c625a50473d31271d0f050000000000000000000000000000071c2936434f5c6976828f9ca9b5c2c4c3c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0b5a89c8f827569574d42372b1e1205000000000000000000000003101c28343f4a545f6a717e8a929ca4aeb4ada29791847a6f6a605d555350494d4d4e4c52545961686d79839098a2aebcb8b0a79f958c80736a6054463c311d140a000000000000000000000000000000000000000000000000000000000000000000000000000000000a15202a343c424b51535353504a56626f7c8995a2afbcc8c4b7ab9e9184786b5e5252524a5053535353514b4341382f241a0e03000000000000000000000000000000000915222e3b4854606a76828f97a1a8aeb4b1aca59d938a7e7164584e43372b1f1206000000000001070c1013141413110d080e070d1013141413110d08020000000000000000000000000000000000000000000000000000091623303c4956636f7c8996a2afb7b9babfbcb8ab9e9285786b5f52452e23170b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b101213151413110d0810060c10121313120f0b060000000000000000000000000000000000000000000000000001080d1113141a181414110d080f1010070c1013131313100c0700000000000000000000000000060d121518191b1b1a1a1a1a1a1a1a1a1a1a1a1a1a1a1b1b1b1b1b1c1c1c1c1c1b1a1a1918181716151312100c0707070401000000000000000000000000000000000000000000000000000000000000000000000000000007131f2c38434f59606369686768666c66655d53493d311d2f3b47525c636669686769666c66615a5044392d2014080000000000000000000000000000000000000000000000000000000000000000000000000000010d19242f3a434f59636e737f8b92999fa6adaba19791867f7974716f6e6e6f71757a818c919ca5afada19691877e716c6160605c5f5f5e56544e463d32271b0f0300000000000002080d12181b22272d333940454c52585f666d727b828a92979ea5adb3bbc1c3c4beb2a5988b7f7265584c3f3225190c000714202d3a4753606d7a8693a0b6b2b1afafaeb5afacababaaaaaaa9a9a9a9a8a8a8a8a7a7a7a7a7a7a7a7a7a7a7a7a7a7a9abb0b8c2c4bbaea3998f82766c61544a3f34281c10030000000000000000000000000000030c161f29333b454d565e686d757f868f949ea0a8a59e97918c85817e7b7a79797a7b7d8083868a8f949b988c7f7265594c3f3226190c000000000000000000000000000000030c172029323a434c525b626a6f787e858c91969c9fa6a7aaa29f9e9d9d9fa2a9a9abb1aeaca9a9a29f9a948f878079706b625a50483f352b1f150b0000000000000000000000000000020f1b2835424e5b6875818e9ba8b4b7b7b7b7b7b7b7b7b7b7b7b8b8b9babfbabababbbbbbbcbdbdbebfc0c1c1c3b8ab9e918578695f53463a2d2114070000000000000000000000000b17232e38424e58616c74808d929fa3abb2a9a09690837c726d6762605b535a595a565e61646b707a829095a0aab4b8afa69f959083786d60584e43342a200b0200000000000000000000000000000000000000000000000000000000000000000000000000000000040e18222a30394045464746444956636f7c8996a2afbcc9c5b8ab9e9285786b5f5245463f4446464747454039312f261d130800000000000000000000000000000000000916232f3c4956626f7c89949fa9b2babfbcb8afa59d9184776a5f53473a2e21150800000000030b12181d1f2021201e191b1b1b181d202021201d19130c05000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3aaabacaeb4b0b1ab9f9285786c5f4a3f34281c10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171c1f202121201d191c1c1d171c1f20201f1c17110a0200000000000000000000000000000000000000000000040c13191d2021262521201e191d1c1c1d1e181c1f20201f1c1812100b050000000000000000010911181e2224252727272727272727272727272727272727282828282828292928282727262525242322201f1c18171413110d08060300000000000000000000000000000000000000000000000000000000000000000000000915222f3b4854606b6f767574757779756f65594d392f24323f4b57636e73767474757879706c6155493c3023160a00000000000000000000000000000000000000000000000000000000000000000000000000000008131e28313d47525c636d727f8790949ea1a9a9a198928c85817d7c7b7b7c7e82868e939ca3adb7ab9e91847c73716f6e6d6d666c6b6b6260584e43382c1f1307000000000000000000070c11171c22282f353a41464e545c60696e757e858f939fa2a9b0b5b6b7b9b2a5988c7f7265594c3f3226190c000713202d3a4653606d79869aa4afbbbebcbbbbc0bbb9b8b7b7b7b6b6b6b6b5b5b5b5b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b5b7bbc2cacbbfb5ab9f948a7e71665c5044382b1f1206000000000000000000000000000000040d172129333b444d565d606d727c828a91969d9fa7a19e97928e8b888786868788898c9092999c9fa6978a7d7164574a3e3124170b00000000000000000000000000000000050e172029313a4145515860666c717a7f848a9094979b9ea1a9a4a5a6a7a7a6a5a4aaa29f9c9997928d88837d746d67605950483f362d23190d030000000000000000000000000000010e1a2734414d5a6774808d9aa7aaaaaaaaaaaaaaaaaaaaaaabababacaeb4adadaeaeaeafafb0b1b1b2b3b4b5b6b7ada197887b6e6155483b2e22150700000000000000000000000006111c26303c46505a606c77808b9299a0a8ada8a09590867f79736f6c656867666768686d71767d8490949fa7b1b1aca59e948f837b6e665c50463d3222180e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000710181e272e34383a3a3a3d495663707c8996a3afbcc9c5b8ab9f9285786c5f4a3f343338393a3a3a39352f271f1d140b0100000000000000000000000000000000000e1a2734414d5a6774808d9aa6b0bbc4cac8c0b8aca095887c6f6255483c2f221509000000030d151d24292c2d2e2d2a2528282824292c2d2e2d2a251e160e050000000000000000000000000000000000000000000000000a1724303d4a5763707d8a969d9d9e9fa3aba3a5a79f928679665c5044382b1f120600000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c141c23282b2d2e2d2c292429292a23282c2d2d2b28221c140b020000000000000000000000000000000000000000040d161e24292c2d33312e2d2a252a29292a2a23282c2d2d2c28231d1c1610080000000000000009131b23292e3132343434343434343433333333333434343434343535353535353535343333323131302f2d2c28232321201d1915130f0a04010000000000000000000000000000000000000000000000000000000000000000091623303c4956636f7d828280818486817568554b40352933404d5a6673808381808284867e7064574a3d3124170a000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f2c35404a525b636d727c838b91979b9fa3a39f97928e8a898788898a8e92989ea5a7a7acab9e9184817f7e7c7b7a79797978786f6a6054483b2e2215090000000000000000000000060b11171d242930363c424a50575e616c717a828a92979fa6a8a9abacafa5998c7f7266594c3f3326190c0006121f2c3844515c667986939facb9c6c9c8d1cbc7c5c5c4c4c3c3c3c3c2c2c2c2c1c1c1c1c0c0c0c0c0c0c0c0c0c0c0c0c2c3c7ccd0d1c6bdb0a69e9184786d6053463a2d20130700000000000000000000000000000000050f182129323b444c525b626a6f767d848a90959a9ea1a29f9b9795989292999596999c9fa3ababa396897d7063564a3d3023170a0000000000000000000000000000000000050e171f282f353f464e545b60686d73797e83878b8e91979697989a9b9a9998979798928f8d8a85807b76706b605d554f473f362d241b1107000000000000000000000000000000000d192633404c5966737f8c999d9d9d9d9d9d9d9d9d9d9d9e9e9e9f9fa3a0a0a0a1a1a2a2a2a3a4a5a6a6a7a8a9abaca9988b7e7165584b3e2f24180d010000000000000000000000000a141e2a343e44505b656c737e8791969fa2a9a7a098928c85807c79767473737475777a7e838a91969fa6b0ada7a09d938e827a6e695e544a3f342b200f0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c151d23282c2d2d303d4a5763707d8a96a3b0bdc9c5b9ac9f928679665c5044382b2b2d2d2d2d2c29241d150d0b02000000000000000000000000000000000000101d2a3643505d697683909ca9b6c2cdd6d4c8bdb1a8988b7e7165584b3e3225180b0000010b151f272f35393a3a3936303534352f35393a3a3936302820160b0200000000000000000000000000000000000000000000000b1724313e4a5764717d8a9190909192999596989a9c9986796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141e262e34383a3b3a39352f3636372e34383a3938332d261d140a00000000000000000000000000000000000000010c161f282f35393a403e3b39363037363637372e34383a3a38342e2c28211a11080000000000060f1b252d343a3e3f41414141414040404040404040404141414141414242424242424141403f3f3e3d3d3b3a38342e302d2c2924211f1b15110d08020000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b8f8d8e90928578675d5145382c3845525e6b78848f8e8d8f918d8073665a4d4033271a0600000000000000000000000000000000000000000000000000000000000000000000000000000000040d1a232e384049515b626a6f787e858a8f92999b9d9f9f9a9796949496979b9fa39f9d9a9b9fa3a196918f8c8a89888786868585847c6f6256493c2f23160900000000000000000000000000060b12181e252a30383f444d525a61686d757e858f949a9b9c9e9fa3ab998c807366594d4033261a0d000713202d3a4653606d79869aa4afbbc8c6c6c6d2ccc8c6c5c5c5c5c5c5c5c5c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c2b9aca096897c706356493d3023160a0000000000000000000000000000000000060f182029323a414551585f626c70797e83898d9196999b9e9fa4a39f9fa3aba3a6a8a8a9a8a8a295897c6f6256493c2f231609000000000000000000000000000000000000050d161e2429343d424a50565d60666d71767b7e818588898a8c8d8e8d8c8c8b8a888583807d79746e6a636059514b433d352d241b120900000000000000000000000000000000000b1825313e4b5864717e8b9091919191919191919191919191929292989393949494959596969798999a9a9b9c9e9fa39b8e817468554b4135291d1104000000000000000000000000020c182227333f49535b606c717d848c92979fa2aaa29f97928c888582818080818283878a90959ea1a8aca9a19e95918981796d685e564d42382e22190f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b12181c1f2024313d4a5764707d8a97a3b0bdcac7baaea39986796d6053463a2d20202020201f1d18120b030000000000000000000000000000000000000000111e2b3744515e6a7784919daab7c4d0ddd9cebfb2a6998c7f7366594c403326190d000007121d27313940454747464142424142424045474746413a32281d140a00000000000000000000000000000000000000000000000915222f3c4855626f7c8584838384868788898b8d8f91867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c2630383f44464847454144434343443f444646443f382f261c110600000000000000000000000000000000000008131e28313a4145474d4b474641444342434344454045464645403938332c231a1005000000030d17212d373f464a4c4e4e4d4d4d4d4d4d4d4d4d4d4d4d4d4d4e4e4e4e4e4f4f4f4f4f4e4d4d4c4b4b4a4948464440403d3a3935302e2b26201d19130d0802000000000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a969a9b9d97867a6d6053473a2d3643505c6976838f9b9a9c9b8e8175685b4e422d22170b000000000000000000000000000000000000000000000000000000000000000000000000000000000008111c262e373f4951585f656c71797d82868b8e9193999898999a9b9b9a99989a93908d8e92999fa19e9b999796949399929292897c6f6356493c30231609000000000000000000000000000001070c13191e262e343b424650565e616c717b828a8e8e9091929998998d8073665a4d4033271a0d000714212e3a4754616d7a8794a0b6c0babab9b9b9c0bbb9b9b9b8b8b8b8b8b8b8b8b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b2a8978b7e7164584b3e3125180b000000000000000000000000000000000000060e1720282f353f464e535a61666d71767c8084888c8e91939a9698999a9a9a9b9b9c9c9c9b9b96897c706356493d3023160a00000000000000000000000000000000000000040c1319222b2f383f444c52545c6064696e7175787b7d7e7f808181807f7e7d7b797673706d67625f58544f45403a312b231b12090000000000000000000000000000000000000714202d3a4753606d798184848484848484848484848484848585868686878787888888898a8a8b8c8d8e8e9091929996918478675d5145392c20130600000000000000000000000000061017222d384149505a626b6f797f858d92989c9fa3a19e9997928f8e8d8c8d8e90939a9d9fa7aba39f9b97928b837d756d675d564d443b30261c10070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c10131724313e4a5764717d8a97a4b0bdcacbbfb4a093867a6d6053473a2d201413141413100c0701000000000000000000000000000000000000000000101d2a3743505d6a7683909da9b6c2cdd4d3c9bdb2a8988b7f7265584b3f3225180c00000c18242f39434b515354524c4f4e4e4e4f4b515354524c443a2f261b1106000000000000000000000000000000000000000000000815212e3a47535f6a6f7877767778797a7b7d7e8082848275675d5145392c2013060000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17232e38424a50535454514c504f4f50514a505353504a42382d22170b0000000000000000000000000000000000060f19242f3a434c5154595854524c51504f4f5051514b515353514b48443e352c21160b00000009141f29333f495156585a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5b5b5b5b5b5b5c5c5b5b5a5a59585857565553514a4d4a4745413c3b37322c29241e19130b060000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8899a3a8a994887b6e6155483b2e34414e5b6774818e9aa7a89c90837669544a3f33281c0f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000a141c252e373f464e535b60666d70757a7e818486898b8c8c8d8e8e8d8c8b8a86848181868d92989d9fa7a4a2a1a0a39f9c8f82766b6054483b2f2215090000000000000000000000000000000002080c141c232830363e444c525a61696e767e8182838486898b8e8d8073665a4d4033271a0d000815222e3b4855616e7b8894a1adadadadadadacb6afacacacacacababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa5988b7e7265584b3f3225180c00000000000000000000000000000000000000050d161e2429343c434750545c60646a6f74787b7f828486898a8b8c8d8d8e8e8e8f8f8f8e8e8d897c6f6256493c2f2316090000000000000000000000000000000000000000010810191d262d333a41454a5053575e616468696e707172737474737271706f6c666664605d55534e48443d352f281f191109000000000000000000000000000000000000000613202c3945515d676d74777777777777777777777777777878787979797a7a7b7b7b7c7c7d7e7e7f80818283848687898a877a6d6054473a2d211407000000000000000000000000000006111b262f383f44505960666d727a80858a8f92999a9d9fa29e9c9b9a999a9b9d9fa4a39f9d9a99928f8a857f78706b605c554c433b32291e150a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040b1825313e4b5864717e8b97a4b1bec8ccbaada094877a6d6154473a2e211407070706040000000000000000000000000000000000000000000000000e1b2834414e5b6774818e9aa6b0bbc3c8c7c0b9aca196897c6f6256493c2f2316090004101d2935404b555d60615e565c5b5b5b5c555d60615e564c41382d22170b0000000000000000000000000000000000000000000006121f2b37434e585f626b6b6a6a6b686d6e7072747577757065554b4035291d1004000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a545c6061605d555d5c5c5d5e545c60605b544a3f33281c0f03000000000000000000000000000000020b18212935414c555d606664615e565e5d5c5c5d5d5e545c60605c55554f473e33281c100400020e1a26313b45515b62656767676767676767666666666667676767676768686868686868686766666564646362605c54595654524c4947433c39353029251e17110a02000000000000000000000000000000000000000000000000000713202d3a4653606d7986929faca396897c706356493d30323f4c5965727f8c98a5aa9e918477665b5044382b1f12060000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c242d343c414950545c6064686d7274777a7c7e7f80808182807f7e7d7a7774747b80858b90959a9da0a8a8a9a399897d7063594f43382c1f1307000000000000000000000000000000000000020a11171f252a323a414650575e616c7174757678797c7f82827b6e6155483b2e221508000916222f3c4955626f7c8895a8a0a0a0a0a0a0a0a0a49f9f9f9f9f9f9f9e9e9e9e9e9e9e9e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d988b7e7265584b3f3225180c0000000000000000000000000000000000000000040c1319222a31373e424a5153586062676a6f7275777a7c7d7e7f80818181828282828281817f726a6054473b2e22150800000000000000000000000000000000000000000000070b141c22283035383f44464d525458575f626364656768676665646462605b545753514b47433c383329241d160d07000000000000000000000000000000000000000004111d2935404b555d60676a6a6a6a6a6a6a6a6a6a6a6a6b6b6b6c656c6d6d6d6e6e6f6f6f707172737374757678797b7c7e7e71675d5145392c2013060000000000000000000000000000000a141d262d333e474f545c60686d74797e82868b8e9092999798999a9b9a999998979892908d8b86827d79726d666059514b433a312920170c030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1b9bbc0baada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000a1623303d495663707d89949fa9b1b9bdbbb9aea59e9184786c605346392d2013060006131f2c3945515d676d6d686a696867686869676d6d685e53493f33271b0f03000000000000000000000000000000000000000000030f1a26313c464e53555e5e5d5d565d6062636567696a69655e5443392f24180d01000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505c666d6e6d676b6a69696a6a6b666d6c665b5044382b1f12060000000000000000000000000000000a141d29333b45515d676d73716e686b6a6a69696a6a6b6b666d6d676361594f44382c2014070005121e2a36424d57626d72747474747473737373737373737374747474747475757575757574747372727170706e6d66696663605d5655534e4745413a353028221c140b0600000000000000000000000000000000000000000000000006121f2c3844505c667784919eaaa4978b7e7164584b3e31313d4a5764707d8a97abac9f9286796c605346392d201306000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a121b222a2f383f444b5153565e616568676d6f717273747475747371706d6867696e737a7e83888d9196989b9c9e92867a6d6053473d32271b0f030000000000000000000000000000000000000000060b141a202930363e454d525a6164676869676d6f7275766e695f53463a2d21140700091623303c4956636f7c89969494949393939393939a9392929292929292929191919191919191919191919191919191919191919191919191919191918a7d7063574a3d3024170a0000000000000000000000000000000000000000000108101820262b30394044464e5456585f626668676d6f7071727374747575757675757474726d62584e43372b1f13060000000000000000000000000000000000000000000000020a11171e24292e34383b4246484b4d53555657595a5b5a595958575553504a4a4745403937312c272118130c04000000000000000000000000000000000000000000010d18242f3a434b51535a5d5e5e5e5e5e5e5e5e5e5e5e5e5e5f5f5b6060606161616262636364656667676869666d6e6f71716c61554b4135291d1104000000000000000000000000000000020b141b2227353d424b51565e61676d71767b7e818386898a8b8c8d8e8d8d8c8b8a888683817e7a75706d66605c544f45403930281f170e05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5aaacafb6b7aea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000916222f3b4854606b76828f97a0a7acb2aeaca49d938a7e71655b5044372b1f1205000714202d3a4753606d797a7876757574757576787a7a6d655b5044372b1f1205000000000000000000000000000000000000000000000a15202a343c434748525150504c52545556585a5c5e5c5a544c4231281d12070000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d797b7a79787776767677787979786c605346392d201306000000000000000000000000000006111c262f3b45505a606d79807e7a7978777675767677787879797978706b6155483c2f231609000714212d3a46535f69727f81818080808080808080808080808080818181818182828282828180807f7e7e7d7c7b79777573706d6866625f5854524c46413a332d261d180f07000000000000000000000000000000000000000000000003101c28343f4a546976828f9ca9a6998c7f7366594c40332f3b4855626e7b8899a4aea399877a6e6154473b2e21140800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000910181d262d33394045464c525458555d606365656667686867666563615d575e61676d71767c8084888b8e9091908377675d5145392b21160a0000000000000000000000000000000000000000000002090e171e252a333b42465055575b5b555c6062656869615f574d42362a1e1205000713202d3a4653606d7984878787878787868686868686868685858585858585858484848484848484848484848484848484848484848484848484848481786d6053463a2d2013070000000000000000000000000000000000000000000000060e151b1e272e34383d4347494e535559555d6062636566676767686869696968686765625b51463d32271b0f0300000000000000000000000000000000000000000000000000060b13191c23282c30363a3b3e4247484a4b4c4d4e4e4d4c4b4a4846443f3d3a39352f2b26201c160d0701000000000000000000000000000000000000000000000007131d28313a4045474e5151515151515151515151515151524950535354545455555556575758595a5b5b545c6061636464615a50433a2f24180d0100000000000000000000000000000000020a1117232b303940454c52555d6064686e7174777a7c7e7e7f808181807f7e7d7c797674716d6864605c54504a423d342e271e160d0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926323f4c5965727f8c989a9d9fa4acabb0a295887b6f6255483c2f221509000000000000000000000000000000000000000000000000000000000713202c38444f59616e7b8591959ea0a8a39f9c928d81746c6153493f33271b0f03000f1c2935424f5c687581878583828181818283848685776c605346392d20130600000000000000000000000000000000000000000000030e18222a31373a3c45444344414547484a4b4d4f514f4e49423a301f160c010000000000000000000000000000000000000000000000000000000000000000000000000000000000000d192633404c5966737f87878685838282838485858683776a5d5044372a1d1104000000000000000000000000030c17222d38424d57626d75828c8b8786858483828283848485868686847d7063574a3d3024170a000815222e3b4855616e7b888d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8e8e8e8e8e8e8f8f8e8e8d8d8c8b8b8a8988868482807d7a77736f6a65605d56524c443f382f2a2119110800000000000000000000000000000000000000000000000c17232e414d5a6774808d9aa7a79a8e8174675b4e41342d3a4653606d7986939facab95897c6f6256493c2f231609000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b141b22272e34383a4146474b4b5153565859595a5b5b5a59585754524d52555d60656a6f74777b7f818384867f7165554b403529190f04000000000000000000000000000000000000000000000000050d1319202930363e45494a4e4f4b515356585b5c55534d453b31261a0e020006131f2c3845515c676d787a7a7a7a7a7a7a7a797979797979797978787878787878787777777777777777777777777777777777777777777777777777756d665c5144382c1f1206000000000000000000000000000000000000000000000000040a0c151c23282c32373b3c4347484c4c5154565758595a5a5b5b5b5c5c5c5b5b5a595751493f342b20150a00000000000000000000000000000000000000000000000000000002080d11171c1f252a2d2e31373a3b3d3e3f404141403f3e3d3c3938332d2d2c29241d1a15100b0500000000000000000000000000000000000000000000000000010c161f282f35393a414444444444444444444444444445453f444646474748484849494a4b4b4c4d4e4f4a5053545657575550483e31281d1307000000000000000000000000000000000000000610191e272e343a41464b5153565e616567676d6f717273737474737271716f6d666764615d5653514a443f383028231d150c040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8a8c8e90939a9c9fa6a295887c6f6255493c2f2216090000000000000000000000000000000000000000000000000000000004101c27333d46525e696e7b838c91969699928f8980786d605a5041382d22170b0000101d2a3743505d6a76839092908f8e8e8e8f90919687796d6054473a2d211407000000000000000000000000000000000000000000000006101820262b2e2f3838372f35393a3b3d3f41424442413d3730281e0d04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1b2734414e5a6774818d989291908f8f909191929285796c5f5246392c1f13060000000000000000000000000b151e28333f4a545f69717e8b949799929291908f8f909091929299938a7d7064574a3d3124170a000815212e3b4854616e7b87949a9a9a9a9a9a9a99999999999a9a9a9a9a9a9b9b9b9b9b9b9b9b9a9999989797969992918f8c8986837f7c77726d68615e56504a423c332b231a110800000000000000000000000000000000000000000000061925323f4c5865727f8b98a5a99c8f8276695c4f432f2c3845515c667784919eaaa4978a7d7164574a3e3124170b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171d23282c3036393a3f404547494b4c4d4d4e4f4d4c4b4a474642464b5153585f6267696e7275767879716c625643392f241807000000000000000000000000000000000000000000000000000002080e171f252a33393d3e4142404546494c4f4f4846423b33291f1409000004101c2834404b555c666c6e6e6d6d6d6d6d6d6d6d666c6c6c6c6c6c6c6b6b6b6b6b6b6b6b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a68605c544a4034281c10040000000000000000000000000000000000000000000000000000030b12181c1f272b2e31373a3c3f414547494a4b4c4d4e4e4e4f4f4f4f4f4e4e4c4a463f372d22190f04000000000000000000000000000000000000000000000000000000000000060c10141a1e2021262b2e2f303132343534333231312f2d2b2822201f1d18120f0a0300000000000000000000000000000000000000000000000000000000040d161d24292c2d3437373737373737373737373738382d3337393a3a3a3b3b3c3c3c3d3e3f404041423f444648494b4a49443e362c1f160c010000000000000000000000000000000000000000070c151d23283035394045474d525458555d60636465666768676666656462605c545854524c46444039342e261e18120b03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d787d7f8183878b8f949a9f96897c6f6356493c3023160900000000000000000000000000000000000000000000000000000000000b16212a36424d575f696e797f8487898886827c736d665c50483e2f261b11060000101d2a3643505d697683909c9d9c9b9a9b9b9c9e9386796d6053463a2d201307000000000000000000000000000000000000000000000000060e151a1f21222b2b2a24292c2d2f30323436373635312c261e160c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1a2734414d5a6774808d9a9f9e9d9c9c9d9d9e9f9285786c5f5245392c1f1206000000000000000000000007121d27303944505b666e7b86929fa6a39f9e9d9d9c9c9d9d9e9e9f918c7f736c6155493c3023160a000814212e3b4754616e7a8794a1a7a7a7a6a6a6a6a6a6a6a6a4a4a4a3a3a3a2a2a2a1a1a2a2a3a4a5a5a5a4a3aba39f9e9c999a93908c88847f7a736d68605b544d453d352c241a11070000000000000000000000000000000000000000000a1724303d4a5763707d8a96abaa9d9184776a564c41352934404b546976828f9ca9a5988c7f7265594c3f3226190c040501010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b12181c1f252a2d2e2f35393a3c3e3f4041414241403e3d3a39363a4045474e5355575f616568696b6c65625a504531271d120700000000000000000000000000000000000000000000000000000000050d141a22282d3031342e34383a3c3f42433b3a36312921170d030000000c18232e39434b545b60616161616060606060605c605f5f5f5f5f5f5f5f5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5b53514a42392e23180c0000000000000000000000000000000000000000000000000000000000070c10151b1f22262b2e2f2f35393a3c3d3e3f40414142424243424241413f3e3a352d251b100700000000000000000000000000000000000000000000000000000000000000000003090e1214151a1e21222324262728272626252422201f1c171413100c070100000000000000000000000000000000000000000000000000000000000000040c13181d2020272a2b2b2b2b2b2b2b2b2b2b2b2b2b22272b2d2d2d2e2e2e2f2f303031323334342e34383a3b3c3e3e3c39332c241a0d0400000000000000000000000000000000000000000000030b12181e25292f35393b4146474b4b5153565758595a5b5a5a5958575553514a4b4746413a38342e28231c150c0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505c666d707374777a7e82888d9298897d7063564a3d3023170a0000000000000000000000000000000000000000000000000000000000050e1a25303b454d575f676d72777b7c7b7a756f6b605c544a3f362c1d140a000000101c2936434f5c6976828f9ca9a8a8a7a8a8a9a39986796c605346392d20130600000000000000000000000000000000000000000000000000030a0f1215151f1e1d191d202122232527292b292825211b140c0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2733404d5a6673808d99a6abaaa9a9a9aaab9e9185786b5e5245382b1f120500000000000000000000040d18232e39424e58606c78829098a2aeafacabaaa9a8a9a9aaa499938b7f736d635a5044392d201408000714212e3a4754616d7a8794a0adb3b3b3b3b3b3aea49d9a989797979696959595959595959697989a9c9fa2a9a9acaaa8aca49f9d9996918b86807a726c665f574f473e362c23190f05000000000000000000000000000000000407090a1115222e3b4855616e7b8899a3ab9f928578685d5245392c2e414d5a6774808d9aa7a69a8d8073675a4d4034271a0711110e0d0b080300000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c1013191e202124292c2d30323233343535343332302e2d2a2f35393c4347494d5355585b5d5e5f585650483f341f150b01000000000000000000000000000000000000000000000000000000000002090e171d2123242823282c2d2f3235362e2d2a261f170f060000000007121d273039424a505354545454545453535353504a53535252525252525252515151515151515151515151515151515151515151515151515151514e4644403930271c120700000000000000000000000000000000000000000000000000000000000000040a0f13151b1f212224292c2d2f303233343434353536363635353432312e29231b1309000000000000000000000000000000000000000000000000000000000000000000000000020507090e1214151718191a1b1b1a1918171513120f0b060604000000000000000000000000000000000000000000000000000000000000000000000001070d1113141b1e1e1e1e1e1e1e1e1e1e1e1e1e1e171b1f20202121212222222324242526272823282b2d2e303131302d28221a120800000000000000000000000000000000000000000000000000070c13191d24292c3036393b3e404547494b4b4c4d4e4e4d4c4b4a494644403e3a3935302c28231c17110a030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a545c60646667686e71767b80868e8a7d7063574a3d3024170a00000000000000000000000000000000000000000000000000000000000009141f29333c454d555c6065696e6f6f6d67636059504a42382e241a0b020000000f1c2936424f5c6975828f9ca8b5b4b4b4b5ac9f928679655b5044372b1f1205000000000000000000000000000000000000000000000000000000030608091211080d1113141517181a1c1e1c1b1915100a020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a6b2b6b5b5b6b7aa9e9184776b5e5144382b1e1105000000000000000000010c161f2834404b545f6a727f8c949faab4bbb9b8b7b6b5b5ada39f93877f726d635b51473e33281c1004000714212d3a4754606d7a8793a0adbac0c0c0c0b5a99d928d8b8b8a8a898989888888888889898a8c8d8f9297989c9fa4acaeafacaaa8a09d98928d857f786e69605950483e352b21170b0200000000000000000000000000050b101316161e1e202d3a4653606d7986929faca298877a6d6054473a2d323f4c5865727f8b98a5a89b8e8275685b4f422e23181d1e1e1b1a18140f08010000000000000000000000000000000000000000000000000000000000000000000000000000000000000004080d111314181d2020232526262728282726252421201d24292c32373b3c4246484c4e5051524b4a453f362d220d030000000000000000000000000000000000000000000000000000000000000000050c111417171b181c1f202325282922211e1a140d060000000000000b151e272f383f444647474747474747474646443f4646464645454545454545454444444444444444444444444444444444444444444444444444423a38342e271e150b0000000000000000000000000000000000000000000000000000000000000000000003060a0f121515191d20212324252627272828282929292828272625221e1811090100000000000000000000000000000000000000000000000000000000000000000000000000000000020608080a0b0c0d0e0e0d0c0b0a090606030000000000000000000000000000000000000000000000000000000000000000000000000000000000010406070e11111111111111111111111111120b0f12131314141515151616171818191a1b171c1f202123242423211c17100800000000000000000000000000000000000000000000000000000002080d12181d1f252a2d2e2f35383a3c3e3f40404141403f3e3e3c3a38342e2e2d29241f1c18120c06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17232e38424a50535759565e61656a6e747b8181786d6053463a2d201307000000000000000000000000000000000000000000000000000000000000020d17202a333c434b5153575e616362605d55544f443f3830261c1208000000000f1c2835424f5b6875828e9ba8b5c1c1c1b8ac9f9285796c5f493f33271b0f030000000000000000000000000000000000000000000000000000000000000005050001040707080a0c0e0f110f0f0d090400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926323f4c5965727f8c98a5b2bfc2c2c3b7aa9d9184776a5e5144372b1e110400000000000000000007121d28313945515c666f7c86929fa6b0bcc5c5c5c4c0b7aea49c918b7e726d635b514940352c22170b00000714202d3a4753606d7a8693a0b5c0cbcdcdc0b3a79a8d807e7e7d7d7d7c7c7c7b7b7b7c7c7c7d7f808285888c90939a9fa3aab0b6b2acaaa29f98928c837b706b615a50473d33291d140a000000000000000000000000070f161c2022232b2b2a2c3844505c667784919eaaaa95887b6f6255483c2f303d4a5663707d8996aba99d9083766a544b4034282a2a2b2b282724201a130b020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010507070d1113141618191a1a1b1c1a191817141313181d20262b2e31363a3b3f424345463e3d3a342d241b11000000000000000000000000000000000000000000000000000000000000000000000005080a0b070c10131316191c1c1514120e090300000000000000030c151d262d3338393b3b3a3a3a3a3a3a3a3a38342e39393939393838383838383838373737373737373737373737373737373737373737373737352d2c28231c150c0300000000000000000000000000000000000000000000000000000000000000000000000000030608080d111314161718191a1b1b1b1c1c1c1c1c1b1b191816120d070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104040404040404040404040405000003050607070708080909090a0b0c0d0d060b101213151618171614100b0500000000000000000000000000000000000000000000000000000000000001070c1014191e202124292c2d30313233343534333332312f2d2c282321201d1913100c0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c2630383f44464a4c4c5254575f62696e75746d665c5144382c1f120600000000000000000000000000000000000000000000000000000000000000050e18212a30394045464d5354565554514b48433d342e261e140a00000000000f1b2835424e5b6875818e9ba8b4c1cdc5b8ab9f9285786c5f52452d22170b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1becbcfc3b6aa9d9083776a5d5044372a1d11040000000000000000040e18242f39434f59606d79839099a3aeb8c2ced2ccc2b8afa59c928c7f726c625b514940372e231a100500000613202d394653606c798699a3afbbc7d4c9bcafa396897c7171717070706f6f6f6e6e6f6f7071727476797b7f83878d92989ea6afb5b8b4aeaaa29f9490857d706c61594f453b2f261b11060000000000000000000007111921272c2f3038373737343f4a546976828f9ca9a3968a7d7063574a3d34343b4855616e7b8899a3ab9e918578665c51453836373737383433302b251d140b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001040607090b0c0d0e0e0f0e0d0b0a0707070d11151b1f21262a2d2e323536383932312e29221b12090000000000000000000000000000000000000000000000000000000000000000000000000000000000040607090c0f100807050200000000000000000000030b141c22282b2d2e2e2e2e2d2d2d2d2d2d2b28232c2c2c2c2c2c2c2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b28201f1c18120b0300000000000000000000000000000000000000000000000000000000000000000000000000000000000001040607090a0b0c0d0e0e0f0f0f100f0f0e0e0c0b090601000000000000000000000000000000000000000000000000000000000305060706030000030000040607060400000000000000000000000000000000000000030607070603000003000004060706040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000003060708090b0b0a0804000000000000000000000000000000000000000000000000000000000000000000000004080e111414181d1f20232425262728272726252422201f1c181413110d08040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141e262e34383a3d404146474e53575e616868605c544a4034281c10040000000000000000000000000000000000000000000000000000000000000000060f181e272e34383b42464849484745413a383228231c140c0200000000000e1b2834414e5b6774818e9aa7b4c1cdc4b8ab9e9185786b5e5245382b1f12000000000000000000000000000000000000000000000000000000000000000000000000000000000000040607070808090909080807060603000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcfc3b6a99c908376695d5043362a1d100300000000000000020c16202935404b55606b73808d95a0abb4bfcbd4cdc3bab0a69d938d80736d635a51483f372e251c110800000006121f2b3844505b667986929facb9c5d2c9bcafa396897c7064646463636262626262626263646567656c6e72767b81868f949fa3abb5bdbab3aea69f9792877e706b60574d41382d22170b000000000000000000050f19232b33383c3d4444444443434d5a6774808d9aa7a5988b7e7265584b414141414653606d7986929fac9f9386796d60534643434344444441403c362f261d0b02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000102020100000000000001040a0f13151a1e212225282a2b2c2524211d18110900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171c1f20212121212121202020201f1c17201f1f1f1f1f1f1f1f1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1b1312100c0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f12131312100b060f070c10131313100c07000000000000000000000000000000060b1012131312100b060f070c10121312100c0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507070c101314161818191a1b1b1a191817161312100c070705010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c141c23282b2d313036393c42474d53545b5b53514a42392e23180c00000000000000000000000000000000000000000000000000000000000000000000060c151d23282c31363a3b3c3c3a39352f2c272117110a020000000000000e1b2734414e5a6774818d9aa7b4c0cdc4b7ab9e9184786b5e5145382b1e120500000000000000000000000000000000000000000000000000000000000000000000020507080b070c10131414151516161515151413120f0b060c0a0807050200000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1bdcacfc2b6a99c8f8376695c504336291d10030000000000000008131e28323a45515d676f7d87939fa7b1bdc6d1cfc5bbb1a89f948e81746e635b51483f362d251c130a00000000030f1c28333f4a5f6c7985929facb8c5d2c9bcafa396897c70635757565656555555555556565759535b606265696e747b828b9299a3abb5bfbebab0a9a29992867d70695e53493f33271c120700000000000000000b16212b353d4448495151515050504f5865727f8b98a5a6998d8073665a4e4e4e4e4e4e505c667784919daaa49a887b6e61554f4f50505051514e4c4841382f1d140a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306090e121415191b1d1e1f181715110c0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f12131414141414141414131312100b131313121212121212121211111111111111111111111111111111111111111111111111110f07060400000000000000000000000000000000030607060300000406070604000000000000000000000000000000000000000000000000000000000000000000000000000000000306060707050100030606060300000000000000000000000000020a11171b1f20201f1c171c1c1c181c1f201f1c18120b030000000000000000000000020a11171c1f20201f1c171c1c1d181c1f201f1c18120b0300000000000000000000000000000305060c120f0706040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040607090b0c0d0d0e0e0d0c0b0b090706040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171c1f2024252a2d31373b4246484e4e4644403930271c12070000000000000000000000000000000000000000000000000000000000000000000000030b12181c1f252a2d2e302f2d2c29241d1b160b0600000000000000000d1a2734404d5a6773808d9aa6b3c0cdc4b7aa9e9184776b5e5144382b1e1105000000000000000000000000000000000000000000000000000000000000010406090e121415171a181d1f20212122222222222121201f1c171b19171414110e09070705010000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdcacfc2b5a89c8f8275695c4f4236291c0f03000000000000050e1925303a444f59606d79849199a4afb9c3cfd1c6bdb3a9a0958f82786d605c52493f362d241c130a0100000000000b17222d45525f6c7885929fabb8c5d2c9bcafa396897c7063564a4a4949494848484949494a4c49505355575f61696e757f879299a3aebbc1c2bbb3aba39892857b6e655b5044392e23180c0000000000000004101c27333d474f54565e5e5d5d5d5c5c5c63707d8a96aba79b8e8174685b5b5b5b5b5b5b5b546875828f9ba8ac96897c6f635c5c5c5d5d5d5e5e5b58534a412f261b110600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080c0f1012130b0b090501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306060808070707070707070706030000060606060505050505050505040404040404040404040404040404040404040404040404020000000000000000000000000000000000060c10121312100c0c10121312100c07000000000000000000000000000000000000000000000000000000000000000000000000060b0f12131413110d0b0f1213120f0b0600000000000000000000030b141b22272b2d2d2b282329292923282c2d2c28231d150c0c030000000000000000050c141c23282b2d2d2b282329292a23282c2d2c28231c150c080000000000000000000000060b0f1213191f1b1313100c0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b10121317191e20262b31363a3b42413a38342e271e150b0000000000000000000000000000000000000000000000000000000000000000000000000000070c10141a1e2121232221201d18130f0a040000000000000000000d1a2733404d5a6673808d99a6b3c0ccc4b7aa9d9184776a5e5144372b1e11040000000000000000000000000000000000000000000000000000000003070d1113141a1e2021242724292c2d2e2e2f2f2f2f2e2e2e2d2b282227252321201e19171413110d0807050200000000000000000000000000000000000000000000000a1723303d4a5663707d8996a3b0bcc9cec1b5a89b8e8275685b4f4235281c0f020000000000020b17202935414c56616b74818d96a0abb5c0cbd7cbbfb5aba29791837a6d665c504a40372d241b120a01000000000000121f2c3845525f6b7885929eabb8c5d1c9bcafa396897c706356493d3d3c3c3c3b3b3c3c3d3e3f3f4446484d53575f616d727d87929fa6b0bcc5c5bdb4aaa2978f82776c60544a4034281c10040000000000000713202c38444f5960636b6a6a6a69696969686e7b8899a3a99c8f8376696767676767676767676773808d9aa6a4978a7e7168686969696a6a6a6b67645c5341382d22170b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002030506000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a11171c1f201f1c17181c1f201f1c18120b030000000000000000000000000000000000000000000000000000000000000000020a11171c1f2021201d19171c1f201f1c17110a0200000000000000030c151d262d3337393a38342e3636362e34383a38342e271e1e150c02000000000000050f171e262e34383a3a38342e3636372e34383a38342e271e1a11080000000000000000020a11171b1f20262b28201f1c18120b03000000000000000000000000000000000000000000000000000000000000000000000000000000000000010406070a0d0f1011121211100f0e0b08070502000000000000000000000000000304040403010000000000000000000000000000000000000000000000000000000000000000000000030607080a0c0e0f0f1010100f0e0d0d0c090706040000000000000000000000000000000000000000000000000000000000000000000000000000000000030607080e11151a1f252a2d2e35352d2c28231c150c030000000000000000000000000000000000000000000000000000000000000000000000000000000004090e12141516151413110d070100000000000000000000000d1a2633404d596673808c99a6b3bfccc3b7aa9d9084776a5d5144372a1e11040000000000000000000000000000000000000000000000000000060b0f13181d2020252a2d2e31332f35383a3a3b3b3c3c3c3b3b3a3938332d3432302e2d2a252421201d191514120e09070705010000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9cec1b4a89b8e8175685b4e4235281b0f0200000000000a141d29333b46525e68707d8a929da8b2bdc7d2cac1bbaea39992857b6e685d544a3f382e251c12090000000000000005121e2b3845515e6b7884919eabb7c4d1c9bcafa396897c706356493d302f2f2f2f2f2f2f30312d3337393c42474d535b626b717e8b949eaab3becac6bcb3a99f948a7e71665c5144382c1f12060000000000000916222f3c4854606b70777777777676767575757886929faa9e9184777474747474747474747474747e8b98a4a5998c7f74757575767676777777746e6453493f33271b0f030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040303040300000000000000000000000000000000000000000000000000000000000400000305060503000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090c151c23282c2d2c282323282c2d2c28231c150c0b020000000000000000000000000000000000000000000000000000000000040b141c22282b2d2e2d292522282b2d2b28221c140b060000000000000a151e262f383f444646443f43434242434045464540393030271e14090000000000030d17212930383f444646443f4443424344404446444039302c231a1005000000000000040b141b22272b2d3238352d2c28231d150c0300000000000000000000000000000000000000000000000000000000000000000000000000000001070d111314171a1c1d1e1f1f1e1d1c1a181414110e0905030000000000030608090d10111110100d0b0707050100000000000000000000000000000000000000000000000000000105060b1012131517191b1c1c1c1d1c1c1b1a1918161413100c07060400000000000000000000000000000000000000000000000000000000000000000000000000000000000205090e141a1e21212828201f1c18120b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000002050708090907060401000000000000000000000000000d192633404c5966737f8c99a6b2bfccc3b6aa9d9083776a5d5044372a1d1104000000000000000000000000000000000000000000000001070d11171c1f24292c2d30363a3b3e404240454747484849494848484746443f42413f3d3b3a3630312e2d2a2522211e1a161413110d080501000000000000000000000000000000091623303c4956636f7c8996a2afbcc9cec1b4a79b8e8174685b4e4135281b0e020000000006111b262f3b45505a616d7a85919ea4aebac4d0cbc1b8aea49f92877d70695f564c42382e261c130a000000000000000005111e2b3844515e6b7784919eaab7c4d1c9bcafa396897c706356493d3023222222222223232422272b2d31373b42465159626c75828f98a2aebac6cfc5bbb0a69e9184796d6053463a2d22170b0000000000000a1623303d495663707d848484838383828282818186929fac9f928781818181818181818181818181828f9ca9aa9d9083818282828283838384848074655b5044372b1f120500000000000000000000000000000000000000000000000000000000000000000000000000010507070807060400000303000004060706040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002050708101110101110070705010000000000000000000000000000000000000000000205070811060b0f1213120f0b0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b1e262e34383a38342e2e34383a38342e271e1d140b01000000000000000000000000000000000000000000000000000000040d161d262d3338393a3935302d33383938332d261d1810060000000006111c2630384149505353504a504f4f4f504b5153514b42423930251b10040000000009141f29333b424a505353504a504f4f50514a5153514a423e352c21160b0000000000040e161d262d3337393f45423a38342e271e150c03000000000000000000000000000000000000000000000000000000000000000000000000040a0f13181d20212326292a2b2c2b2a2928272421201e1913120f0b0600040a0f1315161a1d1e1e1d1c1a171413110d08020000000000000000000000000000000000000000000004080d1113171c1f20222426282829292a29282827262523201f1c181413100c0701000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e1214151b1b1312100c0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926323f4c5965727f8c98a5b2bfcbc3b6a99d9083766a5d5043372a1d100400000000000000000000000000000000000000000000060b13181c22282b2f35393a3e4246484a4d4f4b515354545555555555545453504a4f4e4c4a474642403d3a3936302e2d2a262321201d1913110d0802000000000000000000000000000916232f3c4956626f7c8995a2afbcc8cdc1b4a79a8e8174675b4e4134281b0e01000000030d17222d38414d57616c75818e97a1adb7c0cccdc3b9b0a69d928b7e716b60574d443a30261c140a01000000000000000004111e2b3744515e6a7784919daab7c4d0c9bcafa396897c706356493d30231615151516161617171b1f20262b31363f47505a616e7b85929fabb8c2cdcdc2b9aca0968a7d7063544a3f33281c0f0300000000000a1724303d4a5763707d8a919090908f8f8f8e8e8e9298a2aea399928e8e8e8e8e8e8e8e8e8e8e8e8e8f949fabaca095908e8e8f8f8f909090919186796c605346392d201306000000000000000000000000000000000000000000000000000000000000000000000002080d111314141313100c070f10070c10131313100c0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090e1114141d1e1c1d1e1d1413110d0802000000000000000000000000000000000003090e1214151e1d171b1f201f1b17110a0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111b242d30383f4446443f4243404446444039302f261d12080000000000000000000000000000000000000000000000000000010c161f282f383f444647464143433f4446443f382f2a22180e040000000c17232e38424a535b60605c545c5c5c5c5c545c605c54534b42372c211509000000020e1a25313b454d545c60605c545d5c5c5d5e545c605c544f473e33281c1004000000020c1620282f383f44464c524e4645403930271e150c0300000000000000000000000000000000000000000000000000000000000000000003090e161b1d24292c2d3033363738393837363534312e2d2a25201f1b17110b0e151b1f222227292b2b2a29272421201d19130f0a04000000000000000000000000000000000001070c1013191d2023282b2d2f313334353636363635343433322f2d2c2923201f1c18120f0a040000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080f0e070604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2becbc3b6a99c908376695d5043362a1d10030000000000000000000000000000000000000000020a11171d24292d33383a4045474b4d5254575a5b555d60616162626262616161605b545c5a585654524d4d4a4746413e3b3a36312f2e2d2a25201e19130d050000000000000000000000000916222f3c4955626f7c8895a2afbbc8cdc0b4a79a8d8174675a4e4134271b0e010000010b151f27333f49535e69717e8a939ea9b2bec9cfc4bbb1a79e948d80736c62594f453b32281e150a0200000000000000000004111e2a3744515d6a7784909daab7c3d0c9bcafa396897c706356493d3023160a080809090a060b0f12131a1f262a353e46525e6973808d99a7b1bcc8d4c9bdb2a89a8e8174665b5044382b1f120600000000000714212e3a4754616d7a86939d9d9c9c9c9c9b9b9b9fa2aab4aba39f9a9a9a9a9a9a9a9a9a9a9a9a9a9c9fa6b0b1a7a09d9b9b9b9c9c9c9d9d9d928578665b5044382b1f120600000000000000000000000000000000000000000000000000000000000000000000050d13191e202121201f1c181c1c1d1e181c1f201f1c18120b03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d14191e20212a2a29292b2a21201d19130c05000000000000000000000000000000050d141a1e20212a2a22272b2d2b27221b140b0b02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c18232d373f424a5053504a4f4f4a5153514a4240382f24190e030000000000000000000000000000000000000000000000000007131d28313a424a505354524c4f504a5053504a423c342a20150a000003101c28343f4a545c656c6d666a69696969696a666d66655d53493d3125190c00000005121e2a36424d575e666d6d666b6a69696a6a6b666d6661594f44382c20140700000008131e28323a41495053595e5b53514b423930271e150c0300000000000000000000000000000000000000000000000000000000000000060e141a21272c2f35393a3d404243444545444342413e3b3a36302d2b27221b171a20272b2e2f33363737373634312e2d2a251e1b160c07000000000000000000000000000001070d12181d1f24292d2e34383a3b3d3f414242434343424140403f3c3a38342f2d2c29231d1b150e0902000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1becbc2b6a99c8f8376695c504336291d100300000000000000000000000000000000000000060b141c22282f35383f44464b515357575e616466686a676d6d6e6e6f6f6f6e6e6d6c666a69676563615e565a5754524c4b4846423e3c3a3936302d2a251e170e0500000000000000000000000915222f3c4855626f7b8895a2aebbc8cdc0b3a79a8d8074675a4d4134271a0e01000007121d27313944505b656e7b85929fa5afbbc4cfc6bdb3a9a0958f82786c605a50473d332a20160c030000000000000000000004111d2a3744505d6a7783909daab6c3d0c9bcafa396897c706356493d3023160a000000000000000305090e141a232a36424d57626e7b88959fabb8c4d1cec4b8ab9e9285796c605346392d20130600000000000713202d3946525e687784909daaa9a9a9a8a8a8a7acaeb4bcb5aeaca7a7a7a7a7a7a7a7a7a7a7a7a7a9abb0b8b9b1acaaa7a8a8a8a9a9a9aa9f9386796c605346392d201306000000000000000000000000000000000000000000000000000000000000000000050e171e252a2d2e2e2d2c282329292a2a23282c2d2c28231d150c0a01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e171f252a2d2e3737363637362e2d2a251e170e0500000000000000000000000000050f171f252a2d2e37372d33373937332d261d1d140b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111d29343f4951545c605c545c5c545c605c54524a40362b1f1307000000000000000000000000000000000000000000000000071118242f3a434b545b60615e565c5c545b605b544e463c32261b0f030006121f2c3844505c666d787978767676757576777879756f65594d4134281b0e0200000714212d3a46535e696e787978787776757677787979706b6155483c2f2316090000010d1925303a444c535b60656b68605c544b423930271e150c030000000000000000000000000000000000000000000000000000000000090f181f262b32383a4145474a4d4f5051525251504f4d4b4746423d3937332d2822262b32373b3c404344444343403e3a3936302c272118120b030000000000000000000001070d12181d24292c3035393a3f4446484a4c4e4f4f4f504f4f4e4d4c4b494745403e3a38342f2b27201a140d050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104060708080909080807070501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbc2b5a99c8f8276695c4f4336291c10030000000000000000000000000000000000020a11171d262d333a40454a5053555d606468696e71737576787a7a7b7b7c7c7b7b7b7a797877757472706e69696664615e565855534d4b494746413a3936302920170d02000000000000000000000815222f3b4855626e7b8895a1aebbc8cdc0b3a69a8d8073675a4d4034271a0d0100050e18242f39434e58606c77828f97a2adb7c1cdcbbfb4aba1979083796d665b50483f352b21180d04000000000000000000000003101d2a3643505d697683909ca9b6c3cfc9bcafa396897c706356493d3023160a000000000000000000000309111a25303b47535f6a7683909da9b6c3d0d2c6b9ada197897c6f6356493c30231609000000000005111d2935414c566774818e9aa7b4b6b5b5b5b4b4b8babfc6bfbbb9b4b4b4b4b4b4b4b4b4b4b4b4b4b5b7bbc2c3bcb8b7b4b5b5b5b5b6b6afa499877a6d6154473a2e2114070000000000000000000000000000000000000000000000000000000000000000050e1720293036393a3b3a38342e363636372e34383a38342e271e1c130a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020d17202930363a3b4344434344433a3936302920170c020000000000000000000000030d17212930363a3b4443423f4446443f382f2f261d0f0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915222e3a45515b62666d666969696a666d66645c52473c3023170b0000000000000000000000000000000000000000000000050e19232935414b555d666c6d686a69696a666c665f584e43372b1f1306000713202d3a4653606d788486858383828282838385868175685c4f4235291c0f0200000815212e3b4854616e7b8586858483828283848586867d7063574a3d3024170a000005111d2935414c565e656c7278756d665c544b423930271e150b0200000000000000000000000000000000000000000000000000000109121b212a31373d43484b515456595c5d5e5f5e5d5c5b5a5754524d4a46443f38332d31373c4347494d505151504f4d4a4746413a383228231d150c030000000000000000070c12181d24292f35393a4146474a50535557595b5b5c5c5d5c5b5b5a59585653514b4b4745403937322a251f170e0900000000000000000000000000000000000000000000000000000000000000000000000000000002050708070d1013141415161615151413110d080907060400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1becac2b5a89c8f8275695c4f4236291c0f0300000000000000000000000000000000050b141c22282f383f444b51545b6064676d7175787b7d808283858687878888888888878786858382817f7d7a787673706d686865615f57585654524c4746413a32291e1308000000000000000000000815222f3b4855626e7b8895a1aebbc8ccc0b3a6998d8073665a4d4033271a0d00020b17202935404b555f6a727f8c949fa9b3bec9cbc2baaea39991857b6e675d544a3f362d23190f0600000000000000000000000003101d293643505c6976838f9ca9b6c2cfc9bcafa396897c706356493d3023160a00000000000000000000000009141f2b37424e576773808d9aa6b3c0cdd5c9beb3a9998c7f7266594c3f3326190c0000000000010d1925303f4c5966727f8c99a5b2bebebebdbdbdbdc2c3c7cbc7c5c1bebbbbbbbbbbbbbbbbbbbbbbbbbcbdc1c7c8c5c3c1bdbdbdbdbec0b5ab95887c6f6255483c2f22150900000000000000000000000000000000000000000000000000000000000000020d172029323a41464747464540444342434445404546454039302e251c12070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141f29323b42464750514f5051504746413a32291e1308000000000000000000000009141f29333b42464851504f49505350494141382f21170d02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1824313d4a56626d727977767576777879746e64584c3f33261a0d00000000000000000000000000000000000000000000030c17202b353d45515d676d787a787776767778786f6a5f53473b2e211508000714202d3a4753606d7a869391908f8f8f8f8f90919083766a5d5043372a1d100400000a1724303d4a5763707d8a939291908f8f909192928d8073665a4d4033271a0d00000713202d3946525e686d777f8581786d665c544b423930271d140a000000000000000000000000000000000000000000000000000009131b242d333c42464f54555d606366696a6b6c6b6a69686764615e5657535049443f383c42474e54555a5c5e5e5d5c5a5754524c48433d342e271e150b000000000000030b12181d24292f35394045474c5254545c60626466676869696969686767666562605c555753514b47433c363029201b120b02000000000000000000000000000000000000000000000000000000000000000000000206090e12141518181d202021222222222121201d1919161312100c070300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1bdcac2b5a89c8f8275695c4f4236291c0f03000000000000000000000000000000060e171d262d333d424a50555d60666c70757a7e8184878a8d8e9092979494959595959494999291908f8d8b89878583807d7a7774716e69686562615e5654524c443a3025190d010000000000000000000815222e3b4855616e7b8894a1aebbc7ccbfb3a6998c807366594d4033261a0d000a141d29323b45515d676f7c86929fa6b0bbc5cdc2b9afa59f92877d6f695e554b42382d241b11070000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cfc9bcafa396897c706356493d3023160a000000000000000000000000020e1a26313e4b5864717e8b97a4b1becadacfc0b3a79a8d8074675a4d4134271a0e000000000000081824313e4b5764717e8a97a4b1b1b1b1b1b0b0b0b5b7bbc1bfb8b3b2afafafafafafafafafafafafafb1b6bcc5beb9b8b0b0b0b1b1b1b1a5988b7e7265584b3f30251a0e0200000000000000000000000000000000000000000000000000000000000008131e29323a444c52545453514b504f4f5051514b5153514b4340372e23190d020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1925303b444d52545d5d5c5c5e5d54524c443a3025190d01000000000000000000020e1a25303b454d52545d5d5c535b605b53534a4133291f1409000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1825323f4b5865727f87848382828485868074675a4d4134271a0e010000000000000000000000000000000000000000000b151e29333d47515b606d798387858482838485867c6f6255493c2f221609000613202d394653606c7986989e9d9c9c9c9c9c9d9c8f8376695c504336291d100300000a1723303d4a5663707d89969f9e9d9c9c9d9d9e998c7f7366594c403326190d00000714212e3a4754616d7a828c918e82786d665c544b42392f261c110600000000000000000000000000000000000000000000000008121b252d363e454d53596063676d7073757677787877767574716e696763605b53504a42454d5358606266696a6a6a696764615e56544e45403930271d120700000000030c151d23282f353940454b5153565d6165666d6e707274757576767675747373726f6d676864605c55544e46423b332d251d140b020000000000000000000000000000000000000000000000000000000000000003090e12141a1e21222524292c2d2e2f2f2f2f2e2e2d29242623201f1c1812100c060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0bdcac2b5a89b8f8275685c4f4235291c0f020000000000000000000000000000060f1820292f383f444f545b60676d72787d82868a8e919697999b9d9ea1a9a1a1a2a2a2a1aba39f9e9d9c9a989697928f8d8a8784817e7b7875716f6d6869615e564c41362a1e11050000000000000000000815212e3b4854616e7b8794a1aebac7ccbfb3a6998c807366594d4033261a0d06111b262f3b44505a606d79839199a3aeb8c2cdc5bbb1a79d938b7f726b60574d433a2f261c12090000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfc9bcafa396897c706356493d3023160a000000000000000000000000000916232f3c4956626f7c8995a2afbcc8d5cec1b5a89b8e8275685b4f4235281c0f000000000000091623303c4956636f7c8996a2a5a5a4a4a4a4a3a3a8aab0b8b5ada7a5a2a2a2a2a2a2a2a2a2a2a2a2a2a5abb3bbb3adaba3a3a4a4a4a4a4a59b8e817568574d42362a1e12050000000000000000000000000000000000000000000000000000000000010d1925303a444c565e6161605c545d5c5c5d5d5e555c605c55514940352a1e1206000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111e2a36424d565e616a6a69696a69615e564c41362a1d110500000000000000000005121e2a36424d575e616a6a6969656c65645c53453b30251a0e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1b2734414e5a6774818d918f8f8f90929084776a5d5144372a1e1104000000000000000000000000000000000000000007121d27303b454f59626d75818e9592908f8f91928b7e7165584b3e3225180b0005121f2b3744505b657985929fa9a9a9a8a8a9a89c8f8275695c4f4236291c0f030000091623303c4956636f7c8996a2abaaa9a8a9aaa5998c7f7266594c3f3326190c0004111e2a3744515d6a77838f949e948f82786d665c544b42382d2217120800000000000000000000000000000000000000000000050e1a242d373f4850575f616b6f757a7d808283848585848382807e7b7774706c65605b54504f575f626a6f73767777767673716d68626058514b43392e23180c000000000b151e272e343940454b51555d6065686d7176797b7d7f8182828283828281807f7e7c797774716d67626058524d453f372f261d140a0000000000000000000000000000000000000000000000000000000000050b10151a1e21262a2d2e322f35393a3b3b3c3c3b3b3a39353033302d2c28231f1c17110d07010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdcac1b5a89b8e8275685b4f4235281c0f0200000000000000000000000000061018212a323b424a505960666c72797f848a8f92989b9ea1a8a6a8a9aaa7a4aaa29f9e9e9d9e9e9fa3aba6a7a5a9a29f9c999796918e8b8884817e7c7a78766d685e5246392d2013070000000000000000000814212e3b4754616e7a8794a1adbac7ccbfb2a6998c7f7366594c403326190d0d17222d38414d56616c74818e95a0abb4bfcac7bdb3a99f958e81746d62594f453b31281d140a000000000000000000000000000000020f1c2835424f5b6875828e9ba8b5c1cec9bcafa396897c706356493d3023160a000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4cfc3b6a99c908376695d5043362a1d100000000000000916232f3c4956626f7c89959898989897979797979c9ea6b0ada39b989595959595959595959595959699a1abb3a9a19e969797979798989898918578695e52463a2d201407000000000000000000000000000000000000000000000000000000000005111e2a36414c565e686d6e6d666b6a6969696a6b6b676d67635b51463b2f23160a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a46525e696e7677767677766d685e5246392d20150a0000000000000000000714202d3a46525e696e777675767779746e64574d42362a1b11060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2734404d5a6773808d9a9c9c9c9d9d9083766a5d5043372a1d100400000000000000000000000000000000000000061018232e39424d57606b727f8c939e9e9d9c9c9d988b7e7265584b3f3225180c00030f1b27333f495f6c7885929fabb6b5b5b5b5a89b8e8275685b4f4235281c0f0200000916222f3c4955626f7c8895a2afb6b5b5b6b2a5988b7f7265584c3f3225190c00030f1c2936424f5c6975828f96a19e948f82786d665c544a3f3328241a11070000000000000000000000000000000000000000020c16202c363f49515a61696e767c8286898c8f90919291908f8e8d8a8784817d78716c66615a5960696e757c808384848382807d7a756f6a605c554b4034281c1004000007121d27303940454b51555d60676d71767a7e8286888a8c8e8e8f8f908f8e8e8d8c8b898684817e79746f6a615e57514940382f261c12090000000000000000000000000000000000000000000000000000040a0f161c20262b2e31363a3b3e4140454747484949484847464142403c3a38342e2c28231c18130c0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a96a3b0bdc9c1b4a89b8e8175685b4e4235281b0f02000000000000000000000000060f18222a333b444c545b606b6f787e858b91969b9fa3aaabadacaca49f9d9a979598929191909192929996999c9fa3ababa9a6a8a09e9b9896918e8b898785827a6d6154473a2e2114070000000000000000000714212e3a4754616d7a8794a0adbac7ccbfb2a5998c7f7266594c3f3326190b151f27333f49535e69707d8a929da8b1bdc6cbc0b5aba1979083796d605b51463d33291f160b02000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1cec9bcafa396897c706356493d3023160a000000000000000000000000000814212e3b4754616e7a8794a1adbac7d4d0c4b7aa9d9184776a5e5144372b1e110000000000000814212e3b4754616e7a878c8b8b8b8b8b8a8a8a8a8f949eaaa79b918b888888888888888888888888898f99a9ada197928a8a8a8a8b8b8b8b8b8c877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000000000713202d3946525e686d7a7a797978777675767778787979736d63574b3e3225190c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2934404b55616e7b8384828384837a6d6154473c32271b0f000000000000000004101c2834404a54616e7b8383828384858074695e5246382d22170b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2633404d596673808c99a6a8a9a99c8f8376695c504336291d1003000000000000000000000000000000000000040d18222834404b545e69707d87929fa5abaaa9a9a5988b7e7265584b3f3225180c00000b17222d45525e6b7885919eabb8c2c2c1b4a79b8e8174685b4e4135281b0e0200000915222f3c4855626f7b8895a2aebbc2c2beb1a5988b7e7265584b3f3225180c00000714212e3a4754616d7a849199a39e948f82786d665b50443f362c23190f050000000000000000000000000000000000000008131e28323e48515b626c717b83898e9299999c9d9e9f9e9d9c9b9a9796918d8a837e78716c60606b6f7b82888d8f9191908f8d8a86827c736d675c5145382c1f130600000c18232e39434b51555d60676d72797e82868b8f929897999a9b9c9c9c9c9b9a9a99989992908e8a85817c756e69625b524a40382e241b0e04000000000000000000000000000000000000000000000000060b151b21272c31373a3b4246484b4e4b515354555555555454524c4f4c494644403a38342e29241d17110a030000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1723303d4a5663707d8996a3b0bcc9c1b4a79b8e8174685b4e4135281b0e020000000000000000000000040e18212a343c454d565e666c737c838b92979ea0a8acaeb1aba7a09d9a93908d8a89878585848484858687898c8f92999c9fa6acaeacaaa7a8a19e9b98959892897d7063564a3d3023170a0000000000000000000714212e3a4754616d7a8794a0adbac7cbbfb2a5988c7f7265594c3f322619121d27313944505b656e7b85929ea5afbac3cbc3bbafa39992857b6e675c51483f342b21170d0400000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cec9bcafa396897c706356493d3023160a000000000000000000000000000815222f3b4855626e7b8895a1aebbc8d4d0c3b6a99d9083766a5d5043372a1d100000000000000714202d3946525e68717e7f7f7e7e7e7e7e7d7d7d828f9ca8a5988b7f7c7c7c7c7c7c7c7c7c7c7c7c7d8997a2ab9e92857d7d7d7e7e7e7e7e7f7f7f786d6053463a2d20130700000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a87878685848382828384848586867f7366594c403326190d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c6774808d908f8f918c7f7366584e43372b1c11060000000000000006121f2c3844515c6673808d908f8f9192877b6e6153493f33271b0f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5b2b5a89c8f8275695c4f4236291c0f030000000000000000000000000000000000020b16202a343c45515c666e7b859299a3afb8b7b5b1a5988b7e7265584b3f3225180c0000061e2b3844515e6b7784919eaab7c4cdc0b4a79a8d8174675a4e4134271b0e0100000815222e3b4855616e7b8894a1aebbc7cabeb1a4978b7e7164584b3e3125180b00000713202d3946525e686f7c87929fa59e948f81786c605b51483e352b21170c030000000000000000000000000000000000010d1925303a44505a626d727e8690949b9fa3aba8a9aaababaaa9a8a7a8a09d9a95908a847e756d6a6f7d868e93999c9d9d9d9c9a99928e8780796d6053463a2d2013070004101c2834404b555c60676d72797f858b8f92999c9fa3aaa5a5a4a3a3a4a5a8a7a6a6aba39f9d9b97928d88827b726d645c524a40362d20160c02000000000000000000000000000000000000000000020a111720262b33383c4247484d5355585b555d60616262626261615d565b595653514a46443f38352f28231c150c0600000000000000000000000000000000000000000000000000000000000000000000000000000000000a1723303d4a5663707d8996a3b0bcc9c1b4a79b8e8174685b4e4135281b0e0200000000000000000000030c16202a333c464e575f686e78808790959ea1a9acb2b3ada79f9d95908c8783817e7c7a797877777778797a7d7f82868b8f949a9fa3aab4b4b2adaba8a4aaa296897c6f6356493c302316090000000000000000000714212d3a4754606d7a8793a0adbac6cbbeb2a5988b7f7265584c3f32251918242f39434e58606c77828f97a1adb7c0ccc3b9afa59f92877d6f695e554b40362d22190f050000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cec9bcafa396897c706356493d3023160a00000000000000000000000000071723303d4a5663707d8996a3b0bcc9d6cec2b5a89b8f8275685c4f4235291c0f00000000000005111e2a36414c56616c71727272727171717170727f8c99a5a4988b7e716f6f6f6f6f6f6f6f6f6f6f7885929fab9f928679707171717171727272726d665c5044382c1f120600000000000000000000000000000000000000000000000000000000000915222f3c4855626f7b8899989291908f8f90909192928e8175685b4e4235281b0f020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7985929d9c9c9d9184776a605447382e23170b000000000000000713202d3a4653606d7985929d9c9c9e998c7f73655b5044372b1f130800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2b5a89b8e8275685b4f4235281c0f0200000000000000000000000000000000000a141d28323c46505a606d78839097a1abb5c0c3beb1a5988b7e7265584b3f3225180c0004111e2a3744515d6a7784909daab7c3cdc0b3a69a8d8073675a4d4034271a0d0100000815212e3b4854616e7b8794a1aebac7cabdb0a4978a7d7164574a3e3124170b000005111d2a36414c56606a727f8b939ea69e938d80746d625a50473d33291e150b000000000000000000000000000000000005111d2a36414c56616c727f8b92989fa6acafb5b5b5afaca8a19e9c9b9b9d9fa3a09d96918a81796f7c8692989ea5a9aaaaa9a9aba39f99938b7e7265584b3f3225180c0006131f2c3845515c676d72797f858c92979c9fa3a9a19e9c999897969697999b9ea1a8acafacaaa9a29f9a938f857f746e645c52483f32281e13080000000000000000000000000000000000000000040b141c222832373d44484d5355575f61656769676d6e6e6f6f6e6e6d686a686663605c5453504a45413a342e261e180f08000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e02000000000000000000000b151e28323c454e585f696e7a828c9399a0a7adb3b9b0a9a29f959089837f7b7774716f6d686b6b6a6b6b686d7073767a7e83888e9298a3aebabdb9b8b4b1b3a295897c6f6256493c2f2316090000000000000000000714212d3a4754606d7a8793a0adbac6cbbeb2a5988b7f7265584c3f322517202935404b555f6a727f8c949fa9b3bec9c5bbb1a79e938b7f726b60574d43392e241b1007000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cec9bcafa396897c706356493d3023160a0000000000000000000000060b121c28333f4a5464717e8b97a4b1becad7ccc0b5ab9a8d8174675a4e4134271b0e000000000000020e1925303b44505a6164656565656564646464717d8a97a4a6998c8073666262626262626262626a7784909daaa399877b6e646464656565656565605c544a3f34281c100300000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a29f9e9d9c9c9c9d9e9e9a8e8174675b4e4134281b0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121e2b37424d5764717e8a97a2a9a9a096887c6f62544a3f34281c1003000000000005121e2a36424d5764717d8a97a1a8a9ab9e9184786c6053463a3025190d01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1b4a79b8e8174685b4e4135281b0e020000000000000000000000000000000006111b262f3a444e58616c74808d959fa9b3bdc7d1beb1a5988b7e7265584b3f3225180c0004101d2a3743505d6a7683909da9b6c3ccbfb3a6998c807366594d4033261a0d0000000714212e3a4754616d7a8794a0adbac7cabdb0a3978a7d7064574a3d3124170a0000010d1925303a444e58626d75818e96a0a59d928c7f726c61594f453b30271c1207000000000000000000000000000000000713202d3946525e68717e87939fa2aab0b9bbbcb4aba49f9a96918f8e8f9092989c9fa09d938e837a829098a2aaafb6b7b7b1acaca49fa4998c807366594d4033261a0d000713202d3a4653606d797f858c92979ea1a9a19e9a97928f8c8b8a8a8a8a8c8e91969b9fa3abb1b3adaba59e98928b80746e645a50443a3024190d00000000000000000000000000000000000000050e161d262d333c43474f54575f6267696e717476787a7a7b7c7c7b7b7a797775736f6d6664605c54514b443f38302a211a12090100000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e0200000000000000000007121d27303a444d575f6a6f7b848f949fa4abb1b9b7afa69f97928a837d77726e68676462605d565e5d5e565e616366686d71767c8186929facb8c5c5c4c1bbaea295887b6f6255483c2f2215090000000000000000000714212d3a4754606d7a8793a0adbac6cbbeb2a5988b7f7265584c3f32251d29333b45515d676f7c86929fa6b0bbc5c7bdb3a9a0958e81746d62594f453b30271d120900000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cec9bcafa396897c706356493d3023160a010202000003060708090e11171d232b3844505b6673808d9aa6b3c0cdd4c7bbafa4998b7e7165584b3e3225180b0000000000000008141e29323e485055575958585858585757626f7c8995aaa79b8e8174685b555555555555555c6875828f9ba8ab96897c6f63575858585858595853504a42382e23170c0000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1acabaaa9a8a9aaaba79a8d8074675a4d4134271a0e0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212d3a47535f6976838f9ca9b3b2a89a8d8074665c5044382b1f120700000000000714212d3a46535f6976828f9ca9b3b6aca196897d7063564c4135291d1105000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1b4a79a8d8174675a4e4134271b0e01000000000000000000000000000000060f17222d38414c565f6a717e8b929da7b1bbc5cfcbbeb1a5988b7e7265584b3f3225180c0003101d2a3643505d697683909ca9b6c3ccbfb2a5998c7f7266594c3f3326190c0000000714212d3a4754606d7a8793a0adbac6c9bcb0a396897d7063564a3d3023170a00000008131e29323d46515b606d7984919aa4a49f93887e716b60574d42392e23180f06000000000000000000000000000005111e2a36414c56616d7a859299a4aeb4bcc2bdb4aaa299938e888483828283868a8f949d9f9e95908590959faab4bcc1bcb1a7a09d9a939a988b7e7165584b3e3225180b000e1b2734414e5a6774808c92979ea1a9a29f97928d888582807e7e7d7d7e7f8184898e92999fa7afbab8afaaa29f928d80736c62564c4135291d12070000000000000000000000000000000000050e1720282f383f444e53596063696e73787b7e81838586878888888887878583827f7c7975706d66605d55504a423c332c241b130a01000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e020000000000000000030c18232e39424c565f696f7c8591969fa6afb5bdb7afa59e9490857e76706b65615e56575654524c5151514c525456565e61656a6f747d8a97a3b0bdcad1c8bbaea195887b6e6255483b2f2215080000000000000000000714212d3a4754606d7a8793a0adbac6cbbeb2a5988b7f7265584c3f3225262f3b45505a606d79849199a3aeb8c2cbc0b5aba1979083796d605b51473d33291e150b0000000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cec9bcafa396897c706356493d3023160e0e0f0f060c10121315161a1c22282e343f4a54606c7884919eabb8c4d1d0c6b9ac9f93867a6d6154473a2e21140700000000000000020d17202c363e45494b4c4c4b4b4b4b4b54616e7a8798a3a99c90837669544a49494949494d5a6774808d9aa7a4978a7e7164574b4b4b4b4c4c4b46443f3830261c11060000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a8794a0adb7b6b5b5b6b7b3a6998d8073665a4d4033271a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54616e7b88949fabbbb8ab9e9185796d6053463a2f24180c0000000003101c28343f4a54616e7b87939facb9bdb2a89b8e8175685e5246392d20160a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0b3a69a8d8073675a4d4034271a0d010000000000000000000000000000030d172127333f49535d686f7c86929fa4aeb9c2cdd6cbbeb1a5988b7e7265584b3f3225180c0003101d293643505c6976838f9ca9b6c2cbbfb2a5988c7f7265594c3f3226190c0000000714202d3a4753606d7a8693a0adb9d1c9bcafa396897c706356493d3023160a000000020c17202b343f45515d67707d88939fa9a49a92867d6f695e544a40342821170b02000000000000000000000000000714202d3946525e6874808d98a2abb5bfc5c0b5aba2989287817c78767575767a7d828990959c9f9791979fa7b1bcc5c5b8aca095908886888c897c6f6356493c30231609000e1b2835414e5b6874818e9ba1a9a69f97928c85807c78757372717070717275787c818790959ea5afb9bcb3aea49d928b7e71685d5245392e23180c00000000000000000000000000000000050f172029323a424a50585f626b70767b8084888b8e9091979495959595949892908e8c8985827d79736d67605c544d453e362d251c130a000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e0200000000000000000b151e2834404b545e686e7b859197a1a8b0bbc0b8afa59e938e827b716c63605954524d4b494745414444444146474a4c5254585f63707d8a96a3b0bdc9d4c7baaea194877b6e6154483b2e2115080000000000000000000714212d3a4754606d7a8793a0adbac6cbbeb2a5988b7f7265584c3f32222d38424d57616c74818e96a0abb4bfcac3bbafa39992857b6e675c51493f352b21170c030000000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cec9bcafa396897c706356493d30231b1b1b1b1c1c171c1f202123252a2d33394045505b66707d8996a1adb9c5d2c7beb1a79c8f8376685e5246392d2013070000000000000000050e1a242c34393d3e3f3f3f3f3e3e46525e687985929fab9e918478665c50443c3c3c3f4c5965727f8c98a5a6998c7f7366594c403e3f3f3f3f3a38342e261e150a000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0b4bfc3c2c2c3bfb2a6998c7f7366594c403326190d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2c3844505c6673808d99a6b0bbb9ada197897d7063554b4035291d100400000006121f2c3844505c6673808d9aa4afbbc4b9ac9f92867a6d6154473d32271b0f010000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1723303d4a5663707d8996a3b0b3a6998c807366594d4033261a0d0000000000000000000000000000010b151f29333b44505b656d7a849198a2aeb6c0cbd4d8cbbeb1a5988b7e7265584b3f3225180c0003101c2936434f5c6976828f9ca9b5c2cbbeb2a5988b7f7265584c3f3225190c0000000713202d3a4653606d798693a0b5c0cbc9bcafa296897c6f6356493c3023160900000000050e19222935404b55606b74818e97a1aca39892857b6e665c51443e33291d140a000000000000000000000000000814212e3b4754616e7a86929faab3bdc7c7bbafa49992867d746f6a696868676d70767c838c929fa19ea1a9b1b9c2cbc0b5ab9d90837c797b8081776c605346392d201306000b1825323e4b5865717e8b98aba49d948f857f79736f6a6966656463636466656c6f747b838e939ea7b1bcbebaaea49e92857a6d60554b4034281c10040000000000000000000000000000040d172129333b444c545b606a6f767d83888d9196989a9c9ea1a9a1a2a2a1aaa29f9d9b9998928f8a857f7a726d665f5750483f372e251c12090000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e020000000000000007121d27303945515c666d7a849197a1a9b2bac2bab0a69e938e81796e69615a554f4746413e3c3a393530373036393a3d4146474e5763707d8a96a3b0bdc9d3c7baada094877a6d6154473a2e2114070000000000000000000714212d3a4754606d7a8793a0adbac6cbbeb2a5988b7f7265584c3f3333333f4a545e69707e8a939da8b2bdc6c3b9afa59f92877d70695e554b40372d23190f05000000000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cec9bcafa396897c706356493d302727272828282923282c2d2e303036383f444b515a606c78828f9ca8b2bdc9ccc0b6ac9f958b7e7164564c41362a1e110500000000000000000008121a22282d3031323232323236414c566a7784919daa9f9286796d6053463a2f313d4a5764707d8a97a3a79a8e8174675b4e412d323232322d2c28231c150c03000000000000000000000000000000000000000000000000000000000000000613202d394653606c798698a3aebac7cfcfcbbfb2a5988c7f7265594c3f3226190c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7985919eabb8c2beb3a99b8e8174675d5145392c1f13080000000713202d3a4653606d7985919eacb6c0c7baaea3998b7f7265584e43382b1d1307000000000000000000000000000000000000000000000000000000000000000000000000000000000000091623303c4956636f7c8996a2afb2a6998c7f7366594c403326190d000000000000000000000000000007121d27313b454f59606c77828f96a0aab4bfc8d2ddd8cbbeb1a5988b7e7265584b3f3225180c00030f1c2936424f5c6975828f9ca8b5c2cbbeb1a5988b7e7265584b3f3225180c0000000613202d394653606c798699a3afbbc7c8bcafa295897c6f6256493c2f2316090000000000071018242f3a434f59606d7a84919ea6aaa2979083786d605a50453b2f261c11060000000000000000000000000b1825323e4b5865717e8b99a3aebcc5d0c6b9ac9f93877d706b625f585b555d60646a6f78808b939aa4adb3bbc2cbc7bbafa399897c6f6d6e73746c655b5044372b1f1205000915222f3c4855626f7b8899a39c928d827b726d67626058595857575757535b6062696e78818e959fabb8c3c0b9ada1978d8074675c5145382c1f130600000000000000000000000000020b161f29333b454d565d666c727c828990949a9ea1a8a7a8a09d9b99989798999c9fa2aaaaa29f9b97928c857f786e69615a514940372e241b110700000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e02000000000000000c18232e39434e58606d78829096a0a9b2bbc4bdb2a89f948e81776d675e575048443d3936302f2d2c29242a252a2d2e3035393d4a5763707d8a96a3b0bdc9d3c6baada093877a6d6054473a2d2114070000000000000000000714212d3a4754606d7a8793a0adbac6cbbeb2a5988b7f7265584c3f3f404144505b666e7b85929ea5afbac3c5bbb1a79e938c7f726b60574d43392f251b110700000000000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cec9bcafa396897c706356493d34343434343535362e34383a3b3c3f42464a50555c606c73808d949fabbac4ccc2bbafa49a9083786c6053463a3025190d01000000000000000000000810171d212324262525252530434f5c6976828f9ca9a399877b6e6154483b2e2f3c4955626f7c8895aaa99c8f82766953493f3327252625201f1c17110a03000000000000000000000000000000000000000000000000000000000000000005121f2b3744505b657986929facb9c5d2d8cbbeb1a5988b7e7265584b3f3225180c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121e2a36424d5764707d8a97a1adb9c6c4b8ac9f9285796d6053473a3025190d010005121e2a36424d5764707d8a97a1adbec7cbbfb4ab9d9084776a6054473a2f24180d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c8895a2afb2a5988c7f7265594c3f3226190c00000000000000000000000000071018232f39434d57616b737f8c949ea8b2bcc6d0dae4d8cbbeb1a5988b7e7265584b3f3225180c00030f1c2936424f5c6975828f9ca8b5c2cbbeb1a4988b7e7165584b3e3225180b00000005121f2b3744505b657986929facb9c5c8bbafa295887c6f6255493c2f22160900000000000007131d28313d45525d68707d8a949eaba99f958d80746c61574d42382d22170b0200000000000000000000020f1c2935424f5c6875828f9babb5bfcec8bcb1a79a8d81746b6059534e4f4b51535860666d737f88939fa5afbac6d2c5b9ac9f9286796c60626668605b53493f33271b0f03000613202d394653606c7986929f928d80776e69605d55544e4d4b4b4a4a4b495053575f666d7983909da7b1bcc8beb3a99f9285796d6053463a2d201307000000000000000000000000000a141d28313b454d575e686d787f878f949c9fa6abaaa39f9a96918e8c8b8b8b8d8f92989d9fa7aca9a19e97928c837b716c625b514940362d23190d04000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e0200000000000004101c2834404b55606a73808d949fa8b2bbc4c6b9ada1968f82786d655c554d453e38332d2a252321201d191e191d20212529303d4a5763707d8a96a3b0bdc9d4c7bbafa49986796d6053463a2d2013070000000000000000000714212d3a4754606d7a8793a0adbac6cbbeb2a5988b7f7265584c4b4c4d4e4e58606c78828f97a2adb7c0c7bdb3a9a0958e81756d62594f453b31271d13090000000000000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cec9bcafa396897c70635649414141414141424242433f444648494b4d52545b60676d747e88939fa6b0bbc7c0bbafa59f93887c6f655b504437291e1308000000000000000000000000060c111417181919181b2834414e5b6774818e9aa7ab96897c706356493d302e3a4754616d7a8798a2aa9d918477655b5044372b1f19181312100c0600000000000000000000000000000000000000000000000000000000000000000000030f1b27333f495f6c7885929fabb8c5d2d7cabeb1a4978b7e7164584b3e3125180b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a46525e6975828f9ca9b3bec9c6baaea2988a7e7164564c41362a1d1105000714212d3a46535e6976828f9ca9b3bed0d1c6b8aca095897c6f62554b4035291d110400000000000000000000000000000000000000000000000000000000000000000000000000000000000915222f3c4855626f7b8895a2aeb2a5988b7f7265584c3f3225190c000000000000000000000000050e19222934404b555f69707d87939fa6b0bac4ced8e2e4d8cbbeb1a5988b7e7265584b3f3225180c00020f1c2935424f5c6875828f9ba8b5c2cabdb1a4978a7e7164574b3e3124180b000000030f1b27333f495f6c7985929facb8c5c8bbaea295887b6f6255483c2f221509000000000000010c161f2935414c56616c75828f99a4afa79d928a7e70695f544a3f33281e14080000000000000000000005111d2935414c566b7884919eabb7c4d1c4b8ab9f95887b6e61594f4743424045474e545c606d727e8b939eaab6c2d1c4b8ab9e918578665b55595b53504941382d22170b000006121f2b3844505b66788592948d80736c655e56514b4743403f3e3d3d3e3f44464d545c676f7c8995a0acb8c5c5baaea298897d7063564a3d3023170a00000000000000000000000006111b262f3a434d575e696e7a828c92999fa6abb0a79f98928d8884817f7e7e7f8082858a90959fa3abada9a19e9590867e726d635b51483e352b1f160c010000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e0200000000000006131f2c3845515c676f7c87929fa6b0bac3c6bcafa59e91847a6d665c534b433b332c27201e19161413110d080d1113141924303d4a5763707d8a96a3b0bdc9d2c6b9ac9f938679665c5144382c1f12060000000000000000000714212d3a4754606d7a8793a0adbac6cbbeb2a5988b7f7265585758595a5a55606a727f8c949fa9b3beccc0b5aba2979083796d605b51473d33291f1a140c0700000000000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cec9bcafa396897c7063564e4e4e4e4e4e4e4e4f4f504a5053545658575e61666c70798088939aa4afb8c2beb6afa69e938d80736a6053493f3327170d02000000000000000000000000000005080a0b0c0c0f1926333f4c5966727f8c99a5a4978b7e7164584b3e312d3946525e687985929fac9f9286796c605346392d20130f0f0f0a090704000000000000000000000000000000000000000000000000000000000000000000000b17222d45525e6b7885919eabb8c4d1d7cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a54616e7b87939facb9c4cfcabfb4aa9c8f8275685e5246392d20140903101c28343f4a54616e7b87939facb9c4cfd1c8bcb1a79a8e8174675d5145392c20150a00000000000000000000000000000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b8895a1aeb1a5988b7e7265584b3f3225180c0000000000000000000000020c17202b343d45515c676e7b859299a4afb8c1ccd6e0e0dfd8cbbeb1a5988b7e7265584b3f3225180c00020f1c2835424f5b6875828e9ba8b5c1cabdb0a4978a7d7164574a3e3124170b000000000b17222d45525f6c7885929fabb8c5c8bbaea195887b6e6255483b2f22150800000000000000040d19242f3a44505a626f7c87939fabaea49f92857b6e665b50443b3025190c030000000000000000000713202d3946525d687986929facb9c5d0c3b6a99d908376695f53473d373135393d424a505b626c75818e9ba8b4c1cec4b7ab9e9184786b5e4a4d4e46443f382f261b11060000030f1c28333f4a546a7784918f82786c605b534d4540393732323130302d33373c424b55606b7784909daab7c3cabeb4aa9a8d8074675a4d4134271a0e0000000000000000000000000b17222d38414b555e696e7b838f949fa3abb0b0a69f959086807b7774727271727376797e838c9299a3aab3ada79f9892887f736d635a50473d31281e13080000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e02000000000004111d2935414b55606d79839199a3afb8c2cbbfb4aa9d93897d70685d544a41393029201c16110e080707040100010507081724303d4a5763707d8a96a3b0bdc9d2c5b8ac9f9285796c5f4a4034281c10040000000000000000000714212d3a4754606d7a8793a0adbac6cbbeb2a5988b7f726563646566666767676f7c87929fa6b0bbc5c7bbafa49992857b6e675d51443f3836302a251f18120b030000000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cec9bcafa396897c70635a5a5a5a5a5a5a5b5b5b5c5c545c6061636568696e72787d838d939aa4acb6bebab3aca49f948e81776c60584e41382d221705000000000000000000000000000000060c111417181c1c24313e4b5764717e8a97a4a6998c7f7366594c40332a36414c566a7784919daaa398877a6e6154473b2e211b1b1c1c161613100b050000000000000000000000000000000000000000000000000000000000000000061e2b3844515e6b7784919eaab7c4d1d6c9bdb0a3968a7d7063574a3d3024170a00000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505b66737f8c99a4afbbc7d1cbc5b9ac9f92867a6d6154473b31261a0e06121f2b3844505c6673808c99a4afbbc7cbc5c1c0b8ac9f92857a6d6053473c31261b0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aeb1a4988b7e7165584b3e3225180b00000000000000000000000a141e29323d46505a606d79839097a2abb5c0cad3dcd7d3d2d3cbbeb1a5988b7e7265584b3f3225180c00020f1b2835424e5b6875818e9ba8b4c1cabdb0a3978a7d7064574a3d3124170a00000000121f2c3845525f6b7885929eabb8c5c7bbaea194887b6e6155483b2e221508000000000000000008131e28323e47535f6a75818e99a3afada2979083786c60564c41362a1e150b0000000000000000000714212e3a4754616d7a8799a3aebbc7cdc0b4a79a8d817467574d42352b26292c30383f44515a63707c8996a3afbcc9c4b7ab9e9184786b5e5145413937332d261d140a000000000b17222d43505d6a768390857b6e665b5049413b352f2b272524242422272b3039434f596875818e9ba8b4c1d0c2b5a89c8f8275695c4f4236291c0f0000000000000000000000030f1b27333f49535d676e7b8490959fa6aeb5b1a79f948f837b746e69686665646566666d71787f879298a3aeb9b1aaa29a938b7f736c62594f433a2f24190d0500000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e0200000000000613202c3945515d67727f8c95a0abb5c0cac7baaea3988e81746b60564c42392f271e170e0b05020000000000000000000a1724303d4a5763707d8a96a3b0bdc9d2c5b8ab9f9285786c5f52452e23180c000000000000000000000714212d3a4754606d7a8793a0adbac6cbbeb2a5988b7f726f707172727374747579849199a3aeb8c2cbbfb5ab9f93877d70695f5553504a46413b363128231d150c0600000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cec9bcafa396897c70676767676767676767686869696a666d6e6f7275787b7f848a90959fa4acb6b8b3aea9a19a938d82786d655b50463d2f261b110600000000000000000000000000000810171d212324292828303c4956636f7c8996aba79a8e8174675b4e412d2530424f5c6975828f9ca8aa95897c6f6256493c2f27282828292322201c160f0700000000000000000000000000000000000000000000000000000000000004111e2b3744515e6a7784919daab7c4d0d6c9bcafa396897c706356493d3023160a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c7884919eabb5c0ccc7c0bbb9afa3998b7f7265574d42362a1e120713202d3a4653606d7984919eabb5c0ccc0b9b5b3b5aea2988b7e7165584e43372b1d1207000000000000000000000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b8794a1aeb1a4978a7e7164574b3e3124180b0000000000000000000006111c26303a444e58626d74818e95a0a9b3bdc7d2d8d1cbc7c5c7cbbeb1a5988b7e7265584b3f3225180c00020f1b2835424e5b6875818e9ba8b4c1c9bdb0a3968a7d7063574a3d3024170a00000005121f2c3845525f6b7885929eabb8c5c7baaea194877b6e6154483b2e2115080000000000000000010c16202b37434e58626e7b87929fabb3a99f958b7f72685e52463d30271d120700000000000000000714212e3a4754616d7a8799a3aebbc7cbbeb1a5988b7e7265584b3f31251b1d1f262e343f4855626f7b8895a2aebbc8c4b7ab9e9184786b5e5145382d2b27221b140b0200000000061c2935424f5c687582897e71695e544a3f382f29241d1b18181a1e21272c3137404b556773808d9aa6b3c0cdc3b6aa9d9083776a5d5044372a1d1100000000000000000000050f19232b3744505b656d79839096a0a7b0bbb4aa9f958f82796e6a625f5759585858545c60666c727d86929fa5afbcb4aca49f918b7e716b60564c41352921160b00000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e020000000004101c2834404b55606d7a85929ea7b1bdc7d1c5b9ac9f92867b6e61594f443a30271d150c050000000000000000000000000a1724303d4a5763707d8a96a3b0bdc9d2c5b8ab9f9285786c5f5245392c1f07000000000000000000000714212d3a4754606d7a8793a0adbac6ccbfb3a6998c807c7c7d7e7e7f80818181839096a0abb5bfcac7bbaea3998c7f726e696763605c54524c46423b342e271e181007000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cec9bcafa396897d74747474747474747474757575767778797b7c7e8184878c91969da0a7afb6b1acaaa29f97928880786d665c53493f342b1d140a000000000000000000000000000008121a22282d3031353535343b4754616e7b8799a3a99c8f837669544a3f333234414e5a6774818d9aa7a4978a7e7164574b3e343435353535302f2c2721191107000000000000000000000000000000000000000000000000000000000004111e2a3744515d6a7784909daab7c3d0d5c9bcafa296897c6f6356493c30231609000000000000000000000000000000000000000000000000000000000000000000000000000000000005111d2a36414c5663707d8996a1acbdc7c7bdb5afacafab9d908376695f53463a2d2115121e2a36424d5764707d8a96a1adbdc7c0b6aea9a7a9aeaa9d9083766a5f5347392e23180c000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adb0a4978a7d7164574a3e3124170b000000000000000000060f17232e38424c56606a717e8b939da7b1bbc5d0d2cfc6bfbab9babfbeb1a5988b7e7265584b3f3225180c00020e1b2835414e5b6874818e9ba7b4c1c9bcb0a396897d7063564a3d3023170a00000005121f2b3845525e6b7885919eabb8c4c7baada194877a6e6154473b2e211408000000000000000000040d1b26313c47535f6974818e99a3afb1a79f92857a6e61594f42392e23180c00000000000000000613202d394653606c7986929facb9c5cabdb1a4978a7e7164574b3e31241810141c232f3c4855626f7b8895a2aebbc8c4b7ab9e9184786b5e5145382b1f1b17110a0200000000000915222f3c4855626f7c7d716c61574d42382d261d18171c1f20262a2d32383c4347515d6775818e9ba8b4c1cec4b7ab9e9184786b5e5145382b1e12000000000000000000000b16212b37424d57606c77828f95a0a8b1b9baaea2989083796d675f57534d4c4b4b4c4a51545b606b717e8a939daab4beb6afa39f92877d70685d52453d33271c1005000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e020000000006131f2c3845515c67737f8c97a1adb9c3cfc8bcb1a79a8d8074695e53473d32281e150b03000000000000000000000000000a1724303d4a5763707d8a96a3b0bdc9d2c5b8ab9f9285786c5f5245392c1f12060000000000000000000714212d3a4754606d7a8793a0adbac6cdc1b4a89c928c88898a8a8b8c8d8d8e8e90959fa8b2bdc6d1c5b9ac9f9286807d7b77736f6d66615e56534d454039302a221911080000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecec2b5a89b8f82818181818181818181818182828383858687898b8e9196999ea0a8acacaba8a7a09d98928c857d736d665c544b41382d22190b020000000000000000000000000006101a242c34393d3e42424241414653606c7986929faa9e918477665b50443f3f3f3f4c5966727f8c99a5a5998c7f7266594c404141414242423d3b38332b23190f050000000000000000000000000000000000000000000000000000000004111d2a3744505d6a7783909daab6c3d0d5c8bcafa295897c6f6256493c2f23160900000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3946525e6875828e9ba8b2bdcbc0b5aba39fa3ab9f95887b6e6155483c32271b14202d3a46525e6975828f9ca9b2bdc4bbaea49d9a9da4ab9f95887c6f62554b4034281c10040000000000000000000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a8794a0adb0a3978a7d7064574a3d3124170a0000000000000000040d182128343f4a545e686f7c87929fa5afb9c3cdd2c8c0bcb4aeacaeb4bcb1a5988b7e7265584b3f3225180c00010e1b2834414e5b6774818e9aa7b4c1c9bcb0a396897d7063564a3d3023170a00000005121e2b3845515e6b7884919eabb7c4c7baada194877a6e6154473b2e211408000000000000000000000a15202b37424d57616e7b87929facb9ada2978e81756b60544b4034281c11060000000000000005121f2b3744505b657884919eabb7c4cabdb0a3978a7d7064574a3d312417070a15222f3c4855626f7b8895a2aebbc8c4b7ab9e9184786b5e5145382b1e0f0b06000000000000000815212e3b47535f6a6f706b615a50453b2f261c1d2023282b2d31363a3d44484e535b606d7985929eabb8c5d0c3b6aa9d9083776a5d5044372a1d1100000000000000000004101c27333a46535f69727f8b949ea7b1bac0b5ab9f92867b6e675d554e47423f3f3e3f40444a5059616c74818e98a3aebac0bbaea39991847a6d60594f44382c22170b000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e02000000000713202d3a4653606d7985929ea9b3beccd1c5b8aca095887c6f62574d42352b20160c0300000000000000000000000000000a1724303d4a5763707d8a96a3b0bdc9d2c5b8ab9f9285786c5f5245392c1f12060000000000000000000714212d3a4754606d7a8793a0adbac6d0c4b9aea49c99959696979899999a9a9b9d9fa7b1babec0c2c5bbaea399928d8a8784807c79736e68615e57514b423c342b231a110800000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecfc3b6aa9e938f8d8d8d8d8d8d8d8d8d8e8e8e8f8f9091939996989b9ea1a8aaacaca49f9e9c9995908c857f79706c605c544b42392f261b100700000000000000000000000000000c17222c363e45494b4f4f4e4e4e4d505b667784919eaa9f9286796c60534c4c4c4c4c4c5764717d8a97a4a79a8d8174675a4e4d4d4e4e4e4f4f4948443d352b21160b0000000000000000000000000000000000000000000000000000000004101d2a3743505d6a7683909da9b6c3d0d5c8bbafa295887c6f6255493c2f22160900000000000000000000000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a86929facb9c4c7bbafa3999299a3a7998c7f7366584e43372b1c1c28343f4a54616e7b87939facb9c4beb3a99d928d929da7a79a8d8074675c5145382c1f14090000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0adb0a3968a7d7063574a3d3024170a00000000000000010c161f2a333c44505c666d7a849199a3aeb7c1cbd4cac0b6aeaaa39fa3aab4b1a5988b7e7265584b3f3225180c00010e1b2834414e5b6774818e9aa7b4c1c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c7baada194877a6e6154473b2e21140800000000000000000000030e1a26313c46535f6975828f9ca9b2b3a99e93897d70665c5145382e23170b00000000000000030f1b27333f49536a7683909da9b6c3cfbeb1a4978b7e7164584b3e2f24180e0915222f3c4855626f7b8895a2aebbc8c4b7ab9e9184786b5e5145382b1e1200000000000000000006121f2b37434e585f6263605950483e33291f24292c2e34383a3c4246484f54585f626d73808d97a1adb9c6cfc2b5a89c8f8275695c4f4236291c0f0000000000000000000713202c38444f59616e7b86929fa6b0b9c3bbafa3998d8073695f554b433c373132312e34383f44505a616e7a86929facb6c0bfb5aba1968e81746b6054483e33281c10040000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e0200000005121e2a36424d5764717e8a97a1adbbc5cfd0c4b7aa9d9184776a5f53453b31231a0e040000000000000000000000000000000a1724303d4a5763707d8a96a3b0bdc9d2c5b8ab9f9285786c5f5245392c1f12060000000000000000000714212d3a4754606d7a8793a0adbac6d5cabfb6aea8a6a2a2a3a4a5a5a6a7a7a8a9acaeb4afb1b3b5b8bab5aba39f9a9796918d8985807a756e69605c544e463d352c231a1107000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1ced2c6bbb0a69e9b9a9a9a9a9a9a9a9a9a9a9b9b9c9c9d9e9fa4aba5a8abacb2b1a79f9a93918f8c88847f7a736d676159504a423930271d140a000000000000000000000000000005111d28343e485055575c5b5b5b5a5a5a546976838f9ca9a399877a6e615858585858585858626f7c8995aaa89c8f8275695c5a5a5a5a5b5b5b5c56544f473d33271c100400000000000000000000000000000000000000000000000000000003101d2a3643505d697683909ca9b6c3cfd5c8bbaea295887b6f6255483c2f2215090000000000000000000000000000000000000000000000000000000000000000000000000000000007131f2c38434f5965727f8c99a3aebbc7bfb5ab9f92869298a39d9184776a605447382e231f2b3844505c6673808c99a4afbbc6b9ada1978d808d95a0ab9e9285796d6053463b31261a0e0000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0adb0a396897d7063564a3d3023170a0000000000000007121d28313c45505a606d78828f96a1abb4bfc9d2ccc2b8aea49d989298a3aeb1a5988b7e7265584b3f3225180c00010e1b2834414e5b6774818e9aa7b4c1c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c7baada194877a6e6154473b2e211408000000000000000000000009151f2a36424d5764707d8a96a1adb9afa59d9184796d60544a3f34281c1003000000000000000b17222d414e5b6874818e9ba9b3becabfb2a5988c7f7265554b403529201a1415222f3c4855626f7b8895a2aebbc8c4b7ab9e9184786b5e5145382b1e12050000000000000000030f1b26323c464e535556544f473e362c282c2f35393a3f4446494d53555960636a6e757f8c929ca9b3becacabfb4aa9a8d8174675a4e4134271b0e0000000000000000000916222f3c4854606b76828f98a2aeb8c1c5b9ac9f92867b6e61574d4339312b26252523282d333e46525e6874818e9aa4afbbc6bdb2a89d93897d70635a5044392d20150a0000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e020000000714212d3a46535e697683909ca9b3becdd3c7bcb1a7998c7f7266584e4333291f1108000000000000000000000000000000000a1724303d4a5763707d8a96a3b0bdc9d2c5b8ab9f9285786c5f5245392c1f12060000000000000000000714212d3a4754606d7a8793a0adbac6d6cbc0b6aea9a7a2a1aaa29f9e9d9d9d9e9e9fa2aaa2a4a6a8abadb3b5aeaca6a8a09e9a97918c86817b726d665f584f473e352c23190e050000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1ced5cabfb6aea8a6a4a4a5a5a5a5a6a7a7a7a8a8a8a9aaabacafb5b1b4b7b9b8ab9f95908784827f7b77736d68605d554f443f3830271e150b0200000000000000000000000000000814212d3945505a616468686867676767666774818e9aa7ab96897c6f656565656565656565656e7a8798a3aa9d9184776a6666676767686868686360594f44382c20130700000000000000000000000000000000000000000000000000000003101d2a3643505d697683909ca9b6c3cfd4c8bbaea195887b6e6255483b2f221508000000000000000000000000000000000000000000000000000000000000000000000000000000000915222f3b4854606b7784919dabb5bfc7bbaea3998c8086929fa096887c6f62544a3f3428202d3a4653606d7984919eabb5c0c0b5ab9e91857983909daaa1978a7e7164574d42362a1c110600000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0b6afa396897c706356493d3023160a000000000000071118242f39434d57616c73808d949fa8b2bdc6d1cec3bab0a69d928d86929facb1a5988b7e7265584b3f3225180c00010e1b2834414e5b6774818e9aa7b4c1c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c7baada194877a6e6154473b2e2114080000000000000000000000030e1a26313b4653606d7984919eacb6b8aca0968b7e72665c5044382b1f160b00000000000000061724303d4a5763707d8a97a1adb9c6c2b5a89b8f8275675d51453b322a25201d222f3c4855626f7b8895a2aebbc8c4b7ab9e9184786b5e5145382b1e12050000000000000000000a15202a343c4347484a48443d35292e34383a4145474a505356575f61656b6f757b828c919ba4aebbc5cfc6baaea2988a7e7164574b3e3124180b00000000000000000713202c38444f5963707d89949faab4bfc9bdb2a89b8e8175695e52453b30271f1a1818181c222a36414c56626e7b87939facb9c6c4baafa59d9083766c6155493c32271b0f0100000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e020000000815212e3b4854616e7b87949fabbbc5cfd1c4b7ab9f95887b6e6155483c3122170d00000000000000000000000000000000000a1724303d4a5763707d8a96a3b0bdc9d2c5b8ab9f9285786c5f5245392c1f12000000000000000000000714212d3a4754606d7a8793a0adbac6d1c5b9aea49d9a959494989291919090919192989395979a9c9fa2a9abadb3b3b2acaaa9a19e99928e867f796f6a60594f473e352b20170d0200000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1ced0c4b9aea49c99979898989899999a9b9c9d9d9fa2aaa3a5a8abadb3b8bab6aa9d90837c7875736e6a66615e56514b433e342e261e150c030000000000000000000000000000000a1723303d4955616c71757575747474737373737f8c99a6a4978a7e7272727272727272727272727886929fac9f92857972737373747474757575706b6054483b2f22160900000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9b6c2cfd4c7bbaea194887b6e6155483b2e22150800000000000000000000000000000000000000000000000000000000000000000000000000000004111d2935414c56636f7c8995a0acbdc6c5b9ac9f92867a818e9ba89a8d8074665c5044382b2a36424d5763707d8a96a1adbdc7bbafa3998c80737f8b98a3a99c8f8276695f5346382d22170b00000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d79869aa4afafa296897c6f6356493c302316090000000000050e19232935404b555f69707e88939fa6b0bac4cfd0c5bcb2a89f948d8083909daab1a5988b7e7265584b3f3225180c00010e1b2834414e5b6774818e9aa7b4c1c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c7baada194877a6e6154473b2e21140800000000000000000000000009141f2c3844505c6673808d9aa4afbbb2a89e9184786d6053463d33271c10030000000000000713202d3a4653606d7985929eaab4bfc5b8ab9f9285796d60574d443d36312c29242f3c4855626f7b8895a2aebbc8c4b7ab9e9184786b5e5145382b1e1205000000000000000000040e18222a32373b3c3d3c38333035394045464c5254545c606366696e72767c82878f939ba3adb6c0cdcabfb4aa9f92857a6d6053473a2d20140700000000000000000916222f3c4854606b7683909da6b0bcc6c5b9ada196887c6f62574d42332a1e150d09070c111925303b47535f6975828f9ca8b5c2ccc1b8ab9f958a7d7064584e43372b1d120700000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e02000004101d2935404b5565727f8b98a6b0bbcdd7d0c3b6a99d908376695f53463a2d21140500000000000000000000000000000000000a1724303d4a5763707d8a96a3b0bdc9d2c5b8ab9f9285786c5f52452d22170b000000000000000000000714212d3a4754606d7a8793a0adbac6cec1b5a99d928d8888878685858483848485858687898b8d8f92979a9ea1a9adb3b8b7b3adaba39f98928c837c6f6b61594f473d32291f140800000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecdc1b4a89c928c8b8b8b8b8c8c8d8d8e8f909192989597989b9ea1a9abaeb3ab9f959089837f79716c665e574f45413a3128231c140c03000000000000000000000000000000000b1824313e4b5764717e82828181818080807f7f818e9ba8a89b8f817f7f7f7f7f7f7f7f7f7f7f7f7f85929faba2988c7f7f7f80808081818182827d706356493d3023160a00000000000000000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cfd4c7baaea194877b6e6154483b2e2115080000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3945525d6874818e9ba8b1bdc9bdb2a99b8f82757d8a98a29e9185796d6053463a2f2d3a46525e6975828f9ba8b2bdc5b9ac9f92877b6e7a86929fac9f93877b6e61544a3f33281c0f030000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505c667986939facafa295897c6f6256493c2f23160900000000030c17202b353d45515d676e7b86929aa4afb8c2ccd2c7bdb3aaa0968f827983909daab1a5988b7e7265584b3f3225180c00010e1b2834414e5b6774818e9aa7b4c1c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c7baada194877a6e6154473b2e21140800000000000000000000000003101c28343f4a54616e7b87939facb9b9aca0968a7e7164594f44382c1f140900000000000006121f2c3844515c6674818d98a2aebac2baada2978c7f72695f564e46423b39352f2f3c4855626f7b8895a2aebbc8c4b7ab9e9184786b5e5145382b1e12050000000000000000000006101820262b2e2f302f2e343a41464b5153565d6064666d6f73777b7f83898f939a9ea5adb5bfc8ccc1baaea2988e8175675d5145392c2013060000000000000005111e2a36414d5663707d89959fabb8c2cec4b8ab9e9184786a5f53453b3021180c0300000008141e2b37424d5765727e8b98a9b3bec9c8bcb1a79d9083776a605447392f23180c00000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e02000006131f2c3945515d6776828f9ca9b5c2cdd9ccbfb3a6998c807366574d42362a1e1205000000000005080a0b0c0c0c0b0b0b0b0a0a1724303d4a5763707d8a96a3b0bdc9d2c5b8ac9f9285796c5f493f33271b0f030000000000000000000714212d3a4754606d7a8793a0adbac6cdc0b3a79a8d807c7b7a797978777777777879797a7c7e808285898e92979ea1a9afb5bdb9b5aeaaa29f9591857d706c61594f443b3025190e04000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1ceccbfb3a6998c807e7e7e7f7f7f8081818283848587888a8b8e9197999fa2aaafa79f9d95908b847e786e69615950483e362c21180b0200000000000000000000000000000000010d1a2734404d5a6773808d8e8e8e8d8d8d8c8c8c8e939eaaaa9e938f8b8b8b8b8b8b8b8b8b8b8b8b8b9297a2adaa9c918c8c8c8d8d8d8d8e8e8e8f8376695c504336291d10030000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfd4c7baada194877a6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a86929facb8c3c5b9ada1968a7d707985929fa197897d7063554b4035333f4953616e7b86929facb9c4bdb2a89b8f82756975818e9ba8a49a8c8073665b5044382b1f13080000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a5f6c7986929facafa295887c6f6255493c2f221609000000000b151e29323d47515b606d79839098a2acb6c0cad7ccc0b5aba29891847a7783909daab1a5988b7e7265584b3f3225180c00010e1b2834414e5b6774818e9aa7b4c1c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c7baada194877a6e6154473b2e211408000000000000000000000000000c17232e3846535f697783909daab6bdb2a89d9083776b6055483b31261a0e02000000000004101c2834404a54616e7b86929fa6b0b9beb3a99f92857b6e686058534d4745403e3c3c4855626f7b8895a2aebbc8c4b7ab9e9184786b5e5145382b1e12050000000000000000000000060e151b1f21222a303940454c52545c6064686d7175797c8084888b90959c9fa4acafb7bfc7c7c0bbafa59f92867b6e61554b4035291d1004000000000000000714202d3946525e6875828e9ba7b1bccacec1b4a89b8e817568584e4333291f0f0600000000020e1a26313c4855626e7b8897a1adb9c6cdc2b8ab9f95887c6f62554b4034291c1004000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e0200000714202d3a4753606d7a86929facb9c5d2d6cabfb4aa978a7d7064574a3d31261a0e02000000050c111417171919181818181717171724303d4a5763707d8a96a3b0bdc9d2c5b9ac9f928679655b5044372b1f12050000000000000000000714212d3a4754606d7a8793a0adbac6cbbeb2a5988b7f726e6d6d666b6a6a6a6b6b666c6d6f717375797d81858b92979fa3abb4bcbfbbb4aea7a09792867e706b60564d41362a21160a000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cec9bcafa396897c717172727272737475757677797a7c7d7f8185888c92989ea5afaba7a09d96918b827b706c615a50483e332a1d140a00000000000000000000000000000000000b1724313e4a5764717d8a979b9a9a9a9a9999999b9ea5afafa59e9b989898989898989898989898989fa2a9b3ada39c999999999a9a9a9b9b9b8f8376695c504336291d08000000000000000000000000000000000000000000000000000000020f1c2935424f5c6875828f9ba8b5c2ced4c7baada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000000000000000006131f2b37434e5865727e8b98a2aebac6c4b8ab9e9184796d75818e9ba99b8e8174675d5145393744505b65737f8c99a3afbbc5b9aca096897d70636f7c8996a0ac9e9184786c6053463a3024190d01000000000000000000000000000000000000000000000000000000000000000000000000000b17232e46535f6c7986929facafa295887c6f6255493c2f22160900000007121c27303b444f59626d75818e95a0aab3bec7d2cbc2bbafa49992867c6e7783909daab1a5988b7e7265584b3f3225180c00010e1b2834414e5b6774818e9aa7b4c1c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c7baada194877a6e6154473b2e2114080000000000000000000000000006111c2a36424d576673808d99a9b3beb8aca095897d7063574d42362a1e12050000000000000c18232e3946535f69727f8b949fa7b0bbbaada29791837a6f6a615e5753514b4a49474855626f7b8895a2aebbc8c4b7ab9e9184786b5e5145382b1e1205000000000000000000000000040a121b242c343c434b51565d61666d71767a7e8185898d9095989d9fa7acafb6bec1cac3beb6afa59e938b7f72695f5343392f24180d01000000000000000814212e3b4754616e7b86929facb9c2cdcabeb3a9988b7e7265584b3f3225170d0000000000000915212e3a47535f6a7885929eabb8c5d1c8bcb1a79a8e8174675c5145382c1f1306000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e020000091623303c4956636f7c8998a3aebac7d3d3c6baaea298887b6e6155483b2e2215090000000810171d2123242625252525242424242324303d4a5763707d8a96a3b0bdc9d3c7bbafa39986796c605346392d2013060000000000000000000714212d3a4754606d7a8793a0adbac6cbbeb2a5988b7f726561605c545e5d5d5e5e5b6060626467666d7074797f858d9299a2aab3bbc5bfbab1a9a29892877d70685e52463d32271b0f020000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cec9bcafa396897c706565656566666768696a6a686d6f707275787b7f858e939fa4acb1aca8a19e9490857e716c615a50453b2f261b1106000000000000000000000000000000000814212e3b4754616e7b8796a1a7a7a7a6a6a6a5a8aaafb7b8afaaa8a5a5a5a5a5a5a5a5a5a5a5a5a5abadb3bbb5ada8a6a5a6a6a6a7a7a7a89c8f8376695c50433025190e020000000000000000000000000000000000000000000000000000020f1c2835424f5b6875828e9ba8b5c1ced3c7baada094877a6d6154473a2e21140700000000000000000000000000000000000000000000000000000000000000000000000000000815212e3b47535f6a7783909daab4bfc7bbb0a6998d807366707d8a97a29f9285796d6053473a394653606c7884919eabb5c0bfb4aa9e9184786c606b7784919daca196897d7063564c4135291d11040000000000000000000000000000000000000000000000000000000000000000000000000013202c3946535f6c7986929facafa295887c6f6255493c2f2216090000061018232e39424d56606b727f8b939ea7b1bcc5d0cdc2b9afa59f93877d706a7783909daab1a5988b7e7265584b3f3225180c00010e1b2834414e5b6774818e9aa7b4c1c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c7baada194877a6e6154473b2e21140800000000000000000000000000000e1a26313c4956636f7c8997a2adbabcb1a79c8f8276695f53463a2d21140900000000000007121c2a36424d57606c77828f959ea6afb5b3a9a09591847c746e6964605d555755545255626f7b8895a2aebbc8c4b7ab9e9184786b5e5145382b1e120500000000000000000000000008111b242d363e464e555c60686d73797e82868a8e9297999da0a7a9abb1b9bbc0c7c5bebab2aca49f938e81776c60574d4231281d12070000000000000005111d2a36414c5665727f8c99a3afbbc7d3c6baada297887b6e6255483b2f22150800000000000006121f2b37434e586875828e9ba8b5c1cecdc3b8ac9f9285796d6053473a2d201409000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e0200000c1925323f4c5865727f8b98aab4bfcbd7d2c5b8ac9f9285796c605346392d201306000008121a22282d30313332323231313131303030303d4a5763707d8a96a3b0bdc9d7cbc0b5a09386796d6053463a2d2013070000000000000000000714212d3a4754606d7a8793a0adbac6cbbeb2a5988b7f72655853514a515051514a5053545658545c6063666d727a80879298a1a9b3becac3bbb3aaa39992857a6e61594f43382c1f14090000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cec9bcafa396897c7063585859595a5a5b5c5d565e61626465686a6e737a818c939aa4afb8b2ada69f9792877e716c61574d41382d22170b000000000000000000000000000000000714202d3a46525e697884919eabb4b3b3b3b2b2b5b6bac1c1bbb6b5b2b2b2b2b2b2b2b2b2b2b2b2b2b8babec5bfb8b4b2b2b2b3b3b3b4b4aa9d9184776a564d41362a1e11050000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6baada093877a6d6054473a2d2114070000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b55626f7c8895a0abbcc6c4b7ab9f94887b6e616d7985929fa2988a7e7164564c41414c5663707d8996a1acbdc7baaea3988c7f72655b66727f8c9aa4a89b8e8175685d5245392c20150a0000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c6f6255493c2f22160900040d18222834404a545e686f7d87929fa5afb9c3cecec4bbb1a79e938c7f726b6a7783909daab1a5988b7e7265584b3f3225180c00010e1b2834414e5b6774818e9aa7b4c1c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c7baada194877a6e6154473b2e21140800000000000000000000000000000913202d3a4653606d7985929fabb8c3b7ab9f94887b6e6155483b31251a0e020000000000000e1a26313b44505b656d7a838f949fa3abb0b1a7a0969187817b75716d67666462605d56626f7b8895a2aebbc8c4b7ab9e9184786b5e5145382b1e12050000000000000000000000050e1a232d363e4850585f676d727a80858a8f92999b9fa2a9aaacb1b6b8bcc2c8c5beb9b3aea8a09a938d81786d655b50453c311f160c01000000000000000713202d3946525e687683909cabb5c0cbd2c5b8ab9f9285786a5f53473a2e211408000000000000020f1a26313f4c5965727f8c98a5b2bfcbd3c6baaea2988a7d7063574a3d31261a0e020000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e0200020f1b2835424e5b6875818e9ba8b4c1d1dcd0c3b6a99d908376655b5044372b1f120500030d1a242c33393d3e3f3f3f3e3e3e3e3d3d3d3d3c3d4a5763707d8a96a3b0bdc9dcd1b9ada093867a6d6053473a2d2014070000000000000000000714212d3a4754606d7a8793a0adbac6cbbeb2a5988b7f7265584c4440444444443f444647494b4a5153545c60676d737d869297a1adb9c0cdc5bcb4aba1978e81756b6054483b30251a0e0200000000000000000000020e1b2835414e5b6874818e9ba7b4c1cec9bcafa396897c7063564c4c4c4d4e4e4f504c5254555758585f62686e757f88939fa5afbcb9b0a9a29992877e71695f53493f33271b0f0300000000000000000000000000000005111e2a36424d576976838f9ca9b6c0bfbfbfbebebfc0c4cac6c3c2bebebebebebebebebebebebebebec2c3c7cac4c0bfbfbebebfbfbfb8ab9e928578685e5246392d2014070000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3945515d6774818d9aa7b1bccabeb3aa9c908376695f6674818e9aa99c8f8275685e524646525e6875828e9ba8b2bdc5b9ac9f92867a6d6153616e7b87939fac9f92867a6d6054473c31261b0f0000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c6f6255493c2f221609020b161f2a343c44515c666e7a859199a3afb7c1cbd0c6bcb2a99f958e81756d636a7783909daab1a5988b7e7265584b3f3225180c00010e1b2834414e5b6774818e9aa7b4c1c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c7baada194877a6e6154473b2e211408000000000000000000000000000006121f2c3844505c6675828e9ba8b5c1bbb0a6988c7f7265574d42362a1e120500000000000009141f27333f49535d686d79828d92999fa6acafa8a199938e87827e7a7673716f6d686a686f7b8895a2aebbc8c4b7ab9e9184786b5e5145382b1e120500000000000000000000020c16202c353e48505a616a6f797f858d92979c9fa3ababadb3b7b8bcc3c4c5c2bbb7b3adaaa29f96918880776d665c53493f332a1f0d0400000000000000000714212e3a4754616d7a86929facb9c5d1d0c3b6aa9d9083776a574e42372b1e120600000000000000091724313d4a5764707d8a97a3b0bdcfd6cabfb4aa9a8e817467574d42362a1e12050000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e020004111d2935414c566a7784909daab7c3d0dacdc0b4a79a8d81746753493f33271b0f03010b151f2c363e45494a4c4c4b4b4b4b4a4a4a4a4949494a5763707d8a96a3b0bdc9d3c6baada093877a6d6054473a2d2114070000000000000000000714212d3a4754606d7a8793a0adbac6cbbeb2a5988b7f7265584c3f342e37372d3338393a3c3e4044464a51555d606b707c85929ea5afbbc5cec6bdb3a99e93897c6f63574d42362a1e120500000000000000000000020e1b2835414e5b6874818e9ba7b4c1cec9bcafa396897c706356493f3f4041424243414647494a4c4e53565e616d737f8c939eaab4bfbbb3aba39992867b6e655b5044372b1f150a000000000000000000000000000000020e1a2530424e5b6875818e9ba8b3b3b3b2b2b2b1b2b4b8bfc3bdb9b7b1b1b1b1b1b1b1b1b1b1b1b1b1b5b7bbc2c0bab6b4b1b2b2b2b2b3ada197877a6e6154473b2e2114080000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7985929fabb8c3c6baaea2988b7e71645763707d8997a19f92867a6d6154474754616d7a86929facb9c4bcb1a79b8e8174685e535e6976838f9caaa3988b7e7265584e43372b1c120700000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c6f6255493c2f2216090a141d28313c46505a606d78829097a1abb5c0c9d6cbbfb4aaa1969083796d605b6a7783909daab1a5988b7e7265584b3f3225180c00010e1b2834414e5b6774818e9aa7b4c1c9bcafa396897c706356493d3023160a00000005121f2b3845525e6b7885919eabb8c4c7baada194877a6e6154473b2e211408000000000000000000000000000003101c28343f4a5465727e8b98acb6c0c2b6a99d908376695e53463a2d211408000000000000030b17222d38414c565d676d7880878f949c9fa4acaba49f99928f8a8683807d7c7a787675747c8895a2aebbc8c4b7ab9e9184786b5e5145382b1e12050000000000000000000008131e28323e47505a626c717c838c92979ea1a9acafb5b8babec3c5c4c3bdb8b7b0aba9a19e98928c847d746c655c544a41382d21180e0000000000000000000b1824313e4b5764717e8a99a3afbbc7d4cec2b5a89b8f8275685c4f4231261a0e02000000000000000915222f3c4855626f7b8895a9b3becad6d0c4b8ab9e918578695f53463a2d2114070000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e02000713202c3945525d687885929fabb8c5d2d8cbbfb2a5988c7f7265594c3f2d22170b0007121d27313e4850555759585858585757575756565656555763707d8a96a3b0bdc9d3c7baada094877a6d6154473a2e2114070000000000000000000714212d3a4754606d7a8793a0adbac6cbbeb2a5988b7f7265584c3f32232a2a22282b2d2d2f2e34383a40444c5159616a707d89939da9b3bec9cfc5bbafa59b8f8275695e52463a2d20140700000000000000000000020e1b2835414e5b6874818e9ba7b4c1cec9bcafa396897c706356493d33333435363035393a3c3d3f43474c525b636d75828f98a2aebac5bdb5aba2988f82776c6053463c31261b0f03000000000000000000000000000000091a2734414d5a6774808d9aa7a6a6a6a6a5a5a5a5a8adb5bab2acaaa4a4a4a4a4a4a4a4a4a4a4a4a4a9aab0b8b7afa9a7a4a5a5a5a6a6a6a9978a7d7164574a3e3124170b0000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000000000006131f2b37434e5864717e8b97a2adbac6c5b8ab9f9285796d6053606d7985929ea3998b7f7265574d4f5965727f8c99a3aebac4b8aca095897c6f62564d5765717e8b98a3aa9d9083776a5f5347392e23180c00000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c6f6255493c2f221606111b262f3a434e58616c74808d949fa9b3bdc7d1cac1baaea39891847b6e675c5d6a7783909daab1a5988b7e7265584b3f3225180c00010e1b2834414e5b6774818e9aa7b4c1c9bcafa396897c706356493d3023160a00000005121f2c3845525f6b7885929eabb8c5cbbfb4aa94877a6d6154473a2e2114070000000000000000000000000000000c17232e3c4956636f7c899aa4afbbc4b8ab9f95877b6e6154483b2f24190d0100000000000006111b262f3a444c555d666d737c828a8f939a9ea1a8aba39f9c9992908d8a888785838280808d9aa6b3c0cdc4b7ab9e9184786b5e5145382b1e1205000000000000000000010d1925303a44505a626c717e8691959fa2a9adb3b9bbc0c5c6c5c2bcb8b6b2acaaa69f9c97928c858079706b605b534a42382f261b0f06000000000000000004111d2935414c556774818e9aabb5c0cbd7cdc0b3a69a8d8073675a4d4034271a0900000000000000000714212d3a4754606d7a8797a2adbac6d3d2c6b9ada197887b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e02000714212d3a4754606d7a8798a2aebac6d3d7cbbeb1a4988b7e7165584b3e32251806000c18242f3943505a616466656565646464646363636362626263707d8a96a3b0bdc9d4c7baaea194877b6e6154483b2e2115080000000000000000000714212d3a4754606d7a8793a0adbac6cbbeb2a5988b7f7265584c3f32251d1e171c1f20212323282c2e343a41454f58606b74818e97a1adb9c6d2cdc1b9ac9f93877b6e6154483b2e21150800000000000000000000020e1b2835414e5b6874818e9ba7b4c1cec9bcafa396897c706356493d302727282925292d2e2f3131373b4146515b616e7b86929facb8c4c7bdb4aa9f948b7e7165584e43372b1f12060000000000000000000000000000000d1a2733404d5a6673808d999a9a999999989898999ca3adb2a8a09e979797979797979797979797979c9ea6b0afa59d9b9898989999999a9a9a8d8073675a4d4034271a0d0000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000815222e3b4754606a7683909da9b3bec8bcb1a79a8d8174675d515c6674808d9aa89d908376695f5354606b7784919dabb4bfbeb3aa9d9083776a60544754606d7a86929fac9f95887c6f62544a4034281c1004000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c6f6255493c2f22160f17222d38414c565f6a717e8a929da6b0bbc4cfccc1b8aea49f92867c6f695e555d6a7783909daab1a5988b7e7265584b3f3225180c00010e1b2834414e5b6774818e9aa7b4c1c9bcafa396897c706356493d3023160a00000004111d2935414c556c7885929fabb8c5c7baaea39886796d6053463a2d2013070000000000000000000000000000000614212d3a4754606d7a86939facb9c6bcb1a7988c7f7265554c4135291d1104000000000000000a141d28323a434b545c606a6f767d82878d9196989b9ea1a9a39f9d9997959792908e8d8d929da9b5c1d1c4b7ab9e9184786b5e5145382b1e120500000000000000000005111d2a36414c56616c717e889298a0a7adb3b9bec5c7c5bfbab8b5b1abaaa8a09d9994908b857f7a736d6760595049413830261d140a0000000000000000000613202c3945515d677784909daab7c3d1dccbbeb2a5988b7f7265584c3f3225190c00000000000000000613202c3945515d677885929fabb8c5d2d5c9beb2a9978a7e7164574b3e312418080000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e02000915222f3c4855626f7b8895aab4becad6d7cabdb0a4978a7d7164574a3e3124170b04101d2935404b55616c7172727271717171707070706f6f6f6f6e707d8a96a3b0bdc9d4c7bbaea194887b6e6155483b2e2215080000000000000000000714212d3a4754606d7a8793a0adbac6cbbeb2a5988b7f7265584c3f322519060b0f12131416181c1f23282f353e464f59606d7a85929eabb8c4cfd4c7bbafa4998b7e7265584b3f2f24190d01000000000000000000020e1b2835414e5b6874818e9ba7b4c1cec9bcafa396897c706356493d30231b1b1c191d20212224262b30364046525e6974818e9aa9b3bec9c6bcb0a69d9083776a5f53473a2e2115080000000000000000000000000000000c1926333f4c5966727f8c8e8d8d8d8c8c8c8b8b8c919ca8aca096918b8b8b8b8b8b8b8b8b8b8b8b8b8f949eaaa99d938e8b8b8c8c8c8d8d8d8d8e8376695d5043362a1d100000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000004111d2935414c56626f7c88959fabbcc5c5b8aca095897c6f62554b54636f7c8996a19f95887b6e615556636f7c8996a0acbdc6baaea2988b7e7165584e45525d6875828e9ba9a79a8d8073665c5144382c1f1408000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c6f6255493c2f2216172127333f49535d686f7c86929fa4aeb8c2cdcdc3b9b0a69c928a7e716a60564d5d6a7783909daab1a5988b7e7265584b3f3225180c00010e1b2834414e5b6774818e9aa7b4c1c9bcb0a396897d7063564a3d302317070000000613202c3945515d677986929facb9c5c5b8ac9f928579665c5144382c1f12060000000000000000000000000000000613202c3945515d677784919eaab7c4c2b6a99c908376675d5145392c20130600000000000000020b1620283139424a50585f626c70767b8084888b8f929796989b9c9e9fa2a19e9d9b9a9a9da4aeb9c5d1c4b7ab9e9184786b5e5145382b1e12050000000000000000000713202d3946525e68707e87929aa2aab1babec5c6bfbab9b4aeaca8a79f9d9996918c88837e79736d68605d554f443f382f261e150b020000000000000000000714212d3a4754606d7a86939facb9c6d2d6cabdb0a3978a7d7064574a3d3124170a000000000000000004111d2935414c556a7783909daab6c3d0dacfc0b3a79a8d8074675a4d412f24190d0100000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e02000a1723303d4a5663707d8996a3b0bcd0dbd6c9bdb0a3968a7d7063574a3d3024170a06131f2c3945515d67717e7f7f7e7e7e7e7d7d7d7d7c7c7c7c7b7b7b7e8b97a4b1becad4c8bbaea195887b6e6255483b2f2215080000000000000000000714212d3a4754606d7a8793a0adbac6cbbeb2a5988b7f7265584c3f3225190c0003060607070c1012181e2429343d45525d6874808d9aa8b2bdc9d5ccc0b5ab9c8f827569564c4135291d1104000000000000000000020e1b2835414e5b6874818e9ba7b4c1cec9bcafa396897c706356493d3023160f080d11131416171a1e252a36424d5763707d8997a1adb9c6cec2b8ab9f95887b6f6255483c2f2215090000000000000000000000000000000815222e3b4855616e7b8181818080807f7f7f7e7f8c99aaaa9e91847e7e7e7e7e7e7e7e7e7e7e7e7e828f9ca9a79b8e817e7f7f7f7f80808081817f7266594c3f3326190c0000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000000000713202c3945525d6874818e9aa7b1bccbbfb4ab9d9083776a60544653606c7884919ea7998c7f7366585d6874818e9ba8b2bdc5b8ab9f9285796d605347414c5664707d8a97a2ab9e9285796d6053463b3025190e000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c6f6255493c2f22151e29333b44505b656d7a849198a2aeb6c0cbcfc5bbb1a79e948d80736c61584e505d6a7783909daab1a5988b7e7265584b3f3225180c00020e1b2835414e5b6874818e9ba7b4c1cabdb1a4978a7e7164574b3e2f24180d0100000714212d3a4754606d7a8798a3aebac7c5b8ab9e9285786b544a4034281c100400000000000000000000000000000004111d2935414b556875828e9ba8b5c1c6b9ac9f93867a6d6054473a2d2114070000000000000000040e161f2730383f444e535a6164696e73787b7e828587898c8e8f919298959698999a9b9ea5afbac6d1c4b7ab9e9184786b5e5145382b1e1205000000000000000005121e2a36424d57616d7a859299a3acb4bcc3c4bdb9b4aeacaaa29f9b9895908c8884807b76716d67605d56514b433d332d261d150c0300000000000000000000091623303c4956636f7c8999a4afbbc7d4d5c9bcafa296897c6f6356493c302316090000000000000000010d19242f434f5c6976828f9ca9b5c2cfdccfc3b6a99c90837669564c4135291d110400000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e02000a1724313d4a5764707d8a97a3b0bdcad6d5c9bcafa296897c6f6356493c302316090714202d3a4753606d7a868c8b8b8b8b8a8a8a8a89898989888888888b909ba6b3bfcbcbc8bbaea295887b6f6255483c2f2215090000000000000000000714212d3a4754606d7a8793a0adbac6cbbeb2a5988b7f7265584c3f3225190c0000000000000004070c1319222935414c56636f7c8996a1adb9c5d2d2c4b7ab9e918478685d5245392c201306000000000000000000020e1b2835414e5b6874818e9ba7b4c1cec9bcafa396897c706356493d3023160a0001050707090a0f141a25303b4653606d7985919eabb8c4d1c8bcb1a7998d8073665a4d4033271a080000000000000000000000000000000714212d3a46535f696e747474737373737272727a8798a2ab9e9184787171717171717171717171727f8c98a5a6998c7f73727272737373747474726d63574b3e3225180c0000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a86929facb8c2c7baaea3998b7f7265584e44505b6573808d9aa89d9184776a60606d7a86929facb8c3bbb0a69a8d8074675d51453a4653606d7985929eaba1978a7d7064564c41362a1c11060000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c6f6255493c2f221d27303b454f59606c77818f96a0aab4bfc8d1c7bdb3a9a0958f82786c605a5046505d6a7783909daab1a5988b7e7265584b3f3225180c00020f1b2835424e5b6875818e9ba8b4c1ccbfb2a5998c7f7266554b4035291d130700000815222e3b4855616e7b8894aab4bfcbc4b7aa9e9184776b5e51442e23180c00000000000000000000000000000000010d18242f404c5966737f8c99a6b2bfc8bbafa49a897c6f6356493c30231607000000000000000000040d151e262e343c43475055575f6166696e7275787a7d7f8183848587888a8b8c8d8e939eaab6c2d1c4b7ab9e9184786b5e5145382b1e120500000000000000000714202d3a46525e6974818e97a2abb5bec6c1bbb2adaba39f9b98928f8b87837f7b77736e6964605d55524c4540393127221b140b0300000000000000000000000b1825323e4b5865717e8b98abb5c0ccd7d5c8bbafa295887c6f6255493c2f221609000000000000000000081c2935424f5c6875828f9ba8b5c2cedbd1c5b8ab9e928578685d5245392c20130700000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e02000b1824313e4b5764717e8a97a4b1bdcad7d5c8bbaea295887b6f6255483c2f22150906131f2c3945515d6778859298989897979797969696969595959594979ba2acb7bdbebfc0bbafa295887c6f6255493c2f2216090000000000000000000714212d3a4754606d7a8793a0adbac6cbbeb2a5988b7f7265584c3f3225190c00000000000000000001081019242f3a4653606c7884919eabb8c4d1d2c5b9aca196877a6d6054473a2d211407000000000000000000020f1b2835424e5b6875818e9ba8b4c1cec9bcafa396897c706356493d3023160a000000000000000209141f2b3844505c6674818e9aa7b4c1cdcdc2b5a99c8f8276695c4f432f24190d01000000000000000000000000000005121e2a36424d575f61676767676666666565687885929fab9f9286796d64646464646464646464717e8a97a4a79b8e817468656666666767676766635b51463b2f22160a0000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000713202c38444f5965727f8b98a2aebac6c5b9ac9f92867a6d6154473f4953626f7c8896a0a096887c6f6265727f8b98a2aebac4b7ab9f94887b6e62554b403845515c6674818d9aa8a99c8f8275685e5246382e23170c0000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c6f6255493c2f22232e39434d57606b727f8c939ea8b2bcc6d0cbc0b5aba2979183796d665b504844505d6a7783909daab1a5988b7e7265584b3f3225180c00020f1b2835424e5b6875818e9ba8b4c1cec1b4a89b8e8175675d51453a2f2418120b06091623303c4956636f7c8996a2afbcd1c3b6a99c908376695d5043362a1d070000000000000000000000000000000000071824313e4b5764717e8a97a4b1bdccc0b6ac988b7f7265584c3f2e23180c00000000000000000006111c262f383f44464444494d5355575f616568686e7072747677797a7b7d7e7f80818e9ba8b4c1cec4b7ab9e9184786b5e5145382b1e120500000000000000000815212e3b4854616e7b87939fa9b3bdc7c1b7afa9a19e99928e8985827e7b77726e6a66615f5753514b45413a352f2c28231c150c0300000000000000000000000d1a2733404d5a6673808d99a6b3c0d2ddd4c7bbaea194887b6e6155483b2e2215080000000000000000020e1b2835414e5b6874818e9ba7b4c1cedad2c6b9ada197877a6d6054473a2d21140700000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e02000b1825313e4b5864717e8b97a4b1becad7d4c7bbaea194887b6e6155483b2e22150804101d2935404b556b7784919ea5a4a4a4a4a3a3a3a3a2a2a2a2a1a1a4a6acafb0b1b1b2b3b4afa295897c6f6256493c2f2316090000000000000000000714212d3a4754606d7a8793a0adbac6cbbeb2a5988b7f7265584c3f3225190c000000000000000000000008131f2b3744505b6576828f9ca9b5c2cfd5c9bdb2a895887b6e6255483b2f221508000000000000000000020f1b2835424e5b6875818e9ba8b4c1cec9bcafa396897c706356493d3023160a000000000000000003101c28343f4a5466727f8c99a5b2bfccd0c4b7aa9d9184776a564c4135291d11040000000000000000000000000000020e1a26313b454d53555b5b5a5a5a595959566a7784909daaa399887b6e615858585858585858636f7c8996aca99c908376695559595a5a5a5a5b595751493f352a1e12060000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000a16222f3b4854606b7784919daab4bfc9beb2a99b8e8275685e5246384754606a7784919ea89a8d8074666a7783909daab4bfbeb3a99c8f83766a5f53433934404b54636f7c8996a1ac9f92867a6e61544a3f34281c100300000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c6f6255493c2f222834404b555e69707d87939fa5afbac3cecac2bbafa39992857b6e675d544a3f44505d6a7783909daab1a5988b7e7265584b3f3225180c00020f1c2835424f5b6875828e9ba8b5c1cec5b8ac9f92857a6d60554b413529231c1513131625323e4b5865717e8b98a4b1becbc0b3a79a8d8074675a4d4134271a0e01000000000000000000000000000000000a1623303d495663707c8996a3afbcd0c1b4a79b8e817468554b4034281c100400000000000000000b17222d38424a5053504a424246484d535558565e61636568696b686d6f70717274798693a0adb9c6c4b7ab9e9184786b5e5145382b1e120500000000000000000c1925323f4c5865727f8b9aa4afbbc5c1b7afa59e96918c86827d7975716e6966625f5855534d4745403935393a3a38342e271e150b00000000000000000000020f1c2935424f5c6875828f9ba8b5c2cedbd4c7baada194877a6e6154473b2e2114080000000000000000010e1a2734414d5a6774808d9aa7b3c0cddad5c9beb3a995897c6f6256493c2f23160900000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e02000b1825323e4b5865717e8b98a4b1becbd7d4c7baaea194877b6e6154483b2e21150806121f2b3844505c667885929ea4a3a2a2a2a1a1a1a1a1a1a1a1a1a1a1a2a2a3a3a4a4a5a6a7a9a296897c6f6356493c302316090000000000000000000714212d3a4754606d7a8793a0adbac6cbbeb2a5988b7f7265584c3f3225190c0000000000000000000000030f1b27333f49536874818e9ba7b4c1cedacebcafa295897c6f6256493c2f231609000000000000000000020f1c2835424f5b6875828e9ba8b5c1cec9bcafa396897c706356493d3023160a0000000000000000000b17232e3e4b5864717e8b97a4b1becad2c5b8ac9f928579685d5245392c20130600000000000000000000000000000009141f29333b4246484e4e4e4d4d4d4c4f5c6976828f9ca9ab96897c7063564b4b4b4b4b4b55616e7b889aa4ab9e918478675c514c4d4d4d4e4e4c4b463f372e23180d020000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000006111c2a36424d5663707d8996a0acbcc6c6b9ada197897d7063564c4137434e586673808c99a89e9185796d6f7c8995a0acbcc6b9ada1978a7e7164584e43312e394653606c7884919eaba3998c7f72665c5044382c1f150a00000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c6f6255493c2f2b343c45515c676e7b859299a4afb8c1ccccc2b8afa59f92877d70695f554c423844505d6a7783909daab1a5988b7e7265584b3f3225180c00020f1c2935424f5c6875828f9ba8b5c2cec6baaea2988b7e71675d51453f342e27201f1f202b37434e586774818e9aa7b4c1cabfb4aa988b7e7165584b3e3225180b00000000000000000000000000000000000815222f3b4855626e7b8895aab4becac3b7aa9d908477675c5145382c1f130600000000000000030f1c28333f4a545b605b545249403c4246484b4d525456595b5c565d61626365666e7a8794a1adbac7c4b7aa9e9184776b5e5144382b1e11050000000000000004101c2834404b54697683909cacb6c0c6bdafa59e938e847f7a75706d6665615e5755534e4846423b39353a4145474644403930271c120700000000000000000004101d2a3743505d6a7683909da9b6c3d0dcd4c7bbafa499867a6d6053473a2d2014070000000000000000000d1a2733404d5a6673808d99a6b3c0ccd9dacfbdb0a3968a7d7063574a3d3024170a00000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c1b4a79b8e8174685b4e4135281b0e02000b1824313e4b5764717e8a97a4b1bdcad7d4c8bbaea195887b6e6255483b2f2215080713202d3a4653606d798693989796969595959494949494949494949495959697979898999b9c9d96897c706356493d3023160a0000000000000000000714212e3a4754616d7a8794a0adbac7cbbeb2a5988b7f7265584c3f3225190c0000000000000000000000000b17222d404d596673808c99a6b3bfccd5c9bcafa296897c6f6356493c30231609000000000000000000020f1c2835424f5b6875828e9ba8b5c1cec9bcafa396897c706356493d3023160a000000000000000000061723303d4a5663707d8996a3b0bcc9d3c6baaea298877a6d6054473a2d211407000000000000000000000000000000030d18212931363a3b414141404040414e5b6774818e9aa7a4988b7e7165584b3e3e3e3e4653606d7986939fac9f93867a6d60534740404141413f3e3b352e251c1207000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000c17232e3a46525e6975828e9ba8b2bdcec4b8ab9e9184796d6053463a323c4955626f7c8896a0a197897d7074818e9aa7b1bcc5b8ab9e9285796d6053463c312b3744505b6573808d9aa8ab9e9184796d6053463c32261b0f02000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c6f6255493c2f323c46505a606d79839097a1abb5c0cacec4bab0a69d938b7f726b60574d433a2f44505d6a7783909daab1a5988b7e7265584b3f3225180c00030f1c2936424f5c6975828f9ca8b5c2cfcabfb4aa9e9184796d605b51444039302d2c2c2d313a47535f6a7784909daab7c3c6baaea298887c6f6255493c2f22160900000000000000000000000000000000000714202d3a4753606d7a8698a2aebac6c5b9ac9f9286796d6053463a2d2013070000000000000006121f2b3844505b666c66635b52463d373a3b3f4146474a4c4e504c5254555758626f7b8895a2aebbc8c3b6a99d9083766a5d5043372a1d10040000000000000006131f2c3845515c667885929eabb8c5bfb4ab9e938e817a726d6863605c5454524d4847433c3a3631363e444c525453514a42392e23180c00000000000000000004111e2b3744515e6a7784919daab7c4d0ddd2c6b9ac9f938679675d5145392c1f13060000000000000000000c1926333f4c5966727f8c99a5b2bfccd8d7cabdb1a4978a7e7164574b3e3124180b00000000000000000000000000000000000000000000000000000a1723303d4a5663707d8996a3b0bcc9c1b4a79b8e8174685b4e4135281b0e02000a1724313d4a5764707d8a97a3b0bdcad6d5c8bcafa295897c6f6256493c2f2316090714212e3a4754616d7a878c8b8b8a89898888888787878787878787888889898a8a8b8c8d8e8f9092897d7063564a3d3023170a0000000000000000000815212e3b4854616e7b8794a1aebac7cbbeb2a5988b7f7265584c3f3225190c000000000000000000000000061926323f4c5965727f8c98a5b2bfcbd7cbbfb4aa95887b6e6255483b2f221508000000000000000000020f1c2935424f5c6875828f9ba8b5c2cec9bcafa396897c706356493d3023160a0000000000000003070d1523303d4a5663707d8996a3b0bcc9d2c5b9ac9f9286796c605346392d20130600000000000000000000000000000000060f181f262a2d2e343434343333404c5966737f8c99a6a6998c807366594d4033313845515c667885929eaba49a887b6e6255483b3434343433322f2a231c130a00000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54616e7b86929facb9c3c8bcb1a79a8d8073665c5044382e3b47535f6a7784919ea99b8e81747985929fabb8c3bcb0a69a8d8073665c5145382a27333f4953626f7c8896a0aca1968a7d7164584e43372b1e1308000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c6f6255493c2f3a444e58626c74818e959fa9b3bdc7d0c6bcb2a89f948e81746d62594f453c313744505d6a7783909daab1a5988b7e7265584b3f3225180c0003101c2936434f5c6976828f9ca9b5c2cfd0c6b9ada1968d80746d625a514a423e3a38383a3d434e58626f7c8895a0acb8c5c5b8ac9f9285796d6053473a2d20140700000000000000000000000000000000000613202c3945515d677885929fabb8c5c7bbafa399887c6f6255493c2f22160900000000000004101c2834404b55606c78736e63584e43392f2e3036393b3d3f4143414647484a56636f7c8996a2afbcc9c2b5a89b8f8275685c4f4235291c0f02000000000000000713202d3a4653606d7986939facb9c6baaea3998f81786d68615e5653514b4746423b3a37312d2a333e4850565d60605c544a4034281c1004000000000000000005121e2b3845515e6b7884919eabb7c4d1ded2c5b8ac9f9285796c554b4035291d10040000000000000000000c1926323f4c5965727f8c98a5b2bfcbd8d8cbbeb1a5988b7e7265584b3f3225180c00000000000000000000000000000000000000000000000000000a1723303d4a5663707d8996a3b0bcc9c1b4a79b8e8174685b4e4135281b0e02000a1623303d495663707c8996a3afbcd0dbd6c9bcb0a396897d7063564a3d3023170a0713202d3946525e68727f807f7e7d7c7c7c7b7b7b7a7a7a7a7a7a7a7b7b7c7c7d7e7e7f8081828485847b6e6154483b2e2115080000000000000000000815222e3b4855616e7b8894a1aebbc7cbbeb2a5988b7f7265584c3f3225190c0000000000000000000002050c152633404d596673808c99a6b3bfccd3c7baaea398877a6d6054473a2d211407000000000000000000020f1c2935424f5c6875828f9ba8b5c2cec9bcafa396897c706356493d3023160a0004060708060b1012181f28333f4a5465727e8b98a5b1becbd1c4b7aa9e918477665b5044382b1f12060000000000000000000000000000000000060d141a1e21222828272727313e4b5864717e8b97a4a89b8e8175685b4e422f2834404b546a7783909daaac968a7d7063574a3d302727282625221e18120a0100000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000006121f2c3844505c66737f8c99a3afbbc7c4b8aba095887b6f62544a3f342b37434e586773808d9aa89f9285797e8b98a2aebac4b7ab9f94887b6f62544b403428222d384754606a7784919eaaa89c9083766a5f53473a3025190d000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c6f6255493c38424c56606a717e8b939da7b1bbc5d0c7beb4aaa1969082786d605b51473d332a3744505d6a7783909daab1a5988b7e7265584b3f3225180c0003101d293643505c6976838f9ca9b6c2cfd5c9bdb2a89d928b7f726c605c544f4846454546484e555f6a74808d9aa7b1bcc8bdb2a89b8e8175675c5145382c1f1306000000000000000000000000000000000004111d2935404b556a7784919daab7c4cbc0b5ab968a7d7063574a3d3024170a00000000000006131f2c3845515c67788480736a60554b40342d262a2d2e3032353035393a3d4a5763707d8a96a3b0bdc9c1b4a79a8e8174675b4e4134281b0e01000000000000000814212e3b4754616e7a879aa4afbbc5b9ac9f92867b6e665d56524c4645403b3a36302e2b2628313b45505a61686d6d665c5144382c1f1206000000000000000005121f2b3744505b657885929fabb8c5d2ded2c5b8ac9f9285796c5f52462f24180c000000000000000000000c1925323f4c5865727f8b98a5b2becbd8d8ccbfb2a5998c7f7266594c3f3326190c00000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdcac1b4a89b8e8175685b4e4235281b0f02000916232f3c4956626f7c8995aab4bfcad6d7cabdb0a4978a7d7164574a3e3124170b05111d2a36414c56636d72737271706f6f6f6e6e6e6e6e6e6e6e6e6e6e6f6f70707171727374767778786e695e52463a2d2014070000000000000000000815222f3b4855626e7b8895a1aebbc8cbbeb2a5988b7f7265584c3f3225190c09090808080808090a080e11151e2935414c566774818d9aa7b4c0cdd2c5b9ac9f928679685d5245392c201307000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfc9bcafa396897c706356493d302316100c1013141416171c1f2429313944505b6673808d9aa6b3c0cdcfc2b6a99c8f837669544a3f33281c0f0300000000000000000000000000000000000003090e1214151b1b1b1a23303d495663707c8996aca99d9083766a554b4035292e424f5c6875828f9ba8a5988b7f7265584c3f32251b1b191816120d07000000000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7984919eabb5c0cbc0b5ab9d9083776a5f5342382e26323c4956626f7c8996a1a2988a7e83909daab4bebeb4aa9c9083766a5f5342392e231b2b37434e586673808d99a8ab9f94887c6f62564c41362a1c11060000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c6f6255493c3f4a545d686f7c86929fa5afb9c2cdccc0b6aca29891847a6d665c51493f352b2a3744505d6a7783909daab1a5988b7e7265584b3f3225180c0003101d293643505c6976838f9ca9b6c2cfcec3bab1aca49f93877e746d6661595553515153545860676f7c86929facb8c3c6b9ada196897d7063554b4034291c10040000000000000000000000000000000000010d18242f44505d6a7783909daab6c3d1bdb1a4978a7e7164574b3e3124180b0000000000000713202d3a4653606d7986877c6f675c51453f382f28232123262824292d323e4b5865717e8b98a4b1becabeb3aa998c807366594d4033261a0d00000000000000000714212d3a4754606d7a8799a3aebac2b5a89c8f8275695e544c46413a38342e2d2a25212328323a434d57616c707a786d6053463a2d20130700000000000000000613202d394653606c7986939facb9c6d2ded2c5b8ab9f9285786c5f5245392c1f07000000000000000000000c1925323f4c5865727f8b98a5b2becbd8d9ccc0b3a6998d8073665a4d4033271a0d00000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0bdcac1b5a89b8e8275685b4f4235281c0f02000814212e3b4754616e7a8798a2aebac7d3d7cbbeb1a4988b7e7165584b3e3225180b010d1925303a44515b6365666564636362626261616161616161616161626263646465656668696a6b6b615e574d42362a1e12050000000000000000000915222f3c4855626f7b8895a2aebbc8cbbeb2a5988b7f7265584c3f3225191616151515151515161617191e2027303845525d687683909da9b6c3d0d0c3b7aa9d9084776a564c4135291d1104000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfc9bcafa396897c706356493d30231f1c181c1f20212323282b2f353b434c56606c7884919eaab7c4d1c9bdb2a89a8e8174675b4e412d22170b000000000000000000000000000000000000000000020507080e0e0e15222e3b4855616e7b889aa4ab9e918578675d5145382c34414e5a6774818d9aa7a69a8d8073675a4d4034271a080c0c0a060200000000000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000006121e2b37424d5764707d8a96a1adbdc7c7bbafa3998b7f7265584e433026202d394653606c7884919eaa9d918490959fabbcc5baaea2988b7e7164584e4330271d1b27323c4955626f7c8896a0aca69b8e8174685e5246382e23170c0000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c6f6255493c44505b666d7a849198a3aeb7c0cbcbc3bbafa49a92867c6f685e544b40372d232a3744505d6a7783909daab1a5988b7e7265584b3f3225180c0003101d2a3643505d697683909ca9b6c3cfc8bdb1a8a09da099938b8078706c6662605c5c6061656a6f79839198a3aebac6bdb1a79e9184786c605346392f23180c00000000000000000000000000000000000000071d2a3643505d697683909ca9b6c3cbbeb2a5988b7f7265584c3f3225190c0000000000000814212e3b4754616e7a879083796d605c504a423a342e2a25242322232b37434e586774818e9aa7b4c1c6baaea298897c6f6356493c3023160900000000000000000613202c3945515d677986929facb9c0b3a79a8d807467564d423a36302c2823202024292e343c444c565f69707e867f7265594c3f3226190c00000000000000000714202d3a4753606d7a8699a4afbbc7d4ded2c5b8ab9f9285786c5f5245392c1f12060000000000000000000c1825323f4b5865727e8b98a5b1becbd8dacdc0b3a79a8d8074675a4d4134271a0e00000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1bdcac1b5a89b8e8275685b4f4235281c0f02000613202d394653606c7985929facb8c5d2d8cbbfb2a5988c7f7265594c3f322619080008131e29323f49515759595858575656555555545454545454545455555656575758595a5b5c5d5f5e54524d453b30251a0e020000000000000000000916232f3c4956626f7c8995a2afbcc8cbbeb2a5988b7f7265584c3f3225232323222222212122222324252a2d3039424c56606d7a86929facb9c5d2c9bdb2a8998d8073665a4d403024190d0100000000000000000003101d293643505c6976838f9ca9b6c2cfc9bcafa396897c706356493d302d2c2823292c2d2e302e34383a40454d555d68717e8a96a0acb9c5cfc7b9aca196897d7063564a3d302317060000000000000000000000000000000000000000000000000001010713202d3a4653606d7986939faca197867a6d6053473a2d333f4c5966727f8c99a5a89b8f8275685c4f423025190d010000000000000000000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000814212e3a47535f6976828f9ca9b2bdcfc5b9ac9f92867a6d6154473c31211f2b3744505b6574808d9aa9a09591959fa7b1bcc5b8ab9f92857a6d6053473c31201515212e3b47535f6a7784919eaaac9f92867a6d61544a3f34281c100300000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c6f625549454f59606c78828f96a1aab4bfc9cdc3b9afa59f93887e716a5f564c42392e251b2a3744505d6a7783909daab1a5988b7e7265584b3f3225180c0004111d2a3744505d6a7783909daab6c3d0c5b8aca09591959f9f928d837d77726e6d66676d6e71767c849195a0aab4bfbdb5ab9f958b7f72665b5044382b1d120700000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2ccbfb2a6998c7f7366594c403326190d0000000000000815222f3b4855626e7b88958e81746e605b544c4440393630312f2f2e343c47545f6a7784919daab7c4c5b8ab9f9285796d6053463a2d201307000000000000000004111d2935414b556a7784919daab7c0b3a6998d807366564c4138302d2c28282b2d2f353940444e565d686e7b858d8073675a4d4034271a0600000000000000000814212e3b4754616e7b8794a1b5c0ccd7ded1c5b8ab9e9285786b5f5245382c1f12050000000000000000000b1825323e4b5865717e8b98a4b1becbd7dacec1b4a79b8e8174685b4e4135281b0e00000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1becac2b5a89b8f8275685c4f4235291c0f020005121f2b3744505b657784909daab7c3d0d9ccc0b3a6998d8073665a4d403025190d01020c17202d373f464a4c4d4c4b4a49494948484847474747474747484849494a4b4b4c4d4e4f5152524846423b33291f140900000000000000000000091623303c4956636f7c8996a2afbcc9cbbeb2a5988b7f7265584c3f323030302f2f2f2e2e2e2f2f30313036393e424b545d68727f8b99a3afbbc7cfc7b9aca196887c6f6255493c2f2216080000000000000000000004101d2a3743505d6a7683909da9b6c3d0c9bcafa396897c706356493d3a3a38342f34383a3b3c3e3f44464b51575f676d7a84919da8b2bdc8c7bdb2a89e9184786c605346392d20130600000000000000000000000000000000000000000000000000000006131f2c3845515c677885929eaba995887b6e6255483b2f313e4b5864717e8b97a4aa9d9084776a564c41362a1e11050000000000000000000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000004101d2935404b55626e7b87939facb9c4cabeb3a99b8f8275685e5246392d201b27333f495363707c8997a1a7a09da0a7b1b9c2bcb1a79a8e8174675d5145392c2013131f2b37434e586673808d99a8aea3988c7f72665c5044382c1f150a00000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c6f6255494d57616b73808c949fa8b2bcc6cfc5bbb1a79e938c80736c61584e443a30271d1d2a3744505d6a7783909daab1a5988b7e7265584b3f3225180c0004111e2b3744515e6a7784919daab7c4d0c4b7aa9d918490959f9d95918a837f7b797878797b7e82879196a0a8b1bcbdb4aba3999083786c60544a3f33281c0b01000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cdc0b3a69a8d8073675a4d4034271a0d0000000000000916232f3c4956626f7c8995938d80736c665e56514a46423f3d3c3c3d3f444f59626f7c8895a0acb8c5bcb1a79b8f8275665c5044382c1f12060000000000000000010d18242f414e5a6774818d9aa8b2bdb5a89b8f8275685e524a423d3a38343338393b40454a51585f686d7a83908e8174685b4e412d22170b00000000000000000815222f3b4855626e7b8895a1aebbd2ddded1c5b8ab9e9285786b5f5245382c1f12050000000000000000000b1825323e4b5865717e8b98a4b1becbd7dbcec2b5a89b8f8275685c4f4235291c0f00000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1becbc2b5a89b8f8275685c4f4235291c0f0200030f1b27333f49536875828f9ba8b5c2d1dccfc2b5a89c8f827569564c41362a1e110500050e1c252d353a3e3f403f3e3d3c3c3c3b3b3b3b3b3b3b3b3b3b3b3c3c3d3d3e3e3f4041434445453b3a36302921170d02000000000000000000000a1623303d495663707c8996a3afbcc9cbbeb2a5988b7f7265584c3f3d3d3d3c3c3c3b3b3b3b3b3c3d3d404146474f545c666d7a85929eabb5c0cbc7bdb1a79e9184786a6054473b2e2215080000000000000000000004111e2b3744515e6a7784919daab7c4d0c9bcafa396897c7063564947474645404540454747494b4a5053555d60696e79829096a0acbac3cbc0b5aba1968c7f73655b5044372b1f120500000000000000000000000000000000000000000000000000000004101c2834404b556a7783909daaa3968a7d7063574a3d30303d495663707c8996a3ac9f928579685e5246392d2014070000000000000000000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000006131f2c3845515d6774808d9aa4afbbc8c6baada2978a7d7164564c41362a1d17222d394653606c7985929eabacaaacb1b9c2c5b8aca095897c6f62554b4035291d100f1b26323c4855626f7c8896a0acaa9e9184796d6053463c32271b0f02000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c6f62554b555f69707d88939fa6b0bac4cec6bdb3a9a0958e81776c605a50463c32291e151d2a3744505d6a7783909daab1a5988b7e7265584b3f3225180c0005121e2b3845515e6b7884919eabb7c4cfbeb1a5988b7f8390959ea09d95908c8886858586878b8f9299a0a8b1babab3aba39992877c6f665b5042382d22170b00000000000000000000000000000000000000020f1c2835424f5b6875828e9ba8b5c1cdc1b4a79a8e8174675b4e4134281b0e0000000000000a1724313d4a5764707d8a979c928d80786d68605c54524d4b4a49494a4a5057606b74818e9ba8b1bdc2b8ab9f958a7d7164544a3f34281c1003000000000000000000071724313d4a5764707d8a96a1acb9b9ac9f92867a6e615c544f494645403f4446484b51545c606a6e7a8390958f827569544a3f33281c0f03000000000000000916222f3c4955626f7c8895a2afbbc8d5ded1c4b8ab9e9185786b5e5245382b1f12050000000000000000000b1825313e4b5864717e8b97a4b1becad7dccfc2b5a99c8f8276695c4f4336291c1000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2becbc2b5a89c8f8275695c4f4236291c0f0300000b17222d404d596673808c99abb5c0cbd7d1c4b8ab9e918578685e5246392d20130700000a131c232a2e313233323130302f2f2f2e2e2e2e2e2e2e2e2e2e2f2f30313132323335363738382e2d2a251f170f0500000000000000000000000a1723303d4a5663707d8996a3b0bcc9cbbeb2a5988b7f7265584c4a4a4a49494948484848484849494a4c4c52545961666d78818f97a1adbdc7c7beb5ab9f958b7e7165584e43372b1f13060000000000000000000005121f2b3845525e6b7885919eabb8c4d1c9bcafa396897c70635655545453514b524b5153545657545c6062676d727b8290949fa8b2bdc6bfbbafa39991847a6d6153493f33271b0f03000000000000000000000000000000000000000000000000000000000c18232e424f5c6875828f9ba8a5988b7e7265584b3f322f3b4855626e7b8895a9aaa298877a6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7985929facb6c0ccc5b8ab9f9285796d6053463a302519121f2b3844505b6674818e9aa9b3b7b8bcc3cbbfb4aa9d9083776a605443392f24180d0a15212e3b47535f6a7784919daaada1968a7e7164584e43372b1e1308000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c6f6255515d676e7b85929aa4afb8c2cccbbfb5aba1979083796d655b50483e342a20170c1d2a3744505d6a7783909daab1a5988b7e7265584b3f3225180c0005121f2c3845525f6b7885929eabb8bebcbeb3a6998c807a838e939ea1a09d999a9392929794989c9fa3abb2b8b3ada9a19992877e716a5f544a3f2f261c110600000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1cec1b5a89b8e8275685b4f4235281c0f0000000000000d192633404c5966737f8c99a49c928d827a726d66615e575857565556545c606a707d87929facb9c2b9afa59d9083786c605346392e23170c000000000000000000000713202d3a4653606d7884919ea6b0baaea3998f81756d6660595553514b4a505354555d60666d727c8490959d908376665b5044382b1f1206000000000000000915222f3c4855626f7b8895a2aebbc8d5ded1c5b8ab9e9285786b5f5245382c1f12050000000000000000000b1825323e4b5865717e8b98a4b1becbd7dbcec1b5a89b8e8275685b4f4235281c0f00000000000000000000000000000000000000000000000000000c1926323f4c5965727f8c98a5b2bfcbc2b5a99c8f8276695c4f4336291c10030000061723303d4a5663707d8999a3afbbc7d3d2c5b9ada196877a6d6154473a2e2114070000010a11181e222526262525242323222222212121212121212122222323242425262728292a2c2b21201e1a140d050000000000000000000000000a1724313d4a5764707d8a97a3b0bdcacbbeb2a5988b7f7265585757575656565655555554545555565759565e61656b7079818e939ea9b3bec6bdb5aca3999083786c6053463c32271b0f030000000000000000000005121f2b3744505b657885929fabb8c5d2c9bcafa396897c706362616160605c5f5f555c6061636466666d6f74797f8690949fa6b0bac3bdb5aea49f92877d6f685d5241382d22170b0000000000000000000000000000000000000000000000000000000000071a2734414d5a6774808d9a9d9e9a8d8073675a4d40342d3a4753606d7a86979d9e9f95897c6f6256493c2f2316090000000000000000000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000006131f2b37434e5865717e8b97a2adbec7c8bdb2a89a8d8174675c514538291e130f1c28333f4a5463707d8997a2adbac5c8cec7baaea3988b7f7265584e4331281d120706121f2b37434e586673808c99a8b2a89c9083766a6054473a3025190d000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c6f62555b606d79839097a2acb6c0cacac2bbaea39992857b6e675d53493f362c22180e111d2a3744505d6a7783909daab1a5988b7e7265584b3f3225180c0006121f2b3844505b667985929fabadb3afb1b4a79a8d817479818b92979fa2a9a49f9e9fa2a9a4a9acafb4aeaca9a29f9791877e716c62584e42382d1d140a0000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1cec1b5a89b8e8275685b4f4235281c0f0000000000030f1c2936424f5c6975828f9ca8a49c948f857e79726e6966656462626364666d727c859299a3afbbbab1a79e93897d70655b5044372b1c11060000000000000000000006121f2b3844505c66727e8b949fa8b2b4ab9e938d80786f6b6562605c55545b606164676d72797f8691969f9f9285796c605346392d201306000000000000000815222e3b4855616e7b8894a1aebbc7d4ded1c5b8ab9e9285786b5f5245382c1f12050000000000000000000b1825323e4b5865717e8b98a4b1becbd7dacdc1b4a79a8e8174675b4e4134281b0e00000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5b2bfccc2b5a99c8f8276695c4f4336291c100300000714202d3a4753606d7a86929facb9c5d2d5c9bdb2a996897d7063564a3d2e23180c00000000070d121618191a1918171616161515151414141414141415151616171818191a1b1c1e1f1f1514120e0902000000000000000000000000000b1824313e4b5764717e8a97a4b1bdcacbbeb2a5988b7f726564646464636363626262616161626263646668686e72767d848e939ea5afbbc2bdb4aba49a92877c6f655b5044372b20150a00000000000000000000000613202d394653606c7986939facb9c6d2c9bcafa396897c706f6f6e6e6d6d676c6c6c676d6e6f717376797c81858c92989fa6b0b8bdb9b2aba39f928c7f736b60564c412f261b110600000000000000000000000000000000000000000000000000000000000c1926323f4c5965727f8c909091928e8275685b4f42352c3945515d67788590909192998a7e7164574b3e3124180b0000000000000000000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000a15222e3b4754606a7783909da9b3bed0c5b8aca096897c6f62554b403428170c0b17222d3a4653606d7985929fabb8c5d0d2c5b9ac9f92867a6d6154473d3221160c01030f1b26323c4955626f7c8896a1adab9f94887c6f62564c41362a1c12070000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c6f6258626d75818e95a0a9b3bec7ccc2b8aea49f92877d6f695e554b41382d241a1006111d2a3744505d6a7783909daab1a5988b7e7265584b3f3225180c000613202d394653606c7986989d9ea1a9a3a4a7a89b8e81756d757e858d92979c9fa3aaa7a8a9a9a8a7a6aaa29f9c97928c857d716c625a50463c2f261c0b020000000000000000000000000000000000000000020f1c2835424f5b6875828e9ba8b5c1cdc1b4a79a8e8174675b4e4134281b0e000000000005121f2b3845525e6b7885919ea1a9a69f97918b847f7b777372706f6f707174797e869297a1abb5bab0a89f958f81756b6053493f33271b0a000000000000000000000003101c28343f4a54606c78828f96a1a8b0afa59d928d837c76726f6d676a6a666c6e7174797e848c9298a0a8a297887c6f6255483c2f221509000000000000000815212e3b4854616e7b8794a1aebad0dbded2c5b8ab9f9285786c5f5245392c1f06000000000000000000000c1825323f4b5865727e8b98a5b1becbd8d9cdc0b3a69a8d8073675a4d4034271a0d00000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfccc2b6a99c8f8376695c504336291d100300000613202c3945515d677683909da9b6c3cdd9cfbfb2a5998c7f7266544a4034281c1004000000000106090c0c0d0c0b0a090909080808080808080808080809090a0a0b0b0c0d0e10111212080705020000000000000000000000000000000b1825313e4b5864717e8b97a4b1becacbbeb2a5988b7f72727171717070706f6f6f6e6e6e6e6e6f70707375777a7f838a91969ea5afb7beb9b0aba39993887e716a5f53493f3327190e0400000000000000000000000714212d3a4754606d7a879aa4afbbc8cfcbbfb2a5988c7f7c7c7b7b7a7a7979797879797a7a7c7e7f8285898d92989fa2aab0b8b8b2ada8a099928b80786c60594f443a301d140a0000000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b8383838486898376695d5043362935404b5566727f84838486888a7f7266594c3f3326190c0000000000000000000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000006111b2935414c56626f7c89959fabbbc5ccc0b6ac9d9184776a605443392e23180506121f2c3844515c6674818e9baab4bfcac9bdb2a89b8e8175685d5246392d20130400000a15222e3b47545f6a7884919eabb0a69b8e8174685e5246392e23180c0000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c6f62606a727f8b939ea7b1bbc5cec3bab0a69d928b7e716b60574d43392f261b120800111d2a3744505d6a7783909daab1a5988b7e7265584b3f3225180c000714202d3a4753606d7a86919092979496989a9d9c8f8275696c717a80858b8f9298989a9b9c9c9b9a999898928f8c857f79706b615a50483f342a1d140a000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cdc0b3a69a8d8073675a4d4034271a0d0000000000020f1c2935424f5c6875828b92979fa3a9a19e96918b8783807e7d7c7c7d7e81858b9298a1a9b3b4aea69f969083796d60594f41382d22170b0000000000000000000000000b17232e3844505b666e7b8491969fa6acaea49d959089837f7c7978777778797b7e81858b91969fa3aaa9a1988b7f7265584c3f3225190c000000000000000714212e3a4754616d7a8794a9b3becad6ded2c5b8ab9f9285786c5f52452e23170c000000000000000000000c1925323f4c5865727f8b98a5b2becbd8d9ccbfb2a6998c7f7366594c403326190d00000000000000000000000000000000000000000000000000000d1a2733404d5a6673808d99a6b3c0ccc3b6a99c908376695d5043362a1d1003000004101d2935404b556673808c99a7b1bcc8d4cec1b4a89b8e8175665c5144382c1f120700000000000000000000000000000000000000000000000000000000000000000205070807060401000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1becbcec2b5a89b8f817f7e7e7e7d7d7d7c7c7c7b7b7b7b7b7b7c7c7d7f8184868b90949ea0a8afbbb9b3ada69f9992877e716c62584e41382d2217070000000000000000000000000814212e3b4754616e7a8794a1b6c0c3c2c2c1b3a79b918c8988888887878686858585868687898a8c8f92989a9fa2aaaeb4b6b1aba9a19e9691877e736c665b50473d32281e0b020000000000000000000000000000000000000000000000000000000000000814212e3a47535f696e767776777a7c7c6f6255493c2f242f394b57636d72777677797b7d7a6d6154473a2e2114070000000000000000000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000b17222d3945525d6874818e9ba7b1bccdc8bbafa49a8c7f7366584e4330271d120704101c2834404a5464707d8a98a2aebac5c5b9aca096897d7063564c4135291d1105000006131f2b37434e586774818d9aaab4ac9f92867a6d61544a4034281c100400000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c6f62686f7c87929fa5afb9c3cdc5bcb2a89f948d80746c62594f453b31281d140a0004111d2a3744505d6a7783909daab1a5988b7e7265584b3f3225180c000613202c3945515d6775818484858688898b8d90929083766962686d73797e8286898b8e8f8f908f8e8d8c8986827f7a726d67605950483f362d22180b0200000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2ccbfb2a6998c7f7366594c403326190d0000000000000713202d3a4653606d787f858d92999fa2a8a19e9895908d8b8a8988898b8e92979fa2aab3adaaa39f948f847a6d675d51473d2f261b110600000000000000000000000006111c28333f4a545e696e7b848f949da0a8aca79f9d95908c88868584848586878b8e92979ea0a8a9a19e97928b7e7165584b3e3225180b000000000000000713202d3a4653606d798697a2adbac6d3dfd2c5b8ac9f9285796c5f4a3f34281c10030000000000000000000c1925323f4c5865727f8b98a5b2becbd8d8cbbfb2a5988c7f7265594c3f3226190c00000000000000000000000000000000000000000000000000000e1a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d10030000010d18242f3b4855626e7b8895a0abb8c6d0d1c5b8ab9e9285796d6053463a2f24180d01000000000000000000000000000000000000000000000000000000000003090e1214151413110d070100000000000000000000000000000000000c1926323f4c5965727f8c98a5b2bfc4c4c3b6aa9e938f8b8b8b8a8a8a8989898988888887878888898a8c8e9093999c9fa6acb2b5afaca9a19e948f867e716c625a50463c2f261b11060000000000000000000000000815222f3b4855626e7b8895a1aeb6b6b6b5b5b4ada39b989695959494939a93929292939a949697999c9fa2aaabaeb3aeaca9a79f9d96918b847d716c605b544a3f352b20160c0000000000000000000000000000000000000000000000000000000000000006121e2b37424d575f626a6a6a676d6f6f6a5f53473b2e212f3b46515b63666a6a666d6e706d685e5246392d2013070000000000000000000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000030f1b27333f4953606d7a86929facb8bcbfc1b9ac9f93877b6e6154483d3221150b00000c18232e3a4753606d7985929facb7b9bab5ab9e9184786c6053463a3024190d010000030f1b26323d4a5763707d8a98a2aeaea3988c7f73665c5144382c1f150a00000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c6f666e7a849199a3aeb7c1cbc7bdb3aaa0968f82786d605a50473d33291f160b020004111d2a3744505d6a7783909daab1a5988b7e7265584b3f3225180c0004101d2935404b55656f757777787a7b7c7e81838688827669565d60676d71767a7d7f818283838281807f7c7976726d68605d554f473e362d241b10060000000000000000000000000000000000000000000003101d2a3643505d697683909ca9b6c3cbbeb1a5988b7e7265584b3f3225180c00000000000006121f2b3844505c666d727a80868e92989d9fa7a7a09d999897959596979a9ea1a9adaba9a29f98928b827b6e685e554b40352b1d140a00000000000000000000000000000b17222d38424d575f696e7a828a91959da0a8a9a79f9d989992919190929399979b9ea1a9a39f9c97928c857f776c605346392d2013060000000000000006131f2c3845515c677885929fabb8c5d2ded2c5b9ac9f928679665c5044382c1f12060000000000000000000c1926323f4c5965727f8c98a5b2bfcbd8d7cbbeb1a4988b7e7165584b3e3225180b00000000000000000000000000000000000000000000000000000e1b2835414e5b6874818e9ba7b4c1cec3b6a99d9083766a5d5043372a1d10040000000714212e3a47535f697783909daab4bfcad2c6b9ada2978a7d7063554b4035291d100400000000000000000000000000000000000000000000000000000000050d141a1e212121201d18130c04000000000000000000000000000000000d192633404c5966737f8c99a6b2b7b7b7b7b6afa59e9b98989797979796969695959594949495959697999b9d9fa4ababb0adababa49f9c97928b827c716c625a50483f342a1d140a000000000000000000000000000916232f3c4956626f7c8995a2aaaaa9a9a8a8a8a7a7a7a5a2a2a2a1a1a0a49f9f9f9f9fa4a1a2a4a6a9aaa9a9a8a6aaa29f9c9895908b847e786f6b625a504a42382d23190e0400000000000000000000000000000000000000000000000000000000000000020e1a26313c454d53555d5d555d6063625f584e43372b1f2a3540495157595d545c606264615e564c41362a1e11050000000000000000000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000005121f2b3744505b65727f8c98a2aeb4b0b2b4b4aa9c8f8276695e53463a2d211403000007131f2c3845515c6775828e9baaabacaeafa3998c7f72655b504437281e1308000000000a14202d3a4753606d7985929fabacaa9e9184796d6053463c31261a0f02000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c6f6d78828f96a1abb5bfc9ccc0b5aba29891847a6d665c50483f352b21170d04000004111d2a3744505d6a7783909daab1a5988b7e7265584b3f3225180c00010d18242f3943535d65686a6a676d6e70717477797c7a6d605452555d6065676d70727475767675747372706d6765615d56514b433d352c241b1209000000000000000000000000000000000000000000000004101d2a3743505d6a7683909da9b6c3cabdb1a4978a7e7164574b3e3124180b00000000000003101c28343f4a545c60686d737b81858b9095989b9ea1a9a5a3a2a2a3a4a7a7a6a9a29f9c97928d867f776e695e564c43392f23190b02000000000000000000000000000006111c262f3b454d575f686d787e848a9195999c9fa3ababa39f9e9d9d9e9fa4aba8a09d9b99928f8a857f79726c655b5044372b1f12050000000000000004101c2834404b556a7784919daab7c4d0ddd3c7baaea39986796d6053463a2d2013070000000000000000000d192633404c5966737f8c99a6b2bfccd9d7cabdb0a4978a7d7164574a3e3124170b00000000000000000000000000000000000000000000000000000f1c2835424f5b6875828e9ba8b5c1cec3b6aa9d9083776a5d5044372a1d110400000006121e2b37424d5765727f8c98a2aebac6d1cabeb3a99b8e8175675d5145392c20160a000000000000000000000000000000000000000000000000000000090f171f252a2d2e2d2c29241d160d040000000000000000000000000000000d1a2733404d5a6673808d99a6abaaaaaaaaaaa9a9a9a8a5a5a4a4a4a3a3a3a2a2a2a1a1a1a1a1a2a3a3a6a8aaa9a9a8a6a9a29e9c99938f8a857e766e6a625a50483f362d22180b02000000000000000000000000000a1723303d4a5663707d89969e9d9d9d9c9c9b9b9a9a9a9a9a9b9b9b9b9c9c9c9c9d9d9d9e9e9e9e9e9e9d9d9c9b99979892908c87837f79716d66605950443f382f261c100700000000000000000000000000000000000000000000000000000000000000000009151f2a333c42474850504b51535655534e463c32261b232e3740464b4c514b5153555754524c443a3025190d010000000000000000000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000613202d394653606c7884919d9fa2aaa3a5a8aaa2988b7e7164574d42362a1e1205000004101c2934404b5564717d8a989d9e9fa3aa9f92867b6e6153493f3327160c020000000006131f2c3845515c6775828f9b9e9fa3a1978a7e7164584e43372b1f1206000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c6f73808d949fa8b2bdc6cbc2bbafa49992867c6e685d544a3f362d23190f0500000004111d2a3744505d6a7783909daab1a5988b7e7265584b3f3225180c000007121d2831414b53595b5e555c6061636567666d6f6d685d52454b5153555d606365676869696867666563605c5554524c454039312b231a120900000000000000000000000000000000000000000000000003101c28343f4a546a7784909daab7c3cbbfb4ab968a7d7063574a3d3024170a000000000000000b17232e38424a50565d60696e747a7e83888c8f919797999a9a9b9c9c9b9a999897928f8b85807b726c655e564d443a31281d1108000000000000000000000000000000000a141d29333b454d565e666c71787e84888c90929997999a9b9c9c9c9b9a99989696918e8b86827d79726d67605b53493f33271b0f0300000000000000000c18232e43505c6976838f9ca9b6c2cfdcd7cbbfb4ab93877a6d6054473a2d2114070000000000000000000d1a2733404d5a6673808d99a6b3c0ccd9d7cbc0b5ab96897d7063564a3d3023170a0000000000000000000000000000000000000000000000000000101c2936434f5c6976828f9ca9b5c2cfc3b6aa9d9083776a5d5044372a1d1104000000020e1a26313c4754616d7a86929fabb5bfcbcfc5b8ac9f92867a6d6053473d32271b0d040000000000000000000000000000000000000000000000000009121b212931363a3b3a39352f281f160c0100000000000000000000000000000e1a2734414d5a6774808d9a9e9e9e9d9d9d9d9d9c9c9c9c9d9d9d9d9d9e9e9e9e9e9e9f9f9f9f9fa3a29f9e9d9d9c9b999797928f8c87827e79716c625f5850483f362d241b100600000000000000000000000000000a1724313d4a5764707d8a91919190908f8f8e8e8e8d8d8d8e8e8e8e8f8f8f8f9090909091919192929190908f8e8c8a8885837f7b76726d67605c544f473f332d261d140a00000000000000000000000000000000000000000000000000000000000000000000030e18212a31373a3b4344404547494947433c342a20151c252e353b3e3f44404546484a4746413a32291e1308000000000000000000000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000a1623303d495663707c89909192989596989b9d9f92857a6d6053473b31251a0e020000000c18232f3a4753606d7a86919091929896988f8275685e5241382d221704000000000004101c2934404b5565717e8b9291929995979083766a5f53473a2e211408000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c717e8a929da6b0bac4cdc2b9afa59f93877d706a5f564c42382e241b10070000000004111e2a3744515d6a7784909daab2a5988b7f7265584c3f3225190c0000010c161f2f3941484d4f514b5153555658545c6062605d564c414045474b515356585b5c5c5d5c5b5a595653514b4746413a352f271f1a11080000000000000000000000000000000000000000000000000006121f2c3844505c667885929eabb8c5c7baaea399887c6f6255493c2f2216090000000000000006111c2630383f444c52575f61676d71767b7f8285888a8c8d8e8f908f8e8d8d8b8885827e79736e69605b534d443b32291f160c0000000000000000000000000000000000020b17212a333b444c545b60666c71777b7f8386888b8d8e8e8f908f8e8d8c8b8a8784817e7a75716d66605d55504941382d22170b000000000000000000071b2835424e5b6875818e9ba8b4c1cedbdcd1baaea194877b6e6154483b2e2115080000000000000000010e1b2734414e5a6774818d9aa7b4c0cddad4c7bbafa399887b6e6255483b2f2215080000000000000000000000000000000000000000000000000000101d2a3643505d697683909ca9b6c3c9c3b7aa9d9084776a5d5144372a1e1104000000000915202d3946525e6874808d99a3aebbc5cfc6baaea2988a7e7164584e43372b1f160c01000000000000000000000000000000000000000000000007111b242c333b4246484745413a31281d130700000000000000000000000000000e1b2734414e5a6774818d929191919191909090908f9090909090909191919191919292929292929998929191908f8e8c8a8785827f7b76716d67615a534e463e362d241b12090000000000000000000000000000000815222f3b4855626e7c848584848383838282818180808181818182828282838383838484848585858484838282807d7b7976726e6965605d55504a423d3528221c140b020000000000000000000000000000000000000000000000000000000000000000000000060f181f262b2e2f372f35393a3c3c3b37322a22180e131c232a2f32332e34383a3b3d3a3936302920170d02000000000000000000000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000a1623303d495663707d848484858688898c8e90928e8174675d514539291f1409000000000713202c3945515d6774818484848687898b8a7d7063564d412f261b11060000000000000c18232f3a4754616d7a8485858687898a8c887b6e6255483b2f221508000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa295887c7c86929fa4aeb8c2ccc4bbb1a79e938c7f726b61584e443a30261c1209000000000004111e2b3744515e6a7784919daab2a5988b7f7265584c3f3225190c000000040d1e272f373d40424440454748494b4b51535554524c433a35393a4045474a4c4e4f50504f4e4d4c494645403a39353029241d150d0800000000000000000000000000000000000000000000000000000713202d3a4653606d7986939facb9c6c5b9ac9f9286796d6053463a2d20130700000000000000000a141e262e343a41454d53555d60656a6f7275787b7e7f80818283828181807e7b7976726d67615f575049413b322920170d04000000000000000000000000000000000000050f18212a323a424a50545b60646a6f72767a7c7e80818282838281807f7e7d7a7774726e6864605c54514b443f382f261b11060000000000000000000d192633404c5966737f8c99a6b2bfd1dcd4c8bbaea195887b6e6255483b2f2215080000000000000000020e1b2835414e5b6874818e9ba7b4c1cedad2c5b9ac9f9286796d6053463a2d2013070000000000000000000000000000000000000000000000000000111e2a3744515d6a7784909daab7bcbdbeb7aa9d9184776a5e5144372b1e11040000000005111d2935414c56616e7b86929fa9b3becacabfb4aa9c8f82766a6054473e31281d130700000000000000000000000000000000000000000000060f19232c363e454d535454514b433a2f24180d01000000000000000000000000000a1724303d4a5763707d8485858484848484838383838383838384848484848485858585858586868686858584838282807d7b7876726e6964605d555047433c332d241b1209000000000000000000000000000000000814212e3a47535f6a6e77787877777676757575747474747474757575757676767677777778787878787776767573716e6d6665615e5753514b443f38302b2317110a0200000000000000000000000000000000000000000000000000000000000000000000000000060e151a1e21222a24292c2d302f2e2b26201810070a12181e22252623282c2d2f312e2d2a251e170e0500000000000000000000000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000916222f3c4854606b70777777797a7b7d7f818486877d6f63554b403529170d030000000004111d2935404b55646f74787778797a7c7e7e726b6155443b301d140a000000000000000713202d3946525e686d777878797a7c7e80807b6e6154483b2e211508000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafa396897d839198a2aeb6c0cac6bcb2a99f958e81756d63594f463c32281e150a00000000000005111e2b3844515e6b7784919eaab2a5988c7f7265594c3f3226190c000000000c151e252c3134352f34383a3b3d3e404546494745413a31292c2f35393a3d3f414243434241403f3d3a38342e2d29241e18120b030000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8799a4afbbc7c3b6aa9d908377665c5145382c1f13060000000000000000020c141c23282f353b42464b5153585f626568696e71727374757676757473716e6c6565605d55534d443f382f2920170e050000000000000000000000000000000000000000060f1820292f383f444a5053585f6266676d6f7173747576767574737372706d686865615e5653514b454039332d261d140a000000000000000000000b1724313e4a5764717d8a97aab4bfcbd7d5c8bcafa295897c6f6256493c2f2316090000000000000000020f1c2935424f5c6875828f9ba8b5c2cedbd1c4b7aa9e918477665c5145382c1f13060000000000000000000000000000000000000000000000000000111e2b3844515e6b7784919eaaaeafb0b1b2aa9d9184776a5e5144372b1e110400000000010d1925303a46525e6974818d97a1adb9c2cdc6b7ab9f94897c6f62594f433a2f241811070000000000000000000000000000000000000000060f18212b353e4850575e61605d554b4135291d1104000000000000000000000000000916232f3c4855616b70787878787777777777767676767676777777777777787878787878797979797979787776767573706e696966615e5753514b433e37312a211b1209000000000000000000000000000000000006121f2b37434e585f626b6b6b6a6a6a69696868676767676768686868696969696a6a6a6b6b6b6b6b6b6a6a6968666462605c5454534d47454039342e261e1911060000000000000000000000000000000000000000000000000000000000000000000000000000000003090e1214151d181d1f202322211f1b150e070000070d12161819181c1f20222421201e19130d050000000000000000000000000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000713202c38444f5960636a6a6a676d6e707275777a7a6f6b6054433a2f2418050000000000010d18242f3a43535d64686b6a6b686d6f72726d62594f4432291f0b020000000000000005111d2a36414c565e616b6c656c6d6f7173746e695e53463a2d211407000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facb7aa9d91849195a0aab4bfc8cbbfb4aaa1969083796d605b51473e342a20160c0300000000000005121e2b3845515e6b7884919eabb2a5998c7f7266594c3f3326190c00000000030c131a2025272823292c2d2e302e34383a3c3a39352f281f2024292c2d30323435363635343332302d2c2823201d19130c0701000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c8995abb5c0ccc1b4a79b8e817468544b4034281c1004000000000000000000020a11171e242931363a40454c565e61686b6c6b696667676869696867666562605b5353514b46423b332d261d170e0500000000000000000000000000000000000000000000060e171d262d33383f44464e5355555d60626466686b6b6b6b6b6b676563615d565854524c46454039352f27221b140b02000000000000000000000915222f3c4855626f7b8898a3aebac7d3d6c9bcafa396897c706356493d3023160a000000000000000003101d293643505c6976838f9ca9b6c2cfdbcfc2b5a89c8f827569544b4034281c10040000000000000000000000000000000000000000000000000000121f2c3845525f6b7885929ea0a1a2a3a4a6a89e9184776b5e5144382b1e1105000000000008131e2a36424d57616d7a85929ea6b0bbc5c7bbb0a69c8f82766b61554b403529231911060000000000000000000000000000000000030a1117212a333d47505a61696e6d675d5145392c201306000000000000000000000000000714202c38444f5961636b6b6b6b6b6a6a6a6a6a696969696a6a6a6a6a6b6b6b6b6b6b6c6c6c6c6c666c666b6a6a69686664615e575954524d47454039312b2620180f09000000000000000000000000000000000000020f1a26313c464e53555e5e5e5e5d5d5c5c5b5b5b5a5a5a5b5b5b5b5c5c5c5c5d5d5d5d5e5e5e5f5f5e5d5d5c5b59575553504a4846423b38352f28231c150c070000000000000000000000000000000000000000000000000000000000000000000000000000000000000002060808070c101314161615130f0a040000000002060a0c070c10131315171413110d0802000000000000000000000000000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000004101c27333d474f54565e5d555d6062636568676d6d6860594f4331281d130700000000000007131d2831414b53595b5e5d565e61636565625b51473e3320170d0000000000000000010d1925303a444c52545e5f5b606162646667615e574d42362a1e1205000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facb9aca0959195a0a8b1bcc5cac1baaea39891847b6e675c51493f352c22180e040000000000000005121f2b3845525e6b7885919eabb2a6998c7f7366594c403326190d000000000002090f14181b1c181c1f20222323282c2d2f2d2c29241e1613181d202023252829292a2928272623201f1c1813110d08020000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdccc0b5ab988b7f7265584c3f2e23180c000000000000000000000000060b13191f262a2f3946525e686d7577797776716d665f575c5b5a5a585553504947454039363127221b140b05000000000000000000000000000000000000000000000000050b141c22282d33383c4347484b51535c676d75787878787878746e645b524c4b4746413b38342e29241d17110a0200000000000000000000000713202d3a4653606d7986929facb9c5d2d7cabeb1a4978b7e7164584b3e3125180b000000000000000004111d2935414c566a7784919daab7c4d0d9ccbfb3a6998c807366594d402e23180c000000000000000000000000000000000000000000000000000000131f2c3946525f6c798592949494959697999b9d9184776b5e5144382b1e11050000000000020e1a25303b46525e68717e8b949fa9b3bec7c2b7aa9f948a7d70675d51453f352b2317110a0300000000000000000000000001050a0c151c2328333b454f59616c717b796d6054473a2d2114070000000000000000000000000004101c28333e474f55575e5f5e5e5e5e5e5d5d5d5d5c5d5d5d5d5d5d5e5e5e5e5e5e5f5f5f5f5f5f5b605b5e5e5d5c5b595754534d4c4746423b38352f271f1a150e0600000000000000000000000000000000000000000915202a333c434748515251515050504f4f4e4e4d4d4e4e4e4e4f4f4f4f505050505151515252525151504f4f4d4a4846443f3b3a36312c29241d17110a0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000406070909080603000000000000000000000000040607080a070705010000000000000000000000000000000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000b16212b353d44484951514b5153555659555c60615e564f473d321f160c01000000000000010c161f2f3941484d4e51514c52545658585651493f352c210e0500000000000000000008131e29323a41464751495053545657595a54534d453b31251a0e02000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facb9b1a7a09da0a7b1bac3ccc1b8aea49f92867c6f695e554b40372d231a0f06000000000000000005121f2c3845525f6b7885929eabb3a6998c807366594d4033261a0d0000000000000004080c0e070c1013141516181c1f202221201d19130c070d10131417191b1c1d1d1c1b1a19161313100c07050100000000000000000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec7bbafa499897c6f6356493c302316070000000000000000000000000001080d141a212e3a4754616d7a81848584827e786e6a625b524d4d4b4846443f3a39352f2a261f17110a020000000000000000000000000000000000000000000000000000020a11171c22282b31373a3c444f59606d798284848484848480746d62584e433b3936302c28231d18120b060000000000000000000000000006131f2c3845515c667683909ca9b6c3d0dcccbfb2a6998c7f7366594c403326190600000000000000000713202c3945525d687985929facb8c5d2d4c8bdb2a8968a7d7063574a3d30241707000000000000000000000000000000000000000000000000000000121f2b3845525e6b788588878788898a8b8c8e909184786b5e5145382b1e120500000000000009141f2935414c56606c77839097a2acb6c0c7bbb0a69e9184796d605a50473d3528231c150c0a06030000000000000406080d11161b1e262e343d454d57606b717e868074675a4e4134271b0e01000000000000000000000000000b16212c353e44484a51525251515151515050505050505050515151515151525252525252534a5053504a51504f4f4d4a4846423f3b3a36302c29241d150d0903000000000000000000000000000000000000000000030e18212a31373a3b444545444443434242424141414141414242424243434343444444454545454544434342403e3b3a38342e2d2a251f1d18120c060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000050f19232b33383c3d4444404547484a4c4b515354524c443d352b210d040000000000000000040d1d272f373c40414544414647494b4b4a453f372d231a1000000000000000000000020c1720293036393a443f444647494b4d4d4846423b33291f140900000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facb9b9b1acaaacb1b9c3ccc3b9b0a69c928a7e716a60564d43392f251c110800000000000000000005121f2c3845525f6b7885929eabb3a6998d8073665a4d4033271a0d0000000000000000000001000004060708070c101313161413110d080100010406070a0c0e0f10100f0e0d0c0a0706040000000000000000000000000000000000000000000000000000000000000000000000030f1b27333f49536774808d9aa7b3c0c6b9ac9f93867a6d6054473a2d211407000000000000000000000000000000030915222f3c4855626f7b869192918f8a837c726d615e565045413a37332d2c29241d1a140b06000000000000000000000000000000000000000000000000000000000000060b11171c1f262b35414c56606b74808d9191919191918b7f726a5f554b40342a251f1c18120d0701000000000000000000000000000004101c2834404b546673808d99aab4bfcbd6cdc0b4a79a8d8174675a4e412e23170b00000000000000000714212d3a4754606d7a8798a2aebac6d3d1c5b8aca096877a6d6154473a2e2114070000000000000000000000000000000000000000000000000000000714212e3a4754616d7a7b7a7a7b7c7d7e7f82848683766a5d5043372a1d1004000000000000030d1925303a44505b656e7b85929aa4afbbc0c2b9aca1968e81746c62594f473e342e261e1b16130f0a0c0c0c070c101213191d20272b30383f444e575f696f7d878f8275695c4f4236291c0f030000000000000000000000000005101a232c33383c3d45454545444444444443434343434344444444444445454545454546463f4446443f44434342403d3b3a36312e2d2a251f1d18120b03000000000000000000000000000000000000000000000000060f1820262b2e2f38383837373736363535343434343435353535363636363737373838383838383737363533312f2d2b2823211e1a14100c0701000000000000000000000000000000000000000000000000000000000004060500000406070807050200000000000000000000000000000000000000000000000001040707090807060400000303040505050000000000000000000000000000000000000000000000000000030303020101000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d201407000000000000000000000102020304000000000000000000000000000007111921272c2f30372f35393a3b3d3f4045474746413a322b23190f000000000000000000000b151d252b303435383035393a3c3f3f3d3a342d251b11080000000000000000000000050e171e252a2d2e2d3337393a3c3e40413b3a36312921170d0300000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facb9c3bcb8b7b8bcc3cbc5bbb1a79e948d80736c61584e443b31271d130a0000000000000000000006121f2c3945525f6c7885929fabb3a69a8d8073675a4d4034271a0d000000000000000000000000000000000000000406070907060401000000000000000000010203030201000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3744505b657683909ca9b6c3c0b6ac9c908376675d5145392c201306000000000000000000000000000000000815212e3a47535f6a717e8b929e9c9590867f766e68615a514c433d342e271e18120e0903000000000000000000000000000000000000000000000000000000000000000000060b151e2a333c46525e68707d88939e9e9e9e9e9e92867c6f675c51453e32291d140c070000000000000000000000000000000000000c18232e3d4a5663707d8998a3aebac7d3cfc2b5a89c8f827569544a3f34281c1003000000000000000915222f3c4855626f7b8895aab4bfcad6d0c4b7aa9d918477685e5246392d2013070000000000000000000000000000000000000000000000000000000713202d3946525e686d6e6e6d6e6f707173757779786d6053463a2d201307000000000000000008131e27333f49535e69707d88939fa4aeb7c1bdb2a89d928b7e716b605950443f38302c27211f1b1a19181919181c1f2025292d32383d424a505860696e7b85928f8376695c504336291d0700000000000000000000000000000008111a21282c2f30383838383837373737373636363637373737373838383838383939392d33383938332d37363533312e2d2a2521201e1a14100c07010000000000000000000000000000000000000000000000000000060e151a1f21222b2b2b2b2a2a292928282827272728282828292929292a2a2a2a2b2b2b2c2c2b2a2a2928262422201f1c1714120e09040000000000000000000000000000000000000000000000000000000001040607111212070c1012131414110e0902000000000000000000000000000000000000000002080d11131416151413100c07101011121211090907030000000000000000000000000000000000000205070810100f0f0e0d0d0c0b0b0a0a0a0909090f1b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d2014090909090a0a0a0b0c0c0d0e0e0f10110c0c09060100000000000000000000070f161c2022232b24292c2d2f302f34383a3a393530282019100700000000000000000000030b131a202427282b25292d2e303232312e29231b120900000000000000000000000000050c13191d202122272b2d2e2f3133342e2d2a251f170f050000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5c8c5c4c5c8cec7bdb3a9a0958f82786c605a50463d32291f150b010000000000000000000006131f2c3946525f6c7985929facb3a79a8d8074675a4d4134271a0e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c7985929fabb8c5bbafa49a8b7f7265554b4135291d11040000000000000000000000000000000006121f2b37434e58626c73808c939d9f98928b827a716c605d554f4540393027221b140b0500000000000000000000000000000000000000000000000000000000000000000006111c26303c45505a616d7a85919aa4ababababa3989083796d60594f443b2f261b11060000000000000000000000000000000000000714202d3a4753606d7a86929facb8c5d1d0c3b7aa9d908477665c5044382b1f1206000000000000000a1724303d4a5763707d8a96a3b0bdd0d6cabeb3a99a8d807367564c4135291d110500000000000000000000000000000000000000000000000000000005111d2935414c565e61616161616263646668666d6d665c5044382c1f12060000000000000000020b17222d38414d57616b73808c929da5afb7bfbaafa59f92867d6f6b615a504a423d38322e2b26262625252623282c2d3035393d43474f545c606a6f7b8491979083766a5d50432f24180c000000000000000000000000000000000810161c2023242b2c2b2b2b2b2b2a2a2a2a292a2a2a2a2a2a2b2b2b2b2b2b2c2c2c2c22282b2d2b28222a2928262421211e1a1414110e090400000000000000000000000000000000000000000000000000000000000003090f1214151e1f1e1e1d1d1d1c1c1b1b1a1a1b1b1b1b1c1c1c1c1d1d1d1d1e1e1e1f1f1f1e1e1d1c1c1a17151312100b0605020000000000000000000000000000000000000000000000000000000001080d1113141d1f1e1d181c1f2021201e19140b06000000000000000000000000000000000000040c13191d20212221201f1d181c1c1d1e1e1f1e1615130f0a04000000000000000000000000000003090e1214151d1d1c1c1b1a19191817171616161616151b2835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d2015151616161617171818191a1a1b1c1d1d191816120d0700000000000000000000050b101316161e181d2020222323292c2d2e2d29251e160e0700000000000000000000000001090f14181a1b1e191d202123252524221d18110900000000000000000000000000000002080d111314171b1f20212324262721211e1a140d05000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5d2d1d0d1d4cbc0b5aba2979183796d665b50483e342b20170d03000000000000000000000005121f2b3744505b657986929facb4a79a8d8174675a4e4134271b0e000000000000000000000000000000000000000000040607090d0e0f10111110100e0c0906060300000000000306070605030000030000040607060400000000000000000000000000000000000000000000000815222e3b4855616e7b8897a2adbac6b9ac9f93877b6e6154473b2f24180d0100000000000000000000000000000000030f1a26313c46505a636d74818e949ea29f948f857e746d676059514b423c332d261d170e0801000000000000000000000000000000000000000000000000000000000000040d17232e38424d57626c75818f97a1acb6b6b7b4aaa0958d80746b61564c41382d22170d0300000000000000000000000000000000000613202c3945515d6775828f9baab4bfcbd2c5b8ac9f9285796d6053463a2d201307000000000000000c1925323f4c5865727f8b98a5b2becbd3c6baada297897c706356493d3025190d01000000000000000000000000000000000000000000000000000000010d1925303a444c52545554545556575859545c60605c544a3f34281c100300000000000000000006111b262f3b454f59636e74808d939ea5adbabfbaaea39892867d706c605c544f48443d3b373233323232332e34383a3c4146474e545960666d737c8591969d9184776a554b4035291d100400000000000000000000000000000000050b101416171e1f1f1e1e1e1e1e1d1d1d1d1d1d1d1d1e1e1e1e1e1e1f1f1f1f1f1f171c1f201f1c171d1c1c1a171514120e090705020000000000000000000000000000000000000000000000000000000000000000000002060808111212111110100f0f0f0e0e0e0e0e0e0f0f0f0f1010101011111112121212121110100f0d0b0807060300000000000000000000000000000000000000000000000000000000000000040c13191d20212a2c2b2a23282c2d2e2d2a251f17110a02000000000000000000000000000000050e161e24292c2d2f2e2d2c292429292a2a2b2c2b23221f1b160f07000000000000000000000000050d141a1e2121292a292828272625252423232323232222222835424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2d22222222232323232424252627272829292a2625221e18110a01000000000000000000000407090a070d1113141517181c1f2021201d19130c0400000000000000000000000000000003080c0e0e080d1113141618181815120c06000000000000000000000000000000000000010507060b0f12131416181a1a1514120e090300000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5d2dfddd4cac2bbafa39992857b6e675d544a3f362c22190e050000000000000000000000000613202d394653606c798699a3afb4a79a8e8174675b4e4134281b0e00000000000000000000000000000000000004070c10131316191b1c1d1d1e1d1c1b191613120f0b0600060c10121313120f0b060f070c10121312100c070000000000000000000000000000000000000000000a1724313d4a5764707d8a97a9b3bec3b6a99c908376695e52463a2d1d13070000000000000000000000000000000000000a15202a343f48525b606d78828f959fa69e97928a817a6f6b605c544e443f382f292019130c0400000000000000000000000000000000000000000000000000000000010c161f28343f4a545f69717e8b939ea9b1abaaabadb1a79d928a7d70685e53493f33271f150b010000000000000000000000000000000004101d2935404b5564717e8a98a3aebac7d3c6baaea298887c6f6255493c2f22160900000000000005111e2a36414c566875818e9ba8b4c1ced2c5b8ab9f9285796d6053463a2d201308000000000000000000000000000000000000000000000000000000000008131e28323a41464748474748494a4b4c4a505353504a42382e23170c00000000000000000000000a141d29333e47525c606c78818e939ca3aeb4bcb4aaa29892867e736d666059544f49474341403f3f3f4040404446494c52545860626b6f787f879297a09e918478675d5145392c1f13060000000000000000000000000000000000000407090a121212121111111111101010101010111111111111121212121212130b0f1213120f0b06100f0d0a08070502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d161e24292c2d373938372e34383a3b3a363027221b140b0200000000000000000000000000050f1720283035393a3c3b3a38352f36363637383838302f2c272119100700000000000000000000050f171f252a2d2e36363635343433323231303030302f2f2f2f2e35424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473a2e2e2f2f2f2f3030303131323333343535363732312e2a231c130a0000000000000000000000000000000104060708070c1013141413110d08020000000000000000000000000000000000000001020001050707090c0c0b09050100000000000000000000000000000000000000000000000003050607090b0d0e08070502000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5d2dfd6ccc2b8afa59f92877d70695f554c42382d241b1007000000000000000000000000000714202d3a4753606d7a8693a0b5b4a79b8e8174685b4e4135281b0e00000000000000000000000000000000070c1013181c1f2023262728292a2b2a29272523201f1c17110f11171c1f20201f1b171c1c1d181c1f201f1c18120b0300000000000000000000000000000000000005111e2a36414d566673808d99a6b3c0bbb0a6988c7f7265574d42362a1e0c01000000000000000000000000000000000000030e18222d364044505c666d79839096a0a9a19e938e847d736d665f585049413b3329241e160d0700000000000000000000000000000000000000000000000000000007131d28313a44505c666e7b86929fa5afa79f9d9fa2a9aea49e92857a6e655b50443c31271d120700000000000000000000000000000000010d18242f3a4754606d7a86929facb9c2cdcabfb4aa988b7e7265584b3f31251a0e0000000000000713202d3946525e687784919eaab7c4d1c8bcb1a79a8d8174665c5044382c1f12060000000000000000000000000000000000000000000000000000000000020c1620283035393a3b3b3a3b3c3d3e403f444646443f3830261c11060000000000000000000000020b17212c354044505b666d78818c919fa2aab1bab4aaa298928880786f6b63605955534e4e4d4c4b4c4c4d4a515356565e61656a6f767c838c9299a1a99f92867a6d6053473a2d2014070000000000000000000000000000000000000000000005050505050404040404030303030404040404050505050505060600000306060603000003020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306070807060401000000040607080706040100000000000000000000000000000000000000000000000002060808070604000003030404000003060707060400000000000000000000010c161f282f35393a44454543424044464746423b332d261d140a000000000000000000000000020b172129323a414547494847454044434343444545443c3b38322b23190f040000000000000000030d17212931363a3b434342424140403f3e3e3d3d3d3c3c3c3c3b3b3b424e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053473b3b3b3b3c3c3c3c3d3d3d3e3f3f4041414243443f3e3a352d251c1107000000000000000000000000000000000000000000040607070705010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5d2d7cec4bab0a69d938b7f726b60574d433a2f261c120900000000000000000000000000000714212e3a4754616d7a8794a0adb5a89b8e8275685b4f4235281c0f0000000000000000000000000000060b12181c1f23282c2d30333435363737373634322f2d2b28221c1b1c23282c2d2d2b272229292923282c2d2c28231c150c0800000000000000000000000000000000000714202d3946525e687783909daab6c3b7ab9f94877b6e6154483b30251a0e000000000000000000000000000000000000000006101b2428343f4a545d676d7a849197a1aaa59d96918780796e6a605b534d453e352f281f19110800000000000000000000000000000000000000000000000000050e18242f3a434f59606d78839098a2aea79f95909297a2a9ada1978f82776c60584e43392f24180e05000000000000000000000000000000000713202c3945525d6874818e9ba6b0bcc7d0c1b4a89b8e817568574d42362a1c120700000000000714212e3a4754616d7a8796a0acb9c5d1c4b8aca095887c6f62544a3f34281c1003000000000000000000000000000000000000000000000000000000000000040e161e25292d2e2e2e2e2e2f30312e34383a3a38342e261e150a00000000000000000000000000050f1a2328333f4a545c666d747f8a92989fa7aeb4b4aaa29a938d837c756f6b66625f585b59595858595a545c606266686d72777c828990959fa3abaea399897d7063564a3d3023170a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b101213151413110d07070c101313141413110d0801000000000000000000000000000000000000000003090e1214151313100c0710101111060b1012131313100c07000000000000000008131e28313a414547505251504f4a515354524d443f382f261b110600000000000000000000000a141d29333b444c5254555453514b504f4f50515152514948433d352b21160a000000000000000009141f29333b42464850504f4f4e4d4c4c4b4a4a494949494948484848474e5b6875818e9ba8b4c1ced3c6b9ada093867a6d6053474748484848494949494a4a4b4b4c4d4d4e4f50504c4a463f372d23180d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5d2d0c6bcb2a89f948e81746d62594f453c31281d140a0000000000000000000000000000000814212e3b4754616e7a8794a1adb5a89b8f8275685c4f4235291c0f000000000000000000000000020a11171d23282c2e34383a3c4041424344444343413f3c3938332d2c27262e34383a3937332d3636362e34383a38342e271e1a1208000000000000000000000000000000000814212e3b4754616e7a87939facb9bcb1a79c8f8276695e53463a291f1409000000000000000000000000000000000000000000091217232e38424b555e686e7b859198a2aba8a199938d837c726c655e575045413a312b231a12080000000000000000000000000000000000000000000000020b17202935414b55606b73808c959faaa79f959083859297a1a9a99f948b7f726a5f554b40352920170b0200000000000000000000000000000004111d2935414c56626f7c88949fabb7c2d0c4b7aa9e918477695e5346392e23180c0000000004101c2834404b5564707d8a97a8b2bdc9c8bdb2a89d9083776a605442382e23170c0000000000000000000000000000000000000000000000000000000000000000040c13191d20212221212223242523282c2d2d2c28231c150c030000000000000000000000000000081117222d38424a545c606d737e8690959fa3aaafb4aca49f959087827c77736f6a696766656565666768666d6f73767a7f83898f949da0a7aeb4b0a9998d8073665a4d4033271a0d000000000000000000000000000000000000000000000000000000000000000003060708090a0b0b0b0a0a09080807060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171c1f202121201d181c1d181c1f202121201d19130c04000000000000000000000000000000000001070c151a1e2122201f1c181c1d1d1d1e1e171c1f20201f1c18120b030000000000010d19242f3a434c51545d5f5e5d5c545c60615e56504941382d22170d0300000000000000000006111c262f3b454d565d606261605d555d5c5c5d5d5e5f5e56544f473d32271b0f03000000000000020e1a25313b454d53545c5d5c5b5b5a595858575656565656555555555454545b6875818e9ba8b4c1ced3c6b9ada093867a6d60545454545555555556565656575758595a5a5b5c5c5d595751493f352a1e120600000000000000000000000000000000000000000000000000000000000000000000000000000005080a0b11110f0e101112110807050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5d2c7beb4aaa1969082786d605b51473d332a1f160b020000000000000000000000000000000815222e3b4855616e7b8894a1aeb5a99c8f8276695c4f4336291c100000000000000000000000050c141c23282e34383a404546494c4e4f505051504f4e4c4946443f38383230383f444646443f4342424343404446444039302c241a1005000000000000000000000000000004101c2834404b5464717e8b9aa4afbbb8ab9f95897d7063574d42362a1e12050000000000000000000000000000000000000000000006111c263039434c565f696f7c869299a3acaba49f9590867f776e69615a524c433d352c241a1005000000000000000000000000000000000000000000000a141d29333b45515d676f7c87929fa7a79f9590837a7c859297a1a9a69f92867c6f675d51453e32291d140a000000000000000000000000000000010d19242f3a47545f6a7683909ca6b0bdc7c5b9aca096877b6e61544a4034281c10050000000a131f2c3845515c6774808d9aa7b3c0cfc7b9aca0968b7e7164584e4330261c110600000000000000000000000000000000000000000000000000000000000000000002080d11131415141415161718171c1f20201f1c17110a030000000000000000000000000000000006111c262f38424a505b636c717b838c92989fa4acafafa7a09a938f89837f7c7876747372727273737577797c7f83868b90959c9fa6acb1b2aca69f978f8275685c4f4235291c0f020000000000000000000000000000000000000000000000000000030607060b10121315161717181817161615141312100b0607070401000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c141c23282b2d2e2d2c2924292923282c2d2e2d2c29241e160d04000000000000000000000000000000030b121820262b2e2f2d2c282329292a2a2b2b23282b2d2d2c28231d150c0b0200000004111d2935414c555d606a6c6b6a696a666d6e69605b53493f33271f150b0100000000000000030d17222d38424d575e686d6f6e6d676b6a6969696a6b6b6b6360594f43382c1f130700000000000005121e2a36424d575e6169696968676766656564636363636262626261616161616875818e9ba8b4c1ced3c6b9ada093867a6d616161616161626262626363636464656666676868696a65635b51463a2e22160900000000000000000000000000000000000000000000000000000000000000000000000000060c111517181e1d1c1b1c1e1f1d1514120e09030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5ccc0b6aca29891847a6d665c51493f352b21180d04000000000000000000000000000000000915222f3c4855626f7b8895a2aeb6a99c908376695d5043362a1d1000000000000000000000060f171e262e34394045464b515356595a5b5c5d5e5d5c5a585653504a48433d3a424a50535350494f4f4f50504a5153514a423e362c22170b000000000000000000000000000006131f2c3845515c6675828e9bacb6bdb2a89d9083766b6054453b31251a0e0200000000000000000000000000000000000000000000000a141e27313a444d575f6a707d87929aa4afafa7a098928b827b716c605d564f473e362c22170b00000000000000000000000000000000000000000006111b262f3b45505a606d79849199a3a79f959083796d6f7c859297a1a9a3989183796d60594f443b2f261b110600000000000000000000000000000008131e2b37434e5863707d89949fabb5c0c9bdb2a8998c8073665c5144382c20170d060609111b262f3a4653606d7985929eabb8c5c7bdb1a79e9184786d6053463c3220150a0000000000000000000000000000000000000000000000000000000000000000000000000105070708080708090a060c1012131312100c06000000000000000000000000000000000000000a141d2630383f44515a61696e787f868e939a9fa4acaeaca49f9b95908c88858381807f7e7f7f80828486898c8f92999d9fa7abb0afaca8a09e9490857c6f6255493c2f22160900000000000000000000000000000000000000000000000105060c10121316171c1f202223232425252423222221201f1c17161413110d0805020000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141e262e34383a3b3a39352f36362e34383a3b3a39352f281f160c0100000000000000000000000000030d151d232931373a3b3a38342e3636363737382e34383a3a38342e271e1d140b0100000613202c3945515d676d77787876757678797a756c655b50443c31271d1207000000000000010b151f28333f4a545e696e7a7c7b7a797877767676777878776f6b6054483b2f2215090000000000000714212d3a46535e696e767675757473737271717070706f6f6f6f6e6e6e6e6e6e6e75818e9ba8b4c1ced3c6b9ada093867a6e6e6e6e6e6e6e6e6f6f6f6f707070717272737474757677726d63574a3e3125180c0000000000000000000000000000000000000000000000000000000000000000000000000910171d2124252b2a2928292a2c2a21201e1a140d0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facb9c0bfbbafa49a92867c6f685e544b40372d23190f0600000000000000000000000000000000000916232f3c4956626f7c8995a2afb6a99d9083766a5d5043372a1d10000000000000000000060f18212930383f444b5153545c6063666768696a6a6a69676562605b54544f48434c545c60605b535c5c5c5c5d545c605c5450483e33281c1004000000000000000000000000000713202d3a4653606d7985929fabb8b8aca0968a7d7064594f4433291f1409000000000000000000000000000000000000000000000000020c151f28323b454e58606b717e88939fa4aeb1aaa39f948f857e756d68605950483e33281c100400000000000000000000000000000000000000030d17222d38414d57616c74818e96a0a79f9590837a6d676a6f7c859197a1a9a0958d80746c61564d41382d22170d030000000000000000000000000000010f1b26323c4854606b76828f99a4afbbc3c4b8ab9e9185796d6053463e32291f171313141a222d38414e5864717e8a97a1adb9c6c0b5aba0958b7e71665c5044382c1f1203000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030607070603000000000000000000000000000000000000000000020b151e262e34404850575f666d737b81878f939a9fa2aaacaca7a09d999792908e8c8c8b8b8c8d8f919299999c9fa3ababaeacaca49f9c96918b837b6f6a6054473b2e22150800000000000000000000000000000000000000000004080d1113171c1f202323282b2d2e303031323131302f2e2e2d2b28232321201d1914110e090401000000000000000000000000000000000000000000000000000000000000000000000000000006111c2630383f44464847454144434344404546474745413a31281e1308000000000000000000000000010b151f272f343c42474846454042424343444445453f444646454039302f261d130800000714212d3a4754606d7a83858483828385868781776c60584e43392f24180e05000000000007121d27313944505b666e7b85888786858483828283848485847d6f6356493c302316090000000000000815212e3b4854616e7b8283828281807f7f7e7d7d7c7c7c7c7c7b7b7b7b7a7a7a7a7a818e9ba8b5c1ced4c7bbaea194887b7a7a7a7a7a7b7b7b7b7c7c7c7c7d7d7e7e7f8080818283837f7265594c3f3226190c000000000000000000000000000000000000000000000000000000000000000000000009121b22282d303137373535363738372e2d2a251f170f05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facafb5b2afa59f93887e716a5f564c42392e251b1108000000000000000000000000000000000000091623303c4956636f7c8996a2afb5aa9d9084776a5d5144372a1e110000000000000000061018212a333b424a50545c6065666d6f737475767777767674726f6c66636059554f555d666d6c656969696969696b666d66615a5044392d21140800000000000000000000000006121f2b37434e5864717e8a97a2adbab1a79d9184786c6053463d3320170d0300000000000000000000000000000000000000000000000000030d162029333c464f59616c727f8c929da5afb4aea69f97928a817a706b615a5044392d201408000000000000000000000000000000000000010b151f27333f49535e69717e8a939da79f9590837a6d685d5f6a6f7c859197a1a79d928a7d70685e53493f33271f150b0100000000000000000000000000000a15202c38444f59626f7c87939fa7b1bcc6b9ada1978a7d71645a50443a312823201f20252a333f49535f6a7683909ca9b3bec4bbafa3999083786d60544a3f34281c100300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c151c2328363e454d545c60696e757c82878d92989b9fa2aaa9aaa9a29f9c9a99989898999a9b9d9fa3aba9acaba8aba39f9c9a93908a847e776e6960584e43372b1f130600000000000000000000000000000000000000070c1013191d2023282c2d2f2e34383a3b3c3d3e3e3e3d3d3c3b3b3a38342e302d2c2924201e1a14110d08010000000000000000000000000000000000000000000000000000000000000000000000000b17232e38424a50535454514b504f50504b51535454524c433a2f24190d01000000000000000000000007121d27313940454d535553514b4f4f5050505151524a505353514b4240382f24190e03000714202d3a4753606d79859291908f909193938c7f726a5f554b40352920170d02000000050e18242f39434e58606c7882909794989291908f8f909091928b7e7164584b3e3125180b0000000000000b1824313e4b5764717e8a908f8e8e8d8c8b8b8a8989898989888888888787878787878e939eaab6c3d0d0d0bcb0a3988d8887878787878788888888898989898a8a8b8c8d8d8e8f8f9084776a5e5144372b1e1100000000000000000000000000000000000000000000000000000000000000000000040d1b242d34393d3e44444241434445443b3a36302921170d030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929e9fa3aba5a79e938c80736c61584e443a30271d1309000000000000000000000000000000000000000a1723303d4a5663707d89969fa3aba49e9184776b5e5144382b1e1100000000000000030c18222a333c454d545c60666d7276797c7f81828383848382817f7c79746f6b6361595d676d797977767675757676777979716c6155493c3023160a0000000000000000000000020c14212e3a47535f6a76838f9ca9b3b6aca0958b7e71665b5044382b1f1205000000000000000000000000000000000000000000000000000000050e17212a343d47505a636d74808d939ea6b0bab0a9a29f938e847d706c6155493c3023160a00000000000000000000000000000000000007121d27313944505b656e7b85929ea59f9590837a6d685d56585f6a6f7c859196a1a49e92857a6e655b50443c31271d1207000000000000000000000000000004101c27333d47535f6a73808d95a0aab4bdbeb3a99c8f82766c61564c433b342e2d2c2d30363e44505b656f7c88949fabbbc4bbb1a79f92877c6f665c5042382e23170c000000000000000000000000000306060807060300000102000105070707060401000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a1117242c333c424a50575e616a6f757b80858a8e9298999c9fa2a9a4a6a7a6a5a5a5a6a6a7a6a6a4aba39f9e9b9899928f8b87837d78716c655f574e463c32271b0f030000000000000000000000000000000002080e12181c1f252a2d2e34383a3c3f3f444648494a4a4b4b4a4949484746443f3f3d3a39352f2d2a25201d19130c070000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a545c6061605d555d5c5c5d555c6061605d564c4135291d110400000000000000000000071118232f39434b51575f62605c545c5c5c5d5d5e5e5f5f5c60605c54524a40362b1f1307000613202c3945515d676f7d86929a9c9d9e9f9f92867c6f675d51453e32291e13080000020c16202935404b555f6a727f8c949fa9a29f9e9d9c9c9c9d979183796d6053463a2d2013070000000000000a1723303d4a5663707d89969c9b9a9a999898979696969695959595949494949494949b9ea5afbbc4c4c4c4c4b4a99f9894949494949494949595959596969697979899999a9b9b9c908376695d5043362a1d10000000000000000000000000000000000000000000000000000000000000000000010c161f2d363e45494b51504f4e4f5152504846423b33291f14090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c79869192929996989b958f81776c605a50463c32291e150b01000000000000000000000000000000000000000a1724313d4a5764707d8a92929995979a9185786b5e5245382b1f12000000000000000b151e2a343c464e575e666d71797e8285898c8d8e8f9091908f8d8b8985817c77706b61606d7a8586848382828283838485867e7164574a3e3124170b000000000000000000000008131e2935404b55626e7b88949fabbbafa49a9083786d60544a3f33281c0f0300000000000000000000000000000000000000000000000000000000060f19222b353e48515b606c78818e949fa7b1bab3ada59e9691877e7064574a3d3124170a0000000000000000000000000000000000000c18232f39434e58606c77828f97a2a09590837a6d685d564c4e585f6a6e7b849196a1a1978f82776c60584e43392f24180c0500000000000000000000000000000b16212b37434e58606d79839098a2abb5c0b7ab9f948a7e71685e554d443f3b3a393a3b42465059606c77828f9ca6b0bcbcb2a99f958d80736a60544a3f30261c11060000000000000000000000060b0f1213151312100b060e0e080d1113141413110d080100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121a212a30383f444d53586062696e747a7d8185898c8f92979697999a9b9b9c9c9b9b9a9a9998969992918f8c8986837f7b76716c66605b534d453c342b20150a00000000000000000000000000000002080d14191d23282c3036393a3f4446494c4a5053555656575858575655555453504a4c494745413b3a36302c29241e18120b03000000000000000000000000000000000000000000000000000000000000000006121f2b3844505c666d6e6d676b6a69696a6b676d6e6d685d5245392c201306000000000000000000060f19232934404b555c60696e6d6669696969696a6a6b6b6c666d6d66645c52473c3024170b0004101d2935404b55606b717e88939fa4abaca3999183796d60594f443a30251910070008131e28323a45515d676f7c87929fa6b0aeacabaaa9a9a39992857b6e675c5145382c1f13060000000000000916222f3c4955626f7c8895a2a8a7a6a6a5a4a4a3a3a3a2a2a2a2a1a1a1a1a1a1a1a1a8aaafb7b7b7b7b7b7b7b7b7a9a3a1a1a1a1a1a1a1a1a1a2a2a2a2a3a3a3a4a5a5a6a7a7a89b8f8275685c4f4235291c0f00000000000000000000000000000000000000000000000000000000000000000008131e28313e485056585e5d5c5b5c5d5f5d54524d453b30251a0e020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020f1c2835424f5b68758184858687898c8e8e83796d655b50483e342a20170c0300000000000000000000000000000000000000000915222f3c4855626f7c85858687898a8d8f85786b5f5245382c1f1200000000000007121c27303c464e585f696e787e848b8f9298999a9b9c9d9d9d9c9a9897928e89837d766e696e7b879291908f8f8f8f9091928c807366594d4033261a0d00000000000000000000010d1924303945515d6774808d9aa6b0b3a99f93887c6f665c5042382d22170b00000000000000000000000000000000000000000000000000000000000007101a232c363f44505b666d79829095a0a8b2bbbaafa8a1998f8275685c4f4235291c0f020000000000000000000000000000000004101c2934404b555f6a727f8c949fa09590837a6d685d564c43464e575f696e7b849196a19f948c7f726a5f554b40352922170b0000000000000000000000000000050f1b26323c45515c666f7c869299a3afb5bdb0a69e91857a6d675e57504a47464547484d525a616b727f8b949fabb8bbb3a9a1979083796d60584e42382e1e150a00000000000000000000020a11171c1f2021201f1c171b1b1b1c191d202121201d19130c04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f181e262e343b42464e54575f62676d7175797d7f828587898b8c8d8e8e8f8f8e8e8d8d8c8b89888684827f7c7976726e6964605b545049413c332b22190e040000000000000000000000000000060c13191f252a2e34383a4146474a50535659545c606163636465646463626161605c54585654524c4746423b39352f28231c150c08020000000000000000000000000000000000000000000000000000000000000713202d3a4653606d797b7a7978777676777879797a7a6d6054473a2d2114070000000000000000030d17212b353d45515c676d767b797776757576767777787878797979746e64584c3f33261a0d00010d18242f39434f59616c727f8c929da5afaba0958d80746b61564c41362a22190e060f1925303a444f59606d79839199a3aeb8bab8b7b6aea49f92877d70695f554b4034281c10040000000000000815222e3b4855616e7b8894a1aeafaeaeadb5afacacacabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababacacacafb6aeaeafafa79a8e8174675b4e4134281b0e0000000000000000000000000000000000000000000000000000000000000000010d19242f3a43505a61646a6a6868696a6b6a615e574d42362a1e14080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414d59656f757778797a7d7f81817a6d675d53493f362c22180e050000000000000000000000000000000000000000000815212e3a47535f6a6f7879797a7c7e80837f7366594c403326190d0000000000000c18232e39424e585f6a6e7b838b91969c9fa2aaa7a8a9aaaaa9a9a7a9a19e9b95908a827b706d7a87939e9c9c9c9c9c9c9e998c7f7266594c3f3326190c0000000000000000000005111d2935414c56606d7985929fabb8ada2978e81746b60544a3f2f261c11060000000000000000000000000000000000000000000000000000000000000008111b2428333f4a545c676d7a839096a1a9b3bbb3aaa1978d8073665a4d4033271a0d000000000000000000000000000000000006131f2c3845515c676f7c86929fa09590837a6d685d564c443a3c454e575f696e7b849196a09f92867c6f675d51453e33281c100400000000000000000000000000000a15202834404b545f6a707d87929fa4abb4b9ada1979083796e69605c545453515355575e616c717d87929fa6b0bab2a9a29791857b6e675c51463c30261c0c03000000000000000000020b141c22282b2d2e2d2b28232828282825292d2e2d2c29241e160d04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c141c232831363d43474d53555d6064676d707376797b7c7e808181828282828181807f7e7c7b797875726f6d6765615e5653504a443f382f2a2119100700000000000000000000000000030a11171e25293036394045464c5254545c60626668666d6e6f7071717170706f6e6e6d66676563605d5654524d4745413a342e271e19140d0500000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f87878584838283838485868784786b5e5145382b1e1205000000000000010b151f29333d47515b606d7982888684838282838383848485858686878074675a4d4134271a0e000007121d28313d47505a626d74808d939ea6b0a79d928a7d70685e52463f342b20160d18212a36414c56616b74808d95a0abb5bfc6c4bab0a69d928b7f726b60574d43392e23180c000000000000000916222f3c4955626f7c8895a2a3a2a2a1a1a0a39f9f9f9f9e9e9e9e9e9e9e9e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9e9e9e9e9e9e9e9f9f9f9f9fa4a0a1a1a2a2a39b8f8275685c4f4235291c0f000000000000000000000000000000000000000000000000000000000000000004111d2935414c55616c7177777574767778776e695e52463b3025190e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1825313d48535d65686a656c6e707275746d685e554b41382d241a10060000000000000000000000000000000000000000000006121f2b37434e585f656c666c6e6f717376736d63574b3e3225190c000000000004101c2834404a545f6a6f7c8490959ea1a8acaeb4b4aeaca8a4a2a1a0a1a3a6a7a09d948f857d71798698a3a9a9a8a8a9a9a5988b7f7265584c3f3225190c000000000000000000030d19232d3946525d68727f8c97a2adb0a69e92857a6d61594f42382e1d140a000000000000000000000000000000000000000000000000000000000000000000091217222d38424b555d686e7b849197a2aaafa9a19892857a6e6154473b2e211408000000000000000000000000000000000714202c38444f59606d79839098a09590837a6d685d564c443a32333c454d575f696e7b849196a0999183796d605a5044392d2014080000000000000000000000000000040c18232e39424e58616b727f8b9399a3aab1b3a99f9590827b716d666361605d606164696e747e869299a3afbab0a8a19792857c6f695e554b40342b1e140a000000000000000000000a141d262d3338393b3a38342e353435353035393a3a39352f281f160c01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171f252a32373c42474b5153555c606366656c6e6f71737474757575757474737371706e6d66686563605c5554524d46443f38332d261d180f0700000000000000000000000000070c151c232830353b41464b5153565e6165666d6f727577797b7c7d7d7e7e7d7c7c7b7a79777472706d6865615e5754524c444039302a251e170e07000000000000000000000000000000000000000000000000000000000d1a2633404d596673808c989291908f8f909192989285796c5f5246392c1f130600000000000007121d27313b454f59626d75818e9492908f8f8f8f90909191929292958e8174675b4e4134281b0e0000010c161f2b353e48515b606c78818f949fa8aea49e91857a6d615b51463d32281d151f2a333c46525e68707d89929da8b1bdc6c5bcb2a89f948d80746d62594f453b30271d1207000000000000000a1724303d4a5763707d8a9697969595949493999292929292929191919191919191919191919191919191919191919191919191919191919191929292929292939a949495959696979083766a5d5043372a1d1000000000000000000000000000000000000000000000000000000000000000000613202c3945515d67717e84838281828485837b6e61564c41362a1c110600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915202c37414b53595b535b606163656867615e564c43392f261b12080000000000000000000000000000000000000000000000030f1a26313c464e535b605b60616264676966635b51463b2f23160a000000000006121f2c3844515c666f7c859196a0a7acb2b8baafaaa39f9b979695949596999da0a69f9792877e7986929facb5b5b5b6b1a4988b7e7165584b3e3225180b0000000000000000010b151f2a36424d57616d7a85929fa9b3a99f948b7e71685e52473d30261c0b020000000000000000000000000000000000000000000000000000000000000000000006111c262f39434c565e696f7c859298a3a59e9792867c6f685e5246392d201407000000000000000000000000000000000916222f3c4854606b74808d959f9590837a6d685d564c443a32282a333c454d575f696e7b8491969f958e81746c6155493c3023160a00000000000000000000000000000007121d27303c464f59626d727f879298a0a7afb1a79f9590857e7973706e6d676d6e71757b818a9298a2abb4aea69f9691857c6f6a60564d43392e22190c0200000000000000000006111c262f383f44464846443f4242414142424146474745413a31281e13080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b141a20272b31373a4045474b515356535b606163646667686869696868676766656361605c54595653514b4746423b38332d27221b140b06000000000000000000000000000910181e262e343a41464d52545c6064686d7276797c7f8284868889898a8b8b8a898888878583817f7c7a76726e6965605d56514a423e363029201910080000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c999f9e9d9c9c9d9e9f9f9285786c5f5245392c1f12060000000000081118242f39434d57606b727f8c939e9f9d9c9c9c9c9c9d9d9e9e9f9590837a6d6053473a2d201407000000040d19232c363f44505b666d79829096a0a9ada1978f82756d62584e443a2f261d27313c45505a616d7a85919ea4aebac3c7bdb4aaa0968f82786d605b51473d332a1e150b00000000000000000b1824313e4b5764717e8a8a8a898988888787868685858585858585848484848484848484848484848484848484848484848484848484848585858585858586868687878888898a8a8b83776a5e5144372b1e110000000000000000000000000000000000000000000000000000000000000003101c28343f4a54606d7a8591908f8e8f90928e8175685e5246382d22170b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040f1b25303941484d4f4950535456595b5b54524c443a31281d140a000000000000000000000000000000000000000000000000000a15202a343c4149505350535456575a5c5957514940352a1e12060000000006121e2b37424e57606d78839097a1a8b1b9bdb5ada59e98928f8b89888788898c91959d9fa29992877d85929eabb8c2c2bdb0a4978a7d7164574a3e3124170b000000000000000007121d27313946525e6973808d97a2adaca1979082776c60564c41342b1e150a0000000000000000000000000000000000000000000000000000000000000000000000000a141d27303a444d575f6a6f7d86929999938e857d706a60564c41362a1e1105000000000000000000000000000000000a1723303d4a5663707d879398928f837a6d685e564c443a322820212a333c454d575e696e7b84909399928a7d7064574a3d3124170a000000000000000000000000000000000b151e2a343e47515b626d727e8690959fa3abafa79f97918b84807c7a79797a7b7e81868e939fa2aaafaaa29f948f847c6f6a60584e443b30271d1007000000000000000000000b17222d38424a50535453504a4f4e4e4e4f4f4c525454514c433a2f24190d01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e151b1f262b2f35393a4045474a495053545658595a5b5b5c5c5b5b5a5a5958565553504a4c494745403b3a36302b28221c17110a02000000000000000000000000020a121b222a30383f444c52565e61666d71767a7e8285898c8e9092989696979897979695949892908e8b8987837f7b76726d68605c545046413b322b221a110800000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5abaaa9a9aaabab9e9185786b5e5245382b1f120500000000060f1a232935404b555f69707d87929fa5acaaa9a8a8a9a9aaaaa9a19691837a6d675d5145392c2013060000000007111a2428333f4a545c676d7a849197a1aaa99e948b7f726a60564c41382d232f39434d57626c75818f97a1adb6c0ccc0b5aba29891847a6d665c50493f352b21180c0300000000000000000714202d3a4753606d797e7e7d7c7c7b7b7a7a797979797878787878787877777777777777777777777777777777777777777777777777787878787878787979797a7a7b7b7c7c7d7d7e7c6f6255493c2f2216090000000000000000000000000000000000000000000000000000000000000006121f2b3844505c66727f8c979d9b9b9c9d9e92867a6e61544a3f33281c0f03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141e2730373d41423f4446474a4c4e4e4746413a32291f160b0200000000000000000000000000000000000000000000000000030e18222a2f383f4446444647494b4d504c4b4640372e23190d02000000000814212e3a47535f6a737f8c95a0a9b2bac1b7ada39b938e86827e7c7b7a7b7d80848990959fa399928586929fabb8c5c9bdb0a3968a7d7063574a3d3024170a00000000000000040d18242f39434f59616e7b86929fa9afa49a92857b6e655b50443a3022190c03000000000000000000000000000000000000000000000000000000000000000000000000020b151e28323b454e58606b717e878d8c88817a706b60584e443b3025190e0200000000000000000000000000000003101c2936434f5c69768286878686827a6d685e564c443a3228201618212a333b454d575e696e7b83868687868175685b4f4235281c0f02000000000000000000000000000000030c18222c353f49515b626c717c838d92999ea5aba9a19e96918d8987868586888b8e92989da5adaba39f98928c827a6f6a60584e463d32291e150b00000000000000000000030f1c28333f4a545b6061605c545c5b5b5b5b5c565e61605d554c4135291d110400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f151a1d24292c2f34383a3d3f444648494b4d4e4e4f4f4f4f4e4e4d4c4b494846443f3f3c3a38342f2d2a251f1c17110b0600000000000000000000000000000a141c242d343c424a50565e61686e73797e82868b8f9298999b9d9fa3aaa3a4a4a4a3a3a2aaa39f9d9a989695908b87837e7a726d66615a524c443d342c231a1108000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1b6b5b6b6b7aa9e9184776b5e5144382b1e1105000000040d18212c353d45515d676e7b859299a3afb9b7b6b5b5b6b6b4aaa19791847b6e685d554b4035291d10040000000000081217222d38424b555e686e7b859298a3aca69f92877c6f685e53493f332934404b555f69717e8b939ea9b2bec8c2bbafa49992867c6e685e544a3f372d23190f060000000000000000000613202c3945515d676d717170706f6f6e6e6d6d666c6c6c6b6b6b6b6b6b6b6b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6b6b6b6b6b6b6b6c6c6c656c6d6d6e6e6f6f7071716f6a6054473b2e221508000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7884919ea9a8a7a9aaa3998c7f72665b5044382b1f14080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c151e252c31342d3337393b3d3f42413a3936302920170d040000000000000000000000000000000000000000000000000000000610181d262d33373938393b3c3e4043403e3b352e251c12070000000004101c2834404a54626e7b86929fa7b1bbc4bcafa59b918b817a75716f6e6d6e7073777d838b9298a197929298a2aebac6c9bcafa396897c706356493d3023160a000000000000010c161f2935404b55606b74818e98a3aea69f93887d70695e53493f32281e10070000000000000000000000000000000000000000000000000000000000000000000000000000030c162029333c464f59616c717d80807c756d6860594f463d32291e140800000000000000000000000000000000000613202d394653606c787a7a7a79766d685e564c443a322820160e0f182129333b454d575e696e76797a7a79756f65594d4134271b0e020000000000000000000000000000000006101a232d373f48515a616a6f7980878f939a9fa2a9a8a09e99969a93929894979b9fa3aaa9a19e99928e857f786d685f584e463d342b20170c030000000000000000000006121f2b3844505b666c6e6d66696868676868696a686d6d675d5145392c20130600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e13181d2023292c2d2d3337393b3c3e40414142424242414140403e3d3b3a38342e302d2c2923201e19140f0b06000000000000000000000000000000040d1c262e363f464e545c60686d737b80858a8f92999c9fa2aaa8aaacaaa8a6a5a4a4a4a5a6a7aaacaaa7a5a79f9d9a93908b857f79706c615e564f473d352c23190f060000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1bec2c2c3b7aa9d9184776a5e5144372b1e11040000020b161f2a333d47515b606d79839097a1abb5c0c3c2c2c2bdb4aba29892857b6e695e564c43392f24180d0100000000000006111c262f39434c565f696f7c86929aa4aea39991847a6d655b50443d333c45515c676e7b86929fa5afbbc4c2b9afa59f93877d706a5f564c42382e251b11070000000000000000000004111d2935404b555d60646464636262616160605c5f5f5f5f5f5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5f5f5f5f5f5b606061616262636364646260584e43372b1f130600000000000000000000000000000000000000000000000000000000000006131f2b37434e5864717d8a96a1acb5b4b5b5ab9e9184786c6053463b3025190e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c141b20252722272b2d2e303235342e2d2a251e170e050000000000000000000000000000000000000000000000000000000000060b141b22272b2d2b2d2e2f31343633322f2a231c130a000000000006121f2c3844515c6674808d99a3aeb9c3bfb4aa9e938b7f756d68646362616263666b70767e869197a19e9fa2aab3becac8bcafa295897c6f6256493c2f23160900000000000007121d28313945515d67707d88939faaa99f948d80736b60574d41382d20160c00000000000000000000000000000000000000000000000000000000000000000000000000000000040d17212a343d47505a616b7074736f6a615e564f473d342b20170d02000000000000000000000000000000000005121f2b3744505b656c6d6d6d6769615e564c443a322820160e04060f182129333b454d565e6169676d6d6d66655d53483d3125180c00000000000000000000000000000000000008111b252d363f4850585f676d747b82888d92979a9da0a8a4aca49f9fa2aaa4aca49f9d9a97928d87817a726c665e564e463d342b22190e0500000000000000000000000613202d394653606c787b79777675757474757577787a7a6d6054473a2d211407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070d1113181c1f2022272b2d2e3031333435353636353534343332302e2d2c282323201f1c1814110e090300000000000000000000000000000000010c161f2e38404850585f666d727a80868c91979c9fa3abacacaaaba39f9d9b999898979899999b9d9fa4ababadabaca49f9c97928b847d766e6860594f473d352b21180c0300000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1bdcacfc3b6aa9d9083776a5d5044372a1d110400000a141d28313c454f59636d75818e95a0a9b3bdc7d1cfccc0b5aba39992867c6f695f574d443a31281d120700000000000000000a141d27313a444d57606a717e88939fa5aba1968f82776c60594f443c45505a606d79839098a2aeb7c1c4bab1a79e938c7f726b61584e443a30261c13090000000000000000000000010d18242f3a434b515357575756565555545453514a5252525252525151515151515151515151515151515151515151515151515151515152525252525249505353545455555657575855544e463c32271b0f030000000000000000000000000000000000000000000000000000000000010c15222e3b4754606a7683909da8b2bdc1c2b9aca196897d7063564d41362a1c110600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090f15181b171b1f20212326282821201d19130c0500000000000000000000000000000000000000000000000000000000000000020a11171b1f201f2021232427292625231e19120a0100000000000713202d3a4653606d7985929eabb4bfc6baaea2988e81756d605d5656555455565960636d727c859198a2abaeb3bcc5d0c8bbaea295887b6f6255483c2f2215090000000000071018242f39434f59606d7984919aa4aaa1979082786d60594f453b2f261b0e050000000000000000000000000000000000000000000000000000000000000000000000000000000000050f18222b353e48505960636766625f58524c443d352b22190e05000000000000000000000000000000000000030f1b27333f49535b606060605d5554524c443a322820160e040000060f172129333b444d5254555d6060605c54534b42372c2015090000000000000000000000000000000000000009121b242d363e464e555c60696e757c80858a8d9196959799999a9b9a9999979a93918d8985807b746e68605b544c443c342b221910070000000000000000000000000c1825323f4b5865727e878684828281818182828385878276695d5043362a1d10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104070c101314171b1f202123252627282829292828272726252322201f1c17161413100c07050200000000000000000000000000000000000008131e2831404a525a626a6f787f858d92989ea1a9acaeaca8a09e9a9992918f8d8c8b8a8b8c8d8e9093999a9ea1a9acafaca9a19e96918a827a6f6b60594f473d33291e150b00000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdcacfc3b6a99c908376695d5043362a1d10030006111b262f3a434d57606b727f8c939ea7b1bbc5cfd2c8c0bbafa49992877d706a60574d453b32281f160c010000000000000000020b151f28323b454e58616c737f8c939ea6a89e948c7f726b60564c434e57616c74818e95a0aab4bfc6bcb2a89f958e81746d63594f463c32281e150a0000000000000000000000000007131d28313a4045474a4b4a494948484747464440464545454545454544444444444444444444444444444444444444444444444444454545454545453f44464747484849494a4a4b4947433c342b20150a00000000000000000000000000000000000000000000000000000000000007131d2a36424d57626f7c89959fabbac4cec9bdb2a89b8f8275685e5246382d22170b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004090c060b0f12131417191b1b1413110d080200000000000000000000000000000000000000000000000000000000000000000000060b0f121312131416181a1d191916120d07000000000000000a1724313d4a5764707d8a97a1adbdc6c5b8ac9f92867a6d605b524c494847484a4f545b626a6f7c86929fa5afbcc5ced7c8bbaea195887b6e6255483b2f22150800000000050e19232935404b55606b74808d96a0aba29892857b6e665c50473d33291d140a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000061019232c363e474f54565a5955544e46413a322b231a100700000000000000000000000000000000000000000b17222d3841495053535453514b4746413a322820160e0400000000050f172129323b4246474b51535453504a42423930251b0f04000000000000000000000000000000000000000009121b242c343c434b51575f626a6f74797d808487898b8c8d8d8e8d8d8c8b888684807d79736e69615e56504a423a322a22191007000000000000000000000000000d1a2633404d596673808c92918f8f8e8e8e8e8f90929184776b5e5144382b1e1100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000406060b0f12131516181a1b1b1c1c1c1c1b1b1a191816151312100c06070604000000000000000000000000000000000000000000010d19242f3a43525c636c717c838c92989fa3aaadafaba39f9b96918d8a868482807f7e7e7e7f80818486898d92979da0a8aeb3ada8a09d948f857d706b60594f453b30271c1207000000000000000000000000000000000000000000000a1724303d4a5763707d8a96a3b0bdc9cfc2b6a99c8f8376695c504336291d1000060f17222d38414b555f69707d87939fa5afb9c3cdd3c9c0b6ada39f93877e716b60584e453c332920160d0400000000000000000000030d162029333d46505a636d74818e949fa8a69f92877d70685e544b555f6a717e8a939da7b1bcc5bfb4aaa1969083796d605b51473e342a20160c0300000000000000000000000000010c161f282f35393a3e3e3d3d3c3c3b3b3a3a38342e39383838383838383837373737373737373737373737373737373737373738383838383838392d3337393a3a3b3b3c3c3d3e3e3c3b37322b22190e040000000000000000000000000000000000000000000000000000000000010d18242f3a46535e6975818e9ba7b1bcccd6cec4b9ac9f92867b6e61544a3f33281c0f03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030506080a0c0f0e070705010000000000000000000000000000000000000000000000000000000000000000000000000000030506060608090b0d100d0c0a06020000000000000004101d2935404b556875818e9ba9b3becbc0b5ab9a8e8174685d5245413c3b3a3b3d44485158606a707d89939eaab4bfcad6c7bbaea194887b6e6155483b2e221508000000020d17202b353d45515d676f7c87939fa8a39992867c6f695e544a3f352c20170b02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007111a242c353d4448494d4d4947433c363029201a110800000000000000000000000000000000000000000006111b262f383f444647474745403a3936302820160e05000000000000050f17202930363a3b4045474746443f383030271e14090000000000000000000000000000000000000000000009121a222a313940454d53585f62676d7074777a7c7e7f80818181807f7e7c7a7773706d66615e57524c443f382f282019100700000000000000000000000000000c1926333f4c5966727f8c999d9c9b9b9a9b9b9c9d9d9184776a5e5144372b1e1100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003050608090b0d0e0e0f0f0f0f0e0e0d0d0b0a08070603000000000000000000000000000000000000000000000000000004111d2935414c55636e737e8790959fa2aaaeb0aba49f99928e8984807d7a77757372717171727374777a7c80858a91969fa2aab2b2aca69f9791867d706b60574d42392e23180c020000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9cfc2b5a89c8f8275695c4f4236291c0f040d182127333f49535d676e7b859299a4afb7c1cbd3cac1b7aea49c918b7f726c61594f463d332a21170e04000000000000000000000000040e17212b343e48515b606d78829096a0a9a39991857a6e665c515d676e7c86929fa5afb9c3c3baaea39891847a6e675c51493f352c22180e04000000000000000000000000000000040d161d24292c2d313131302f2f2e2e2d2d2c28232c2c2c2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2c2c2c22272b2d2d2e2e2f2f303031312f2e2b272019100700000000000000000000000000000000000000000000000000000000000004111d2935404b55616e7b86929facb9c2cddfd3c7bbafa3998c7f73665b5044382b1f14090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3945515d677784919daab7c4c7bbafa399897c6f63564c4135302f2e2f32383f464e58606b74818e98a2aebac6d3c7baaea194877b6e6154483b2e21150800000008141e29323d47515b606d79849199a4a49f92877d706a60564d42382e231a0e050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008121a232b32383b3d41403c3b37322a251e170e0800000000000000000000000000000000000000000000000a141d262d3337393a3a3a39352f2d2a251e160e050000000000000000050e171f252a2d2f35393a3a3a38342e261e1e150c0200000000000000000000000000000000000000000000000810181f272f343c42474e53555d606467686d6f7173737474747373716f6d676763605c54534d46413b332d261d160e070000000000000000000000000000000c1925323f4c5865727f8b98a5a9a8a8a7a7a8a8aa9d9083776a5d5044372a1d11000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3945515d6773808b9299a0a7aeb3afa69f99938e86827d7874706d67686665656465666668676d7074797d848b9298a1a8b1b8b0a9a19892867d70695f544a4034281e14080000000000000000000000000000000000000000000916232f3c4956626f7c8995a2afbcc8cec1b5a89b8e8275685b4f4235281c0f0b161f2a333c44505b656d79839097a2abb5c0c9d3cbc2b8afa59d928c7f736d625a50473d342b21180f050000000000000000000000000000060f19222c364045515c666d7a849197a2aba1978f82786d605a606d79839098a2aeb7c0c3b9afa59f92867c6f685e554b40372d231a0f060000000000000000000000000000000000040c13181d2020242424232322222121201f1c181f1f1f1f1f1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1f1f1f1f1f171b1f2020212122222324242522221f1b150e07000000000000000000000000000000000000000000000000000000000000000613202c3945515d6773808d99a3afbbc7d3e0d7cbc0b5ab9e9184786c6053463b3025190e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000406070e100f0e0f100a0907030000000000000000000000000000000000000000000000000000000000000000000000000000000406070b0e100f0d0b070604000000020507080c0e100f0d0a06050300000000000000000000000714202d3a4753606d7a86939facb9c6c5b9ac9f9286796d6053473a2f24222122272c343d464f59616d7a86929facb8c5d2c7baada194877a6e6154473b2e2114080000020e1925303b444f59626d75818e96a0a59c928b7f726b61584e443b30261c110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008111921272c2f3034332f2e2b262019130d05000000000000000000000000000000000000000000000000020b141b22272b2d2d2d2d2c2924201d19130c0500000000000000000000050d14191e2024292c2d2d2d2b28231c140c0c0300000000000000000000000000000000000000000000000000060d151d232931373c43474b515357565d606264666667686766666462605d555653514b46423b363028221c140b05000000000000000000000000000000000c1825323f4b5865727e8b98a5b1b5b4b4b4b5b5a99d9083766a5d5043372a1d10000000000000000000000000000000000000000000000200000406070706040000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306070808070603000000000000000000000000000000000000000000000000000714212d3a4754606d7a87929fa3abb1b3aba39f948f87817b75706c6563605d555a59585758595a555d6063666d71797f859196a0a8b1bbb2aaa39892857b6e665c51443b3025190e0100000000000000000000000000000000000000000916222f3c4955626f7c8895a2afbbc8cec1b4a89b8e8175685b4e4235281b0a141d28313c454f59606c77818f95a0a9b3bdc7d2cbc2b9b0a69e938d80746d635b51483e352b22190f060000000000000000000000000000000007101a242834404b545e686e7b859299a3a99f948c80736b616c74818e95a0aab4bfc5bbb1a79d928b7e716a60564c43392e251c11080000000000000000000000000000000000000001070d1113141718171616151514141312100c07121212121212111111111111111111111111111111111111111111111111111212121212120b0f12131414151516161717181615130f0a0400000000000000000000000000000000000000000000000000000000000000030f1c28333f4a54606d7a85929fabb5c0cbd7d6d3d1c7b9aca196897d7063564d42362a1c11060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c1013131b1d1c1b1c1d161613100b040000000000000000000000000000000000000000000000000000000000000000000001070c101314181b1c1c1a181413100c07080e111414191b1d1c1a1713120f0b060000000000000000000916232f3c4956626f7c8999a4afbbc7c3b6aa9d908377675c514538281e1514151c222b343d46525e6875818e9ba8b4c1d1c7baada094877a6d6154473a2e211407000005111e2a36414c56606b727f8b939ea59e938d80736d62594f463d32291e140a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070f161b202223272622221f1b150d08020000000000000000000000000000000000000000000000000000020a11171b1f20202120201d1813110d080200000000000000000000000002090e1114181d1f2021201f1c17110a0200000000000000000000000000000000000000000000000000000000030b12181f262b3137394045474a4c52545658595a5a5b5a5a59585553514b4a4645403936312a251e17110a0200000000000000000000000000000000000b1825313e4b5864717e8b97a4b1bec1c1c1c1b6a99c8f8376695c504336291d1000000000000000000000000000000000030607080b0d0f070c1013131313100c070e0d0b0807050200000000000000000000000000000000000000000000000000000000000000000000000003060c10121314141312100c0600000000000000000000000000000000000000000000000613202c3945515d677784919eaab5b2a9a199928c827c746e6963605b5353514b4d4c4b4b4b4c4d4b5153545c60666d727c849195a0aab4bcb4aaa2979083786d60564c41362a1d120700000000000000000000000000000000000000000915222f3c4855626f7b8895a2aebbc8cec1b4a79b8e8174685b4e4135281b111b262f3a434d57616b737f8c939ea7b1bbc5d0ccc3b9b1a79e948e81776c605b51493f362c23191007000000000000000000000000000000000000081218232e39424c565f69707d87929fa5a69f93887d706a717e8b939da7b1bcc6bdb3a99f958e81746c62584e443b30271d130a00000000000000000000000000000000000000000000010406070b0b0a0a0909080807070604000005050505050505050404040404040404040404040404040404040404040505050505050500000305060707080809090a0b0b0908060300000000000000000000000000000000000000000000000000000000000000000006121f2b3844505b66727f8b97a2adbdc7d1d0cac6c5c4bdb2a89b8f8275695e5246382d22170b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b12181c1f202829282829292322201b160f070000000000000000000000000000000000000000000000000000000000000000030b12181d1f20252729292725201f1d181214191e2021262829282724201f1b17110a02000000000000000b1825323e4b5865717e8b98abb5c0ccc1b4a79b8e817468554b403429160c070b1019222a36414c5663707d8a96aab4bfcbc6baada093877a6d6054473a2d21140700000714202d3946525e686f7d87929fa59e938e81746e635b51473e342b20170c02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040b101316161a1a1615130f0a04000000000000000000000000000000000000000000000000000000000000060b0f121314141413100d070501000000000000000000000000000000000205070c101314141312100b060000000000000000000000000000000000000000000000000000000000000001070c151a20262b2f35393a3d414547494b4c4d4e4e4e4d4c4b494745403d3a38342e2a251f19140b06000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0bdcacdcec2b5a99c8f8276695c4f4336291c100000000000000000000000000206060b1012131517191b1d181c1f20201f1c181d1b19181414110e08060300000000000000000000000000000000000000000000000000000000000000060b0f12171c1f202121201f1c1711110c05000000000000000000000000000000000000000004111d2935414c556774808d9aa7b2a8a19791877f786f6a615e57535049474540403f3e3e3e3f404045474a51545c606a6f7b839198a3aebabcb3a9a0958c7f72685e5246392f24180c00000000000000000000000000000000000000000815222f3b4855626e7b8895a1aebbc8cdc1b4a79a8e8174675b4e4134281b17222d38414c555f69707d88939fa5afb9c3cdcdc4bab1a79f958f82786d655b504940372d241a1108000000000000000000000000000000000000000007121d27303a444d57606b727f8b939da7a49a92857b6e7c86929fa5afb9c3c0b5aba1979083796d605a50463c32291e150b01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c7884919ea9b3becfcec6bfbab8b8b9b9ac9f92867b6e61544a3f33281c0f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c151d23282c2d353635353636302f2c2721191107000000000000000000000000000000000000000000000000000000000000030d151d24292c2d3234363634322d2c29241d1f252a2d2e3334363533312d2b27221b140b020000000000000d192633404c5966737f8c99a6b2bfd2c0b3a6998d8073665a4d402f23180d000007101925303b4754616e7a8798a3aebac7c6baada093877a6d6054473a2d21140700000814212e3b4754616e7a859199a39e938e81786d605c52483f352c22190e050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000407090a0e0d0908060300000000000000000000000000000000000000000000000000000000000000000000030506070707060401000000000000000000000000000000000000000000000004060707070603000000000000000000000000000000000000000000000000000000000000000000000003090e151b1d24292c2d2f35393a3c3e404041414140403e3c3a39352f2d2c28231d1a140e080200000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdcad6cfc2b5a89c8f8275695c4f4236291c0f0000000000000000000105090e1214171c1f20222426282a23282c2d2d2c28232a28262421201e191312100b06000000000000000000000000000000000000000000000000000000020a11171b1f23282c2d2e2e2d2c28231c1c170e0802000000000000000000000000000000000000010d19242f3d4a5764707d8a97a3a9a19691857d736c665f58524d46443f3a39352f32323132332f35393a40444a51585f696f7c86929fa9b3bebbb1a79f92867a6e61554b4035291d1004000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7cdc0b4a79a8d8174675a4e413427192227333f49535d676e7b86929aa4afb7c1cbcec5bbb2a8a0959082796d665c53493f372e241b1208000000000000000000000000000000000000000000000b151e28323c454f59626d74818e959fa8a19790837a839198a2aeb7c0c4bbafa49992857b6e675c51483f342b20170c030000000000000000000000000000000000000002050708070605030000030000040607060400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2b37434e5864707d8a96a0acbcc5d0c6bcb4aeacabadb3afa3998c7f73665b5044382b1f1308000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e272e34383a4143424142433d3b38322b23190b0200000000000000000000000000000000000000000000000000000000010b151f272f35383a3e414342403e3a39352f27293036393b3f414342403d3937332d261d140a0000000000000d1a2733404d5a6673808d99a6b3c0cbbfb2a5988c7f7265594c3f322619070000000813202d394653606c7986929facb9c5c6b9ada093867a6d6053473a2d20140700030f1c2936424f5c6975828f97a19e938e81786d665c504a40362d231a100700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f12181d1f2024292c2d2f3133333435343333312f2d2c2924201f1c18120e0903000000000000000000000000000000000000000000000a1723303d4a5663707d8996a3b0bcc9d6cec1b5a89b8e8275685b4f4235281c0f0000000000000002080d11151a1e2123282b2d2f313335372e34383a3a38342e363533312e2d2a25201f1c17110c07000000000000000000000000000000000000000000000000050b141b22272b2e34383a3b3b3a38342e2d282219140d050000000000000000000000000000000000000814212e3b4754616e7a8794a9a19691847b706b605b544e46423b37332d2c2924262524252624292c2e343940444e575f6a727f8b97a1adb9c3baaea2988c8073675d5145382c1f1306000000000000000000000000000000000000000815212e3b4854616e7b8794a1aebac7cdc0b3a79a8d8074675a4d413427212b343c44505b656d79849198a2acb6c0c9cfc5bcb3a9a19690837a6d675d544a41382d251c12090000000000000000000000000000000000000000000000030c16202a333d47515b606d78839096a1a99f9590859195a0aab4bfc4bab0a69f93877d70695e554b40362d22190e0500000000000000000000000000000000000002090e1114141413120f0b0610070c10131313100c07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b15222e3b4754606a7683909ca8b2bdcecabfb4aaa29f9ea1a9b3ab9e9184786c6053463a3024190d01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d2730394045464e504f4e4f504948443d352b1d140a0000000000000000000000000000000000000000000000000000000007121d2731394045474b4e4f4f4d4b4745403931323b4146474c4e504f4d4a46443f382f261b110600000000010e1b2734414e5a6774818d9aa7b4c0cabdb1a4978a7e7164574b3e3124180b00000005121f2b3744505b657884919eabb7c4c6b9aca09386796d6053463a2d2013070004111d2a3744505d6a77838e939e938e81786d665c544a3f382e241b11080000000000000000000000000000000000000000000000000000040607060400000300000406070604000000000000000000000000000000000406070908070502000303040000040607060400000000000000000000000000000000010406070d0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0c0b090601000000000000000000000000000000000000000000000000000000000000000001070c101314191d2021232526272728272726252220201d181313100c07000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9d6cec1b4a89b8e8175685b4e4235281b0f000000000000040c13191d20262b2e2e34383a3b3e40424344404546464540454341403e3b3936302d2b28231c18120c07000000000000000000000000000000000000000000050e171d262d3337393f4446474746443f3839332a251e170e0500000000000000000000000000000000000714202d3a4753606d7a8699a29791847b6e696059504a423c36302b2722201d181918181819181d2023282e343c454e58606d7985919eabb8c4bfb4aa9e9285796d6053473a2d201408000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7cdc0b3a69a8d8073675a4d40342729333c46505a606c77828f96a0aab3bec7d0c6bcb4aaa19791847b6e685d554b42392f261b130a00000000000000000000000000000000000000000000000000050e18212b353f45515c666e7a849198a3a79f969196a0a7b1bcc6bcb2a89e948c7f736b60574d43392e241b1007000000000000000000000000000000000000050d14191e202121201f1b171c1d1d181c1f201f1c18120b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d2a36424d57626f7c88949fabbac4cec6baaea298929197a1adaca196897d7063564c4135291d110500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232e39434b51535b5c5b5b5c5c56544f473d2f261c11060000000000000000000000000000000000000000000000000000000c18242f39434b5153585a5c5c5a5853514b43393b444d5254595b5c5b5a5753504941382d22170b00000000020f1b2835424e5b6875818e9ba8b4c1cabdb0a4978a7d7164574a3e3124170b000000030f1b27333f495e6b7884919eabb7c4c6b9aca09386796d6053463a2d20130700000714212d3a4754606d79818b918d81786d665c544a42382e261c120900000000000000000000000000000000000000000000000000070c10121312100c070f070c10131313100c07000000000000000000000000070c101213161414110e080f1011070c10131413100c0701000000000000000000000001080d1113141a1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b191816120d06000000000000000000000000000000000000000000000000000000000000000000000406080d1113141618191a1b1b1b1a1918161413110d0706040000000000000000000000000000000000000000000000000000000916232f3c4956626f7c8995a2afbcc8d5cdc1b4a79a8e8174675b4e4134281b0e00000000020b0e161e25292d31373a3b3f4446484a4c4e50514b515353514b52504e4c4b4746413d3a38342e28231c18120b03000000000000000000000000000000000000050e1720292f383f44464a5053545453504a49453e36302920170e050000000000000000000000000000000006131f2c3845515d677986929f92857b6e695f574f443f382f2a251f1b1713110d070b0b0b070d1013181c2328333c44515c6673808d99a6b3c0c6b9ada1978a7d7064574a3d2f24190d010000000000000000000000000000000000000714212e3a4754616d7a8794a0adbac7ccc0b3a6998d8073665a4d403328313b454e58616c73808c949ea8b2bcc5d0c7bdb4aaa29892857b6e695e564c433930271d140a010000000000000000000000000000000000000000000000000000060f19232834404b545e686f7c86929fa4a8a19ea1a8b1b9c3bfb4aaa0968f82776c60594f453b30271d1209000000000000000000000000000000000000080e171f252a2d2e2e2d2b272229292a23282c2d2c28231d150c0a0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18242f3a46525e6975818e9ba6b0bbccccc0b6ac9f928685919eabb2a89b8e8175685d5246392d20150a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b555c606869686869696360594f42382d22170b000000000000000000000000000000000000000000000000000004101d2935404b555d60656769696765605d554b40414d565e61666769686664605b53493f33271b0f03000000020f1c2935424f5c6875828f9ba8b5c2c9bdb0a3968a7d7063574a3d3024170a000000000b17222d45515e6b7884919eabb7c4c6b9aca09386796d6053463a2d20130700000613202c3945515d676d757e8481786d665c544a423830261c140a000000000000000000000000000000000000000000000000030b12181c1f201f1c181c1c1c181c1f201f1c18120b030000000000000000030b12181c1f202221201e191c1c1d1d1e181c1f201f1c18120b06000000000000000000040c13191d20212627272727272727272727272727272727272727272727272727272727272727272727272727272727272727272524221e18110901000000000000000000000000000000000000000000000000000000000000000000000001040607090b0d0d0e0e0e0d0d0b09070604010000000000000000000000000000000000000000000000000000000000000915222f3c4855626f7b8895a2aebbc8d5cdc0b4a79a8d8174675a4e4134271b0e000000000b141d20283035393c4247484a50535557595b5d5e545c60605c5f5e5d5b595754524d4946443f38342e28231d150c0600000000000000000000000000000000020b172029323b41495053545c606161605c54555046413b322920170b0200000000000000000000000000000004101d2935404b556b788592938a7e71695f574d453d332d261d1a140f0b06040100000000000104070c1218202834404a54636f7c8996abb4bfcabeb3a99a8e817467564c4135291d11040000000000000000000000000000000000000714212d3a4754606d7a8793a0adbac6ccbfb3a6998c807366594d40332f3a434d57606a717e88939fa6b0bac3ceccc0b5aba39892867c6f695f574d443a31271e150b0200000000000000000000000000000000000000000000000000000000071118232e39424c56606a717e8b929da8adabadb2bac3c2baaea29891847a6d655b50473d33291e150b00000000000000000000000000000000000008111a202930363a3b3a3937332d3636372e34383a38342e271e1c140a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b55616e7b86929facb9c2cdc8bbafa49a8d80808d9aa7b1ac9f92867a6d6154473c32261b0f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c676d747675747576706b60544a3f33281c0f030000000000000000000000000000000000000000000000000006131f2c3845515d676d7174767573716d675d514546525e686e7274767573706c655b5044372b1f1205000000030f1c2936424f5c6975828f9ca8b5c2c9bcb0a396897d7063564a3d3023170a00000000061e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d201307000004111d2935414c555d606d7277746d665c544a423830261e140a0100000000000000000000000000000000000000000000010a0c151c23282c2d2c282329292923282c2d2c28231d150c0a010000000000050c151c23282c2d2f2e2d2a2529292a2a2b23292c2d2c29231d17110a02000000000000040d161e24292c2d33343434343434343434343434343434343434343434343434343434343434343434343434343434343434343432312e29231b13090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b8895a1aebbc8d4cdc0b3a79a8d8074675a4d4134271a0e000000050f1d262f323a4146474e5355545c60626466686a6b6b666d6d666c6b69686664615e565653504a444039342e271e1810090000000000000000000000000000000a141d29323b444c535b6064666d6e6e6d6664615a524c443b32291d140a000000000000000000000000000000000c18242f44515e6a7784918e81746c61574d453c3328221c140b090300000000000000000000000000070e18232e3b4754616e7a8799a3aebac7c4b7ab9e918478685d5245392c2013070000000000000000000000000000000000000714202d3a4753606d7a8693a0adb9d2ccbfb2a6998c7f7366594c402d38424b555e696f7c86929aa4afb8c1ccc8c0bbafa49992867d706a60574d453b32281f150c0300000000000000000000000000000000000000000000000000000000000007121d27303b444e58616c74808d96a0acb8b9bdc4c2b9aea49f92867c6f685d53493f352b21170c03000000000000000000000000000000000005101a232c323b4246474746443f4342434444404546454039302e261c120800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3945515d6773808d99a3aebbc7d2c6b9ac9f93877c7c8895a0acaea3988b7f7265584e43372b1d1207000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b54606d798183828182837d70665b5044382b1f150a000000000000000000000000000000000000000000000000000714202d3a4753606d797e818282807e796d6053474a54616e7a7f818382807d776c605346392d201306000000030f1c2936424f5c6975828f9ca8b5c2c9bcb0a396897d7063564a3d3023170a00000005121e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d2013070000010d19242f3a434c515b62656b67605c544a423830261e140c0200000000000000000000000000000000000000000000000a131c1e272e34383a38342e3636362e34383a38342e271e1c130a00000000050f171e272e34383a3c3b39363036363637372f34383a38342f28231c140c0200000000010c161f282f35393a4041414141414141414141414141414141414141414141414141414141414141414141414141414141414141413f3e3a342d251b0c030000000000000000000000000000000406070a080605030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4cdc0b3a69a8d8073675a4d4034271a0d0000030d17212f3841444c5254575f6265666d6e717375767778797979797878767473716e686663605c54514a454039302a221b120a0100000000000000000000000006111b262f3b444d565e656c7176797a7a7976716c615e564c443b2f261b1106000000000000000000000000000000071d2a3643505d6976838e83796d605a50453c332a2117110a02000000000000000000000000000000000713202d394653606c7986929facb9c5c5b9ada196877a6d6054473a2d2114070000000000000000000000000000000000000714202d3a4753606d7a8693a0b6c0ccccbfb2a6998c7f7366594c40333f4a545d676e7b859198a2acb6c0cacac0b6ada39f93877e716b60584e453c332920160d0300000000000000000000000000000000000000000000000000000000000000000b151e29323d46505a606d7984919eaab7c4c9c5bbb1a79d928b7e716a5f564c41382d231a0f050000000000000000000000000000000000000b17222c363e444d525454535049504f5050514b5153514b4340382e24190e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27333f4953606d7985929fabb5bfcbc8bcb1a79c8f82757783909dabb4aa9d9083776a5f5347392e23180c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c66727f8c8f8e8e8f8f84786c6053463c32261b0f020000000000000000000000000000000000000000000000010e1b2834414e5b6774818b8d8f8f8d8b83766a554b505c6677848c8e8f8e8d8a8073665a4d4033271a0d000000030f1c2936424f5c6975828f9ca8b5c2c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d20130700000008131e28313a41455156585e5a53504a423830261e140c02000000000000000000000000000000000000000000000007121c252e303940444644404343424243404546454039302e251c12070000020c17212930394044464947464143424243444445404547454039342e261e140a0000000008131e28313a4145474d4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4c4a463f372d1e150b00000000000000000000000001070c101314171513120f0b06060200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7d4ccc0b3a6998d8073665a4d4033271a0d000009141f2933414a52565e61656a6e7275797b7d7f8183848585868686858583817f7e7a7773706d66605c54514b433c342d241c130a0100000000000000000000000b17222d38414d565e686e777e8286878786827e766e685e564c41382d22170b0000000000000000000000000000000a1724313d4a5764707e817b6e675d51483e332a21180f060000000000000000000000000000000000040d16202d3a4653606d7986939facb9c6c9bdb2a896897c6f6356493c302316090000000000000000000000000000000000000713202d3a4653606d79869aa4afbbc8ccbfb2a5998c7f7266594c3f3d44505b666d79839097a1aab4bec7cbc1b8aea49c918b7f716c61594f463c332a20170e040000000000000000000000000000000000000000000000000000000000000000020c17212834404b545f69717e8a96a0acb9c5cabeb3a99f958d80746c61584e443a2f261b110800000000000000000000000000000000000004101c28333e4850565e6161605b535d5c5c5d5e555c605c55524a40362a1f13070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3744505b65727e8b97a2adbdc6d1c5b8aca095897d70727f8b99a3afaca095887c6f62554b4034281c1004000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27333f4953606d7984919c9b9b9c968a7d7064584e43372b1f1409000000000000000000000000000000000000000000000003101d2a3643505d697683909a9c9c9a928679675c5153606d7986939a9c9b998f8276695c4f4336291c10030000030f1c2936424f5c6975828f9ca8b5c2c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d201307000000010c161f282f353f454a4b514e46443f3830261e140c020000000000000000000000000000000000000000000000020d19232e3740424a5153514a504f4f4f504b5153514b4340372e24190d02000a141e29333b424a51535554524c504f4f505051524b5153514b443f3830261c11060000010d19242f3a434c5154595a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a585651493f30271c120700000000000000000000030b12181c1f202422201f1b1714120e09040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a8794a0adbac7d3ccbfb3a6998c807366594d4033261a0d00020e1a25313b45525c64686d72777b7f8285888a8c8e909192929899929291908e8c8a8783807d78716d66605c554e463f362e251c130900000000000000000000030f1b27333f49535e686e7a828a8f929999928f8a827a6e685e53493f33271b0f0300000000000000000000000000000a1623303c4955616c70756e695e554b40362c21180f060000000000000000000000000000000001070e161f28323b4855616e7b889aa4afbbc8cfbdb1a4978a7e7164574b3e3124180b00000000000000000000000000000000000006121f2b3844505c667986939facb9c6cbbfb2a5988c7f7265594c3f47515b606c78828f95a0a9b2bcc6ccc3b9b0a69d928c7f736d625a50473d342b21180e050000000000000000000000000000000000000000000000000000000000000000000a141e29333b45515c666e7b85929fa8b2bdc9c6baada2979083786d605a50463c32281d140a000000000000000000000000000000000000000814202d3944505a61696e6d6c656a6969696a6b6b676d67635c52473b2f23170a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c7884919da9b3becfcabeb3a99d9184786c6d7a86929facb1a79a8d8074675c5145382c1f140900000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3744505b65717e8b97a1a8a7a89c8f83766a5f54473b3025190e010000000000000000000000000000000000000000000004111e2b3744515e6a7784919da9a8a39986796d605354616d7a879aa4a9a89d9083766a5d5043372a1d10040000030f1c2936424f5c6975828f9ca8b5c2c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d20130700000000040d161e2429343a3d3f44413a38342e261e140c0200000000000000000000000000000000000000000000000006121e2a35404951545c605c545d5c5c5c5c555c605c55524940352a1e130706111c26303b454d545c6062615e565d5c5c5d5d5e5e555c605c55504a42382e23170b000004111d2935414c555d6066676767676767676767676767676767676767676767676767676767676767676767676767676767676767676765625b5142392e23180c000000000000000000030d151d23292c2d312f2d2b2722211e1a15100c07010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0adbad1dcccbfb2a5998c7f7266594c3f3326190c0005121e2a36424d57646e747a7f84888b8f929797999b9d9e9e9fa3a39f9f9e9c9b999795908d89847e79726d675f5850483f372e251b110800000000000000000005121f2b3744505b656e7a8490949c9fa3a39f9c9490847a6e655b5044372b1f120700000000000000000000000000000814202d3944505a616468615e574d43392f241a0f0600000000000000000000000000000000070c12182028313a444f5965717e8b98acb6c0cccbbeb1a5988b7e7265584b3f3225180c00000000000000000000000000000000000003101c28343f4a5f6c7986929facb9c5cbbeb2a5988b7f7265584c464f59626d74808d949ea7b1bbc4cdc4bab1a79e948d80746d635a50483e352b22190f0600000000000000000000000000000000000000000000000000000000000000000006111c26303b454f59606d79839098a2aebac4cec5b8ab9f92857b6e665c51483e342a20160b02000000000000000000000000000000000000000a1623303c4955616c707b7a7978777675767777787979736e63584b3f3226190d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2b37434e5863707d8a96a0acbbc5cfc6b9ada2978b7e71656875828f9ca9b3ab9e9285796d6053463b30251a0e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c7884919da9b2b4ab9f94887c6f62564d42362a1d12070000000000000000000000000000000000000000000004111d2935414c556b7885919eabb5a094877a6d615455626e7b8895acb6aa9d9084776a5d5144372a1e06000000030f1c2936424f5c6975828f9ca8b5c2c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d2013070000000000040c131923292e313238342d2b28231c140c02000000000000000000000000000000000000000000000000000a16222f3b46515b63666d666a69696969696a676d67635b52473b2f23160a0d17232e38424d575e666d6f6e686a696969696a6a6b6c676d67605c544a3f34281c1003000613202c3945515d676d737474747474747474747474747474747474747474747474747474747474747474747474747474747474747474726d62544a4034281c100400000000000000010b151f272f34383a3d3b3937332d2e2b261f1c18120c0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0b5c0cbd7cbbfb2a5988c7f7265594c3f3226190c000714212d3a46535e697480868c9195989b9fa2a9a6a8a9aaaaa9a8a8a9ababa9a7a6a7a09d9996918b847f796f6a625a51493f372d231a0e0500000000000000000613202d394653606c778390969fa6acaeaeaca69f969082776c605346392e23180c000000000000000000000000000004101c28333e485055575b54534d453b31281d1208000000000000000000000000000001070c12181d2429323a434c56616b7683909da9b6c3d2cbbfb2a5988c7f7265594c3f3226190c000000000000000000000000000000000000000b17232e46535f6c7986929facb9c5cbbeb2a5988b7f7265584c4e58606b727f8b929da6b0b9c3cdc5bbb2a8a0958f82786d605b51483f362c23191007000000000000000000000000000000000000000000000000000000000000000000050e17232e38424d57616b74808d959faab3beccc8c6b9ac9f93877d70695f554b41382d22170f06000000000000000000000000000000000000000a1724313d4a5764707d878786858483828383848586868073675a4d4034271a0d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b15212e3b47535f6a76828f9ca8b2bdcdcbc0b5ab9e9285796d6064717e8a97a2adada2978a7e7164574d42362a1b11060000000000000000000000000000000000000000000000000000000000000000000000000000000007131f2c38434f5964707d8a95a0acbbbbb0a69b8e8174695e5246392f24180c000000000000000000000000000000000000000000000613202c3945515d677986929facaea194877b6e615456636f7c8996a2afab9e9184786b5e51452e23170c000000030f1c2936424f5c6975828f9ca8b5c2c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d20130700000000000001080d181d2224252b27201f1c17110a0200000000000000000000000000000000000000000000000000000c1825323e4b57636d737978777676757576777879736d63574b3f3225190c161f28343f4a545e696e797c7a78777675757677777878797a776d665c5044382b1f1206000714212d3a4754606d798081818181818181818181818181818181818181818181818181818181818181818181818181818181818181817f72665c5144382c1f12060000000000000007121d2731394045474a4846443f3b3a37312c29231d17110a030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c798699a3afbbc7d3cbbeb2a5988b7f7265584c3f3225190c000815212e3b4854616e7b8792989da0a8a8abadabaaaaa39f9e9c9b9b9c9fa2aaabadb1acaaa8a09e96918b837c716c635b51493f352b20160c0200000000000004101c2934404b5564717e8a949fa8b0b9bbbbb9b0a89f948a7e7164554b4034281c100400000000000000000000000000000b17222c363e44494a4e4846423b33291f160c00000000000000000000000002060a0f12181d23282f353d444c555e68707d89959fabb8c4d1cbbeb2a5988b7f7265584c3f3225190c0000000000000000000000000000000000000013202c3946535f6c7986929facb9c5cbbeb2a5988b7f7265584c565f6a707d87929fa4aeb8c1cbc6bdb3a9a1969083796d665c504940362d241a1107000000000000000000000000000000000000000000000000000000000000000000020b172028343f4a545e69707d8a929da7b1bcc5c0bbb9b2afa49a92857b6e675d53493f332721180d040000000000000000000000000000000000000c1825323f4b5865727e8b99929291908f8f909192928f8275685c4f4235291c0f020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d2a36414d56626f7c88949fabbac3cec7bbafa3998d8073675d606d7985929fabb3a99c8f8276695e5246382d22170b000000000000000000000000000000000000000000000000000000000000000000000000000000020d15222f3b4854606b7683909ca8b1bdc2b9ac9f92867b6e61554b4035291b11060000000000000000000000000000000000000000000714212d3a4754606d7a8799a3aeaea295887b6f62555764707d8a97a3b0ab9e9285786b5f4a3f34281c10030000030f1c2936424f5c6975828f9ca8b5c2c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d2013070000000000000000060c111517181e1b1312100b06000000000000000000000000000000000000000000000000000000000d192633404c5966737f8785848382828283838586807366594d4033261a131d28313a44505c666e7b84888785848382828383848585868683786d6053463a2d201307000e1b2835414e5b6874818c8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d86786d6053463a2d201307000000000000000c18232f39434b515357555350494847423c38342f28231c150c07010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3744505b657986929facb9c5d2cbbeb1a5988b7e7265584b3f3225180c000714212d3a4754606d7a86929faaacb1aeaca79f9d999892918f8e8f9092989a9fa2a9afb7b2aca8a19e9591877e726d635b51473d32281e130800000000000006131f2c3845515c6776838f9ca6b0bac2c7c7c2bab0a69c8f8276675c5145382c1f1306000000000000000000000000000005101a242c33393c3d423b3a36312921170d040000000000000000000306090e12161b1d24292e343940454f565d676d7a85919ea7b1bcc7d4cabdb0a4978a7d7164574a3e3124170b0000000000000000000000000000000000000613202c3946535f6c7986929facb9c5cbbeb2a5988b7f726558555e686f7c869299a3afb6c0cacbbfb4aba29791847a6e675d544a3f372e241b1208000000000000000000000000000000000000000000000000000000000000000000000a141d29323a44505c666e7b85929ea4aeb9c3beb6afaca5acaca2979183796d655b50443e332a1f160c0300000000000000000000000000000000000b1825323e4b5865717e8b989f9e9d9c9c9c9d9e9e9b8e8175685b4e4235281b0f02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18242f3946525e6874818e9ba6b0bbccd2c5b9ac9f92867b6e61555c6774818e9aa8b2ac9f93877b6e6153493f33271b0f03000000000000000000000000000000000000000000000000000000000000000000000000000008141f2b37424d57636f7c89949fabbac3c7bbaea3998d8073675d5145382d22170b0000000000000000000000000000000000000000000815222e3b4855616e7b8894abb5afa295897c6f62565864717e8b97a4b1ac9f928579665c5044382c1f12060000030f1c2936424f5c6975828f9ca8b5c2c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d2013070000000000000000000105090b0c110e0706030000000000000000000000000000000000000000000000000000000000000f1c2935424f5c6875828f9290908f8f8f8f90928e8174675b4e4134281b18242f3a434e58606d78839096979290908f8f9090919192939083796c605346392d20130600111e2b3744515e6a7784919a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a928679665c5144382c1f120600000000000004101c2934404b555c606462605b5355534d47454039342e261e18120b03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27333f495f6c7985929facb8c5d2cbbeb1a4988b7e7165584b3e3225180b000613202c3945515d677683909da9afaaa39f9995908c8886848381828385888d92979da5afb5b9b2aca7a099928b7f726d62594f443a3025190d0400000000000714202d3a4753606d7986929facb9c2ccd3d3ccc2b9ac9f9286796d6053463a2d20130700000000000000000000000000000008121a22282d3031352e2d2a251f170f050000000000000004060b1012131a1e21272b2f353940454b515960686d79828f97a1adb9c2cdd5c9bdb2a896897c706356493d3023160a0000000000000000000000000000000000000613202c3946535f6c7986929facb9c5cbbeb2a5988b7f7265535c676d7a849198a2abb5c0c8c9c0baaea39992857c6e685e554b42382e251c12090000000000000000000000000000000000000000000000000000000000000000000006111b262f3a444f59606d78829097a1adb6c0c0b6aca49f999fa3a9a0958f81776c60594f453c31281e150b00000000000000000000000000000000000b1824313e4b5764717e8a97a4abaaa9a8a9aaaaa79b8e8174685b4e4135281b0e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b55616e7b86929facb9c2cdc7bcb1a79b8e8175695e5255636f7c8996a0acafa4998c7f73655b5044372b1f130800000000000000000000000000000000000000000000000000000000000000000000000000020e1925303a47535f6975828f9ba6b0bccccbbfb5ab9e9285796d6053493f33271b0f0300000000000000000000000000000000000000000916222f3c4955626f7c8895a2afafa396897c7063565965727f8c98a5b2aea39886796d6053463a2d2013070000030f1c2936424f5c6975828f9ca8b5c2c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1b2835424e5b6875818e9b9d9c9c9c9c9c9d9a8d8074675a4d41342717212935414b55606a73808c959fa29f9d9c9c9c9c9d9d9e9691847b6e655b5044372b1f120500111e2b3744515e6a7784919da7a7a7a7a7a7a7a7a7a7a7a7a7a4a4a4a4a4a4a4a4a4a4a4a4a4a5a5a6a6a7a7a7a7a7a7a7a7a7a7a79e9185786b544a4034281c100400000000000006131f2c3845515c676d706e6c6566625f5753514b443f383029231d150d050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222d45525f6c7885929fabb8c5d2cabeb1a4978b7e7164584b3e3125180b0004111d2935414c556874818e9baca49f98928d87837f7b797776757576797c80858e939fa4abb5bdb9b1aba39f918b7f726b60564c41362a20150a00000000000815222e3b4855616e7b8899a3afbbc7d7deded3c7bbafa399887b6e6155483b2e221508000000000000000000000000000000000810171c2023242821211e1a140d05000000000104070c1013171c1f20262b2e32383940454b51555d606b6f7a838f949fa9b2becbd4d2c5b9aca096887b6e6155483b2e2215080000000000000000000000000000000000000613202c3946535f6c7986929facb9c5cbbeb2a5988b7f72655b656d79839096a1aab3bdc7cac0b7ada39f92877d706a5f564d433930261c130a00000000000000000000000000000000000000000000000000000000000000000000050e17222d38414c56606b73808c949fa9b3bec5bbafa49a938c9298a3a79e938c7f736b61574d433a30271c1207000000000000000000000000000000000a1724313d4a5764707d8a97a3b0b7b6b5b6b6b4a79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515d6773808c99a3aebac7d1c4b7ab9f95897c6f62574d53606c7884919eaab5ab9e9184786c6053463a2f24190d0100000000000000000000000000000000000000000000000000000000000000000000000005111e2a36414d56626e7b87939facb9c2cdc9c6b9ada1978b7e72655b5044372b1f150a00000000000000000000000000000000000000000a1723303d4a5663707d8996a3b0b0a3978a7d7064575a6673808d99a6b3b4aa93877a6d6054473a2d2114070000030f1c2936424f5c6975828f9ca8b5c2c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1b2835414e5b6874818e9ba7a9a9a8a8a9a69a8d8073675a4d4034271d29333b45515d676f7c87929fa7adabaaa9a8a8a9a9a19791847b6e695e53493f33271b0f0300111d2a3744505d6a7783909da7b1b4b4b4b4b4b4b4afa59e9b979797979797979797979797979899999a9a9b9c9c9d9e9fa3aba3a49e9185786b544a4034281c10040000000000000714202d3a4753606d797d7b7975726e6964605c55504a423d342f271f170f070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000121f2b3845525e6b7885919eabb8c4d1cabdb1a4978a7e7164574b3e3124180b00010d19242f414e5a6774818d9aa09a938e86807b77726e6c65696868666c6f737a818b9399a4afbbc1bdb4aea39f92877d70685e52463d32271b0f02000000000815222e3b4855616e7b8899a4afbbc7d4dfdfd4c7bbafa399887b6e6155483b2e2215080000000000000000000000000000000000050b101416171b1514120e090300000001070d1013181c1f23282b2d31373a3d43474b51555c60676d747d8490959fa6b0bbc4cfddd1c4b7aa9e918477695f53463a2d2114070000000000000000000000000000000000000613202c3946535f6c7986929facb9c5cbbeb2a5988b7f7265606c77818e959fa8b2bcc5cbc2b8afa59c918b7e716b60584e443b31281e140a01000000000000000000000000000000000000000000000000000000000000000000030c172027333f49535e68707d87939fa6b0bbc5bbb0a69f93887f86929fa4a59f93887d70695f564c42392e231812090000000000000000000000000000000a1723303d4a5663707d8996a3b0bcc3c2c2c0b3a69a8d8073675a4d4034271a0d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27333f4953606d7985929eabb4bfcbc9bdb2a89d9083766a605444505b6573808c99a6b0aca096897c7063554c4135291d11040000000000000000000000000000000000000000000000000000000000000000000000000714202d3946525e6874818e9aa4afbbc8c4bdb9b7b3a99d9184786c6053463c31261b0f02000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1b1a4978a7e7164575b6774818e9aa7b4ada194877a6e6154473b2e2114080000030f1c2936424f5c6975828f9ca8b5c2c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1b2734414e5a6774818d9aa7b4b5b5b5b3a6998d8073665a4d403327262f3b45505a606d79849199a3afbab8b7b6b5b3a9a29792857c6e695f574d41382d22170b00000d1a2733404d5a6673808d95a0aab4bfc0c0c0c0b6a99e938e8a8a8a8a8a8a8a8a8a8a8a8a8b8b8c8c8d8e8e8f8f9091929995969798928579665c5144382c1f12060000000000000d192633404c5966737f8a8885827f7b76716d67605c544f45403931292119100700000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3845525e6b7885919eabb8c4d1cabdb0a4978a7d7164574a3e3124170b0000081b2834414e5b6774818e9a969188817b736e696662605b535b545b6062686d747f87939fa5afbcc6bfbaafa39992857a6d61584e43372b1f1409000000000714202d3a4753606d7a86939facb9c3cdd4d4cdc4b9ac9f9286796d6053473a2d2014070000000000000000000000000000000000000004080a0a0f0807050200000003090e12181d2023282c2e34383a3c4247484e54555d60676d7279808791969fa7b0b8c2cdd6d4c8bdb2a89a8d807467574d42362a1e12050000000000000000000000000000000000000613202c3946535f6c7986929facb9c5cbbeb2a5988b7f72656c73808c939ea7b1bac4ccc3b9b0a69d938c7f736c61594f463c32291f160c02000000000000000000000000000000000000000000000000000000000000000000000b151e29323b44505b656d7a859199a4afb8c2beb3a99f948d80737e8b929da6a49a92857b6e685d544a403428241b11080000000000000000000000000000091623303c4956636f7c8996a2afbcc9cfccc0b3a6998d8073665a4d4033271a0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3744505b65717e8b97a1adbdc6d1c5b9ada1968a7e7164584e434953616e7b88949fabb2a89b8e8174675d5145392c201509000000000000000000000000000000000000000000000000000000000000000000000004111d2935414b55616e7b86929facb6c0c4bab2acabacaca0958a7d7063584e43372b1e1308000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2b1a5988b7e7265585c6875828f9ba8b5aea195887b6e6255483b2f2215080000030f1c2936424f5c6975828f9ca8b5c2c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1a2734414d5a6774808d9aa7b3c0c2bfb2a6998c7f7366594c4033222d38424d57616c74818e96a0abb5c0c5c3bcb4aaa29792857c6f6a5f574d453b2f261b110600000714202d3a4753606d79839198a2aebac0cbcdc1b4a79b8e817e7d7d7d7d7d7d7d7d7d7d7e7e7e7f8080818182838485868788898a8c8d86786d6053463a2d2013070000000000030f1c28333f4a546975828f97928f8c88837e79726d666059514b433b332b22191007000000000000000000000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a4978a7d7164574a3e3124170b00020f1c2935424f5c6875828f948f847c746e69615e57555350494e4a5053565d616d727f8b939eaab4bfcac0b5aba1978e81746a6054473b30251a0e0200000006131f2c3945515d677683909ca7b1bbc3c8c8c3bbb1a79c908376675c5145382c1f13060000000000000000000000000000000000000000000000020000000000040a0f151a1d24292c2e34383a3f4446494d5355586062676d72797f848d9399a0a8b1b9c2cad4d8cec6b8aca096897d7063564a3d31261a0e020000000000000000000000000000000000000613202c3946535f6c7986929facb9c5cbbeb2a5988b7f726b717e8b929ca5afb9c2ccc4bab1a79f948e81746d635a50473d342a20170d040000000000000000000000000000000000000000000000000000000000000000000007121c27303b444f59606c77828f97a1abb5c0c0b6aca1979082786d74808d949fa8a29791837a6d665c514440362d231a1006000000000000000000000000000916232f3c4956626f7c8995a2afbcc8d5ccbfb2a6998c7f7366594c403326190d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c7884919da9b3becfcabfb4aa9e9184796d6053463d46535f697683909caab4ac9f92867a6d6054473c31261a0e00000000000000000000000000000000000000000000000000000000000000000000000a13202c3945515d6773808d98a3aebec7bdb2a8a19e9fa3a89c8f82766a5f53473a3025190d000000000000000000000000000000000000000d1a2633404d596673808c99a6b3b2a5988c7f7265595d697683909ca9b6afa295887c6f6255493c2f2216090000030f1c2936424f5c6975828f9ca8b5c2c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2733404d5a6673808d99a6b3c0ccbfb2a5998c7f7266594c3f3328333f4a545e69717e8a939ea8b2bdc7c7bdb4aaa29892857c6f6a5f574e453c33291d140a0000000613202c3945515d676f7c86929fa5afb9c3cec5b8ab9f92857b71717171717171717171717172727373747575767778797a7b7d7e7f808074665c5144382c1f1206000000000006121f2b3844505b667784919d9e9c9994908a857f78706b605c554d453d342b22180f060000000000000000000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a4978a7d7164574a3e3124170b0003101d293643505c6976838f8f827a6f6a615e57534d4846443f423f44464c525b626d75818e98a2aebac6c7bdb3a99f93877c6f62574d42362a1e120500000004101d2935404b5564717e8b95a0a9b1b9bbbbb9b1a9a0958b7e7164554b4034291c1004000000000000000000000000000000000000000000000000000000040a0f161b20262b2f35393a4045464a505356575f62666a6f74797f848b91969fa4abb2bac2cbd4d9d0c6bcb1a79d9184786d6053463a2d201309000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5ccbfb3a6998c80736f7d87929fa4aeb7c1cbc5bcb2a8a0958f82786d605b51483e352b22180e0500000000000000000000000000000000000000000000000000000000000000000000071018232e39424c56606b727f8c949fa9b3bdc5bbafa49a92857b6e666d78829096a1a9a0958f82786d605b52483f352b22180f050000000000000000000000000915222f3c4855626f7b8895a2aebbc8d5cbbfb2a5988c7f7265594c3f3226190c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b37434e5863707d8a95a0acbbc5cfc6baaea2988c7f72665c504438424d5765717e8b98a3aeaea2988b7e7165574d42372b1b110600000000000000000000000000000000000000000000000000000000000000000006111b2834404a54606d7a85929faab4bfc5b9aca196919299a39f94887c6f62564c41362a1d12070000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4b2a6998c7f7366595d6a7784909daab7afa296897c6f6356493c302316090000030f1c2936424f5c6975828f9ca8b5c2c9bcb0a396897d7063564a3d3023170a00000005121e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3bfcbbeb2a5988b7f7265584c3f32313944505b666e7b85929fa5afbac4cbc0b5aba29892867d6f6a60584e453c332a21170b0200000004101d2935404b555f6a717e8b939da7b1bcc5c6baada2979083796d6464646464646464646465666667676869696a666c6d6f70717273746e64544a4034281c100400000000000613202d394653606c7986929faba8a69f9c97928c837d746d675e574e463d342a21180f0500000000000000000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a4978a7d7164574a3e3124170b0004111d2a3744505d6a77838e82796d686058524d46423b3937332d33383a4146515b616e7b86929faab4bfcac5bbafa49a8e8175695e52463a2d201408000000000c18242f394653606c78839097a0a7acafafaca7a0979083786c605346392f23180c000000000000000000000000000000000000000000000000000001070d161b21272c3137394045474b5153545c606367696e72777c81858b91969ea1a8afb5bdc3ccd4dbd2c7beb4aa9f958a7d70665c5044382c1f1206000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5d2c5b9ac9f92877d7b859299a3aeb6bfc9c7bdb4aaa1969083796d665c504940362d23190f0600000000000000000000000000000000000000000000000000000000000000000000050e19222834404a545e686f7d87929fa6b0bbc4bbb0a69f93887d70695e666d7a849198a2a79f948e81746d635a50473d342a21170e0400000000000000000000000815222e3b4855616e7b8894a1aebbc7d4cbbeb2a5988b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b15212e3a47535f6a76828f9ca8b1bdcdccc0b6ac9f92867a6d61544a3f343b4754606d7a86929facb4aa9c908376695f5347382d22170b0000000000000000000000000000000000000000000000000000000000000000000b17222d3844515c66727f8c97a2adbcc6beb3a99e918487929fa69a8e8174685e5246392e23180c0000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4b3a69a8d8073675a556b7885919eabb8b0a3968a7d7063574a3d3024170a000003101c2936434f5c6976828f9ca9b5c2c9bcb0a396897d7063564a3d3023170a00000005121f2b3845525e6b7885919eabb8c4c6b9ada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5b2bfcbbeb1a5988b7e7265584b3f2f39434e58606c78828f97a2adb7c1c9c1bbafa39992867d6f6a60584e463c332a21180f0500000000010d18242f39434e58616c74818e95a0aab4bfcabeb3a9a0958e81746c6258575757575757585859595a5b5b5c5c545b6061626364656767645c5242392e23180c0000000000030f1c28333f4a54626f7b8899a3aeb5b0aba9a29e95918981796e6960584e463c332a21170c03000000000000000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a4978a7d7164574a3e3124170b00030f1c2936424f5c69758282796d675d564e46423b36312d2b2722282b30353f46525e6973808d98a2aebac7ccc0b6ac9f92867b6e6154483b3025190d0100000007121f2b3844505b666e7b8590959d9fa4a49f9d9590857b6e665b5044382b1d120700000000000000000000000000000000000000000000000000040c131820272b32383c42474b5153555c6063666d6f73777b7f84898e92989ea1a8adb2bbc0c7d0d5d8d0cac0b6aca2989083766c61544a3f34281c1003000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5d2c7bbaea3999286849197a1abb4bfc8cbc0b5aba29891847b6e675d544a3f372e241b110700000000000000000000000000000000000000000000000000000000000000000000030c17202b343c44515c666e7a849199a3afb8c2beb3a99f948d80736b61575e686f7c86929fa4a69e938c80736c62594f463c332920160d03000000000000000000000814212e3b4754616e7a8794a1adbac7d4cbbeb1a4988b7e7165584b3e3225180b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d2a36414c56626f7c88949fabbac3cec8bbafa49a8d8174685d5242382e3945525d6875828e9ba9b3ab9f94887b6e6153493f33271b0f0300000000000000000000000000000000000000000000000000000000000000030f1b27333f4953606d7984919ea9b3bec6baada2978b7f818f9ba89f92867a6d61554b4034281c10040000000000000000000000000000000003101c2936434f5c6976828f9ca9b5b4a79a8d8174675a5d677986929facb9b0a4978a7d7164574a3e3124170b000003101d293643505c6976838f9ca9b6c2c9bdb0a3968a7d7063574a3d3024170a00000005121f2c3845525f6b7885929eabb8c5c6baada093877a6d6054473a2d211407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926323f4c5965727f8c98a5b2bfcabeb1a4978b7e7164584b3e35404b55606a727f8c949fa9b3bec9c1b7aea49f92877d706b60584e463c342a21180f0600000000000007121d28313c46505a606d79839098a2aebac0c5bcb1a79d938b7e716a5f564c4a4a4a4b4b4b4c4d4d4e4e4f504a505354555657595a5a58524a4030271c1207000000000006121f2b3844505b66727e8b98aba8a9abadb2ada7a09d938e837b6f6a60584e453c33291e150a000000000000000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a4978a7d7164574a3e3124170b00020f1b2834414d5a656f75756d675d554c443c36302a25201f1b171c1f242a36424d57606d7a86929facb8c5d2c7bbafa3998c7f7366564c4135291d1105000000030f1c28333f4a545e696e7b838b90939a9a93908b837b6e695e544a3f33281c0b01000000000000000000000000000000000000000000000000080d161d242932383d44484d53555d6064676d7074797c8084888c91959a9fa2aaadb2b9bdc4ccd2d9d7cec6bfbaafa49a92867c6f625a5042382e23170c00000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5d2cbbfb5aba398929196a1a9b3bdc6c9c1bbafa39992867c6f695e554c42382e251c120900000000000000000000000000000000000000000000000000000000000000000000000a151e29323c46505a606d78829096a1abb5c0c0b6aca1979082786d60594f565f6a717e8a929da8a59c928b7e716b60584e453b32281f150b020000000000000000000714212d3a4754606d7a8793a0adbac6d3cabeb1a4978b7e7164584b3e3125180b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232f3946525e6874818e9aa6b0bbccd2c6b9ac9f93877b6e62564c41302935414c5663707d8a97a1adb0a6998c8073655b5044372b1f13070000000000000000000000000000000000000000000000000000000000000005121f2b3744505b65717e8b96a1adbcc5c0b5ab9f9285797d8996a0a3988c7f73675c5145382c1f160b0000000000000000000000000000000004111d2a3744505d6a7783909daab6b4a79b8e8174685b606d7a8799a3aebab1a4988b7e7165584b3e3225180b000003101d2a3643505d697683909ca9b6c3cabdb0a3978a7d7064574a3d3124170a00000006121f2c3945525f6c7885929fabb8c5c7baada094877a6d6154473a2e211407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1becabdb1a4978a7e7164574b3e3c45515d676f7c87929fa6b0bbc5c2b9afa59d928b7f726b61594f463d342b22180f0600000000000000010c161f2a343e45515d676e7b86929fa4aeb9c3c3b9afa59f92867c6f685d53493f3e3e3e3f3f4040414242433f444647484a4b4c4d4d4c4740382f1e150b0000000000000613202d394653606c7884919c9b9b9c9ea1a8aaacaca59d9590857c6f6a5f574e453b30261c11060000000000000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a4978a7d7164574a3e3124170b00000c1925313d49545d656968605d554b433a322a251f1a13120f0b0f131a25303b45525d6875828f9babb5c0cccbc0b5ab9d908376685e5246392d201307000000000b17222d38424d575e696e787e8386888886837e786e695e574d42382d22170b0000000000000000000000000000000000000000000000010a111a1f282f353d43474f54575f62676d7175797d8185898d9196999da0a7abaeb4b9bdc4c9cfd7d9d2ccc4bcb4aea49f93887e706a5f53483e30261c110600000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5d2d1c6bdb4aaa39f9ea1a8b2bbc5cac1b7aea49f92877d706a5f574d433a30261c130a000000000000000000000000000000000000000000000000000000000000000000000006111c26303a444e58626c74808d949fa8b2bdc5bbafa49a92857b6e665c50474e58616c74818d96a0aba49f92877d706a5f574d443a31271d140a0000000000000000000714202d3a4753606d7a8693a0adb9c6d3cabdb0a4978a7d7164574a3e3124170b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2934404b55616d7a86929facb9c2ccc8bdb2a89c8f82766a5f53443a30242f3a4653606d7985929eabb7ab9e9184786c6053463a2f24180d010000000000000000000000000000000000000000000000000000000000000613202d394653606c7883909da8b2bdc7bbafa3998d80737884919daa9e9285796d6053463d33271c100300000000000000000000000000000004101c2834404b546b7884919eabb7b5a89b8f8275685c616e7b8794abb4bfb2a5988b7f7265584c3f3225190c000004111d2a3744505d6a7783909daab6c3cabdb0a4978a7d7164574a3e3124170b00000006131f2c3946525f6c7985929facb8c5c7baada194877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becabdb0a4978a7d7164574a3e45505a606d79849199a3aeb8c2c3bab1a79e938d80736d62594f473d342b22191006000000000000000000040d18222935404b555f69717e8a929da7b1bcc5c0baaea39891847a6d655b50443d3231323333343435362d3338393a3c3d3e3f40413f3c362f261d0c030000000000000b1824313e4b5764717e8a91908e8f909196989da0a7aca79f9791857c6f6a5f574d42382e23170d0400000000000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a4978a7d7164574a3e3124170b00000915212c37424b545a5c5b53514b433a3128201a140e090503000309141f2935414c5664717e8b99a4afbbc7d1c6b9ac9f93867a6d6154473a2e2114070000000006111c262f3b454d575e666d71767a7b7b7a76716d665e574d453b2f261c110600000000000000000000000000000000000000000000020a131b232c313a41454e54596063696e747a7d81858a8e92979a9da0a8aaacb1b8babec5c9cfd5d9d4d0c7c0bbb2aaa29f928c7f726c61584e43362c1e150a0000000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5d2d8cfc6bcb4aeacabacb2bac4cbc2b8afa59c928b7e716b60584e453b31281e150a0100000000000000000000000000000000000000000000000000000000000000000000071017232e38424c56606a717e8b929da6b0bac4bcb1a79f93887d70695e544a3f46505a606d79849199a3aea39992867c6f695e564c43392f261c110600000000000000000714202d3a4753606d7a8693a0adb9d2ddcabdb0a4978a7d7164574a3e3124170b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c6773808c98a3aebac7d1c5b8aca096897d7063584e4332281f2c3844505c6674808d9aa7b1aca196897d7063554b4135291d1104000000000000000000000000000000000000000000000000000000000006131f2b37434e5863707d8a95a0acbac4c5b9ac9f92877b6e727f8b98a2a1978b7e7164594f44382c1f140900000000000000000000000000000006131f2c3845515c667985929facb8b5a99c8f8276695c626f7c8895a2afbbb2a5998c7f7266594c3f3326190c000004111e2a3744515d6a7784909daab7c3cabdb1a4978a7e7164574b3e3124180b0000000613202c3946535f6c7986929facb9c5c7bbaea194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becabdb0a3978a7d7064574a434d57616c74818e96a0abb5bfc5bbb2a89f958e81776c605b51473e352b221910070000000000000000000000061018242f39434d57616c74808d95a0a9b3becabfb4aaa0968f82776c60594f443b302626262728282922282b2d2e2f303132343433302b241d140b000000000000000a1623303d495663707d85848382828384888b90959da0a7a9a19792857c6e695e544a3f34281f160c01000000000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a4978a7d7164574a3e3124170b000004101b26303942494d4f4f4745403a31281f160d09030000000000020d19242f3a4754606d7a86939facb9c6d2c7bbafa4998a7d7164574a3e3124170b00000000000a141d29333b454d545c6065676d6e6e6d6765605c544d453b33291d140a00000000000000000000000000000000000000000000020b141c252d353e434b515860626b6f757b81868a8e92989b9ea1a9aaacb2b7b8bcc3c6cad0d5d7d4cec8c2bdb5afa8a198928a80736d635a50463c32241a0c030000000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5d2d5ccc3bcb8b7b8b7b9bdc4ccc3b9b0a69e938c80736c62594f463c33291f160c0300000000000000000000000000000000000000000000000000000000000000000000040e182228343f4a545e686f7c86929fa4aeb8c2beb3aa9f958d80736b61574d42383e45515d676f7c87929fa7aba29891847b6e685d554b42382d22171209000000000000000713202d3a4653606d798693a0b5c0ccd7cabdb0a3978a7d7064574a3d3124170a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27333f4953606d7985929eaab4bfcbcabfb4aa9d9184786c6053463c31201c28343f4a54626f7c8895a0acb2a89b8e8174675d5145392c20140900000000000000000000000000000000000000000000000000000000020d15222e3b4754606a76838f9ca7b1bcc8bcb1a79b8f8275696d7a86929fa99d9083776b6054483b31261a0e0100000000000000000000000000000713202d3a4653606d798698a2aebab6a99d9083766a5d63707d8996a3b0bcb3a6998d8073665a4d4033271a0d000004111e2b3744515e6a7784919daab7c4cabeb1a4978b7e7164584b3e3125180b00000006121f2b3844505c667986939facb9c6c8bbaea195887b6e6255483b2f221508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1becabdb0a3978a7d7064574a4b555f69717e8a939da8b2bdc6bcb3a9a0969083796d655b50493f352c231910070000000000000000000000000007121d27313c45505a606d79839097a2adbac0c6bcb2a89e938c7f726b60564d42382e23171a1b1b1c171c1f202122232426272726241f1a130b02000000000000000916222f3b4854606b70787876757576787b7f838a90959fa4a9a19791847b6e665c50443d31281e1308000000000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a4978a7d7164574a3e3124170b00000009141e2730373d4142423a39352f281f160d0400000000000000000813202c3945525d687784919daab7c4d0ccc0b5ab998c7f7366594c403326190d0000000000020b172129333b424a5053555d606262605d5553504a423b332921170b02000000000000000000000000000000000000000000000b141d262e373f474f555d606a6f767c82878e92989b9fa2aaabadb3b7b8bdc3c5c8ced3d6d5d1cbc7c3bdb8b0aba49f9691867e736e635b51483e342a201108000000000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5d2cec3b9b1acaaacb1b9bfc7c5bbb1a79f948e81756e635a50473d342a21170d0400000000000000000000000000000000000000000000000000000000000000000000020c16202a343c44505c666d7a849198a3aeb6c0c4baaea2989083786d60594f453b3035404b55606a737f8c959faaaaa19691837a6d675c544a3f3328241b11070000000000000613202d394653606c798699a4afbbc7d4c9bdb0a3968a7d7063574a3d3024170a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3744505b65717e8b97a1adbcc6d1c6baaea2988b7f72655b5044372b1f17232e3847545f6a7784909dabb5ac9f92867a6d6054473b31261a0e0000000000000000000000000000000000000000000000000000000008131e2b37424d57626f7c89949fabb9c3c4b8aca095897c70636874818e9aa7a095897d7063574d42362a1d120700000000000000000000000000000814212e3b4754616e7a8794aab4bfb7aa9d9084776a5d64717e8a97a4b1bdb3a79a8d8074675a4d4134271a0e000005111e2b3844515e6b7784919eaab7c4cbbeb1a4988b7e7165584b3e3225180b0000000713202d3a4653606d79869aa4afbbc8c8bbaea295887b6f6255483c2f221509000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1bdc9bdb0a3968a7d7063574a515c676e7b86929fa5afbac3bfb4aaa19791847a6d675c53493f372d231a11070000000000000000000000000000010b151f2a333e45515c676e7b85929fa4aeb9c2c4bab0a69f92877d70695e544a3f342821180d0f060b0f121314151718191a1a1a17130e080100000000000000000713202c38444f5960636b6b69686869696e72777d838d9399a3a9a1969082786d60594f433a2f24190b020000000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a4978a7d7164574a3e3124170b000000020c151e262c313436352d2c29241d160d0400000000000000000004111d2935414c566875828e9ba8b5c1ced2c1b4a89b8e8175685b4e4235281b06000000000000050f17212930383f44464c5154555554514c46443f38302921170f050000000000000000000000000000000000000000000009121d262f384049515961676d747c83898f939a9fa2aaabaeb4b8b9bec4c5c8ced1d4d4d1cfc9c7c0bbb9b1aca69f99938d847c716c635c52493f362c22180e00000000000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5d2c8bcb1a7a09da0a7adb5bfbeb3a9a0958f82786d605c52483f352b22180f05000000000000000000000000000000000000000000000000000000000000000000000008131e28323c46505a606d78828f96a1aab4bfc4baafa59f92857b6e665c50473e33292f39434e58606d78839098a2aea8a0959082796d665b504440362d23190f05000000000005121f2b3744505b657986939facb9c6d2c9bcb0a396897d7063564a3d3023170a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c7884919da9b3becfd2c5b8ac9f92867a6d6053493f33271b111c2b37434e5866727f8c99a4afaea2988b7e7164574d42362a1b11060000000000000000000000000000000000000000000000000000010d1925303a46535f6975828e9ba6b0bbc9beb3a99d9083776b60626f7c88959fa79b8f8275695f5346392f24180c00000000000000000000000000000915222f3c4855626f7b8895a2aebbb7aa9e9184776b5e65727f8b98a5b2beb4a79b8e8174685b4e4135281b0e000005121f2b3845525e6b7885919eabb8c4cbbeb1a5988b7e7265584b3f3225180c0000000714202d3a4753606d7a8693a0b6c0ccc8bbafa295887c6f6255493c2f221609000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1bdc9bcb0a396897d706356505a606d79839098a2aeb7c0c2baaea39892857b6e685e554b41382d251b110800000000000000000000000000000000030d18212834404b555f69707e8a929da7b1bbc5c1bbafa39991857b6e665c50443e332a1f150b010003060607090a0b0c0d0e0d0b07030000000000000000000004101c27323d474f54565f5e5d5b5c575f61656b707980879298a2a89f948d80736b61554c4135291d140a0000000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a4978a7d7164574a3e3124170b00000000030c141b212528292820201d18130c0400000000000000000000010d192430404c5966737f8c99a6b2bfccd0c3b7aa9d9084776a5d51442e23170c00000000000000050f171e262e34383a41454748484745413a38342e261e170f0500000000000000000000000000000000000000000000060f1b242f38414a525b626b7079808790959b9fa4acaeb4b8babec5c6cacfd1d4d4d2cec8c5c4beb9b5afaca8a09d949087817a6f6a615a524a40372e241a100700000000000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5d2c5b8aca09591959ca3adbbb9ada19791837a6d665c514a40362d231a10060000000000000000000000000000000000000000000000000000000000000000000000010d1925303a444e58616c74808d949fa8b2bcc6bdb2a89e938a7e71695e544a3f352c2027313d44505c666e7b86929fa5afa79f948f81786c605b51483f352b21160b0000000000030f1b27333f495f6c7986929facb9c5d2c9bcafa396897c706356493d3023160a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b37434e5863707d8995a0acbbc5cfc7bcb0a69a8e8174685d5241382d22170f1b26323c4754616e7b87939facb4aa9c8f8376695f5346382d22170b000000000000000000000000000000000000000000000000000005111e2a36414c56616e7b87939facb9c2c6b9ada1978b7e7164595f6a7683909da99f93877b6e61554b4035291d1004000000000000000000000000000a1623303d495663707c8996a3afbcb8ab9e9285786b5f66737f8c99a6b2bfb5a89b8e8275685b4f4235281c0f000005121f2c3845525f6b7885929eabb8c5cbbeb2a5988b7f7265584c3f3225190c0000000714212d3a4754606d7a8793a0adbad2c9bcafa296897c6f6356493c30231609000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0bdc9bcb0a396897d70635657616c74808d95a0aab4bec2b8aea49f92867d6f695f564c43392f261b1309000000000000000000000000000000000000060f18232e39434d57616c74808d959fa9b3bec7c0b5aba1979082786d605a50453c31271d120700000000000000000001010000000000000000000000000000000b16212b353d4448495251504f4f4d53555961676d737e869298a2a69f93887d70675d51453c2f261b110600000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a4978a7d7164574a3e3124170b000000000002091015191b1c1c1413110d0701000000000000000000000000081825323e4b5865717e8b98a4b1becbd1c5b8ab9e9285786b544a3f34281c100300000000000000050c141c23282b2f35393a3b3b3a39352f2b28231c140c0500000000000000000000000000000000000000000000020b18212d36414a535c636d727d848d93999fa7acafb6babfc5c6cad0d2d5d2d1cbc7c5c3bdb8b7b3adaba39f9b95918a827c746d686058504840382e251c12080000000000000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5d0c4b7aa9d91848c919ba3afb6ab9e92857b6e685d544b40372e251c130a01000000000000000000000000000000000000000000000000000000000000000000000005111d2935414c565f6a717e8a929da6b0bac0c0b5aba0968e81746c61574d42382e231a1f28343f4a545f69717e8b939ea9b0a69e938d80746d635a50473d33271c100400000000000b17222d46525f6c7985929facb8c5d2c9bcafa296897c6f6356493c30231609000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b15212e3a47535f6a76828f9ca7b1bccdd0c4b7ab9f94887c6f62564c412f261b110a15202d3a46525e6976828f9caab4ac9f93877b6e6153493f33271b0f03000000000000000000000000000000000000000000000000000713202d3946525e6874818d99a4afbbc7bfb5ab9e9285796d60535864717e8b97a2a4998d8073675d5145392c1f160b000000000000000000000000000a1724313d4a5764707d8a97a3b0bdb8ac9f928579665b6774808d9aa7b3c0b5a89c8f8275695c4f4236291c0f000005121f2b3744505b657985929facb8c5ccbfb2a5998c7f7266594c3f3326190c0000000814212e3b4754616e7a8794a1adbac7c9bcb0a396897d7063564a3d3023170a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdc9bcafa396897c7063555f69717e8a929da7b1bcc4bab0a69d928b7e716b60574d443a31271d140a010000000000000000000000000000000000000007121d27303b45505a606d78839097a2acb6c0c7bdb3a99f948d80736c61574d43392f2418100700000000000000000000000000000000000000000000000000050f19232b32383b3d45454342424246484f555c606c707d869299a4a49a91847a6d60584e41382d22170b00000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a4978a7d7164574a3e3124170b0000000000000004090c0f0f0f0706040100000000000000000000000000000b1724313e4a5764717d8a97a4b0bdcad2c5b8ac9f928579665c5044382c1f12060000000000000000020a11171c1f24292c2d2f2f2d2c29241f1c17110a0200000000000000000000000000000000000000000000000a141d2a333f48535c646e737f8891969fa4abb1b9bbc0c7cad0d3d3d2cfc9c5c4c0bbb9b6b2acaaa9a19e99928f89847e766f6a615e564e463e362e261c130a000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5cbbeb2a5988b7f7f8b919fa4acac9f92877e716c625b51493f372e251c130a00000000000000000000000000000000000000000000000000000000000000000000000713202d3946525e686f7c86929fa4afb6b1b3b6afa3999184796d605a50453b30261c1117232e38424d57626c75818f97a1ababa59d928c7f736c62594f44382c2013070000000000121f2c3945525f6c7885929fabb8c5d2c8bcafa295897c6f6256493c2f23160900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d2a36414c56626f7c88949fabb9c3cec9beb3a99c9083766a5f53433a2f1d140a05111e2a36424d5764717e8b98a2aeafa49a8c7f73655b5044372b1f120700000000000000000000000000000000000000000000000004111d2935404b55616d7a86929fabb5c0c7bbaea3998c8073675c5153606d7985929fab9f9285796d6053473d32271b10030000000000000000000000000b1825323e4b5865717e8b98a4b1b7b9aea29886796c606875818e9ba8b4b8b6a99c908376695d5043362a1d1000000613202d394653606c7986939facb9c6cabfb3a6998c807366594d4033261a0d0000000815222e3b4855616e7b8894a1aebbcad0bdb0a3978a7d7064574a3d3124170a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdc9bcafa296897c6f635c676e7b86929fa4aeb9c3bcb2a89f948d80736c62594f453c32281f150b020000000000000000000000000000000000000000000b151e29333e44515c666e7b85929aa4afbbc2c4bbb0a69d928a7e70695f554b40352922190e040000000000000000000000000000000000000000000000000007111921272c2f303838363531373a3e434b515a616b707d87939fa6a1978d80746a5f53493f33271c1106000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a4978a7d7164574a3e3124170b000000000000000000000203020000000000000000000000000000000000000a1723303d4a5663707d8996a3b0bcc9d3c7baaea39886796d6053463a2d20130700000000000000000000060b1013191d2021222221201d1913100b0600000000000000000000000000000000000000000000000006111b262f3c46505a646e74808c939aa1a8afb5bdc2c8ccd2d3d1cbc7c5c2bdb9b7b5afaca9a8a09d9a97928d87827d77716c625f58524c443c342c241c140a01000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5cbbeb2a5988b7f727f8b939aa3aba39992877e726d625b514940372e251c1406000000000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a8491989e9fa4aca4a7a9a69f92877c6f675d51483e33291e150a111c26303b45505a616d7a85919e9e9e9fa39c918b7e716b6054483c2f2216090000000006121f2c3945525f6c7885929fabb8c5d2c8bbafa295887c6f6255493c2f22160909090a0a09090808080706040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18242f3946525e6874818e9ba6b0bbcbd2c6b9ada1978a7e7164584e4331281e0b02020e1a25303b4753606d7a85929facb6ac9e9184786c605346392f24180d0100000000000000000000000000000000000000000000000a13202c3945515d6773808c98a3aebdc7c5b9ac9f92867b6e61554b515c6774818d9aa7a2978b7e7165594f44382c1f14090000000000000000000000000c1926333f4c5966727f8c99a5a9aaacafaa93877a6d606976828f9ca9aaabadaa9d9083776a5d5044372a1d1100000714202d3a4753606d7a869aa4afb8babebeb3a6998d8073665a4d4033271a0d0000000915222f3c4855626f7b8895a2aebabebcbdb1a4978a7e7164574b3e3124180b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a96a3b0bdc9bcafa296897c6f63606d79839098a2aeb6c0beb4aaa0968f82786d605a50473d332a20160d0300000000000000000000000000000000000000000000030c18212834404a545e69707d88939fa6b0bbc5c2b8aea49f92857b6e675d51453f342b20160b0200000000000000000000000000000000000000000000000000070f161c2022232c2b2a28262b2d303940455059616b727f8c949fa99f92877c6f655b5044382e23170c010000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c8995a2afbcc8d6cbbfb4aa93877a6d6054473a2d21140700000000000000000000000003080d11131415151413110d080300000000000000000000000000000000000000000000000000000b17222d38414e58626c74808d929fa4acb2bbc0c7d0d4d4cdc7c6bfbab9b5b2adababa39f9c9896918d8985807b75706b64615a534e46413a322b221a120a0200000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5cbbeb2a5988b7f72727f889299a3aba39993887f726d635b514940372e2617110a0200000000000000000000000000000000000000000000000000000000000000010e1b2834414e5b6774818e909192939a95989a9c9f948c7f726a60554b41362c21170c030a141e29333f46525e68707d899291919299949692877d706356493d3023160a0000000005121f2c3845525f6b7885929eabb8c5d1c8bbaea295887b6f6255483c2f2215151616161616161515141313100c070c0a0807050100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b55616e7a86929facb9c2cccbc0b5ab9e9185796d6053463c3120160c00000914202c3945515d6774818e9ba8b2aca096897c6f63554b4035291d10040000000000000000000000000000000000000000000006111c2934404b55606d7a85929eaab4bfc8bcb1a79b8e8175695e52434b55626f7c8995a0a99d9083776b6054483b30251a0e0100000000000000000000000c1926333f4c5966727f8c999d9d9e9fa3ab94877a6e616a7783909d9d9d9ea1a99e9184776b5e5144382b1e1100000714212e3a4754616d7a8794a0aaabaeb3b1b3a79a8d8074675a4d4134271a0e0100000916232f3c4956626f7c8995a2abadb3b0b2b1a4988b7e7165584b3e3225180b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1723303d4a5663707d8996a3b0bcc8bcafa295897c6f626c74808d95a0aab4bec0b6aca29891847a6d665c50483e342b21180e05000000000000000000000000000000000000000000000000060f18232e39424d57616b73808d949fa9b3bec7c0baaea2989083796d605a50463c32281d140a0000000000000000000000000000000000000000000000000000050b101316161f1e1d1c1a1e21272e343e474f59606c77829098a3a3999083786c60544a3f34281d12070000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b8895a1aebbc8dcd0baada194877a6e6154473b2e211408000000000000000000000000000001040607080807060401000000000000000000000000000000000000000000000000000000030f1b27333f49535f6a717e8b929ca4afb6bec4ccd2d2ccc8c2bcb7b4aeaca9a8a19e9a9992908c8884807c79736e69636059555047433c35302820191008000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5cbbeb2a5988b7f726d717e879299a3aba49a938b7f726d635b524a403827221b140b02000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e848484858687898b8d8f928f82786c60584e433a2f241a0f0500020c18212a36414c56616b7380858585868687898b8c8276695c4f4336291c100300000005121f2b3845525e6b7885919eabb8c4d1c8bbaea295887b6f6255483c2f222122222323232322222221201f1c181b19171414110d08080602000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515d6773808c99a3aebac7d3c7bbafa3998c8073665c5144382c1f1204000004101d2935404b5563707d8996a1adb2a89b8e8174675d5145392c201409000000000000000000000000000000000000000000000c17232e3845515c67727f8c97a2adbcc6c4b8ab9f95897c6f62564d424754606a7784909daba095897c7063574d42362a1d120700000000000000000000000b1825313e4b5864717e8b9290909192999a99877b6e616976828f9190909196979a9184776b5e5144382b1e1100000815212e3b4854616e7b87949d9e9fa2aaa5a7a79a8e8174675b4e4134281b0e0100000a1623303d495663707c89969d9fa2a9a3a5a7a5988b7f7265584c3f3225190c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1723303d4a5663707d8996a3b0bcc8bbafa295887c6f69717e8a929da7b1bcc3bbafa49a92867c6f685d544a3f362d22190f06000000000000000000000000000000000000000000000000000007121c27303b454f59606d78829097a1acb6c0cabeb3aaa0958e81746d62584e443a2f261b11060000000000000000000000000000000000000000000000000000000407090a121210090e12151d2328353e44505b656e7b86929fa79f958a7e71665c5044392f23180c0000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c7baada194877a6e6154473b2e21140800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3744505b656e7c86929fa4aebbc0c7d0d7d0c7c0bbb9b1ababa39f9c9896918e8a86837f7b77736f6d66615e57544f49453e373229251e160e0700000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5cbbeb2a5988b7f72656c717e879299a3aaa49f918b7f736d635c524a40332d261d140b020000000000000000000000000000000000000000000000000000000000000a1723303d4955616c7177777778797a7c7e808385847b6e665b50463d31281d1208000000060f1925303a444f59636e73797878797a7b7c7e7f7c6f6256493c2f2316090000000005121f2b3845525e6b7885919eabb8c4d1c8bbaea195887b6e6255483b2f2d2e2f2f2f30302f2f2f2e2e2d2c282328262321201e191514120e09060300000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27333f4953606d7985929eabb4bfcbd2c5b9ac9f92867b6e61544a4034281c10040000010d18242f394653606c7884919eabb7ac9f92857a6d6053473b31251a0e00000000000000000000000000000000000000000003101c28343f4a54606d7985919ea9b3bec9bdb2a99d9083766a6054443b434e5865727f8c99a3a79b8e8275695e5246392f23180c00000000000000000000000814212e3b4754616e7b8385848384868a8d8f86796d6064717e8484838385878a8e908276695d5043362a1d1000000815222e3b4855616e7b88919091929896989a9d9b8e8175685b4e4235281b0f0200000a1724303d4a5763707d8a909092979596989b9d998c7f7266594c3f3326190c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc8bbafa295887c6f6e7b85929fa4aeb9c3b9afa59f93887e706a5f564c42382e241b1007000000000000000000000000000000000000000000000000000000000b151e29333e44505c666e7b85929aa4afbbc2c5bcb1a79e938b7e716a60564c41382d22170e050000000000000000000000000000000000000000000000000000000000000505030002050b12182327333f49535f69727f8c95a0a79e9184786d60554b4034291c110600000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c7baada194877a6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c78839098a2aeb7c0ccd2d2ccc3beb6afaca79f9d99928f8c8884817d7a76726e696763605c54524d48443d39332b262019130c040000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5cbbeb2a5988b7f7265626c717e879298a2aaa39b918c7f736e635c52443f382f261d140c0300000000000000000000000000000000000000000000000000000000000814212d3945505a61646a6a6a666d6e6f71747678786e695e544a3f342b1f160c000000000008131e28323d47525c63676c6b6b676d6e7071736f6a6054473b2e2215080000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b3a3a3b3b3c3c3d3d3c3c3b3b3b3a38342e3433302e2d2a2522211e1a15130f0a04000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3744505b65727e8b97a1adbdc6d1c8bcb1a79b8e8275695e5242392e23180c0000000007121f2b3844505b6673808d99a7b1aea2988b7e7164574d42362a1c1106000000000000000000000000000000000000000006121f2c3844505c66727f8b97a1adbbc5c5b9ada1968a7e7164584e43323d4754616e7a86929fac9f92877b6e61554b4034291c1004000000000000000000000714202d3a46525e696e77787776777a7d80838074665c616c7178787677787b7e81837e7164584b3e3125180b00000613202d394653606c78818483848587898b8e90928f8275685c4f4235291c0f0200000915222f3c4855626f7c838484858788898b8e90928c807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc8bbaea295887c6f79839098a2aeb6c0bbb1a79e938c7f736c61584e443a30261c12090000000000000000000000000000000000000000000000000000000000030c172128343f4a545e69707d88939fa6b0bbc4c3b9afa59f92867c6f685d53493f332720170c03000000000000000000000000000000000000000000000000000000000000000000000000071117222d38414d57606d7883909da7a0968b7e71675c5145382e23170c00000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c7baada194877a6e6154473b2e211408000000000000000000000000000000000002030302000000000000000000000000000000000000000000000000000000000006121f2b37434e5863707d8a95a0aab4bfc9d8d0c7c0bbb1aca49f9b95908b86827f7b7874716d6865625f575653504a46423b38332d28221b150d0802000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5cbbeb2a5988b7f72655a616c707d869298a2aaa39c918c80736e645c504941382f261e150c030000000000000000000000000000000000000000000000000000000005111d28343e485055575e5d545c606162656769666c665e574d42382d22190d040000000000020c16202c35404a52585a5f5e555d60616364666260584e43372b1f13060000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e625548444647474849494949494948484746454042413f3d3b3936302f2e2b26211f1b15100c070000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c7884919da9b3becfd1c5b8aca095897d7063574d4230271c120700000000030f1c28333f4a54626e7b88959fabb4aa9c8f8276695e5346382e23170b00000000000000000000000000000000000000030f1c28333f4a54606d7984919ea9b3becbbfb4aa9e9184796d6053463d323946525e6875828f9ba9a3998d8073675c5145382c1f160b0000000000000000000005111e2a36424d575e616a6b6a6a676d707376746e64545a61646b6b6a6a696e717476716c6256493d3024170a000006121f2b3844505b666c75777777787a7c7e818385877f7366594c403326190d0000000815212e3a47535f6a6f777777787a7b7d7f818386877e7165584b3e3225180b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c2b5a89b8f817a808d95a0aab3bebdb3a9a0958f81776c605a50463c32281e140a00000000000000000000000000000000000000000000000000000000000000050f17232e38424d57606b73808c949fa9b3bdc7c1baaea39891847a6d655b50443d33291e150b0000000000000000000000000000000000000000000000000000000000000000000000000006111b262f3c44505c66707d8995a0a89e9184796d60544a3f34281c1106000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c7baada194877a6e6154473b2e211408000000000000000000000000010406070b0f10100f0b070604010000000000000000000000000000000000000000000000000815212e3a47535f6a76828f9ca7b1bcc6d0d2c7bdb5afa79f9a938f88837e7a76726e6a6764605d5655534d4946443f3836302c27211c170f0a040000000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5cbbeb2a5988b7f7265585a616b707d869298a2a9a39c928c80746e605b534a423830271e150d04000000000000000000000000000000000000000000000000000000000c17222c363e45494b51514a50535456585a545b605b544d453b2f261c100700000000000000050e1a232e3840474b4d52524b51535456585956544e463d32271b0f030000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e62554a505354545555565656565555555453514b4f4e4c4a4746413f3b3a37312e2b261f1c18120b0600000000000000000000000000000000000000000000000000000000000000000006121f2b37434e5863707d8a96a0acbbc5cfcabeb4aa9d9184776b6054453b301e150b0000000000000b17222d3847535f6a7783909dabb5ac9f93877b6e61544a3f34281c100300000000000000000000000000000000000006121f2b3844505b66717e8b96a1acbbc4c7baaea3988c7f73665c5144382a36414c5664707d8a97a1ab9e9285796d6053473d32271c1003000000000000000000020e1a25303b454d52545d5f5d555d6063676967645c525055575e5e5d575e6164676964625a5045392d2115080000030f1c28333f4a545b60686a6a6b686d70727476797a736d63574b3e3225190c00000006121f2b37434e585f626a6a6a676d6e70727477797a716d62564a3d3124170b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c3b6aa9e938f858d929da7b1bcc0b5aba2979083796d655b50483e342a20160c02000000000000000000000000000000000000000000000000000000000000000006111c26303b454f59606d78828f97a1abb5c0cbbfb4aaa1968f82776c60594f453b30271c1207000000000000000000000000000000000000000000000000000000000000000000000000000a141d28343f4a54616b7783909da9a1968b7f72665c5044382d22170b000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c7baada194877a6e6154473b2e2114080000000000000000000001080d111314181b1d1d1b181413110d0801000000000000000000000000000000000000000000000915222f3c4855626f7c88949fabb9c3ced7ccc0b5aba49f959087827c76726d6865625f585754524c4847423c3a38342e2a251f1c16110c090b0b0905010000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5cbbeb2a5988b7f7265585059616b707d869297a2aaa49c928d80746c655b544a423930271f160e0500000000000000000000000000000000000000000000000000000006101a242c34393d3e44443f444647494b4d4a5053504a423b33291d140a00000000000000000008111c262e363b3f40464540454748494b4c4947433d342b20160a000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e625e5f5c60606162626263636262626161605c545c5b595654524c4c4847423c3b37322c28231d17110a02000000000000000000000000000000000000000000000000000000000000010b15212e3b47535f6a76828f9ca8b2bdcdd3c6baaea2988b7f7265594f4433291f0c0300000000000006111c2b37434e5865727f8b99a3afafa49a8c7f73665c5044382b1f15090000000000000000000000000000000000000613202d394653606c7884919da8b2bdcdc5b9ac9f92867a6d61544a403428303b4653606d7985929eaba1978b7e7164594f44382c1f15090000000000000000000009141f29333b4246475152514b5154575a5c5a58524a45494b5251504d5254575b5d585650483e34291d11050000000b17222d38424a50535b5e5d565e61636567666c6d68635b52463b2f23160a000000030f1b26313c464e53555e5d555d6062636568666d6d68625a50453a2e211509000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c6bbafa59e9691969da4aeb9c2bbafa39992857b6e675d53493f362c22180e04000000000000000000000000000000000000000000000000000000000000000000000a151e29333d44505c666e7a859199a4afbbc2c6bcb2a89e948c7f726b60574d42392e23180f06000000000000000000000000000000000000000000000000000000000000000000000000020b17232e38424f5964717e8b97a1a89e9184796d60544a3f33281c0f030000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c7baada194877a6e6154473b2e211408000000000000000000040c13191d202125282a2a282521201d19130c040000000000000000000000000000000000000000000c1926323f4c5965727f8c98a6b0bbcbd5cdc4bbafa499938d837c756f6a65615d5655534e4a4745413b3a37312d2b28231c1a14100f131516181715110c06000000000000000000000000000000000000000000000000000000000005121f2b3744505b657986939facb9c6cbbeb2a5988b7f7265584c4f59606b6f7c859298a2aaa49c928d80776c665c544a4239312820170f0600000000000000000000000000000000000000000000000000000008121a22282d3031372e34383a3b3c3e413f4446443f382f2921170b02000000000000000000000a141c242a2f3234392f35393a3b3d3e403c3b37322b22190f04000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6a6b6b666d6d6e6e6f6f70706f6f6e6e6e6d666a69676663615e565855534e4947433c38342e28231c140c06000000000000000000000000000000000000000000000000000000000007121d2a36414d56626f7c88949fabbac3ced2c5b8ab9f92857a6d6054473d3221170d00000000000000000f1a26313c4754616d7a86929facb6ac9e9184786d6053463c31261a0e01000000000000000000000000000000000714202c38444f5964717e8a96a0acbac4c8bcb1a79b8e8174685e5242392e232c3844515c6673808d9aa7a99d9083776b6054483c31261a0e02000000000000000000020d17202930363a3b4445444145474a4d504d4c4740393d3e4545434246474b4e504b49453e362d22170c0000000006111c262f383f44464f51504c52545658545b60615e56524940352a1e1307000000000a15202a343c43474851514b5154555658545c60615e5650483f34291d1105000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9ccc1b8afa8a19ea1a8aeb6c0b9afa59f92877d70695f554b41382d241a10060000000000000000000000000000000000000000000000000000000000000000000000030c172028343f4a545e68707d87939fa6b0bac4c4bab0a69f92877d70695e544a40342821180d0300000000000000000000000000000000000000000000000000000000000000000000000006111c26303d4653606d7985919eaba1968b7e71665b5044382b1f160b0000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c7baada194877a6e6154473b2e2114080000000000000000060d161e24292c2d3135363635312d2c29241e160d060000000000000000000000000000000000000004111d2935404b556875828f9ba8b5c2cdcfc4bbaea49f938780786f6a625f5854524c4847433e3a39352f2e2b26201f1c17110e0f161b1f22232524211d181109000000000000000000000000000000000000000000000000000000000613202d394653606c798699a4afbbc7cbbfb2a5988c7f7265594c474f59606a6f7c869298a2aaa49d928d81786d665c544b433a322921180f070000000000000000000000000000000000000000000000000000000810171d2123242b23282c2d2e2f322d33383938332d261d170f050000000000000000000000020a12191f2326272c24292c2d2e3031332f2e2b272019100700000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b7677787879797a7a7b7c7c7c7c7c7c7b7b7a797877757472706e686965625f5755534e46454039342e261e17110a030000000000000000000000000000000000000000000000000000000c18242f3946525e6874818e9ba6b0bbccd3c7bbb0a69a8d8174675d5145392c20130500000000000000000915202d3946525e6876828f9cabb5aca1968a7d7064574d42372b1d1207000000000000000000000000000000040f16232f3c4855616b7783909da8b2bdccc4b8aba095897c6f62564c4130271c2834404a54626f7c8895a0aba095897d7063574d42372b1e130800000000000000000000050e171f252a2d2e37382f35393a3d4043413f3c362d3031383830363a3b3e41433e3d39342d241b110600000000000a141d262d333839424444414647494b4a505354524c4440372e24190d0200000000030e18222a31373a3c4444414547484a4c4a505354524c443f362d22180c01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9cec4bab2acababadb2bac0bdb1a79d938b7f726b60574d433a2f261b110800000000000000000000000000000000000000000000000000000000000000000000000000050e17232e38424c56606b737f8c949fa8b2bdc7c1bbafa39992857b6e665c51443e332a1f150b010000000000000000000000000000000000000000000000000000000000000000000000000a151f2c3845515c6673808c99a6a89d9184786c6053463d33271c100400000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c7baada194877a6e6154473b2e211408000000000000020a11171f282f35393a3e424343423e3a39352f281f17110a0200000000000000000000000000000000000613202c3945515d677885929eabb8c5d1c9beb2a99d928b7f736d665f58534e4746413b3a37312d2c2924211e1a1312100b06101921272c2f3032312e29221b12090000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0b5c0ccccbfb2a5998c7f7266594c3f474f58606a6f7d869298a2aba49d938e81786d665d554c443b332a21191008000000000000000000000000000000000000000000000000000000060c111417181e171c1f2021232522282b2d2b28221c140b050000000000000000000000000000080e1317191a1f181d20202123252623221f1b160f070000000000000005121e2b3845515e6b7884919eabb7c4d1d0c3b6a99d908383848485858687878888898989898888888786858482817f7d7a7875726e6a67625f5853514b443f383028231c150c040000000000000000000000000000000000000000000000000004101d2935404b55616e7b86929facb9c2ccd0c4b7ab9f94887c6f62554b4135291d1104000000000000000005111d2a36414c5665717e8b99a3afb2a89c8f8276695f5347392f24180d0100000000000000000000000000000a15202c38444f5963707d8a95a0acbac3cabeb3a99d9083776a6054443a301e18232e3947535f6a7783909daca79c8f8275695f53473a3024190d0000000000000000000000050d141a1e20212a2c24292c2d3034363433302b2423242b2b252a2d2e31343631302d29221b1209000000000000020b141c22282b2d35373036393a3d3f3f44464746413a322e251c120700000000000006101820262b2e2f372f35393a3b3d3f3f44464746413a322d241b110600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c9bdb2a8a19ea1a8afb7c0b5ab9f958e81746d62594f453b31281d140a00000000000000000000000000000000000000000000000000000000000000000000000000000006111c26303b444f59606c78828f96a1abb5c0cbc0b5aba1979082786d605a50453c31271d12070000000000000000000000000000000000000000000000000000000000000000000000000814212e3a47535f6975828e9ba8aca0958a7d7164594f44382c21160a00000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c7baada194877a6e6154473b2e2114080000000000020b141c2228313a4145474b4e50504e4b4745413a3128221c140b02000000000000000000000000000000000714202d3a4753606d7a8697a1adb9c6d2c6b9ada1978d80746d605c544e47433c3935302e2b2621201d1914120e09060308111a222b32383b3c3e3d3a342d241b0f0600000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adb9d2ccbfb2a5998c7f7266594c3f3d464e58606b707d869299a3aba59d938e81786d675d564d453c332b221a11080000000000000000000000000000000000000000000000000000000005080a0b060c101213141618171c1f201f1c17110a020000000000000000000000000000000002070a0d0d070d101314151618191615130f0a04000000000000000005121e2b3845515e6b7884919eabb7c4d1d1c4b8ab9f959090909192929893949595959696959595949a9392908f8e8c898785827f7b78746f6a65605c55504a423d342e261e160d0400000000000000000000000000000000000000000000000006131f2c3945515d6773808d99a3aebac7d5c9beb3a99c8f83766a5f53433a2f24180d010000000000000000010d1925303a4754616d7a86929facb9ac9f93877b6e62554b4035291d100400000000000000000000000000030f1b27323b4854606b7683909ca7b1bcccc6baada2978b7e7165584e4332291e121c2b37434e5865727f8c9aa4ac9f93877b6e62564c4135291c1207000000000000000000000002090e1114141e1f181d20212427292726241f1917181f1e1a1e202124282a2524211d1711090000000000000000020a11171c1f20282b252a2d2e302d3338393a39363029201c130a0000000000000000060e151b1f21222b24292c2d2f302e34383a3a39363029201b12090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c5b9aca19691969ea5aebbafa4999083796d605b51473d332a1f160b02000000000000000000000000000000000000000000000000000000000000000000000000000000000a141e29323d44505b666d7a849199a3afbbc1c7bdb3a99f948d80746c61574d43392f241810070000000000000000000000000000000000000000000000000000000000000000000005121e2a36424d57626e7b87939facb1a89d9083776b6155483d32271b0f04000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c7baada194877a6e6154473b2e21140800000000000a141d262d333f434c5254585b5d5d5b5854524c433f332d261d140a000000000000000000000000000000000815212e3b4854616e7b8794a9b3bec9d1c4b8ab9e9184796d605b514a423c37322d2924211f1a1413110d0806020000050f1a232c343d4348494b4a453f362d21170d03000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0adbac6ccbfb2a6998c7f7366594c40343d464f59606b707d879299a3aba59e938e82796d685e574e453d342b231a12090000000000000000000000000000000000000000000000000000000000000000000306070809060b0f1213120f0b0600000000000000000000000000000000000000000000010001040607080a0b0d090806030000000000000000000005121e2b3845515e6b7884919eabb7c4d1d4c7bcb1a79f9d9d9d9e9e9fa3aaa1a1a2a2a3a3a2a2a1a1a49f9e9d9c9a999697918f8b8884807c77726d67605c544e443f3830281f160e0400000000000000000000000000000000000000000000030f1b27333f4953606d7985929eabb4bfcbd2c6b9ada1978a7d7164584e4331281d1307000000000000000000000813202d3946525d6876828f9cabb5afa49a8d8074675d5145392c20160a0000000000000000000000000006131f2b37434e5863707d89949fabb9c3cdc5b8ab9f9285796d6053473d3220170f1b26313c4754616e7b87939faca49a8d8174685d5246392e23180c000000000000000000000000000205070811070d111314171a1d1a1a17130e0a0b12090e111414181b1d181715110c060000000000000000000000060b0f12131c1e191d20212322282b2d2e2d2a251e170e0a01000000000000000000030a0f1215151e181d2021222323282c2d2e2d2a251e170e09000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c4b7ab9e91848e939ca4aeac9f93867b6e685f574f463e3628221c140b04000000000000000000000000000000000000000000000000000000000000000000000000000000020c172028333f4a545e686f7d87929fa6b0bac4c5bbb0a69d928a7e71695f554b40352922190e040000000000000000000000000000000000000000000000000000000000000000020c14212d3a46535e6974818e99a4afb8aba095897d7063594f44382c20150a000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c7baada194877a6e6154473b2e2114080000000006111c262f383f4451565d60646869696864605d5651443f382f261c11060000000000000000000000000000000915222f3c4855626f7b8895a2aebbcfcabfb4aa998c7f72665c51444039302b26201d1914120f0907040100000000020b17212c363e474f5456585650483f33291f1409000000000000000000000000000000000000000000000000000714212e3a4754616d7a8794a0adbac7ccbfb3a6998c807366594d4033343d464f59606b707e879299a3aca59e948f837a6e695f574e463d352c241b1306000000000000000000000000000000000000000000000000000000000000000000000000000000030606060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1d8cdc2b9b1aba9a9aaabababaaa9a8a8a7a7a7a8a9aaabacafacabaaa8a7a5a9a19e9c9896918d88837e79716d666058504a4239312820160d0300000000000000000000000000000000000000000005121f2b3744505b65727e8b97a2adbdc6d1d1c5b8ab9e9285796d6053463c3120160c010000000000000000000005111d2935414c5665717e8b99a3afb6ac9f9285796d6053473d32271b0f020000000000000000000000000815222e3b4754606a76828f9ca6b0bccbc7bbb0a69a8d8074675d5145392c20130a15202d3a46525e6976838f9cabac9f92867a6d61544a4034281b1106000000000000000000000000000000000400010406070a0d100e0d0b070300000500020507080b0e100b0a08050000000000000000000000000000000306060f080d11131416171c1f2021201d19130c050000000000000000000000000003060809070d1113141517171c1f2021201e19130d0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc8bcafa295897c818d929fa3aba49990837a6e69605950483f332d261d160d06000000000000000000000000000000000000000000000000000000000000000000000000000000050e17222d38424c56606b727f8c949ea8b2bdc6c2b9aea49f92867b6e675d51453f342b20160b020000000000000000000000000000000000000000000000000000000000000008131e2a36414c56616e7b86929fabb5bcb1a79c9083766b6054483c32261b0f030000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c7baada194877a6e6154473b2e211408000000000b17222d38424a505b62686d7175767675716d68625b504a42382d22170b0300000000000000000000000000000916232f3c4956626f7c8995a2afbcd0c6baaea298877a6e61544b40342e271e1b15110d08060200000000000000000a141d29333e485059606365625a50453b31261a0e020000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7ccc0b3a6998d8073665a4d40332b343d474f59616c717e87929aa4afa69e9590837b6e6a60584f473e362d2517110a0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1d3c8bdb4aba5a3a1a49f9f9e9d9c9c9b9b9a9a9b9c9d9e9fa3aba8abaeb4b2b3adaba8a8a19e9a95908b847e786f6a605c544b433a32281f150b0100000000000000000000000000000000000000000613202d394653606c7884919da9b3becfd3c7bcb0a69a8d8073665c5144382c1f12040000000000000000000000010d1924303a4754616d7a86929facb9ada2978b7e7165594f44382c1f1408000000000000000000000006121f2b37434e58626f7c89949fabb9c2cdc4b7ab9f94887b6e62554b4035291d1005111e2a36424d5765727e8b99a3aea2988c7f72665c5144382d22170b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020001050707060b0f12131413110d0802000000000000000000000000000000000000000104060708060c1012131413110d08020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc8bbaea295887c78808b9299a2a9a09590847b6f6b615a51443f382f282018100600000000000000000000000000000000000000000000000000000000000000000000000000000006111c262f3a444f59606c77828f96a1abb5bfcbc0baaea2989083796d605b51463d32281d140a000000000000000000000000000000000000000000000000000000000000010d1924303946525e6874808d99a3afbdc3b7ab9f94897c6f63584e43372b2015090000000000000000000000000000000000000000000000000005121f2b3845525e6b7885919eabb8c4d1cabdb1a4978a7e7164574b3e3124180b000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c7baada194877a6e6154473b2e211408000000030f1c28333f4a545b606d727a7e818383817e7a726d605b544a3f332820150a00000000000000000000000000000815222f3b4855626e7b8895a9b3becac5b8ac9f928579685e5242392e231c150c0a05010000000000000000000006111c262f3b45505a616b6f716d62574d42362a1e12050000000000000000000000000000000000000000000000000815212e3b4854616e7b8794a1aebac7ccc0b3a6998d8073665a4d4033272b353d474f59616c717e88939fa3ada79f9591847c6f6a605950483f3728221c140b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000002070a0c0d120e07060400000000000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cec2b6aba29a97949a93929190908f8e8e8d8e8e8f90919299989b9fa2aaacaeb4b8b5b2acaba79f9d96918b837c736d665d554c443a31271d12070000000000000000000000000000000000000006131f2b37434e5863707d8a96a0acbbc5cfd0c4b7ab9f94887b6e62544a4034281c10040000000000000000000000000813202d3946525d6876828f9cabb5b3a99d9083776b6054483b3025190e00000000000000000000020d15212e3a47535f6a75828f9ba6b0bbcbc9beb3a99c8f83766a5f5343392f24180d020e1a25303b4754616d7a86929facaa9e9184796d6053493f33271b0f030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060607070501000000000000000000000000000000000000000000000000000000000306070707050100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc8bbaea295887b6f737e879297a0a7a09691857d706c625b504a423a322a2217110a0300000000000000000000000000000000000000000000000000000000000000000000000000000a141d29323d44505b656d7a849199a3aebbc1cabeb4aaa0958e81756d62584e443a2f261b1106000000000000000000000000000000000000000000000000000000000005111d2935414c56616e7a86929fabb5c0c7bcb0a69c8f82766a5f54473c31261a0f0300000000000000000000000000000000000000000000000005121f2c3845525f6b7885929eabb8c5d1cabdb1a4978a7e7164574b3e3124180b000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c7baada194877a6e6154473b2e21140800000006121f2b3844505b666c747f858b8e90908e8b857f746c665b50443c31261a0f00000000000000000000000000000814212e3b4754616e7a8797a2adbac6c3b7aa9d9084776a564c4130271d120b030000000000000000000000030a1117222d38424d57616c707c7e71695f53463a2d2114070000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7cdc0b3a69a8d8073675a4d403427232c353e47505a616c717f8b919ba3ada7a09691857c706b615a514940332d261d150c040000000000000000000000000000000000000000000000000000000000000000000000000000000000080e1317191a1f1a1313100c070000000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cbbeb2a59a908a8787868584848382828181818283838486898b8e92989b9fa3abafb8bcb9b7b1aba8a19e95918780786d675e564c43392f23180e050000000000000000000000000000000000010c15212e3b47535f6a76828f9ca8b2bdcdd6cabfb4aa9c9083766a5f5342392e23180c0000000000000000000000000005111d2935414c5665717e8b99a3afb8aca095897c6f63564d41362a1c110600000000000000000009141f2a36424d57626f7c87939facb9c2ccc6b9ada1978a7e7164584e4331281d1207000914202d3946525e6875828f9caaada1968b7e71655b5044372b1f160b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc8bbaea295887b6f6c717d8591969fa6a09792867e726d605b544c443c3428231c150c0500000000000000000000000000000000000000000000000000000406070d0d0c0c0b0b0b0a0a0b172027333f49535d686f7c87929fa5afbac4c5bcb1a79e938b7f726a60564c41382d22170f05000000000000000000000000000000000000000000000000000000000713202d3946525d6873808d98a3aebdc7cdc2b7aa9e94887c6f62584e43372b1f140900000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabb8c5d2cabeb1a4978b7e7164584b3e3125180b000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c7baada194877a6e6154473b2e211408000006121f2b37434e58606c78818b92979b9c9c9b97928b81786c60584e43372b1c1106000000000000000000000000000714202d3946525e687885929fabb8c5c3b6a99d9083766a554b4135291b11060000000000000000000001070c151c2328333f4a545e69707e87887b6e6155483b2e2215080000000000000000000000000000000000000000000000000815222f3b4855626e7b8895a1aebbc8cdc0b3a79a8d8074675a4d4134271a232c353e48505a626d727f8b919ca4aea8a19792867d716c625b52443f382f271e160d050000000000000000000000000000000000000000000000000000000000000000000000000000020a12191f2326272c27201f1c18120b03000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cabdb0a3978a7e7b7a79787877767575747474757677787a7c7e81858a8e92999ea5acb1b9c1bcb8b2ada7a099928c82796d685e554b40342920160c020000000000000000000000000000000007121d2a36424d57626f7c88949fabbac3ced3c6baaea2988b7e7165584e4330271c120700000000000000000000000000010d1924303a4754616d7a86929facb9b1a79b8e8175685e5246382e23170c0000000000000000020e1a25303a46535f6975818e9aa4afbbc8ccc0b6ac9e9185796d6053463c3120160c010005111d2935414c5664717e8a98a2aea89d9184786c6053463d32271b100400000000000000000003070b0d0e110f0e0d0d0d0d0d0e0f110b0b080501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000406070809090a0a0a0a0909070704010000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc8bbaea295887b6f626b707c8490949ea5a29892877f736c665d564e463e342e261e170e070000000000000000000000000000000000000000000001070c101314191919191818171716161617222d38414c56606a727f8c939ea8b2bcc6c3b9afa59f92877c6f685d53493f332721170c03000000000000000000000000000000000000000000000000000004111d2935404b55616d7a85929faab4bfcfd3c7bbb0a69b8e82756a5f53473b31251a0e02000000000000000000000000000000000000000000000006131f2c3946525f6c7985929facb8c5d2cbbeb1a4988b7e7165584b3e3225180b000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c7baada194877a6e6154473b2e21140800000815212e3a47535f6a73808d939ea2a9a9a9a9a29e938d80736a5f5347382d22170b0000000000000000000000000005111e2a36414c566976838f9ca9b6c2c4b8ab9e918478675d5145382d2217110b0604000000000305080d12181e262e343f44505b666e7b8592897c6f6356493c302316090000000000000000000000000000000000000000000000000915222f3c4855626f7b8895a2aebbc8cdc0b4a79a8d8174675a4e4134271b1a232c363e48505a626d727f8c929da5afa9a19892877e726d635b504a423930281f170e05000000000000000000000000000000000000000000000000000000000000000000000000020b141c242a2f323338342d2c28231d150c060000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6d6c666b6a69696868676768696a676d6f7275797d81868f939da0a7afb7c0c4bdb9b1aba39f948f837a6d675c51453e32281e1308000000000000000000000000000000010d18242f3a46525e6975818e9ba6b0bbccd5d2c5b8ac9f92857a6d6053473c3120150b0000000000000000000000000000000813202d3946525d6876828f9ca9b5b9ac9f92867b6e61544a3f34281c10030000000000000005121e2a36424d57616e7b87929facb6c0ccc8bbafa49a8d8073665c5144382c1f12040000010d1925303a4753606d7a86929facaca0958a7d7064594f44382c20150a0000000000000001080e13171a1a1d1c1a1a19191a1a1b1c1d181715110c0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004060709070c1013141516161717171616151413110d080a070604000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc8bbaea295887b6f62606a6e7a828e939ca4a399938b80786d685f5850443f383029201910070000000000000000000000000000000000000000030b12181d1f2026262625252424242323222222262f3a444e58626d75818f96a0aab4bfcbc1baaea39991847a6d655b50443d33291e150b00000000000000000000000000000000000000000000000000000a13202c3945515d67737f8c98a2aebcc6d0d6ccc2b9ac9f93877b6e62574d42362a1e130800000000000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5d2cbbeb1a5988b7e7265584b3f3225180c000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c7baada194877a6e6154473b2e21140800030f1c28333f4a54626f7c87939fa5adb3b6b6b3ada59f93877c6f62544a3f33281c0f03000000000000000000000000020e192530404c5966737f8c99a6b0bcc6b9ac9f93867a6d6053493f3328231c1713100c07060b0f1213191d242930383f44515b606c788290988a7d7063574a3d3024170a0000000000000000000000000000000000000000000000000916222f3c4955626f7c8895a2afbbc8cdc1b4a79a8e8174675b4e4134281b111a242d363f48515b636d74808d939ea6b0aaa29992877f736e605b544b423a312920170f0600000000000000000000000000000000000000000000000000000000000000000000020b141d262e353b3f4045413a38342e271e180f0600000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e62605b5e5d5d5c5b5b5a5b5b5c555d606265676d70757b828990959ea5aeb6c0c9c3bdb5afa69e959082796d605a50443a3025190d00000000000000000000000000000004101d2935404b55616e7b86929facb9c2cdd4c8bdb1a89a8e8174675d5145392c20130300000000000000000000000000000005111d2935414c5665727f8b98a7b1bbaea3998c7f73665c5044382c1f150a000000000000000714202d3a46525e6974818e99a3afbec7d2c6b9ac9f93877b6e61544a4034281c10040000000813202c3945515d6775818e9ba9b1a79d9083766b6054483c32261b0f030000000000020b12191f2326272a2927272626262727292a2524211d171109000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105070c1013131619181c1f2022222323242423232221201d1919161413100c0704010000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc8bbaea295887b6f62575f686d79818c929fa4a49f928d827a6f6a615a504a423a322b2218120b030000000000000000000000000000000000030d151d24292c2d333332323231313030302f2f2f2f2e323d46515b606d7a849198a3aebac1cbbfb4aba1968f82776c60594f453b30271c120700000000000000000000000000000000000000000000000006111c2934404b55606d7a85929eaab4bfced0cac6c5bbafa49a8e8174695e53463a3025190d010000000000000000000000000000000000000000000006121f2c3844505c667986939facb9c6d2cbbeb2a5988b7f7265584c3f3225190c000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c7baada194877a6e6154473b2e2114080006121f2b3844505b6674818e99a4afb9bec3c3beb9afa4998e8174665b5044382b1f1206000000000000000000000000000815222f3b4855626e7b88949fabb7c2bbafa4998b7e71655b50443d342e28221f1c181a1a171b1f20252a2f353c424a505b626d73808d94978a7e7164574b3e31241808000000000000000000000000000000000000000000000000091623303c4956636f7c8996a2afbcc9cec1b4a79b8e8174685b4e4135281b0e121b242d363f49515b606c78818e949fa7b1aba399938b80746c665c544b433a3229211810070000000000000000000000000000000000000000000000000000000000000000020b141d262f3840474b4d524d46454039302a21180d04000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255504a51504f4f4e4e4e4f504b515356555c6064696e757d838e939da4aeb7c1ccc7c0bbb0a79f948e81756c61564c41362a1d120700000000000000000000000000000613202c3945515d6773808d99a3aebbc7d4d1c5b8aca095897c6f63554b4035291d1104000000000000000000000000000000010d1924303b4854616e7b8795a0acb8b5ab9e9184796d6053463c31261a0f01000000000005111d2a36414c56616e7b86929fabb5c0d0cabeb4aa9c8f8376695f5342392e23180c0000000004111d2935404b5564707d8a97a2adab9f95897c7063584e43372b1f140900000000010b141d242b303334373534333333333334363731302d29221b12090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d1113181c1f20232523292c2d2e2f30303030302f2f2d2c29242623201f1c1813110d0701000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc8bbaea295887b6f6255565e676d77808b9399a3a49c948f847c716c605c544c443d3428231d150c05000000000000000000000000000000010b151f272f35393a40403f3f3e3e3e3d3d3c3c3c3b3b3b3b3b3f45525d686f7c86929fa5afbac3c6bdb2a89e948c7f736b60574d42392e23180d0400000000000000000000000000000000000000000000000c17232e3845515c67727f8c97a2adbcc5cec5bebab8b6b6ac9f92867b6e61564c41362a1e1308000000000000000000000000000000000000000000000713202d3a4653606d79869aa4afbbc8d4cbbfb2a5988c7f7265594c3f3226190c000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c7baada194877a6e6154473b2e211408000613202d394653606c7985929fabb5c0cacfcfcac0b5ab9e9285796c605346392d201306000000000000000000000000000814212e3a47535f6a7683909ca6b0bcc0b5ab9d9083786c60584f443f38332d2c2823272622272b2d30363940454e545c606d727f8c929c988b7e7265584b3f3024190d0100000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9cec1b5a89b8e8275685b4f4235281c0f09121b242d374044505b666d79829095a0a8b2aba49f928c80786d665d554c443b332a22191008000000000000000000000000000000000000000000000000000000000000020b141d262f38404a52585a5f5a53514b433b332a1f160c010000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483f444342424141414243404547494b5153575f616b7079818d929da5afbac4cfcbc2b9b0a69e938a7e71685e5246392e23180c00000000000000000000000000030f1c28333f4a54606d7985929fabb5bfcbd7cbbfb5ab9d9184776b6054433a2f24180d01000000000000000000000000000000000814212d3a46535e697783909daab6b9ada1968a7d7164584e43372b1d130700000000000713202d3946525e6874808d99a3aebdc7d1c6baaea2988b7e7164574d4230271c120700000000010d18242f3a4653606d7985929fabb1a79c8f82766a5f53473c31261a0e0200000008121d262f363c3f4144424140404040404142443e3d39342d241b110600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f13191d2023282c2d2f322f34383a3b3c3c3d3d3d3d3c3c3a39352f33302d2c2923201d18130e090300000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc8bbaea295887b6f62554c555c656c737e879299a2a69e9691867e736d665e564e463f342e271e170f07000000000000000000000000000007121d2731394045474c4c4c4c4b4b4a4a49494948484848484847474c56606a727f8b939ea8b2bcc6c4bab0a69f93877d70695e544a4034281f160c0100000000000000000000000000000000000000000003101c28343f4a54606d7985919ea9b3becec5bcb4aeaba9abafa3998d8174685e52463a2f24190d010000000000000000000000000000000000000000000714202d3a4753606d7a8693a0b6c0ccd8ccbfb2a5998c7f7266594c3f3326190c000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c7baada194877a6e6154473b2e211408000814212e3b4754616e7a8797a2adbdc7d2dbdbd2c7b9ada297877a6e6154473b2e2114080000000000000000000000000006121e2b37424e5763707d89949faab3bdb8aba0958b7f726a6059504a443f3a38342e33332d3337393b41464b51585f666d747f88939fa4998c7f7366564c4135291d110400000000000000000000000000000000000000000000000a1724303d4a5763707d8a96a3b0bdc9cfc2b5a89c8f8275695c4f4236291c0f0009121b2528333f4a545c676d7a839096a1a9b3afa49c928d81786d675e564d453c342b221a110800000000000000000000000000000000000000000000000000000000020b141d262f38404a525c63666b67605c554d453b31281d13070000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2d363635353434352f35393a3c4045474d535960676d77808d939ea8b2bdc9d5cbc2b9afa59f92857a6d61554b4034281c100400000000000000000000000006121f2b3844505b66727f8b97a2adbdc6d1d3c7bbaea3998c7f7265594f4331281d1307000000000000000000000000000000000005121e2a36424d576673808c99a8b2bdb2a99c8f83766a5f53473a2f24180d0100000004111d2935414c56616d7a86929fabb4bfbec0c2b8ab9f9285796d6053473b3120150b00000000000007131f2c3845515c6674818e9aa9b2aa9e94887c6f62574d42372b1e12050000030e19242f3840474c4d504f4d4d4c4c4d4d4e4f504b49453f362d22170c0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f151b1e24292d2e34383a3c3f424045474849494a4a4a494948474541423f3d3a38342f2c29241d1a150d08020000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc8bbaea295887b6f6255484b535b606c717e879298a2a8a098928a80786d68605850454039302921191107010000000000000000000000000c18242f39434b515359595958585757575656555555555555545454545458626d75818e96a0aab4bfcbc2bbafa49992857b6e665c51443e31281d130700000000000000000000000000000000000000000006121f2c3844505c66727f8b97a1adbbc5cabeb4aaa29f9d9fa7ab9f92867a6d61554c4135291d12070000000000000000000000000000000000000000000714212d3a4754606d7a8793a0adbad2ddccbfb2a6998c7f7366594c403326190d000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c7baada194877a6e6154473b2e211408000815222f3b4855626e7b8895a8b2bdc9d5e2e3d5c9bdb2a895887b6e6255483b2f22150800000000000000000000000000020e1a26313c4855606b76828f98a2abb5bcb1a79f92867c6f6b605c54504a464540414040413f4446484c52555d606a6e78808b939aa4a99c8f8276685d5245392c20130700000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0bdcacfc2b6a99c8f8376695c504336291d100300091317222d38424b555d686e7b849197a2aab4aea49d938e82796d685e574e463d342c231a10050000000000000000000000000000000000000000000000000000010a141d262f38404a525c646e7378746d675f574d433a2f24180d0100000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f2a29282827282824292c2d2f34383b42464f555c656c78818f96a1adb9c3ced4cbc1baada2978c7f73675c5145382c1f13080000000000000000000000000613202d394653606c7884919ea9b3becfd8d2c5b9ac9f92867a6d6154473d3221160c010000000000000000000000000000000000020e1a25313c4955626f7c8896a1adb9b7ab9f94887c6f62554b4135291d11040000000613202c3945525d6873808d98a2aeb4b0b1b4b6b1a89a8e8174675d5145392c1f130300000000000004101c2834404b5463707d8997a1aaaba69b8e8175695f53463a2d211407000007131f2b36404a52585a5d5c5a5a5959595a5a5c5d585650483f34291d1105000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d161b20272b3035393a404546494c4e4b515355555656575756565554524c4f4c494745403a39352f2b262019130d0500000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc8bbaea295887b6f6255484149505a626c717d869297a1a9a29f928d827a6f6a625a514b423b332b2318120b030000000000000000000004101d2935404b555d606666656565646463636362626262616161616161616060606d79849198a3aebac7ccc0b5aba1979083786d605a50433a2f24180d0100000000000000000000000000000000000000030f1c28333f4a54606d7984919ea9b3becdc6baaea2989290959faba3988d8073675d5145392f23180c0000000000000000000000000000000000000000000714212e3a4754616d7a8794a0adbac7d3ccbfb3a6998c807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c7baada194877a6e6154473b2e211408000714212e3a4754616d7a8796a1acb9c5d0d9d9d1c5b9aca096877a6d6054473a2d21140700000000000000000000000000000915202c38444f59616e7b859299a4afb5baaea39892857d726d66605b5453514b4e4d4d4d49505355565e61676d737c838d929fa4acac9f92867a6d6054473a2d21140700000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1bec6c8c3b6a99d9083766a5d5043372a1d1004000006111c262f39434c565e696f7c859298a3abb5aea59e948f837a6e695f584f463e352c21160b000000000000000000000000000000000000000000000000000009131c262f38414a525c646e74808580796e695f554b4135291d110400000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f221c1c1b1b1b1c181d1f2023292c31363d434b535b666d7984919ea7b1bcc8d4d6cabeb3a99e9185796d6053463a2f24190d010000000000000000000006131f2b37434e5864707d8a96a0acbbc5cfd5c9bdb2a99b8f8275685e5246392d201304000000000000000000000000000000000000000915222e3b47545f6a7884919eabb7bbb0a69a8d8174675d5145392c20160b0000000714212d3a4754606d7a85929e9fa3aba3a5a7a9aba095897c6f62554b4035291d1004000000000000000c18232e394653606c7884919e9d9e9f9f93877b6e6155483b2e22150800000b1723303c47525c64676a6867666666666667696a64625a5045392d21150800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c131921272c32373a4146474b515356585b555c60616263636363636262605d565b595653514b4745403a37312a251e170e07010000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc8bbaea295887b6f6255483c3f44505a616b707c859196a0a8a49d948f847c716c605c544d453d3529241d150d0600000000000000000006131f2c3945515d676d7373727271717170706f6f6f6e6e6e6e6e6e6e6d6d6d6d6d6d6f7c86929facb8c5d2c7bdb3a99f958d80746c61554b4135291d11040000000000000000000000000000000000000006121f2b3844505b66717e8b96a1acbbc4cbbfb4aa9f928683909da8aa9f92857a6d60554b4034291c110600000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7d4ccc0b3a6998d8073665a4d4033271a0d000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c7baada194877a6e6154473b2e211408000713202d3946525e687884919eaab4bfc7cfcfc7beb4aa9e918477685d5245392c201307000000000000000000000000000003101c27333d46525e69707d87939fa3abb3b4aaa29792867f78706c6662605c545a5a595a535b606165686d7379808690949da4afb6afa3998a7d7164574a3e3124170b00000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1b8b9bbc0b7aa9d9084776a5d5144372a1e11040000000a141d27303a444d575f6a707d869299a4afb6afa69f9590847b6f6a60594f473e33281c100400000000000000000000000000000000000000000000000008111b252e38414a525c646e74808d928d837b6e675d5145392c20130600000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f22150f0e0e0e070c101314181c1f262a3039414a545d67717e8a95a0acb8c7d2dbcfc5b9ada1978b7e7164554c4135291d1104000000000000000000000815222e3b4754606a7683909ca8b2bdc7cbd1c5b9ada1968a7d7063564c41362a1e11050000000000000000000000000000000000000006131f2b37434e586774818d9aaab3beb8ac9f92857a6d6054473d32271c100400000c1926323f4c5965727f8c909192999596989a9c9e9d9184776a605443392f24180c000000000000000007121f2b3844505b6674808d9190919298998e8174675b4e4134281b0e01000d1a26333f4c58646e747775747373737373747577716c6256493d3024170b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070e161e252932383d43474c5254555c606265686a676d6e6f6f707070706f6f6d686a686663605c5553514b47423c3630292018130c0400000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc8bbaea295887b6f6255483c333f485059606a6f7c849196a0a8a69f9691867e746d665e574f473f352f271f180f0600000000000000000714202d3a4753606d797f7f7f7f7e7e7d7d7c7c7c7b7b7b7b7b7b7a7a7a7a7a7a7a7a7a7a7f8c98a5b2bfcbd0c5bbb1a79d928a7e71675d5145392c201306000000000000000000000000000000000000000613202d394653606c7884919da8b2bdcdc7baaea3988d807d8a96a0aca2978c7f72675c5145382e23170b00000000000000000000000000000000000000000815212e3b4854616e7b8794a1aebac7d4cdc0b3a69a8d8073675a4d4034271a0d000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c7baada194877a6e6154473b2e2114080005111d2935414c566773808d98a2aeb5bdc1c1bdb5aea2988d807366564c4135291d11040000000000000000000000000000000b16212a36424d57616b727f8b9299a1a9afb3a9a298928b837d78736f6d66686766666768656c6e72767a80858c92999fa6aeb3ada59d93897c6f6356493c3023160900000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5aaabacafb6b1aa9e9184776b5e5144382b1e1105000000020b151e28323b454e58606b717e87939fa4a9aaaaa79f9691847c6f6b61594f44382c201407000000000000000000000000000000000000000000000007101a232d37404a525c646e74808d929e9590857a6d6054473a2d21140700000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f22150802010100000406070c10141a1e272f38424b55616c7783909dabb5c0ccd7d5c9beb3a99d908377675d5145392c20130600000000000000000005121e2a36424d57626f7c88949fabb7b9bbc0bfc1b8ab9e9184796d6053463a3025190d0100000000000000000000000000000000000000030f1b26323d4a5663707d8998a2aeb6b7aea2988b7f7265594f44382c20130700000b1825323e4b5865717e848484868788898b8d8f91978c7f7266584e4331271d12070000000000000000030f1c28333f4a54616e7b838484848687898b85786c5f5245392c1f1206000e1a2734414d5a677480838280807f7f80808182837e7164584b3e3125180b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001091019202830353d43484e54565d6164676d6f727576787a7b7c7c7d7d7d7c7c7b7a79777572706d6765605d55534d46413a3229241d160d05000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc8bbaea295887b6f6255483c2f363e474f58606a6f7b849196a1a9a8a198928b81786e69605951454039312921180d04000000000000000916222f3c4955626f7c888c8c8b8b8a8a8a898988888888888887878787878787878787878c919ba7b4c4c4c4c4c2b9aea49e92857a6d6054473a2d2114070000000000000000000000000000000000000714202c38444f5964717d8a95a0acbac4cbc0b5ab9f92867a7784919da9a99e9185796d60544a3f34281c1003000000000000000000000000000000000000000815222f3b4855626e7b8895a1aebbc8d4cdc0b3a79a8d8074675a4d4134271a0e000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c7baada194877a6e6154473b2e21140800010d1925303a4754616d7a86929fa3abb1b4b4b1aba39f92857a6d6154473a3024190d01000000000000000000000000000000050e1a25303b454f59626d727e8792979ea5abb0aaa39f95908984807c797675747373747476797b7e82868c92979fa3abb0aea9a19e938e81756b6054483b2f22150900000000000000000000000000000000000000000000000c1926333f4c5966727f8c999d9d9e9fa4aca4a69e9185786b5e5245382b1f120500000000030c162029333c464f59616c727f8b929d9c9d9e9e9fa09691857d706b6155483c2f23160900000000000000000000000000000000000000000000060f19222c363f49525c646e74808d929da2989184786d6053463a2d20130700000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f22150800000000000000000004090c151d262f3a43505a65727f8b99a4afbbc7d4dacfc4b9ac9f93867a6d6054473a2d2114070000000000000000000714202d3a46525e6975818e9ba6aaabacafb5b2b4b0a6998d8073665c504438291e13080000000000000000000000000000000000000000000a13202d3a4653606d7985929fa9aaabacaa9d9184776b6054483b2f22160900000b1724303d4956626c71777778797a7b7d7e81838587867a6e6154473d3221150b010000000000000000000b17222d3846535f696e76777778797a7c7e7e7064574a3d3124170a0000111e2b3844515e6b7784908f8d8d8c8c8c8d8d8f8f8275695c4f4236291c0f030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131b232b323a41464f54586062686d7175797c7f81838586888889898a8a898988878584827f7d7975716d67625f57524c443e352f281f160e050000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc8bbaea295887b6f6255483c2f2c353d464e585f696e7b849196a1a9aaa39f938e837b6f6b625b514b433b33291f160c010000000000000815212e3b4854616e7b879a98989897979696969595959594949494949494939393939393989ba3adb7b7b7b7b7b7b7b7ada197897c706356493d3023160a0000000000000000000000000000000000040f16232f3c4855616b7783909da8b1bdccc7bbafa3998d8174727e8b97a2ada1978b7e72665c5044382b1f160b000000000000000000000000000000000000000916232f3c4956626f7c8995a2afbcc8d5cdc1b4a79a8e8174675b4e4134281b0e000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c7baada194877a6e6154473b2e21140800000813202d3946525e68717e8a9299a0a7a7a7a7a099928a7e71685e5246392d1e1308000000000000000000000000000000000009141f29333e47515b626c717d858f939c9fa6abaea7a09d96918c8986838281808080818385888b8f92999ea2a9aeadaaa29f97928a81786d60594f43382c1f130700000000000000000000000000000000000000000000000d1a2633404d596673808c91909092939a9597999b9285786c5f5245392c1f12060000000000040d17212a343d47505a626d73808d90909091929299959792867d7063574a3d3024170a000000000000000000000000000000000000000000040d18212b343e48515b636e74808d929da49f92867c6f665c5044382b1f120600000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f2215080000000000000000000000030b141d28313e4754606d7a86939facb9c6d2dfd4c7bbafa499897d7063564a3d3023170a0000000000000000000815212e3b4854616e7b86929c9d9d9e9fa3aba5a8aa9f94887b6e61544a3f3428170d0200000000000000000000000000000000000000000006131f2c3845515c6675828e9b9d9d9e9fa2a095897d706356493d3023160a00000915212d3945505a62656b6a656c6d6f70727476787a7a6e685e5246392d2014030000000000000000000006111c2b37424d575f616a6b6a6b686d6f71706c6155493c3023160a0000111e2a3744515d6a7784909b9a99999999999a9b8e8275685b4f4235281c0f0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c252d353d444c525960636a6f757a7e8286898b8e9091939a95969696969695959892918e8c8985827e7a746e69615e565045413a312820170e0500000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc8bbaea295887b6f6255483c2f222b343d464e575f696e7b849197a1aaaea59d9590857d726d605d554d453b31281d13070000000000000713202d3a4653606d7986939fa5a4a4a4a3a3a2a2a2a1a1a1a1a1a1a1a0a0a0a0a0a0a0a0a5ababababababababababababa9978a7d7164574a3e3124170b00000000000000000000000000000000000a15202c38444f5963707d8a95a0acbac3ccc0b6ac9f92877b6e6d7985929eaba99e9184786d6053463e33281c10040000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9d6cec1b4a79b8e8174685b4e4135281b0e000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c7baada194877a6e6154473b2e211408000005111e2a36414c56616c727f879095999a9a999590877f726c61564c41362a1d0c020000000000000000000000000000000000030d17212c353f49515a626b707b828990949d9fa7aaaca8a19e999892908e8d8d8c8d8e909298989c9fa3abadaba8a19e98928d857e746d665c50473d32271b0f0300000000000000000000000000000000000000000000000a1724313d4a5764707e85848384858687898b8d8f9086796c5f5246392c1f1306000000000000050f18222b353e48515b606c778084838384858687898a8c8e85786b5e5245382b1f120500000000000000000000000000000000000000010c161f2a333d46505a626d73808d929da49d928b7e716a5f544a3f34281c100300000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f221508000000000000000000000000020b16202c3945525d687784909daab7c3d0ddd7ccc0b5ab998c7f7366594c403326190d0000000000000000000c1926333f4c5966727f8c9090909191929997999b9d9c8f8376695f5342382e23170b0000000000000000000000000000000000000000000004101c2834404b5464717e8a91909091929895978e8275685b4f4235281c0f020005111d29343f485056585e535b60616263656769686d6d675e564c41362a1e110500000000000000000000000e1a26313c454d53555d5e5d565e61626464615a5044392d2014080000101d2a3743505d6a7683909da7a6a6a6a6a6a79b8e8175685b4e4235281b0f020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009131c252e373f474f565e616b6f767c82868b8f9299989b9d9e9fa4aca2a3a3a3a3a2aaa29f9d9b9998928f8b85807b746d68625a514b433a322920170d04000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc8bbaea295887b6f6255483c2f22222b343c454d575f696e7c859298a2aaafa79f9792877f756d675f574d433a2f24180d0100000000000713202d3a4653606d7986929fa2a2a2a1a1a0a0a49f9f9f9f9f9f9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e978a7d7164574a3e3124170b00000000000000000000000000000000030f1b27323b4854606b7683909ca7b1bcccc8bbafa49a8e8175696773808d99a3aca0968a7e7164594f44382c21160a0000000000000000000000000000000000000a1724303d4a5763707d8a96a3b0bdc9d4cec1b5a89b8e8275685b4f4235281c0f000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c7baada194877a6e6154473b2e2114080000010d1925303a44505a626d727d83888c8e8e8c88837d726d625a50443a3025190d00000000000000000000000000000000000000050f1a232d373f48505960696e757c838a9095999da0a7a8aaaaa39f9d9b9a99999a9b9c9fa2aaa9aba9aaa29f9b96918c86807a716c605c544a3f342b21160a0000000000000000000000000000000000000000000000000a1623303c4955616c707877767778797b7c7e8082848276695c4f4336291c100300000000000000061019232c363f44505b656c737776777778797a7c7d7f817f7265584b3f3225180c000000000000000000000000000000000000000008131e28313c454e58616c727f8b929ca49f958d80746c61584e42382e23170b0000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f2215080000000000000000000000000004111d2935414c566774818d9aa7b4c0cddaddd2c1b5a89b8e8275685b4f4235281c0f0000000000000000000916232f3c4956626f7c83838383848486888a8c8e90928b7e7164574d4230261c110600000000000000000000000000000000000000000000000c18232e3a4753606d7983848383848586888b8d85786c5f5245392c1f120600010c17222d363f45494b51495053545556585a565d60605d554c443b3025190e02000000000000000000000009141f2a333c4246485051514c52545658575550483e33281c10040000101d2a3643505d697683909ca9b3b2b2b3b3a79a8e8174675b4e4134281b0e0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008111b252e374049515960686d747c83898e92999c9fa3aba8a9abacafb6afb0b0b0afafb4aeacaaa8aaa29f9b98928d87817a716c605d554c443b32291f160b020000000000000000000000000000000000000a1623303d495663707c8996a3afbcc8bbaea295887b6f6255483c2f2219222a333b454d575f6a6f7c869298a2aaa3a9a199928b81796e695f554b4035291d110400000000000815212e3b4854616e7b879996969595949494939993929292929292929191919191919191919191919191919191919191919191897c706356493d3023160a0000000000000000000000000000000006131f2b37434e5863707d89949fabb9c3cdc6b9ac9f93877c6f62616e7b86929faca89d9083776b6155483d32271b0f0400000000000000000000000000000000000b1724313e4a5764717d8a97a4b0bdc6c7ccc2b5a89c8f8275695c4f4236291c0f000000000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b8895a1aebbc8d4c7baaea194877b6e6154483b2e21150800000008131e29323e48515b626b6f777c7f81817f7c776f6b625b51483e32291e1308000000000000000000000000000000000000000008111b252d363f474f565e616b6f767d83888c9095989b9d9fa3aba5a6a7a6a6a7a7a7a6a5aaa29f9c9998928e8984807a736d68615a504a42382e22190f040000000000000000000000000000000000000000000000000814202d3944505a61646b6b6a6a666d6e6f717375777670665a4e4135281c0f02000000000000000007111a2427333f49535b60666a696a6b6b686d6f717274726d62564a3d3124170b00000000000000000000000000000000000000071019242f3a434d57606a707e87939fa4a2979083786d605a50463c30261c11060000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f22150800000000000000000000000000010d19242f3f4c5965727f8c98a5b2bfcbd8dccfc2b5a99c8f8276695c4f4336291c100000000000000000000815222e3b4754606a6f767776767778797b7d7f81848684796d6053473c3120140a0000000000000000000000000000000000000000000000000713202c3945515d676d7778767778797a7c7e807e7164584b3e3125180b00000006111b242d34393d3e443f444647484a4b4e4c525454514b433b32291e1408000000000000000000000000030e18212a31373a3b434444414647494b4a49443e362c22170b000000101c2936434f5c6976828f9ca9b5bfbfbfb4a79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f1a232d374049515b626b6f7a818790949b9fa3abacaeb4b4b6b8b7b4b0aeb4aeacabacaeb4afb1b4b4aeacaaa29f99928d857e756d675e564d443b31281d140a0000000000000000000000000000000000000a1623303d495663707c8996a3afbcc8bbaea295887b6f6255483c2f2215182129333b454e58606a6f7d86929896979798999a938e837b6e675d5145392c20130600000000000916222f3c4955626f7c888a8989888888878786868686858585858585858584848484848484848484848484848484848484848481786d6053463a2d201307000000000000000000000000000000040f19222e3b4754606a76828f9ca6b0bccbc7bbb0a69b8f82756a5f5e6974818e9ba6aca0958a7d7063594f43382c20150a00000000000000000000000000000000000b1825313e4b5864717e8b97a4b1b8b9bbc0bbb5a99c8f8276695c4f4336291c10000000000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c8895a2afbbc8d4c7bbaea194887b6e6155483b2e221508000000020d17202c363f49515960636a6f737474736f6a63605951493f362c20170c0200000000000000000000000000000000000000000009131b242d353d444d525960636b70777b7f83888c8e9192999798999a9b9b9c9b9a9998969892908c8985817d78736d68615d5650443f3830261c10070000000000000000000000000000000000000000000000000004101c28333e485055575f5e5d545c6061626466686a69665e54493e3226190d00000000000000000000081217222d38414950535a5d5d5d5e565e616264666765625b51453a2e221509000000000000000000000000000000000000040d19222935414c555f696f7d869299a4a69f92857b6e665c51483e342a1e140a000000000000000000000000000000000000000000000000000000000005121f2b3845525e6b7885919eabb8c4d1c8bbaea195887b6e6255483b2f2215080000000000000000000000000000081825313e4b5864717e8b97a4b1becad7dcd0c3b6a99d9083766a5d5043372a1d1000000000000000000006131f2b37434e5860626a6a696a6a666d6e7072757779796d675d5145392c1f130200000000000000000000000000000000000000000000000004111d2935404b555d606a6b6a6a6b676d6f7174716c6256493d3024170a0000000009121b22292d30322d3337393a3c3d3f414145474745413a312920170d0200000000000000000000000000060f181f262b2d2e37383035393a3c3e3d3c39332c241a10050000000f1c2935424f5c6875828f9ba8b5c2ccc0b3a69a8d8073675a4d4034271a0d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b18212c353f49515b636d727d858e939a9fa6acafb5b9babab8b2acaaa7a3a2aaa29f9e9fa2aaa2a4a7aaacb2b4aeaba39f98928b81796d685e564d43392f261b110600000000000000000000000000000000000a1623303d495663707c8996a3afbcc8bbaea295887b6f6255483c2f22150f17202a333c464e58606b707d8689898a8b8b8c8e8f9090847a6d6053473a2d20140700000000000815212e3b47535f6a707d7d7d7c7c7b7b7a7a7a7979797979787878787878787878787878787878787878787878787878787878756d665c5044382b1f12060000000000000000000000000000000a15202b37434e58626f7c88949fabb8c2cdc4b7ab9f94897c6f625856626f7c88949faba79c9083766b6054483c32261b0f04000000000000000000000000000000000c1825323f4b5865727f8b98a5ababacafb5afb0a99c908376695d5043362a1d10000000000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c8995a2afbcc8d4c8bbaea195887b6e6255483b2f22150800000000050e1a242d373f474f5458606266676766626058544f473f372d241a0e05000000000000000000000000000000000000000000000109121b232c323b42464f54596163696e73777b7f818486888b8c8c8d8e8f8f8e8d8d8c8a878583807c7975706c66615e56524c443e342e261e140a0000000000000000000000000000000000000000000000000000000b17222c363e44494a5251504a51535456585a5c5d5c5a544c42382d211509000000000000000000000006111b262f383f44464d515050514c52545657595b585651483f34291d11050000000000000000000000000000000000010c161f2a343c45515d676e7b859298a2aa9f948b7e71695e544b40362d22180c02000000000000000000000000000000000000000000000000000000000005121f2c3845525f6b7885929eabb8c5d1c8bbaea195887b6e6255483b2f22150800000000000000000000000000000a1724303d4a5763707d8a96a3b0bdc9d6ddd0c3b7aa9d9084776a5d5144372a1e11000000000000000000030f1b27323d464e54565d5d5d5d545c6062646668666d6d675d554b4035291d1004000000000000000000000000000000000000000000000000010d18242f3a434b51535d5e5d5d555d6062646764625a5045392d21150800000000000911171d21242522272b2d2e2f30323035393a3a39352f281f170e05000000000000000000000000000000060e141a1e21222a2b25292d2e2f3131302d28221a1208000000000f1c2835424f5b6875828e9ba8b5c1ccc0b3a6998d8073665a4d4033271a0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d29333e47515b636d727f8791979fa4acb0b9bbbfbab3adaba8a09e9a97959498929192989496979a9da0a8acaeb4afaaa29f938e837a6e695e554b41382d22170b03000000000000000000000000000000000a1623303d495663707c8996a3afbcc8bbaea295887b6f6255483c2f2215090e18212a343c464f59606b707a7c7c7d7e7e7f81828385837a6d6154473a2e211407000000000006131f2b37434e58606b7070706f6f6f6e6e6d6d6c666c6c6c6c6c6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b68605c544a3f34281c10030000000000000000000000000000030f1b27323a47535f6a75828f9ba6b0bbcbc8bcb1a79c8f82766a6054535f6a76828f9ca8ab9f94897c6f63584e43372b20150a000000000000000000000000000000000c1926333f4c5966727f8c999e9e9f9fa4a1a2a4a69d9083776a5d5044372a1d1100000000000000000000000000000000000000000000000000000000000000091623303c4956636f7c8996a2afbcc9d5c8bbaea295887b6f6255483c2f221509000000000009121b252d353d44484e5455595b5b5955544e48443d352d251b12080000000000000000000000000000000000000000000000000009111a202930363d43484f55575f62666a6e727577797c7e7f80808182828181807f7d7b7976736f6d6663605b54524c46413a3228231c140c0200000000000000000000000000000000000000000000000000000005101a242c33393c3d45444340444648494b4d4f514f4e49423a30261b10050000000000000000000000000a141d262d3337394044434444414647494a4c4e4b4a453f362d23180c01000000000000000000000000000000000008131e28313c46515b606d79849197a1aaa3988f82776c60574d42392e241b100600000000000000000000000000000000000000000000000000000000000005121f2c3845525f6b7885929eabb8c5d1c8bbaea195887b6e6255483b2f22150800000000000000000000000000000a1724313d4a5764707d8a97a3b0bdcad6dbcfc2b5a89c8f8275695c4f4236291c0f000000000000000000000a15202b343d434749505050504a5153555759545c60605c554b43392f24180c000000000000000000000000000000000000000000000000000007131d28313a404547505150504b515355585a585650483e34291d1105000000000000060c11151718171b1f202122232524292c2d2d2c29241d160d05000000000000000000000000000000000003090e1214151d1e191d202123252423201c17100800000000000e1b2835414e5b6874818e9ba7b4c1ccbfb2a6998c7f7366594c403326190d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111b262f3b45505a626d727f8b9299a1a9afb6bec2bdb4aea9a29f9996918d8a8887868585858788898a8d91969a9fa2aaafb3aea59e9590837b6e675d53493f33271f1409000000000000000000000000000000000a1623303d495663707c8996a3afbcc8bbaea295887b6f6255483c2f221509060f18222b343d474f5960686e6f707071727374757778776d685d5246392d2013070000000000030f1b26323c464f596063636363626261616160605b5f5f5f5f5f5f5f5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5b53504a42382e23170b00000000000000000000000000000006131f2b37434e58626f7c87939facb9c2ccc4b8ab9f95897d7063584e4e5863707d8a96a0aca69c8f82756a5f54473c32261b0f040000000000000000000000000000000d1a2633404d596673808c919191929399949597999b9084776a5d5144372a1e11000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9d5c8bbafa295887c6f6255493c2f22160900000000000009131b232b32383c4347494c4e4e4c4947433c38322b231b1309000000000000000000000000000000000000000000000000000000080e171f252a32383e44484d5355585f626568676d6f7172737474757575747372706e6c656663605c5453504a46413a3530282017110a02000000000000000000000000000000000000000000000000000000000008111a22282d303138382e34383a3b3c3e40424443413e3830281e140a00000000000000000000000000020b141b22272b2d333736373036393a3c3e3f413f3d3a342d241b11060000000000000000000000000000000000030c19242f3a434e58626d75818e96a0a9a79f92867b6e655b50453b30271d12090000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabb8c5d2c8bbaea195887b6e6255483b2f22150800000000000000000000000000000c1825323f4b5865727e8b98a5b1becbd8dacdc0b4a79a8d8174675a4e4134271b0e00000000000000000000040f19222b32373b3c43444343404446484a4c4a515353514b433931271d12070000000000000000000000000000000000000000000000000000010c161f282f35393a44454344404547494b4d4b49453e362d22170c00000000000000000105090b060b0f121314151718191d202121201d18130c0400000000000000000000000000000000000000000205070810080d1113141618171614100b050000000000000e1b2734414e5a6774818d9aa7b4c0ccbfb2a5998c7f7266594c3f3326190c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222d38414d57616c727f8c919fa3abb3bbc0c1b9b1aba39f97928c8884817d7b7b7a7978797a7b7c7e8184888d92989ea5adb3afa79f959083796d655b50443b31251a0e040000000000000000000000000000000a1623303d495663707c8996a3afbcc8bbaea295887b6f6255483c2f22150900060f19222b353d474f565e6163636464656667696a6b6a615d564c4135291d11050000000000000a15202a343d474f545657565655555554545353504a52525252525252525151515151515151515151515151515151515151514f46443f3830261c1106000000000000000000000000000005101a232e3b4754606a75828f9aa4afbbc8c8bcb1a79d9083776b6054464653606c7884919ea9aa9e94887c6f62584e43372b20150a0000000000000000000000000000000b1724313e4a5764717d8585848485868787888a8c8e9084776b5e5144382b1e11000000000000000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a96a3b0bdc9d5c8bcafa295897c6f6256493c2f2316090000000000000109111921272c32373b3c404141403c3b37322c27211911090100000000000000000000000000000000000000000000000000000000050d141921272c33383c4247484e535559555c606264656667686869686766656361605b535653504a46443f38363029241e160e0600000000000000000000000000000000000000000000000000000000000000000810171c2023242c2b23282c2d2e2f313335373635322d261e160c020000000000000000000000000000020a11171b1f20272a2a2a252a2d2e2f31333432312e29231b12090000000000000000000000000000000000000b151e2935414c555f6a727f8b939ea8aca0958c7f72695f53493f33291e150b000000000000000000000000000000000000000000000000000000000000000006131f2c3946525f6c7985929facb8c5d2c8bbaea195887b6e6255483b2f2215080000000000000000000000000004101c2834404b546673808c99a6b3bfccd9d7cbbfb5ab998c7f7366594c403326190d000000000000000000000007101920272b2e2f3737362e34383a3b3d3f4044464645403930271f150b01000000000000000000000000000000000000000000000000000000040d161d24292c2d3738372f35393a3c3e413e3d39342d241b1006000000000000000000000000000003050607090a080d1113141413110d070100000000000000000000000000000000000000000000000000040001050707090b0a0a080400000000000000000e1a2734414d5a6774808d9aa7b3c0cbbeb2a5988b7f7265584c3f3225190c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27333f49535f69707e8a919ba3aeb5bdc4c1b8b0a79f99928d857f7b7774706f6e6d676b676d6e6f7174777c81868e939ea2a9b2b1a7a0958f81776c60574d42362a21160a0000000000000000000000000000000a1623303d495663707c8996a3afbcc8bbafa295887c6f6255493c2f2216090000071019232b353d444c52545656575858595b5c5d5f5e54524c443a3024190d01000000000000040e18222b353d4448494a4a4949484847474746443f4646454545454545454545454545454545454545454545454545454545423a38342e261e140a0000000000000000000000000000000b16212c38444f59626f7c89939eacb6c0ccc5b8aca0958a7d7064594f4444505b65727e8b97a2ada69b8f82756a5f54473c32261b0f0400000000000000000000000000000a1723303c4955616c717878777878797a7b7c7d7f81838174675a4e4134271b0e000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdcad5c9bcafa296897c6f6356493c302316090000000000000000070f161b20272b2e2f333434332f2e2b27201b160f070000000000000000000000000000000000000000000000000000000000000002090e161b21282c31373a3c4347484c4b5153555859595a5b5c5c5b5a5a5957545350494946443f3938332d2a251e19130c0400000000000000000000000000000000000000000000000000000000000000000000050b101416171f1e181c1f2021232527292a292826211b140c040000000000000000000000000000000000060b0f12131a1e1d1d191d2021232426282524221d18110900000000000000000000000000000000000007121d27303945515d676f7c86929fa5afa79d9183786d60574d41382d21170c0300000000000000000000000000000000000000000000000000000000000000000613202c3946535f6c7986929facb9c5d2c8bbaea195887b6e6255483b2f221508000000000000000000000000060e16202c3845515c6675818e9ba8b5c1cedbd3c7bbaea3998a7e7164574b3e3124180b000000000000000000000000070f151b1f22232a2a2a23282c2d2f312e34383a3a38342e271e150d030000000000000000000000000000000000000000000000000000000000040c13181d20202a2b2a24292c2d2f313431302d29221b120900000000000000000000000000000000000000000000010407070706040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2733404d5a6673808d99a6b3c0cbbeb1a5988b7e7265584b3f3225180c00020304040403020000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3744505b656e7b85929fa3adbbbfc6c2b8b0a69e959086807a726e6967646261605d555d60616364676a6f747b818a9297a1a8b2b1a79e938b7f72695e53463d32271b0f0400000000000000000000000000000a1723303d4a5663707d8996a3b0bcc8bbafa295887c6f6255493c2f221609000000071019232b323b41464749494a4b4b4c4e4f5052514746413a32281e13080000000000000000061019232b33383c3d3d3d3c3c3c3b3b3a3a3938332d39393938383838383838383838383838383838383838383838383838352d2b28231c140c020000000000000000000000000000020b1c27333b4854606b76828f9ca6b0bec7c9bdb2a89d9184786c6053463d3f4953606d7985929eabaa9e93887c6f62584e43372b20150a00000000000000000000000000000814212d3945505a61646b6b6b6b656c6d6e6f71737476746e64584c4033261a0d000000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0bdcad6c9bcafa396897c706356493d3023160a000000000000000000040b0f151b1f22222628282622221f1b150f0a0400000000000000000000000000000000000000000000000000000000000000000000040a0f161c20262b2e31373a3b3f404547494b4c4d4d4e4f4f4e4e4d4c4a4846443f3c3a38342e2b28221c19130d08020000000000000000000000000000000000000000000000000000000000000000000000000004080a0a12070c1012131516181a1c1e1c1c1915100a0200000000000000000000000000000000000000000305060d1110080d1113141617191b181715110c06000000000000000000000000000000000000000c18232e39434f59606d7a849198a3aeaba0958a7d70665c50453c2f261b0f0500000000000000000000000000000000000000000000000000000000000000000006121f2b3844505c667986939facb9c6d2c8bbaea195887b6e6255483b2f22150807070706040003060607080d11172028323a4653606d7985929fabb8c5d2ded2c5b9ac9f92867a6d6154473a2e21140700000000000000000000000000040a0f1315161d1d1d181c1f20222423282c2d2d2c28231d150c030000000000000000000000000000000000000000000000000000000000000001070d1113141d1e1d181d1f202225272524211d1710090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3bfcbbeb1a4988b7e7165584b3e3225180b0d0f10111111100f0d0b0808060200000000000000000000000000000000000000000000000000000000000004111d2935414c55606c77839097a2adb5bfcbc5bcb0a69e948f837b736d68615f5757555453514b5154555657585f62696e747d859196a1a8b2afa59f92867b6e61594f43382c20150a00000000000000000000000000000a1723303d4a5663707d8996a3b0bcc8bbafa295887c6f6255493c2f2216090000000008111920293036393b3c3d3d3e3f4041424445443a3935302820160c0200000000000000000007111921272c2f303030302f2f2e2e2e2d2d2b28222c2c2c2c2c2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b28201f1c17110a020000000000000000000000000000000a141d2c38444f5963707d89949fabb8c1d0c5b9aca1968b7e71655b5044373845515d6773808d99a3aea69b8f82756a5f54473c32271b0f040000000000000000000000000005111c28333e485055575f5e5e5e5b606061626466686967645c52473c3024170b000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1bdcad6c9bcb0a396897d7063564a3d3023170a0000000000000000000000040a0f131516191b1b191615130f0a040000000000000000000000000000000000000000000000000000000000000000000000000000050b10151a1e21262b2e2f2f34383a3c3e3f40414142424241403f3d3b3937332d2d2c28231f1c17110d08020000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000004060708090b0d0f11100f0d0905000000000000000000000000000000000000000000000000000004030001050707090b0c0e0c0b0905010000000000000000000000000000000000000004101c2834404b55606b75818e96a0aab0a69d9083776c61544a3f332a1d140a000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d79869aa4afbbc8d4c8bbaea195887b6e6255483b2f22151414141312100c0f12131415191c2328323a44505a63707d8a98a2aebac6d3d6cabeb3a99c8f8275685e5246392d201307000000000000000000000000000000030608091011070c1012131517181c1f20201f1c18120b0300000000000000000000000000000000000000000000000000000000000000000000010406071112070c10131416181a181715110c060000000000000000000000000000000000000000000000000000000000000000030506080b0d0e10111212121211100e0b0906060300000000000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3bfcbbeb1a4988b7e7165584b3e32251817191c1d1e1e1d1d1c1a181514120f0905030000000000000000000000000000000000000000000000000000000613202c3945515d67717e8b959fa9b3bec7cabeb3a99f948f82796e69605d56534d4a4848474541454748494b4e53575e616c707b849196a1aab4aea2988f82756b6054483c32261b0f00000000000000000000000000000a1724303d4a5763707d8a96a3b0bdc8bcafa295897c6f6256493c2f2316090000000000080e171e252a2d2e30303131323334363738372e2d29241e160e040000000000000000000000070f161c202223242323222222212120201f1c171f1f1f1f1f1f1f1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1c1312100b060000000000000000000000000000000006111c262f384855616b7683909ca6b0bbcac9beb3a99e9184796d6053493f3335404b55616e7b86929facaa9e93887c6f62584e43372b20150a00000000000000000000000000000c17222c363e45494a52525149505354545557595b5d5a58524a41362b1f1408000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1becad6cabdb0a3978a7d7064574a3d3124170a00000000000000000000000000030608090d0e0e0d0908060300000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e12151a1f212223292c2d2f3132333435353635343332302e2d2b2722201f1c17120f0b06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050f19232c3845515c67707d89939ea8b2ab9f948a7d70635a5042382e21180b02000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0b6c0ccd8c8bbaea195887b6e6255483b2f2221212120201f1c181c1f202122252a2e343b444c56616c75828f9caab3becad6cfc6baada2978a7e7164564c4135291d1105000000000000000000000000000000000000000404000004060708070c1012131313100c070000000000000000000000000000000000000000000000000000000000000000000000000000000004050000040607090b0e0b0a08050000000000000000000000000000000000000000000000000000000000000105060b0f121315181a1b1d1e1e1f1f1e1d1c1b181513120f0b060400000000000000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfcabeb1a4978b7e7164584b3e312520242628292a2b2a2928272522211f1a13120f0b0600000000000000000000000000000000000000000000000004101c2834404b54606d7a85929ea7b1bcc5d0c6baada2979082796d675f57524c46423d3c3b3a3835393a3b3c3e43474d525a61696e7b849198a2aeb4aa9e94897c6f63584e43372b1d1207000000000000000000000000000a1724313d4a5764707d8a97a3b0bdc8bcafa295897c6f6256493c2f231609000000000000050d14191e202123232425252628292a2c2b21201d19130c0400000000000000000000000000050b1013161617171616151514141413120f0b131212121212121212121212121212121212121212121212121212120f0706030000000000000000000000000000000000000b17222d3842505a63707d89949fabb8c2ccc6b9ada1978b7f72665c5041382d2f3946525e6975818e9ba7b0a69b8f82756a6054473c32271b0f040000000000000000000000000005101a242c33393c3e4545443f44464748494a4c4e504e4c4741382f241a0e03000000000000000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1becbd7cabdb0a4978a7d7164574a3e3124170b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002060a0f121415181c1f202225262627282929282727262421201f1b171312100c06030000000000000000000000000000000000000000000000000000000000000000000000000000030607060603000000000406070604000000000000000000000000000000000000000000000000000000000000000000000000020507080c0d0d0c090605030000000000000000000000000000000000000000000000000b16212a36424d57606d7984919ea5afb2a89c9083766b6155483e30261c0f0600000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0adb9d2ddc8bbaea195887b6e6255483b2f2e2e2e2d2d2d2c2823282b2d2d2e3036383f444d565e68707d8a949eaabcc5d0d0c6bdb0a69f9285796d6053473a3025190d01000000000000000000000000000000000000000000000000000000000004060707060400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000003080d1113171b1f2022242628292b2b2c2c2b2a29282522201f1c1713100c070000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5b2bfcabdb1a4978a7e7164574b3e312c2d30333536373737363533312f2e2b26201f1b17110c070000000000000000000000000000000000000000000006131f2c3845515c66727f8c97a1adb9c2cec8bcb1a79f92857a6e675d554d45413a36312f2e2d2c292c2d2e3032373b424650575f696f7c86929fa8b2b0a69c8f82766a5f5447392e23180c000000000000000000000000000a1724313d4a5764707d8a97a3b0bdc9bcafa296897c6f6356493c302316090000000000000002080e1114141616171818191b1c1d1f1e1413110d0802000000000000000000000000000000000407090a0a0a090909080807070606030000060605050505050505050505050505050505050505050505050505020000000000000000000000000000000000000000030f1c28333f4a54616c7783909da6b0bccacabeb3a99e9285796d60544a3f2f262a36424d57636f7c8995a0acaa9e93887c6f62584e43372b20150a000000000000000000000000000008121a22282d303138382d3337393a3b3c3e40414341403c362f261d130800000000000000000000000000000000000000000000000000000000000000000c1926323f4c5965727f8c98a5b2bfcbd7cabdb1a4978a7e7164574b3e3124180b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020608070c1013141618191a1a1b1c1c1b1b1a19171513120f0b060603000000000000000000000000000000000000000000000000000000000000000000000000000000060c10121313120f0b06070c10131413100c07010000000000000000000000000000000000000000000000000000000000000003090e121415181a1a191613120f0b0600000000000000000000000000000000000000000004101c27323a46535f69737f8c96a0acb8aca096897d7063594f44362c1e150a0000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0adbac6d3c8bbaea195887b6e6255483c3b3b3b3a3a3a3a38342e3338393a3b3d41464a50575f686d7a84919ea6b0bbced0c7beb4ab9f948b7e71675d514539281e130800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f13191e2022272b2d2f313335363738383938373634322f2d2b28221f1c18120e09030000000000000000000000000000000000000c1926323f4c5965727f8c98a5b2bfcabdb0a4978a7d7164574a3e34383a3d4042434444444342403e3b3a37312d2b27221b18120b0300000000000000000000000000000000000000000713202d3a4653606d7984919ea9b3becbd1c4b8ab9f958b7f72685e554b433b35302a262221201f1d20212223262b30363e454d57606a727f8c96a0acb7aa9f94887c6f62544b4034281c10040000000000000000000000000b1724313e4a5764717d8a97a4b0bdc9bcafa296897c6f6356493c3023160900000000000000000002050708090a0a0b0c0d0e0f1112110707050100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505b66707d8a959fabb8c2cdc6baada2978c7f72675d5142382e1d25303b4854606b7784919daab0a69b8f82756a6054473c32271b0f0400000000000000000000000000000810171c2123242c2b22272b2d2d2e2f313335363433302b241d140b0100000000000000000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfccd7cbbeb1a4988b7e7165584b3e3225180b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040607090b0c0d0e0e0f0f0f0e0d0c0a080605030000000000000000000000000000000000000000000000000000000000000000000000000000000000030a11171c1f20201f1c171c1d181c1f201f1c18120b0300000000000000000000000000000000000000000000000000000000040a0f141a1e21222527272623201f1b17110a02000000000000000000000000000000000000000713202c38444f59616e7b86929fa8b2b5ab9d9184776b6054473e33241a0c030000000000000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a8794a0adbac7d3c8bbaea195887b6e62554948484847474747464440463f444647484a4c52545c60696e7a839096a1adb8c1ccc7beb6aca3999082776c60554b403529160c020000000000000000010507070e0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0a090704000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171b1f252a2d2d3337393b3e40414344454545454443413e3c3938332d2c28231d1a140e0903000000000000000000000000000000000c1925323f4c5865727f8b98a5b2becabdb0a4978a7d7164574a3e4045464a4c4f50515150504f4d4b4847433d3937332d28231d150c0802000000000000000000000000000000000005111d2935414c5664717e8a96a1adbbc5cfc8bcb1a79d9083786c60564c43393129241e1a1515141311131415161b1f252a333c454e58606d7984919da6b0b0a69a8d8074665c5145382c1f13060000000000000000000000000b1824313e4b5764717e8a97a4b1bdc9bcafa396897c706356493d3023160a00000000000000000000000000000000000000010304050400000000000000000000000000000000000000000406071012111111101010100f0f0f0f0f0f0f0f0f0f0f0f0f10101011111111120f0e0c0904000000000000000000000000000000000000000000000000000000000003101c28343f4a54606c7883909da7b1bccacabfb4aa9f92857a6d60554b4030261c1f2c38444f5965727f8b98a2aeaa9e93887c6f62584e43372b20150a000000000000000000000000000000050c111417171f1f171b1f202121222426282a2726241f1a130b020000000000000000000000000000000000000000000000000000000000000000000d1a2733404d5a6673808d99a6b3c0ccd8cbbeb1a5988b7e7265584b3f3225180c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c151c23282c2d2d2b2822292923292c2d2c29231d150d0a0100000000000000000000000000000000000000000000000000070e151b1f262a2d2e323334322f2d2b27221b140b060000000000000000000000000000000000000916222f3b4854606b75828f98a3aebbaea3998c7f7265594f44352c211108000000000000000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b8794a1aebac7d4c8bbaea195887b6e6256555555545454545353514a524a5053545557565e61666d727b839095a0a8b2bdcac5beb6aca49a92867c6e655b5043392f2418040000000000000002080d1113141a1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c171614100b05000000000000000000000000000000000000000000000000000000000000000000000000000003090b141b22272b3036393a3f4446484b4d4e505151525251504f4e4b4846443f3a38342e2a251f1a140d070100000000000000000000000000000c1825323f4b5865727e8b98a5b1becabdb0a3978a7d7064574a464b515357595b5c5d5e5d5c5b5a5855534e4946443f38342e271e19130d05000000000000000000000000000000000713202d3946525d6875828f9ca9b2bdcdd1c4b8aca095897c6f665b50443b31271f19130e09080706040607080a0f141a212a333c44515c66707d8a949fabb8ab9e9285796d6053463a2d2013090000000000000000000000000b1824313e4b5764717e8a97a4b1bdc9bcafa396897c706356493d3023160a000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c1013141d1f1e1e1e1d1d1d1c1c1c1b1b1b1b1b1b1b1b1b1c1c1c1d1d1d1e1e1e1f1c1b19151009020000000000000000000000000000000000000000000000000000010b151f2c3844505c66717e8a95a0acb9c3cdc7baaea2988d8073685d5243392f1e151b27323d4754606d7a86929facb0a69b8f82756a6054473c32271b0f040000000000000000000000000000000005080a0b12120b0f121314151617191b1d1b1a17140e0801000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdd7cbbfb2a5988c7f7265594c3f3226190c000000000000000003060707060503000001040607080606030000000406070a0c0f10111111100f0d0b0906050300000000000000000000000000000000000000000000000000000000000000000000000306070a0b0a0a0909070705010000000000000000000000000000000000000000000000000000000000000000000000000000000000000710181e262e34383a3938332d36362f34383a38342f271f1b130a00000000000000000000000000000000000000000000000009101920272b31363a3b3f40403f3c3937332d261d17110a0200000000000000000000000000000006131f2b37434e5863707d89949eaab4b9ac9f92867a6d6154473d33211a1000000000000000000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4c8bbaea195887b6e63626262626161616060605c5f5f5f5b6060616466686d72787f869095a0a7b1bac4c1bbb3ada49a93887e716a5f53493f31281d1207000000000000040c13191d2021272929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292929292423201c161008000000000000000000000000000000000000000000000000000000000000000000000000050d141a1d262d33373a4146474950535557595b5c5e5e5f5f5e5d5c5b585553504a4645403936302a251f18130c04000000000000000000000000000b1825323e4b5865717e8b98a4b1bec9bdb0a3968a7d7063575053555c60636668696a6a6a69686664625f5856535049454039302a251e170e070000000000000000000000000000000714212e3a4754616d7a86929facb9c4cfccc0b6ac9d9083776a60544a3f32291f150d080200000000000000000003090f18212834404a54616b76828f9ca9b3ada1978a7d7064574a3d31251a0e0200000000000000000000000b1825313e4b5864717e8b97a4b1bec9bcb0a396897d7063564a3d3023170a00000000000000000000000000000000000000000000000000000000000000000000000000000000030b12181d1f202a2b2b2b2a2a2a29292928282828282828282828282929292a2a2a2b2b2b292825211b140c030000000000000000000000000000000000000000000000000007121d2834404b55606d7884919ea7b1bccbcbc0b5ab9f92867a6d61564c4131271d0c16202c3945525d6874818e9ba7b1aa9e93887c6f62584e43372b20150a00000000000000000000000000000000000000000500000305060708090b0d0e100e0d0b08030000000000000000000000000000000000000000000000000000000000000000000000010e1b2834414e5b6774818e9aa7b4c1c7cbd1bfb2a5998c7f7266594c3f3326190c000000000000060c1012131413120f0b070d1113141513120f0b070c10131417191c1d1d1e1d1d1c1a181513120f0b0603000000000000000000000000000000000000000000000000000000000000060b1012131718171716161413110d0809060503000000000000000000000000000000000000000000000000000000000000000000000000040e18222a30383f444646443f43434344404547454039312d251b11070000000000000000000000000000000000000000000009121b222b32373b4246484b4d4d4c4946443f382f28231c140c0200000000000000000000000000010b15222e3b47545f6a76828f9ca6b0bcb3a99b8e8275685e5246392d20130800000000000000000000000000000000000000000000000000000000000000000000000000000915222f3c4855626f7b8895a2aebbc8d4c8bbaea195887b706f6f6f6f6e6e6e6d6d6d6d666c6c6c666c6d6e7073767a7f848c9298a0a7b1b9c3beb9b0a9a29f93887f726c62574e41382d1f160c010000000000040e161e25292d2e34353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535353535302f2c28211a110800000000000000000000000000000000000000000000000000000000000000000000060f171f252a2f383f44464c5254535b6062646668696a6b6b6c6b6a69676562605b5453514b46423b363129241d160d070000000000000000000000000b1825313e4b5864717e8b97a4b1bec9bdb0a3968a7d7063545b6063676d70737576777777767573716e6a6763605b53514b423e3630292019100800000000000000000000000000000b1825313e4b5864717e8b99a3aebbc7d4c8bbafa49a8c7f7266584e42382d20170d0300000000000000000000000000060f18232e39424f5963707d8a97a2adb3a99a8d817467574d42362a1e120500000000000000000000000b1825323e4b5865717e8b98a4b1bec9bcb0a396897d7063564a3d3023170a000000000000000000000000000000000000000000000000000000000000000000000000000000030d151d24292c2d3738383737373636363535353535353535353535353636363637373738383534312c261e150c020000000000000000000000000000000000000000000000000c18242f3845515c67717e8b96a0acb9c3cec7bbafa3998d8074685e52433a2f1f150b111d2935414c56626f7c8995a0acb0a69b8f82756a6054473c32271b0f04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4b9bbbfbbbdb3a6998c807366594d4033261a0d00000000030a11171c1f2021201f1b171c181d202021201f1c1712181d1f20232628292a2b2a2a29272522201f1b17120f0b060000000000000000000000000000000000000000000000000000020a11171c1f2024242423232221201d19191513120f0b06000000000000000000000000000000000000000000000000000000000000000000000a15202a343c424a505353504a504f50514b5153514b433f372d23180d01000000000000000000000000000000000000000008121b242d343c43474d5355585a5a5956535049413e342e261e140a0000000000000000000000000007121d2b37424d57626f7c88949fabb8baada297897d7063564c41362a1e110500000000000000000000000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c8895a2afbbc8d2cbbeb1a4988b7e7c7c7c7c7b7b7b7a7a7a7a797979797878797a7b7d8083868c91969fa2aab1b9bcb8b3ada69e97928a7f726d625a50453c2f261b0d040000000000020c1620283035393a414242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242423d3c38332c231a100500000000000000000000000000000000000000000000000000000000000000020a1117212931363e41495053565e6165656c6e717374767778787878777674716f6c6663605c54524d46423b352f281f19100900000000000000000000000b1824313e4b5764717e8a97a4b1bdc9bcb0a396897d706360666c7074797d7f82838484838382807e7b7874706c65605c545046413a322b221a110800000000000000000000000005111e2a36424d576874818e9babb5bfcbd2c6b9ac9f93877b6e6154483d2f261c0e0500000000000000000000000000000007121c27303e4653606d7985929eabb7aa9e918477695e53463a2d21140700000000000000000000000b1825323e4b5865717e8b98a4b1bec9bdb0a3968a7d7063574a3d3024170a0000000000000000000000000000000000000000000000000000000000000000000000000000010b151f272f35393a43454444444343434342424242424242424242424242434343444444444542413d3730271e1409000000000000000000000000000000000000000000000004101d2935404b55606d7984919ea8b2bdcbccc0b6ac9f92867b6e61564c4131281e0d030d1924303a4754606a7783909daab4aa9e93887c6f62584e43372b20150a0000000000000000000000000000010507070b0d0f0e0c09080603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020f1c2935424f5c6875828f9ba8abacaeb5afb0b2a6998d8073665a4d4033271a0d000000030c151c23282c2d2e2d2b27222924292c2d2e2d2b28221d24292c2d30333536373737363533312f2d2b27221f1c17110d070100000000000000000000000000000000000000000000020c141c23282b2d31313130302f2e2d29252522201f1b17110f0a03000000000000000000000000000000000000000000000000000000000000030f1b26323c464e545c60605b545d5c5c5d555c605c5551493f35291e120600000000000000000000000000000000000000050e1a242d363f464e54575f616566676562605b5350443f3830261c11060000000000000000000000000c18232f3a47535f6975818e9ba6b0bbb8ab9f9285796d6053463a3025190d0100000000000000000000000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c8995a2afbcc7c5c5c5b3a69b908b89898988888887878787868686868585858687888a8d8f92999ea0a8aeb4b9b7b1aba9a19e948f857e726d625b51483f332a1d140a00000000000008131e28323a4146474d4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4a48443e352c21160b000000000000000000000000000000000000000000000000000000000000020b141b2227333b42464f535b6063686d7175797b7e80818384848585848382817e7b7974706d66615e57534d45403a312b221b1209000000000000000000000b1824313e4b5764717e8a97a4b1bdc9bcafa396897c70666c71787d81858a8c8e8f9091908f8e8d8b8884817d78726d66615a524c443d342c231a110800000000000000000000000714202d3a46525e697884919eabb7c4d1cfc3b6a99c908376695e53463a2b1d140a00000000000000000000000000000000000b151f2c3844515c6674818e9aa9b3aca096877b6e6154483b2e21150800000000000000000000000c1825323f4b5865727e8b98a5b1bec9bdb0a3968a7d7063574a3d3024170a000000000000000000000000000000000000000000000000000000000000000000000000000007121d27313940454750525151515050504f4f4f4e4e4e4e4e4e4e4e4e4f4f4f505050515151524f4d49423930261b1004000000000000000000000000000000000000000000020c16202c3945515d67727f8b96a1adbac3cec8bbafa49a8e8174695e53443a301f160c0008131e2b37434e5865727e8b98a2aeb0a69c8f82756a6054473c32271b0f04000000000000000000000002080d111314181a1b1a181515120f0a040000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c2936434f5c6976828f9c9e9e9fa3aba2a3a5a79a8d8074675a4d4134271a0e0000000a151e262e34383a3a3937332d362f35393a3b3938332d2c2f35383a3d3f42434444444342403e3c3937332d2b28221c18120b060000000000000000000000000000000000000000000a141e262e34383a3d3e3d3d3c3c3a393530322f2d2b27221b1b160f0b060000000000000000000000000000000000000000000000000000000006131f2b37434e585f666d6c666b6a69696a6b676d67625b51463a2e221609000000000000000000000000000000000000020d17202c363f4850586062696e727373726f6c65615a504a42382e23170b050000000000000000000004101c2934404b55616e7b87939facb9c1b5a89b8e8275665c504438291e13080000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbfbab9b8b8b8aca29b989696959595959494949393939992929292939a9497999c9fa3abacb2b3b2acaaa79f9d97918b827b716c625b51483f362d21180b020000000000010d1925303a444c52545a5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c57554f473e33281c100400000000000000000000000000000000000000000000000000000000020b141d262d333e454d535961656c70757a7e8285888a8c8e8f9191929291908f8e8b8885817d79736e69615e57514b433d342d241b11080000000000000000000b1724313e4a5764717d8a97a4b0bdc9bcafa396897c7070787e84898e9297999b9c9d9d9d9c9b999796918e89847f79716c615e564e463e352c231a1007000000000000000000000814212e3b4754616e7b8796a1acb9c5d2ccbfb2a6998c7f7366574d42362a190b02000000000000000000000000000000000004101c2834404a5463707d8997a2adb2a8978a7e7164574b3e3124180600000000000000000000000c1926323f4c5965727f8c98a5b2bfcabdb0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000000000000000000000000000000000000c18242f39434b51535d5e5e5e5d5d5d5c5c5c5b5b5b5b5b5b5b5b5b5b5b5c5c5c5d5d5d5e5e5e5c59544b42372c21150900000000000000000000000000000000000000000008131e2935414c56606d7985919ea8b2bdccd2c6b9ac9f93877b6e62574d4232291e0d0400020f1b27323d4754606d7a85929facb8aa9e94887c6f62584e43372b20150a00000000000000000000040c13191d2021252728272522211f1b150e0600000000000000000000000000000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9191929299949597999b9a8d8174675a4e4134271b0e000006111c2630383f44464746443f4342434045474846443f3838394045474a4c4f50505150504f4d4b4846443f3938332d29241d17110a0200000000000000000000000000000000000006111c2630383f44464a4b4a4a4949474641423f3c3937332d2c271f1b17110a0200000000000000000000000000000000000000000000000000000815212e3b47535f6a6f7979787776767677787979726d62574a3e3125180b00000000000000000000000000000000000008141f29323e48505a626a6f767b7e80807f7c78716c605c544a3f342821160b0000000000000000000006131f2c3845515c6774818e99a4afbbbcb1a7988b7e7165544a3f3428170d020000000000000000000000000000000000000000000000000000000000000000000000000000000a1723303d4a5663707d8996a3adb4aeacacabababaaaaa4a3a2a2a2a2a1a1a1a0a0a0a0a39f9f9f9f9fa4a1a3a6a9acaeababa9a7a8a09e9a95908a857e756e68615a51493f362d241b0f0600000000000005111d2935414c565e61676868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686361594f44382c201407000000000000000000000000000000000000000000000000000000000a141d262f383f4450575e616b70787d82868b8f929897999b9c9d9e9e9f9e9d9c9a9897928e8a85807b756e69605d554e463e362d231a0f0500000000000000000b1724313e4a5764717d8a97a4b0bdc9bcafa396897d757d838b91969a9fa2a9a4a2a2a3a5a8a8a6a8a19e9a96918b847e756d68605850473e352c22190d040000000000000000000a1723303d4a5663707d8996a8b2bdc9d5cabfb4aa978a7d7064574a3d31251a0a000000000000000000000000000000000000000c18232e3a4653606d7985929fabb3a6998d8073665a4d402e23170b00000000000000000000000c1926333f4c5966727f8c99a5b2bfcabdb1a4978a7e7164574b3e3124180b0000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b555d606a6b6b6a6a6a696969686868686868686868686868696969696a6a6a6b6b68655d54493d3125190c0000000000000000000000000000000000000000010d1925303945525d68727f8c97a1adbac4cfc7bbb0a69b8f82756a5f53453b3120170d0000000a16202c3945515d6774818d9aa7b1b0a69c8f82756a6054473c32271b0f040000000000000000040e161e25292d2e32333534322f2e2b26201810090000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2633404d5966738085848485868687888a8c8e908d8174675a4e4134271b0e00000c17232e38424a505354535049504f504b51535453504a4244484b515356595b5c5d5e5d5d5c5a585553504946443f38352f27221b140b0500000000000000000000000000000000000b17232e38424a505357575756565554524c4f4c4846443f3838322b27221b140b06000000000000000000000000000000000000000000000000000916222f3c4955626f7c86868584838283848586867f7265594c3f3226190c0000000000000000000000000000000000020e1925303b44505a626c717c82888b8d8d8c89847e746d665c50443d32271c10020000000000000000000714202d3a4753606d7985929fabb5c0b8aca095877b6e6154473b2e23170c000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a96a9a0a0a39f9f9e9e9e9e9d9e9e9e9e9e9f9f9f9f9fa4a0a0a0a0a0a1a1a1a1a1a2a2a2aaa29f9e9d9a9796918e89837e79716c615e5650483f372d241b1209000000000000000713202d3946525e686d74757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575757575706b6155483c2f23160900000000000000000000000000000000000000000000000000000006111b262f384149505a61696e767d83898f92999b9fa2aaa6a7a6a3aaa29f9fa2aaa5a9a29f9b97928d86817b736d67605850483e352b21160b00000000000000000b1724313e4a5764717d8a97a4b0bdcabeb1a4978b7e828990959ea1a49f9c9997969596989b9fa3aaadaba8a09e96918a827a6f6a615a50473e342b1f160c0100000000000000000c1925323f4c5865727f8b98a5b2beced3c7baaea298887b6e6155483b2e2215090000000000000000000000000000000000000007121f2c3844505c667683909ca9b5a89b8f827568544a3f34281c1003000000000000000000000d1a2633404d596673808c99a6b3bfcabeb1a4978b7e7164584b3e3125180b0000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3945515d676d767877777776767676757575757575757575757575757676767777777778756f65594d4134281b0e000000000000000000000000000000000000000005111d2935414c56606d7a85929ea9b3beccd0c3b7ab9f94887c6f62584e4333291f0e0500000004111d2935414b55626f7c88959fabb7aa9e94887c6f62584e43372b20150a00000000000000030c1620283035393a3e4042413f3c3a37312a221b120900000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926323f4b57636e7378787778797a7b7c7d7f8183847e7064574a3d3124170a0003101c28343f4a545c6061605b535d5c5d555d6061605b544a4f54555d60636668696a6a6a6968666462605b5353504a454039332d261d170f0800000000000000000000000000000003101c28343f4a545c60646464636362615e565b585553504948433d37332d261d17110a0200000000000000000000000000000000000000000000000b1825313e4b5864717e8b939291908f8f9091928d8174675a4e4134271b0e010000000000000000000000000000000005111e2a36414d56616c717e878f9498999a9896918a80786d60594f44382c1f1408000000000000000004101c2834404b5464707d8a98a2aebdc3b7aa9d908377695e52463a2d1c1106000000000000000000000000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a979393939992929291919191919191919292929292939a9393939394949494949595959594989291908d8a8784817c76716d66615a524d443e362d251b120900000000000000000714212e3a4754616d7a808282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282827d7063574a3d3024170a0000000000000000000000000000000000000000000000000000061017222d384149535b606c717b828a90959b9fa3ababaaa8a09d9996949892929895989b9fa2a9a29f99928e8680796f6a625a50473d33271c1004000000000000000b1724313e4a5764717d8a97a4b0bdcac6b9ac9f93878e939da0a39f9a938f8c8b89898a8c8f92989fa3aab1aca8a19e938f857c706c61594f473d31281e130800000000000000010e1b2734414e5a6774818d9aa7b4c0cdd2c5b8ac9f9285796c605346392d2013060000000000000000000000000000000000000003101c28343f4a546774818d9aa7b4aa9e918477665c5044382b1f1206000000000000000000000d1a2733404d5a6673808d99a6b3c0cbbeb1a5988b7e7265584b3f3225180c000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d798385848484838383828282818181818181818181828282838383848484858175685c4f4235291c0f00000000000000000000000000000000000000000713202d3946525e6873808c97a2adbbc4cfc8bcb1a79c8f82766a6054463c3121170d00000000010d18242f3a47535f6a7683909da9b3b0a69c8f82756a6054473c32271b0f040000000000000b151e28323a4146474b4d4e4d4b4847433c342d241b1106000000000000000000000000000000000000000000000000000000000000000000000000000000000a17232f3b47525c63666b6b6b6b676d6e6f7072747678706c6155493c3023160a0006121f2c3844505c666d6d6c656a69696a6b676d6e6c665b54596063676d70727576777777767573716f6c6563605b54514b443f382f2921191109000000000000000000000000000006121f2b3844505c666d707170706f6f6d686a686562605b53544f46443f382f28221c140b03000000000000000000000000000000000000000000000b1825313e4b5864717e8b979f9e9d9c9c9d9e9a8d8174675a4e4134271b0e01000000000000000000000000000000000714202d3946525e68717e8a92999fa6a6a6a8a09e928d80736b6054483b3025190e020000000000000006131f2c3845515c6675818e9baab4bfc0b3a79a8d807467574d42362a1e0a00000000000000000000000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b858787868686868585858484848484848585858585868686868687878787878888888888888786858483807d7b77746f6a64605c545046413b322c241b13090000000000000000000d192633404c5966737f8c8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8275695c4f4236291c0f00000000000000000000000000000000000000000000000000020b182227333f49535b656c737e858f949da0a7acafaca59e9b96918c898886858586888b8f92989ea1a8a39f98928d847c716c62594f44382c201407000000000000000b1724313e4a5764717d8a97a4b0bdcac8bbafa49a939a9ea5a299928e8782807e7c7c7d7f82868c9298a0a7b0b2aca59e9791867e706b61594f433a2f24190e05000000000000020f1c2935424f5c6875828f9ba8b5c2ced0c3b6aa9d908377665b5044382b1f120600000000000000000000000000000000000000000c17232e3f4b5865727e8b98a5b1ac9f9286796d6053463a2d201307000000000000000000000e1a2734414d5a6774808d9aa7b3c0cbbeb2a5988b7f7265584c3f3225190c000000000000000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b889191919090908f8f8f8e8e8e8e8e8e8e8e8e8e8e8f8f8f90909091919185796c5f5246392c1f130000000000000000000000000000000000000005111e2a36414d56616d7a85929fa9b3becdcdc4b8ab9f95897d7063584e43332a200f05000000000007131d2b37434e5864717e8b97a2adb7aa9e94887c6f62584e43372b20150a000000000007121d27303a444c5254585a5b5a5855534e463f362d22170c0100000000000000000000000000000000000000000000000000000000000000000000000000000007131f2a35404a5257595f5e5e555d6061626466686a6b64615a5044392d201408000713202d3a4653606d787a79787776757677797a7b786c6060626b7075797d7f82838384838382807e7c7875706c66605d555049413b332b231b1209000000000000000000000000000713202d3a4653606d787d7e7d7d7c7c7a787775726f6c65636059535049413d332d261d150d030000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4aaa9a9a9aaa79a8d8174675a4e4134271b0e01000000000000000000000000000000030f1b27333f4953616e7b86929fa3abb0b3b3b2aca49d92897d7063564d41362a1e1105000000000000000713202d3a4653606d7985929fabb8c5bfb5ab978b7e7164584b3e30251a0e00000000000000000000000000000000000000000000000000000000000000000000000000000000000814212d3a47535f696e797a7a7a7979797978787877777778787878787879797979797a7a7a7a7a7b7b7b7b7b7c7b7a7978787674716e696762605853514a423e363029201a1209000000000000000000000f1b2835424e5b6875818e9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b8e8175685b4e4235281b0f000000000000000000000000000000000000000000000000000a141d2a343c44505b656c77808a92989fa6acb1b1a8a19e938e8884807c7b7a79797a7b7e82868c91969fa3aaa39f9691877e716b6054483c2f221609000000000000000b1724313e4a5764717d8a97a4b0bdcaccc0b6aca49fa4a8a0979287817b7573716f6f7072757a808690959fa6b0b9afa9a19892877d706b60554c41352920160c02000000000003101d293643505c6976838f9ca9b6c2cfcec1b4a89b8e817568544a3f33281c0f030000000000000000000000000000000000000000061623303c4956636f7c8996abb4afa399877a6e6154473b2e211408000000000000000000000e1b2734414e5a6774818d9aa7b4bebfbfb2a5998c7f7266594c3f3326190c000000000000000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a87949e9d9d9d9c9c9c9b9b9b9b9b9b9b9b9b9b9b9b9c9c9c9c9d9d9d9e9185786b5e5245382b1f12000000000000000000000000000000000000000714202d3946525e6873808d98a2aebbc0bec0bcb1a79d9083766b6054463c3221180e000000000000010f1b26323c4753606d7985929fabb7b0a69c8f82756a6054473c32271b0f03000000000c18232e39424c565e616566686765625f5850483f34291d1105000000000000000000000000000000000000000000000000000000000000000000000000000000020e19242e3840474b4d5251514b5153545557595b5d5e575550483e33281c1004000e1b2834414e5b67748187868584838283848586877f73666a6f777d8285898c8e8f909190908f8d8b8885817d78726d67605b534d453d352d241b12090000000000000000000000000b1825313e4b5864717e8a8a8a898988878583827f7c78746f6b64605b534f443f382f271f150d0300000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1b6b5b6b4a79a8d8174675a4e4134271b0e0100000000000000000000000000000005121f2b3744505b6574808d98a2aeb5bdc0c0bdb9aea49c908376685e5246392d201407000000000000000a1724303d4a5763707d8a98a2aebac6bbaea399887c6f6255493c2f221609000000000000000000000000000000000000000000000000000000000000000000000000000000000006121e2b37424d575f676d6d6d6d6d666c6c6b6b6b6b6a6b6b6b6b6b6c6c6c6c666c6d6d6d6d6d6e6e6e6e6e6f6f6f6e6d666b6a6764615e5656544e46444039302a251f170e0800000000000000000000000f1b2835424e5b6875818e9ba8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a69a8d8073675a4d4034271a0d00000000000000000000000000000000000000000000000006111c262f3c46515b606c77818d929fa2aab0b8b1a79f96918a817c7773706e6d67676d6e72757a7f848c9298a0a7a8a09992877d7063564a3d3023170a000000000000000b1724313e4a5764717d8a97a4b0bdcad2c7beb6afacaaa09691857d746e6a666463626365686d737b8390949fa8b2bbb3aaa29992867d6f675d51453e32281e1308000000000004111d2a3744505d6a7783909daab6c3d0cdc0b4a79a8d8174675a4e412d22170b0000000000000000000000000000000000000000000714212d3a4754606d7a8799a3aeb5ab95887c6f6255493c2f221609000000000000000000000e1b2835414e5b6874818e9ba7b0b1b3b4b2a6998c7f7366594c403326190d000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798699a3aaaaa9a9a9a9a8a8a8a8a8a8a8a8a8a8a8a8a8a9a9a9aaaaaa9e9184776b5e5144382b1e1100000000000000000000000000000000000004111d2935414c56616e7b86929faaacafb6b1b3b5aca0958a7d7064594f44342b200f06000000000000000a151f2c3845515d6774808d9aa6aaabaa9e94887c6f62584e43372b1f130600000004101c2834404b545e686d71737574726f6a625a5045392d2115080000000000000000000000000000000000000000000000000000000000000000000000000000000007121c262e353b3f4045454440454748494a4c4e50524a49443e362c22170b00000f1c2935424f5c6875828f929291908f909192988e81746d747c83898f9298999b9c9d9d9d9c9b999797928e8a847f79726c655e574f473f362d241b110800000000000000000000000d1a2733404d5a6673808d97979696959792908e8b8885817c77716c656059504a423931271f150b01000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1bec2c0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000613202d394653606c7885919eaab4bfc6cfcec8c0b9ac9f93877a6e6154473b2e21140800000000000005111e2a36414c566874818e9baab3bec5b9ac9f9286796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1a26313c454d555d60616060605c5f5f5f5e5e5e5e5e5e5e5e5f5f5f5f5f5b606060606061616161616262626261605c545d5a5754524d4947433d38342e271e19140d050000000000000000000000000f1b2835424e5b6875818e9ba8b4b5b5b5b5b5b5b5b5b5afa9a7a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a2a2a3a4a4a5a5a6a6a7a7a8a9aaabacaeb4afb0a6998c7f7366594c403326190d0000000000000000000000000000000000000000000000000b17222d38424e58626d74808d939ca4aeb3bbb1a79f9590847d756f6a666361605d5d606265686d7279808690959ea5aba39a8c807366594d4033261a0d000000000000000b1724313e4a5764717d8a97a4b0bdcad9d0c7c0baaea29891847c6f6b625f5758565657565e61696e7a829096a0acb6bcb4aba39891847a6d605a50443a3025190d010000000005111e2b3844515e6b7784919eaab7c4d1cdc0b3a69a8d8073675a4d4034271a060000000000000000000000000000000000000000000713202c3945525d687986929facb0a3968a7d7063574a3d3024170a000000000000000000000f1b2835424e5b6875818e9ba1a3a4a6a8aaa6998d8073665a4d4033271a0d0000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c677986929facb7b6b6b6b5b5b5b4b4b4b4b4b4b4b4b4b5b5b5b6b6b6b7aa9d9084776a5d5144372a1e110000000000000000000000000000000000000713202c3945525d6874808d989d9e9fa4aca4a6a9a89d9083786c6053463d3220190f000000000000000004101d2935404b55626e7b88949d9e9fa2a69c8f82756a6054473b2e22150800000006131f2c3845515c666d7a7e8081807e7c716c6256493d3024170b00000000000000000000000000000000000000000000000000000000000000000000000000000000000a131c242a2f323338382f35393a3b3c3d3f4143453d3c39332c231a100500000f1c2835424f5b6875828e9b9e9d9c9c9d9e9f9a8d807379808790959b9fa2aaa4a2a2a3a5a8a8a6a9a19e9b96918c857e776e69605950483f362d231a0e0500000000000000000004101c2934404b556874818e9ba3a3a2a9a29f9d9b9897928e89847e78706b605b544b433931271d1207000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000815212e3b4854616e7b8797a1adbcc6d0d8d9d4c8bbafa49a8a7d7063574a3d3024170a0000000000000714202d3946525e687885919eabb8c4c3b7aa9d908477665c5145382c1f130600000000000000000000000000000000000000000000000000000000000000000000000000000000000009151f2a333c434b515354545353514a52525251515151515152525252524a5053535354545454545555555555555453514b504d4a4746423c3b37322c28231c150c0802000000000000000000000000000e1b2834414e5b6774818e9aa9b3bec2c2c2c2c2c2baafa59d9b959595959595959595959595959595959595959596969797989899999a9b9b9c9d9e9fa3aaa2a3a59a8d8073675a4d4034271a0d0000000000000000000000000000000000000000000000030f1c28333f4a545f6a727f8b929da5aebabeb3a9a09590837a706b625f5856555351515355565e61676d737b838e939da4a9968a7d7063574a3d3024170a000000000000000b1724313e4a5764717d8a97a4b0bdcad7d3c7bbb0a69f92867c6e6a6059534e4b49494a4c52575f686d7a84919aa4afbbbdb4aaa1968e81746c61564c41362a1d12070000000004101d2935404b556b7885929eabb8c5d1ccbfb2a6998c7f7366594c403326190d00000000000000000000000000000000000000000004111d2935414c566b7885929eabb1a4978a7e7164574b3e3124180b000000000000000000000f1c2935424f5c6875828f94949698999b9ea09a8d8073675a4d4034271a0d010000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d788699a3aaaaaaaaaaa9a9a9a9a9a9a9a9a9a9a9a9a9a9a9aaaaaaaaaa9e9184776b5e5144382b1e110000000000000000000000000000000000000714212d3a4754606d7a86908f9092939a95989a9c9e968a7e71655b5044372b1f12070000000000000000000c18242f3947535f6a76829090919297949694887c6f6255493c2f2216090000000713202d3a4653606d79848b8d8e8d8b887e7164584b3e3125180b0000000000000000000000000000000000000000000000000000000000000000000000000000000000010a12191f2326262c2b24292c2d2e2f313335373831302d28221a11080000000e1b2835414e5b6874818e9ba7aaa9a8a9aaa6998c807b848d93999fa69f9c9998969596989b9fa2aaadaba8a19e97918b827b706b625a50483e352c20170d02000000000000000006131f2c3845515c6776838f9ca9adabaaa9aaaaa8a9a29e9a95918b837d736c665d554b43392f23180f060000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000916222f3c4955626f7c8895a9b2becbd7e2e4d8ccc0b6ac988b7e7165584b3e3225180b0000000000000814212e3b4754616e7a8797a1adb9c6c1b4a79b8e817468544b4034281c1004000000000000000000000000000000000000000000000000000000000000000000000000000000000000030e18212a313940454747474746444046454545444444454545454545463f4446464747474747484848484849484746454043413e3b3a36302e2b271f1c18120b030000000000000000000000000000000c1925323f4c5865727f8b97a2adbac1cdcececec2b6a99d938e8888888888888888888888888888888888888888898a8a8b8b8c8c8d8d8e8f8f90919298949597989a8e8174685b4e4135281b0e000000000000000000000000000000000000000000000006121f2b3844505b666f7c86929fa4aeb7bfb9ada19791837a6d686159534e494847454547484c52555d60696e79818d929da197877a6d6154473a2e211407000000000000000b1724313e4a5764717d8a97a4b0bdcad7d0c3b7ab9f948b7f726a5f574f47423e3c3c3d41464d565d686f7c88939fa9b3bebcb2a89d938a7d70685e5246392f23180c0000000006131f2c3945515d677986929facb9c5d2cbbfb2a5988c7f7265594c3f3226190c000000000000000000000000000000000000000000010d19242f44515e6b7784919eaab1a4988b7e7165584b3e3225180b000000000000000000000d1a2734404d5a677380878788898b8c8e9196968d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a87949e9e9d9d9d9d9d9c9c9c9c9c9c9c9c9c9c9c9c9c9d9d9d9d9d9e9e9185786b5e5245382b1f120000000000000000000000000000000000000714202d3a4753606d7982838384858687898b8d8f919184786d6053493f33271b0f0300000000000000000007121d2b37434e5863707d848484858688898b8d8174675b4e4134281b0e0000000815212e3b4854616e7b8796999b9a9a8e8175685b4e4235281b0f02000000000000000000000000000000000000000000000000000000000000000000000000000000000000070e1317191a1f1e181d202021222426282a2b2423201c171008000000000e1b2834414e5b6774818e9aa7b4b6b5b6b6a99c8f828591969fa49f9b948f8d8b8988898b8e92989fa2aab1ada9a19e948f857d716c625a50473e32291f140800000000000000000714202d3a4753606d7986929fa9a29f9d9c9d9fa2aaaaaba7a09d95908880786d675d554b40342921180e0300000000000000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000815222f3b4855626e7b8898a3aebac7d3dcded5c9bdb2a9978a7d7164574a3e3124170b0000000000000a1724303d4a5763707d8a96a9b2bec9bfb2a6998c7f7366594c402e23180c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f181f272f35393a3a3a3a3a38342e3838383837383838383839392d3338393a3a3a3a3a3b3b3b3b3b3c3c3c3b3a38342e34312e2d2a25221f1b15100c0700000000000000000000000000000000000714212e3a4754616d7a85929fa5afbbc5cfdacec1b4a79b8e817b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7c7c7d7d7e7e7f7f80818182838485858687888a8b8d8f8275695c4f4236291c0f0000000000000000000000000000000000000000000004101c2834404b54606c78839098a3aeb6c0bcb1a79e92857b6e685e564f47433d3b3a39393a3b41464b51575f676d77808d929e918578685e5246392d201307000000000000000b1724313e4a5764717d8a97a4b0bdcad4c8bcb1a79c8f82766d62574e453d3731302f30363c434c56606a74818d97a1adb9c4baafa59e92857a6d61554b4034291b11060000000714202d3a4753606d7a8699a3afbbc7d3cbbeb1a4988b7e7165584b3e3225180b00000000000000000000000000000000000000000000081e2a3744515d6a7784909daab1a5988b7e7265584b3f3225180c000000000000000000000d1926333f4c58646e737b7a7b7d7e808184878a8c8174675b4e4134281b0e010000000000000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b879191919190909090908f8f8f8f8f8f8f8f8f8f8f90909090909191919185796c5f5246392c1f130000000000000000000000000000000000000613202c3945515d676d7676767778797a7c7e808284867e71665c5041382d22170b00000000000000000000010f1a26313c4854606b7077777778797b7d7f807d7063564a3d3023170a0000000916232f3c4956626f7c8995a8a8ac9c8f8275695c4f4236291c0f030000000000000000000000000000000000000000000000000000000000000000000000000000000000000002070a0c0d12070d111314151617191b1d1f171614100b0500000000000e1a2734414d5a6774808d9aa7b3c0c2c3b7ab9f948f9298a0a299938e8883807e7c7c7d7f82868c92989fa7b0b3ada69f9792877e716c62594f443b3025190f06000000000000000a1723303d4a5663707d89989d98979290909092989c9ea6aeaca7a09a938c82796d675c51453f332a1f150900000000000000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000714202d3a4753606d7986929facb9c1cbd1d1ccc4b9ada196887c6f6255493c2f2216090000000000000c1926333f4c5966727f8c99a5b2bfcfbeb1a4988b7e7165584b3e32251807000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d151d24292c2d2e2d2d2d2c28232c2b2b2b2b2b2b2b2b2c2c2c22282b2d2d2d2d2d2e2e2e2e2e2f2f2f2f2e2d2c2823272421201e1915130f0a04000000000000000000000000000000000000000713202d3946525e68717e8a939ea9b3bec9d5d2c5b9ac9f92877c6f6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6f6f70717172727373747475767778797a7a7c7d7f80827f7265584c3f3225190c0000000000000000000000000000000000000000000006131f2c3845515c66717e8b95a0aab4bfc4b8ab9f958b7e71695e564c433e37312e2d2c2c2d30353940454d555d656c74808d949084776a564c41362a1d1105000000000000000b1724313e4a5764717d8a97a4b0bdcad1c4b8ab9f95897c6f635b51453c332b262323252a313a444e58606d7a85929eabb5c0c0b9ada1978c8073675c5145382d22170b0000000714212d3a4754606d7a8793a0b5c0cbd7cabdb1a4978a7e7164574b3e3124180b00000000000000000000000000000000000000000003101d2a3643505d697683909ca9b2a5988c7f7265594c3f3226190c000000000000000000000b1723303c47525c64696e6d6e70717375777a7d7f7c6f6255483c2f221509000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d798385848484848383838383838282828282828283838383838484848484858276695c504336291d1000000000000000000000000000000000000004111d2935404b555d606969696a666d6e6f7173767879716c61544a3f2f261b110600000000000000000000000a15202c38444f5960636a6a6b676d6e707274706b6054483c2f2216090000000a1724313d4a5764707d8a97a3b0a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000104060708090a0c0e10120a0a0804000000000000000d1a2734404d5a6773808d9aa6b3c0cdc7bbb0a69f9c9fa2a1989287817c7673716f6f7072757a7f8690959ea6b0b9b0a9a29992887e716b61564d41362a21180d030000000000000d1a2734404d5a6773808d95918b888584838485898f949fa3aab1aca49f948f82796d605b51453c31261a0e04000000000000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e0100000000000000000000000000000006131f2c3845515d6775828f9ca5afbabfc4c5c1bab1a79e9184786c605346392d201306000000000004111d2935414b556875828e9ba8b5c1c9bdb0a3968a7d7063574a3d3024170a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b12181d1f20212120201f1c181f1f1e1e1e1e1e1e1f1f1f1f171c1f202020212121212122222222222221201f1c181a171414110e09060300000000000000000000000000000000000000000005111d2935414c56616c75818f97a1adb9c1ccd3c7bbafa3999083796d62626262626262626262626262626262626363646465656666676868696a6b676d6e6f70727375726d62564a3e3124180b000000000000000000000000000000000000000000000713202d3a4653606d7984919ea7b1bcc6bdb2a89d9083786c60564d443a312b26222020202025292f353c434b535b606d78828f8f8376695c50433025190d01000000000000000b1724313e4a5764717d8a97a4b0bdcacbc0b5ab9d9083766b6054493f332a211a1616191f28323d45525d68737f8c99a4afbbc7beb3a99e9285796d6053493f33271b0f0300000714212d3a4754606d7a8793a0adbad1dccabdb0a4978a7d7164574a3e3124170b00000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b2a5998c7f7266594c3f3326190c0000000000000000000007131f2b36404a52575e61616163656668686d70736f6a5f53473a2e211508000000000000000000000000000000000000000000000000000000000000000000000000000613202c3945515d676d7778787777777777767676767676767676767676767676777777777778787670665a4e4235281c0f000000000000000000000000000000000000010d18242f3a434b51535c5d5c545c606162656769666d66615a5042382e1d140a00000000000000000000000003101c27323d474f54565e5d555c60616365676360594f44382c2014070000000c1825323f4b5865727e8b98a5b1aa9d9084776a5d5144372a1e07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3bfccccc2b8b0aba9aba19791867d756f6a666563626365686d727b838f949ea7b1bcb3aba39a92877d70685e52463f33291f1409000000000000111e2a3744515d6a77848f8a847f7b78777677797d828a9298a3abb4afa69f948f81756d62574d42372b20150a000000000000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e0100000000000000000000000000000004101d2935404b5563707d89939ea6aeb4b8b8b7b0a8a0958c7f72655b5044372b1f120500000000000613202c3945515d677784919eaab7c4cbc0b5ab95887c6f6255493c2f221609000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c1013141414141312100c0712121111111212121212120b0f121313141414141415151515151615141313100c070b08070502000000000000000000000000000000000000000000000000010d1925303a44505a616d7a85929ea5afbac4cfcbc0b5aba0958d80736b60555555555555555555555555555555565757585859595a5a5b5c5c5d555c6061626465676865625b51463a2e22150900000000000000000000000000000000000000000005111e2a36414c5664717e8b97a1adb9c3c5b9aca196897d70665b50443b32281f1b1514131314191d242931394149505c666d7a858f8275685c4f4235291c0800000000000000000b1724313e4a5764717d8a97a4b0bdcac7bbafa3998a7e7164594f44372d21180f09080d16202935414c56616e7b87939facb9c6c5b9ada1978b7e71655b5044372b1f120500000714212d3a4754606d7a8793a0adbac6d3cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b2a6998c7f7366594c403326190d00000000000000000000030e19242e3840454d53545455565859565e616366625f584e43372b1f12060000000000000000000000000000000000000000000000000000000000000000000000000004111d2935414b555d606a6b6b6b6a6a6a6a6a696969696969696969696969696a6a6a6a6a6b6b6b69665e54493e3226190d0000000000000000000000000000000000000007131d28313a4045474f50504a51535456585a545c605c5450483e30261c0b02000000000000000000000000000b16212b353d44484951514b51535556585a56544f473d33271c10040000000d192633404c5966737f8c99a6b2ab9e9184786b5e51452f24180d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfccd4cac2bbb7afa39991857c706b625f5858565556565d60696e79828f959fabb4bdb5aca39992857a6e615b51453b31261a0e0200000000000d1a2734404d5a677380827d78726e6a6a69666d70757e869299a3aebab0a69e938b7f72695f53473c32261b0f010000000000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e01000000000000000000000000000000000c18242f394854606b75818e949fa3abababaaa69e969083796d6053493f33271b0f0300000000000714212d3a4754606d7a86939facb9c6c7bbafa399877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004060707070707060400000505050405050505050600000306060707070707080808080809090908070604000000000000000000000000000000000000000000000000000000000000000008131e28323e46525e68707d8a939ea8b2bdc9d1c7bdb1a79f93877c6f675d5148484848484848484848484849494a4a4b4b4c4c4d4e4e4f50514b5153545557585a5c585651493f34291e12060000000000000000000000000000000000000000000714202d3946525e687783909da9b2becbc4b7ab9e9184786c60544a3f322920160d0a070606080d12181f272f383f4a545e68727f8a8174675b4e4134281b0e01000000000000000b1724313e4a5764717d8a97a4b0bdcac5b9ac9f92867a6d6054473d32211b0f060000040e19242f3a46535e6976828f9ca9b5c2c9beb3a99d9184786c605346392d20130700000714212d3a4754606d7a8793a0adbac6d3cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b2a6998c7f7366594c403326190d000000000000000000000008121c262e333b42464847484a4b4d4c5254575955534e463c31261b0f0300000000000000000000000000000000000000000000000000000000000000000000000000010d18242f3a434b51545d5e5e5e5e5d5d5d5d5d5c5c5c5c5c5c5c5c5c5c5c5d5d5d5d5d5e5e5e5e5c5a544c42382d21150a00000000000000000000000000000000000000010c161f282f35393a43434340444647494b4d4a5053504a423e362d1e150a0000000000000000000000000000050f19232b32383b3d4444404546484a4c4d4a48443d352b21160b000000010e1b2734414e5a6774818d9aa7b4ab9f9285786c554b4035291d10040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926323f4c5965727f8c98a5b2bfcbd8d4c8bcb1a79f92877c6f6a6159544e4b49494a4c52575e676d79839099a3aebabeb5aba2978f82756d62574d42362a1e130800000000000d1926333f4b58646e7376706c65625f58545c60636c717d87929fa8b2b8afa59f92867b6e61584e43372b1e13080000000000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000007121d2c38444f59606d79828d92999d9e9e9d9a948f847b6e675c5141382d22170b0000000000000815222f3b4855626e7b889aa4afbbc8c5b9ac9f9286796c605346392d2013060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c16202a36414c56616c74818e96a1adb9c0cccfc3bbafa4999184796d60594f433b3b3b3b3b3b3b3b3b3b3c3c3d3e3e3f3f4040414142434440454747494a4c4d4f4c4a463f372d23180d010000000000000000000000000000000000000000000814212e3b4754616e7a87959fabbbc4cabeb3a9998c8073655b5042382d20170e09090909090909070d151d262e38424c56606c777e7c6f6255493c2f22160900000000000000000b1724313e4a5764717d8a97a4b0bdcac2b6a99c8f8376685d5245392c2013090000000008131e2a36424d5764717e8a97a8b2bdc8c5b8aca095897c706356493d2f24180c00000714212d3a4754606d7a8793a0adbac6d3cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b2a6998c7f7366594c403326190d0000000000000000000000010b141c212931363a3b3a3b3d3e404146474a4c4847433c342a20150a00000000000000000000000000000000000000000000000000000000000000000000000000000007131d28313a4145475052515151515050505050504f4f4f4f4f4f4f5050505050515151515152504e49423a30261b10050000000000000000000000000000000000000000040d161d24292c2d36362e34383a3b3c3e403f4446443f38302d241b0c0300000000000000000000000000000007111921272c2f30372e34383a3b3d3f413d3c38332b231a0f05000000020f1c2935424f5c6875828f9ba8b5ac9f928679675d5145392c2013060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2becbd8d1c4b8aca0958c7f736a60584f47433e3c3c3d41454d555d676e7b86929fa8b2bdbdb3a99e948b7e72695f53463a3025190d00000000000b17232f3b47525c64676963605b53534e4a50535a616b737f8c96a0acb9baaea2988e81756a5f54473a2f24190d0100000000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000001101c27323d45515c676d7880868c909192908d89827a6e695e554b402f261b11060000000000000916232f3c4956626f7c8995acb6c0ccc5b8ab9f928578665b5044382b1f120600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010507070809090a0a0a09080807050100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040e1925303a44505a606d7a84919ea4aebac4d0ccc0b5aba0968d80746b60554c41352f2f2f2f2f2f2f2f2f3030313132323333343535362f34383a3b3c3d3f40423f3e3a342d251b1106000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a7b1bccdc6b9ada297887b6e6253493f2f261c161616161616161616161616141c26303a44505b656c716f6a5f53473b2e21150800000000000000000b1724313e4a5764717d8a97a4b0bdcabfb2a5998c7f7266564c4135291d110400000000010e1a25313b4754616e7a8796a0acb9c5c8bcb1a7998d807366554b4035291d1004000714212d3a4754606d7a8793a0adbac6d3cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b2a6998c7f7366594c403326190d000000000000000000000000020b0f171f252a2d2e2e2e30323036393a3d403c3a37312a22180e04000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f282f35393a44454544444444444343434343434343434343434343434444444444454543423e3830281f140a00000000000000000000000000000000000000000000040c13181d2020292a23282c2d2e2f322e34383a38342e261e1b12090000000000000000000000000000000000070f161c2022232b23282c2d2e303234302f2c27211a11080000000004101d2a3743505d6a7683909da9b6afa399867a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1becbd4c8bdb2a89d9083786d60584e463e3732302f2f353b434b555f6973808c96a0acb9c5bbb0a69f92867b6e61564c41362a1d12070000000007131f2a36404a52585a5c5753504947433f44465059606d7984919eabb5bfb4aa9f93877c6f62564c4135291d110400000000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e0100000000000000000000000000000000000b16212934404b555c666d737b8083858584817c756d685e574d43392e1d140a000000000000000a1723303d4a5663707d8996a3b0bcd2c5b8ab9e9285786b5f4a3f33281c0f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000406070a080d11131415161617171616151414110d080a07060401000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e29323e45525d68707d89929da8b2bdc7d2c7bdb2a89f93887d70675d51453e32282222222222222223242425252626272728292923292c2d2e2f3132343532312e29231b13090000000000000000000000000000000000000000000006121e2b37424e576874818e9ba7b4c1cdc5b8ab9e9285786a5f5341382d222222222222222222222222222222222227333f49535b6064625f584e43372b1f130600000000000000000b1724313e4a5764717d8a97a4b0bdcabfb4aa96897d7063564a3d2f24190d0100000000000914202d3946525e687784919eaab7c4cec3b6a99c908376675d5145392c1f1306000714212d3a4754606d7a8793a0adbac6d3cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b2a6998c7f7366594c403326190d0000000000000000000000000000050d141a1e212121222325252a2d2e30332f2e2b26201810060000000000000000000000000000000000000000000000000000000000000000000000000000000000040d161d24292c2d3738383837373737373636363636363636363636363637373737373838383635322d261f160d03000000000000000000000000000000000000000000000001070d1113141c1d181c1f2021232523282c2d2c28231c150c0900000000000000000000000000000000000000050b101316161e181c1f20222325272322201c160f08000000000004111d2935414c566b7884919eabb7b5ab94877a6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbd2c5b9aca0968a7d71665c50463d342b26232224293139434d57606d7984919eaab4bfc1baaea2988e8174685e5246392e23180c00000000020e19242e3840474b4d4f4a46443f383734383e45515c67727e8b99a3afbbbbafa49a8e8174685d5245392c20130600000000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000000050c18232f39434b545c60696e7376787877746f6b615e564d453b30271d0b02000000000000000b1724313e4a5764717d8a97a4b0bdcac4b7ab9e9184786b5e51452d22170b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205070c1013141619191d2021222223242423222221201e191a171413100d0706020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c17202935414c56606b74818d96a0abb5c0ccd0c3bbafa49a91847a6d60594f443a3025191515151516161717181819191a1b1b1c1d181c1f202122242527292524221e18110901000000000000000000000000000000000000000000000814212e3a47535f6a7884919eabb8c4cfc2b6a99c8f837669584e432f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2d38414950535755534e463c32261b0c0500000000000000000b1724313e4a5764717e8a97a4b0bdc6baaea298877b6e6154483b2e21150800000000000005111e2a36414d566774818e9aa7b4c1cdc5b9ac9f9286796d6053473a2d201407000714212d3a4754606d7a8793a0adbac6d3cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b2a6998c7f7366594c403326190d00000000000000000000000000000003090e12141514151718191d2021242622211f1b150e0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c13181d20212a2b2b2b2b2a2a2a2a2a29292929292929292929292a2a2a2a2a2b2b2b2b292826211b140d0400000000000000000000000000000000000000000000000000000104060710070c101213141618171c1f201f1c17110a03000000000000000000000000000000000000000000000407090a070c1013131517191a171614100b050000000000000613202c3945525d687985929facb8aea195887b6e6255483b2f2215080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1becad1c4b7aa9e9184786c60544a3f342b221b1616191f27313c45515c67727e8b98a2aebac7bfb4aa9f92867a6d61554b4034281c10040000000008121c262e363b3f40433d3937332d2b282c34404b55616d7a86929facb9c0b6ac9f92867a6d6054473a2d21140800000000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e0100000000000000000000000000000000000007121d273139424a50575f61666a6b6b6a67636059524c443b33291e150b00000000000000000b1825323e4b5865717e8b98a4b1becbc4b7aa9e9184776b5e5144382b1e0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004090e1214181c1f202326252a2d2e2f2f303030302f2f2e2d2a25262320201d1814120e090401000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e19242f3a444f59606d79849199a4afbbc3cfccc0b6aca1968e81746b61564c41352920170d080809090a0b0b0c0c0d0d0e0e0f070c101314141617191a1c191815120d060000000000000000000000000000000000000000000000000815222f3b4855626e7b8896a1adb9c5cdc0b3a69a8d8073675a4d403c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3f44464b4947433c342e261e170f05000000000000000b1724313e4a5764717e8a97a4b0bdc5b8ac9f9285796c605346392d201306000000000000020e1925303f4b5865727e8b98a5b1bed2c7bbaea399897d706356493d3023160a000714212d3a4754606d7a8793a0adbac6d3cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b2a6998c7f7366594c403326190d00000000000000000000000000000000000205070807080a080d11131417191515120f0a0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070d1113141d1f1e1e1e1e1d1d1d1d1d1d1c1c1c1c1c1c1c1d1d1d1d1d1e1e1e1e1e1f1d1c1915100a03000000000000000000000000000000000000000000000000000000000000000300000406070809060c10121312100c06000000000000000000000000000000000000000000000000000000000000040607080a0c0e0a09070400000000000000000714212d3a4754606d7a8798a3aebaafa295897c6f6256493c2f2316090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1becac8bcb1a7988b7f72665b5042382e2219100a080d151f2934404b55606d7a86929facb8c5c6baaea3988c7f73675c5145382c1f130600000000000a141c242a2f333436302d2b27221b1c232f3946525e6875828f9ca8b5c2baaea2988b7e7164584b3e3025190e02000000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e01000000000000000000000000000000000000010b151f2730383f444d5355595d5e5f5d5a56544f46413a322921170c0300000000000000000c1926323f4c5965727f8c98a5b2bfcbc3b7aa9d9084776a5d5144372a1e1104000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c10141a1e2123292c2d30333036393a3b3c3c3d3d3d3c3b3b39363033302d2c2924211e1a15110d0701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e28323d45515d676f7d87939fa7b1bdc7d1c7beb2a89d938a7d70685e52463e32291e140800000000000000000000010202000004060708090a0c0d0f0c0b090601000000000000000000000000000000000000000000000000000a1723303d4a5663707d8996a9b2bdc9cabeb1a4978b7e7164584b49494949494949494949494949494949494949494949494949494949494846443f38302921170d030000000000000b1724313e4a5764717d8a97a4b0bdc4b7aa9e918477655b5044372b1f120500000000000000081723303d4a5663707d8996abb5c0cccbbfb5ab998c7f7366594c403326190d000714212d3a4754606d7a8793a0adbac6d3cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b2a6998c7f7366594c403326190d00000000000000000000000000000000000000000000000000010507070a0d090806030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001040607111212111111111110101010101010101010101010101011111111111212100f0d0a050000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060706030000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000815222f3b4855626e7b8895aab4bfb0a396897d7063564a3d3023170a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1bdcac5b8aca095877b6e61544a3f30261c10070000030d18232f3945525d6875818e9babb5bfcbbfb4aa9e9185796d6053463a2d2013090000000000020a12191f2326272924201f1b1711121d2935414c5666727f8c99a5b2bfbfb4aa9b8e817468564c41362a1e1105000000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000030d151e262e343b4246484d505252514e4948433d36302920170f050000000000000000000d1a2633404d596673808c99a6b3bfccc3b6aa9d9083776a5d5044372a1d110400000000000000000000000000000000000000000000000000000000000000000000000000000001070d12181c1f252a2d2f34383a3d40424146474849494a4a49494847464142403d3a39352f2d2b26201d18130d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c16202935404b55606b73808d95a0abb5c0cbd0c4baafa59e91857a6d615a50443b3025190f0500000000000000000000000000000000000000000001020000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1becfc9bdb0a3968a7d7063575555555555555555555555555555555555555555555555555555555555555553504a423b33291f14090000000000000b1724313e4a5764717d8a97a4b0bdc3b7aa9d9084776a53493f33271b0f03000000000000000815222e3b4855616e7b8899a4afbbc7d1c1b4a79a8e8174675b4e4134281b0e000714212d3a4754606d7a8793a0adbac6d3cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b2a6998c7f7366594c403326190d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091623303c4956636f7c8996a2afbcb0a4978a7d7164574a3e3124170b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0bdcac4b7aa9d918477695e5342382d1e150a0000000007121d2935414c5663707d8999a3aebbc7c6b9ada1978a7e7164574b3e30251a0e02000000000000080e1317191a1c1713120f0b060d1925303d4a5763707d8a96aab4bfc4b7aa9e918477685e5246392d201407000000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000030c151c232831363a3b4043454544413c3b38322a251e170e05000000000000000000000d1a2633404d596673808c99a6b3bfccc3b6aa9d9083776a5d5044372a1d11040000000000000000000000000000000000000000000000000000000000000000000000000000060b13181d23292c31363a3b404547494c4f4c5254555556575756555554524c4f4d4a4745403b3a37312c29241d19130c07000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d18242f39434f59606d79839199a3afbbc3cfccc0b9ada1978e81756c61564c41362a21170b02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926323f4c5965727f8c98a5b2bfcbc9bcafa296897c6f636262626262626262626262626262626262626262626262626262626262626262605c544d453b31251a0e0200000000000b1724313e4a5764717e8a97a4b0bdc3b6a99c908376695d50432d22170b00000000000000000713202d3a4653606d7986939facb9c6cec2b5a89b8f8275685c4f4235291c0f000714212d3a4754606d7a8793a0adbac6d3cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b2a6998c7f7366594c403326190d0000000000000000000000000000000000000000000000000000000000000306060707050305060707050100000000000000000000000000000000000000000000000000000000000406070707040406070707050100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060707060400000505040404030302020202020202020202020202020202020203030303030404040404050505050506000003060607070604000000000000000000000b1724313e4a5764717d8a97a4b0bdb1a4988b7e7165584b3e3225180b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0bdcac0b3a69a8d807367574d422f261c0c0300000000010d19242f3a4753606d7a86929facb9c5c9beb3a99a8e817467574d42362a1e12050000000000000002070b0d0d100a06050300000815212e3b4854616e7b8798a2aebac5b9aca096877a6e6154473b2e211408000000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e01000000000000000000000000000000000000000000030a11171f262a2d2e333738383734302f2c272119130c0500000000000000000000000c1926323f4c5965727f8c98a5b2bfcbc3b7aa9d9084776a5d5144372a1e1104000000000000000000000000000000000000000000000000000000000000000000000000020a11171d24292f34383b4246484b515356595b565e616262636363636262615e565b595653514b4847423c39352f29241e18120b03000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d28313d45515c676f7c87929fa7b1bcc6d1c9beb3a99e938a7e71685e52463e33291d140a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2733404d5a6673808d99a6b3c0ccc8bbaea295887b6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6d665e574d42362a1e120500000000000b1724313e4a5764717e8a97a4b0bdc2b6a99c8f8376695c504336291d06000000000000000006131f2c3845515c667885929fabb8c5cfc3b6a99c908376695d5043362a1d10000714212d3a4754606d7a8793a0adbac6d3cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b2a6998c7f7366594c403326190d00000000000000000000000000000000000000000000000000000000060b0f12131413110f12131413110d080200000000000000000000000000000000000000000000000000070c1012131413111012131413110d08020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c1012131313100c07121111111010100f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f101010101010111111111112121212120b0f1213131413100c0701000000000000000c1925323f4c5865727f8b98a5b2beb2a5988c7f7265594c3f3226190c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdccc0b6ac978b7e7164584b3e3125140a00000000000008131f2c3945515d677683909da9b6c3cfc4b7aa9e918477695e52463a2d201407000000000000000000000001030000000000000714202d3a46525e697985929facb8c5bdb2a8978a7d7164574a3e3124170b000000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000060c141a1e2122262a2b2c2a2723221f1b160d08020000000000000000000000000b1825323e4b5865717e8b98a4b1becbc4b7aa9d9184776a5e5144372b1e11040000000000000000000000000000000000000000000000000000000000000000000000060c141c23282f35394045474d5354555c606366686a686d6e6f6f7070706f6e6e686a686663605d5555534d4745413a353028231d150c0700000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f2834404b55606a73808c95a0aab4bfcbcfc4bbafa59e92857a6e615a50453b2f261b11060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1b2834414e5b6774818e9aa7b4c1cdcabdb0a3978a7e7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7b786e695e53463a2d21140700000000000b1724313e4a5764717e8a97a4b0bdc3b6a99d9083766a5d5043372a1d07000000000000000004101c2834404b546b7885919eabb8c4d0c4b7aa9d9184776a5e5144372b1e11000714212d3a4754606d7a8793a0adbac6d3cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b2a6998c7f7366594c403326190d0000000000000000000000000000000000000000000000000000020a11171c1f2021201d1b1f2021201e19130d0500000000000000000000000000000000000000000000030b12181c1f2021201d1c1f2021201d19130c040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a11171c1f20201f1c181f1e1e1e1d1d1d1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1d1d1d1d1d1e1e1e1e1e1f1f1f1f171c1f2020201f1d18120b030000000000000d1a2733404d5a6673808d99a6b3bfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a96a3b0bdc8bbafa49a887c6f6255493c2f22160900000000000004101d2935404b556673808d99a6b3c0ccc5b9aca096877b6e6154483b2e2115080000000000000000000000000000000000000005121e2a36424d576b7884919eabb7c4c0b3a79a8d8074675a4d4134271a06000000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000003090e1214151a1d1f1f1e1b1615130f0a0400000000000000000000000000000b1724313e4a5764717d8a97a4b0bdcac4b7ab9e9184786b5e5145382b1e0800000000000000000000000000000000000000000000000000000000000000000000020a11171e262e343a40454b5153575e6166676d70737577787a7b7c7c7d7d7c7c7b7a79777573706d6766615f5754514b45413a342e271e18120b03000000000000000000000000000000000000000000000000000000000000000000000000000000040d18232e39434e58606d78839098a3aebac2cecdc1b9ada1978f82756c62574d41382d22170b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1b2835424e5b6875818e9ba8b4c1cecbbeb2a59a908a88888888888888888888888888888888888888888888888888888888888888888888857b6e6154483b2e21150800000000000b1724313e4a5764717e8a97a4b0bdc3b7aa9d9084776a5d51442f24180d0100000000000000000c18232e44515e6b7784919eaab7c4d1c5b8ab9e9285786b5f5245382c1f12000714212d3a4754606d7a8793a0adbac6d3cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b2a6998c7f7366594c403326190d00000000000000000000000000000000000000000000000000020b141c22282b2d2e2d29272b2d2e2d2a251e170e0a0100000000000000000000000000000000000000030c151c23282c2d2d2c29282c2d2e2d29251e160e09000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c151c23282c2d2d2c28232c2b2b2a2a2a2929292929292929292929292929292929292929292929292a2a2a2a2a2b2b2b2b2b2c2c2c22282b2d2d2d2c29241d150d0c03000000020e1b2835414e5b6874818e9ba7b4c0b3a79a8d8074675a4d4134271a0e0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a96a3b0bdc6b9ac9f93867a6d6053473a2d201407000000000000000c18242f3e4a5764717d8a97a4b0bdd0c9bdb2a8978a7e7164574b3e3124180b00000000000000000000000000000000000000020e1a253044515e6a7784919daab7c4c2b5a89b8f8275685c4f422e23170b000000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000000020507080d101212110e09090703000000000000000000000000000000000a1723303d4a5663707d8996a3b0bcd2c4b8ab9e9185786b5e52452f24190d010000000000000000000000000000000000000000000000000000000000000000040b141c222830383f444b51555c6065696e7276797c7f828385878888898a8a89888887858382807d7a76736e6965605d55524c4540393028231c150c0500000000000000000000000000000000000000000000000000000000000000000000000000000007121d27303c44505c666f7c86929fa6b0bcc6d0cabeb3a99e948b7e71695e53493f33271d140a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1b2734414e5a6774818d9aa7b4c0cdcec2b6aba29a97959595959595959595959595959595959595959595959595959595959595959595978b7e7265584b3f3225180c00000000000b1724313e4a5764717e8a97a4b0bdc4b7aa9d9184776a554b4135291d11040000000000000000071e2a3744515d6a7784909daab7c3d0c4b8ab9e9185786b5e5245382b1f12000714212d3a4754606d7a8793a0adbac6d3cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b2a6998c7f7366594c403326190d000000000000000000000000000000000000000000000000000a141d262d3338393a39353337393a39363029201c130a000000000000000000000000000000000000000b151e272e34383a3a393534383a3a39353028201b1209000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000710191e262e34383a3a38342e383838373737363635353535353535353535353535353535353536363636363737373737383838383839392d3338393a3a39352f271f1e150c020000030f1c2936424f5c6975828f9ca8b5c1b4a79b8e8174685b4e4135281b0e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1723303d4a5663707d8996a3b0bcc5b8ab9f928578675d5145392c201306000000000000000716222f3c4955626f7c8895a9b3becacec0b4a79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000091d2a3743505d6a7683909da9b6c3c3b6aa9d9083776a544a3f34281c10030000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c8995abb5c0ccc5b8ab9f9285786c554c4135291d110400000000000000000000000000000000000000000000000000000000000000060e161d262d333c424a50555d60676d71767b7f8386898c8e90929795959696969695959892908e8c898683807b76726d67605d56514b423d342e271e170e070000000000000000000000000000000000000000000000000000000000000000000000000000000b151e28343f4a545f6a727f8c949faab4bfcacfc5bbb0a69f92857b6e655b50443c2f261c1106000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3bfccd2c7bcb2aaa4a2a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a2a2a2a2a2a2a2a2a2a2a2a9988b7e7165584b3e3225180b00000000000b1724313e4a5764717e8a97a4b0bdc5b8ab9f928578675d5145392c2013060000000000000005121e2b3845515e6b7884919eabb7c4d0c4b7aa9d9184776a5e5144372b1e11000714212d3a4754606d7a8793a0adbac6d3cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b2a6998c7f7366594c403326190d00000000000000000000000000000000000000000000000006111c262f383f44464746413f44464746413a322e251c0b02000000000000000000000000000000000007121c2730394044464745414044464746413a322d241b11060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040f19222b30383f44464645404545454444444343434242424242424242424242424242424242424243434343434344444444444545454545463f444646474540393130271e14090000030f1c28333f4a546a7783909daab6c1b5a89b8e8275685b4f4235281c0f0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc4b8ab9e9185786b554b4035291d1004000000000000000714212d3a4754606d7a8797a2adbac6cec2b5a89b8f8275685c4f4235291c060000000000000000000000000000000000000003101d293643505c6976838f9ca9b6c2c4b8ab9e918578665c5044382b1f12060000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000000000000020507080a0b0b0a080705020000000000000000000000000000000815222f3b4855626e7b8899a4afbbc7c5b9ac9f928679675d5145392c201306000000000000000000000000000000000000000000000000000000000000060f1820282f383f444e545c60676d72797e83878c909298999b9d9fa2a9a2a2a3a3a3a2aaa29f9d9b999992908c88837f7a736d68605c544f4440393029201910070000000000000000000000000000000000000000000000000000000000000000000000000000030c17232e38424e58606c78829098a2aebac2cecdc1baaea2988f82776c60574d42382d22170c030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2bed2cdc1b5aaa09995949494949494949494949494949494949494949494969c9fa6b0afafafafafafa4978a7d7164574a3e3124170b00000000000b1724313e4a5764717d8a97a4b0bdc6baada297877a6d6054473a2d2114070000000000000005121f2b3744505b657885929eabb8c5cfc3b6a99c908376695d5043362a1d10000714212d3a4754606d7a8793a0adbac6d3cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b2a6998c7f7366594c403326190d0000000000000000000000000000000000000000000000000b17222d38424a505354524c49505354524c4440372e1d140a00000000000000000000000000000000000c18232e39424a515354524c4a515354524c443f362d22170c01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a16212b343d424a505353514b52525151515050504f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f5050505050515151515152525252524a50535353514b43423930261b10040006121f2b3844505b667885919eabb8c2b5a99c8f8276695c4f4336291c100300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc4b7aa9d9184776a5e51442f24180d01000000000000000713202c3945525d687885929fabb8c5d0c3b6a99d9083766a5d50432e23170c0000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2c5b9ac9f9286796d6053463a2d2013070000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000003080e111414171818171414110e0803000000000000000000000000000714202d3a4753606d7a86939facb9c6c7baaea398877a6d6054473a2d2114070000000000000000000000000000000000000000000000000000000000060f18212a323a424a50585f666d72797f858b90939a9c9fa3aaa8a7aba39f9e9e9d9d9e9fa2aaa6a9a8aba39f9d9995908b85807a736d666059514a423b322b22191007000000000000000000000000000000000000000000000000000000000000000000000000000006111c26303c44505b666e7b86929fa6b0bcc5d0cabeb3aa9f948b7f72695f544a3f33281e150a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97acb6c0ccc9bdb1a4998e89878787878787878787878787878787878787878787898f949fabb7bbbbbbbbafa396897d706356493d3023160a00000000000b1724313e4a5764717e8a97a4b0bdcabeb3a995887b6e6255483b2f221506000000000000000613202d394653606c7986929facb9c5cec2b5a89b8f8275685c4f4235291c0f000714212d3a4754606d7a8793a0adbac6d3cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b2a6998c7f7366594c403326190d0000000000000000000000000000000000000000000000030f1c28333f4a545b60615d56535b60615e565249402f261b110600000000000000000000000000000004101c2834404a545c60605d56545c60615e5650483f34291d1103000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27323d474f545c60605c5f5f5f5e5e5d5d5d5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5d5d5d5d5d5e5e5e5e5e5f5f5f5f5f5b6060605d55544b42372c211509000613202d394653606c7986929facb9c3b6a99d9083766a5d5043372a1d070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc3b7aa9d9084776a5d5144372a1e07000000000000000004111d2935414c566b7784919eaab7c4d1c4b7aa9e9184776b544a3f34281c100300000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2c7bbafa399877a6e6154473b2e2114080000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000060b0f14191e20212325252321201e19140f0b0600000000000000000000000613202c3945515d677784919daab7c4cbbfb4aa95887b6e6255483b2f22150800000000000000000000000000000000000000000000000000000000061018212a333c444c545b606a6f787f858c91979c9fa4acaca8a09e9a9799929291909191929896999c9fa3abaca9a79f9d97928c857f796f6b605c544d443c342b2219110700000000000000000000000000000000000000000000000000000000000000000000000000000a151e28333f4a545f69727f8b949fa9b3becad0c5bcb0a69f92867b6e665b50443c30261c110600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1723303d4a5663707d899aa4afbbc8c8bcafa295897c7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7b7c828f9ca9b6c2c8c8bbafa295887c6f6255493c2f22160900000000000b1724313e4a5764717e8a97a4b0bdcfbdb0a3968a7d7063574a3d2d22170b000000000000000815212e3b4854616e7b8799a3aebbc7cdc1b4a79a8e8174675b4e4134281b0e000714212d3a4754606d7a8793a0adbac6d3cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b2a6998c7f7366594c403326190d000000000000000000000000000000000000000000000006121f2b3844505b666c6d686a69656c6d68635b5241382d22170b00000000000000000000000000000006121f2c3844515c666d6d686b6a666d6d68625a5045392d20150900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007131f2c38434f5960666d6d666c6c6b6b6b6a6a6a696968686868686868686868686868686868686869696969696a6a6a6a6a6b6b6b6b6b6c6c6c6c666c6d6d67655d54493d3125190c000714212e3a4754616d7a8799a3afbbc4b7aa9d9184776a5e51442e23180c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc4b7aa9e9184776b5e51442e23180c0000000000000000010d19243044515d6a7784909daab7c3d0c5b8ab9f928578665c5044382c1f120600000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cbc0b5ab95887c6f6255493c2f2216090000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000020a11171c1f252a2d2e303131302e2d2a251f1c17110a0200000000000000000004111d2935404b556875828e9ba8b5c1d1bcafa396897c706356493d3023160a000000000000000000000000000000000000000000000000000000050e18222a333c454d565d666c737c838b92979ea1a9acaaa39f9b96918d8a888685848484858587898c9092999ea1a9aeaba9a29f98928c847d746d665e564e463d342b23190f0600000000000000000000000000000000000000000000000000000000000000000000000000030c17222d38424d57606c77828f97a2adbac1cdcec2baaea2989083786c60584e42382e23170c03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a86939facb9c6c8bbafa295887c6f6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6f7c8995a2afbcc8c9bdb2a894877b6e6154483b2e21150800000000000b1724313e4a5764717d8a97a4b0bdcabfb2a6998c7f7366544a3f33281c0f030000000000000a1723303d4a5663707d8996abb5bfcbcabfb4aa988b7e7265584b3f3225180c000714212d3a4754606d7a8793a0adbac6d3cabdb1a4978a7e7164574b3e3124180b000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b2a6998c7f7366594c403326190d0000000000000000000000000000000000000000000005111e2a36414c56606c787a78767677797a736e6353493f33271b0f030000000000000000000000000006121e2b37424d57606d797a79777778797a716c6256493c31261a0e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915222f3b4854606b6f79797979787878777777767676757575757575757575757575757575757575757676767676767777777777787878787879797979797a756f655a4d4134281b0f000915222f3c4855626f7b8895abb5b8b9b8ab9e9185786b544a4034281c100400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc4b8ab9e9185786b544a4034281c10040000000000000000081d2a3743505d6a7683909da9b6c3d0c6baada29786796d6053463a2d20130700000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2d1bcafa295897c6f6256493c2f2316090000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000000000060b141c22282b3036393b3d3e3e3d3b3936302b28221c140b060000000000000000010d18242f3f4c5966727f8c99a5b2bfcfbdb1a4978a7e7164574b3e3124180b0000000000000000000000000000000000000000000000000000030d17202a343c464e575f686d78808790959ea2a9adada59e98928e8884807d7b797877777778797b7d7f83868c91969fa2aab1adaaa29f95918880786e6960584e463d352b22180e050000000000000000000000000000000000000000000000000000000000000000000000000006111c262f3b44505b656e7b85929fa5afbbc5cfcabfb4aa9f948c7f726a5f544a3f34281e150b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202c3945525d687784909daab7c3d2bcafa396897c7063616161616161616161616161616161616161626e7b8895a1aebbc8c5b9aca096877a6d6054473a2d21140700000000000b1824313e4b5764717e8a97a4b1bdcac2b5a99c8f8276665b5044382b1f1207000000000004101c2834404a5465727f8c98a5b2bfd1c6baaea298887c6f6255493c2f221609000714212e3a4754616d7a8794a0adbac7d3cabeb1a4978b7e7164584b3e3125180b00000000000000000000000000000000000000000003101d293643505c6976838f9ca9b3a6998c807366594d4033261a0d000000000000000000000000000000000000000000000714202d3946525e687581878583838486878073655b5044372b1f1205000000000000000000000000000814212e3a47535f697682878584848586877e7164574e42372b1e12060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091623303c4956636f7c8586868685858484848383838282828282828282828282828282828282828282828283838383838484848484858585858586868686868175685c4f4235291c0f000a1723303d4a5663707d8996a3ababacafac9f928579665c5144382c1f120600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc5b8ab9e928578665c5144382c1f12060000000000000003101d293643505c6976838f9ca9b6c2cfc6b9ac9f9386796c605346392d20130600000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2c9bcafa296897c6f6356493c302316090000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e01000000000000000000000000000000000000000000070f181d262d33383b4146474a4b4b4a4746413b38332d261d180f070000000000000000071723303d4a5663707d8996a8b2bdc9bfb2a5988c7f7265594c3f3226190800000000000000000000000000000000000000000000000000010b151f29323c464e585f696e7a828c92999fa7adb2a9a29f938e86817c7774716e6d666b6a6a656c6e7073767a7f848c92989fa7afb4aea8a09a938d837b6f6a60584f473d342a20160c02000000000000000000000000000000000000000000000000000000000000000000000000000a141d27333f49535e69717e8b939ea9b3bec9d0c6bcb0a69f92867c6f665c50443c30271d120700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111d2935414c566774818d9aacb6c0ccbeb1a4978b7e7164585454545454545454545454545454545455626f7c8895a2afbbc8c4b7aa9e918477675d5145392c20130600000000000b1825313e4b5864717e8b97a4b1becac5b8ab9f9285796c605346392f24180c010000000006121f2c3844515c6675828f9ba8b5c2cec5b8ac9f9285796d6053463a2d201307000814212e3b4754616e7a8794a1adbac7d4cabeb1a4978b7e7164584b3e3125180b00000000000000000000000000000000000000000003101d2a3643505d697683909ca9b3a6998d8073665a4d4033271a0d000000000000000000000000000000000000000000000814212e3b4754616e7a879392908f91929185786c605346392d201307000000000000000000000000000815222f3b4855626e7b889492919092939184776a5f53473a2e21140800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b989392929291919090908f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f909090909091919191919292929292939a939184786b5e5145382b1e12000b1724313e4a5764717d8a979e9e9f9fa4aca29886796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc6b9ac9f9386796d6053463a2d2013070000000000000004101d2a3743505d6a7683909da9b6c3d0c5b8ab9e928578665b5044382b1f120600000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2c9bcb0a396897d7063564a3d3023170a0000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000071119212a2f383f44464d52545658585654524d46443f382f2a21191107000000000000000714212e3a4754616d7a8796a1adb9c5c0b3a69a8d8073675a4d403025190d0100000000000000000000000000000000000000000000000007121d27313b444e585f6a6e7b848f949fa3abb1b2a8a097928a817b746f6a676462605c545d535b60616366686e73797f8690959da5aebab1aca49f9590857c6f6a60594f463c32281e140a00000000000000000000000000000000000000000000000000000000000000000000000000020b17222d38414d57616c75828f97a1adb9c1cdcec2baaea3989083786d60584e43392e23180d040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d1924303e4a5764717e8a9aa4afbbc8c0b3a79a8d807467554b47474747474747474747474747474956636f7c8996a2afbcc9c1b4a89b8e817568554c4135291d110400000000000b1825323e4b5865717e8b98a4b1becbc6baaea298887c6f62554b4035291d1307000000030c15202d3a4653606d7985929fabb8c5cbc0b5ab9c908376665c5044382c1f1206000815212e3b4854616e7b8794a1aebac7d4cbbeb1a4988b7e7165584b3e3225180b00000000000000000000000000000000000000000004111d2a3744505d6a7783909daab3a69a8d8073675a4d4034271a0d01000000000000000000000000000000000000000003101c28343f4a5464717e8b9a9e9d9c9e9f97887c6f6255493c2f24180d01000000000000000000000004111d2935414c5665727f8c989f9e9d9e9f96887b6e6255483b3025190d01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b979f9f9f9e9e9e9d9d9d9c9c9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9c9c9c9c9c9d9d9d9d9d9e9e9e9e9e9f9f9f9f9fa49d9083776a5d5044372a1d11000a1724303d4a5763707d8a92919192939a989b97867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc7bbafa499887b6e6155483b2e2215080000000000000004101d2935404b556a7784919daab7c4d0c4b7aa9e9184776b544a3f33281c0f0300000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2c9bdb0a3968a7d7063574a3d3024170a0000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e0100000000000000000000000000000000000000060f19232b333c424a5053565e6163646463615e5653504a423c332b23190f060000000000000713202d3946525e687884919eabb8c4c2b5a99c8f827669564c41362a1e11050000000000000000000000000000000000000000000000050e18242f39434d565f6a6f7c8591969ea6afb5b2a8a09691857d756e69626058575553514b514950535456565e61676d727b838e939da4aeb7b6afa79f9791857d6f6b60584e443a30261c11060000000000000000000000000000000000000000000000000000000000000000000000000006111b262f3b45505a616d7a85929ea5afbbc4cfcbbfb4aaa0958c7f736a60554b4034281f160c0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7b87939facb9c3c3b6a99c908376675d51453b3b3b3b3b3b3b3b3b3b3b3b3d4a5764707d8a97a3b0bdcabfb4aa988b7e7265584b3f2f24190d0100000000000c1825323f4b5865727e8b98a5b1becbcabeb3aa9a8d8074675d51453a2f2418100806060b151e2a36414c5663707c8998a2aebac6c7bbafa3998c7f7266544a3f34281c1003000815222e3b4855616e7b8894a1aebbc7d4cbbeb1a5988b7e7265584b3f3225180c00000000000000000000000000000000000000000004111e2a3744515d6a7784909daab3a79a8d8074675a4d4134271a0e01000000000000000000000000000000000000000006121f2b3844505c6675818e9baca9a9aaa9998c7f7266554b4135291d110400000000000000000000000713202c3945525d6876838f9ca9aaaaaba8998c7f7266564c41362a1d1105000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4acabababaaaaaaa9a9a9a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a9a9a9a9a9a9aaaaaaaaaaabababababacacaca99c8f8276695c4f4336291c10000714212e3a4754616d7a848584848586898c8f918578675d5145392c20130600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcccc0b5ab96897c706356493d30231607000000000000000613202c3945515d677885919eabb8c4d0c3b6a99d9083766a5d50432d22170b0000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cabdb0a3978a7d7064574a3d3124170a0000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e01000000000000000000000000000000000000020b18212b353d454e545b6064686e707171706e6864605b544d453d352b21180e03000000000005111e2a36414c566774818e9aa9b3bec4b8ab9e918578685e5246392d20140700000000000000000000000000000000000000000000020d17202935404b555e696f7c859197a0a8b0bbb3a9a09691847b706c615e57544e4a48464540443f4446484a4c52555c60696e79818d929da5afb9bbb1a9a19792867d6f6a5f564c42382e23170b02000000000000000000000000000000000000000000000000000000000000000000000000000a141d29333e46525e68717e8a939ea9b2bdc9d1c6bcb1a79f92877c6f675c51453d31281d120700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3946525e6875828f9ca7b1bcc5b8ac9f92867a6d6053473b312e2e2e2e2e2e2e2e2e323f4c5965727f8c98a5b2bfc6baaea298887c6f6255493c2f2216080000000000000c1925323f4c5865727f8b98a5b2becbd0c5b8ab9f9285796d60554b4035292219131213151d26303846525e6874818e9baab4becac5b9ac9f92867b6e6154473b2e23170c00000815222f3b4855626e7b8895a1aebbc8d4cbbeb2a5988b7f7265584c3f3225190c00000000000000000000000000000000000000000004111e2b3744515e6a7784919daab4a79a8e8174675b4e4134281b0e0100000000000000000000000000000000000000000713202d3a4653606d7985929eabb6b6b6a99c8f8376675d5145392c20130600000000000000000000000714212d3a4754606d7a86929facb7b7b6a99c908376685e5246392d201307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a96a3b0b8b8b7b7b7b6b6afa9a7a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a3a3a3a4a4a4a5a5a5a6a6a7a7a8a9a9aaabacaea89b8f8275685c4f4235291c0f000713202d3946525e686d7878787878797c7f8284807367554b4035291d100400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcd2beb1a4978b7e7164584b3e2f24180d010000000000000714202d3a4753606d7a86939facb9c6cfc2b5a89c8f8275695c4f4236291c060000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cabdb0a4978a7d7164574a3e3124170b0000000000000000000000000b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000000000a141d2a333d474f575f666c71767a7d7e7e7d7a76716c665f574f473d332a1f14090000000000010d1925303d4a5663707d8997a2adbac6b9ada197877a6e6154473b2e2114060000000000000000000000000000000000000000000008141f29323b45515d676e7b849197a1a9b2bab6aca29791847b6e696159534d47433e3b3a38342e3337393b3d41464b51575e676d74808d939ea7b1bcbbb3a9a29892867c6e685e544a3f34281d140a00000000000000000000000000000000000000000000000000000000000000000000000000020b17212a36414c56616c75818e96a1adb9c0cccfc3bbafa3999083796d60594f43392f24180d040000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111e2a36414d5663707d8995a0acb8c4baaea2988a7e7164574d42362a212121212121212935414c566774818d9aa7b4c0c5b8ac9f9285796d6053463a2d2013070000000000000c1926323f4c5965727f8c98a5b2bfcbd3c6baada2978b7e71675d51453d342a25201f2020272f38424d57616e7a86929facb9c5c9bdb2a89b8f8275685e5246392d1c110600000915222f3c4855626f7b8895a2aebbc8d5cbbfb2a5988c7f7265594c3f3226190c00000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb4a79b8e8174685b4e4135281b0e020000000000000000000000000000000000000000091623303c4956636f7c8997a2adb9c2b9ac9f92867a6d6054473a2d2114090000000000000000000003101c28343f4a5464717e8a99a3afbbc3b9ac9f93867a6d6154473a2e23180c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc5c4c4c3baafa59e9b969696969696969696969696969696969696969797979898989999999a9b9b9c9d9d9e9fa3aa9c908376695d5043362a1d100005111d2a36414c565e616b6c6b6b666d6f727577736e645843392f24180d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c0b3a79a8d807467554b4035291d11040000000000000916222f3c4955626f7c889aa4afbbc8ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cabdb0a4978a7d7164574a3e3124170b0000000000000000000004070b1825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b0e0b0b0807050200000000000000000000000006111b262f3c454f59606a6e787e8386898b8b8986837e786e6960594f453c31261a0e0500000000000813202d3a4653606d7985929fabb8c5beb3a996897d7063564a3d2e23170c000000000000000000000000000000000000000000020e1925303b44505a606d79839096a1a9b2bbbbafa49a92857b6e695f574f46423b37322f2d2c2823272b2d2e30363940454d555c606c77818e95a0aab4bfbcb3aaa29891847a6d665c50443c2f261c110600000000000000000000000000000000000000000000000000000000000000000000000000050f1925303a44505a606d7a84919ea5afbac4d0cbc0b5aba0958d80736b60554b4035291f160c01000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1925303b4854606b7784919da8b2bdbfb4aa9b8f8275695f53463c31281d16141414202c3945525d687683909ca9b6c3bcb1a79b8e8175665c5044382b1f12060000000000000c1926333f4c5966727f8c99a5b2bfccd6cabeb3a99e9184796d60594f463d36302d2b2c2d3039414a545f6973808c98a3aebac7c6b9aca0968a7d7064564d41362a1e0a0000000916222f3c4955626f7c8895a2afbbc8d5ccbfb2a5998c7f7266594c3f3326190c00000000000000000000000000000000000000000005121f2b3845525e6b7885919eabb4a89b8e8175685b4e4235281b0f020000000000000000000000000000000000000005111e2a36414c566673808c99a9b3bec7bbaea3998a7d7064574a3d31261a0e0200000000000000000006121f2b3844505c6675818e9babb5c0c7bbafa4998b7e7164544b4034281c10040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c8995a2afbcc8d1d1c2b6a99e938e8989898989898989898989898989898989898a8a8a8b8b8b8c8c8c8d8d8e8e8f909191929895969184776a5e5144372b1e1100010d1925303a444c52545e5f5e545c606265686b67645c524731281d12070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c3b6aa9d908377675d5145392c2013080000000000000b1824313e4b5764717e8a97acb6c0ccc9bdb2a8968a7d7063574a3d3024170a0000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cabdb0a4978a7d7164574a3e3124170b0000000000000000050b1013161825313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134271b1818181414110e0902000000000000000000000b17222d38414d57606b707c838b90939a97979a93908b837b706b60574d42372b22170b000000000006121f2c3844515c6674818e9baab4bebfb2a5988c7f7265544a3f34281c1003000000000000000000000000000000000000000005111e2a36414d56616c75818e959fa9b2bbbeb3a99f93887d70695f574d453e36312b2722201f1c181b1f2021252a2e343b434b515b656d79839098a3aebac4bcb3aaa0968f82786d60584e42382d22170b000000000000000000000000000000000000000000000000000000000000000000000000000008131e29323e45525d68707d89929da8b2bdc7d1c7bdb1a79f93877d6f675d51453d31281e13080000000000000000000000000000000000000000000000000000000000000000000000000000000000000008141f2c38444f5965727e8b96a1adb9c1b9ac9f92867b6e61584e433a2f281f1c1a1e27313a4754606d7a86929facb9c5b7ab9f95897c6f62544a3f34281c10030000000000000d192633404c5966737f8c99a6b2bfccd2c7beb6aca1968d80746b60584f46413b3938393a3d434b535c666e7b86929faab4bfc6bcafa59e9184786d6053463b3025190e0000000916232f3c4956626f7c8995a2afbcc8d5ccbfb2a6998c7f7366594c403326190d00000000000000000000000000000000000000000006121f2c3945525f6c7885929fabb5a89b8e8275685b4f4235281c0f02000000000000000000000000000000000000000713202d3946525e687783909daab6c3cbbfb5ab9a8d817467574d42372b1e12060000000000000000000713202d3a4653606d7985929eabb8c5ccc0b5ab9b8e8275665c5145382c1f13060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915222f3c4855626f7c8895a2aebbc8d5cec1b4a79b8e817c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d7d7d7e7e7f7f7f808080818282838484858788898b85786b5e5245382b1f12000008131e29323a4146475252514a515356595c5e5a58524a40361f160c010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c5b9ac9f92867a6d6053473a3025190d020000000006121f2b37434e586774818e9aa7b4c1d2c5b9aca096877a6d6154473a2e2114070000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cabdb0a4978a7d7164574a3e3124170b00000000000000070f161c20222325313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e4134272424252521201e19140d050000000000000000030f1b27333f49535f69707d8590959d9fa4acaca49f9d9590857d70695f53463e33281c10010000000004101c2834404a5463707d8a98a2aebac1b5a89b8e8275665c5044382c1f12060000000000000000000000000000000000000005101a242d3946525e68717e8b939ea7b1bbc4b9ada1978d81746b61574d453c332a251f1b151313100c0f121315191d232830394049535d676e7b86929fa8b2bdc5bcb2a89f948c7f726a5f544a3f33281d120700000000000000000000000000000000000000000000000000000000000000000000000000020d17202935414c56616b74818e96a0abb5c0cccfc3bbafa4999184796d60594f433a2f24190e0400000000000000000000000000000000000000000000000000000000000000000000000000000000000002101c27333d4753606d7984919ea5afbabbaea3998e81756a5f564c423a312b28262a3039434e5864717d8a99a3afbbbdb2a89d9083766a605442382e23170b000000000000000d1a2733404d5a6673808d99a6b3c0ccccc0b6aca49f9f93887d6f6a6059524d4846444547494f555c656d78839098a2aebcc6bfb4aa9e938a7d70665c504438291f1408000000091623303c4956636f7c8996a2afbcc9d5ccbfb3a6998c807366594d4033261a0d00000000000000000000000000000000000000000006131f2c3946525f6c7985929facb5a89b8f8275685c4f4235291c0f02000000000000000000000000000000000000000714212e3a4754616d7a87939facb9c6d1c4b7ab9e918478695f53473a2e211407000000000000000000091623303c4956636f7c8997a2adb9c6d2c5b8ac9f9285796d6053463a2d20130a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4ccbfb3a6998c80736f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f707070717171727272737374747576767778797a7b7d7e7d7164574a3e3124170b0000020c1720293036393a454545404446494c4f514d4b4740382e240d04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c7bbafa3998a7d7063564c41362a1e1308000000020b14212e3a47535f6a7884919eabb7c4d1c4b7aa9e918477685e5246392d2013070000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cabdb0a4978a7d7164574a3e3124170b00000000000007111921272c2f3032313e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e413430313132322e2d2a251f170e050000000000000005121f2b3744505b656e7b859297a0a7acafb6b6afaca7a09792857b6e615a5044392d1d130700000000000c18232e3a4653606d7985929fabb5c0b8ab9f9285796d6053463a2d201309000000000000000000000000000000000000000b17222c38444f59616e7b85929fa5afb9c3beb3a99e92857a6d60594f453b332a211a140f0a07060400030506080e12181e272e38414b555f6a73808c96a1adb9c5c4bab0a69f92867c6f665b5044392e23180c0000000000000000000000000000000000000000000000000000000000000000000000000000050e1924303a444f59606d79849199a4afbbc3cfccc0b5aba0968d80746b60564c41352920160c020000000000000000000000000000000000000000000000000000000000000000000000000000000000000b161f2c3945515d67707d8a939ea8b2bcb5ab9f93877c6f685d544b433c383331363a414b55606a76828f9cabb5c0b9aca0968a7e7164584e4330261c1106000000000000000d1a2734404d5a6773808d9aa6b3c0cdc8bbafa49a939a9a92857c706b615e565553505153555960676d77808d959faab4bfc1baaea2988f82756b61544a3f34281c10030000000a1623303d495663707c8996a3afbcc9d6ccc0b3a6998d8073665a4d4033271a0d00000000000000000000000000000000000000000006121f2c3844505c667986929facb5a89c8f8275695c4f4236291c0f03000000000000000000000000000000000000030f1c28333f4a5464717e8b9aa4afbbc8d2c5b9aca196887b6e6255483b2f23180c000000000000000005121e2a36424d576673808d99a9b3becad3c6baaea298897d7063564a3d31261b0f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbad2ddccbfb3a6998c8073666363636363636363636363636363636363646464656565666666676868696a6a6b686d6f7071716c6155493c3023170a000000050e171e252a2d2e38392e34383a3c3f4244403f3b362e261c1200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9cbc0b5ab9b8e8175685e52463a302519100906060a141d2935404b55626e7b8896a1acb9c5c8bcb1a79a8d807467564c41362a1d11050000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cabdb0a4978a7d7164574a3e3124170b0000000000050f19232b33383c3d3e3e3e4b5864717e8b97a4b1becac0b4a79a8d8174675a4e413d3d3d3e3e3e3b3a36302920170d020000000000000613202d394653606c78839097a2a9b1b9bbc0c0bbb9b1a9a2979083766c6155493a2f24180d010000000007131f2c3845515c6774818d99a3afbbbaada297897c6f6356493c31251a0e00000000000000000000000000000000000004101c28333b4854606b75828f97a2adb7c1c6b9ada1978b7f72685d52473e332921180f090300000000000000000000070c151d262f39434e57606d7984919ea9b3bec9c2baaea3999083786c60554b4034281c1106000000000000000000000000000000000000000000000000000000000000000000000000000008131e28323d45515d676f7d87939fa8b1bdc7d1c7bdb2a89f93887d70685d52453e32281e130800000000000000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b55616c75828f96a0aab4bbafa49a91847a6d665d554e46443f4242464c525c676f7c88949fabbdb9afa59e9184786d6053463d3220140a00000000000000000e1a2734414d5a6774808d9aa7b3c0cdc6b9ac9f938692989792857d746e686462605b5d6062646b6f79818d929da7b1bcc0b7afa59f92867b6e61594f42382e23170c000000000a1724303d4a5763707d8a96a3b0bdc9d6cdc0b3a69a8d8073675a4d4034271a0d0100000000000000000000000000000000000000000713202d3a4653606d798699a3afb5a99c8f8276695c4f4336291c100300000000000000000000000000000000000006121f2b3844505b6675818e9bacb6c0ccd5c9bdb2a8988b7f7265554b4034291c1004000000000000000714212d3a46535e697784909daab7c3cfd6cabfb4aa9a8d807467584e43372b1f120600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0b6c0ccd8ccbfb3a6998c807366595656565656565656565656565656565757575858585959595a5a5b5b5c5d5e565d6162636564615a5045392d21140800000000050c13191d20212b2c23282c2d2f32353834332f2a241c140a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9d1c5b9ac9f92867a6d61564c41362a221a131213141c262f3845515d6773808d99a8b2bdc9c4b8aca095887c6f6255493c3025190d010000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cabdb0a4978a7d7164574a3e3124170b00000000030d17212b353d4448494b4b4a4b5864717e8b97a4b1becac0b4a79a8d8174675a4e49494a4a4b4b4b4746423b32291f1409000000000004111d2935414c5564717e8a959fa9b3bcc3c8ccccc8c3bcb3a99f958a7d7164554b4135291d11040000000004101c2834404b55616e7b87929facb9beb3a9998d807366574d42362a1c110600000000000000000000000000000000000814202d3944505a63707d89939ea9b3bec9c5b8ab9e9285796d60564c41352c21170f0600000000000000000000000000030b141d27313c45515d67727f8b97a1adb9c6cbbfb4ab9f958b7e71675c5145382e23170b0000000000000000000000000000000000000000000000000000000000000000000000000000020c16202935404b55606b73808d95a0abb5c0cbd0c3bbafa49a91847a6d60594f443a3025190e050000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18242f3943505a606d7a849198a2aab3b6aca0968f82786d675f5853504a4f4d53565e616d7983909da6b0bab1a79d93897d70665c5044382b1f120200000000000000000e1b2835414e5b6874818e9ba7b4c1ccbfb2a6998c7f869299979287817b75716e6c66676d6f71767c838e939da4aeb9bfbaafa59d928b7f72695e53473e30261c1106000000000b1724313e4a5764717d8a97a4b0bdcad7cdc0b3a79a8d8074675a4d4134271a0e0100000000000000000000000000000000000000000714212d3a4754606d7a8793a0b5b6a99c908376695d5043362a1d10030000000000000000000000000000000000000613202d394653606c7985929eabb8c5d2dacec2b5a89c8f8275675c5145382c1f1306000000000000000815212e3b4854616e7b8795a0acb8c5d1dbd0c4b7ab9e9184786a5f53473a2e21150700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d79869aa4afbbc8d4ccbfb3a6998c807366594d49494949494949494949494949494a4a4a4b4b4c4c4c4d4d4d4e4f4f50514c5254555658575550483e33281c1104000000000002080d1113141f1f181c1f202326292b2726231f19120a0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9d3c7baaea3998c7f72685e52463e342a26201f1f20262d38414d56606d7985929fabb8c4cabeb3a99d9083776a5f53473b2e1e1308000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cabdb0a4978a7d7164574a3e3124170b0000000009141f29333d474f5456585757565864717e8b97a4b1becac0b4a79a8d8174675a555656575757585854524d443b3025190e02000000000613202c3945515d6776828f9ca7b1bbc5ced4d8d8d4cec5bbb1a79c8f8276675d5145392c20130600000000000c18232e3946535f6975818e9ba6b0bbb7aa9d908377695e5346382e23170b00000000000000000000000000000000000a1623303c4955616c7683909da6b0bbc5c8bdb2a8998c8073675d51443a30231a0f06000000000000000000000000000000020b151f2935404b55606d7985929eabb8c4cfc6bdb1a79e9184796d60544a3f34281c10030000000000000000000000000000000000000000000000000000000000000000000000000000040e18242f3a434f59606d79849199a3afbbc3cfccc0b6aca1968e81746b61564c41352920170d02000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d27313e45525d686f7c869298a2a9b2b2a89e948f81796f6a63605b545b575f61686d75818e959fabb8b1a89f958e81746b60544a3f34281c100300000000000000000f1c2835424f5b6875828e9ba8b5c1cabdb0a4978a7e7d87929999938e86827e7b7978787a7c7e838990959ea5aeb6bcb4aea59d938e80746d62574d42352c1e150a00000000000b1824313e4b5764717e8a97a4b1bdcad7cdc1b4a79a8e8174675b4e4134281b0e0100000000000000000000000000000000000000000814212e3b4754616e7a8794a1adb6aa9d9083776a5d5044372a1d11040000000000000000000000000000000000000916232f3c4956626f7c8997a1adb9c6d2dfd2c5b8ac9f9286796d6053473a2d20140900000000000004111d2935404b5565727f8b98a7b1bcc8d4d6d2c5b9aca196887c6f6255483c2e23180c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c667986939facb9c6d2ccbfb3a6998c807366594d403c3c3c3c3c3c3c3c3c3c3c3c3d3d3d3e3e3e3f3f3f4040414142434344414647484a4b4a49453e362c22170c00000000000000000105070712070c10121316191c1e1a1917130e08000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9d7cbbfb4ab9e92857a6d615a50463e36312d2b2c2d2f383f49535e69727f8b97a2adbac6c7baada2978b7f7265584e43372b1f0c02000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cabdb0a4978a7d7164574a3e3124170b000000020e1a25303b454f596063656463636264717e8b97a4b1becac0b4a79a8d817467626262636364646565615e564d42362a1e1105000000000714212d3a4754606d7a86929facb9c3cdd7e0e4e4e0d7cdc2b9ac9f92867a6d6054473a2d211407000000000007121d2a36424d57626f7c88949eaab7b8aca095877b6e61544a3f34281c100300000000000000000000000000000006131f2b37434e5864707d8a959fabb8c1cdc5b8aca096887b6e62554b4032281e11080000000000000000000000000000000000030d18242f3945515d6773808d9aa9b3bec9cfc3b9aca1968c7f72665c5044382b1f140900000000000000000000000000000000000000000000000000000000000000000000000000000007131d28313d45515c676f7c87929fa7b1bdc6d1c7beb2a89d938a7d70685e52463e32291e14080000000000000000000000000000000000000000000000000000000000000000000000000000000000010b151f2935414c565f6a707d869297a0a8afb0a69e938f837c75706c66696869696e737a828e939da7b1afa7a0969083796d60594f42382e23170b0000000000000000000f1c2936424f5c6975828f9ca8b5c2d0beb1a4978b7e717e87939a9f99928f8b8886858586888a90949d9fa7afb7b7b0aaa39f938e81786d605b51453b31231a0c0300000000000b1825323e4b5865717e8b98a4b1becbd7cec1b4a89b8e8175685b4e4235281b0f0200000000000000000000000000000000000000000815222f3b4855626e7b8895a1aeb7aa9d9184776a5e5144372b1e1104000000000000000000000000000000000005111d2a36414c566673808c99a9b3becad6dcd3c7baaea298897d7063564a3d31251a0e0200000000000613202c3945515d6776828f9ca9b5c2ced0cac6c5bdb2a8988c7f7265554b4034281c10040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b5f6c7986929facb9c5d2ccbfb3a6998c807366594d40333030303030303030303030303031313132323233333334353536373035393a3c3d3e3e3c39332c241a1005000000000000000000000000050000040607090c0f110d0d0b070200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9d2c7beb6ada1978e81756c61595046423c3a38383a3c424a505b656e7b85929ea9b3bec7beb1a79f92857a6d6054473c32261b0f00000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cabdb0a4978a7d7164574a3e3124170b00000005121e2a36424d57606b70717170706f6e717e8b97a4b1becac0b4a79a8d81746e6e6f6f7070707171716e695e52463a2d201407000000000916222f3c4955626f7c8899a3aebbc7d4dfe9f0f0e9dfd3c7baaea399887c6f6255493c2f2216090000000000000e1a26313b47535f6a75828f9ca5afbcb1a7998c7f73665c5044382b1f14090000000000000000000000000000000815212e3b47535f6a7683909da7b1bccad0c4b7aa9d9184776a5f5343392f20160c0000000000000000000000000000000000000007121d2935404b55636f7c8997a1adb9c6d2c9bdb2a89e9184786d6053463b31251a0e020000000000000000000000000000000000000000000000000000000000000000000000000000010c161f2934404b55606a73808c95a0abb4bfcbd0c4baafa59e91857a6d615a50443b3025190f050000000000000000000000000000000000000000000000000000000000000000000000000000000000030d19242f3a444e58606b707d8591969da5abafa59e959187827d7977757576787b80848f949da5afaba59d9590847a6e675c51473d30261c1106000000000000000000101d293643505c6976838f9ca9b6bfbdbeb1a5988b7e72727f8892989f9f9b97999392929795979c9fa6abb1b7b1aba69f98928b81786d665c50493f33291f11080000000000000c1925323f4c5865727f8b98a5b2becbd7cec1b5a89b8e8275685b4f4235281c0f0200000000000000000000000000000000000000000916222f3c4955626f7c8895a2afb7ab9e9184786b5e5145382b1e070000000000000000000000000000000000000713202d3946525e687683909da9b6c3cfd8d0cbc7bfb4aa9a8d807367574d42362a1e120500000000000714202d3a4753606d7a86929facb9c5cec5bfbab8bab5a99c8f8276675c5145382c1f130600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232e45525f6c7885929fabb8c5d2ccbfb3a6998c807366594d403326232323232323232323232324242425252526262627272828292a24292d2e2f303231302d28221a12080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9ccc0b6aca49f9e938a7e706b615a534d4846444547484e545b606c77828f97a2adbbc5c0b6aca0958b7f72685d5245392a20150a00000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cabdb0a4978a7d7164574a3e3124170b0000000714202d3a46525e69707d7e7e7d7c7c7b7b7f8b98a5b2becbc1b4a79b8e817a7b7b7c7c7c7d7d7e7e7e7b6e6154473b2e211408000000000a1724303d4a5763707d8a96abb5bfcbd7e7f2fbfbefe3d7cbbfb4ab968a7d7063574a3d3024170a00000000000009141f2b37434e58636f7c89939eaab4b8ab9e9184786d6053463b31261a0e030000000000000000000000000004101c2934404b55626f7c88959fabb9c2cdc9beb3a9998d807366574e4231271d0e0400000000000000000000000000000000000000010c18242f394653606c7985919eabb8c4d0cec4b9ada1968a7d7064574d42362a1e1205000000000000000000000000000000000000000000000000000000000000000000000000000000040d18232f39434e58606d78839099a3aebac2ceccc0b9ada1978e81756c61564c41362a21170b02000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e28323c464f59606b707c848e939da0a7aba8a09a938f89868482828384878c91979ea6aca7a09d938e837a6e685e554b40352c1e140a00000000000000000000101d2a3743505d6a7683909da9aeb4b0b2b2a5988c7f726d727e8690959ea1a8a49f9f9ea1a9a4a9abb0b1acaaa79f9d948f867f746d665c544a3f372d21170d000000000000000c1926333f4c5966727f8c99a5b2bfc7cbd1c2b5a89c8f8275695c4f4236291c0f030000000000000000000000000000000000000000091623303c4956636f7c8996a2afb8ab9e9285786b5f52452f23180c0000000000000000000000000000000000000714212e3a4754616d7a86939facb9c6d2cec6bfbab8b7aa9d918477695e53463a2d21140600000000030f1b27333f495364707d8a98a3aebac7c5bcb4aeacaeb4ac9f9285796d6053463a2d2013080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000071f2c3845525f6b7885929eabb8c5d1ccbfb3a6998c807366594d4033261a1616161616161616161617171718181919191a1a1a1b1c1c1d191d20212223252423211c171008000000000000000000000002050708070604000003000104060708070604000000000000000000000000000000000000000000000000000000000000010406070707050100020100000406070807050200000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c8bbafa49a939a9f92867d716c615f57555350515355585f666c74808c949fa9b3bec2bbafa49a9083786c60564c413529180e0400000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cabdb0a4978a7d7164574a3e3124170b0000000815212e3b4854616e7b878b8a8a898988878b919ba7b3c0ccc2b6a99d938e8787888889898a8a8a8b8b8174675b4e4134281b0e010000000a1724303d4a5763707d8a96aab4bfcad6e2effaf9efe2d6cabfb4aa96897d7063564a3d3023170a000000000000030f1b26313c4854606b75828f98a2aeb9ada1968a7d7064574d42362a20150a0000000000000000000000000006131f2c3845515c6774818e9aa7b1bccbd2c6b9ada197897c6f6256493c3123150b00000000000000000000000000000000000000000007121f2b3844505b6674818e9aaab3becad5c9bdb2a89c8f8276695e53463a2d2114080000000000000000000000000000000000000000000000000000000000000000000000000000000007121d27313d44515c666f7c86929fa7b1bcc6d0c9beb3a99e938a7e71685e52463f33291d140a0000000000000000000000000000000000000000000000000000000000000000000000000000000000010c16202a343d474f59606a6e7a818990959c9fa6aca49f9c9892918f8e9091939a9ea1a9a7a09d95908a81796d685e564d43392f231a0c0200000000000000000000111e2a3744515d6a7784909d9fa2aaa4a5a8a6998c8073666c707c838b91969b9fa2aaa6a7a8a8a7a6a5a7a09d9a95908a827c726d605c544a42382e251b0f05000000000000000d192633404c5966737f8c99a6b2b9babfbbbdb6a99c8f8376695c504336291d100300000000000000000000000000000000000000000a1724303d4a5763707d8a96a3b0b8ac9f9285796c554b4034291c100400000000000000000000000000000000030f1c28333f4a5464717e8a99a4afbbc7d0c6bcb4aeacaeaca095877b6e6154483b2e23170c0000000005121f2b3744505b6574818e9aaab4bfcabfb4aaa29fa2aaaea298897c706356493d3024190d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1ccbfb3a6998c807366594d4033261a0d09090909090909090a0a0a0b0b0b0c0c0c0d0d0e0e0f10080d111314151718171714110c050000000000000000000003090e1214151312100c070f070d111314151313100c07000000000000000000000000000000000000000000000000000001070d1113141413110d080e0e070c1013131514120e09030000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c6b9ac9f938692989892867e756e696562605c5d6062646a6f78808c929ca6b0bbc2b9b0a69f93887c6f665b50443a302419070000000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cabdb0a4978a7d7164574a3e3124170b0000000814212e3b4754616e7a8799979696959594989ba3adb8c3cfc6baafa59d9b949495959596969797988d8074675a4d4134271a0e010000000916222f3c4955626f7c8898a2aebac6d3dee8eeeee8ded3c6baaea298887c6f6255483c2f221509000000000000000a15202c38434f59616e7b86929fa7b1b2a89c8f8276695f53463c31261b0b020000000000000000000000000714202d3a4753606d7985929facb8c2cdd1c4b8ab9e9185786c605346392d201306000000000000000000000000000000000000000000030f1c28333f4a5463707d8998a2aebac6d3cfc4b7ab9f94877b6e6154483b3024190d01000000000000000000000000000000000000000000000000000000000000000000000000000000010b151f2834404a545f6a727f8c959faab4bfcacfc4bbafa59e92857a6e615a50453b2f261b11060000000000000000000000000000000000000000000000000000000000000000000000000000000000040d18222b353d474f585f676d747d838a8f94999c9fa3aaa39f9d9c9b9c9e9fa4a39f9d9995908a837d746d675e564d443b31271d11080000000000000000000000111e2b3844515e6b7784919192989597999b9e9a8d807367616a6e777e848a8f9298989a9a9b9b9a9a989695918d88837d766f6a625b504a423830261c130900000000000000000d1a2733404d5a6673808d99a6abacaeb4afb0b2a99c908376695d5043362a1d100300000000000000000000000000000000000000000b1724313e4a5764717d8a97a4abacac9f938679675c5145382c1f13060000000000000000000000000000000006121f2b3844505b6675818e9babb5c0cccbbfb4aaa39fa3aaa7988b7e7165544a3f34281c10030000000613202d394653606c7885919eabb8c4c6baaea2989298a2abaa998d807366564c4135291d110500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111e2b3844515e6b7784919eaab7c4d1ccbfb3a6998c807366594d4033261a0d00000000000000000000000000000000000000010202030001050707090a0b0b0a08040000000000000000000000050d141a1e2021201f1c181c1c1d181d202121201f1c18120b030000000000000000000000000000000000000000000000040c13181d202021201e191c1b1b1b181c1f2021201e1a140d0500000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9c0b3a6998d8086929998928a817b76716f6d66676d6f71767c828d929ca4adb8c0bbb0a69f948d80746a60544a3f32281e13080000000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cabdb0a4978a7d7164574a3e3124170b0000000613202d394653606c7986929fa3a3a2a1a1a5a7adb5bec9d4cbc1b7afa9a7a1a1a1a2a2a3a3a3a4998c7f7366594c403326190d000000000714202d3a4753606d7985929facb8c2ccd6dee2e2ded6ccc4b8ac9f9285796d6053473a2d20140700000000000000040f1b27323d46535e69727f8c95a0acb9ac9f93877b6e61584e43372b1d140a0000000000000000000000030f1b27333f495363707d8a98a2aebac6d4cec2b5a89b8f8275655b5044372b1f1205000000000000000000000000000000000000000000000b17222d3a4653606d7985929fabb8c5d2d3c7bbb0a6988b7f7265564c4135291d110400000000000000000000000000000000000000000000000000000000000000000000000000000000030d18232e39424e58606d78839098a2aebac2cecdc1b9ada1978f82756c62574d41382d22170b020000000000000000000000000000000000000000000000000000000000000000000000000000000000071019232b353d464e555d606b70787d83888c909299989a9b9c9c9c9b9a99989992908c89837d77706b605d554c443b32291f150b0000000000000000000000000f1c2835424f5b68758185858587888a8c8e91938d817467575f656c71787e8285898b8d8e8e8e8e8d8c898784807c76716c625f5851443f3830261e150a0100000000000000000e1a2734414d5a6774808d9a9e9e9fa3aaa2a3a5a69d9083776a5d5044372a1d110400000000000000000000000000000000000000000b1825313e4b5864717e8b979e9e9fa4a49a867a6d6053473a2d201407000000000000000000000000000000000613202d394653606c7985929eabb8c5d2c7baaea3989298a3a89b8f8275665c5044382c1f12060000000916222f3c4955626f7c8897a1adb9c6c5b8ac9f92859299a3aa9d908377685d5246392d20130700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111e2a3744515d6a7784909daab7c3d0ccbfb3a6998c807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f171f252a2d2e2d2c282329292a24292c2d2e2d2c28231d150c03000000000000000000000000000000000000000000040d161d24292c2d2e2d2a252828282823282c2d2e2d2a251f170f08000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9bdb1a4978a7e7d8792999f938e87827e7b7978787a7b7d82888f949da4adb6beb6afa69f948f82786d60584e42382d20160c020000000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cabdb0a4978a7d7164574a3e3124170b0000000713202d3a4653606d7986939fa39f9f9e9d9ea1a8b2bdc9d5c9beb3a9a19e9d9e9e9e9f9fa3a0a09a8d8074675a4d4134271a0e0100000006131f2c3845515d6775828f9ba6b0bac4ccd3d6d6d3ccc4bab0a69b8f8275675c5145382c1f130600000000000000000a16212a36424d57606d7883919da5afafa4998e81746a5f53473d2f261b11060000000000000000000005121f2b3744505b6574818e9aaab4bfcad6ccc0b3a6998d80736653493f33271b0f030000000000000000000000000000000000000000000006131f2c3845515c6676838f9ca9b6c2cfd8ccc2b6a99c8f8376685d5245392c201307000000000000000000000000000000000000000000000000000000000000000000000000000000000007121c27303c44505c666e7b86929fa6b0bcc5d0cabeb3a99e948b7e71695e53493f33271d140a000000000000000000000000000000000000000000000000000000000000000000000000000000000000071119232b343c434c515960656c70767b7f8386898b8d8e8f8f8f8e8d8c8b8a8683807c78706c636159514b433a322920170d030000000000000000000000000e1b2734404d59656f757978797a7c7d7f818486887f736659535b60666d7175797c7e8081818281807f7d7a77736f6a64615a534e463f342e261e150c030000000000000000000e1b2734414e5a6774818d9191919298949597989a9b9084776a5d5144372a1e110400000000000000000000000000000000000000000c1825323f4b5865727e8b91919293999699877a6d6154473a2e211407000000000000000000000000000000000916232f3c4956626f7c8997a1adb9c6d2c5b8ac9f9285929fa99f9285796d6053463a2d201308000005111e2a36424d566673808c99a9b3bec8bdb2a8998c8087929fac9f93867a6d6154473a2e21140900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111d2a3744505d6a7783909daab6c3d0ccbfb3a6998c807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008111a212930363a3b3a38342e3636372f35393a3b3a38342e271e150b0000000000000000000000000000000000000000010c161f282f35393a3a393630353534352e34383a3b3a363029211a11080000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9bdb1a4978a7e717e8792999e99928f8b8886858586888a8f949c9fa6aeb6b8b1aca49f948f82796d665c50463d2f261c0e04000000000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cabdb0a4978a7d7164574a3e3124170b0000000815222e3b4855616e7b889a9499929291919196a1acb9c5d2c6b9ada19792909191929292999394948f8275685c4f4235291c0f0200000004101d2935404b5563707d89949ea8b2bac1c6cacac6c1bab2a89e94897d7063554b4034291c10040000000000000000040e1a25313b44515c66707d89939da7b1ab9f93877c6f62594f41382d22170b030000000000000000000613202d394653606c7885929eabb8c5d0d8ccc0b6ac978a7e7164574b3e2d22170b000000000000000000000000000000000000000000000004101c2834404b546774818d9aa7b4c0cddad2c5b9ac9f92867a6d6054473a2d2114070000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e28343f4a545f69727f8b949faab3becacfc5bbb0a69f92857b6e655b50443c2f261c1106000000000000000000000000000000000000000000000000000000000000000000000000000000000000081119222a313a41454f535b6064696e73767a7c7e80818283838281807f7d7a7673706c65615a554f454039312920170e05000000000000000000000000000c1825313d48535d65686c6b686d6f717275777a7b776c60534950545c6064676d6f7173747575747372706e6967626058555047433c3428231c140c03000000000000000000000b1724313e4a5764717e85858485868687888a8b8d8f9084776b5e5144382b1e110500000000000000000000000000000000000000000815222f3b4855626e7c838584858687898b87796d6054473a2d21140700000000000000000000000000000005111d2935414c5666737f8c99a9b3bec9c8bcb1a79a8d808d97a1a298897c6f6356493c3025190d01000714202d3a46525e697783909daab6c3c5b8aca096887b83909daaa4998a7d7164574a3e31261a0e02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101d2a3743505d6a7683909da9b6c3d0ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000005101a242c333b4246484644404343424344414547484645403930271d12070000000000000000000000000000000000000007131d28313a4045474746414242414142424045464846423b332c231a100500000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9bdb1a4978a7e71717e8792979e9f9c9899939291939a979c9fa6abb0b7b1aca7a09a938d82796d675d544a3f342b1d140a00000000000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cabdb0a4978a7d7164574a3e3124170b0000000815212e3b4854616e7b888787868685858484919eabb7c4d1c5b8ab9e928584848485858686868787888175685b4e4235281b0f02000000000c18242f394854606b76828f96a1a8afb8babebebab8afa8a0968f82756b605443392f23180c0000000000000000000009141f2834404a54606b74818e95a0aaafa4998f82756b6053493f33271f14090000000000000000000815222f3b4855626e7b8897a1adb9c6d2d4c8bbafa49a887c6f6255493c2f2216060000000000000000000000000000000000000000000000000c18232e3f4b5865727e8b98a5b1bed0dbd4c7bbafa3998a7d7063574a3d30241708000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c17232e38424d57606c77828f98a2aebac1cdcdc1baaea2988f82776c60574d42382d22170c03000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f181f282f353d41495053575f6166676d6f71737575767675747372706d686663605b535048443e352f271f170e0500000000000000000000000000000814202c37414b53595b5f565e6162646668676d6f6c655b5044444a5053555c6063656767686867676563615e5655544e49443e37312a2217110a0200000000000000000000000a1723303c4955616c7178787778797a7b7c7d7f8082837f7165584b3e3225180b0000000000000000000000000000000000000000000814212e3a47535f6a6e77787778797a7c7e7d6f675d5145392c2013060000000000000000000000000000000713202d3946525e687683909da9b6c3cfc5b8aca095877b84919eaa998c807366564c41362a1e1105000814212e3b4754616e7b87939facb9c6c4b7aa9d918477808d9aabab9a8e817467574d42362a1e1205000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9b6c2cfccbfb3a6998c807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222c363e454d525453514a504f4f50514b51545453514b42392e23180c000000000000000000000000000000000000010d18242f3a434b515354524c4f4f4e4e4e4f4b515354524d453e352c21160b00000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9bdb1a4978a7e716c717d858f949da0a7a49f9f9e9fa4aca9abb0b2adaba8a09d95908880786d675d554c42382e22190b0200000000000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cabdb0a4978a7d7164574a3e3124170b0000000714202d3a46525e69767a7b7a79797878777e8b97a4b1becac0b4a79a8d81777778787979797a7a7b7b786d6053463a2d201307000000000007121d2c38444f59616d7a8491969ea5abadb3b3adaba59e9691847a6d61594f4431271d120700000000000000000000030c18232e39424f59606d79839198a2aeab9e93897c6f655b50443b30251a0f0500000000000000000b1825313e4b5864717e8b97a9b3bec9d5d2c6b9ac9f93867a6d6053473a2d201407000000000000000000000000000000000000000000000000071623303d495663707c8996a9b3becad6d7cbc0b5ab998c807366594d402f24190d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c26303c44505b656e7b85929fa6b0bbc5cfcabeb3aa9f948b7f72695f544a3f33281e150b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d161e24292f383f44464d5355555d60636567686969696867676a6b6b6a64615a5049413e383329241d150d05000000000000000000000000000000040f1a252f3941484d4f524c5254555759555d6062605b53493f383f44464b515356585a5b5b5b5b5a595654524d4947433c39332b2620181006000000000000000000000000000814212d3945505a61646b6b6b6b676d6e6f7072737576716d62564a3d3124170b00000000000000000000000000000000000000000006121e2b37424e575f626a6b6b666c6e6f716f6b60554c4135291d11040000000000000000000000000000000714212e3a4754616d7a86939facb9c6d0c3b7aa9d908377818e9ba89d908377685e5246392d20130604101c2934404b5565717e8b9aa4afbbc8beb3a99a8d80737d8a99a4aa9e918477695f53463a2d211406000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cfccbfb3a6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c28333e4850575e61605c545d5c5c5d5e555d6061605c544b4034281c1004000000000000000000000000000000000004111d2935404b555d60615e565c5b5b5b5b5c555c60615e574f473e33281c1004000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9bdb1a4978a7e71646b6f7b828a90959b9ea2a9a6a7a8a8a7a7a5a8a19e9a95918b837d736d665d554c433a30261c10070000000000000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cabdb0a4978a7d7164574a3e3124170b00000005121e2a36424d575e686d6e6d6d676c6b717e8a97a4b1bdcac0b4a79a8d81746b6b6b6c666d6d6d6e6e6d665c5044382c1f1206000000000001101c27333d46525e686e7c848f939b9fa2a9a9a29f9b938f847c6e685e52473d321f150b01000000000000000000000007121c27303d45515d676f7c86929fa5afa69c9083786c60574d42362a21170c03000000000000010e1b2734414e5a6774818d9aa7b4c0cfdad1c4b7ab9e918478675d5145392c2013060000000000000000000000000000000000000000000000000814212e3b4754616e7a8797a2adbac6d3dcd1c2b5a99c8f827669554c4135291d1104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141e27333f49535e69717e8b949ea9b3becad0c5bcb0a69f92867b6e665b50443c30271c120700000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c13191d262d33373c4246484b515356585a5b545c60696e7477787876716c615549382f2c282118120b03000000000000000000000000000000000009131e272f373d404246414647494a4c4c51545553504941382e34383a404546494b4d4e4e4f4e4d4c4a4746423c3b37322d28221b150e06000000000000000000000000000005111c28333e485055575f5e5e555d606162646567686a65625a50453a2e211509000000000000000000000000000000000000000000020e1a26313c454e53555e5e545b606163656360594f433a2f24190d010000000000000000000000000000030f1b27333f495364717e8a99a4afbbc7cabfb4aa9a8d80737e8b97a89f93877a6d6154473a2d22170b06131f2c3845515c6775828f9bacb6c0c6baada297897c707a86939faca096887b6e6155483b2d22170b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000814202d3944505a61696e6d666a6969696a6a6b676d6e6d665c5145382c1f130600000000000000000000000000000000000613202c3945515d676d6d686a69686867686869676d6e6961594f44382c201407000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9bdb1a4978a7e716460696e757d83898e929797999a9b9b9b9a999796918d89847e78706b605c544b433a31281e140a000000000000000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cabdb0a4978a7d7164574a3e3124170b000000020e1a25303b454d565e616161605c5564707d8a97a3b0bdcac0b4a79a8d8174675e5f5f5c6060616161605c544a3f34281c10030000000000000b16212a36414c565f6a6e7a82898e9297969697928e89817a6e6a5f564c41352b210d03000000000000000000000000000b151e2935404b555f6a717e8b939da7ab9f948b7e71695e52463e33291e150b00000000000004101d2935404b556a7683909da9b6c3d0dccfc3b6a99c90837669554b4035291d10040000000000000000000000000000000000000000000000000714202d3946525e687885929fabb8c5d2ded1c5b8ab9e928578675d5145392c20130600000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c17222d38414d57626c75828f97a1adb9c1cdcec2baaea2989083786c60584e42392e23180c030000000000000000000000000000000000000000000000000000000000000000000000000000000000000001080b141b22272b31373a3b404547494950575f666d737b80848585837e7164574b3e31241c160c0701000000000000000000000000000000000000020c151e252c3134353036393a3c3e3f4145474846443f382f26282b2e34383a3c3e4041424241403f3d3b3a36302e2b27201c170f0a04000000000000000000000000000000000c17222c363e45494a5252514b5153545557585a5c5d585650483f34291d1105000000000000000000000000000000000000000000000915202a333c42474851524a505354565856544f473d31281e130800000000000000000000000000000005121f2b3744505b6574818e9babb5c0ccc6baaea298897d707b8796a0a49a8a7e716453493f33271b0f0714202d3a4753606d7985929facb8c5c5b8ab9f9285796d7783909daaa8988b7e7265544a3f33281c0f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303c4955616c707b797877767675767778797a7b796d6053463a2d20130700000000000000000000000000000000000714202d3a4753606d797a78777575747475757678797b706b6155483c2f231609000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9bdb1a4978a7e7164575e616c70777d8185888a8c8d8e8e8e8d8c8a8884817d78726d666059504a423931281f160c02000000000000000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cabdb0a4978a7d7164574a3e3124170b0000000009141f29333b444c5254545453515663707d8996a3b0bcd1c0b4a79a8d8174675a524a50535354545553504a42382e23170c00000000000000050d1925303a444e585f686d757c81858789898785817c756d685f584e443a3023190f0000000000000000000000000000030c18242f39434e58626c74818e95a0a9a69f92857b6e615a50453b30271d1207000000000006131f2c3945515d677885929eabb8c5d1dbcfc2b5a89c8f8275695c4f422f24180d0100000000000000000000000000000000000000000000000005111e2a36414c566a7683909da9b6c3d0dcd2c6b9ada197877a6d6054473a2d211407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111b262f3b45505a616e7a85929ea5afbbc4cfcabfb4aa9f948c7f726a5f544a4034281e150b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171b1f262b2d2f353e444d535b606a6e7880878d9092928e8174675b4e4134281b0b05000000000000000000000000000000000000000000030c131a20252728252a2d2e2f312f35393a3c3937332d261d1c1f23282c2d303234343535343432302e2d2a25221f1b15100b0500000000000000000000000000000000000005101a242c33393c3e45454440454748494a4c4d4f504b4a453f362d22180c0100000000000000000000000000000000000000000000030e18212a31373a3b44453f444647494b4948443d352b1f160c010000000000000000000000000000000613202d394653606c7885929eabb8c5d2c5b8ac9f9285796d7784919dac9b8e8175655b5044372b1f120a1724303d4a5763707d8a98a2aebac6c0b5ab9b8e81756674808d9aaca89b8e8275665b5044382b1f120600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfccbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000001010100000000000000000000000000000000000a1724313d4a5764707e878684838382828384858687878074675a4e4134271b0e0100000000000000000000000000000003101d293643505c697682878583828281818182838486877d7063574a3d3024170a000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9bdb1a4978a7e716457525a61646b7075797c7e8081818281807f7d7b7874706c65605c544f443f3830281f160d0400000000000000000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cabdb1a4978a7e7164574b3e3124180b00000000030d172129323a4146474847464956626f7c8995abb5c0cbc0b4a79a8d8174675a4e3f44464747484846443f3830261c1106000000000000000008131e29323c464e565e616b6f75797b7c7c7b79756f6b615e564e463c32291e110700000000000000000000000000000007121d27313c46505a606d79839097a1aaa2988f82766c62574d42392e23181007000000000714202d3a4753606d7a8697a1adb9c6d2dbcec1b5a89b8e8275685b4f4235281c0700000000000000000000000000000000000000000000000000020e192530424f5c6975828f9ca8b5c2cfdbd6cabeb3a995887b6f6255483c2f2215090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d29333e46525e68717e8a939ea9b2bec9d0c6bcb0a69f92867c6f665c51443c30271d120700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d151d2329323a414550565e656c727c838c92999d969083796d6053473a2d201407000000000000000000000000000000000000000000000002090f14181b1c191d2021222424292c2d2f2d2b27221b141012181c1f202325272828282827262321201e1915130f0a0400000000000000000000000000000000000000000008121a22282d303138382f35393a3b3c3d3f4042433e3d3a342d241b1106000000000000000000000000000000000000000000000000060f1820262b2e2f372d3338393b3c3e3c3b38322b23190d04000000000000000000000000000000000916222f3c4955626f7c8897a1adb9c6cfc2b5a89c8f82756774818d9aab9e9285786c605346392d2013121f2b37434e586774818d9aaab4bfc7bbafa3998a7e7164707d8a9aa4ab9f9285796c605346392d20130700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfccbfb3a6998c807366594d4033261a0d08080808080909090a0a0a0a0b0b0b0b0c0c0c0d0d0d0d0e0e0c0b0905010000000000000000000000000c1925323f4c5865727f8b939190908f8f90919292998f8275685c4f4235291c0f0200000000000000000000000000000004111e2a3744515d6a77849092908f8e8e8e8e8f8f91938a7e7164574b3e3124180b000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9bdb1a4978a7e7164574b5055596063666d6f7173747575747472706e696763605b53504a423d342e261e160d040000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9b6c2cabdb1a4978a7e7164574b3e3124180b0000000000050f1720283035393a3b3a3b4854616e7b8799a3afbbc7c0b4a79a8d8174675a4e41383a3a3a3b3b3a38342e261e150a000000000000000000020d17202a343c444c52596063666d6e6f6f6e6d66636059524c443c332a20170c00000000000000000000000000000000010b151f2a343e45515d676e7b859198a2aa9e948b7e71695e544b40342822180c030000000815222f3b4855626e7b8895a9b3bec9d5dacec1b4a79b8e8174685b4e4135281b0e0200000000000000000000000000000000000000000000000000081c2835424f5b6875828e9ba8b5c1cedbdacfbdb0a3978a7d7064574a3d3124170a000000000000000000000000000000000000000000000000000000000403030202010000000000000000000000020b17212a36414c56616c75818e97a1adb9c0cccec2baaea3989083786d60584e43392e23180d0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171f272f343d444c525a61696e777f8690959fa19791847a6d675d5145392c2013060000000000000000000000000000000000000000000000000004080c0e080d1113141617191d202122201f1b17110a03070c10131316181a1b1b1c1b1a19171414110e0906030000000000000000000000000000000000000000000000000810171c2123242c2b24292c2d2e2f313234353732312e29221b12090000000000000000000000000000000000000000000000000000060e151a1e21222b22282b2d2e3032302f2c27211911070000000000000000000000000000000005111d2935414c5666737f8c99a9b3bec9c9bdb2a8988b7f7265707d8a99a4a197887c6f6255493c2f241915212e3a47535f6a7884919eabb7c4c5b9ac9f92867a6d616d7a86939faca297897c6f6256493c2f24180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfccbfb3a6998c807366594d4033261a1515151515151516161617171717181818181919191a1a1a1a1b181715110c0600000000000000000000000b1825323e4b5865717e8b989e9d9c9c9c9d9d9e9f9b8e8175685b4e4235281b0f0200000000000000000000000000000004101d2a3743505d6a7683909d9d9c9b9b9a9b9b9c9e978a7d7164574a3e3124170b000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9bdb1a4978a7e7164574b44494f54545c6062646667686868676664615f5756535049443f383028231c140c04000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683909ca9b6c3cabeb1a4978b7e7164584b3e3125180b000000000000050e161e25292d2e2e2e3a4653606d7986929facb9c5c0b4a79a8d8174675a4e41342d2d2e2e2e2d2c28231c150c0300000000000000000000050e18222a323a41464f54545c6061636361605c54544f46413a322a21180e050000000000000000000000000000000000030d18222935404b555e696f7c869299a3a69f92857b6e665c51453f342a1e150a0000000a1623303d495663707d8996a3afbccfdadacdc0b3a79a8d8074675a4d4134271a0e01000000000000000000000000000000000000000000000000010e1b2834414e5b6774818e9aa7b4c1cddad8cbbeb1a5988b7e7265584b3f3225180c000000000000000000000000000000000000000000000000030709091010100f0e0e0d0c0c0b0a0a0a0a0a0a0909090f1925303b44505a616d7a84919ea5afbac4d0cbbfb4aaa0958c80736a60554b4034281f160c010000000000000000000000000000000000000000000000000000000000000000000000000000000000060b141c2228313940454f565d606c717b828b92989fa29892857b6e685e554b4035291d11040000000000000000000000000000000000000000000000000000000001000105070709080d1113141513120f0b0600000000040607090b0d0e0f0f0e0d0c0a0807050200000000000000000000000000000000000000000000000000000000050c111417171f1f181d1f202122242527292a2524211d1811090000000000000000000000000000000000000000000000000000000003090e1214151e171c1f202123252322201b160f0700000000000000000000000000000000000713202d3946525d687683909da9b6c3cfc5b9aca196887b6e626d7a86939fa9998c7f7366564c4135291d15222f3c4855626f7b8896a1acb9c5c2b6a99c8f8276685d687784909daaa9998c7f7266554b4035291d1004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfccbfb3a6998c807366594d4033262222222222222222222323232424242425252525262626272727272524221d181109000000000000000000000b1824313e4b5764717e8a97a4aaa9a9a8a9aaaba79b8e8174685b4e4135281b0e0200000000000000000000000000000003101d293643505c6976838f9ca9a8a8a7a7a8a8a9a3968a7d7063574a3d3024170a000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9beb1a4978b7e7164584b3e3d44484a50535557595a5b5b5b5a595755534d4a46443f38342e261e17110a0200000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683909ca9b6c3cbbeb1a4988b7e7165584b3e3225180b00000000000000040c13191d2021212b3844505c667784919eaab7c4c0b4a79a8d8174675a4e41342720212122201f1c17110a03000000000000000000000000060f18202830363d43484a50535456565453504a48433d35302820180f0600000000000000000000000000000000000000061018242f39434d575f6a707d87929fa3a2979083786d605a50463c30261c110600000a1724303d4a5763707d8a96a3b0bdc9d6d9ccc0b3a6998d8073665a4d4033271a0d00000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cddad8cbbfb2a5988c7f7265594c3f3226190c00000000000000000000000000000000000000000000040a0f1315161d1d1c1c1b1a1a19181817171717161616161616161e29323e46525d68707d8a939da8b2bec7d1c6bcb1a79f92877c6f675c51453d31281d120700000000000000000000000000000000000000000000000000000000000000000000000000000002080f171d262d333c434b515960686d757e858f949fa2a39992867c6f695f564c433a2f24180d010000000000000000000000000000000000000000000000000000000000000000000000000104060709060503000000000000000000000001010202010100000000000000000000000000000000000000000000000000000000000000000000000005080a0b12070c101314151617191a1c1d181715110c060000000000000000000000000000000000000000000000000000000000000002060808060b0f12131416181615130f0b040000000000000000000000000000000000000714212e3a4754616d7a86929facb9c5d1c4b7ab9e918478695f687783909da99c908376685d5245392c201e2a36414c5666737f8c99a8b2bdc8bcb1a7988b7f7265566774808d9aaca99c8f8376675d5145392c1f1306000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfccbfb3a6998c807366594d40332e2e2e2e2e2e2e2f2f2f30303030313131313232323233333334343432312e29231b12090000000000000000000a1724313d4a5764707d8a97a3b0b6b5b5b6b7b4a79a8d8174675a4e4134271b0e01000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5b5b4b4b4b5afa396897c706356493d3023160a000000000000000000000000000000000000000a1723303d4a5663707d8996a3b0bcc9beb1a4978b7e7164584b3e3338383f4446494b4d4e4e4f4e4d4c4a4846423d3937332d28231c150c06000000000000000000000000000000000000000000000000000000000000000004101d2a3743505d6a7683909da9b6c3cbbeb1a4988b7e7165584b3e3225180b000000000000000002080d1113141c28343f4a546875828e9ba8b5c1c0b4a79a8d8174675a4e4134271b1415151312100c06000000000000000000000000000000060e161e252a3238383f44464849494846443f38383229251e160e0600000000000000000000000000000000000000000007121d27313b454e58606b717e8b919ca49f958d81746c62584e42382e23170c00000b1724313e4a5764717d8a97a4b0bdcad7d8ccbfb2a5998c7f7266594c3f3326190c00000000000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3bfccd9d9ccbfb2a6998c7f7366594c403326190d000000000000000000000000000000000000000000070f161b1f22232a2a2928282726262525242423232323232323232222222935414c56616b74818e96a1acb6c0cccfc3bbafa3999183796d60594f43392f24180d0400000000000000000000000000000000000000000000000000000000000000000000000000050c131921292f383f444e555c606b707a818a92979fa6a39f92877d706a60574d443a31281d130700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000004060708090a0c0d0f100b0b090501000000000000000000000000000000000000000000000000000000000000000000000000000003060608090b0909070300000000000000000000000000000000000000030f1b27333f495364717e8a99a3afbbc7cbc0b5ab9a8e817467576673808d99aa9f92867a6d6054473a2d21202d3946525e687683909da9b6c3c5b8aca095887b6e615764717d8a9aa4ac9f92867a6d6053473a2d201408000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfccbfb3a6998c807366594d403b3b3b3b3b3b3b3b3b3c3c3c3d3d3d3d3e3e3e3e3f3f3f4040404041413f3d3a342d241b0d0300000000000000000a1724303d4a5763707d8a96a3b0bdc2c2c3c0b3a69a8d8073675a4d4034271a0d01000000000000000000000000000000020f1c2835424f5b6875828e9ba8b5c1c1c1c1bcafa296897c6f6356493c30231609000000000000000000000000000000000000000a1723303d4a5663707d8996a3b0bcc9beb1a4988b7e7165584b3e322c2e34383a3c3e4041424241413f3d3b3a36312d2b27221b17110a0300000000000000000000000000000000000000000000000000000000000000000004111d2a3744505d6a7783909daab6c3cbbeb1a5988b7e7265584b3f3225180c000000000000000000000105070b17232e3f4c5966727f8c99a9b3bec0b4a79a8d8174675a4e4134271b0e08080c110f0e0c09040000000000000000000000000000050c131921272c2e34383a3b3c3c3b3a38342e2c272119130c0400000000000000000000000000000000000000000000010b151f29333c464f59626c737f8c929ca49d928b7e716a5f544a3f34281c1003000b1825313e4b5864717e8b97a4b1becad7d8ccbfb2a5998c7f7266594c3f3326190c00000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5b2bfccd8d9ccc0b3a6998d8073665a4d4033271a0d000000000000000000000000000000000000000007101921272c2f303736363535343333323131303030303030302f2f2f2f2f2f303a444f59606d7984919aa4afbbc3cfcbc0b5aba0958d80736b60554b4035291f160c010000000000000000000000000000000000000000000000000000000000000000000000050e171e252a333b424a50585f676d737d848e939fa2a9a49c918b7e716b61584e453c32291f160c010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3744505b6574818e9babb5c0cbc7bbafa3998a7d70645763707d8998a3a3998a7d7164574a3e3126212e3b4754616e7a87939facb9c6c4b7aa9d918477695f54616d7a86939faca398897d7063564a3d3025190d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfccbfb3a6998c807366594d48484848484848484848484949494a4a4a4a4b4b4b4b4c4c4c4d4d4d4d4e4b4a453f362d1f150b01000000000000000a1623303d495663707c8996a3afbcc9cfccc0b3a6998d8073665a4d4033271a0d00000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cecdc8bbafa295887c6f6255493c2f221609000000000000000000000000000000000000000a1724303d4a5763707d8a96a3b0bdc9beb1a5988b7e7265584b3f322523282b2d2f3133343535353433312e2d2a26201f1b17110c06000000000000000000000000000000000000000000000000000000000000000000000004111d2a3744505d6a7783909daab6c3cbbeb2a5988b7f7265584c3f3225190c00000000000000000000000000061623303d495663707c8997a2adbac1b4a79a8e8174675b4e4134281b101314191e1c1b18150f09020000000000000000000000000002080d161b1c23282c2d2e30302e2d2b28231c1b160d0802000000000000000000000000000000000000000000000000030d17212a343d47505a636d73808d929ca49f92867c6f665c5044382c1f1206000b1825323e4b5865717e8b98a4b1becbd7d9ccbfb2a6998c7f7366594c403326190d00000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1becbd8d9cdc0b3a69a8d8073675a4d4034271a0d00000000000000000000000000000000000000040f19222b32383b3c434343424141403f3f3e3d3d3d3d3d3d3c3c3c3c3c3c3c3c3c3c3e45515d67707d88939fa8b2bdc7d1c7bdb1a79f93877d6f675d51453d31281e130800000000000000000000000000000000000000000000000000000000000000000000050e17202930363f454d545b606a6f79808891969ea5ada59d928c7f736c62594f463d332a20170d0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080807050200000000000000000000000000000000000000000000000000000307090909080603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c7885919eabb8c4d1c5b9ac9f92867a6d6054606d7986929fab9a8d817467574d42362a2935404b5565717e8b9aa4afbbc8beb3a9998d80736657525e687784919daaaa9a8d807367564c41362a1e11050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfccbfb3a6998c807366595555555555555555555555555556565657575757585858585959595a5a5a5a585651483f31271d1207000000000000000916232f3c4956626f7c8995a2afbcc8d5ccbfb2a6998c7f7366594c403326190d00000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0cdd4c8bbaea195887b6e6255483b2f221508000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdcabeb2a5988b7f7265584c3f3225171c1f202224262728282827262422211e1a13120f0b060000000000000000000000000000000000000000000000000000000000000000000000000004111e2a3744515d6a7784909daab7c3cbbeb2a5988b7f7265584c3f3225190c000000000000000000000000000713202d3a4653606d7985929fabb8c2b5a89c8f8275695c4f423024191d2020252a282725201b140c030000000000000000000000000000040a0f11171c1f2021232321201f1c17110f0a04000000000000000000000000000000000000000000000000000000050f18222c353e48515b636e73808d929ca3989184796d6053463a2d201307000b1824313e4b5764717e8a97a4b1bdcad7d9ccc0b3a6998d8073665a4d4033271a0d00000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbd7d9ccbfb3a6998c807366594d4033261a0d000000000000000000000000000000000000000a16212b343d43484950504f4f4e4d4d4c4b4b4a4a4a4a49494949494949494848484848484b55606b74808d96a0abb5c0cbcfc3bbafa4999184796d60594f433a2f24190d010000000000000000000000000000000000000000000000000000000000000000020c172029323a414650575f666c727c838d939aa1a8afa79e938d80746d635a50473e342b21180e0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003080e1114141414110e090200000000000000000000000000000000000000000000040a0f1315161615130f0a0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c8897a1adb9c6cfc3b6a99c908376685d525c6776838f9ca99e918477695f53463a2d2c3845515d6775828f9bacb6c0c6b9ada197897c6f63564c566774818d9aa7aa9d908377685e5246392d2013070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfccbfb3a6998c807366616161616161616161616162626263636363646464646565656566666667676765625b5143392f24180c000000000000000916222f3c4955626f7c8895a2afbbc8d5ccbfb2a5998c7f7266594c3f3326190c00000000000000000000000000000000010d1a2734404d5a6773808d9aa6b3c0cdd4c7bbaea194887b6e6155483b2e221508000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdcabeb2a5988b7f7265584c3f32251910121316181a1b1b1c1b1a19171514120e09050300000000000000000000000000000000000000000000000000000000000000000000000000000004111e2b3744515e6a7784919daab7c4cbbfb2a5988c7f7265594c3f3226190c0000000000000000000000000006121f2c3844505c6674818e9ba8b2bdb6aa9d9083776a564c41352924292c2d32373534312c251e150c0200000000000000000000000000000000060c101213151616151312100b060000000000000000000000000000000000000000000000000000000000000006101a232d364049525c636e73808c929e9490857a6d6053473a2d201407000a1724313d4a5764707d8a97a3b0bdcad6dacdc0b3a79a8d8074675a4d4134271a0e01000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2becbd8d8cbbfb2a5988c7f7265594c3f3226190c000000000000000000000000000000000000030f1b27323d474f54565d5d5c5b5b5a59595858575756565656565656565555555555555555555559606d79849199a3afbbc4cfccc0b5aba0968d80746b60564c4135291d1207000000000000000000000000000000000000000000000000000000000000000008131e29323a444c525a62696e787f8690959fa4acb1a89f958f81786d605b51483f352c22190f060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b1014191e202121201e19140d050000000000000000000000000000000000000000060b161b1f222323221f1b150d0801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111d2935414c5666737f8c99a9b3bec9cabeb3a9998c7f7366564c5566727f8c99a9a096887b6e6155483b2e2d3a4753606d7985929facb8c5c5b8ab9e9285796c60534a5764717e8a97a8ac9f93877a6d6154473a2e21140a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfccbfb3a6998c80736e6e6e6e6e6e6e6e6e6e6e6e6e6f6f6f7070707071717171727272737373737474726d62554b4035291d10040000000000000815222f3b4855626e7b8895a1aebbc8d4cbbeb2a5988b7f7265584c3f3225190c00000000000000000000000000000000000d1a2633404d596673808c99a6b3bfccd4c7baada194877a6e6154473b2e211408000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0bdcabfb2a5988c7f7265594c3f3226190c0607090b0d0e0f0f0e0e0c0a0807050200000000000000000000000000000000000000000000000000000000000000000000000000000000000004111e2b3744515e6a7784919daab7c4ccbfb2a5998c7f7266594c3f3326190c0000000000000000000000000003101c28343f4a5463707d8996a0acb8b8ab9e928578685d5246392d2f35393a3f4442413d3730271e1409000000000000000000000000000000000000030607080909080706030000000000000000000000000000000000000000000000000000000000000000000008111b242e37404a525c636e73808c918c827b6e675d5145392c201306000a1723303d4a5663707d8996a3b0bcd0dbdacdc1b4a79a8e8174675b4e4134281b0e01000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5b2bfccd8d8cbbeb1a5988b7e7265584b3f3225180c00000000000000000000000000000000000007131f2c38434f5960636a69696868676666656464636363636363636262626262626262626262626262676f7c87929fa9b2bdc9d2c7bdb2a89f93887d70685d5245392f23180c00000000000000000000000000000000000000000000000000000000000000010d1925303a444c565e616c717b828c9299a0a7afb2a9a0959082796d665c504940362d231a100700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b11171c1f252a2d2e2e2d2a251f170e050000000000000000000000000000000000020a111721272c2f302f2e2b272019130c04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3946525d687683909ca9b6c3cfc6b9ada297897c6f62564956626f7c8997a2a8988b7e7265544a3f34333f495363707d8a98a2aebac6bfb4ab9b8e8174665b504754616e7a8796a0aca49a8a7e7164574b3e31261b0f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfcdc0b4a79a8d807b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7c7c7c7d7d7d7d7e7e7e7e7f7f7f80808080817f72675d5145392c1f13060000000000000815212e3b4854616e7b8794a1aebac7d4cbbeb1a4988b7e7165584b3e3225180b00000000000000000000000000000000000c1926333f4c5966727f8c99a5b2bfccd3c6baada093877a6d6054473a2d211407000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1bdcabfb2a5998c7f7266594c3f3326190c0000000000010202020100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111e2b3844515e6b7784919eaab7c4ccbfb2a5998c7f7266594c3f3326190c00000000000000000000000000000c17232e394653606c7884919da7b1b9ac9f93867a6d6154473e393a4045474c514f4d48423930251b0f04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121c252e38404a525c636e737f8480786e695e554b4035291d1104000916222f3c4955626f7c8895aab3becad6dacec1b4a79b8e8174685b4e4135281b0700000000000000000000000000000000000000000000000000000d1a2733404d5a6673808d99a6b3c0ccd9d7cabdb0a4978a7e7164574a3e3124170b0000000000000000000000000000000000000915222f3b4854606b6f767676757474737272717070707070706f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f73808d96a1adb9c5d2d0c4bbafa49a91847a6d60554b4034291c100400000000000000000000000000000000000000000000000000000000000005111d2a36414c565e686d757e8690949fa3abb1b3aaa19791837a6d675d544a3f372e241b1108000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171c23282b3036393b3b3a36302920170e05000000000000000000000000000000020c141c232832383b3c3c3b373229241e160d070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a86929facb9c5d1c5b8ab9e9285796c60534653606d7985929fa89b8f8275665c5044383744505b6574818e9aaab4bfc7baaea3998a7d7164544a46525e687784919daaac9a8e817467584e43372b1f120600000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfcec2b5a99d928d888888888888888888888888888888888989898a8a8a8a8b8b8b8b8c8c8c8d8d8d8d867a6d6053473a2d2014070000000000000814212e3b4754616e7a8794a1adbac7d4cabeb1a4978b7e7164584b3e3125180b00000000000000000000000000000000000c1925323f4c5865727f8b98a5b2becbd3c6b9ada093867a6d6053473a2d201407000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1bdcabfb2a6998c7f7366594c403326190d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4ccbfb2a6998c7f7366594c403326190d000000000000000000000000000006121f2b3744505b65727e8b95a0acb8afa49a8a7e71645a504746474b5153585d5b59534b42372c2015090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a131c262e38404a525c636d7377736d665e574d433a2f24180d01000714212d3a4754606d7a8798a2aebac6d3dbcfc2b5a89c8f8275695c4f422f24180d01000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cddad6cabfb4aa95897c6f6256493c2f231609000000000000000000000000000000000000091623303c4956636f7d838382828180807f7e7e7d7d7d7d7c7c7c7c7c7c7c7c7b7b7b7b7b7b7b7b7b7b7b7b7c7c84919eabb8c4d1d8ccc0b6aca1968d8174675c5145382c1f13060000000000000000000000000000000000000000000000000000000000000713202d3946525e686d7a828b92989fa6aeb4b4aba29891857b6e685d554b42382e251c12090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0b141c22282e34383b4146474746423b322920170d0200000000000000000000000000000a141e262e343d4348494947433d352f282018100800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a5464717e8a99a3afbbc7cec1b5a89b8e8175665b5044505c6675828f9ba89f9285796d6053463a394653606c7884919eabb8c4c5b9ac9f92867a6d605447414c566774818e9aa7ab9e9184786a5f53473a2e21150800000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfd1c5b9aea49d9a949494949494949494949494949595959696969697979797989898989999999a9a928579675d5145392c1f13060000000000000714212e3a4754616d7a8794a0adbac7d3cabdb1a4978a7e7164574b3e3124180b00000000000000000000000000000000000c1825323f4b5865727e8b98a5b1becbd3c6b9aca09386796d6053463a2d201307000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1becabfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2c3845525f6b7885929eabb8c5ccbfb3a6998c807366594d4033261a0d0000000000000000000000000000030f1b27333f4953606d7883919da4aeb6ac9d9083766c6159535254555d60656a68655d53483d3125180c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a141c262e38404a525b63666b66605c544d453b31281d130700000713202c3945525d687885929fabb8c5d2ddd0c3b7aa9d9084776a554b4135291d1104000000000000000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cedad3c6baaea298877a6d6154473a2e2114070000000000000000000000000000000000000d192633404c5966737f8c908f8e8e8d8c8c8b8b8a8a8989898989898989888888888888888888888888888888899196a1adb9c5d0d0d2c7beb2a89f9286796d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a848f939fa2aab0bab6aca39992867c6f695e564c433930261c130a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e151b1d262d33383f44464c525454524d443b32291e14080000000000000000000000000006111c2630383f444f545656544e45413a322a221a110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505b6674818e9babb5c0cbc8bcb1a7978b7e7164544a3f4a5465727f8b98a8a297897c6f6256493c3c4955626f7c8897a1adb9c6c2b5a99c8f8276675d51453e4b5764717e8a97a8ada196887c6f6255483c3025190d01000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfd6cbc0b6aea9a7a1a1a1a1a1a1a1a1a1a1a1a1a1a1a2a2a2a3a3a3a3a4a4a4a4a5a5a5a6a6a6a69e9184776b554b4035291d10040000000000000714212d3a4754606d7a8793a0adbac6d3cabdb0a4978a7d7164574a3e3124170b00000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbd4c7bbafa39986796c605346392d201306000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabb8c5cdc0b3a69a8d8073675a4d4034271a0d0100000000000000000000000000000b17222d3844505c66707d89929da7b1ab9f958a7e716b615f5e6163676d7277756f65594d4134271b0e02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a141c262e3840495157595e5953504a423b33291f160c01000004111d2935414c566a7784909daab7c3d0ddd2c5b8ab9f928578675d5145392c201306000000000000000000000000000000000000000000000000020f1c2835424f5b6875828e9ba8b5c1cedbd2c5b8ac9f928579685e5246392d2013070000000000000000000000000000000000000c1925323f4c5865727f8b989c9b9b9a9999989797969696969696969595959595959595959595959595959595959ea1a9b2bdc4c4c4c4c4c4baaea398887b6f6255483c2f2215090000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a969ea5aeb4bcbbafa49a92877d706a5f574d443a31271e140a01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c141a20262b2f383f444a5053565e61615e564d443b3025190d020000000000000000000000000b17232e38424a50596063626058524c443c342c231a120800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c7985929eabb8c5d1c5b8aca095877b6e6154473b4855626e7b8896a1a9998c7f7366554b40424d576673808c99a9b2bec8bdb2a8988b7f7265554b413b4754616e7b8796a0aca8998c7f7266564c4135291d1105000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfd8cdc2b8b0aba9a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a7a7a7a8a8a8a8a9a9a9a9aaaaaaababaa9d9084776a554b4034281c10040000000000000714202d3a4753606d7a8693a0adb9d2ddcabdb0a3978a7d7064574a3d3124170a00000000000000000000000000000000000b1825313e4b5864717e8b97a4b1becad2c5b9ac9f928679655b5044372b1f1205000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbc0b3a6998d8073665a4d4033271a0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3744505b657986929facb9c5cdc0b3a79a8d8074675a4d4134271a0e01000000000000000000000000000006111b28343f4a54606b74808d959fa7b1a79f92867d736e69686d7073797f848175685b4f4235281c0f0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a141c262e3740464b4c514d46443f38302921170d04000000010d192430414e5b6874818e9ba7b4c1d0dbd3c6baada297877a6d6054473a2d21140700000000000000000000000000000000000000000000000004111d2935414c556976838f9ca9b6c2cfdcd0c3b6a99d9083766a564c41362a1d11050000000000000000000000000000000000000b1724313e4a5764717d8a97a4a8a7a7a6a5a5a4a3a3a3a3a3a3a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2abadb2b7b7b7b7b7b7b7b7b7b4aa95897c6f6256493c2f2316090000000000000000000000000000000000000000000000000000000000000915222f3c4855626f7c88939ea6b0bab7aea49f93887e716b60584e453b32281f150c020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b12181f252a32373d424a50545c6064686e6e695e564c41362a1e1308000000000000000000000003101c28343f4a545c606b6f6f6a605d564e463e362c241a1208000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c8997a1adb9c6d0c3b7aa9d908477695e52463a47535f6a7884919ea99c908376675d514546525e697783909daab6c3c5b8aca096887b6e6155483b3a46525e697784919eaaa99c908376685e5246392d201306000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfd3c7bcb0a69f9c99999999999999999999999999999a9a9a9b9b9b9b9c9c9c9c9d9d9d9d9e9e9e9e928578675c5145382c1f13060000000000000713202d3a4653606d798693a0b5c0ccd7c9bdb0a3968a7d7063574a3d3024170a00000000000000000000000000000000000b1824313e4b5764717e8a97a4b1bdcad2c5b9ac9f9286796c5f493f33271b0f03000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1becbc0b3a69a8d8073675a4d4034271a0d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c798698a3aebac7cdc1b4a79a8e8174675b4e4134281b0e010000000000000000000000000000000c17232e38424f59606d79839095a0a7aea2989287807b79787a7c80858b9084786b5e5145382b1e12050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c252e353b3e4044403a38342e261e170f050000000000081825323f4b5865727e8b98aab4bfcad6d6cabeb3a995887b6e6255483b2f2215080000000000000000000000000000000000000000000000000613202c3945515d677884919eabb8c4d1dacdc0b3a79a8d8074675a4d413025190d010000000000000000000000000000000000000a1723303d4a5663707d8996a3afafaeaeadb5afacacacabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa295897c6f6256493c2f2316090000000000000000000000000000000000000000000000000000000000000815212e3a47535f6a75818e949fa6aeafa59d928c7f726c61594f463c332920160d030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001080c151d232831363c43474f545b60666d71767a7b6e685e52463a30251910060000000000000000000006121f2b3844505c666d747c7c746d685f5850483e362c241a1107000000000000000000000000000000000000000000000000000000000000000000000000000000000005111e2a36414c566673808c99a9b3bec9cabfb4aa9a8d807367574d4237424e576874818e9ba79f92867a6d6053474854616e7b8795a0acb8c4c4b7aa9e918477695f53473a36424d576774818e9aa7ac9f92867a6d6154473a2e23170b000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfd0c4b7ab9f94908c8c8c8c8c8c8c8c8c8c8c8c8c8d8d8d8e8e8e8e8f8f8f8f9090909091919192929286796d6053463a2d2013070000000000000613202d394653606c798699a4afbbc7d4c9bcb0a396897d7063564a3d3023170a00000000000000000000000000000000000b1724313e4a5764717d8a97a4b0bdcad2c5b8ac9f9285796c5f52462d22170b00000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2becbc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0b4bfc9cfc1b4a79b8e8174685b4e4135281b0e0200000000000000000000000000000006111c26303d45515c676d7a8390959ea5aaa299928d88858587898d92979083776a5d5044372a1d1104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c232a2f323338332d2c28231c150c050000000000000916222f3c4955626f7c8898a2aebac6d3dbd0bdb0a3978a7d7064574a3d312417090000000000000000000000000000000000000000000000000714212d3a4754606d7a8796a1adb9c5d2d4c8bcb1a7978a7e7164574a3e31241708000000000000000000000000000000000000000b1724313e4a5764717d8a97a3a3a2a2a1a1a0a49f9f9f9f9f9e9e9e9e9e9e9e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d95897c6f6256493c2f23160900000000000000000000000000000000000000000000000000000000000006121f2b37434e58606d79828f949fa2a69e938d80746d625a50473d342a21170e0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c13191e272e343b42464e545960666c71787e8386867a6e61564c41362a22180e050000000000000000030f1b27333f4953606d78818987817a6f6a615a50483e362c23190f05000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3946525e687683909da9b6c3cfc7baaea298897d7063564a3d313e4b5864717e8b97a8a3998a7d7063574a4b5565727e8b98a7b1bcc8bfb4aa9a8d807467574d4237303e4b5864717e8b97a8afa3998a7e7164544a3f34281c10030000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfcfc3b6a99c90828080808080808080808080808080808081818182828282838383838484848585858582786c605346392d20130600000000000005121f2b3744505b657986939facb9c6d2c9bcafa396897c706356493d3023160a00000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdcad2c5b8ab9f9285786c5f5245392c1f1200000000000000000000000000000000000000000c1926333f4c5966727f8c99a5b2bfccc1b4a79a8e8174675b4e4134281b0e010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0adb9bebcbeb5a89b8e8275685b4f4235281c0f02000000000000000000000000000000000a151e2834404b555e686e7a838e939ea1a9a39f9a98929297969a9f9c8f8376695c504336291d090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a12191e2225262b26201f1c17110a03000000000000000713202d3a4653606d7985929facb8c5d1dcccc0b3a6998d8073665a4d4031261a0e0200000000000000000000000000000000000000000000000916232f3c4956626f7c8995a8b2bdc9d5d1c5b8aca095877b6e6154483b2e211508000000000000000000000000000000000000000c1925323f4c5865727f8b9796969595949493999392929292929291919191919191919191919191919191919191919191919191919191919191919191887b6f6255483c2f221509000000000000000000000000000000000000000000000000000000000000030f1b26313c45515d676d7a828b92989a948e81776c605b51483e352b22180f0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d161e2429303940454d53585f626b70787e848a90938d8073685e52463e342a20170e050000000000000005121f2b3744505b6574808d93938d847c706c615a50483e352b21170c030000000000000000000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a87939facb9c6d2c5b8ac9f9286796d6053473a2e3b4754616e7b8795a0ab9a8d807467574d515d6776828f9ca9b5c2c6baaea298897d7063564a3d312e3b4854616e7b8796a1acab9b8e8175665c5044382b1f12060000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfccbfb3a6998c8073737373737373737373737373737374747475757575767676767777777878787879766c655b5044372b1f1205000000000000030f1b27333f495f6c7986929facb9c5d2c9bcafa296897c6f6356493c3023160900000000000000000000000000000000000a1724303d4a5763707d8a96a3b0bdc9d1c5b8ab9e9285786b5f5245382c1f1205000000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfccc1b4a89b8e8175685b4e4235281b0f020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1abadb3afb1b4a89b8f8275685c4f4235291c0f0200000000000000000000000000000000030c18232e39434c565e686e79818a92979ea1a8aaa29f9ea2a9a6a99c8f8376695c504330251a0e02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070d121618191e1a1312100c0600000000000000000006121f2c3844515c6675828f9babb5c0cbd7cfc2b5a99c8f827669574d42372b1e120600000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1becfdad0c3b7aa9d908377695e53463a2d211407000000000000000000000000000000000000000d192633404c5966737f8a8a8a89898888878786868585858585858585848484848484848484848484848484848484848484848484848484848484848481746a5f53473a2e211508000000000000000000000000000000000000000000000000000000000000000a15202935404b555d686d777e858b8d8c82786d655b50493f362c23191006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d14191f282f353d434b51575e616a6f767d838b91969d9f92867a6d615a50463c322920170f060000000000000613202d394653606c788591969f9691867e716c615a50473d33291e150b000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a5464717e8b9aa4afbbc8cfc2b5a99c8f8276675c5145382d3a46525e697784919daa9d918477695e5253606d7a86929facb9c5c5b8ac9f9285796d6053463a2d2d3a46535e697884919eabab9f9285796d6053463a2d2013090000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfccbfb3a6998c80736666666666666666666666666667676768686868696969696a6a6a6a6b6b6b6c6c69605b53493f33271b0f03000000000000000b17222d46525f6c7985929facb8c5d2c8bcafa295897c6f6256493c2f23160900000000000000000000000000000000000a1723303d4a5663707d8996a3b0bcc9d1c4b8ab9e9185786b5e5245382b1f1205000000000000000000000000000000000000000d1a2733404d5a6673808d99a6b3c0ccc1b5a89b8e8275685b4f4235281c0f020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b87949d9ea1a9a3a4a7a89c8f8275695c4f4236291c0f03000000000000000000000000000000000007121d27303a444d565e676d757e858c91969c9fa3aba8abacafa99d9083766a574d42362a1e11050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002060a0c0d110d070603000000000000000000000004101c2834404a5464717e8b99a3afbbc7d4d2c5b8ab9f928578695f53473a2e2114080000000000000000000000000000000000000000000004101d2935404b556773808d9aa6b3c0cdd4c8bdb1a8998c807366574d42362a1e1205000000000000000000000000000000000000000714212e3a4754616d7a7e7d7d7c7c7b7b7a7a797979797878787878787877777777777777777777777777777777777777777777777777777777777777746f65584e43372b1f120600000000000000000000000000000000000000000000000000000000000000040c18242f39434c565d656c727a7e817f796d665c53493f372d241a1107000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001080e171f252a313a41454f555c60696e757c828990959ea0a8a2988e81756c61584e443a322921180f06000000000005121f2b3744505b656e7c849095a09892877e716c61594f453b30271d12070000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505c6675818e9bacb6c0ccc9bdb2a8988b7f7265554b40342a36424d576774808d9aaba095877b6e61545464717d8a98a3aebac7c2b5a89b8f8275665c5145382c2a36424d576874818e9ba7ada297897c6f6356493c31251a0e0200000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfccbfb3a6998c80736659595959595959595959595a5a5a5b5b5b5b5c5c5c5c5d5d5d5d5e5e5e5f5f5f5c53504941382d22170b0000000000000000121f2c3945525f6c7885929fabb8c5d2c8bbafa295887c6f6255493c2f22160900000000000000000000000000000000000a1623303d495663707c8996a3afbcc9d1c4b7ab9e9184786b5e5145382b1e1205000000000000000000000000000000000000000e1a2734414d5a6774808d9aa7b3c0ccc2b5a89c8f8275695c4f4236291c0f030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b88919092979496989a9d9c8f8376695c504336291d10030000000000000000000000000000000000000b151e29323b444d555d606c717a7f848a8f9299999c9e9fa3ab9e918478695e52463a2d20140700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232e3a4754616d7a86929facb9c4ced3c6baada297887b6e6255483b3025190d0000000000000000000000000000000000000000000006131f2c3945515d6776828f9ca9b5c2cfd1c5b8aca095887c6f6255493c31251a0e02000000000000000000000000000000000000000713202d3946525e686d717170706f6f6e6e6d6d676c6c6c6c6b6b6b6b6b6b6b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a68655d53463c31261a0f03000000000000000000000000000000000000000000000000000000000000000007121d27313a444c535b60686d7174726d675c544b41382d251b12080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c1319202930363e434c525960676d737b81878f949da0a7acb2aa9e938a7e706a5f564c443b332a21180f0500000000030f1b27333f49535f6a6e7a839097a19992877e706b60574d42392e23180c030000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7985929fabb8c5d2c5b9ada196887b6e6255483b2f25303d4a5764707d8a99a3a7978b7e7164535b6674818e9baab4bfc8bcb1a7988b7e7165544b40342825313e4b5864717e8b97a8b2a9998d807366574d42362a1e120500000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfccbfb3a6998c807366594d4d4d4d4d4d4d4d4d4d4d4d4d4e4e4e4f4f4f4f50505050515151525252524f46443f382f261b11060000000000000005121f2c3845525f6b7885929eabb8c5d1c8bbaea295887b6f6255483c2f2215090000000000000000000000000000000000091623303c4956636f7c8996a2afbcc9d1c4b7aa9e9184776b5e5144382b1e1105000000000000000000000000000000000000000e1b2734414e5a6774818d9aa7b4bdbfc1b6a99c8f8376695c504336291d10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d79828484858688898b8d9092908376695d5043362a1d1003000000000000000000000000000000000000030c172029323b434b515a61686d72787d8286898c8f919299949596877a6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000000000000000000000000000001050707121211100f10110f060603000000000000000000000000000000000000000000000000000000000000000000000713202d3946525e6875828f9ca8b2bdc9d5cabeb3a9988c7f7265564c41362a1b11060000000000000000000000000000000000000000000714202d3a4753606d7a86929facb8c5d2cabfb4aa9d9184776a5f54473b2e1f1409000000000000000000000000000000000000000005111e2a36414c565e61646463636262616160605c5f5f5f5f5f5f5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5b59534b41342a20150a000000000000000000000000000000000000000000000000000000000000000000010b151f28323a414950565d61656765605c554b42392f261b13090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d161e2429323b414650565d606b6f7980868e939a9fa6acb1b9bcafa59f92867c6f685e564d453c332a21170d03000000000b17222d38414e575f686e7b859299a39992877d70695e544b4034281f1409000000000000000000000000000000000000000000000000000000000000000000000000091623303c4956636f7c8997a2adbac6d1c4b7ab9e9184786a5f53473a2e212d3a4754606d7a86929fa89b8e8175655b606c7985929eabb8c5c4b8aca095877b6e6154473b2e23222e3b4855616e7b8896a1adaa9d908477695e53463a2d21140700000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfccbfb3a6998c807366594d404040404040404040404041414142424242434343434444444545454546433937332d261d140a000000000000000005121f2b3845525e6b7885919eabb8c4d1c8bbaea195887b6e6255483b2f22150800000000000000000000000000000000000916232f3c4956626f7c8995a2afbcc8d1c4b7aa9e9184776b5e5144382b1e1105000000000000000000000000000000000000000e1b2835414e5b6874818e9ba7afb0b2b5b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c666d757777787a7b7c7e818386888276695c4f4336291c100300000000000000000000000000000000000000050e1720293139404550565d60666c70767a7c7f82858686878889877b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d1113141f1f1e1d1c1d1e1c13120f0b06000000000000000000000000000000000000000000000000000000000000000005111d2935414c5663707d8a96a0acb9c4cfcfc3b6a99c908376685e5246382d22170b000000000000000000000000000000000000000003101c28343f4a5464707d8a98a2aebac7d3c6baaea2988b7f7265584e43372b1f0d030000000000000000000000000000000000000000010d1925303a444c525457575756565555545453514b5252525252525251515151515151515151515151515151515151515151515151515151515151514e4d4841392f22180e0300000000000000000000000000000000000000000000000000000000000000000000030d1620282f383f444c5254585a5953514b433930271d140a01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a111720282f353f444d525a61686d747d848c92989fa4acb0b8bcc3c1baaea29891847a6d685e574d453c33291f14090000000006111b262f3c454e565e69707d87929fa39992857b6e665c51453c31261a0e050000000000000000000000000000000000000000000000000000000000000000000005111e2a36424d566673808d99a9b3becacbc0b5ab9a8e817467584e43372b202c3945525d687683909da99e9285786c60636f7c8997a1adb9c6c3b6aa9d908377695e52463a2d1d212d3a46535f697884919eabaca095877b6e6154483b2f24180c00000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfccbfb3a6998c807366594d403333333333333333333434343535353536363636373737373838383939362d2b27221b140b02000000000000000005121f2b3845525e6b7885919eabb8c4d1c8bbaea195887b6e6255483b2f22150800000000000000000000000000000000000916222f3c4955626f7c8895a2afbbc8d0c4b7aa9d9184776a5e5144372b1e1104000000000000000000000000000000000000000f1b2835424e5b6875818e9ba1a2a3a6a8aaaa9d9083776a5d5044372a1d110400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b545c60696a6a676d6e70717477797c7a6d6054473a2d211407000000000000000000000000000000000000000000050e171f272f353e434c52545b6064676d70737578797a7b7b7c7c6e695f53463a2d21140700000000000000000000000000000000000000000000000000000000000000000000000000000000050d13191e20212b2b2b2a292a2b29201f1c17110a02000000000000000000000000000000000000000000000000000000000000010d1925303a4653606c7884919ea8b2bdc9d2c6b9ac9f93867a6d6153493f33271b0f030000000000000000000000000000000000000006121f2c3844505c6674818e9baab4bfcacabfb4aa9f92857a6d6054473c32261b0f0000000000000000000000000000000000000000000008131e29323a4146474b4a4a49494848474746454046454545454545454444444444444444444444444444444444444444444444444444444444444441403c372f271d1006000000000000000000000000000000000000000000000000000000000000000000000000040e161d262d333a4146474b4e4c4745403931271e150b020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000305060808090a0b141b2227323a414550565e616c707a818891959fa3aaafb6bec2c8cecabeb3aaa19690837a6e695f574d453b30251a0e02000000000a141d2a333c444d57606b73808d98a2a1979083786d60574d42372b21160b000000000000000000000000000000000000000000000000000000000000000000000714202d3a46525e697783909daab7c3cfc7bbafa3998a7d7164574a3e31261d2935414c566673808d99aaa197887c6f626673808d99a9b3bec9beb3a9998c807366574d42362a1e1e2a36424d576875818e9ba8b1a7988b7e7265554b4035291d1004000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfccbfb3a6998c807366594d40332626262626262627272728282828292929292a2a2a2a2b2b2b2c2c2c29201f1b17110a0200000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f22150800000000000000000000000000000000000916222f3c4955626f7c8895a2afbbc8d0c4b7aa9d9184776a5e5144372b1e1104000000000000000000000000000000000000000f1c2935424f5c6875828f94949597999b9ea09d9184776a5e5144372b1e1104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232e39424b51535c5e555c6061636567676d6f6d675d5145392c20130600000000000000000000000000000000000000000000050d151d2429313a41454a5053555d606366696b676d6e6f6f6e6a5f574d42362a1e1205000000000000000000000000000000000000000000000000000000000000000000000000000000050e171e252a2d2e38383736363637362d2b28221c140b0200000000000000000000000000000000000000000000000000000000000008131f2b3844505b66727f8c96a1adb9c3cfc7bbafa4998b7f72655b5044372b1f150b010000000000000000000000000000000000030d15202d3a4653606d7985929fabb8c5d0c6baaea2988d8074675d5145392a20150a00000000000000000000000000000000000000000000020d1720293036393a3e3e3d3d3c3c3b3b3a3a38342e39393838383838383837373737373737373737373737373737373737373737373737373737373534302c251d150b0000000000000000000000000000000000000000000000000000000000000000000000000000040b141b22273035393a3e413f3a38342f271f150c030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001040607060b0f121314151616151d262d333d444c525a62686e757d848d939aa0a8aeb4bbc0c7d0ccc8c6c3bcb2a8a09590847b6e695f574d42362a1e120500000000020b18212a323b454f59616d7a86929fa99f958d8073695f53463d33271c10020000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7b8795a0acb8c4d2c5b9ac9f92867a6d6054473a2d2119242f3d495663707c8998a2a9998c7f7266697784919daab7c4c6b9ada197897c6f6256493c30251a1a26313e4b5865717e8b98a9b3a89c8f8275675d5145382c1f1306000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfccbfb3a6998c807366594d4033261a1a1a1a1a1a1a1a1a1b1b1b1c1c1c1c1d1d1d1d1e1e1e1f1f1f1f1c13120f0b06000000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f22150800000000000000000000000000000000000916222f3c4955626f7c8895a2afbbc8d0c4b7aa9d9184776a5e5144372b1e1104000000000000000000000000000000000000000e1b2834414e5b677481888787888a8c8e9196969184776b5e5144382b1e11050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d2730394045464f514b5153555658555c6062605d554c4135291d11040000000000000000000000000000000000000000000000030b12181f282f35383f44464b515356595c555d60616263625f584e453b31261a0e020000000000000000000000000000000000000000000000000000000000000000000000000000020d1720293036393a45454443424344423938332d261d140a000000000000000000000000000000000000000000000000000000000000030f1c28333f4a54606d7984919ea7b1bdc7ccc0b5ab9e9184786c6053463e31271d120700000000000000000000000000000000010b151f2b37424d5763707d8997a2adbac6c9beb3a99f92867a6e61554c413529190e040000000000000000000000000000000000000000000000050e171e252a2d2e313130302f2f2e2e2d2d2c28232c2c2c2c2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b282724201a130b03000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171e24292d2e3234322d2c29231d150d0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306080d11131417171b1f202122222324272f383f444f565d606c717b818a91969fa4acb1babfc6cac6c5c0bbb9b6b5afaca7a09691847b6e695e52463a2d2014070000000000060f182029333d46525e6873808d99a9a79f92867b6e61594f44382c1e1308000000000000000000000000000000000000000000000000000000000000000004101c2834404a5465717e8b98a7b1bcc8d0c3b6a99d908376685d5245392c2013202d3a4653606d7986929fa99c8f8276676e7b8895a0acb8c5c5b8ab9e9285796c605346392d201315222e3b4855616e7b8897a1adac9f9286796d6053473a2e23170c000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfccbfb3a6998c807366594d4033261a0d0d0d0d0d0d0d0e0e0e0f0f0f0f101010101111111212121213100605030000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f22150807070707070707070707070707070707070916222f3c4955626f7c8895a2afbbc8d0c4b7aa9d9184776a5e5144372b1e1104000000000000000000000000000000000000000713202d3a4653606d787b7a7b7c7d7f828487898c84776b5e5144382b1e110500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e272e34383a424440454748494b4b51535554514c433a2f24190d0100000000000000000000000000000000000000000000000001070d161e24292d33383a404547494c4f4b515354555655534e463c33291f140900000000000000000000000000000000000000000000000000000000000000000000000000000008131e29323a414647525251504f50514f46443f382f261c11060000000000000000000000000000000000000000000000000000000000000b17222d3845515c67717e8b95a0abb5c0cbc7b8aca0968a7d70635a5043392f2418100700000000000000000000000000000007121d27313947535f6975818e9ba9b3becac4b9ada1978c8073685e52433a2f24190700000000000000000000000000000000000000000000000000050d13191e2021242424232322222121201f1c181f1f1f1f1f1f1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1b1a18140f0901000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b13191d2021252726201f1c18120b0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001050a0f1215191d20212422272b2d2e2f2f303031394149505960686d757e858f939ea1a9afb6bec3c5c4bebab8b6afacaaaba49f9d9a979691857b6e6154483b2e211508000000000000060e17212a36414c56616e7b8896a1ada3998f82756b6054483a3024190d010000000000000000000000000000000000000000000000000000000000000006121f2c3844515c6675828f9ba8b5c2cdcabeb3a9998c7f7366564c4135291d131f2c3845515c6776828f9ca99f92867a6d727f8c98a7b1bcc8c0b5ab9b8e8175665b5044382b1f1214212d3a47535f697885919eabaea2988a7d7064544a3f34281c10030000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfccbfb3a6998c807366594d4033261a0d00000000000101010202020203030303040404040505050606030000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f22151414141414141414141414141414141414141416222f3c4955626f7c8895a2afbbc8d0c4b7aa9d9184776a5e5144372b1e11040000000000000000000000000000000000000006121f2b3844505c666d6e6d6e6f707375777a7d7f7c6f6256493c2f231609000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c151d23282d33373c4347494a4b49464546494745413a31281e1308000000000000000000000000000000000000000000000000000000040c13191c22282b2f35393a3d40424045474848494847433c332a21180d030000000000000000000000000000000000000000000000000000000000000000000000000000010d1925303a444c52545e5e5e5d5c5d5e5c53504a42382d22170b00000000000000000000000000000000000000000000000000000000000006111c2934404b55606d78839099a3afbbc3c8bdb2a89c9083766c61554b40352923191108020000000000000000000000030a1118242f39434f59626e7b87939facb9c5c4baafa59e92857a6d60564c4131281e1308000000000000000000000000000000000000000000000000000002080d1113141817171616151514141313100c07121212121212111111111111111111111111111111111111111111111111111111111111110e0e0c080400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d111314181b191413100c0701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d11151b1f2124292c2d302d3337393b3b3c3d3d3d434b535b606b6f7a818b92979ea5adb2bbc0c4bdb9b7b3adabaca49f9d999993908d8a8784807a6e6154473b2e21140800000000000000050f1925303a47535f697885919eabab9e93897d7063564c4135291d1105000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7985929fabb8c5d2c6baada297897c6f6256493c302419101c2834404b5566737f8c99aaa3988a7d7076838f9ca9b6c2c7bbafa3998a7e7164544a3f33281c0f121e2b37424d576875828f9ba8b4aa9b8e8174665c5044382c1f1206000000000000000000000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9b6c2cfccbfb3a6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f22202020202020202020202020202020202020202020222f3c4955626f7c8895a2afbbc8d0c4b7aa9d9184776a5e5144372b1e11040000000000000000000000000000000000000003101c28343f4a545c6061616162646668686d70726f6a6054473b2e221508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b151f272f383f44464e535557585653514a45413a352f281f160c010000000000000000000000000000000000000000000000000000000001080d11171c1f24292c2d30332f35393a3b3c3c3b3a37312a21180f0600000000000000000000000000000000000000000000000000000000000000000000000000000005111e2a36414c565e616b6b6a6969696a69605b544a3f33281c0f030000000000000000000000000000000000000000000000000000000000000c18232f3944505c666f7c87929fa7b1bbc5c3b7ab9f948a7e71675d51453e352b2319130d08040000000000000105090c151c232935404b55606b75818e99a4afbbc6bcb2a89e938a7e70675d51443b301f160c0100000000000000000000000000000000000000000000000000000000010507070b0b0a0a090908080707060400000605050505050505040404040404040404040404040404040404040404040404040404040402010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010507070b0e0c07060400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080e13191d20262b2e2f35393a3d403f4446474849494a4a4d555d656c727c848e939fa2a9afb9bdbdb9b7b2acaba9a29f9b9a93908d898684817e7b78746e685e5246392d201407000000000000040a0c151e2b37424d576a7683909da9afa59b8f8275685d5246392d201307000000000000000000000000000000000000000000000000000000000000000a1723303d4a5663707d8998a2aebac6d2c5b8ab9f9285796d6053463a2d20130c18232e3c4956636f7c8998a2aa9a8d80747a86929facb9c5c5b9ac9f92867a6d6154473a2d22170b0e1a26313f4c5965727f8c98aab4ab9f9285796d6053463a2d22170b000000000000000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683909ca9b6c3cfccbfb3a6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2f3c4955626f7c8895a2afbbc8d0c4b7aa9d9184776a5e5144372b1e110400000000000000000000000000000000000000000b17232e38424a5053555454555759565d6063656260584e43372b1f130600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d27313941495053585f62646463605c54514c433c332a20170d0200000000000000000000000000000000000000000000000000000000000000060b0f13181d2020232624292c2d2e2f302f2e2b2620180f06000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3946525e686d78787776757677756c665b5044382b1f120600000000000000000000000000000000000000000000000000000000000007121d28343f4a54606a73808d95a0a9b3bdc6bbb0a69e9184796d605a50473d3529251e1913100c070b0a0b080d11141a1e262e343f45515d676f7d89939eabb5c0bfb4aaa1968e81756c61554c4132291e0d0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070d14191e25292d31373a3c4145474a4d495053545555565757575e676d777f8791969ea5adb3bcbab8b2adaba8a19e9997928e8b8783807d7a7774716e6967615e564c41362a1e11050000000000070f151b1e27303846525e687885919eabb8ac9f92867a6d6154473a2e23180c00000000000000000000000000000000000000000000000000000000000006121f2b37434e586774808d9aaab4becacec1b5a89b8e8275665c5044382b1f120713202d3a4653606d7986929faa9d9184777e8a99a3afbbc7c3b6a99c908376685d5246392d1c11060916232f3c4956626f7c8998a3aeada297897d706353493f33271b0f030000000000000000000000000000000000000000000000000000000000000000000000000004101d2a3743505d6a7683909da9b6c3d0ccbfb3a6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3c4955626f7c8895a2afbbc8d0c4b7aa9d9184776a5e5144372b1e1104000000000000000000000000000000000000000006111c2630383f4446484748494a4c4c5254565956544e463d32271b0f030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b18232f39434b535b60646a6f71716f6d66605d554e453c33291f140900000000000000000000000000000000000000000000000000000000000000000003070d1113141619181d202021222322211f1a150e0600000000000000000000000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a8485848382838482786c605346392d22170b000000000000000000000000000000000000000000000000000000000000010b17232e38424e58606d79839097a1abb5bdc2b9ada1968d80746c61594f473e353029241f1c181817171818191d20252a30383f44515b606d7983909da5afbdbfbaaea29891847a6d615a50433a2f20170d000000000000000000000000000000000000000000000000000000000000000000000000000000000001040607080706040000030000030606070604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004050403000004060706040000000000000000000000000000000000000000000000000000000000000000000000000000000000030506070604000003030303040405050603000000000000000000000000000000000000000000000000000000000000000000040c12181e252a3035393c4347484c5254575a535b6061626263636464696e79818c9299a1a8afbab8b4aeaca8a19e9a96918d8985817e7a7773706d686764615e5754524c443b3025190d010000000007101920272b3039424c56616e7a8796a1adb9aea3998b7e7265544b4034281c100400000000000000000000000000000000000000000000000000000000000815212e3a47535f6a7784919eaab7c4d0c8bcb1a7988b7e7165544a3f34281c1006131f2c3845515c6676828f9ca9a095877b818e9babb5c0c9bdb2a8998c7f7266564c4135291d0a000713202d3a4653606d7986929facb3a99a8d8174655b5044372b1f12050000000000000000000000000000000000000000000000000000000000000000000000000004111e2a3744515d6a7784909daab7c3d0ccbfb3a6998c807366594d4033261a0d00000000000000000000000000000000000000000000000101020303040000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255484747474747474747474747474747474747474747474747474747474955626f7c8895a2afbbc8d0c4b7aa9d9184776a5e5144372b1e11040000000000000000000000000000000000000000000a141e262e34383a3b3a3b3c3d40414547494c4947433d342b20160a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d2934404b555c656c71777c7d7e7c79736d675f574e453b30251a0e0500000000000000000000000000000000000000000000000000000000000000000000010406070a070d1113141515161514120f09030000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a869191908f9091897c6f6353493f33271b0f0300000000000000000000000000000000000000000000000000000000000006111c26303d45515c676e7b859299a3abb5bdbdb2a89d928b7e716b60595046413a352f2c28232524242425252a2d31363c424a505b626d74818e95a0acb7c0bbada39f92867c6f685d52483e31281e0e0500000000000000000000000000000000000000000000000000000000000000000000000000000001070d111314141313100c0710060b0f12131312100c0700000000000000000000000000000000000000000000000000000000000000000000000000000003060711121110070c10121312100c0700000000000000000000000000000000000000000000000000000000000000000000000000060b0f12131312100c07100f10101011111212100606030000000000000000000000000000000000000000000000000000000001070d161d242930363a4146474e5355565d60636668656c6e6e6f70707070717b838e939fa3abb2bab2acaaa39f9b96918d8984807c7975716e686663605d565754524d4746413b32291e140800000000040d19222b32373c424b545e68727f8c99a9b2bdb5ab9c908376665c5145382c1f130600000000000000000000000000000000000000000000000000000000000915222f3c4855626f7b8896a0acb9c5d1c5b8aca095877b6e6154483b2e23170b04101c2834404b5466737f8c99aaa7988b7e85929fabb8c5c5b9ada196887c6f6255483c3024190d0006131f2c3845515c677683909ca9b6ab9e9184786c605346392d20130a0000000000000000000000000000000000000000000000000000000000000000000000000004111e2b3744515e6a7784919daab7c4d0ccbfb3a6998c807366594d4033261a0d090909090909090909090909090a0a0a0a0a0a0b0c0c0d0e0e0f0f10110a0a080400000000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255535353535353535353535353535353535353535353535353535353535355626f7c8895a2afbbc8d0c4b7aa9d9184776a5e5144372b1e1104000000000000000000000000000000000000000000020c141c23282b2d2e2e2e2f313035393a3d3f3c3b37322b22190f04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111b262f3845515c676d777e84888a8b8985807a6e6a5f574d42362a21160b00000000000000000000000000000000000000000000000000000000000000000000000000000000010406070809090808060200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3945515d6775828f9b9c9c9c9a8d8074655b5044372b1f1205000000000000000000000000000000000000000000000000000000000000000a141e2834404b555f69707d879299a3abb5bdbaaea49f92867d706b625a524c45413a38342e31313131323036393b42464e545c606d727f8c939da7b1beb6afa39b918a7e716a60564c41362c1f160c000000000000000000000000000000000000000000000000000000000000000000000000000000040c13181d202021201f1c181c1c1d171c1f20201f1c18120b030000000000000000000000000000000000000000000000000000000000000000000000060c1012131e1f1e1d1c181c1f201f1c18120b03000000000000000000000000000000000000000000000000000000000000000000020a11171b1f20201f1c181d1d1c1c1d1d1e1e1f1f1d13120f0b0600000000000000000000000000000000000000000000000000030b12181f282f353b41464c5254585f6266686d70737577797a7b7c7c7d7d7d7e8590959ea5afb5bdb2a8a09e98928e8984807c78736f6d6664615e565654524c4b4846423b3936302920170d02000000010c161f2b343d43474d545c666e7a86929fabb8c4b9ac9f9286796d6053463a2d2013070000000000000000000000000000000000000000000000000000000005111d2a36414c5666727f8c99a8b2bdc9d0c4b7aa9d918477695e52463a2d1c1106000c18232e3c4956636f7c8998a2ab9e91849197a2adbac6c4b7ab9e9184786a5f53473a2e1e13080004101c2834404b556773808d9aa6b3ada196897c6f6256493c31261b0f0300000000000000000000000000000000000000000000000000000000000000000000000005111e2b3844515e6b7784919eaab7c4d1ccbfb3a6998c807366594d4033261a15151515151515151616161616161616171717171818191a1a1b1c1c1d1d171614100b050000000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6260606060606060606060606060606060606060606060606060606060606060626f7c8895a2afbbc8d0c4b7aa9d9184776a5e5144372b1e110400000000000000000000000000000000000000000000020a11171c1f20222121222424292c2d30322f2e2b27201910070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222d3841505a606d79818b9196979797928d847c6e695e52463d33271c10040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111d2935404b5564717e8a98a2a8a99e9184786c605346392d20130a00000000000000000000000000000000000000000000000000000000000000020c18232e39434d57606b717e879299a3abb3bbbaaea29892867d716c615e56524c4645403f3e3e3d3e3f404146474d53585f666d747f8b919ba5afb9b3aca49f918c7f726c61584e443a30241a0d040000000000000000000000000000000000000000000000000000000000000000000000000000040d161d24292c2d2e2d2c282329292a22282b2d2d2c28231c150c050000000000000000000000000000000000000000000000000000000000000000030a11171c1f202b2b2a292923282c2d2c28231c150c0b03000000000000000000000000000000000000000000000000000000000000020b141b22272b2d2d2c28232a2a2929292a2a2b2b2c2a201f1c17110a0200000000000000000000000000000000000000000000060d151d2429313940454c52565e61656a6f73777a7d80828485878888898a8a8a8a9197a0a7afbbc0b8aca096918c86817c78736f6a6663605c5454524c4a4745413e3b3a36302d2a251e170e050000000007121d28313d464e54575f666d78818f98a2aebac6bbaea399887c6f6255483c2f221509000000000000000000000000000000000000000000000000000000000713202d3946525e687683909ca9b6c3cecbbfb4aa9a8d807367574d42362a1e0a00000713202d3a4653606d7986929faca1969196a1a9b3becabfb4aa9a8d817467584e43372b1f0c0200000c18232e3d4a5764707d8a97a8b2b2a9998d807366584e43372b1f120600000000000000000000000000000000000000000000000000000000000000000000000005121f2b3845525e6b7885919eabb8c4d1ccbfb3a6998c807366594d40332622222222222222222222222323232323232323242425252626272828292a2a2423201c17100800000000000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6f7c8895a2afbbc8d0c4b7aa9d9184776a5e5144372b1e1104000000000000000000000000000000000000000000000000060b1012131514151617191d2021232623221f1b160f07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27333f4953616c75818e939ea0a8a9a29f9691857b6e61594f44382c20130700000000000000000000000000000000000000000000000000030506070808090908070606030000000000000000000000000000000000000000000000000000000001020404030100000000000000000000000000000000000000000000010d18242f3a4753606d7986929facada196897c6f6256493c32261b0f030000000000000000000000000000000000000000000000000000000000000007121d27303b454f59616c717e879299a1a9b0bab4aaa29892867e746d68605d5653514b4c4b4a4a4b4b4d4c5254575e616a6f78808b919ba3adbbb1a9a29a938b7f726d635a50463c32281e12080000000000000000000000000000000000000000000000000000000000000000000000000000010c161f282f35393a3b3a38342e3636372d3338393a38342e271e170f05000000000000000000000000000000000000000000000000000000000000030c151c23282c2d37383736362e34383a38342e271e1d150b0000000000000000000000000000000000000000000000000000000000000a141d262d3337393a38342e37363636363737383839362d2b28221c140b020000000000000000000000000000000000000000070f181f272f353e434b51565e61686d72777c8083868a8d8f909298959596969797979ea1a9b1b9c1c4b7aa9e91847f7a746f6c656260585653504a4746413d3a39352f2e2d2a25201e19140d0500000000010d18242f39434e586062696e78818f939eaab4becabfb5ab978a7d7064574a3d3124170a000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a86939facb9c6d2c7baaea398897d7063564a3d30251a0e000006131f2c3845515c6676838f9ca9a8a19ea1a8b2bcc5c7baaea3988a7d7064574a3d31261b0f0000000714212e3b4754616e7a8796a0acb7aa9e9184776a5f53473a2e21150900000000000000000000000000000000000000000000000000000000000000000000000005121f2c3845525f6b7885929eabb8c5d1ccbfb3a6998c807366594d40332f2f2f2f2f2f2f2f2f2f2f2f2f2f30303030303030313132333334343536363731302d28221a1108000000000005121e2b3845515e6b7884919eabb7c4d1c8bbafa295887c7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7d8996a2afbcc9d0c4b7aa9d9184776a5e5144372b1e1104000000000000000000000000000000000000000000000000000003060708070809080d11131416191615130f0a040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3744505b65717e8a939ea5acb2b3ada8a0978f82766b6054483c2f2216090000000000000000000000000000000000000000020608060b0f12131415151615151413120f0b06070604000000000000000000000000000000000000000406070a0d0f1011100e0c0807050200000000000000000000000000000000000007131f2c3945515d6775818e9baab2a89a8d807367584e43372b1f130600000000000000000000000000000000000000000000000000000000000000000b151e29333d47505a616c717e8791979fa6aeb4b4aaa298928b817a726d6864605c5459585757575859565e6164696e747c838d929ba3adb5aea7a09792887f726d635b51483e342b20160c00000000000000000000000000000000000000000000000000000000000000000000000000000007131d28313a4045474746454044434343443f444646444039302921170d0300000000000000000000000000000000000000000000000000000000000a151e262e34383a444544434243404446444039302f271d0e050000000000000000000000000000000000000000000000000000000006111b262f383f44464644404444434243434344444545433938332d261d140a00000000000000000000000000000000000000081119212a313940454f555d60686e737a7f83888d909399999b9d9fa2aaa2a3a3a3a3a4abadb3b7b8bcc3b6a99d90837e78716d67605b534e4946443f3b3936302d2c292421201e1a14110d0802000000000004101d2935404b55606a6f757b828f939ea5afbcc5d0beb1a4978b7e7164584b3e3125180b00000000000000000000000000000000000000000000000000000004101c2834404b5464717e8b99a4afbbc7d2c5b8ac9f9286796d6053473a2d201409000004101c2834404b5466737f8c99aab2adabadb2bac4cec5b9ac9f92867a6d6053473a2d20140a0000000714202d3946525e687784919eaab7aca096887b6f6255483c31261a0e02000000000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabb8c5d2ccbfb3a6998c807366594d403c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3d3d3d3d3d3d3e3f3f404141424243443d3c39332c231a10050000000005121e2b3845515e6b7884919eabb7c4d1c9bdb0a4998e888686868686868686868686868686868686868686868686868686868686868686868686898f99a5b1bdcad0c4b7aa9d9184776a5e5144372b1e110400000000000000000000000000000000000000000000000000000000000000000000010407070a0c090806030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c7884919ea5afb9bdbebab2a99f94897d706356493d3023160a00000000000000000000000000000000000205090e121415171b1f2021212223222221201f1c17161312100c07060200000000000000000000000001070c101314171a1c1d1e1c1b191514120e09030000000000000000000000000000000004101d2935404b5564707d8a98a2aeaa9e9184776a5f53473b2e21150a0000000000000000000000000000000000000000000000000000000000000000030c18212b353e48505a616c717d8590949fa2aab0b4aaa29f938e857f7a75706d66676564646464656668686d71757b808790949da4adb1aba39f9590857d726d625b51493f362c22190e040000000000000000000000000000000000000000000000000000000000000000000000000000010d18242f3a434b51535453514b504f4f50514a505353514a423b33291f14090000000000000000000000000000000000000000000000000000000006111c2630383f4446515251504f504a5153514a4241392f20170d020000000000000000000000000000000000000000000000000000000b17222d384149505353514a5150504f4f5050515152525046443f382f261c1106000000000000000000000000000000000008111a232b333b434b515961676d737a80868c9095999d9fa4aba8a6aba39f9e9e9d9e9fa4aba3a6aaacb1b8b8ab9f95908a847e79726c655e575045413a322d2a2521201d191514120e090501000000000000000613202c3945515d676f7c82868f949ea5afb7c1cecbbeb1a4988b7e7165584b3e3225180b00000000000000000000000000000000000000000000000000000006131f2c3845515c6675828f9babb5c0cccfc2b5a99c8f8276675d5145382c1f13060000000c18232e3c4956636f7c8998a3aeb9b7b9bdc4cccfc2b5a99c8f8276675d5145392c20130600000005111e2a36414c566874818e9ba7b4b2a8998c7f7366574d42362a1e1205000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b556c7986929facb9c5d2ccbfb3a6998c807366594d48484848484848484848484849494949494949494a4a4a4a4b4b4c4d4d4e4f4f50504a49443e362c22170b0000000005121e2b3845515e6b7884919eabb7c4d1ccc1b5aaa0999593939393939393939393939393939393939393939393939393939393939393939393939699a1abb6c1cdd0c4b7aa9d9184776a5e5144372b1e110400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c8896a0acb7c1c9cac4bbb0a69a8e8174675b4e4134281b0e00000000000000000000000000000002080e11151a1e212222272b2d2d2e2f2f2f2e2e2d2b282223201f1c1814120f0a040100000000000000040a0f12181c1f202327292a2a29282621201e1a14100b050000000000000000000000000000000c18242f3a4753606d7985929fabaca096887c6f6255493c31261b0f030000000000000000000000000000000000000000000000000000000000000000060f19232d363e48505a616b6f7a828c92989fa6abb0aea59e97928c86827d7976747271717071727375777a7e82878d92999fa6aeaba79f99928d837b706b625b51493f372e241a100700000000000000000000000000000000000000000000000000000000000000000000000000000004111d2935404b555d6061605c555d5c5c5d5e5e5b60605c544d453b31251a0e020000000000000000000000000000000000000000000000000000000c17232e38424a50535e5e5d5c5c5d545c605c54534b4132291e14080000000000000000000000000000000000000000000000000000030f1b27333f49535b60605c545e5d5d5c5c5c5d5d5e5e5f5d53504a42382d22170b0000000000000000000000000000000008111a232b353d454d555d606b707980868d92989da0a7aaaca49f9d9996999291919091939995979a9da0a7acaeb1a79f9d96918b857f776e69625a524c443a3229201713110d08070502000000000000000000000714202d3a4753606d7a868e92999fa6afb7c1c9d6cabeb4aa96897d7063564a3d3023170a0000000000000000000000000000000000000000000000000000000713202d3a4653606d7985929facb8c5d2c9bdb2a8988c7f7265554b4035291d10040000000713202d3a4653606d7986929facb8c4c5c9cfd4c8bdb2a8988b7f7265554b4035291d1004000000010d1925303f4b5865727e8b98aab3b6aa9d908377695f53463a2d211408000000000000000000000000000000000000000000000000000000000000000000000006131f2c3945515d677986939facb9c6d2ccbfb3a6998c8073665955555555555555555555555555555556565656565656565757585859595a5b5b5c5d5d575550483e33281c100400000005121e2b3845515e6b7884919eabb7c4d1d2c6bcb2aaa4a2a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a2a5abb3bcc7d2d0c4b7aa9d9184776a5e5144372b1e110400000000000000000000000000000000000000000000000000000000040607090b0d0f1011111110100f0d0b0906050300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a8b2bdc9d5d6cdc2b7aa9d9184776a5e5144372b1e110000000000000000000000000002080d14191e20262b2e2f2d3337393a3b3b3c3c3b3a3938332d302d2c2823211f1a15100d070100000003090e151b1d23292c2d30343537373634322e2d2a251f1c170f0a040000000000000000000000000007131f2c3845515c6775818e9ba9b2a8998d807366584e43372b1f120600000000000000000000000000000000000000000000000000000000000000000007111b242d363e48505960686e787f868f949c9fa6acaea9a29f98928e8a8583817f7e7d7d7e7e808284868a8f93999fa3abaca79f9d95908780796e69615951493f372e251c1208000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3945515d676d6e6d676b6a69696a6a6b666c6d665e574d42362a1e1205000000000000000000000000000000000000000000000000000003101c28343f4a545c606a6b6a69696a6b666d66645d53443b3025190e020000000000000000000000000000000000000000000000000005121f2b3744505b656c6d666b6b6a696969696a6a6b6b6c69605b544a3f33281c0f03000000000000000000000000000007101a232c353d474f575f676d747d848d92989fa2aaaca9a29f9a93908d8a8886858484858687888a8d90959a9fa2aaafaba8a09d97918b827b716c605d564c443b322921170e0500000000000000000000000000000613202d394653606c788490959ea6b0b8c1c9d3d3c6baaea298887b6f6255483c2f2215090000000000000000000000000000000000000000000000000000000a1723303d4a5663707d8998a2aebac6d2c5b9ada196887b6f6255483c2f24180c0000000006131f2c3845515c6776838f9ca9b6c2d1d5dad1c5b8aca096887b6e6155483b2f24180d01000000000815222f3c4855626f7b8898a2aeb8aca095887b6e6155483b3025190d01000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a869aa4afbbc8d4ccbfb3a6998c80736662626262626262626262626262626262626263636363636363646465666667676869696a64615a5044392d20140800000005121e2b3845515e6b7884919eabb7c4d1decec4bcb5b0afadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadafb1b6bcc5ceddd0c4b7aa9d9184776a5e5144372b1e11040000000000000000000000000000000000000000000000000105070c10121316181a1c1d1d1e1e1d1d1b1a181513120f0b060401000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfcedaded1c5b8ab9e9285786b5f5245382c1f12000000000000000000000000050c13191f252a2d31373a3b3f3f44464748484948484746443f403c3a38342e2e2b26201d18120e0903060d141a20262b2f34383a3d4042434443413f3b3a36302d28221b150e0600000000000000000000000004101c2934404b5563707d8a97a2adaa9d9184776a5f53473a2e2115090000000000000000000000000000000000000000000000000000000000000000000009121b242c363e474f565e666d727b828990949c9fa3abacaaa39f9b9892908e8c8b8a8a8a8b8c8e9093999b9fa4ababa49f9c95908a837c736d675f574f473f372d251c130a00000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d797a7979787776767677787879796e695e53463a2d211407000000000000000000000000000000000000000000000000000006121f2c3844505c666d777877767576777879746f64564c41362a1e110500000000000000000000000000000000000000000000000006131f2b37434e58606c787979787777767576767677777878766c665b5044382b1f120600000000000000000000000000050e19222c353e474f5960696e79818a91969fa3aaaeaba39f97928d8783807d7b7978777778797a7c7d8084888d92989fa3abb2aca9a19e948f867e756d685e564c443b332920170b020000000000000000000000000006121f2b3844505b666e7a838f939ea7b1bbc5d0cec5b8ab9f9285796d6053473a2d201407000000000000000000000000000000000000000000000000000006121f2b37434e586774808d9aaab4bfcad1c4b8ab9e9184786a5f53473a2e1d12070000000004101c2834404b5566737f8c99aab4bfcbd7ddd0c4b7aa9d918477695f53463a2d1d120700000000000613202d394653606c7985929fabb8b1a7988c7f7265564c41362a1e1105000000000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a8794a0b6c0ccd8ccbfb3a6998c80736f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f70707070707071727273747475757677706c6155493c3023160a00000005121e2b3845515e6b7884919eabb7c4d1d2c7bcb2aaa4a2a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a3a5abb3bdc7d2d0c4b7aa9d9184776a5e5144372b1e11040000000000000000000000000000000000000000000002080d1113181c1f20232527292a2a2b2b2a2928262522201f1b1713110d070100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a8b2bdc9d4d4cdc4b7aa9d9184776a5e5144372b1e110000000000000000000000060e161e252a3036393c4247484c4950535454555655555453504a4d494644403b3a37312c29241d1a140e0f181f262a3137394045474a4d4f50514f4e4c4846423b39332b26201810090000000000000000000000000c18232f3a4653606d7985929fabaca096887b6f6255483c31261a0e020000000000000000000000000000000000000000000000000000000000000000000009121b242c353d444d545c60696e767d83898f92999d9fa4acaaaaa29f9d9a989797979798999b9d9fa4aba7a7a09d99938f8a837d786f6a605d554d453e352d251b130a010000000000000000000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884878685848382828384848586867b6e6154483b2e21150800000000000000000000000000000000000000000000000000000713202d3a4653606d788385848382838485868174685e5246392d20160a0000000000000000000000000000000000000000000000000815222e3b47545f6a7682868585848383828283838484858582786c605346392d201306000000000000000000000000030c17202b343e474f59606b707b838e939ea1a8aeb0a8a199928d85807b7773706e6c666b6a666d6e6f7073777c80868d9299a0a8b0b3ada69f98928b827a6d685e564d453b32291d140a00000000000000000000000000030f1c28333f4a545e686e79818f959fa9b3becac5bcb0a69b8e8174675c5145382c1f130600000000000000000000000000000000000000000000000000000815212e3a47535f6a7884919eabb7c4d0ccc0b5ab9a8e817467584e43372b1f0b0100000000000c18232e3d495663707c8998a3aebac7d3d6cabeb4aa9a8d807367574d42362a1e0c01000000000006121f2b3844505b6676828f9ca9b5b6a99c908376685e5246392d201408000000000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbd2ddcdc1b4a79a8e817c7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7c7c7c7c7c7c7c7c7d7d7d7d7e7e7f808081828283837e7064574a3d3124170a00000005121e2b3845515e6b7884919eabb7c4d1cdc1b5aaa0999593939393939393939393939393939393939393939393939393939393939393939393939699a1abb6c1cdd0c4b7aa9d9184776a5e5144372b1e11040000000000000000000000000000000000000000040a0f13191d2023282c2d2f3234353637373737363533312f2d2b2722201d18130f0a03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091623303c4956636f7c8996a1adb9c0c7c8c3bbb0a69b8e8175685b4f4235281c0f000000000000000000020a1117202830363b4146474e535558535b6060616262626161605b54595653514a4847433c39352f2a251f1a19212931363c43474b5153565a5c5d5d5c5b5954524d49443e37322a221b120b020000000000000000000007121f2c3844515c6674818e9aa9b2a8998c7f7366574d42372b1e1206000000000000000000000000000000000000000000000000000000000000000000000009121a232b323b424a50575f616b70767c82868b90939a9a9d9fa3aaa4a5a5a4a4a3a4a5a5a5aaa39f9d9a9795908c87827d77706c655f58514b433c332c231b130a0100000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c798693989291908f8f9091919293887b6f6255483c2f22150900000000000000000000000000000000000000000000000000000713202d3a4653606d798591908f8f90919292867a6e6154473d32271b0f010000000000000000000000000000000000000000000004101c2834404a54626f7c889492929190908f8f8f909091919285796d6053463a2d2013070000000000000000000000000b151e29333d464f59616b707d8590959ea5acb2b0a69f969187807a736e69666361605b54545c60616264676a6f747a808791969ea6afb9b0aaa29f948f837a6e685e574d443a2f261b1106000000000000000000000000000b17222d38424c565e676d78839097a2adbac2bcb3a99e94897d7063554b4034291c100400000000000000000000000000000000000000000000000000000915222f3c4855626f7c8896a1acb9c5d2c7bbafa4998a7d7164574a3e31261a0f0000000000000714202d3a4753606d7986929facb9c5d2d3c6baaea298897d706356493d31261a0e000000000000030f1c28333f4a5466737f8c99abb5b9ac9f93867a6e6154473b2f24190d010000000000000000000000000000000000000000000000000000000000000000000915222f3c4855626f7b8895a2aebbc8d2d2c2b5a99d938e88888888888888888888888888888888888889898989898989898a8a8b8b8c8c8d8e8e8f908c7f7265594c3f3226190c00000005121e2b3845515e6b7884919eabb7c4d1c9bdb0a4998e898787878787878787878787878787878787878787878787878787878787878787878787898f99a5b1bdcad0c4b7aa9d9184776a5e5144372b1e1104000000000000000000000000000000000000040a0f161b1e252a2d2e34383a3c3e404243444444434342403e3c3937332d2c29241d1b150e0903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c7884919ea5afb9bbbcb8b1a99f948a7d7063574a3d3024170a0000000000000000020c141c2328323a41464d5254575f626568656c6d6e6e6f6f6e6d6c66696663605c5455534e4745403936302a262529333b42464e53555c606367686a6a696765615e57555047433c342d241d140b0200000000000000000004101c2834404a5463707d8997a1adaa9d908377695f53473a2e211409000000000000000000000000000000000000000000000000000000000000000000000000081019202930383f444d535960636b6f757a7f83878a8d909298969899999a9a9b9a999998969892908d8a87837f7b76706b64605b534e454039312a211a11090100000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3946525f6c7985929f9f9e9d9c9c9d9d9e9f94887b6e6155483b2e221508000000000000000000000000000000000000000000000000000006131f2c3845515c6773808d989c9c9d9e9f998c7f7265594f43382c1d13070000000000000000000000000000000000000000000006121f2c3844515c6674808d9a9f9e9e9d9c9c9c9c9d9d9e998d8074675c5145382c1f1306000000000000000000000007121d27303b454e58616b707d869297a0a7afb9b0a69f948f847c746d68615f57575553504a4a5053545557585f62686d747c848f949ea5afb8b4aea69e9590837a6e695e564c41382d22170e0400000000000000000000000006111c262f3b444c555d666e7b85929fa6b0bbb2aaa2978f82756b605443392f23180c000000000000000000000000000000000000000000000000000005111e2a36414c5666737f8c99a8b2bdc9ccc6b9ac9f93867a6d6154473a2e21140a00000000000006131f2c3845515c6776838f9ca9b6c2c8ccc5b8ab9f9285796d6053463a2d201309000000000000000b17222d3d4a5663707d8999a4afbbafa4998b7e7165564c4135291d11040000000000000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c8995a2afbcc7c5c5c4baafa59d9a95959595959595959595959595959595959595959696969696969697979899999a9a9b9c968a7d7063574a3d3024170a00000005121e2b3845515e6b7884919eabb7c4d1c8bcafa295897c7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7d8996a3afbcc9d0c4b7aa9d9184776a5e5144372b1e11040000000000000000000000000000000001080d151b21272c3036393a404446494b4d4f5050515150504e4d4b4846443f3a39352f2b26201a150c0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505b66717e8b939da5acafb1aca7a0969082766b6155483c2f23160900000000000000020b141e262e343e444c52565e61666a6e727577797a7b7b7c7b7b7a797775736f6d6665625f5853514b46423b363130353f454d53585f62676d70737576777674726e6964615a534e463f372f261d140a010000000000000000000c18232e3a4653606d7985929eabaca095887b6e6255483b31261a0e02000000000000000000000000000000000000000000000000000000000000000000000000070e171e262e343b42464f54596063686d72767a7d80838587898b8c8c8d8e8e8d8d8c8b89878684817d7a77726e69636159535049413c352f271f180f08000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3845525e6b7885919eababaaa9a9a9aaaba194877b6e6154483b2e211508000000000000000000000000000000000000000000000000000004101c2834404b55616d7a86929faba9aaab9d9184776b6054483a2f24180d010000000000000000000000000000000000000000000713202d3a4653606d7985929eababaaaaa9a8a9a9a9aa9f92877b6e61554b4034281c100400000000000000000000030c18232e39434d57606a707d869298a2a9b1b9b1a79f948f827a6f6a605d56534d4a4846443f3f444647494a4e53565e616a6f79828e939ea6b0b9bab0a7a09590847b6e685e53493f332720160c020000000000000000000000000a141d29323b434b545f69717e8a949fabafa9a19892857b6e61594f4431271d120700000000000000000000000000000000000000000000000000000714202d3946525e687683909da9b6bfbdc0c2b6a99d908376685d5246392d20130700000000000004101c2934404b556673808c99aab4b9bbc0c0b6ac9b8f8275665c5144382c1f1206000000000000000614212d3a4754606d7a86939facb9b5ab9c8f8276685d5245392c2013060000000000000000000000000000000000000000000000000000000000000000000a1723303d4a5663707d8996a3b0c0bbb9b8b8b7b7afa9a7a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a3a3a3a3a3a3a4a5a5a6a7a7a8a194887b6e6155483b2e22150800000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6f7c8895a2afbbc8d0c4b7aa9d9184776a5e5144372b1e1104000000000000000000000000000000040c131920272b32383a4146474a515356585a5c5d5d5e5e5d5c5b5958555350494745413a37312b261f18120b0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a54626c75818e939c9fa3a7a09d9590847b6e61594f44382c201407000000000000000a141d2630383f4450565e61686e73787b7f81838587878889888887868482807c7975726e6a65605d55524d46423b3a414651575f616a6f74797d8082838482817f7b76706c625f58514941382f261c130a00000000000000000007121f2b3844505c6674818d9aa9b1a7998c7f7266574d42362a1e120500000000000000000000000000000000000000000000000000000000000000000000000000050c151c232831363d44484f54565e6165686d707477797b7c7e7f8080818180807f7e7d7b797774716e6865615e56554f46443f382f29241d150d0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111e2b3844515e6b7784919eaab7b6b5b5b6b7ada094877a6d6154473a2e2114070000000000000000000000000000000000000000000000000000000c18232e3946525e6874808d99a3aeb7aca096897c6f63554b4035291d1104000000000000000000000000000000000000000005111d2a36414c5664707d8a97a1adb8b7b6b6b5b5b6b1a79b8e8175695e5343392e23180c00000000000000000000000b151e2834404b555e696f7c869298a2aab3bbb4aaa0959082796d685f58524c46423d3b39383334383a3b3c3d43474c525860676d78818e949ea7b1bdb9b1a7a09691847a6d655b50443d32281e1308000000000000000000000000020b1720293139424d57616c76828f99a3a49f9791867d6f695e53473d331f150b0100000000000000000000000000000000000000000000000000000814212e3b4754616e7a87939facaeb4b1b3b5b3a9998c807366564c4135291d1105000000000000000c18232f3d495663707c8998a3abacafb6b1afa49a8b7e7165544a4034281c1004000000000000000613202c3945515d677784909daaafb6ac9f92867a6d6054473a2d22170b0000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3adb5afacababaaaaaaa9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9aaaaaaaaaaabababababacafb5aeaeafada194877a6e6154473b2e21140800000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6260606060606060606060606060606060606060606060606060606060606060626f7c8895a2afbbc8d0c4b7aa9d9184776a5e5144372b1e11040000000000000000000000000000060d161e242932373d43484c5254545c6062656768696a6a6a6a6968666462605b5354514b47433c373128231d150c05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222d3842505a606d7881898f92999595908b837b6e695e52473e33281c100400000000000006111c262f38424a505a61686d747b7f84888b8e90929894959595949892918f8c8985827f7b77726d67615e57534d44444c525b62696e757c8186898d8f90908f8e8c87837d766f6a625b524a41382e251c1208000000000000000003101c28343f4a5463707c8996a1adaa9d908377695f53463a2d2114090000000000000000000000000000000000000000000000000000000000000000000000000000030a11171f262a33383d44484c5254565e616467656c6e7071727374747474737272706e6c666764615e5654524d48443e37332d261d18120b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111e2a3744515d6a7784909daab7c3c2c2c3b9ada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000007121d2a36414c56616e7b86929fabb5b2a89a8e8174675d5145392c20150900000000000000000000000000000000000000000713202d3946525e6875828f9ba9b3bec4c3c3c2c2b7ab9f95897c6f62574d4230271d12070000000000000000000007121d27303945515c676e7b859198a2aab4bcbaaea2989083796d675d564e45413a36312e2d2b28282b2d2e2f31373a41464e555d666d78828f95a0abb4bfb9b1a8a0968f82776c60594f443a3025190d03000000000000000000000000050e171f27303b45505a626f7c87929d9a938e857d6f6b60574d42352b210d030000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b9a9e9fa2aaa4a6a8aba297897c6f6356493c3024190d01000000000000000714202d3a4753606d7986929e9e9fa4aca4a69f93877a6e6154473b2e23180c000000000000000004111d2935414c556774818d9a9fa4a1a2a3998a7e716453493f33271b0f0300000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97aba1a0a39f9f9e9e9d9d9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9d9d9d9d9d9e9e9e9e9e9f9fa4a0a1a1a2a3a296897c6f6356493c3023160900000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255545454545454545454545454545454545454545454545454545454545455626f7c8895a2afbbc8d0c4b7aa9d9184776a5e5144372b1e1104000000000000000000000000000810181f282f353d43474f54565e6165666d6f7173757677777776767573716f6c6564605d55534e47423c342e271e170f0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c262f3f44515c666d747d8286888987847f786e695f574d42352c21160b000000000000030c17222d38424a545c606c717a81868c9196989b9d9fa2aaa1a2a2aaa39f9d9c9998928f8b88847f79736e69615f57504e565e616d727b82888e92989a9b9d9d9c9a9a93908a827c726d645c524a40372e241a0d0300000000000000000b17232e394653606c7884919eababa095887b6e6155483b30251a0e02000000000000000000000000000000000000000000000000000000000000000000000000000000060c141a21272c32383a4146474c525457535b606163656666676768676666656361605b545754524c4746423b38332b27221b140b0701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101d2a3743505d6a7683909da9b6c3cfcfc7bbaea39986796d6053463a2d201307000000000000000000000000000000000000000000000000000000000d1925303a46525e6974818e99a4afb8ac9f92857a6d6053473c31261a0e00000000000000000000000000000000000000000714212e3a4754616d7a86929facb9c5cfd0cfc9bdb2a89d9083766a6054453b311e150b00000000000000000000000c18232e39424e58606d79839097a1aab4bcbcb1a79f92867c6e675d554c443c352f2a2622201f1c1c1f202122262b30363d434b545c666d79839099a3aebac3bab2a89f948c7f726b60564c4135291f140900000000000000000000000000050d151e29333e47535f6a74808d908c87817a6f6b60594f453b3123190f000000000000000000000000000000000000000000000000000000000f1c2835424f5b6875828e919192989597999c9e9f9285796d6053463a2d201308000000000000000006131f2c3845515c677683909192939a9597999b908377685e5246392d1c12070000000000000000010d19242f3e4b5864717e8b92939a949597988e8275655b5044372b1f120500000000000000000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b9994949399929291919190908f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f909090909090919191919192929399949495959696978b7e7164584b3e3125180b00000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255484747474747474747474747474747474747474747474747474747474955626f7c8895a2afbbc8d0c4b7aa9d9184776a5e5144372b1e110400000000000000000000000009121a222a313a41454e54596063686d7276797c7e808283838484838381807e7b7975716d67625f58534d4540393029211910070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d2834404a545c606b70767a7c7c7a77726d665f574d453b30231a10050000000000000b151e28333f4a545c666d747e858e92999ea1a8a8aaacaeb4aeafaeb4aeacaaa8aaa29f9c9896918b85807b756e69605b5860686d757f868e939a9fa2aaa8a9aaa9aca49f9c9490867f746e645c524940362c1f150b010000000000000006121f2b3844505b6674808d9aa8b1a7988c7f7265574d42362a1e12050000000000000000000000000000000000000000000000000000000000000000000000000000000003090e161c21272c3036393a4146474a49505354565859595a5b5b5a5a5958565453504a4a4746413b3a36302c281f1b17110a020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cfd2c5b9ac9f928679665c5044382b1f12060000000000000000000000000000000000000000000000000000000008131e2a36424d57616e7b87939facb9aea2988b7e7165574e42372b1d120700000000000000000000000000000000000006121f2b37434e5865727f8b99a3aebbc7d7ddd2c5b9aca1968a7d7164584e4333291f0c030000000000000000000004101c2834404b54606a73808d95a0a9b2bcc6b8ab9f958b7f726a5f554b433a3229241e1a1513120f10121314161b1e252a313a424a545d676f7c86929fa8b2bdc3bab0a69f92877d6f685e52463b31251a0e0300000000000000000000000000030c17212b37434e58606d7a8383807c756d6860594f473d33291f1108000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8584848586888a8d8f91968e8275665c5044382b1f1206000000000000000004101c2934404b5564717e8584858687898b8d8f8c807366564d41362a1e0b000000000000000000000814212e3b4754616e7a8585868788898a8b8c85786c605346392d20130600000000000000000000000000000000000000000000000000000000000000000a1723303d4a5663707d878888878786868585848483838383838383838383838383838383838383838383848484848484858585868687878889898a8a8a7f7265594c3f3226190c00000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3c4955626f7c8895a2afbbc8d0c4b7aa9d9184776a5e5144372b1e1104000000000000000000000009121b242c343c434c515860626b6f757a7f8285898b8d8f90909191908f8e8c8b8885827e7a746f6a615f57514b423b332b221911070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b18232e39424a51596063686d6f6f6e6965605c544d453b33291f110800000000000007121c27303944505b666d78808a92979fa3abacb2b4b6b8b8b3adaba8a5a4a3a3a4a6a7a9a8a8a09e97928d86817b726c66606a6f7a828c92989ea5acaeb4b5b6b7b5b6afaca69f98928b80746e645b51483e31271d120700000000000000030f1c28333f4a54626f7c8996a1aca99d908376695e52463a2d201408000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b10161b1e252a2d3035393a3d3f444648494b4c4d4d4e4e4d4d4c4b4a4846443f3e3b3936302d2a251f1c160f0b06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020f1c2935424f5c6875828f9ba8b5c2ced2c5b8ab9f9285786c5f4a3f34281c100300000000000000000000000000000000000000000000000000000000020e1a25303b47535f6975818e9ba6b0b4aa9c9083766a5f5347392e23180c0000000000000000000000000000000000000815212e3a47535f6a7783909dabb5bfcbd7d6cabeb3a99e9184786d6053463d3220170d000000000000000000000006131f2c3845515c666f7c87929fa7b1bbc4bcb0a69d9083786c60574e433a31282019130e09060603030607080a0f13191f283039424b555f6a737f8c96a1acb9c3c2bbafa39991847a6d61574d42362a20150a0000000000000000000000000000060f1b26313c45525d686d7676736f6a615e564f473d342b21170d00000000000000000000000000000000000000000000000000000000000b1824313e4a56626d7278777879797b7e80828487897e7165544a3f34281c10030000000000000000000c18232f394955616c71787778797b7c7e8082837b6e6155483b3025190e000000000000000000000714202d3946525e686e7878797a7b7c7d7e807f72655b5044372b1f120500000000000000000000000000000000000000000000000000000000000000000916222f3c4854606b707b7b7b7a7a79797878777777767676767676767676767676767676767676767677777777777878787878797a7a7b7b7c7c7d7d7e7a6d6154473a2e21140700000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2f3c4955626f7c8895a2afbbc8d0c4b7aa9d9184776a5e5144372b1e11040000000000000000000008121b242d363e464e555d606a6f767c82868b8f9298989a9b9c9d9d9d9d9c9b999797928f8b86817c756e69605c544d453d342b23191007000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121c27303940444f54565d606262615e5653514a423b332920170d000000000000000c18232e39424f59606c78818d929fa2a9aeb5b9bdbfbab1aba9a19e9b9997969697999a9c9fa2aaa9a29f99928e867f786e6b707c848f949fa3aaafb8babfc2c3c3c2c0bbb9b0aaa39f928d80736d635a5043392f24180c00000000000000000b17222d394653606c7884919eabac9f93877b6e6154483b3025190e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000040b0f13191d2025292d2e2d3337393b3d3e3f4041414141403f3f3d3b3938332d2e2d2a25201e1914100b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1ced1c5b8ab9e9285786b5f52452e23170b00000000000000000000000000000000000000000000000000000000000009141f2b37424d57626f7c88949eaab7ab9f94887b6e62544b4034281c10040000000000000000000000000000000003101c28343f4a54626f7c8895a0abbdc6d1dcd3c6baada2978b7f72665c5044382b1f12050000000000000000000004111d2935404b55606d79849199a3afb9c3c4b7ab9f94897c6f665b50453c31281f160e080100000000000000000002080d161e27303a434e58606d7984919ea8b2bdc8c0b5aba1968d8074695e53463c31261a0f0200000000000000000000000000000a15202935414c565d606a6a66625f58524c443d352b22190f0500000000000000000000000000000000000000000000000000000000000916222e3a46515b62656b6b6b666d6f717375787a7c786d6053463a2e23170b0000000000000000000007121d2d3945505a61646c6b666d6e6f717375766e695f53463a2d1f14080000000000000000000005111e2a36414c565e616b666d6d6e6f707273726d6353493f33271b0f0300000000000000000000000000000000000000000000000000000000000000000714202c38444f5960696e6f6e6e6d6d666c6b6b6a6a696969696969696969696969696969696969696a6a6a6a6a6b6b6b6b6b6c676d6d6e6e6f707071716d685e5246392d20130700000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f22212121212121212121212121212121212121212121222f3c4955626f7c8895a2afbbc8d0c4b7aa9d9184776a5e5144372b1e110400000000000000000007101a242d363f4850585f676d747c83898f92999c9fa2aaa39f9e9c9b9b9c9ea1a9a9a29e9b98928e87827b736d665e574e463d352b22190f0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e272e343d44484c5254555654524d46444039302921170e0500000000000004101c2834404a54616b73808d939da4adb3bbbfc5bcb4aea79f9d97928e8c8a8a898b8c8d8f92989a9ea1a9a39f98928b837b747d8691969ea6aeb4bcc1c6c8c2bcb7b6b6afacacafaea49d928c7f736c61554b4035291d10040000000000000006121f2b3744505b6573808d9aa8afa49a8b7f7265564c41362a1e110500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d1113191d202122272b2d2e3032333334343534333332302e2d2b282221201e1914110e090200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2834414e5b6774818e9aa7b4c1cdd1c4b7ab9e9184786b5e5145382b1e06000000000000000000000000000000000000000000000000000000000000030e1a26313c47535f6a75828f9ca6b0b0a69a8d8073665c5145382c1f14090000000000000000000000000000000006121f2c3844505c6673808d9aa7b1bccfd8d7cbc0b5ab9f92857a6d60544a3f34281c1003000000000000000000000613202c3945515d67727f8b95a0abb5c0cabeb4aa9c9083766b60544a3f332a1f160d0400000000000000000000000000040c151e28313c45515c66717e8b96a0acb8c6c7bdb2a89f92867b6e61584e43372b1f14080000000000000000000000000000040d19242f3a434c52545d5d5955534e46413a322b2319100700000000000000000000000000000000000000000000000000000000000006121e29343f495156585f5e545c6062646669686d6f6d665c5145382c1c11060000000000000000000001111c28333e485055575f545c6061626466686a615f574d42372b1e120500000000000000000000010d1925303b444c52545f5c6061616264656666635b5141382d22170b00000000000000000000000000000000000000000000000000000000000000000004101c27333d474f575e6162616160605c5f5e5e5e5d5d5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5d5d5d5d5d5d5e5e5e5e5e5f555c606161626263636464615e564c41362a1d110500000005121e2b3845515e6b7884919eabb7c4d1c8bbaea195887b6e6255483b2f22151414141414141414141414141414141414141416222f3c4955626f7c8895a2afbbc8d0c4b7aa9d9184776a5e5144372b1e11040000000000000000040e19232c363f48505a616a6f7a818790949b9fa3aba49f9c999291908e8f909297999ea2a9aaa29f9a938f8680796e6960584f473d342b21170c0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c151c232833383a41454749494746423b38342e271e170f060000000000000006121f2c3844515c66707d8a929da5aebabec5c5bbb3aaa29f95908a85827f7e7d7d7e7f8182858a8e91979ea0a8a29f94908681869298a1a8b0babfc6cac3bcb8b0aba9aca49f9fa3aba9a49c918a7e71675d5145382c1f130600000000000000030f1b27333f4953626f7c8896a0acac9c908376685e5246392d20140800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105080d111314171b1f202123252626272828272726252321201f1c171414110d080502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdd1c4b7aa9e9184776b5e5144382b1e110500000000000000000000000000000000000000000000000000000000000009151f2b37434e58626f7c89949fabb8ab9e9285796d6053463c31261a0e000000000000000000000000000000000713202d3a4653606d7985919eabb8c3cdded3c7bbafa3998d8073675d5142382e23170b0000000000000000000004101c2834404b55606d7985929ea8b1bdc7c6baaea2988a7d7064594f42382d21180d04000000000000000000000000000000030c161f2834404b54606c7884919eaab4bfcac4baaea3998e81746a5f53473b3025190e02000000000000000000000000000008131e28313a41454750504d4847433c3630292019110700000000000000000000000000000000000000000000000000000000000000010d18232d373f464a4c52514b515355575a565d6063605c544b4034281c0a0000000000000000000000000c17222c363e45494a524b51535456585a5c5d55534d453c31261a0e02000000000000000000000008141e29323b4146474a5053545556575859595751493f2f261b1106000000000000000000000000000000000000000000000000000000000000000000000b16212b353d454d52545555545453504a5251515050505050505050505050505050505050505050505051515151515152524b5153545455565657575754524c443a3025190d0100000005121f2b3845525e6b7885919eabb8c4d1c8bbaea195887b6e6255483b2f22150807070707070707070707070707070707070916232f3c4956626f7c8995a2afbcc8d0c4b7aa9d9184776a5e5144372b1e110400000000000000020c16202b353e48505a626c717c848d93999fa6aca8a09a938f8a86848381828385888c92979fa4acaca49f98928c837b6f6a60594f463d33291e140a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b121821272c2f35393a3c3c3b3a36302c28231c150c060000000000000004101c2934404b55606d7984919ea4aeb7c0cac7bdb3a9a198928b837d79757271707071737476797d81858b91969ea1a69f98928d9298a2aab2bac1cbc6bfbab1aba69f9c989a939299979c9fa39e9184796d6053473a2d20140700000000000000000b17222d384754606a7784919eaaac9f93867a6e6154473b3025190d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010507060b0f1213151618191a1a1b1b1a1a1918171513120f0b06070501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d1a2734404d5a6773808d9aa6b3c0cdd0c4b7aa9d9184776a5e5144372b1e1104000000000000000000000000000000000000000000000000000000000000030f1b26313c4754606a76828f9ca7b1ada1978a7e7164574d42372b1c1207000000000000000000000000000004111d2935414c5663707d8a97a1adb9c6d2dfd2c5b9ac9f92867b6e61554b4130261c11060000000000000000000006131f2c3845515c67737f8c97a1adbac3cfc5b8ab9f9285796d6053463d2f261c0f060000000000000000000000000000000000040d18232e3944505b66727f8c98a2aebac7cbbfb4ab9f93877c6e62564d41362a1e11050000000000000000000000000000010c161f282f35393a4343403c3b37322a251e170e0700000000000000000000000000000000000000000000000000000000000000000006111b252d343a3e3f4544404546484b4d4c52545653514b42392e23180c00000000000000000000000005101a242c33393c3e4540454648494b4d4f504846423c332a1f1409000000000000000000000000020d1720293036393b3f44464748494a4b4d4c4b463f372e1d140a0000000000000000000000000000000000000000000000000000000000000000000000050f1a232b333b4246484848474746443f45444444434343434343434343434343434343434343434344444444444545454540454747484849494a4a4b4746413a32281e13080000000005121f2c3845525f6b7885929eabb8c5d1c8bbaea295887b6f6255483c2f2215090000000000000000000000000000000000091623303c4956636f7c8996a2afbcc9d1c4b7aa9e9184776b5e5144382b1e11050000000000000008131e28323d47505a626c717e8691969fa4abb0a69e969187827e797776757576797b80858d939aa3aaafaaa39f9590857d706b60584e453b30261c1106000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c161c1e24292c2d2f2f2e2d2a251f1c18120b03000000000000000006131f2c3845515c67727e8b96a0acb6c0c9cbc0b5aba19792867e76706d6666646363646667676d7074797e848b92979fa6a39f9a9fa3aab4bcc4cbc3bcb4aea7a09d94908b888686878a90949e9e93877a6e6154473b2e211408000000000000000006111b2b37434e586673808c99a7afa4998b7e7265564c41362a1d1105000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030506080a0b0c0d0e0e0e0e0d0c0c0a080606030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2733404d5a6673808d99a6b3c0ccd0c3b7aa9d9084776a5d5144372a1e1104000000000000000000000000000000000000000000000000000000000000000a15202b38434e5863707d89959fabb3a99c8f8276695f5346392e23180c00000000000000000000000000000713202c3945525d6875828e9ba9b3bec9d5d3c7bbb0a69b8e8175695e53433a2f1e140a00000000000000000000000713202d3a4653606d7985929ea9b3becccbbfb5ab9b8e8275675c5145382b1d140a0000000000000000000000000000000000000007121d28333f4a54606d7a86929facb8c5d1c6bbafa4998f8275685e5246392d201409000000000000000000000000000000040d161e24292c2d3737332f2e2b262019130c05000000000000000000000000000000000000000000000000000000000000000000000009131b23292e3132382e34383a3c3e40414547494645403930271d12070000000000000000000000000008121a22282d30312e34383a3b3c3e4042433b3a37312a21180e0300000000000000000000000000050e171e252a2d2e34383a3a3b3c3d3f403f3e3b352e251c0b0200000000000000000000000000000000000000000000000000000000000000000000000008111a212930363a3b3c3b3b3a3a38342e383737363636363636363636363636363636363636363737373737383838382f34383a3a3b3b3c3d3d3e3e3a3936302820160c020000000006121f2c3945525f6c7885929fabb8c5d2c8bbafa295887c6f6255493c2f22160900000000000000000000000000000000000a1623303d495663707c8996a3afbcc9d1c4b7ab9e9184786b5e5145382b1e1205000000000000010d1925303a444f59616c717e879298a0a8afb0a69e938f847c76716d67696868656c6f737980889298a3abb4aea79f9792867d706a60574d42382e23170b02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b1013191d2021222321201e1914100c07000000000000000000000714202d3a4753606d7984919ea8b2bdc8d3c7bbafa39992857c716c63605c545757565859555c6063666d71787e858f949fa9aca7acaeb4bcc6c9c1b9b1aaa29f95908a837e7b79797a7e838a92948e8175695e52463a2d2014070000000000000000000f1b27323c4855626f7c8895a0acab9c8f8276685e5246392d20130800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3bfccd0c3b6aa9d9083776a5d5044372a1d110400000000000000000000000000000000000000000000000000000000000000040f1b27323d4854606b7683909da7b1ac9f93877b6e61544a4034281c1004000000000000000000000000000714212d3a4754606d7a86929facb9c4cfdad0c4b7ab9f94897c6f62574d4231281d0c020000000000000000000006121e2b37424d5764717e8a97a1adbbc5cfc7bbaea3998a7e7164554b403428190b0200000000000000000000000000000000000000000b17222d3845525d6875818e9babb5bfcbccc0b5ab9f93877b6e6154473c31261a0e02000000000000000000000000000000040c13191d20212a2a2622211f1b150d0802000000000000000000000000000000000000000000000000000000000000000000000000010911181e2224252c23282c2d2f313035393a3c3a38342e271e150b0000000000000000000000000000000810171c21232423282c2d2e2f313335372e2d2b261f180f06000000000000000000000000000000050d14191e2023282b2d2e2e2f31323333322f2a231c130a0000000000000000000000000000000000000000000000000000000000000000000000000000080f171f252a2d2e2f2e2e2d2d2c28232b2b2a2a292929292929292929292929292929292a2a2a2a2a2a2b2b2b2b2b23292c2d2e2e2f2f303031312e2d2a251e160e05000000000006131f2c3946525f6c7985929facb8c5d2c8bcafa295897c6f6256493c2f23160900000000000000000000000000000000000a1723303d4a5663707d8996a3b0bcc9d1c4b8ab9e9185786b5e5245382b1f120500000000000005111d2935414c56606b717e889299a3aab2b3a99f948f817a6f6a64605c555b535b6062676d747e869299a3afbab1a9a29892867c6f695e544a3f34281f1409000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001080d11131416161414110e0904000000000000000000000003101c28343f4a5464717d8a96a1adbac4cec8bdb2a89f92877c6f6a625a53514a4b4a4a4b4c4b5153545c60666d717a828f97a1adb4b9babfc6c8c0b7afa7a098928b837d76716e6d686e71767d8589827a6d60574d42362a1e11050000000000000000000a15212e3a47535f6a7784919daaac9f92867a6d6154473a2f24190d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000406070f100f0e0d0d0c0d0d0e1011090907030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3bfccd0c3b6a99d9083766a5d5043372a1d100400000000000000000000000000000000000000000000000000000000000000000a16202c38444f5964707d8a95a0acafa49a8d8073665c5144382c1f140900000000000000000000000006121e2b37424e5765727e8b98a3aebac7d6d4c8bdb2a89c9083766a6054453b311f160c00000000000000000000000814212e3a47535f697683909da9b3becdd2c5b9ac9f92867a6d6054473a2e23180700000000000000000000000000000000000000000006111c2935414c5664717e8a99a3aebbc7d2c7bbafa4998b7f7265574d42372b1e12050000000000000000000000000000000001080d1113141d1d1a1515120f0a0400000000000000000000000000000000000000000000000000000000000000000000000000000000060d121618191f181c1f20222424292c2d302d2c28231d150c0300000000000000000000000000000000050c11141717181c1f2021232527292a22211e1a140e06000000000000000000000000000000000002080d1114171c1f202122232425262625221e18120a01000000000000000000000000000000000000000000000000000000000000000000000000000000050d141a1e202122222121201f1c171e1e1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1e1e1e1e1e1e1f181c1f20212122232324242421201d19130c050000000000000613202c3946535f6c7986929facb9c5d2c9bcafa296897c6f6356493c3023160900000000000000000000000000000000000a1724303d4a5763707d8a96a3b0bdc9d2c5b8ab9f9285786c5f5245392c1f06000000000000050f19232d3946525e686f7d86929aa3abb4b9ada1979082786d68605853514b4e495053555d606c707d87929fa7b1bbb3aaa29892857b6e665c50443b3025190e02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010407070909080705020000000000000000000000000006121f2b3844505c6675818e9ba8b2bdccd2c5b8aca0968d80736a6058504644403e3d3d3e404045474a51545c60686e7a85929eabb8c5c7cbcec0b6aea59e9591867e78706b6561605e61646c707b7c786d685d52453b30251a0e0200000000000000000006121f2b37434e5866737f8c99a7afa3998b7e7165564c4135291d110400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c1013131c1d1c1a1a19191a1a1b1c1d1615130f0a04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfcccfc3b6a99c908376695d5043362a1d1003000000000000000000000000000000000000000000000000000000000000000004101c27333d4653606c7883909da9b2ac9e9185796d6053463b31261a0e0000000000000000000000000814212e3a47535f6a7683909daab4bfcbd7d2c5b9aca0968a7d7064584e4333291f0d0400000000000000000000000815222f3b4855626e7b88959fabbbc5cfcfc2b5a99c8f8276685d5245392c201307000000000000000000000000000000000000000000000d1924303a4754606d7a86929facb9c5d2ccc0b5ab9d908376695f53463a2d2114070000000000000000000000000000000000000104060710100d09080603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000106090b0c070c1013131518191d202123201f1c18120b030000000000000000000000000000000000000005080a070c1013131516181a1c1d1514120e090300000000000000000000000000000000000000000105060b10121314151617181a191816120d0700000000000000000000000000000000000000000000000000000000000000000000000000000000000002090e121415151514141312100c061111101010101010101010101010101010101010101011111111111212070c10131414151516161717181413110d08020000000000000006121f2b3844505b667986939facb9c6d2c9bcafa396897c706356493d3023160a00000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdcad2c5b8ac9f9285796c5f52462e23170c0000000000000b16212c38444f59616d7a859198a3acb5bdb1a79e91857a6e665d564e464540423f44464b515a616b737f8c95a0acb8bcb4aaa1979083786d60564d42362a1e140800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7985929eabb8c4cfcabfb4aa9e9184796d60584e463e38342e3030312f34383a4044505b656d78828f97a1adb9c6d2d0c6bcaea49d938f837c716c656159555352545a61686e706d665d564c4133291f140900000000000000000000030f1b26313c4855626e7b8895a0acab9c8f8276685d5245392c2013070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b12181c1f20292a2827272626262728292a23221f1b160f070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5b2bfcccfc2b6a99c8f8376695c504336291d10030000000000000000000000000000000000000000000000000000000000000000000b161f2b3744505b65717e8a96a1adada1978a7d7164574d42362a1c110600000000000000000000030f1c28333f4a54626e7b88959fabbcc6d1d6cabeb3a99e9184786c6053463d3220170d000000000000000000000005111e2a36414c5666727f8c99a7b1bccdd7ccbfb2a6998c7f7366564c4135291d1104000000000000000000000000000000000000000000000813202c3945525d687683909ca9b6c3cfd2c7b8ab9f95887b6e6155483b2e23180c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004060709080d111314161313100c07000000000000000000000000000000000000000000000000000004060708090b0d0f100807050200000000000000000000000000000000000000000000000000000306070708090a0c0d0c0c0a06020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205070809080807070603000004040303030303030303030303030303030303030304040404040505050000040607070808090a0a0b0b070705010000000000000000000613202d394653606c798699a4afbbc7d4c9bcb0a396897d7063564a3d3023170a00000000000000000000000000000000000b1724313e4a5764717d8a97a4b0bdcad2c5b9ac9f9286796c5f4a3f34281c10030000000004101c27333c4854606b75818e97a1aab4beb8aca0958a7d70685e544c443c38342e33373940455059606c7883909da7b1bcbcb3a99f958c7f73695e52463b3025190e01000000000000000000000000000000020507080c0d0d0c09060503000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915222f3c4855626f7b8897a2adb9c6d3c7baaea2988b7e72675c51463d342c28232423252329343e48515b606c77818e949fa9b3bec9d2cabfb4aa9d928d81796f6a605b534f4846464750565e6163605c544c443a2f20170d0200000000000000000000000a15212e3a47535f697783909daaac9f92867a6d6054473a2f24180d01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c151d23282c2d3537353433333333333436372f2e2c272119100700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926323f4c5965727f8c98a5b2bfcbcfc2b5a99c8f8276695c4f4336291c1003000000000000000000000000000000000000000000000000000000000000000000030f1b27333f4953606d7984919eaab3a99c8f8276695f5346382d22170b0000000000000000000006121f2b3844505b6673808d99a7b1bccfd8d3c6baada2978b7f72665b5044382b1f120500000000000000000000000714202d3946525e687683909da9b6c2cdd7cbc0b5ab978a7d7164574a3e2f24190d010000000000000000000000000000000000000000000004111d2935414c566773808d9aa6b3c0d0d4c8bcb1a7998c7f7366544b4034281c10040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010407070907060400000000000000000000000000000000000000000000000000000000000000000000000204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798693a0b5c0ccd7c9bdb0a3968a7d7063574a3d3024170a00000000000000000000000000000000000b1824313e4b5764717e8a97a4b1bdcad2c6b9ac9f938679665c5044382c1f1206000000000713202c38444f5963707d89939ea9b2bcbeb3a99d9083786c60564d423a322c2823272b2f353e44505b66717d8a95a0acb8c5bbb1a79f92867b6e61564c41362a1e13080000000000000000000000000003090e121415181a1a191613120f0b0600000000000000000000000000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a9b3becad2c5b8ac9f92867a6d60554b40342b221c1817151e29323c46505a626d73808d939ea6b0bbc5c9c5c4baaea2988d80786d675f585049413e3a393e444d52545653504a423a32281e0e0500000000000000000000000006121e2b37424d5766727f8c99a7aea3998b7e7164554b4135291d11040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e272e34383a4243424140403f40404143443c3b38322b22190f04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2becbcfc2b5a89c8f8275695c4f4236291c0f03000000000000000000000000000000000000000000000000000000000000000000000b17222d3844515c66737f8c98a3aeac9f93877b6e61544a3f33281c0f030000000000000000000613202d394653606c7884919eabb8c2cdd7ccc0b5ab9f9285796d60544a3f33281c0f0300000000000000000000000814212e3b4754616e7a87939facb9c6d2d4c7bbafa399887b6f6255483c2f2215080000000000000000000000000000000000000000000000010d19242f3d4a5764707d8a97aab3becad6cdc2b6aa9d908377665c5145382c1f13060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040607090d0e0f10111110100e0c09060603000000000003060706050300000300000406070604000000000000000000000000000000000714202d3a4753606d7a8693a0adb9d2ddcabdb0a3978a7d7064574a3d3124170a00000000000000000000000000000000000b1825313e4b5864717e8b97a4b1becad4c8bbafa49a86796d6053463a2d201307000000000916222f3c4854606b7683909ca5afbbc4b9ada1978a7e71655b50443b3028201c181b1f2429333f4a54606c7883909dabb5bfc2baaea3988d8074685e52463a2f24190d0100000000000000000000040a0f141a1e21222527272623201f1b17110a020000000000000000000000000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5b2bfcfcec2b5a89b8f8275685d5243392f2219100c121c27303a444e58616c727f8b929da5afb8c2c4bdb9b8b4ac9f92857b6e665d554e443f382f2d2d323b4146474946443f38302820160c00000000000000000000000000020e1a26313c4855616e7b88959fabab9b8f8275675d5145392c201307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d2730394045464f504f4d4d4c4c4d4d4e4f504948433d342b21160a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1becbcfc2b5a89c8f8275695c4f4236291c0f030000000000000000000000000000000000000000000000000000000000000000000006111b2834404a54616d7a86929facafa49a8c8073665b5044382b1f1308000000000000000005111d2935414c5663707d8996a1adb9c5d4d4c7bbafa4998d8073675d5142382d22170b0000000000000000000000000b1724313e4a5764717d8a9aa4afbbc8d4d2c5b9ac9f9286796d6053463a2d2013070000000000000000000000000000000000000000000000000814212e3b4754616e7a8798a2aebac6d3d2c5b9ac9f9286796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080a0d0e0f101111100f0d0a070705010000000000000000000000000000000000000000000000000000000000000000000000000000020507080f0f0909070300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004070c10131316191b1c1d1d1e1d1c1b191613120f0b0600060c10121313120f0b060f070c10121312100c0700000000000000000000000000000714212d3a4754606d7a8793a0adbac6d3cabdb0a3978a7d7064574a3d3124170a00000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbd8ccc0b6a093867a6d6053473a2d20140700000007131f2c38434f5963707d89949fabb7c1c5b8ab9e9285796d6053493f32291e16100c0f1218222d3844505b65717e8a99a3aebbc7bfb4aa9f92867a6e61554c4135291d1104000000000000000000070e151b1f262a2d2e323334322f2d2b27221b140b0600000000000000000000000000000000000000000000000000000000000000000000000000000d1a2734404d5a6773808d9aa6b3c0cdcbbfb2a5988c7f7265564c4131271d10071018232e39424c565f6a717e87939fa4aeb7c1c4bab2adaba7a9a2989082786d60594f443a30262020293036393b3d3a38342e261e160d0400000000000000000000000000000915212d3a46535f697683909dacac9f92867a6d6054473a2f24180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232e39424b51535c5d5b5a5a5959595a5b5c5d56544e463d32271b0f030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcec2b5a89b8f8275685c4f4235291c0f0200000000000000000000000000000000000000000000000000000000000000000000000c18232e3946525e6874818e9ba6b0ac9e9184786c6053463a3024190d01000000000000000713202d3946525d6875818e9ba8b2bdc9d5d2c6b9ac9f93877b6e61554b402f261c11060000000000000000000000010d1a2734404d5a6773808d9aacb6c0ccd8d1c4b7aa9e918477675c5145382c1f13060000000000000000000000000000000000000000000000000714202d3a46525e697885929fabb8c5d2d3c7baaea399887c6f6255493c2f221609000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010406090e11141417191b1c1d1e1d1c1b1a171413110d08040000000000000000000000000000000000000000000000000000000000000000000003090e1214151b1b1615130f0a040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c1013181c1f2023262728292a2b2a29272523201f1c17110f11171c1f20201f1b171c1c1d181c1f201f1c18120b030000000000000000000000000714212e3a4754616d7a8794a0adbac7d3cabdb0a4978a7d7164574a3e3124170b00000000000000000000000000000000000c1825323f4b5865727e8b98a5b1becbddd2baada093877a6d6054473a2d2114070000000915222f3b4854606b7683909ca6b0bcccc0b6ac9b8e8175665c5041382d20170c04000307111c27333f4953606d7a86929facb9c5c6baaea2988d8073675d5145392c201306000000000000000009101920272b31363a3b3f40403f3c3937332d261d17110a020000000000000000000000000000000000000000000000000000000000000000000000000d1a2734404d5a6773808d9aa6b3c0cdc9bcafa396897c706356493d2f23150b0e19232834404a545e686f7c869299a4afb6c0c5bbb2a8a19e9b9da59f948c80736b60564c4135291f171f252a2d2e302d2b28231c140c0400000000000000000000000000000005121e2a36424d5765727f8c9aa4aea3988a7e7164554b4035291d100400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b545c60686a6867666666666667696a6260584e43382c1f13070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1becacec1b5a89b8e8275685b4f4235281c0f02000000000000000000000000000000000000000000000000000000000000000000000007121c2a36414c56626f7c88949fabada196897d7063564c4135291d1104000000000000000714212e3a4754616d7a86929facb9c4cfd4c8bcb1a79b8f8275695f5343392f1d140a00000000000000000000000005111d2a36414c56697683909ca9b6c3d2ddcec2b5a89b8f827568554b4034281c100400000000000000000000000000000000000000000000000005111e2a36424d566a7783909daab6c3d0d7cbbfb4ab988b7e7165584b3e322518060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003070d1113141a1e2021242628292a2a2a2928272421201d1913100c0700000000000000000000000000000000000000000000000000000000000000060e141a1e2122282823221f1b16100b0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b12181c1f23282c2d30333435363737373634322f2d2b28221c1b1c23282c2d2d2b272229292923282c2d2c28231c150c0800000000000000000000000814212e3b4754616e7a8794a1adbac7d4cabeb1a4978b7e7164584b3e3125180b00000000000000000000000000000000000c1925323f4c5865727f8b98a5b2becbd3c7baada094877a6d6154473a2e211407000000091623303c4956636f7c89949fabb8c2c8bbafa49a8b7e7164544a3f2f261b0e05000000000b17222d3845515d6776838f9ca9b6c2cabfb4aa9f92867a6d6054473a2d2114090000000000000009121b222b32373b4246484b4d4d4c4946443f382f28231c140c0200000000000000000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5b2bfd1c7bbaea194887b6e6155483b2e22150b16202b353d44515c666d7a849198a2abb5c0c5bcb3a9a196918e939da69f93877d70685e52463e31281e14191e202123201f1c17110a0200000000000000000000000000000000020e1a26313b4854616e7b87939facaa9b8e8275675d5145392c1f130700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c666d7576757473737273737476776f6a6054483b2e2215090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1becacec1b5a89b8e8275685b4f4235281c0f020000000000000000000000000000000000000000000000000000000000000000000000000d1925303a47535f6a76838f9ca8b2a89b8e8175685d5245392c20150a00000000000006131f2b37434e5865727f8b98a3aebac7d6d1c5b8aca095897d7063574d4231281d0b020000000000000000000000000713202d3946525e687985929facb8c5d2dacdc0b3a79a8d8074675a4d412e23180c00000000000000000000000000000000000000000000000000020e192530424e5b6875818e9ba8b4c1cedcd1c1b4a79a8e8174675b4e412d22170b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c1013181d2021252a2d2e30333535363737363534312e2d29241f1c18120b0300000000000000000000000000000000000000000000000000000000060f181f262a2d2e3535302f2c27211c160f0a04000000000000000000000000000000000000000000000000000406070b0b090807050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171d23282c2e34383a3c4041424344444343413f3c3938332d2c27262e34383a3937332d3636362e34383a38342e271e1a1208000000000000000000000815222e3b4855616e7b8894a1aebbc7d4cbbeb1a4988b7e7165584b3e3225180b00000000000000000000000000000000000c1926333f4c5966727f8c99a5b2bfccd4c7baaea194877b6e6154483b2e211508000005111e2a36414d566773808d9aa6b0bccbc6b9ac9f93867a6e6154473b2e21140a000000000006111b2935414c5565727f8c98acb6c0ccc6baaea2988a7d7064574a3d31261a0e02000000000008121b242d343c43474d5355585a5a5956535049413e342e261e140a00000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97abb5bfcbc6baada093877a6d6054473a2d2114141d28323d47515b606d78829096a1aab4bdc6bdb4aaa2979184818e96a1a49991847a6d615a50433a2f24190d111414161312100b06000000000000000000000000000000000000000914202d3a46525e697683909cabac9f9286796d6053473a2f23180c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7981838280807f7f80808182837c6f6256493c2f2316090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1becacec1b5a89b8e8275685b4f4235281c0f0200000000000000000000000000000000000000000000000000000000000000000000000008131e2b37434e5864707d8a96a1acac9f92867a6d6054473c31261b0f0000000000000815212e3b47535f6a7783909daab4bfcbd6cabeb3a99d9184776b6054453b311f160c000000000000000000000000000714212e3a4754616d7a8798a2aebac6d3d9ccc0b3a6998d8073665a4d4033271a070000000000000000000000000000000000000000000000000000091a2733404d5a6673808d99a6b3c0ccd9d0c3b6aa9d9083776a544a3f33281c0f030000000000000000000000000000020500000000000000000000000000000000000000000000000001080d11171c1f24292c2d30363a3b3d4041424344444342403d3a3935302c28231d150c080100000000000000000000000000000000000000000000000000060f18212a31363a3b42423c3b38322c27211b150d0701000000000000000000000000000000000000000000070c1012131818161414110e080705020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050c141c23282e34383a404546494c4e4f505051504f4e4c4946443f38383230383f444646443f4342424343404446444039302c241a10050000000000000000000915222f3c4855626f7b8895a2aebbc8d5cbbeb2a5988b7f7265584c3f3225190c00000000000000000000000000000000000d1a2733404d5a6673808d99a6b3c0ccd4c7bbaea194887b6e6155483b2e22150800000714202d3946525e687783909daab7c2cdc4b7ab9e918478685e5246392d2014020000000000000d19242f3c4955626f7c889aa4afbbc8cabfb4aa9a8d817467574d42362a1e120500000000050e1a242d363f464e54575f616566676562605b5350443f3830261c1106000000000000000000000000000000000000000000000000000000000000000000000a1723303d4a5663707d8999a3aebbc7c6baada093877a6d6054473a2d21141b262f3a444f59626d74808d949fa8b2bcc6beb4aba29892857c7984919ea6a1968e81756c61564c4135291f150b07080a07060300000000000000000000000000000000000000000005121e2a36424d5765727f8b99a4aea2988a7d7164554b4034291c100400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b88908e8d8d8c8c8c8d8e8f8b7e7265584b3f3225180c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1becacec1b5a89b8e8275685b4f4235281c0f02000000000000000000000000000000000000000000000000000000000000000000000000020f1b26323c4653606c7884919eaaaea3988b7e7265584e43372b1c11060000000004101c2834404b55626f7c8895a0acbcc6d1d3c6baada2978b7e7265594f4433291f0d04000000000000000000000000000916232f3c4956626f7c8995aab4bfcad6d8ccbfb2a5998c7f7266594c3f3326190c00000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5b2bfccd8d2c5b8ab9f928578665b5044382b1f120600000000000000000000010406070f110c07060400000000000000000000000000000000000000040c13191c23282c2f35393a3e4246474a4c4e4f5051504f4e4d4a4746413a38342e271e19130c040000000000000000000000000000000000000000000000030d17212a333b4246484e4e4948433d38332b262018130c04000000000000000000000000000000000000030b12181c1f2025242321201e191514120e09040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f171e262e34394045464b515356595a5b5c5d5e5d5c5a585653504a48433d3a424a50535350494f4f4f50504a5153514a423e362c22170b0000000000000000000916232f3c4956626f7c8995a2afbcc8d5cbbfb2a5988c7f7265594c3f3226190c00000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdd5c8bbaea295887b6f6255483c2f22150900000814212e3b4754616e7a8795a0acb8c5cfc2b6a99c8f837669564c41362a1e11050000000000000814202d3a4753606d7a86939facb9c6d0c4b7aa9e918477695f53463a2d211407000000020d17202c363f4850586062696e727373726f6c65615a504a42382e23170b050000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a86929facb9c5d1bbafa295887c6f6255493c2f2217222d38414c56606b727f8b929da6b0bac4c0b6aca39992867c6f707d8a949ea89e938a7d70685d52453d31271d12070000000000000000000000000000000000000000000000000000020e1a25303b4754616e7a87939facaa9b8e8175675c5145382c1f130700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a87949b9a99999999999a988b7e7165584b3e3225180b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f1c28333f4a5464717e8b97a4b1becacec1b5a89b8e8275685b4f4235281c0700000000000000000000000000000000000000000000000000000000000000000000000000000a151f2b3844505b66727f8c98a2aeaa9d9083776a5f5347382e23170c0000000006131f2c3845515c6774808d9aa7b1bccfd7ccc0b5ab9f9285796d6053473d3320170d00000000000000000000000000000b1724313e4a5764717d8a97a4b0bdd0dbd8cbbeb2a5988b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1becbd8d2c6b9ac9f9386796c605346392d201306000000000000000001070d1113141c1e191413100c07010000000000000000000000000000010a0d161e24292e34383a4145474a4d525457595b5c5d5d5d5c5b5a5754524c464540393029241e160d040000000000000000000000000000000000000000000009141f29333b454d53555b5b56544f48443d373129241d160d0801000000000000000000000000000000030c151c23282c2d3231302e2d2a2522211e1a14110d080300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f18212930383f444b5153545c6063666768696a6a6a69676562605b54544f48434c545c60605b535c5c5c5c5d545c605c5450483e33281c100400000000000000000a1623303d495663707c8996a3afbcc9d4ccbfb2a6998c7f7366594c403326190d00000000000000000000000000000000010e1b2834414e5b6774818e9aa7b4c1cdd3c8bbafa295887c6f6255493c2f22160900000b1825313e4b5864717e8b97a7b1bcc8cdc1b4a79a8e8174675b4e413025190d0100000000000006131f2c3945515d677784919eaab7c4d1c5b9aca096887b6e6155483b2e22150800000008141f29323e48505a626a6f767b7e80807f7c78716c605c544a3f342821160b0000000000000000000000000000000000000000000000000000000000000000000613202c3945515d6776838f9cabb4bfcbbdb0a3978a7d7064574a3d30242027333f49535e686f7d87929fa4aeb8c2c3bbafa49a92877d706a6c75828f98a2a59e91847a6d60594f43392f23180c0300000000000000000000000000000000000000000000000000000914202d3946525e6876838f9cabab9f9285796d6053473a2f24180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a8794a0a7a6a6a5a6a6a4978a7e7164574b3e3124180b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d1a232b3844505b66717e8b98a4b1becbcec1b5a89b8e8275685b4f422f24180d0300000000000000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a54606d7a86929facab9f95887c6f62544a3f34281c10030000000713202d3a4653606d7985929fabb8c3cdd4c7bbafa4998d8073675d5145392c20130600000000000000000000000000000c1925323f4c5865727f8b98a5b2becbd8d7cbbeb1a4988b7e7165584b3e3225180b00000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1becad7d4c7bbafa499877a6d6054473a2d21140700000000000000040c13181d2020282b25201f1d18120d08020000000000000000000000000a131c1f282f35383f44464b515457575e6163666868696a6a69686764615d5653514b423e352f281f160d030000000000000000000000000000000000000000020e1a26313b454d575f616868636059544f47433c352f281f19130c0400000000000000000000000000000b151e272e34383a3e3e3c3b3936302e2d2a26201d1913100b0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061018212a333b424a50545c6065666d6f737475767777767674726f6c66636059554f555d666d6c656969696969696b666d66615a5044392d21140800000000000000000a1724303d4a5763707d8a96a3b0bdc5c7cbc0b3a6998d8073665a4d4033271a0d00000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1c5c7cbbcafa295897c6f6256493c2f23160900020e1b2835414e5b6874818e9ba7b4c1cecbbfb2a5988c7f7265594c3f322619080000000000000004101d2935404b556975828f9ca8b5c2cfc8bdb2a8988b7e7165584b3e3225180b0000020e1925303b44505a626c717c82888b8d8d8c89847e746d665c50443d32271c1002000000000000000000000000000000000000000000000000000000000000000004111d2935414b5566727f8c99a3aebac7bfb2a5988c7f7265564c41352928323a44505b656d7a849199a3aeb7c0c3bab0a69f93887e716b60616e7b86929faaa1968e81746b60554b4034291f1409000000000000000000000000000000000000000000000000000005111e2a36414c5665727e8b99a4aea2988a7d7064554b4035291d1004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0b4b3b2b2b3b0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b151f2a36414d56606c7883909da9b6c3d0cec1b5a89b8e827568554b4135291f140900000000000000000000000000000000000000000000000000000000000000000000000000000b17222d3845525d6874818d9aa4afa79a8d8073665c5044382c1f1308000005121e2a36424d5764717e8a97a2adbac6d5d2c6b9ac9f93877b6e61554b4035291d100400000000000000000000000000000c1926333f4c5966727f8c99a5b2bfccd8d7cabdb0a4978a7d7164574a3e3124170b00000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdcad6d7ccc0b5ab94877b6e6154483b2e211508000000000000040d161d24292c2d3538322d2c29241d19130d080200000000000000000007111c252e313a41454a5053555d606468696e70737475767777767573706d6864605c545045413a31281f150b020000000000000000000000000000000000000005121e2a36424d575f696e75756f6b636059534e45403a3129241e160d0700000000000000000000000007121c2730394044464b4b494746413e3b3a36312c29241f1c17110c0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c18222a333c454d545c60666d7276797c7f81828383848382817f7c79746f6b6361595d676d797977767675757676777979716c6155493c3023160a00000000000000000a1724313d4a5764707d8a97a3b0b8b9bbc0bdb3a69a8d8073675a4d4034271a0d01000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5b8b9bbbfbcafa396897c706356493d3023160a0003101d293643505c6976838f9ca9b6c2cfcabeb1a4978b7e7164584b3e3125180b00000000000000000c18242f414e5b6774818e9aa7b4c1cdcebfb2a6998c7f7366594c403326190d000005111e2a36414d56616c717e878f9498999a9896918a80786d60594f44382c1f14080000000000000000000000000000000000000000000000000000000000000000010d18242f3b4754616e7b86929fabb5c0c2b5a99c8f8276685d52463a2f303a444f59606c77828f96a1abb5bfc5bcb1a89e938c7f736c61595e6973808c98a2a99d93897d70675c51453b30251a0b0200000000000000000000000000000000000000000000000000010d1925303b4754616e7a86939facaa9b8e8175675d5145392c1f1307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c798698a3aebabfbfbdb0a3968a7d7063574a3d3024170a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d27313946525e68727f8b959fabb8c4d1cec1b5a89b8e8275675d51453c31261a0c030000000000000000000000000000000000000000000000000000000000000000000000000006111c2935414c56626e7b87939facab9e9285796d6053463a3025190d01000714212d3a46535e6976828f9ca9b3becad4c8bdb2a89c8f8275695f5343392f24180d0100000000000000000000000000000d1a2633404d596673808c99a6b3bfccd9d6c9bdb0a3968a7d7063574a3d3024170a00000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc9d6ddd2bbafa295887c6f6255493c2f2216090000000000020b161f282f35393a42443f3a38352f29241e19130c0700000000000000020d18232e373f434c51545c6064676d7175787b7d7f81828384838281807d7a77716d66625a514c433a31271d140a000000000000000000000000000000000000000714212d3a46535f696e7b81817c76706b625f58514b433e352f281f19100900000000000000000000000c18232e39424a515358575654524c4b4846423b39352f2b28231c17110b0600000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e2a343c464e575e666d71797e8285898c8d8e8f9091908f8d8b8985817c77706b61606d7a8586848382828283838485867e7164574a3e3124170b00000000000000000b1824313e4b5764717e8a97a4aaabacafb5b0b2a79a8d8174675a4e4134271b0e0100000000000000000000000000000003101d293643505c6976838f9ca9aaabacaeb5b0b0a396897d7063564a3d3023170a0003101c28343f4a546a7784909daab7c3d0cabdb0a4978a7d7164574a3e3124170b0000000000000000071a2734414d5a6774808d9aa7b3c0cdcdc0b4a79a8d8174675a4e4134271b0e00000714202d3946525e68717e8a92999fa6a6a6a8a09e928d80736b6054483b3025190e0200000000000000000000000000000000000000000000000000000000000000000714202d3a46525e6974818e99a3afbbc4b9ac9f92867a6d61554b413535414c56606b727f8c949ea8b2bdc6beb3aaa0958f82776c605a5057616d7a86929faba59e9184796d60574d42362a1d140a00000000000000000000000000000000000000000000000000000814202d3946525e687683909cacac9f9285796d6053473a2f24180d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3744505b657986929facb9c5c9bcb0a396897d7063564a3d3023170a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b18242f39434f59616e7b85929fa7b1bcc7d4d1c4b8ab9e91857a6d60574d42372b1e150b00000000000000000000000000000000000000000000000000000000000000000000000000000d19242f3a47535f6a76828f9ca8ada1978a7d7064564c41362a1e1105030f1b27333f4953616e7b87939facb9c5cfd1c5b8aca096897d7063574d4231281d12070000000000000000000000000000000d1a2734404d5a6773808d9aa6b3c0cdd9d6c9bcb0a396897d7063564a3d3023170a00000000000000000000000000000000000000000000000000000916222f3c4955626f7c8895a2afbbc8d5d6c9bcafa396897c706356493d3023160a00000000000a141d28313a4045474f514c4745403935302a251e18120b03000000000006121e2a353f4951555d60666d71757a7e8285878a8c8e8f9090908f8e8d8a86837e79716c605d554c43392f261b1106000000000000000000000000000000000006121e2b37424d57616e7b848e8e89827d766f6a605d555045413a312b221b120600000000000000000004101c2834404a545c60656463615e565855534d4745413a38342e28231c17110a02000000000000000000000000000000000000000000000000000000000000000000000000000007121c27303c464e585f696e787e848b8f9298999a9b9c9d9d9d9c9a9897928e89837d766e696e7b879291908f8f8f8f9091928c807366594d4033261a0d00000000000000000b1825323e4b5865717e8b989d9d9e9fa3aba3a5a79b8e8174685b4e4135281b0e0200000000000000000000000000000004101d2a3743505d6a7683909d9c9d9e9fa3aba3a5a3978a7d7064574a3d3124170a0006121f2b3844505c667885929eabb8c5d1c9bdb0a3968a7d7063574a3d3024170a00000000000000000d1a2633404d596673808c99a6b3bfcccec1b5a89b8e8275685b4f4235281c0f00030f1b27333f4953616e7b86929fa3abb0b3b3b2aca49d92897d7063564d41362a1e1105000000000000000000000000000000000000000000000000000000000000000005111e2a36424d57616e7b87929fa8b2bebbaea3998c7f73675d51453d3b46525e686f7d87929fa6b0bac4c0b6aca2989183796d655b5046525e6874808d99a3aca0968c7f73695e52463d2f261c11060000000000000000000000000000000000000000000000000005111e2a36414c5665727f8b9aa4aea2988a7d7164554b4035291d1104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27333f495f6c7885929fabb8c5c9bcafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d2935404b55616b75818e97a2adb9c2cdd8d2c6b9ada1978d8073695f53463d30271c12070000000000000000000000000000000000000000000000000000000000000000000000000008131e2b37424e5763707d8a96a0aca99b8f8275685e5246392d20150a05121f2b3744505b65737f8c99a4afbbc7d6cabeb4aa9d9184786c6053463b3120160c010000000000000000000000000000000e1a2734414d5a6774808d9aa7b3c0cddad6c9bdb0a3968a7d7063574a3d3024170a00000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4d6c9bcb0a396897d7063564a3d3023170a0000000006111b262f3a434b51535b5e5853514b46413a363028231d150c0a040000000a16222e3a46515b63676d72797e82868a8e929796999b9b9c9d9d9c9b9a9a93908b847e756d675d554b41382d22170b01000000000000000000000000000000000814212e3a47535f6976828f969b948f89837c736d67615a514c433c342c2417110a020000000000000006121f2c3844515c666d71716f6e686864615f5754524c46443f38342e27221b140b07010000000000000000000000000000000000000000000000000000000000000000000000000c18232e39424e585f6a6e7b838b91969c9fa2aaa7a8a9aaaaa9a9a7a9a19e9b95908a827b706d7a87939e9c9c9c9c9c9c9e998c7f7266594c3f3326190c00000000000000000c1925323f4c5865727f8b9190909192999596989a9b8e8175685b4e4235281b0f0200000000000000000000000000000004111e2a3744515d6a7784909090909192999496989b978a7d7164574a3e3124170b000713202d3a4653606d7886939facb9c6d2c9bcafa296897c6f6356493c3023160900000000000000000c1926323f4c5965727f8c98a5b2bfcbcfc2b6a99c8f8376695c504336291d100005121f2b3744505b6574808d98a2aeb5bdc0c0bdb9aea49c908376685e5246392d2014070000000000000000000000000000000000000000000000000000000000000000020e1a25303b46535f6974818d96a1acb6bfb5ab9e92857a6d60594f4545515b616d7a849199a3afb8c2c5bbafa49a92867c6e675d5349414c56616e7b86929faca89f92867b6e61594f42382d22170b01000000000000000000000000000000000000000000000000020e1925303b4854616e7b87939facaa9b8e8275675d5145392c201308000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222d45525e6b7885919eabb8c4c8bbafa295887c6f6255493c2f2216090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c262f3845515d67707d8a939ea9b3becbd4cfcac6beb3a99f92867b6e61594f42392e23180c02000000000000000000000000000000000000000000000000000000000000000000000000010e1a26313c4653606c7884919da9ac9f92867a6d6154473c32271b0f0613202d394653606c7884919eabb5c0ccd3c6baaea2988b7f72655b5044372b1f1204000000000000000000000000000000000d1a2733404d5a6673808d99a6b3c0ccd9d6cabdb0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1adbac7d4d5c9bcafa296897c6f6356493c30231609000000000b17222d38414b555d60686b65605d55524c46413a342e271e1b150c0700000c1825323e4b57636d727a7f848a8f92989b9ea1a9a6a7a8a9aaaaa9a8aca49f9d97918b81796d675d53493f33271d1307000000000000000000000000000000000815222f3b4855626e7b88949fa69f9c9490878079706c605d554e463e3628221c140b020000000000000713202d3a4653606d787e7e7c7a7774716e6965605d5653504a443f38332d261d18120c040000000000000000000000000000000000000000000000000000000000000000000004101c2834404a545f6a6f7c8490959ea1a8acaeb4b4aeaca8a4a2a1a0a1a3a6a7a09d948f857d71798698a3a9a9a8a8a9a9a5988b7f7265584c3f3225190c00000000000000000a1723303d4a5663707d85848384858687888a8b8d8f8f8275685c4f4235291c0f02000000000000000000000000000000000d1a2633404d596673808584838485868788898c8e908a7e7164574b3e3124180b000814212e3b4754616e7a8799a4afbbc7d4c8bcafa295897c6f6256493c2f23160900000000000000000b1825323e4b5865717e8b98a4b1becbd0c4b7aa9d9184776a5e5144372b1e11000613202d394653606c7885919eaab4bfc6cfcec8c0b9ac9f93877a6e6154473b2e21140800000000000000000000000000000000000000000000000000000000000000000009141f2b37424d57606d7984919aa4afbbb9ada1978d80746b60574d4d57626d75828f96a1abb5c0c5bcb1a79f93887e706a5f554c413a46535e6974818e9aa4aea2988e81756b60544a3f33281e1308000000000000000000000000000000000000000000000000000814202d3a46525e697683909da9ac9f92867a6d6053473a2f24190d01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061e2b3844515e6b7784919eaab7c4c8bbaea295887b6f6255483c2f221509000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222d38424e58606d7984919ea5afbcc5d0cdc5bebab8baaea3998f82756b60544a4034281e13080000000000000000000000000000000000000000000000000000000000000000000000000009151f2b3744505b65727f8b97a2ada3998c7f7265584e43372b1d12111d2935414c5663707d8996a1acbdc7d2ccc0b6ac9f92857a6d6053493f33271b0f03000000000000000000000000000000000d192633404c5966737f8c99a6b2bfccd9d7cabdb1a4978a7e7164574b3e3124180b00000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc7d4d5c8bbafa295887c6f6255493c2f221609000000030f1b27333f49535d676d7577726d67615d56524c454039302b262018120b030c1926333f4c5966727f858c91969c9fa3aaabadb3afb0b2b5b7b6b5b4b6afaca9a19e938e83796d655b50443a2f24180d010000000000000000000000000000000815222e3b4855616e7b8690959fa4a69f99928d847d756d676058504840332d261d140b0200000000000815222f3b4855626e7b888a898784817e7b76726d6863605c54504a443f382f29241d160d0600000000000000000000000000000000000000000000000000000000000000000006121f2c3844515c666f7c859196a0a7acb2b8baafaaa39f9b979695949596999da0a69f9792877e7986929facb5b5b5b6b1a4988b7e7165584b3e3225180b00000000000000000916222f3c4854606b707877767778797a7b7d7f818284807366594d4033261a0d00000000000000000000000000000000000c1926323f4b57636e737877767778797a7b7d7f8183847c6f6255483c2f221509000714212e3a4754616d7a8799a3aebbc7d3c9bcafa396897c706356493d3023160a00000000000000000b1824313e4b5764717e8a97a4b1bdcad0c3b7aa9d9084776a5d5144372a1e11000815212e3b4854616e7b8797a1adbcc6d0d8d9d4c8bbafa49a8a7d7063574a3d3024170a000000000000000000000000000000000000000000000000000000000000000000020e1a26313c45515d67707d88939fa5afb8b3a99f93877d70695f57545f69727e8b949ea8b2bdc7beb3a99f958d80736c61574e433a36424d57626f7c87939facaa9e93897c6f665b50443a2f24190d0300000000000000000000000000000000000000000000000005121e2a36424d5765727f8c98a7aea3988a7e7164564c4135291d1104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111e2b3744515e6a7784919daab7c4c8bbaea195887b6e6255483b2f221508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040f1c28333f4a545f6a73808d96a1acb7c1cec9c1bbb3adabadb3ab9e94897d70665c51443a3025190d04000000000000000000000000000000000000000000000000000000000000000000000000030f1b27333f4953606d7985929fabab9d9083776a605447392e231813202c3945525d6875818e9ba8b2bdd0d4c8bbafa49a8d8074675d5141382d22170b00000000000000000000000000000000000c1926323f4c5965727f8c98a5b2bfcbd8d7cbbeb1a4988b7e7165584b3e3225180b00000000000000000000000000000000000000000000000000000916222f3c4955626f7c8895a2afbbc8d5d6cabfb4aa95887b6e6255483b2f22150800000005121f2b3744505b656d7981847f79736d68615e56514b423e373228231d150c071e2b3844515e6b778491989ea1a8a6a5a4a3a2a2a2a3a5a9acafb5bdc0bbb9b2ada59e958f82776c60554b4035291d11040000000000000000000000000000000814212d3a47535f696e7c838d939aa1a9a39f96918a817a6f6a615a52443f382f261d140b02000000000814212e3b4754616e7a87949696918e8b88837e7a75706d66605c545049413c352f281f17110a0200000000000000000000000000000000000000000000000000000000000006121e2b37424e57606d78839097a1a8b1b9bdb5ada59e98928f8b89888788898c91959d9fa29992877d85929eabb8c2c2bdb0a4978a7d7164574a3e3124170b00000000000000000713202c38444f5960636b6b6a6a656c6d6f7072747678736e63574b3f3225190c00000000000000000000000000000000000a17232f3b47525c63666b6a696a6b686d6e70727476786f6a5f53473a2e211508000613202d394653606c7886929facb9c5d2cabdb0a3978a7d7064574a3d3124170a00000000000000000b1825323e4b5865717e8b98a4b1becbcfc2b5a99c8f8276695c4f4336291c10000916222f3c4955626f7c8895a9b2becbd7e2e4d8ccc0b6ac988b7e7165584b3e3225180b0000000000000000000000000000000000000000000000000000000000000000000009141f2935404b55606b73808c939da6b0bbafa49992857b6e695f5c666e7b86929fa6b0bac4c3baada2979083786d605a50453c31313b47535f6a75828f9ca9afa59d9083786c60564c413529201509000000000000000000000000000000000000000000000000020e1a25303b4854616e7b87959fabaa9b8f8275685d5245392c201308000000000000000000000000000000000000000000000000000000000000000000000000000000010203040404030100000004111e2a3744515d6a7784909daab7c3c7bbaea194887b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d1a232b3844505b666f7c87929fa8b2bdc9cec1b7afa9a29fa2a9b0a69d9184786d60564c41362a20150a000000000000000000000000000000000000000000000000000000000000000000000000000b17222d3845515d6773808d99a4aca095887c6f62554b4034281c14212d3a4754606d7a86929facb8c4ced2c6b9ac9f93877b6e62554b412f261b110600000000000000000000000000000000000b1825313e4b5864717e8b97a4b1bed1dcd9ccbfb2a6998c7f7366594c403326190d0000000000000000000000000000000000000000000000000000091623303c4956636f7c8996a2afbcc9d5d3c6baaea298877a6d6154473a2e2114070000000613202d394653606c77828e918b857f7a736d68605c545047433c342e271e18121d293643505c6976828f9ca29f9c9998979696959596989c9fa4abb0b8c1c4beb9afa79e948b7e71675d5145392c20130600000000000000000000000000000006121e2b37424d575f6a6e7980889196a0a7a8a19e938e847c716c635b504a42382f261d140a000000000714212e3a4754616d7a8794a8a09e9b9795908b86817d78716d66605b534e4540393127221b140b0300000000000000000000000000000000000000000000000000000000000814212e3a47535f6a737f8c95a0a9b2bac1b7ada39b938e86827e7c7b7a7b7d80848990959fa399928586929fabb8c5c9bdb0a3968a7d7063574a3d3024170a000000000000000004101c27333d474f54565f5e5d535b606162636567696b66635c52473b2f23160a000000000000000000000000000000000007131f2a35404a5257595e5d5d5d565d60616365686a6b625f584e43372b1f12060005121f2b3744505b657885919eabb8c4d1cbbeb1a4988b7e7165584b3e3225180b00000000000000000c1925323f4c5865727f8b98a5b2becbcec1b4a89b8e8175685b4e4235281b0f000815222f3b4855626e7b8898a3aebac7d3dcded5c9bdb2a9978a7d7164574a3e3124170b00000000000000000000000000000000000000000000000000000000000000000000030d18242f3a434f59636e74818e949ea6aeb5aba19791847b6e6a606d78839098a2aeb8c1c3baafa59f92857b6e665c50473e332a2b37434e5863707d8a96a1adaca0958b7e71685d52453c31261a0f020000000000000000000000000000000000000000000000000914212d3a46535e697783909daaac9f92867a6d6054473a3024190d010000000000000000000000000000000000000000000000000000000000000000000406070a0c0e0f10111110100e0c090806111d2a3744505d6a7783909daab6c3c7baaea194877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f2a36414d56606c78839099a3afbac4cec5bcafa59e979297a2adaca0958c7f72685e52463c32261b0d0400000000000000000000000000000000000000000000000000000000000000000000000006111b2935404b55616e7b87939faca79a8d8074675c5145382c1f1f2b37434e5865727e8b98a2aebac7d4c8bdb2a89c8f8276695f53433a2f1d140a000000000000000000000000000000000000091623303c4956636f7c8996abb5bfcbd7dacdc0b3a79a8d8074675a4d4134271a0800000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a96a3b0bdc9d6d2c5b8ac9f928579685e5246392d2013070000000b1724313e4a5764717e8a949e97928c85807a726d66615a534e4540393028231d1525323f4c5865727f8b9797928f8d8b8b8a898888898c8f93999fa6afb7c1c9c1b9b0a69e9185796d6053473a2d201406000000000000000000000000000000020e1a26313c454e585f666d737d8490959ea6ada59e9691877e736e605b544a42382f261c11060000000714212e3a4754616d7a8794a0acaaa7a79f9d98928e89847e78716c656058514b433c332d261d150d0500000000000000000000000000000000000000000000000000000004101c2834404a54626e7b86929fa7b1bbc4bcafa59b918b817a75716f6e6d6e7073777d838b9298a197929298a2aebac6c9bcafa396897c706356493d3023160a0000000000000000000b16212b353d44484a525150495053545557585a5c5e5957524940352a1f13070000000000000000000000000000000000020e19242e3740474b4d525150514c52545556595b5d5e55534e463c31261b0f0300030f1b27333f49536a7783909daab6c3d0cbbfb2a5988c7f7265594c3f3226190c00000000000000000c1926333f4c5966727f8c99a5b2bfcccdc0b3a69a8d8073675a4d4034271a0d000714202d3a4753606d7986929facb9c1cbd1d1ccc4b9ada196887c6f6255493c2f221609000000000000000000000000000000000000000000000000000000000000000000000007131d28313d47525c606d78828f949da4afb3a9a09691847c716c727f8c949faab4bfc6bdb2a89d938a7e71695e544a3f352c2126313c4653606d7984919eacb1a79e92857a6d60584e43372b1f120600000000000000000000000000000000000000000000000005121e2a36424d5766727f8c99a7aea3998b7e7164564c4135291d110500000000000000000000000000000000000000000000000000000000000205070c10121316191a1b1c1e1e1d1c1b191515120f1d2a3743505d6a7683909da9b6c3c7baada194877a6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d28313946525e68727f8b959fabb5c0cccabeb3a99e938e85929fa6b0a89f92857a6d61584e43372b1f160c010000000000000000000000000000000000000000000000000000000000000000000000000d18242f3946535f6975828f9ca8ab9f9285796d6053463b3025212e3a47535f6a7783909daab4bfcad2c5b9aca0968a7d7063574d4231281d0b020000000000000000000000000000000000000815212e3b4854616e7b8799a3aebbc7d3dbcec1b5a89b8e8275685b4f423024190d01000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0bdcad7d0c3b7aa9d9084776a564c4135291d11050000000e1b2834414e5b6774818e989ea19e98928d857f79706c625f58514b433d342e271e212d3a4754606d79858a888582807f7e7d7c7b7c7d7f82878f949ea5afbbc5cbc1b9ada1978a7e7164574b3e2d22170b0000000000000000000000000000000009151f2a333c464e545c606b707a838f949da5aea8a099928a80746c665b544a42382d2217110800000714212d3a4754606d7a8793a0adb7b4b1abaaa39f9b96918b847e786f6a605d554e443f382f271f170e06000000000000000000000000000000000000000000000000000006121f2c3844515c6674808d99a3aeb9c3bfb4aa9e938b7f756d68646362616263666b70767e869197a19e9fa2aab3becac8bcafa295897c6f6256493c2f231609000000000000000000050f19232b33383c3d4544433f444647484a4c4e4f514d4b4740372e24190e0200000000000000000000000000000000000007121c252e353b3f4045444344414547484a4c4e50514847433c342a20150a0000000b17222d434f5c6976828f9ca9b5c2d1ccbfb3a6998c807366594d4033261a0900000000000000000d1a2633404d596673808c99a6b3bfccccc0b5ab998c7f7266594c3f3326190c0006131f2c3845515d6775828f9ca5afbabfc4c5c1bab1a79e9184786c605346392d2013060000000000000000000000000000000000000000000000000000000000000000000000010c161f2b354044505c666d79828d929fa4abb2a8a09691857e757c87929fa6b0bcc6bfb4aba0968e81746c61574d42382e231a1f2b3844505c6673808d9aa4afada1978d80746a5f53473a2e211408000000000000000000000000000000000000000000000000020e1a25313b4855616e7b8895a0acab9c8f8275685d5246392d20130800000000000000000000000000000000000000000000000000000002080e1114181c1f2023262728292a2b2a29272522211f1b1d2a3643505d697683909ca9b6c3c7baada094877a6d6154473a2e211407000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b18242f39434f59616e7b85929fa7b1bdc7d0c7baada2978e817d8a949fabada2978e81746a5f54473e31281d120700000000000000000000000000000000000000000000000000000000000000000000000007121d2a36424d5764707d8a96a1ada2978a7e7164574d42362a2834404b54626f7c88959fabbcc6d0cabfb4aa9e9184786c6053463c3120160c000000000000000000000000000000000000000613202d394653606c7986929facb9c5d2dccfc3b6a99c90837669564c4135291d1105000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1becad7cfc2b5a89c8f8275695c4f423025190d010000000a1623303d495663707d868f949ea2a29f97928c847d766f6a605c554e4540393028232c3945515d676e7b7d7b7876737271706f6f6f7072767b828f939ea9b3becac9beb3a99b8f82756853493f33271b0f03000000000000000000000000000000030e18212a333c424b515960686e79828e939ca4aeaba39f928c81786c665b544a3f3328231a0e05000714202d3a4753606d7a8693a0adb9c1bcb8b4aeaca8a09e96918b837c746d67605850494139312920180f06000000000000000000000000000000000000000000000000000713202d3a4653606d7985929eabb4bfc6baaea2988e81756d605d5656555455565960636d727c859198a2abaeb3bcc5d0c8bbaea295887b6f6255483c2f2215090000000000000000000008111921272c2f3038382d3337393a3c3d3f414345403f3b352e251c120700000000000000000000000000000000000000000a131c242a2f32333837362f35393a3b3d3f4143453c3a37312a22180e04000000061a2734414d5a6774808d9aabb4bfcbcdc0b3a79a8d8074675a4d4131261a0e02000000000000010e1b2734414e5a6774818d9aa7b4c0cdc7bbafa4998a7d7164574a3e3124170b0004101d2935404b5563707d89939ea6aeb4b8b8b7b0a8a0958c7f72655b5044372b1f1205000000000000000000000000000000000000000000000000000000000000000000000000040d192328343f4a545d676d78808c9399a0a8aea8a197928a82839099a3aeb9c2c4baaea3999184796d605a50453b30261c101c28343f4a54616e7b87939facb3a99f92877c6e6255483b2f221508000000000000000000000000000000000000000000000000000914212d3a46535f697783909daaac9f92867a6d6154473a3025190d0100000000000000000000000000000000000000000000000002080e14191e2023282c2d30333435363737373634322f2e2b2620293643505c6976838f9ca9b6c2c7baada094877a6d6154473a2e2114070000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d2935404b55616b75818e98a2aeb9c2cfc7bdb1a79f92857a76828f99a3aea99f93877c6f625a5043392f24180d030000000000000000000000000000000000000000000000000000000000000000000000010e1a26313b4653606d7884919eaba99c8f8276695e52463a2d2c3845515c6674808d9aa7b1bcced3c7baaea2988c7f72655b5044372b1f12040000000000000000000000000000000000000006121f2b3844505b667783909daab6c3d0ddd1c4b7ab9e918478685d5246392d201307000000000000000000000000000000000000000000000000000c1926323f4c5965727f8c98a5b2bfcbd8ccbfb3a6998c807366594d4033261a08000000000916222f3b4854606b707b828b92979ea5a29f96918a827c736d676058514b423c342e2935414b555f696e716e6969666564636362626365696e78818f97a1adb9c6cfc4b7ab9e918478655b5044372b1f120500000000000000000000000000000000060f18212a303940454f565e676d78818c929ca4aeaea49c938e81786c665b50443f352b20170b020714202d3a4753606d7a8693a0adb9cdc7c6bfbab8b2aca8a09e95908780796f6a605b534b433b322a22180f060000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a1adbdc6c5b8ac9f92867a6d605b524c494847484a4f545b626a6f7c86929fa5afbcc5ced7c8bbaea195887b6e6255483b2f2215080000000000000000000000080f161c2022232c2b22272b2d2e2f303234363833322f2a241c130a000000000000000000000000000000000000000000010a12191f2326262b2a2a24292c2d2e30323537382f2e2b2620181006000000000a1724303d4a5763707d8a99a3aebac7cec2b5a89b8f827568574d42362a1e120500000000000004101c2834404a546976828f9ca9b5c2cfc6b9ac9f93867a6d6154473a2e21140700000c18242f394854606b75818e949fa3abababaaa69e969083796d6053493f33271b0f0300000000000000000000000000000000000000000000000000000000000000000000000000071117232e38424b555d666d747f8791969da4aca9a29f938e9095a0abb5bfc4bbb0a69f92867c6f675d51483e33291e150b17232e3846535f6976828f9caab4afa3998e8175685b4e4235281b0f0200000000000000000000000000000000000000000000000005121e2b37424d5766737f8c99a7aea3998b7e7165564c41362a1d11050000000000000000000000000000000000000000000002080d14191f252a2d2e34383a3d3f41424344444343413f3c3a37312d2b36434f5c6976828f9ca9b5c2c6baada093877a6d6054473a2d211407000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c262f3845515d67707d8a939eaab3becbccc0b5ab9f958b7f726e7b86929fa8afa4999083766c61554b4035291f140900000000000000000000000000000000000000000000000000000000000000000000000009141f2b3844505c6673808c99a3ac9f93877b6e6154473d322d3a4653606d7985929eabb8c3cdd2c5b8ac9f92867a6d6053493f33271b0f0300000000000000000000000000000000000000030f1c28333f4a546774818d9aa7b4c0ced9d2c5b9ada196877a6d6154473a2e211407000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0cdd4c8bdb2a8968a7d7063574a3d3024170a000000000713202c38444f5960696e767e858e939ea1a8a09e948f8780796f6a605c544e443f38302f3a434d575f6164615f575a58585756555556575f666d7a85929eabb8c5d1c5b9ac9f9286796c605346392d2013060000000000000000000000000000000000060f181e272e343d444d555d666d74808c929da6b0aea59d938e81786c605b51473d32291d140a0713202d3a4653606d798693a0acb9d2d4d0cbc7c4bdb9b2aca79f99938d847c726c655d554c443c342a21180f060000000000000000000000000000000000000000000004101d2935404b556875818e9ba9b3becbc0b5ab9a8e8174685d5245413c3b3a3b3d44485158606a707d89939eaab4bfcad6c7bbaea194887b6e6155483b2e221508000000000000000000000000050b101316171f1e171b1f202122242527292b2625231f19120a010000000000000000000000000000000000000000000000070e1317191a1f1e1d191d2021222326282a2b22211f1b150e0600000000000714202d3a4753606d7a86929facb9c5d1c4b8ab9e918578695f53463a2d21140700000000000006121f2c3844515c667784919eaab7c4d0c3b6a99d908376685d5246392d201307000007121d2c38444f59606d79828d92999d9e9e9d9a948f847b6e675c5141382d22170b00000000000000000000000000000000000000000000000000000000000000000000000000000006111c263039434b545c606d727d848d929da0a7aca59e9b9da0a7b1bdc6beb2a99e948b7f726a5f554b40362c21170c06111c2a36424d5764717e8a98a3aba49f918b7e7165584b3e3225180b00000000000000000000000000000000000000000000000000020e1a26313c4855626e7b8895a0acab9c8f8276685e5246392d201408000000000000000000000000000000000000000000040c13191e252a3036393b404446494c4d4e4f5151504f4e4c4847433c393733424f5c6975828f9ca8b5c2c6b9ada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222d38424e58606d7984919ea5afbcc5d0c7bbafa4999083786c6973808d96a1adab9f948a7e71675d51453b31261a0c03000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54616e7b87929faca4998c7f7266594f433836424d5764717d8a97a1adb9c6d4c8bcb1a79a8e8174685d5241382d22170b0000000000000000000000000000000000000000000b17222d3e4b5864717e8b97a8b2bdc8d4d5c9bdb2a896897c706356493d3023160900000000000000000000000000000000000000000000000005111d2a36414c56697683909ca9b6c3cfd2c5b9aca096877a6d6154473a2e2114070000000003101b27323d474f575e616c717a818a92979fa7a69f99928d837c736d665f58504a423b32313c454d53555755534d4d4c4b4a4948494a4d545d6774808d9aa7b3c0cdc7baaea399867a6d6053473a2d201407000000000000000000000000000000000000060c151d2328323b434b545c606e74808d949ea7b1afa59e938d80746d62594f443b2f261b110613202d3a4653606d798693a0b5c0ccd7dcd6d3cec9c4bdb9b1aba49f9691877f776d675e564e463c332a21180f050000000000000000000000000000000000000000000613202c3945515d677784919daab7c4c7bbafa399897c6f63564c4135302f2e2f32383f464e58606b74818e98a2aebac6d3c7baaea194877b6e6154483b2e21150800000000000000000000000000000407090a12060b0f1213141517191b1c1e1a1916130e07000000000000000000000000000000000000000000000000000002070a0c0d1211080d1113141517191b1d1e1515120f0a040000000000000613202c3945515d6776838f9cabb5c0cbc6b9ada197887b6e6155483b2e22150b0000000000000713202d3a4653606d7986929facb9c5c9bdb2a8998c807366564c4135291d1105000001101c27323d45515c676d7880868c909192908d89827a6e695e554b402f261b1106000000000000000000000000000000000000000000000000000000000000000000000000000000000a151e273139424a505b626b6f79818990959ea1a8aaa8aaacb1b9c3c0b6aca1978f82756d62584e43392f241a0f05000e1a26313b4753606d7a86929fa499938b7f726c62564a3d3124170b00000000000000000000000000000000000000000000000000000914212e3a47535f6a7784919daaac9f92867a6d6154473b3025190e0200000000000000000000000000000000000000070e161e252930363b4146474a515356595a5b5c5d5e5d5c5a5855534e4946443f424f5c6875828f9ba8b5c2c6b9ada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000000000000000000040f1c28333f4a545f6a73808d96a1acb7c1cec9beb3a99f93877c6f66606d7984919ea6b0a69e9184796d60574d42362a1e150a0000000000000000000000000000000000000000000000000000000000000000000000000b17232e3846525e6975828f9ca8ab9e9184776b605448393a46525e6975828f9ca9b3bec9d1c4b8ab9f95887c6f62564c412f261b11060000000000000000000000000000000000000000000615222f3b4855626e7b8896a0acb8c5d2dacfbeb2a5988b7f7265584c3f31251a0e0200000000000000000000000000000000000000000000000713202d3946525e687885929eabb8c5d1d1c4b7aa9e918477685e5246392d20130700000000000b16212b353d454d535a61686d757d8590959da5aba39f95918780796f6a605c544d443d35333c4246484a484642403f3e3d3c3c3c3d424c5564717e8b97a4b1becac7baaea39986796c605346392d20130600000000000000000000000000000000000000030b12182029313a424a505c606d78828f959fa8b2afa59d928b7f726b60564d41382d22170b121f2b3844505c66798699a4afbbc7d4e0d6d1cecdcec9c2bdb5afa8a099928c81796e685f584e453c332a21170d0400000000000000000000000000000000000000000714202d3a4753606d7a86939facb9c6c5b9ac9f9286796d6053473a2f24222122272c343d464f59616d7a86929facb8c5d2c7baada194877a6e6154473b2e21140800000000000000000000000000000000000005000003050607090a0c0e10120d0c0a0702000000000000000000000000000000000000000000000000000000000000000005040001040607080a0c0e101209080603000000000000000004111d2935404b5566727f8c99a3afbbc7c9beb3a9978a7e7164574b3e33271c0b0200000000000916222f3c4955626f7c8899a3afbbc7c5b9ada196897c706356493d3024190d010000000b16212934404b555c666d737b8083858584817c756d685e574d43392e1d140a0000000000000000000000000000000000000000000000000000000000000000000000000000000000030c151f2730383f44515960676d747d838a9196a1a8b2b7b8bcc3c8bbafa49a91857a6d615b51463c31281d120600000914202c3945515d6775828f9c9f93877e726d625a50453a2e211509000000000000000000000000000000000000000000000000000006121e2b37424e576673808c99a8afa3998b7e7265564d41362a1e1105000000000000000000000000000000000001091119202830353b41464d5254545c6063666768696a6a6a696765625f5856535049414f5c6875828f9ba8b5c2c6b9aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000000000000000000040d1a232b3844505b666f7c87929fa8b2bdc9cfc6b9ada1978d80746a605d67717e8a949fabada1968c8073695f53463d30261c1106000000000000000000000000000000000000000000000000000000000000000000000006111c2a36424d5763707d8a96a1aca096897c6f63554b403f4953616e7b86929facb9c5cfcabeb3a99d9083776a6054443a301d140a000000000000000000000000000000000000000000000814212e3a47535f697784919eaab7c4cedacec1b4a79b8e817468574d42362a1e120500000000000000000000000000000000000000000000000714212e3a4754616d7a8797a1adb9c6d2cabeb3a99a8d807467564c41362a1d11050000000000040f19232b333b424650565e616c707b838e939fa3aba7a099928d837c736d665e564f473f3431373a3b3e3b3a3631323130302f2f303c4956626f7c8995a2afbcc8c5b9ac9f928679665b5044382b1f1206000000000000000000000000000000000000000000070e171f2830383f44505c666d79839096a1acb9aea49f92877d70695e53493f33271f14101c28343f4a606c7986939facb9c6d2d2cbc5c1c0c3c6c8c7c0bbb2aba39f938f837a6e6a5f574d453c33291f160b02000000000000000000000000000000000000000916232f3c4956626f7c8999a4afbbc7c3b6aa9d908377675c514538281e1514151c222b343d46525e6875818e9ba8b4c1d1c7baada094877a6d6154473a2e211407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d18242f3b4855616e7b87929fabb5c0ccc0b4a79a8d817467594f44382c1d140a0000000005111d2935404b5566727f8c99abb5c0c9beb3a99e9184796d6053463a2d20130800000000050c18232f39434b545c60696e7376787877746f6b615e564d453b30271d0b02000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d151e262e343f474f555d606b70787e849196a1adb9c5c8cec6b9ac9f93887d70685e5245413a312b2217110a0204101d2935404b5565717e8b99958d80736c625b51483f34291d11050000000000000000000000000000000000000000000000000000020e1a26313c4855626f7c8896a0acab9c8f8376685e5246392d20140900000000000000000000000000000000010a131b232b323a41464c52565e6165666d70727475767777767674726f6a6762605b53504f5b6875828e9ba8b5c1c8bbafa49a86796c605346392d2013060000000000000000000000000000000000000000000000000000000000000000000000000000010c161f2a36424d56606c78839099a3afbac4cec6bdb0a69e91857a6d605855616c76828f99a3aea89f92867b6e61594f42382e23170c0200000000000000000000000000000000000000000000000000000000000000000000000e1a25303b4653606c7884919eaba89a8e8174675d514544505b65727f8c99a3afbbc7d3c6baada2978b7e7165584e4332281e0b020000000000000000000000000000000000000000000006121e2b37424d576773808d9aa8b2bdc9d5d0c3b7aa9d908477695e53463a2d2114090000000000000000000000000000000000000000000000091623303c4956636f7c8996a9b3bec9d2c6b9ada297897c706356493d3025190d01000000000000071119212931363e444c525a61696e79818b9299a1a9aba39f95908780786e68605951454039302d2e312e2d2a262525242322232f3c4956626f7c8995a2afbcc8c5b8ab9f9285786c5f4a3f33281c0f0300000000000000000000000000000000000000000000050d161e262e343f4a545d676d7a84919ea5afbbafa39992857b6e655b50443b31261a0e17232e46535f6c7986929facb9c5d2c8c0b9b5b3b6b9bbc0c7c3bdb5aea59e9590847c6e695f574d453b31281d140a000000000000000000000000000000000000000b1825323e4b5865717e8b98abb5c0ccc1b4a79b8e817468554b403429160c070b1019222a36414c5663707d8a96aab4bfcbc6baada093877a6d6054473a2d211407000000000000000000030606060300000104060709070604000000000000000000000000000000000000000000000000000000000000000000000000010507070707040100030303030304040505050000000000000000000000000000000714212d3a46535f6975818e99a4afbbc7c4b7aa9d9184776b6155483c2f261b11080300040c17212c3945515d6776828f9ca9b6c2c6b9ada1978b7f72665c5144382c1f1206000000000007121d273139424a50575f61666a6b6b6a67636059524c443b33291e150b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c141c2328343d434b515960656c717984919eabb7c4d2ccc1b4a79b8e81746d67615a514c433c3427221b140b030d18242f3a4754616d7a86929083796d605a51493f362d22180c010000000000000000000000000000000000000000000000000000000915212e3a47535f6a7784919daaac9f93877b6e6154473b30251a0e020000000000000000000000000000010a131c252d353d444c52565e61686e7275797c7f80818284848382817f7c77736f6c65615a545b6875818e9ba8b4c1c6b9ac9f938679655b5044372b1f1205000000000000000000000000000000000000000000000000000000000000000000000000000007121d28313946525e69727f8b959fabb5c0cccbbfb4ab9f948a7e71685d52505a626e7c87929fa9aea3988f82756b60544a3f34281e1308000000000000000000000000000000000000000000000000000000000000000000000009141f2b3844505b66737f8c99a3ab9f9285796d6053474653606c7884919eabb5c0cbd2c5b8ab9f9285796d6053473c3220160c0000000000000000000000000000000000000000000000020e1a26313c4956636f7c8996a1acb9c6d1d1c5b8aca095877b6e6154483b30251a0e0200000000000000000000000000000000000000000004101d2935404b5565727e8b98a5b1becfd1c5b8ab9e9285796d6053463a2d2013080000000000000000070f171f252a323a414650575e676d747f879197a0a7afa7a099928c827a706b635b514b423a322a2422211e1a191817161623303c4956636f7c8996a2afbcc9c4b8ab9e9185786b5e52452d22170b000000000000000000000000000000000000000000000000040c151c232e38424b555e68707d89939da9b2b5aba2978f82776c60574d42362a21161f2c3946525f6c7985929facb8c5cbc0b6aea9a7a9acafb6babfc6bfbbafa79f9691857b6e695f574d433a2f261b11060000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfd2c0b3a6998d8073665a4d402f23180d000007101925303b4754616e7a8798a3aebac7c6baada093877a6d6054473a2d21140700000000000000060b0f1213120f0b070d111314161413100c07010000000000000000000000000000000000000000000000000000000000000002080d1113141413110d08100f0f101011111212120c0b0905010000000000000000000005121e2b37424d57626e7b87939fabb5c0c5b8aca096897d7063584e41382d2219130f0c10161e28343f4a54606d7a86929facb9c5beb3a99e9185796d60544a4034281c10040000000000010b151f2730383f444d5355595d5e5f5d5a56544f46413a322921170c03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a1117222b313a40454f535e69727f8b96a1adb9c5c7c0bbb9ac9f93878079706c605d554e463f332d261d150c0713202d3946525e6876838f867c6f675c51483f372d241b11060000000000000000000000000000000000000000000000000000000006121f2b37434e586673808d99a8afa4998b7f7265574d42362a1e1205000000000000000000000000000009131c262e373f474f565e61686e747b7f8285898c8d8e8f9091908f8d8b8884807c78716c6260586874818e9ba7b4c1c5b9ac9f9286796c5f493f33271b0f0300000000000000000000000000000000000000000000000000000000000000000000000000030c18242f39434f59616e7b85929fa7b1bdc7d1c7baaea3998f82766c61564c47535f6a73808d96a1adaa9e93897d70665c50443a3025190d0400000000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a54616e7a86929faca2988b7e7164574d4c5563707c8996a0acbdc7d1c7bbb0a69a8d8074675d5145392c1f13040000000000000000000000000000000000000000000000000913202d394653606c7884919eaab4bfcbd4c8bcb1a7988c7f7265574d42362a1e12050000000000000000000000000000000000000000000613202c3945515d6775828f9ba8b5c2cec7bbb0a69a8d8174665c5044382c1f1206000000000000000000050d141a202930363e454d555c606d727d8590959fa7b0aba39f9490857d726d605c544c443c332b2219120e090b0a0a1623303d495663707c8996a3afbcc9c4b7ab9e9184786b5e5145382b1e0600000000000000000000000000000000000000000000000000030a111c263039434c56606b74818e97a1adb9b3a99f948b7f72695f53463d32271b1f2c3946525f6c7985929facb8c5c5b9aea49d9a9c9fa4acaeb4bbbfc1b9b1a8a19791847b6e695e554b41382d22170e0400000000000000000000000000000000000d1a2733404d5a6673808d99a6b3c0cbbfb2a5988c7f7265594c3f322619070000000813202d394653606c7986929facb9c5c6b9ada093867a6d6053473a2d2014070000000000020a11171c1f201f1c171b181d202022201f1d18120b030000000000000000000000000000000000000000000000000000000000050c13191d202121201d191d1d1c1c1c1d1d1e1e1f1f181815120c06000000000000000000020e1a26313c47535f6975818e99a3afbbc2bdb2a89c8f82766a5f53493f3329241f1c181c2028303944505c66727f8b99a3aebac3b9ada1978c7f72675d5142392e23180c00000000000000030d151e262e343b4246484d505252514e4948433d36302920170f050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000610191f28303a44505a616e7b86929fa8b2bdc7beb6afaca9a499938d847d756d67605851443f382f271e150c111d2a36414c5664717e8b7f726a5f554b40362d251b12090000000000000000000000000000000000000000000000000000000000030f1b26313c4955626f7c8896a0acab9c908376695e52463a2d2014090000000000000000000000000008111b252e384049515960686d737a80868b8f9298999a9b9c9d9d9d9c9a9896918d89847e766f6a606874818e9ba7b4c1c5b9ac9f9286796c5f53462d22170b00000000000000000000000000000000000000000000000000000000000000000000000000000b151e2935404b55616b75818e98a2aeb9c2cfc9bdb2a89f92867b6e625a5043434e58606d7984919ea6afa59d9083786d60564c41352920150a00000000000000000000000000000000000000000000000000000000000000000000000b17222d3846525e6875828f9ba8aa9c8f8276695f53515d6774818e9ba8b2bdcfd0c4b7ab9f94887b6e62554b4035291d100400000000000000000000000000000000000000000000000006121f2b3844505b66727f8c98a3aebac6d1cec3b6a99d908376695e52463a2d20160b0000000000000000000000000000000000000000000714202d3a4753606d7a86929facb8c5d2c4b7ab9f94887c6f62544a3f34281c10030000000000000000000003090e171e252a333b434b515b626b6f7b8390959fa6b0afa69f9791877f746d665e564d453d342b231a110800000a1723303d4a5663707d8996a3b0bcc9c4b7aa9d9184776a5e5144372b1e110400000000000000000000000000000000000000000000000000000a141e27313a444f59606d7a84919ea6b0bbb0a69f92867b6e61594f43382c221f2c3945525f6c7885929fabb8c5c1b5a99d928d90939a9fa3aaaeb5bdc2bab2a9a19691847b6e675d53493f332720160c02000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0cabdb1a4978a7e7164574b3e3124180b00000005121f2b3744505b657884919eabb7c4c6b9aca09386796d6053463a2d20130700000000070b141c22282b2d2b28222824292c2d2f2d2c29241d150d03000000000000000000000000000000000000000000000000000000080e161e252a2d2e2d2c29242a292929292a2a2b2b2c2c2524221d18110900000000000000000009141f2b37424d57626e7b87929fa7b1bbc3b7ab9f94887c6f655b50443e352f2b2823282c323a424d57606d7984919eabb4bfb9afa59e9285796d60554b4030271c12070000000000000000030c151c232831363a3b4043454544413c3b38322a251e170e05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007111e2a36414c56616c75828f98a2aebac4c0b6aca49f9c9fa49f96918a817a6f6a625b5049413930271e140d1925303a4653606d787f786c60584e43392e241b1309000000000000000000000000000000000000000000000000000000000000000a15222e3b47545f6a7784919eaaac9f93877b6e6154483b31261a0e020000000000000000000000050e1a232d37404a525b626b707a80868d92989c9fa2aaa7a8a9a8a6a4a2a2a8a09e9a96918a837c746d6774818e9ba7b4c1c5b9ac9f9286796c5f5346392c20130000000000000000000000000000000000000000000000000000000000000000000000000007121c27303945515d67707d8a939eaab3becbcec5b9aca0968c8073695f53483e3c45515d67717e8a949fabaca0958b7f72685e52463c32261b0d040000000000000000000000000000000000000000000000000000000000000000000006111c2a36414c5663707d8996a0ac9f93877b6e615354606d7a86929facb8c4cec9beb3a99c8f82766a5f5343392f24180c00000000000000000000000000000000000000000000000000030f1c28333f4a54616d7a86929faab4bfcbd2c6b9ac9f93877b6e6154483d33271c0e040000000000000000000000000000000000000003101c28343f4a5464707d8a98a2aebac7c8bcb1a79c8f83766a5f5342382e23170c00000000000000000000000000050d1319212931394045515960696e7a828f949ea6afb0a9a199928c81786d685f574e463d352c231a1208000a1724303d4a5763707d8a96a3b0bdc9c3b7aa9d9084776a5d5144372a1e11040000000000000000000000000000000000000000000000000000020c151f29323d45525d68707d8a949fabb7baaea2988e82756b6054483e33281c2c3945525f6c7885929fabb8c5c0b3a79a8d8083878d92989fa3abb1bbc0bbb2a9a1969183796d655b50443e32281e1308000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1cabdb0a4978a7d7164574a3e3124170b000000030f1b27333f495e6b7884919eabb7c4c6b9aca09386796d6053463a2d2013070000000710191d262d33383938332d342f35393a3c3a38352f271f150c030000000000000000000000000000000000000000000000000008121a20283036393a3a393530373636363636373738383832312e29231b12090000000000000000030e1a26313c47535f6a73808c959fa9b2bcbbb0a69c8f82776c60595045413a38332e34383d444c545e69717e8b96a1acbdbab1a79e938a7e71675d5143392f1e150b00000000000000000000030a11171f262a2d2e333738383734302f2c272119130c050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020d17202d3946525e68717e8b949eaab4bec8bbafa49a938f949fa3a19e938e847c726d605b534b423930261c11131f2c3845515c666d726c665b50463c30271d1209010000000000000000000000000000000000000000000000000000000000000006131f2b37434e586773808d9aa8afa49a8c7f7265574d42362a1e120500000000000000000000020d17202c363f49525c636d727d848d92989fa3aaacaeadaaa39f9b9997959596999c9fa09e94908781796d74818e9ba7b4c1c5b9ac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000000000000000000000000000020b18232e39424e58606d7984919ea5afbcc5d0c5bcafa59e9184796d60574d423635404b55616c76828f99a3afa79f92857a6d61584e43372b1f160c01000000000000000000000000000000000000000000000000000000000000000000000e1925303b4653606c7884919eaba49a8c8073655b5865717e8b98a2aebac6d2c6b9ada1978a7d7164574e4231271d120700000000000000000000000000000000000000000000000000000b17222d3846525e6874818e98a3aebac5d0c8bbafa49a8b7f7265594f44382c20160c020000000000000000000000000000000000010b121f2c3844505c6675818e9baab4bfcac5b8ab9f958a7d7064584e4330261c1106000000000000000000000000000002080f171f272f343f474f565e686d79828f939ea5afb3aba39f938e827a6e6960584f473d352c241a11080a1724303d4a5763707d8a96a3b0bdc9c3b6a99d9083766a5d5043372a1d1004000000000000000000000000000000000000000000000000000000030d17202935414c56616c76828f9ca7b1bcb4aa9e93897c6f635a5044392d202c3845525f6b7885929eabb8c5bcafa296897c767b80868d9299a0a7afb5bdbbb2a8a0958f81776c60594f443a3025190d040000000000000000000000000000020f1c2935424f5c6875828f9ba8b5c2c9bdb0a3968a7d7063574a3d3024170a000000000b17222d45515e6b7884919eabb7c4c6b9aca09386796d6053463a2d2013070000040f19222b2f383f4446443f424142404547494745403931271e150b000000000000000000000000000000000000000000000000050e1a242c323a4146474745414443434242434344444545453f3d3a342d251b110600000000000000000915202b37424e57606d78839096a1aab3bbb7aa9f948c7f736b625a524c46443f424045464e565d666e7b85929fa8b2bab2a8a0958e81746c61554b4031271d0c03000000000000000000000000060c141a1e2122262a2b2c2a2723221f1b160d080200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141f2a36424d57616d7a85929ea6b0bcc5bdb2a89f9388838b9299a1a59e9691877f736c655c544b42382e2317101c2834404b545c6065605b544a3f342a1e150b000000000000000000000000000000000000000000000000000000000000000000030f1b26323c4956626f7c8996a1adac9d908376695f53463a2d2115090000000000000000000009141f29323e48515b636e737f8791979fa2aaaeb4b1a9a29f98928e8c8a89898a8c8f92999f9f9a938e837a74818e9ba7b4c1c5b9ac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000000000000000000000000000a141d2834404a54606a73808d96a1acb7c1cecabeb4aa9e93897d70675c51453c312f3a43505a626f7c87929faaada2978d81746a5f53473e31281d13070000000000000000000000000000000000000000000000000000000000000000000008141f2b3744505b65727f8c99a3ac9e9184786c605f6a7683909daab4bfcacbc0b5ab9e9185796d6053463c3120150b01000000000000000000000000000000000000000000000000000006111c2a36414c56616e7b86929fa9b3becaccc0b6ac9d9083776b6155483e32281e1308000000000000000000000000000000000007121d27313a4653606d7985929fabb8c5c5bcb0a69d9083786c6053463c3120150a0000000000000000000000000000000000050d151d2329343d444d565d676d79818e939da5afb5afa59e9490847b6f6a60594f473e362c231a110a1724313d4a5764707d8a97a3b0bdcac2b6a99c8f8376695c504336291d100300000000000000000000000000000000000000000000000000000000050e19242f3a444f5963707d8995a0acb8bcafa59d9083766c6155493c31262c3845525f6b7885929eabb8c5bcafa296897c6f6e737b818790959fa3abb3bbbab1a79e938c7f736b61564c4135291f160c0100000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2c9bcb0a396897d7063564a3d3023170a00000000061e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d20130700000a16212b343d424a5053504a4f4e4f4b51535553514b433930271c120700000000000000000000000000000000000000000000020c16202c363e444c525454524c5050504f4f4f5050515152524b4a453f372d23180c0100000000000000030e1a26313c44505c666e7b849198a2a9b2bab0a69f93877d716c605d5653504a4e4b51535860686d78839097a2adb9b1a8a0969083796d605a5043392f1f150b000000000000000000000000000003090e1214151a1d1f1f1e1b1615130f0a0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1925303a46535e6974818e97a2adb8c1c5b9ada1968d80767f8791969ea6a099928b80776d665c544a3f3428221918232e39424b51535853504a42382d22180c03000000000000000000000000000000000000000000000000000000000000000000000a15222e3b4754606a7884919eabab9f95887b6e6155483c31261a0e020000000000000000020e1925303b44505a626d73808c9399a1a9aeb4bab0a7a097928d86817f7e7c7c7d7f82878d9299a19f9590847b818e9ba7b4c1c5b9ac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000000000000000000000000006111c262f3844515c666f7c87929fa8b2bdc9d0c7baaea2988e81756b61554b40332a28313e47535f6a74818e98a2aea99f92877c6f625a50433a2f24180d03000000000000000000000000000000000000000000000000000000000000000000030f1b27333f4953616d7a86929faca196897d7063626e7b88959fabbcc6d0c7bbafa3998c8073665c5144382c1f1203000000000000000000000000000000000000000000000000000000000d1925303a46535e6974808d97a2adbac1cdc7b8aca095897d70635a50443a3024191106000000000000000000000000000000061018242f3943505a64717e8a97a2adbac6bfb4aa9f94897d70655b5044372b1f1203000000000000000000000000000000000000030b1218222b323b444c555d676d78818e939da5afbbafa69f9691857c6f6b605950483e352c2319101724313e4a5764717d8a97a4b0bdcac2b5a99c8f8276695c4f4336291c1003000000000000000000000000000000000000000000000000000000000008131e28323e4855606b7783909da8b2bdb8ab9f958a7d7064584e43372b2c3845525f6b7885929eabb8c5bcafa296897c6f63696e747c838d9299a1a9b1bab9afa59f93887d70685e52463e31281e130800000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2c9bcb0a396897d7063564a3d3023170a00000005121e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d20130700030f1b27323d464e545b605b545c5b5b555d6062605d554b42392e23180d0300000000000000000000000000000000000000000008131e28323e4850565e61605d565d5d5c5c5c5c5d5d5e5e5f5f585651493f34291d1205000000000000000009152028343f4a545e696f7c869297a1a8b0b9afa49992867e746d6862605b545b555c60646a6f7a828f959fa9b3aea79f9691847b6e675d51483e31271d0d0300000000000000000000000000000000020507080d101212110e0909070300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111e2a36424d56616e7b86929fa9b3bec8bcb1a79e91847a6d727c848f949ea5a39f928d81786d665c50443f342b1e151d2730394045464c46443f382f261c1006000000000000000000000000000000000000000000000000000000000000000000000006131f2b37434e586774808d9aa9b1a7998c7f7266574d42372b1e1206000000000000000005111e2a36424d56616c727f8c929fa4abb2bab9b0a69e959085807a7573716f6f7073767b80879196a09f96918583909daab6c3c5b9ac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000000000000000000000000000b17222d38424e58606d78839099a3afbac4cec7beb1a79f92867b6e61594f43392f211f2b37434e58616e7a85929fa8afa3999082766c61554b413529201509000000000000000000000000000000000000000000000000000000000000000000000b17222d3846525e6875818e9ba8a89b8e8175676673808d9aa7b1bcced2c5b9ac9f92877b6e61544a4034281c10040000000000000000000000000000000000000000000000000000000008131e2a36424d57616d7a85929fa6b0bbc5c8bcb1a79c9083766c61564c4135292317110a02000000000000000000000001071018222935404b55616c7783909da9b3bec4baaea2988f82766b6053493f33271b0f0300000000000000000000000000000000000000010710192029323a434b555c666d78818e939ea6b0b8b0a8a09792867d706b615a50473e352b22191824313e4b5764717e8a97a4b1bdcac2b5a89b8f8275685c4f4235291c0f020000000000000000000000000000000000000000000000000000000000010c16202c38444f5964717e8a96a1adb9bcb1a79c8f83766a5f53473a2f243845525f6b7885929eabb8c5bcafa296897c6f635e616a6f7980879297a0a8b0b8bbafa49a92857a6d61594f433a2f24190d02000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d2013070007131f2c38434e5860666c666a68676869676d6f6d675d544a4034281f150b0100000000000000000000000000000000000000030c1925303a44505a61686d6d686b6a6a69696969696a6a6b6b6b65625b51453a2e2215090000000000000000030c17232e38424d575f6a6f7c8591969ea6adb3aba298928b817a746f6c66686869676d71767c848f949ea7b1aca49d9590847b6e695e554b40362c1f150b000000000000000000000000000000000000000000000405050401000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a46525e6974818d99a3aebbc5c4b8aca0958a7e71676a6f7a828e939ea5a49d938e82786d605b51463d30271d151e272e34383a3f3938332d261d140a000000000000000000000000000000000000000000000000000000000000000000000000030f1b27323d4956636f7c8996a1adaa9d908377695f53473a2d21150a00000000000000050f19232d3a46525e69707e88939fa4afb5bdbcb1a79e948f837b736e68666462626366696e747c849196a0a0979290959fabb8c4c5b9ac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000000000000000000000000050f1c28333f4a545f6a737f8c95a0abb5c0ccccc0b6aca0958b7f72695e52473d31271d1b26313c46525e68727f8c96a1adab9f948a7e71675d51453c31261a0d0300000000000000000000000000000000000000000000000000000000000000000006111b2a36414c5663707c8996a0ac9f92867a6d6d7985929eabb8c2cdc9bdb2a89b8f8275695e5242392e23180c0000000000000000000000000000000000000000000000000000000000020e1a25313b46525e68717e8b949ea9b3bdc6c3b7ab9f948a7e71685d52453f3527221b140b09050200000000000004070c1318222a343c45515d67707d8a95a0acbbc4bab0a69f92867b6e61594f41382d22170b00000000000000000000000000000000000000000000070e1720283139434b545c666c78818e949fa7b1bab2a9a29892867d706c61594f473d342b211825313e4b5864717e8b97a4b1becac1b5a89b8e8275685b4f4235281c0f02000000000000000000000000000000000000000000000000000000000000040d1c27333d4653606d7984919eabb7c2b7ab9f94887c6f62554c4135293845525f6b7885929eabb8c5bcafa296897c6f6356585f666d737d8591959fa6afb7b6aca1978e81756b61554c4135291f1409000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d201307000915222e3b4854606a6f78787775747576777a7c796d665c51443c31271d1207000000000000000000000000000000000000000b151e2a36414c56616c717a7a7978777676757576767777787878726d62564a3d3124180b00000000000000000006111c26303b454e58606a6f7c848f949ea1a9aeaaa29f938e86807c797675757678797e828791969ea6ada8a19e928d837a6e695e564d43392f241a0d0300000000000000000000000000000000000000000000000202010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54616e7b86929fabb5bfc7bbb0a69d9083786c6060686d78818e939ea7a59e948d80746d63584e42392e2318151d23282c2d322d2b28221c140b02000000000000000000000000000000000000000000000000000000000000000000000000000a13202d394653606c7884919eababa095887b6e6155483c31261a0f020000000000000b16212c38444f59616e7b85929aa4afbbc0bfb4aaa0958f82796e69615e5657565657575e616a6f7b849195a0a19e9d9fa7b1bcc8c5b9ac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000000000000000000000050e1b242b3844505b666f7c86929fa7b1bdc7d1c8bbafa49a9083786d60574d42352c1f1515202a36414c56606d7984919ea7b0a69e9184796d60584e43372b1f150b010000000000000000000000000000000000000000000000000000000000000000000d1925303a4854606b7784919daba2988b7e71707d8a97a1adb9c6d2c5b9aca096897d7063574d4230271c120700000000000000000000000000000000000000000000000000000000000009141f2a36414c56626c75828f97a1abb5bfc7bcb0a69e91857a6d605b51473e332d261d1a14110e090b0a0b070c1012181d2429343c464f59606d7984919ea7b1bcbcb2a89f948b7f72695f53473d2f261b11060000000000000000000000000000000000000000000000050d161f283039424a545b666d79828f95a0a8b2bbb3aaa29892877e706b61594f463c332a2025323e4b5865717e8b98a4b1becbc1b4a89b8e8175685b4e4235281b0f02000000000000000000000000000000000000000000000000000000000000000b161f2c3844505c66737f8c99a8b2bdbbb0a69a8d8174675d5145392c3845525f6b7885929eabb8c5bcafa296897c6f63564e545c606b6f7b838f949ea5afb8b3a99e938a7d70675d51453b30251a0e030000000000000000000000030f1c2936424f5c6975828f9ca8b5c2c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d201307000916232f3c4956626f7c8685838281828384868883786d60584e43392f23180d04000000000000000000000000000000000007121d27303946525e68717e868786848383838282828383848485857f7265584b3f3225180c000000000000000000000a151e29333c464e58606a6f7a828b92979fa2aaaca59d98928d88858382818384868a8f939aa1a8a9a29e96918a81796e685e574d443b31271d120800000000000000000000000000000000000000030606090d0e0f0d0a07060400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505c6674808d98a3aebdc6c4b7ab9f94897d70655b565d666d78818f95a0aaa69d928c7f726a60544b4034281d1212181c1f2025201f1c17110a02000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3744505b6574808d9aa9b1a7998c7f7366584e43372b1f1206000000000004101c27323c4854606b75828f97a2acb6c0c6baaea2989083786d675e57524c4b49494a4d52585f696e7a839199a3abaaabb1b9c3cdc5b9ac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000000000000000000020d17202a36424d57606c78839099a3aeb9c3cfcabeb3a99f93887c6f665c50453b30231a0d0d1925303b45515c67717e8a959fabada1978d80736a5f53473e31271d120700000000000000000000000000000000000000000000000000000000000000000008131e2c38444f5965727f8c99a3aa9d90837675828f9ca9b3bec9cbbfb4aa9e9184786c6053463b3020150b00000000000000000000000000000000000000000000000000000000000000030d1925303a44505a616e7b859299a3aebbbfc2b9ada1978e81746d625950443f382f2b26201e1a1918171718181c1f24292f353e464e58616b73808d96a1acb9bcb4aaa0968f82776c60574d42352b1d140a00000000000000000000000000000000000000000000000000040d161e273038424a545c676d7a839096a1a9b3bcb4aaa29992877d706b60584e463c322925323f4b5865727e8b98a5b1becbc1b4a79b8e8174685b4e4135281b0e020000000000000000000000000000000000000000000000000000000000000003101c28343f4a54626f7c8896a1adb9c2b8ac9f92857a6d6054473a2d3845525f6b7885929eabb8c5bcafa296897c6f6356494b515960696e7a828f939ea6b0b8afa59e91847a6d60574d42362a1f14090000000000000000000000030f1c2936424f5c6975828f9ca8b5c2c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d201307000714212d3a4754606d798491908f8e8e8f9193958c80736a60554b4034291f160c01000000000000000000000000000000000c18232e39424f59616d7a859299929190908f8f8f8f90909191928b7e7164584b3e3125180b00000000000000000000030c17212a343d464e585f686d777e858d92989ea1a8aaa29f9a9892908f8e909192999c9fa4a7a09d97928c847d746d675e564d453b32291f150b000000000000000000000000000000000000060b0f1213161a1b1b1a171413100c07010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7985929eaab4bfc9bdb2a89c8f82766b60534c545c666d79839098a3aea49f92877c6f665c5145392f23180c0c1013131913120f0b0600000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27333f495363707c8997a1adaa9d9083776a5f53473a2e21150a00000000000713202c38444f5963707d89949ea9b3bec7bdb2a89f92867b6e665d554d46413e3c3c3d42464e575e686f7c86929fa7b1b8bcc3cbd2c5b9ac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000000000000000000008141f29323b46535f69727f8b959fabb4bfcbd0c7b9ada1978d81746a60544a3f33291f110808141e2934404b55606c7883909da5afa99f92877c6e625a5043392f24180c03000000000000000000000000000000000000000000000000000000000000000002101b27323d4754616d7a86929fac9f95887b7a86929facb9c5cfc7baaea3988c7f72655b5044372b1f1203000000000000000000000000000000000000000000000000000000000000000008131e28323e46525e69707d87929fa4aeb6bfbeb3a99e938c7f726c615a5049413c37312d2a25262524242523282c2f353a41454f585f6a707d88939fa8b2bcb4aaa29891847a6d655b50453b3123190b020000000000000000000000000000000000000000000000000000040c151e262f38424b555d686e7a849197a1aab4bcb4aba39992867d706a60584e443a3027323f4c5865727f8b98a5b2becbc1b4a79a8e8174675b4e4134281b0e0100000000000000000000000000000000000000000000000000000000000000000c17232e3847535f6a7884919eabb7c4baaea2988a7e7164544a3f333845525f6b7885929eabb8c5bcafa296897c6f63564940454f575f686d78818f949fa6b0b9ada1968d8073695e52463b31261a0e0300000000000000000000030f1c2936424f5c6975828f9ca8b5c2c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d201307000613202c3945515d676f7c87929b9a9b9c9e9f9f92877c6f675c51453d31281d120700000000000000000000000000000004101c2834404b54606b74818e97a19f9e9d9d9c9c9c9c9c9d9d968e81756c6156493d3024170a0000000000000000000000050f18222b343d464e565d656c717a80868c91969a9d9fa3aaa29f9c9b9b9c9e9fa3a39f9c9995908c857f79706b605c554d443b332920170d0300000000000000000000000000000000020a11171c1f20232628282724201f1d18120b060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091623303c4956636f7c8997a1adbcc6c5b9ada1968a7d7063594f424a545d676e7b86929fa9afa3999083796d60554b4034291c10040406070c060603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222d3a4653606d7985929eabaca095887b6e6255483c31261b0f03000000000916222f3b4854606b7783909da6b0bbc5c5b9aca0968b7e71695f544b433b36302f2f30363c454d565f6a737f8c95a0acb8c4cdd4d2c5b9ac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000000000000000000040e1925303b44505a616e7b86929fa7b1bdc6d1c7beb1a79e92857a6d61584e42382e20170d00020c18232f3944505b656f7c89939eabaea3998f82766c61554b4035291f15090000000000000000000000000000000000000000000000000000000000000000000b16202d3946525e6875828f9ba9a7998d807f8c99a3afbbc7d2c5b9ac9f92867a6d6153493f33271b0f030000000000000000000000000000000000000000000000000000000000000000020c16202a36424d56606b717e8b929ca4adbabfbbafa59f93877e716c605b534e46423c3a363032313131322e34383a40454b5159616a6f7c85929aa4afbab4aaa29892867c6e685d53493f33291f110700000000000000000000000000000000000000000000000000000000030c151d262f39434c565e686e7b859298a3aebabdb4aba39892867c6f6a5f564c42392e323f4c5965727f8c98a5b2bfcbc1b4a79a8e8174675b4e4134281b0e01000000000000000000000000000000000000000000000000000000000000000006111c2b37434e586774818e9aaab4bfbfb4aa9b8e8174665b5044383845525f6b7885929eabb8c5bcafa296897c6f6356493c3d454d565d666d78828f949fa7b1b2a89f92867b6e61574d42362a1f140900000000000000000000030f1c2936424f5c6975828f9ca8b5c2c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d2013070004111d2935414b55606a727f8c939ea8a9aaaca3999183796d60594f43392f24180d0400000000000000000000000000040d1a242c3845515c66707d89939da9acabaaa9a9a8a8a9a9a39991847a6d605a5045392d211508000000000000000000000000071019222b343c444c535b60686d747a8084898d90929997999a9b9b9b9a9a999798928f8c88847f7a736d676159514b433b322921170e0500000000000000000000000000000000080b141c22282b2d3033353534312d2c29241d17110a020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27333f49536673808d99a9b3beccc0b5ab9e9184796d6053463d424b555f6973808c97a1adaba0958c7f72675c5145382c1f1307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505c6674818d9aa9b1a7998c807366584e43372b1f120600000004111d2935414c5663707d8995a0acb8c1c9beb3a99e9184786d60574d423a312a252323252a333b444e58606d7883909da8b2bdc9d5d2c5b9ac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000000000000000020c16202a36414d56626c76828f98a2aeb9c2cfccc0b6ac9f958b7e71685d52463d30261c0e05000007121d27333f4953606b75828e99a3afab9f948a7e71675d51453c31261a0d03000000000000000000000000000000000000000000000000000000000000000005111d2a36414c5663707d8a97a1ab9e918484919dabb5c0cbc8bcb1a79b8e8175685e5241382d22170b00000000000000000000000000000000000000000000000000000000000000000000050e1925303b444f59626d73808d929ca4aeb4bcbbafa49992877e736c655f58534d474642403f3e3d3e3e3f4044464b51555d606b707c859297a2acb6b2aaa29892867d706a5f564c41382d21170d000000000000000000000000000000000000000000000000000000000000030b141d27303a434d565f696f7c86929fa5afb9bdb4aaa29892857c6e685e544b4034323f4c5965727f8c98a5b2bfcbc0b4a79a8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000000000000000000000f1b26323d4a5763707d8a98a3aebac5b8ab9e9285796c605346393845525f6b7885929eabb8c5bcafa296897c6f6356493c333b444c545c666d79829095a0a9b3aea3988d8174695f53463b31251a0e00000000000000000000030f1c2936424f5c6975828f9ca8b5c2c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d20130700010d18242f3a434e58636d75818f96a0aab4b5aba0958d80736b60554b4035291f160c010000000000000000000000010c161f2a36424d57606d7984919da5afb9b7b6b6b6b5b5b0a69f92877c6f675d51483e34281d110500000000000000000000000000071019222a323a414950565e61686d73787c808386898a8c8d8e8e8e8e8d8c8a888683807b77726d67605d554f454039302920170f05000000000000000000000000000000010a111a1d262d3338393c404142403d3a39352f27221b140b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3744505b657784909daab7c3c7bbafa4998c8073665c50443839434d57606d7985929eabb1a79e9285796d6053473a2f24180c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a5463707d8997a1adaa9d9184776a5f53473a2e21150a0000000613202c3945525d6875828f9ba7b1bccac6b9ada1978b7e71665c50453c30281f1916161a2129323c44515c66717d8a96a1adb9c7d2d2c5b9ac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000000000000000008131e28323a46525e68717e8b949faab4bfcbd4c8bbafa49a9083786c60564c41342b1e140a000000010b17222d38414f59626e7b87929fabb0a69e9184796d60574d42372b1f150b0100000000000000000000000000000000000000000000000000000000000000010d1925303a4653606d7985919eaba197919196a0acbdc7d1c5b8aca095897c6f63564c412f261b1106000000000000000000000000000000000000000000000000000000000000000000000009141f29323d47505a636e73808c929fa2aab2bbb5aba39992887f776f6a615f5754524d4d4c4b4a4a4b4c4a5153555d60676d737d859297a1a9b3afa8a09892867d706b60584e443a2f261b0f0600000000000000000000000000000000000000000000000000000000000000020b151e28313b444d57606a727e8b939ea7b1bcbcb4aaa19791847a6d665c51453f353f4c5966727f8c99a5b2bfccc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000000000000000000000000000a14202d3a4753606d7a86929facb8c5b9ada197897c6f6256493c3845525f6b7885929eabb8c5bcafa296897c6f6356493c30323a424b545d676d7a839097a1abb4aa9f92867b6e61574d42362a1c1106000000000000000000030f1c2936424f5c6975828f9ca8b5c2c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d201307000007131d28313d46515b606d7a849198a2aebab1a79f93877d6f675d51453d31281e1308000000000000000000000008131e28313a46535f69737f8c95a0acb7c1c4c3c3c2bdb2a89e948c7f726a60554c41362d22170c00000000000000000000000000000007101820282f383f444c52565e61656c6f73767a7c7e7f8081828181807f7d7c7976736f6a65605d55514b433e342e271e170e05000000000000000000000000000000010a131c232c2f383f4446494d4e4e4d4a47454039332d261d150c030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c7986929facb9c5c6b9ac9f93877b6e61544a3f34313c45515d6773808d9aa9b3ada1978b7e7165554b4035291d100400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17232e3a4653606d7985929eabaca095887c6f6255483c32271b0f0300000714212d3a4754606d7a86929facb9c3cdc5b8ab9e9285796d60544a3f332a1e160d08090f17202834404a54606d7984919eacb6c0ccd2c5b9ac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000000000000040d1924303a44505a616e7b85929fa6b0bcc6d0cabeb3a99f93877c6f665b50443a3022190c020000000006111b262f3d47535f6975818e99a3afada1968d8073695f53473e31271d1207000000000000000000000000000000000000000000000000000000000000000008131f2c3844505c6673808d9aa7a9a19e9da0a8b2bdcfcabeb4aa9d9083776b6054443a301d140a000000000000000000000000000000000000000000000000000000000000000000000000020d17202b353f48525c636e737f8a9298a0a8afb5b5aba39a938c837c746e6964615e575a595857575859545c6063676d717a80889297a1a9b3ada59e9691867d706b60594f463c32281d140a000000000000000000000000000000000000000000000000000000000000000000030c161f29323c454e58626d74818e95a0aab3bebcb3a9a1969082786d605b51473d404c5966737f8c99a6b2bfccc0b3a69a8d8073675a4d4034271a0d0100000000000000000000000000000000000000000000000000000000000000000006131f2c3945515d677683909ca9b6c3beb3a9998c807366594d402f45525f6b7885929eabb8c5bcafa296897c6f6356493c30283039424b555d686e7b859299a4afaea3998e8174695e5346382e23170c000000000000000000030f1c2936424f5c6975828f9ca8b5c2c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d2013070000010c161f2b343f45515d676f7c86929fa4aebbafa4999184796d60594f433a2f24190e04000000000000000000030c19242f3a43505a616e7b86929fa8b1bdc9d1d0cbc0b5aba1968f82776c60584e433a2f241b100600000000000000000000000000000000060e161d262d333a41464c52535b606367676d6f717374747575747472716f6d6666625f5853514b4540393128231d150c050000000000000000000000000000000009131c252e353d424a505356595b5b5a5753514b443f382f271e150b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a8799a3aebbc7c3b6a99d908376695e5342382e2935404b55626f7b8897a2adb3a99c908376675d5145392c1f1306000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2c3844505c6674818e9aa9b1a8998d807366584e43372b1f130600000b1824313e4b5764717e8a99a3aebbc7cbbfb4aa9a8e8174665c5142382e21180c040000050e18232e3944505c66727f8c9aa4afbbc8d2c5b9ac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000000000000010c161f2935414c56616c75828f97a2adb8c2ced0c7baada2978e81746a60544a3f32281e10070000000000000a141d2b37424d57626e7b87929fabb2a89f92867b6e61594f43392f23180c030000000000000000000000000000000000000000000000000000000000000003101c28343f4a54626f7c88959fabadabaaacb2bac3cec6baaea2988b7e7265594f4332281e0b0200000000000000000000000000000000000000000000000000000000000000000000000000050e19232d36404a525c636d737e8691969fa4abb1b5aca49f949087807b76716e69686665646464656567666d7074797e848d939aa2a9afa9a29f938f847c706b60594f473d342a20160b0200000000000000000000000000000000000000000000000000000000000000000000040d17202a333d46515b606d79839098a2aebac0bbb2a89f948e81746d62594f44404d596673808c99a6b3bfccc0b3a6998d8073665a4d4033271a0d0000000000000000000000000000000000000000000000000000000000000000000004101d2935404b556774818d9aa7b4c0c2b5a89c8f827569554c413545525f6b7885929eabb8c5bcafa296897c6f6356493c3023273039434c565e69707d87939fa6b0ab9f93877b6e61544a3f34281c10030000000000000000030f1c2936424f5c6975828f9ca8b5c2c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d201307000000040d19222935414c555f6a717e8a929da6b0b5aba0968d80746b60564c41352920160c0200000000000000000a151e2935414c56616c76828f98a3aebac3ced6cdc5bbafa39991847a6d655b50463d31281e1209000000000000000000000000000000000000040b141b222730353a444f596063696b6c6a686466676868686767666462605c5455534e4745403a352f271f18120b0300000000000000000000000000000000060f1b252e3740474f545b60636668686764605d555049413930271d120700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915222f3c4855626f7b8895abb5bfcbc0b3a6998d807366574d423026242f394653606c7985929fabb8ac9f92867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a5463707d8a97a2a7a79e9184776a6054473b2e2215080005111e2a36414c566875818e9babb5bfcbc7baaea3988a7d7063544b4030261c0f060000000007121c28343f4a54616e7a87939facb9c6d2c5b9ac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000000000007131d28313a46525d68717e8a939ea9b3becad2c7beb1a79f92857a6d61584e42382d20160c00000000000000020b1a26313c47535f6975818e99a3afaea3998f82756c61554b4034291f140900000000000000000000000000000000000000000000000000000000000000000c17232e3847535f6a7783909daab4b8b7b8bdc3ccd2c5b8ab9f92857a6d6053473d3220160c00000000000000000000000000000000000000000000000000000000000000000000000000000007111b242e38404a525b636c717c848d9399a0a7acb1afa69f99928d87827e7b7875737271707171727476797c80858b91979fa4acaaa59e97928b82796e6a60594f473d352b22180e04000000000000000000000000000000000000000000000000000000000000000000000000050e18212b343f45515d676e7b85929fa4aebac3bab0a69d938b7f726b60564c414d5a6673808d99a6b3c0ccbfb3a6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000000000c18242f3f4c5865727f8b98a5b2bec4b7ab9e918478675d51453945525f6b7885929eabb8c5bcafa296897c6f6356493c30231e27313a434d57606b73808c949fa9afa4998c8073665c5044382c1f14090000000000000000030f1c2936424f5c6975828f9ca8b5c2c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d20130700000000071019242f3a434e58616c74808d949fa9b3b2a89f93887d70685d52453e32281e13080000000000000006111c26303845525d68717e8a949faab4bfccd5d0c5bbb0a69f92877d6f685e53493f342b1f160c0000000000000000000000000000000000000000020a11171e252f3b4854606b7076787877746f6a605d555b5b5a59575553514b4847433c39352f29241d150d070000000000000000000000000000000000030d17212d374049515960666c6f73747573706d67605b534b43392e23180c05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c8895abb5c0cbbdb1a4978a7e7164574b3e31241f2b3744505b6576828f9ca9b5aea399897d7063564a3d3023170a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c17232e3a4653606d7985929b9a9a9a96887c6f6255493c2f221609000714202d3946525e687884919eabb7c4d1c5b8ac9f9286796d6053473a2e20140a0000000000000c17232e3846525e687783909daab6c3d2c5b9ac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000000000030d18242f3a434f59616d7a85929ea5afbbc5d0ccc0b6aca0958b7f72685e52463d2f261c0e04000000000000000009151f2b37424d57626e7b87929fabb4ab9e948a7d70675c51453b31261a0c030000000000000000000000000000000000000000000000000000000000000006111c2b37434e5865727f8b98a3aebac4c5c8ced3c7bcb0a69a8d8174675d5145392c2013050000000000000000000000000000000000000000000000000000000000000000000000000000000009121c262e384049525a616a6f7a808790959da0a7acafaba39f9a938f8a878481807f7e7d7d7e7f818385898d92979ea1a9aca69e9c938e857e776d675f584f473d352b231a0f060000000000000000000000000000000000000000000000000000000000000000000000000000060f19222935404b555f69707e8a929da8b1bdc2b8afa59f92877d70685e52464d5a6773808d9aa6b3c0ccbfb2a6998c7f7366594c403326190d0000000000000000000000000000000000000000000000000000000000000000000000071723303d4a5663707d8996aab4bfc5b9aca196877a6d6054473a45525f6b7885929eabb8c5bcafa296897c6f6356493c3023151f28313b454f59606c78828f97a2adab9e9184796d6053463b31251a0e0200000000000000030f1c2936424f5c6975828f9ca8b5c2c9bcafa396897c706356493d3023160a00000005121e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d201307000000000008131e28313c46505a606d78829097a1abb5afa49a91847a6d60594f443a3025190e050000000000000c17232e38424e58606d7a85919ea6b0bcc6d0d2c7beb3a99f948c7f736b60564c41382d22190d0400000000000000000000000000000000000000000000060b1623303d495663707d82858584817c746d676059514a4c4a494645403c3a37312c29241d18120b0300000000000000000000000000000000000009141f29333f49515b636b70787c808181807d79726c655c554b40342821170b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b8799a3afbbc7bcafa396897c706356493d30231b27333f49536874818e9ba7b4b4ab988b7e7265584b3f3225180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2c3844515c6674818e8e8e8d8e8e8d8073665a4d4033271a0d000814212e3b4754616e7a8796a1acb9c5d0c3b6aa9d908377675d5145382c1f130200000000000006111c2a36414c566673808d99acb6c0ccc5b9ac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000000010b151f2935404b55616b74818e97a1adb7c1cdd4c8bbafa49a9083786d60564c41342b1d140a000000000000000000030e1a26313c47535f6975818e99a3afb0a69e9184796d60574d42362a1e150b00000000000000000000000000000000000000000000000000000000000000000f1b26313c4754616d7a86929facb9c4cfd4d9d0c4b7ab9f94887c6f62554b4035291d110400000000000000000000000000000000000000000000000000000000000000000000000000000000000a141c262e37404850585f676d747c838a91959c9fa4acacaca49f9c9796918e8d8c8b8a8a8b8c8e9092989a9ea2a9aaa29f9b948f89817a716c655d554e463d352b231a110800000000000000000000000000000000000000000000000000000000000000000000000000000000071018242f39434d57616c73808d95a0abb5c0c0bbafa39991857a6d615a504d5a6774808d9aa7b3c0ccbfb2a5998c7f7266594c3f3326190c00000000000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b8798a2aebac6bdb2a895897c6f6256493c45525f6b7885929eabb8c5bcafa296897c6f6356493c302316161f29333d44505b666e7a85929fa7ada1978a7d7064574d42362a1e120500000000000000030f1c2936424f5c6975828f9ca8b5c2c9bcb0a396897d7063564a3d3023170a00000005121e2b3845515e6b7884919eabb7c4c6b9aca09386796d6053463a2d2013070000000000010c161f2a343e44515c666e7b859199a3afb6aca1968e81746b61564c41352920170d020000000005101c28343f4a54606a74808d97a1adb8c2ced8ccc0b6aca1978f82786c60594f443a2f261b10070000000000000000000000000000000000000000000000000c1926323f4c5965727f8c9192918e8981796f6b605c544e443f3a38342e2e2b26201d18130c0701000000000000000000000000000000000000020e1a26313b45515b636d737d83898c8e8e8d8a857f776d675c51453e33281c10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a86929facb9c5bcafa296897c6f6356493c302317222d404d5a6773808d9aa6b3b2a6998c7f7366594c403326190d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404a54626e7c828281808182827e7164584b3e3125180b000a1723303d4a5663707d8996a8b2bdc9cec1b4a79b8e817468554b4035291d1004000000000000000d1925303d495663707d899aa4afbbc8c5b9ac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000000007121d27313945515d67707d89939ea9b3bec9d6cabeb3aa9f93877c6f665c50443a3022190b020000000000000000000009151f2b37424d57626e7b87929facb9aca0968c7f73695f53463e30271d1207000000000000000000000000000000000000000000000000000000000000000a15202d3946525d6875828e9ba9b2bec9d5d5c9beb3a99c9083766a5f53433a2f24180d010000000000000000000000000000000000000000000000000000000000000000000000000000000000020a141c252e363e464e555d606a6f787e838a90939a9da0a8a7aaa9a8a19e9b999897979798989a9c9fa2aaaba39f9c98928e88827c756e68605b534c433c342b231a110800000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d27313c45505a606d79849199a4afbbc4c0b5aba1978f82756c62574d5a6774818d9aa7b4c0cbbfb2a5988c7f7265594c3f3226190c00000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c7985929facb8c5beb1a4988b7e7165584b3e45525f6b7885929eabb8c5bcafa296897c6f6356493c3023160d172028333f4a545e68727f8b95a0aca99c8f8275695e53463a2d2114080000000000000003101c2936434f5c6976828f9ca9b5c2c9bcb0a396897d7063564a3d3023170a00000005121f2b3845525e6b7885919eabb8c4c6b9ada093867a6d6053473a2d201407000000000000040d18222834404a545e69707d87929fa5afb2a89d938a7d70685e52463e32291e1408000000050f1b242c3844505c666f7c87939fa9b3becad4cdc5bbafa49a92857a6e665b50473d32281d140a000000000000000000000000000000000000000000000000000613202d394653606c78818f949d9b938e847d736d665f585049413b3329241e1b15110d0701000000000000000000000000000000000000000005121e2a36424d57626d737f889095999b9b9a97928b81796d60594f44392d1f140900000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c677683909da9b6c3bdb0a3978a7d7064574a3d2e23182734404d5a6773808d9aa6b3b3a69a8d8073675a4d4034271a0d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232e3947535f6a6e75757474747576716c6156493d3024170a000c1825323f4b5865727e8b98a5b1bececbbfb2a5988c7f7265594c3f2f24180c00000000000000000814202d3a4753606d7a86939facb9c6c5b9ac9f9286796c5f5346392c201306000000000000000000000000000000000000000000000000000c18232f39434f59606d7984919ea5afbbc5cfd3c6baaea2988e81746b60544a3f32291e10070000000000000000000000030e1a26313c47535f6975818e9ba6b0b2a89f92867b6e61594f42392e23180c0300000000000000000000000000000000000000000000000000000000000005111d2935414c5663707d8a97a1adb9c6d2d2c6b9ada1978a7e7164584e4331281d130700000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c242c343c434c515860666d71787d83878c9195979a9d9fa3aba5a5a6a5a4a3a4a4a5a4aaa29f9d9999928f8b86817c756f6a615e565049413a312a2219110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b151f2a333e45515c676f7c87939fa8b2bec7bdb2a99e938b7e71695f545a6774818d9aa7b4c0cbbeb2a5988b7f7265584c3f3225190c000000000000000000000000000000000000000000000000000000000000000000000005121f2b3744505b657783909daab6c3bfb3a6998c807366594d4045525f6b7885929eabb8c5bcafa296897c6f6356493c302316090e17222d38424c56606d7883909aa4ac9f93877b6e6154483b2f24190d0100000000000003101d293643505c6976838f9ca9b6c2c9bdb0a3968a7d7063574a3d3024170a00000005121f2c3845525f6b7885929eabb8c5c6baada093877a6d6054473a2d21140700000000000000061018232e39424d56606b727f8c939ea8b1afa59e91857a6d615a50443b302519100600020d17212a36424d57606d78839099a4afbbc4cfd0c5bbb1a79f93887d70685e544a3f352b20160b020000000000000000000000000000000000000000000000000006121f2b3844505b666d79829095a09d96918780786f6a605b534d453e3530282018120b030000000000000000000000000000000000000000000714212d3a46535f69727f8b939aa0a7a7a8a9a19e938e81746c6155493b31251a0e02000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2934404b556773808d9aa7b1bcbfb2a5988c7f7265554b4034281d2834414e5b6774818e9aa7b4b2a5998c7f7266594c3f3326190c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121c2b37434e585f626868676767686964615a5045392d211508000d1a2733404d5a6673808d99a6b3c0cccabdb1a4978a7e7164574b3e3124180700000000000000000613202c3945515d677884919eabb7c4c5b9ac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000004101c2934404b55606b74808d96a1acb7c1cdd4c8bcb1a79f92857a6e61594f42382e20170c0000000000000000000000000009151f2b37424d57626f7c89949fabb7aea3988f82756b61544b4034281f1409000000000000000000000000000000000000000000000000000000000000010d1924303a4653606d7984919eabb8c2cdccc0b5ab9e9285796d6053463c3120160c010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a121a222a313a41454e545c60666c71767b7f84878a8e919299969899999a9b9a9a999998969892908d8a86837e7a756f6a626058524c443f382f281f180f07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d18212834404b55606a73808d96a0acb6c0c4bbafa59f92867b6e665c5b6774818e9aa7b4c1cbbeb2a5988b7f7265584c3f3225190c0000000000000000000000000000000000000000000000000000000000000000000000030f1b27333f49536875828f9ba8b5c2c0b3a79a8d8074675a4d4145525f6b7885929eabb8c5bcafa296897c6f6356493c3023160906111c262f3b44505c666f7c87939faaa4998c7f7265554c4135291d110400000000000003101d2a3643505d697683909ca9b6c3cabdb0a3978a7d7064574a3d3124170a00000006121f2c3945525f6c7885929fabb8c5c7baada094877a6d6154473a2e211407000000000000000007121c27303b444f59626d75818e95a0aab4ada1978e81756c61564c41362a22180d0309141f29333b46535e69727f8c95a0abb5c0cdd6cabeb3a99f958d80736b61564d42382d23190e050000000000000000000000000000000000000000000000000000030f1c28333f4a545c676d7a839196a1a099938d837c726c655e575046413a3229241d150d060000000000000000000000000000000000000003101c28343f4a54616e7b86929fa4acb1b4b4b3ada59e938a7d7064574d42362a1e12050000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232f3c4956636f7c8995a0acb8c1b4a89b8e8175675c5145392f292b37434e586976828f9ca9b5b3aa978b7e7164584b3e3125180b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1a26313c464e53555c5b5b5a5b5b5c585650483e34281d1105000e1b2835414e5b6874818e9ba7b4c1cec9bdb0a3968a7d7063574a3d3024170a000000000000000004101d2935404b556976828f9ca9b5c2c5b9ac9f9286796c5f5346392c20130600000000000000000000000000000000000000000000000006131f2c3845515c676f7d88939fa8b2bdc9cdcec5b8aca0958b7f72685e52473d30261c0e0500000000000000000000000000030e1a26313c4754606a7683909ca8b2b4aa9e938a7d70665c51453b30251a0e0400000000000000000000000000000000000000000000000000000000000008131f2b3844505c6673808d99a7b1bcc8c7bbafa4998d8073675c5145382c1f130400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000910181f282f353d424a50545b6064696e73777b7e81848688898b8c8d8d8e8e8d8c8c8b89878583807d7a76716d67625f58544e46413b332d261d160d060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f18232e39434e58606d7984919aa4afbbc5c1baaea2989083786d60566874818e9ba7b4c1cbbeb1a5988b7e7265584b3f3225180c0000000000000000000000000000000000000000000000000000000000000000000000000b17222d424e5b6875818e9ba8b4c1c1b4a79b8e8174685b4e4145525f6b7885929eabb8c5bcafa296897c6f6356493c30231609000a141d28343f4a54606b74818e98a2ab9c8f8276675d5145392c20130600000000000004111d2a3744505d6a7783909daab6c3cabdb0a4978a7d7164574a3e3124170b00000006131f2c3946525f6c7985929facb8c5c7baada194877a6e6154473b2e2114080000000000000000000b151e29323d47515b606d79839198a2aeb3a99e938a7e71685e52463f342a1f150b0f1a25303b45505a616e7b86929fa7b1bdc7d2cbc3baada2979083786d60594f443b2f261c1107000000000000000000000000000000000000000000000000000000000b17222d38424b555d686e7b849197a2a49f9590867f776e69615a524c443d352f271f17110a02000000000000000000000000000000000006121f2b3844505c6674818e99a3aeb6bec1c1beb9afa59d908377695e53463a2d2114070000000000000000000000000000000000000000000000000000000000000000000000000000000000000715222f3b4854606b7783909da7b1bdb8ab9f9285796d60554b403834363b47535f6a7885919eabb8aea298897c706356493d3023160a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a15202a343c4347484f4f4e4d4e4f4f4b49453e362d22170c00000f1c2835424f5b6875828e9ba8b5c1cec9bcafa296897c6f6356493c302316090000000000000000010d18242f414e5a6774818d9aa7b4c0c5b9ac9f9286796c5f5346392c201300000000000000000000000000000000000000000000000006131f2b37434e58606d7984919aa4afbabebec0c3bcafa59d9083786d60564c41342b1e140a00000000000000000000000000000009151f2b37434e5864717d8a96a1acb7afa59e9184796d60574d42362a20150a00000000000000000000000000000000000000000000000000000000000003101c28343f4a54626e7b88959fabb8bfbdb9ac9f93877b6e61554b4034281c1004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d161e242930383f444a5053575f6166696e717477797b7d7e7f8080818180807f7e7c7a797673706d6764605d55534e47433d363027221b140b040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d27303d45515d67707d88939fa9b3bec9bfb4aa9f958b7f72685e6875818e9ba8b4c1cbbeb1a4988b7e7165584b3e3225180b000000000000000000000000000000000000000000000000000000000000000000000000061b2834414e5b6774818e9aa7b4c1c1b5a89b8e8275685b4f4245525f6b7885929eabb8c5bcafa296897c6f6356493c3023160900020b17232e38424f59616e7a86929fab9f92867a6d6054473a2d22170b00000000000004111e2a3744515d6a7784909daab7c3cabdb1a4978a7e7164574b3e3124180b0000000613202c3946535f6c7986929facb9c5c7bbaea194887b6e6155483b2e221508000000000000000000030c17202b353f45515d676e7c86929fa4aeafa59e92857a6e615b51463c31271d1217212a36424d57626c75828f98a2aeb9c3d0cec3b9aea49f92857b6e665c51473d32291d140a000000000000000000000000000000000000000000000000000000000006111c262f39434c565e696f7c859299a3a7a098928b827b716c615d564f4540393128231c140c06000000000000000000000000000000000713202d3a4653606d7885929eabb4bfc7d0cfc9c1b8aba095877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000000000000000000000000000000000007131f2c38444f5965727f8b95a0abb5baada2978a7e71675c514a454041464e58626f7c8897a1adb8ab9f9285796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030e18222a31373a3b424241414142433e3d39342d241b100600000f1c2936424f5c6975828f9ca8b5c2cfc8bcafa295897c6f6256493c2f23160900000000000000000007192633404c5966737f8c99a6b2bfc5b9ac9f9286796c5f53462e23170b0000000000000000000000000000000000000000000000000815212e3b47535f6a73808d96a0acabadb3b1b4b6b4aa9e93897d70665c50443b3022190c02000000000000000000000000000000030f1b27323d4653606d7884919eaaaaabaca0968c7f72695e52463c32261b0f030000000000000000000000000000000000000000000000000000000000000b17232e3847535f6a7683909daaaeb4b0b2a89c8f8275695f5343392e23180c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c13191e262e34383f44464d5355575e616467666d6e70727273747474747372716f6e686a6663605d5554514c47433c37322a251e17110a020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e2935404b55606b74808d97a1adb9c3c6bcb1a79f92857a6e616875828e9ba8b5c1cabeb1a4978b7e7164584b3e3125180b0000000000000000000000000000000000000000000000000000000000000000000000010d1a2734404d5a6773808d9aa6b3c0c2b5a99c8f8276695c4f4345525f6b7885929eabb8c5bcafa296897c6f6356493c30231609000006111c26303d46525e6874818d99a4a3998a7d716453493f33271b0f03000000000004111e2b3744515e6a7784919daab7c4cabeb1a4978b7e7164584b3e3125180b00000006121f2b3844505c667986939facb9c6c8bbaea195887b6e6255483b2f22150800000000000000000000050e19232935414b555f6a717e8a929da6b0ada1978f82756d62584e43392f23181f29333b46525e69717e8b949eaab4bfcbd0c6bcb1a79d928a7e71695e544a40352c20170b020000000000000000000000000000000000000000000000000000000000000a141d27313a444d575f6a707d87929aa4aaa39f948f857e756d686059514b433c342e261e180f060000000000000000000000000000000815212e3b4854616e7b8797a1adbdc6d1d9dad4c8bcb1a7978a7d7064574a3d3124170a000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27323d4653606d79839199a4afbbb3a99e9184796d605c54514b4c52575f6a74808d9aa9b3afa59b8e8175675c5145382c1f1306000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f1820262b2e2f3535343434353631302d28221b1209000000101d293643505c6976838f9ca9b6c2cfc9bcafa396897c706356493d3023160a0000000000000000000c1926323f4c5965727f8c98a5b2bfc6b9ac9f9386796c604a3f34281c100300000000000000000000000000000000000000000000000916222f3c4955626f7c87929c9d9e9fa2a9a4a7aaaca2988e81756b60544a3f32291e100700000000000000000000000000000000000a161f2b3844505c66727f8c989f9e9e9fa39f92867b6e61584e43372b1f120600000000000000000000000000000000000000000000000000000000000006111c2b37434e5865727e8b989fa2aaa3a6a1968a7d7063574d4230271d120700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001080c141c23282d33383b4246484d525457545c6061636566666768676766666563615e565a5754514c4745413a37322b272019140b060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c18242f39434f59606d7a85929ea8b2bdc8c3baaea2988e81756b6875828f9ba8b5c2cabdb1a4978a7e7164574b3e3124180b0000000000000000000000000000000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3bfc3b6a99d9083766a5d504345525f6b7885929eabb8c5bcafa296897c6f6356493c302316090000000a141e2a36414c56616e7b87939fab9b8e8174655b5044372b1f1205000000000005111e2b3844515e6b7784919eaab7c4cbbeb1a4988b7e7165584b3e3225180b0000000713202d3a4653606d79869aa4afbbc8c8bbaea295887b6f6255483c2f2215090000000000000000000000071118242f3a434e58616c73808d949fa9b3a99e948b7f726a5f554b4034292025313b45505a616e7b85929fa6b0bcc6d0cabfb4aaa0958d80746c61574d42392e231a0e0500000000000000000000000000000000000000000000000000000000000000020b151f28323b454e58606b717e88939fa4aea69f97928a817a706b605d554e443f38302a21180f0600000000000000000000000000000916232f3c4956626f7c8995a9b3becad6e2e4d9cdbeb1a4988b7e7165584b3e3225180b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a161f2c3845515c676f7c87939fa5afb9aca1968d80746d66605c55565e61696f7c87929facb3a99e93897d7063554b4034281c100400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060e151a1f2122292828272828292524211d171009000000000f1c2935424f5c6875828f9ba8b5c2cec9bdb0a3968a7d7063574a3d3024170a0000000000000000000b1825323e4b5865717e8b98a4b1bec7bbafa4998679665c5044382b1f12060000000000000000000000000000000000000000000000101d2a3743505d6a76839090909091929795989a9d9f9f92867b6e61594f42382e20170d00000000000000000000000000000000000003101c28343f4a54606d7a8592929191929995988e81756a5f53473b2e211508000000000000000000000000000000000000000000000000000000000000000f1a26313c4754606d7a869192989496999c9184786d6053463b3120150b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171c22282b31363a3b4246484b4a5053555658595a5a5b5b5a5959585654524d4d4a4745413a39352f2b26201b150d08020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d27313d45525d68727f8b96a0acb9c2cabeb3aa9e93897d6f6675828f9ca8b5c2cabdb0a4978a7d7164574a3e3124170b0000000000000000000000000000000000000000000000000000000000000000000000000c1926323f4c5965727f8c98a5b2bfc3b6aa9d9083776a5d504445525f6b7885929eabb8c5bcafa296897c6f6356493c30231609000000020c1925303b46535f6975828e9ba69e9185796c605346392d201306000000000005121f2b3845525e6b7885919eabb8c4cbbeb1a5988b7e7265584b3f3225180c0000000714202d3a4753606d7a8693a0b6c0ccc8bbafa295887c6f6255493c2f22160900000000000000000000000007131d28313c46505a606d78829097a1abb0a69f92867c6f675c51453e33292a36424d57626c76828f97a2adb8c1ceccc4baaea2989083796d605a50453b30271c1108000000000000000000000000000000000000000000000000000000000000000000030d162029333c464f59616c727f8c929da5afa9a29f938e847d746d676058504a423c332a22180e03000000000000000000000000000815222e3b4855616e7b8898a2aebac7d2dbdcd5c9bdb2a8978a7d7164574a3e3124170b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b55606a73808d939da5afb2a89d928d8078716d676969686d727b849199a3afaaa2978e81756b605443392e23180c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a0f1214151c1c1b1a1b1c1c181715110c0600000000000e1b2834414e5b6774818e9aa7b4c1cdcabdb0a4978a7d7164574a3e3124170b0000000000000000000b1824313e4b5764717e8a97a4b1bdccc0b5a09386796d6053463a2d20130700000000000000000000000000000000000000000000000e1a2734414d5a67748084838383848587898b8d9092958c7f72695e52473d30261c0e05000000000000000000000000000000000000000b17232e3845515d67727f868584858687888b8d887c6f6255483c2f221509000000000000000000000000000000000000000000000000000000000000000915202c3945525d68737f848586888a8c8f8c7f73665c5044382b1f12030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b11171c1f262a2d30363a3b3e3f4446484a4b4c4d4d4e4e4d4d4c4b49474641403d3a39352f2c29241e1b150f0a04000000000000000000000000000000000000000000000000000000000000000000000000000000000000010100000000000000000000000000010b151f2935414c56606d7984919ea7b1bcc7c5bcafa59d9083786d76828f9ca9b5c2cabdb0a3978a7d7064574a3d3124170a0000010100000000000000000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec3b7aa9d9084776a5d514445525f6b7885929eabb8c5bcafa296897c6f6356493c302316090000000008141e2b37424d57626f7c899498949085796d6053473a2d201407000000000005121f2c3845525f6b7885929eabb8c5cbbeb2a5988b7f7265584c3f3225190c0000000714212d3a4754606d7a8793a0adbad2c9bcafa296897c6f6356493c30231609000000000000000000000000010c161f2a333e44505c666e7a859199a4afaea3989083796d605a50453b2f333b46535e69717e8b949ea9b3becacfc4baafa59f92867b6e675c51483e33291e150b0000000000000000000000000000000000000000000000000000000000000000000000040e17212a343d47505a626d73808d939ea6b0ada59e96918880796f6a605c544d453c342a20150a000000000000000000000000000713202d3a4653606d7985929facb6c0cad0d1cbc3b9aca096887b6f6255483c2f22150900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232e39434e58606d78818e939fa4abaea49d928d847e79787676777a7f859196a1aba9a29892857b6e61594f4430271d12070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020608080f0f0e0e0e0f100b0a0805000000000000000d1a2733404d5a6673808d99a6b3c0cccbbeb1a5988b7e7265584b3f322518070000000000000000000c1825323f4b5865727e8b98a5b1bed2b9aca09386796d6053463a2d20130700000000000000000000000000000000000000000000000d1a26333f4c58646e747776767777787a7c7e8183868883786d60574d42352b1e150a000000000000000000000000000000000000000006111c2935414c55636d7279787778797a7c7e81817a6d6053473a2d2014070000000000000000000000000000000000000000000000000000000000000004111d2935414c56636d7378797a7b7d7f82827a6d61544a3f34281c100300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f141a1e21252a2d2e2e34383a3b3d3f3f4041414141403f3e3c3b393630302d2c2924201d19130f0a04000000000000000000000000000000000000000000000000000000000000000000000000000000000406070d0e0d0d0d0c0c0c0b0b0b0a0a0a090909090d19242f3a44515c66717e8a959fabb7c1cec1b8aca0958b7e7276828f9ca9b5c2c9bdb0a3968a7d7063574a3d3024170c0d0d0d0e0a090704000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1bdc3b7aa9d9084776a5d514445525f6b7885929eabb8c5bcafa296897c6f6356493c3023160900000000020e1a26313c4754606a76828d8c88837c6f675c5145382c1f1306000000000005121f2b3744505b657985929facb8c5ccbfb2a5998c7f7266594c3f3326190c0000000814212e3b4754616e7a8794a1adbac7c9bcb0a396897d7063564a3d3023170a00000000000000000000000000040d182128343f4a545e68707d87939fa6b0aaa0958d80746c61574d42383b45505a616e7b85929fa6b0bcc5d0c7bdb2a89e938b7e71695f554b40362c21170c03000000000000000000000000000000000000000000000000000000000000000000000000050f18222b353e48515b606c77818e949fa7b1afa9a19a938d847c736d665f574e463c31261a0f0200000000000000000000000006131f2c3845515c6775828e9aa4afbabec3c4c0bbb0a69e9184776a5f53473a2e211508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d27303d44505c666d78818d9399a0a7aba49d96918b8684838284868c9298a1a8a69e9792867d6f695e52473d331e150b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926323f4c5965727f8c98a5b2bfd0cdc0b3a69a8d8073675a4d402f24180c0000000000000000000c1926333f4c5966727f8c99a5b2bfc6b9ada093867a6d6053473a2d20140700000000000000000000000000000000000000000000000b1724303c47525c64676a6a696a6b686d6f717477797c7a6d665c51453b3023190c030000000000000000000000000000000000000000000d19242f3a43515b63666c6c6b6b686d6f7174746d675d5145392c20130600000000000000000000000000000000000000000000000000000000000000010d19242f3a44515b63666b676d6e707375766d685d5242382e23170b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e12141a1e202123282c2d2e3032333334353434333332302e2d2a252421201d1913110d080100000000000000000000000000000000000000000000000000000000000000000000000000000000070c1013131a1a1a1a191919181818171717171616161515151e2834404a54616c7683909da5afbbc6c8bcb1a79e91847976838f9ca9b6c2c9bcb0a396897d7063564a3d30231919191a1a1a171614100b0500000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1bdc3b7aa9d9084776a5d514445525f6b7885929eabb8c5bcafa296897c6f6356493c30231609000000000009141f2b38434e58626f7c807f7c766f6a5f554b4034291c100400000000000613202d394653606c7986939facb9c6cabfb3a6998c807366594d4033261a0d0000000815222e3b4855616e7b8894a1aebbcad0bdb0a3978a7d7064574a3d3124170a0000000000000000000000000000060f17232e38424c56606b737f8c949fa9b1a79d928a7d70695e544a3f414d57626d76828f98a2aeb8c2cecbc0b5aba1968e81756c62574d43392f241a0f050000000000000000000000000000000000000000000000000000000000000000000000000000061019232c363f44505b656d78828f95a0a8b2b2aca49f9691877f786e695f584e43372b1f120600000000000000000000000004101c2834404b55626f7c87939fa5adb3b6b7b5afa79f948b7e7265584e43372b1f12060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e28343f4a545c666c77808790959c9fa6a8a09e9a93918f8f9093999fa2a69f9c938f857d6f6a60564d42352b210c030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080b0706040000000000000000000000000000000b1825313e4b5864717e8b97aab4bfcacec1b5a89b8e827568554b4035291d100400000000000000010d1a2734404d5a6773808d9aa6b3c0c6baada093877a6d6054473a2d211407000000000000000000000000000000000000000000000007131f2b36404a52585a5d5d5d5d565d61626567666d6f6d685d544a4033291f11070000000000000000000000000000000000000000000008131e28313f495157595f5f5e565d6062656768605d554b4035291d1104000000000000000000000000000000000000000000000000000000000000000008131e28324049515759555d606163666969615d564c4130261c11060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205090e121415171c1f202223252627272828272626252321201e19171413110d08040100000000000000000000000000000000000000000000000000000000000000000000000000000000030b12181c1f20262727262626262525252424242323232222222121232e3942505a636f7c89939eaab6c2cdc3b9aca1968b7e7683909ca9b6c3c9bcafa396897c706356493d30252526262627272423201c161008000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1bec3b7aa9d9084776a5d514445525f6b7885929eabb8c5bcafa296897c6f6356493c302316090000000000030f1b27323d47535f6a6f73726f6a625f584e43392f23180c0000000000000714202d3a4753606d7a869aa4afb8babebeb3a6998d8073665a4d4033271a110d08070915222f3c4855626f7b8895a2aebabebcbdb1a4978a7e7164574b3e3124180b00000000000000000000000000000006111c26303b444f59606c78828f96a1abaea49e92857b6e665b504449535e69717e8b949faab3becacec5bbafa39991847a6d605a50453c31271d12080000000000000000000000000000000000000000000000000000000000000000000000000000000007111a2427333f49535c666d79839096a1a9b3b6afa8a099928c837b6e6a5f53473a2e211408000000000000000000000000000c18232e394754606a74808d939fa2a9aaaaaba39f959082786d6053463c31261a0f03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c17232e38424a545b656c737d838a9094989c9fa2a49f9e9c9c9d9fa29f9c99948f8a827b6f6b60584e443b3023190f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e121415171413100c07010000000000000000000000000916232f3c4956626f7c8998a2aebac6d0c3b6aa9d908377675d5145382c1f13060000000000000004111d2935414c566975828f9ca8b5c2c6baada093877a6d6054473a2d2114070000000000000000000000000000000000000000000000030e19242f3840474c4d515050504c52545658545c6062605d564c42392e20170d0000000000000000000000000000000000000000000000010c161f2e373f464b4c5352514c525455585a5b53514b433a2f24180d010000000000000000000000000000000000000000000000000000000000000000010c16202e3740464b4c4b51535557595c5c54524c443a301e140a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507060c101213151718191a1a1b1b1a1a1918161414110e0807060401000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c151d23282c2d3334343333333232323131313030302f2f2f2e2e2e2e2d303e4854606b75828f9ba7b1bcc8c9bdb2a89e91847983909da9b6c3c9bcafa396897c706356493d3232323333333434302f2c28211a11080000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1bec3b7aa9d9084776a5d514445525f6b7885929eabb8c5bcafa296897c6f6356493c302316090000000000000a16202b37434e585f626765625f58534e463c31271d12070000000000000714212e3a4754616d7a8794a0aaabaeb3b1b3a79a8d8074675a4d4134271f1d1914141116232f3c4956626f7c8995a2abadb3b0b2b1a4988b7e7165584b3e3225180b000000000000000000000000000000000a151e29323d44505b666d7a849199a3afada1978f82786c60584e505b656e7b86929fa6b0bcc5d0c5bcb0a69f92877c6f675d51483e332a1f150b000000000000000000000000000000000000000000000000000000000000000000000000000000000000081217222d38414b545d676e7a849197a2aab4bbb2aba39f9590867c6e6255483b2f2215080000000000000000000000000007121d2b37434e58606d78818c92979b9d9d9c99928e837a6d665c5044382a20150a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c263038424a535b606b6f787e83888c8f9298969797989897969892908d88837d756e6960594f463d32291f1107000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d141a1e212224201f1d18120b0300000000000000000000000713202d3a4653606d7985929facb8c5d2c5b9ac9f92867a6d6053473a2d20140a000000000000000613202c3945525d687884919eabb7c4c7baada094877a6d6154473a2e21140700000000000000000000000000000000000000000000000008131d262f363c3f4144434344414647494b4b51535554524c443a30271c0e05000000000000000000000000000000000000000000000000040d1c252e353b3e3f464544414547494b4e4e4745403a31281d130700000000000000000000000000000000000000000000000000000000000000000000040d1c252e353b3e40404547484a4c4f4f4746413a32281e0c02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030607080a0c0c0d0e0e0e0e0d0c0b090807050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e272e34383a40414040403f3f3f3e3e3e3d3d3d3c3c3c3c3b3b3b3a3a3a3a434f59636f7c89959fabb8c4cec4b9aca0968b7e83909daab6c3c9bcafa296897c6f6356493e3e3f3f3f404040413d3c38332c231a100500000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec4b7aa9d9184776a5e514445525f6b7885929eabb8c5bcafa296897c6f6356493c30231609000000000000040f1b26313c464e53555a5955534e47433c342a1f150b010000000000000815212e3b4854616e7b87949d9e9fa2aaa5a7a79a8e8174675b4e41342c2c2a2621201e1923303d495663707c89969d9fa2a9a3a5a7a5988b7f7265584c3f3225190c00000000000000000000000000000000030c172028333f4a545e686f7d87929fa6b0a99f948c7f726a605557606c77828f98a2aeb8c2cecabeb3a99f948c7f736b60554c41362d21180d030000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111b262f39424c555e686e7c859298a2abb5bdb5afa79f988c7f7366594c403326190d00000000000000000000000000000f1b27323d44505c666d777f858b8f90918f8c8781796d685e544a3f3428180e030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141e262f384149505960656c71767b7f828587898a8b8b8b8a89888583807b76706c615e574f473d342b20170d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c13191f262b2d2e312d2c29241d150d060000000000000000000006121f2c3844515c6676828f9ca9b5c2cfc7baaea399897c706356493d31261a0f010000000000000714212d3a4754606d7a8796a1acb9c5c7baada094877a6d6154473a2e211407000000000000000000000000000000000000000000000000010b141d242b3033343737363035393a3c3e404546494745413a32281e150b00000000000000000000000000000000000000000000000000000a131c232a2f323339392f35393a3c3e41413a39352f281f160c0100000000000000000000000000000000000000000000000000000000000000000000000a131c232a2f322f35393a3b3d4042433a3935302820160c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d2730394045464d4d4d4d4c4c4c4b4b4b4a4a4a4a4949494848484747474747474754606b7683909da8b2bdc9c9bdb2a89e918483919daab7c4c8bcafa295897c6f62564a4b4b4b4c4c4c4d4d4d4a48443e352c21160b00000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2bec4b7aa9d9184776a5e514445525f6b7885929eabb8c5bcafa296897c6f6356493c30231609000000000000000a15202a343c4347484d4c4847433c37312a22180d03000000000000000815222e3b4855616e7b88919091929896989a9d9b8e8175685b4e4237393837332e2d2a2524303d4a5763707d8a909092979596989b9d998c7f7266594c3f3326190c0000000000000000000000000000000000050e17222d38424c56606b727f8c949ea8b0a69f92877c6f675d5f69727f8b949faab4becaccc4baada2979082786d60594f433a2f241b0f060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d27303a434d565f6a6f7d869299a3afbbbbb1a89f958a7d7164574a3e3124170b00000000000000000000000000000a152028343f4a545c656c727a7e828384827f7b746d675e564c42382e23170600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c141d262f383f444f535b6064696e7276787a7c7d7e7f7e7d7d7b7976736e6a64615a524d453d342b22190e0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060e161e252931373a3b3e3a39352f271f180f0600000000000000000004101c2834404a5466737f8c99a9b2bec9cbbfb4ab998c807366584e43372b1d1307000000000005101c2834404a5464717d8a97a8b2bdc9c7baada194877a6e6154473b2e21140800000000000000000000000000000000000000000000000000020b13191f2426272a2a2a24292d2e2f2e34383a3c3a3935302820160c030000000000000000000000000000000000000000000000000000010a12181e2225262c2c24292c2d2f3234352d2c29241d160d04000000000000000000000000000000000000000000000000000000000000000000000000010a12191e222524292c2d2e303336362e2d29241e160e04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040607080605030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232e39424b5153595a5a595959595858585757575656565555555454545353535353535964717e8a96a1acb9c6cec4b9aca096919195a0acb8c5c8bbafa295887c6f625757575858585959595a5a57554f473e33281c1004000000000000000000000000000000000000000000000c1926323f4c5965727f8c98a5b2bfc4b7aa9d9184776a5e514445525f6b7885929eabb8c5bcafa296897c6f6356493c3023160900000000000000030e18222a31373a3c403f3c3b37322b262018100600000000000000000613202d394653606c78818483848587898b8e90928f8275685c4f4244454544403b393630292f3c4855626f7c838484858788898b8e90928c807366594d4033261a0d00000000000000000000000000000000000006111c262f3a444f59606c77828f96a1abafa3999184796d60656e7b86929fa6b0bcc5cfc4baafa59f92857b6e665c50463d31281e120900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b151e28313b444e57606b707e87929fa4aeaea7a0969083786d6053463a2d2013070000000000000000000000000000040b17232e38424a535b60686d7275777776736e69605d554c443a30261c11060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b141d262d333d41495053575f626569686e6f7171727271706f6d6666625f58555046423b332b22191007000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a1117202830353c4246484a47454039312921180d040000000000000000000c18232e3c4956636f7c8997a1adb9c6d0c3b6a99c9083766a5f53473a2f24180d04000000020b16202c3844515c6675818e9ba8b4c1cec7baaea194877b6e6154483b2e211508000000000000000000000000000000000000000000000000000001080e13171a1a1e1d1d191d20212323282c2d2f2d2c29241e160e040000000000000000000000000000000000000000000000000000000000070d12161819201f191d20212225272820201d18130c04000000000000000000000000000000000000000000000000000000000000000000000000000000070d121618181d1f20222426292921201d19130c040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c1012131513120f0b0606030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b545c606667676666666565656464646363636262626161616160606060606060606d7884919eaab4bfcac9bdb2a8a09e9da0a7b1bcc8c8bbaea295887b6f6364646465656566666667676361594f44382c201407000000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5b2bfc4b7aa9d9184776a5e514445525f6b7885929eabb8c5bcafa296897c6f6356493c30231609000000000000000006101820262b2e2f34322f2e2b26201b150e0600000000000000000006121f2b3844505b666c75777777787a7c7e818385877f7366594c4c505252504c4746413b322e3a47535f6a6f777777787a7b7d7f818386877e7165584b3e3225180b000000000000000000000000000000000000000a141d29323d44505b656d7a849199a3aeaba0968e81756c6c77828f98a2aeb8c2cec7bdb2a89e938a7e71695e544a3f342b1f160c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c161f29323c454f59616c727f8b929ca5a39f9591847a6e665c5044382b1f120600000000000000000000000000000006111c263038414950565e6165686a6a6966625f57514b433a32291e150a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b141b22272f383f44464d535559565e616364646565646362605c5455534e49443e36302920191007000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c141c2328323a41464d53555753514b433b33291f160c0100000000000000000713202d3a4653606d7984919eaab4bfcac4b7ab9f94887b6e62554b4135291f160d0705060b141d28333f4a54606d7985929fabb8c5d2c7baaea194877b6e6154483b2e2115080000000000000000000000000000000000000000000000000000000003070b0d0e1110080d11131416181c1f202221201d19130c040000000000000000000000000000000000000000000000000000000000000002060a0c0c13080d11131416181b1b1413110d0701000000000000000000000000000000000000000000000000000000000000000000000000000000000002060a070c1013141517191c1c1413110d080200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b12181c1f2022201f1b1715120f0a08060200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c666d73747373737272727171717070706f6f6f6f6e6e6e6d6d6d6d6d6d6d6d6d6d727f8c98a2aebac6cec4bab2acaaaaacb1b9c3cec8bbaea195887b70707071717172727273737374706b6155483c2f231609000000000000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfc4b7aa9d9184776a5e514445525f6b7885929eabb8c5bcafa296897c6f6356493c30231609000000000000000000060e151b1f2122272622211f1b150f0a0300000000000000000000030f1c28333f4a545b60686a6a6b686d70727476797a736d635757595d5f5f5d5954524d443f3637434e585f626a6a6a676d6e70727477797a716d62564a3d3124170b00000000000000000000000000000000000000020b172027333f49535e686f7c87929fa5afa89e938a7e71727f8b949faab4bfcacbc0b5aba0968e81746c61574d42382e22190d0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d17202a333d46505a626d73808c939a99928c837b6e685e544a3f34281c1003000000000000000000000000000000000a141e262f383f444c5254585c5d5e5c5955534d45403a312920170c030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171d262d33373c4247484c4c5254565758585857565553504a4847433c39332a251f170e07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d161e262e343e444c52575f6164605d554d453b31281d1207000000000000000006121f2c3844515c66737f8c98a2aebac7c7bcb0a69a8d8074675d51453d31281f18141213151d262f3844505b66717e8a97a2adbac6d3c7bbaea194887b6e6155483b2e22150800000000000000000000000000000000000000000000000000000000000000000104040001050707070c101313161413110d080200000000000000000000000000000000000000000000000000000000000000000000000000060001040707090b0e0e07060401000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040607080a0d0f10070705010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050c151c23282c2d2f2d2b2722211f1a1514120f0a06030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d79808080807f7f7f7e7e7e7d7d7d7d7c7c7c7b7b7b7a7a7a7a7a7a7a7a7a7a7a7a7b85929facb8c5d0ccc4bdb9b7b7b8bcc3ccd5cabdb0a4978a7e7c7d7d7d7e7e7e7f7f7f8080807d7063574a3d3024170a000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3bfc4b7aa9d9184776a5e514445525f6b7885929eabb8c5bcafa296897c6f6356493c3023160900000000000000000000030a0f1215151a191515120f0a04000000000000000000000000000b17222d38424a50535b5e5d565e61636567666c6d68635b5b63656a6c6b6a66615e565046413a3c464e53555e5d555d6062636568666d6d68625a50453a2e2115090000000000000000000000000000000000000000050e17222d38414c56606a727f8c939ea8afa59f92867b7b86929fa6b0bcc5cdc5bbafa3999184796d605a50453b30261c1007000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e18212b343e47515b636e74818b8d8c8680796e695f564c42382e23170b0000000000000000000000000000000000020c141d262d333a4146474b4f50514f4c4847423c352f281f170e050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b141b22272b31373a3b3f414647494a4b4c4b4a4a4846443f3b3a37312d28221a140d05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060e171f2830383f444f565e61696e716d675f574d43392f24180d010000000000000004101c2834404a54616d7a86929fabb5c0cbc2b8ab9f92857a6d60594f433a312924211e2021272e38414c56606c7884919da9b3becad6c8bbaea195887b6e6255483b2f2215080000000000000000000000000000000000000000000000000000000000000000000000000000000000000406070907070401000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e171e272e34383a3b3937332d2e2b2622211f1a15130f0a05020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b878d8d8c8c8c8c8b8b8b8a8a8a89898988888887878786868686868686868686879298a2aebac3c3c3c3c3c3c3c4c5c8ced5d8cbbfb2a69a908a89898a8a8a8b8b8b8c8c8c8d8d8175685b4e4235281b0f000000000000000000000000000000000000000000000d1a2733404d5a6673808d99a6b3c0c4b7aa9e9184776b5e514445525f6b7885929eabb8c5bcafa296897c6f6356493c30231609000000000000000000000000030608090d0c0908060300000000000000000000000000000006111c262f383f44464f51504c52545658545b60615e5657636d7277787877736e68625a524c443e3c43474851514b5154555658545c60615e5650483f34291d110500000000000000000000000000000000000000000006111b262f3a444e58626d75828f96a0abaea2989083829098a2aeb8c2cec5bbb0a69f92877c6f675d51483e33291e140a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f19222c353f49525c606c787e817f7b736d665f574d443b30261c1106000000000000000000000000000000000000020b141b22273035393a3f42444443403b3a373129241d160d0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171b1f262b2e2f3036393b3c3e3e3f3f3e3d3c3a38342e2e2b26201c170e0902000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f182029313a424a505961686d757b7d796e695f554b4035291d100400000000000000000c18232e3946525e6874818d99a3afbbc2c6baaea2988d80746b60554c433c352f2d2a2c2d30394049535e68717e8a95a0acbbc5d0dbc8bbaea195887b6e6255483b2f2215080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306060c0d0b09070705010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c17202930394044464846443f3c3a37312f2e2b26221f1b15110e0903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c7986929a9999999898989797979696969595959494949493939393939393939393949fa2aab4b6b6b6b6b6b6b6b7b8bcc3cbd5dfcec2b7aca29a979696979797989898999999988c7f7265594c3f3226190c000000000000000000000000000000000000000000010d1a2734404d5a6773808d9aa6b3c0c4b7aa9e9184776b5e514445525f6b7885929eabb8c5bcafa296897c6f6356493c3023160900000000000000000000000000000000010000000000000000000000000000000000000000000a141d262d333839424444414647494b4a505354524c5965727f838585837f7b716c615e564f4540393a3c4444414547484a4c4a505354524c443f362d22180c01000000000000000000000000000000000000000000000a141d28323d46515b606d7a849199a3aeaa9f959090949faab4bfcacabeb3a99f948c7f736a60554b41362c21170c0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007101a232d374044505b666c7174726e69605c544d453b32291e140a0000000000000000000000000000000000000000020a11171e25292d2e3235373736332f2e2b261f18130c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f151a1e2122252a2d2e303131323231302f2d2c2823211f1a15100b0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050f18212a323b434b545c606b707a81878a847b6e675d5145392c201306000000000000000007121c2935414c56626e7b87929fa6b0bcc5beb4aa9f93887d70675d554d45403b3a36393a3d434b515b656d7a84919ea7b1bccdd7d5c8bbaea295887b6f6255483c2f2215090000000000000000000000000000000000000000000000000000000000000000000106090b0c0c08070502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f1213181918161413110d080b08060503000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e29323a424a5153555350494847433f3b3a37312e2b27201e1a140f0b06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505b667784919ea6a6a5a5a5a4a4a4a3a3a3a2a2a2a2a1a1a1a0a0a0a0a0a0a0a0a0a0a0a1aaaaaaaaaaaaaaaaaaaaaaaaacb1b9c3cdd9d3c8beb4aca6a4a3a3a3a4a4a4a5a5a5a6a3978a7d7064574a3d3124170a000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0c4b7aa9e9184776b5e514445525f6b7885929eabb8c5bcafa296897c6f6356493c302316090000000000000000000000000000000000000000000000000000000000000000000000000000020b141c22282b2d35373036393a3d3f3f44464746505d697683909292908c867e756d686159514b433d342e2f35393a3b3d3f3f44464746413a322d241b11060000000000000000000000000000000000000000000000020b16202b343f45525d686f7c87929fa5afa79f9d9c9fa6b0bcc6ccc3baada2979082786c60584e433a2f241a0f05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008111b2428333f4a545b60656765615e57514b423b332a20170c0200000000000000000000000000000000000000000000060b13191d202125292a2b292622211e1a150d07010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e121415191e20212324252525242322201f1c1714120f09030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040e17212a333c444d555d666d747d858e93969184796d6053473a2d2014070000000000000000000d1925303a47535f69737f8c949faab3bec5bbafa49a9184796d675f57514b4846424547494f555c606c77828f96a1adb9c3ced7d5c8bbafa295887c6f6255493c2f2216090000000000000000000000000000000000000000000000000000000000000000060d12161819191514120e09050100000000000000000000000000000000000000000000000000000000000000000000000000040607060503000000000000000000000000000000000000000000000000000000000000000000020a11171c1f202526242321201e191a171513120f0b060806020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d1925303a444c545c6062605b5355534e4b4847433c3b37322d2a251f1b17110b0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515d677885919ea5a4a3a3a2a1a1a0a0a0a39f9f9f9e9e9e9e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9da0a7b1bcc8d4d6cabeb3a9a29f9fa3aba1a2a2a3a4a4a5a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0c4b8ab9e9185786b5e524545525f6c7885929fabb8c5bcafa396897c706356493d3023160a000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171c1f20282b252a2d2e302d3338393a3b4854616e7b8491979d98928b827a706b605d554e443f3830292c2d2f302e34383a3a39363029201b120900000000000000000000000000000000000000000000000000040e19222935414c56606a727f8b939ea8b1aba9a9abb0b8c2cec3baafa59f92857b6e665b50463d31281d120800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091217222d38424a5053585a5954524d454039302a21180e0500000000000000000000000000000000000000000000000002080d111314181c1d1e1c191514120e09030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020608080e11141416171819181717151312100c060602000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d162029333c464e565e676d78808a91979fa0968c7f7366594c403326190d00000000000000000008131e2b37424d57606d78839098a2aebac0c0b6aca1969082796e69605d5555534d5154555960676d75808d949ea9b2babec5cdd7c8bcafa295897c6f6256493c2f231609000000000000000000000000000000000000000000000000000000000000010911181e2224252521211e1a14110d0802000000000000000000000000000000000000000000000000000000000000000000070c10131313120f0b06000000000000000000000000000000000000000000000000000000000000020b141c22282b2d3233312f2e2d2a25272422201f1b171514120e090705020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111d2a36414c565e666d6e6c6565625f585855534e4947433c3a36302b27221b17110a02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a86939898979796959594949393999292929291919190909090909090909090909090909090909090909090909095a0acb8c4d1d3c6baada297929299949495969697989899988c7f7265594c3f3226190c000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0c5b8ab9e9285786b5f524545525f6c7885929fabb8c5bdb0a3968a7d7063574a3d3024170a0000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f12131c1e191d20212322282b2d2e3a46525e696f7c859298a29f938f857d746d676058504a423c332a25222323282c2d2e2d2a251e170e09000000000000000000000000000000000000000000000000000000071019242f3a444e58626d75818e96a0aab4b6b6b7bbc2cac6bdb2a89d938a7e71695e544a3f342b1f160c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c262f383f44464b4e4c4846423b342e271e180f06000000000000000000000000000000000000000000000000000000010507070c0f1111100d08080602000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002050708090b0b0c0c0b0a09070603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c161f28323b454e585f696e79828d929ea1a69f958e8275685b4f4235281c0f000000000000000000020e1a26313c44505c666e7b85929fa3afb6bebeb2a89f9490837b736d6764615f575d6062646b7079818d929ca6ababadb3bbc5cfc9bcafa296897c6f6356493c302316090000000000000000000000000000000000000000000000000000000000010a131b23292e3132322e2d2a25201d19130f0a040100000000000000000000000000000000000000000000000000000002090e12181c1f20201f1b17110a02000000000000000000000000000000000000000000000000000000000a141d262d3338393f403e3c3a39363033312e2d2b272222211e1a1514120e090603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3946525e686d797b7975726f6a6865625f5855544e4746423b37332d27221b140b0a0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c888c8c8b8a8a898988878786868686858585858484848483838383838383838383838383838383838383838383909daab7c3d0d2c5b8ab9f92858686878888898a8a8b8c8c8d8d8275685c4f4235291c0f000000000000000000000000000000000000000000010e1b2834414e5b6774818e9aa7b4c1c5b8ab9f9285786c5f524546525f6c7985929facb8c5bdb0a3978a7d7064574a3d3124170a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306060f080d11131416171c1f202a36424d575f6a707d869299a49e97918a81796f6a605c544d453f36302920181c1f2021201e19130d05000000000000000000000000000000000000000000000000000000000008131e28323c46515b606d7a849198a3aebac3c4c7cdcbbfb5aba0968e81746c61574d42382d22190d04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d262d3338393e413f3b3a363028231d150c0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a151e28313a444d575f6a6e7b838f949da4a69e9490837a6e6154473b2e2114080000000000000000000009151f28343f4a545f69717e8a919fa4acb4bcbab0a69f9590867f7a74716e696b676d6f71777d838e939ca4a29f9fa2a9b3becac9bcb0a396897d7063564a3d3023170a00000000000000000000000000000000000000000000000000000000000a131c252d343a3e3f3f3b3a36312d2a251e1b16110d0701000000000000000000000000000000000000000000000001070d141a1d23282c2d2d2b27221b140b02000000000000000000000000000000000000000000000000000006111c262f383f44464b4c4b4947464142403e3b3937332d2f2e2b2621201e1a13120f0b060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121e2a36424d57616d7a848885827e7b7875726e6a6662605854524d46443f38332d261d1b150d07010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a80807f7e7e7d7c7c7b7b7a7a7979797978787878777777777777777777777777777777777777777777777777788693a0acb9c6c6b9aca093867979797a7b7b7c7d7d7e7f7f80817f7165584b3e3225180b000000000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1c5b8ac9f9285796c5f4a3f46535f6c7986929facb9c5bdb0a4978a7d7164574a3e3124170b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020001050707060b0f121a25303b454e58606b717e87939fa4a19e928e847c736d665f575146413b3229241d16131413110d0802000000000000000000000000000000000000000000000000000000000000010c16202b343f45515d676f7c86929facb9c5d2d3cdc5bbaea3999184796d605a50453b2f261c10070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b141c22282b2d3234322e2d2a251f18120b0300000000000000000000000000000000000000000000000000000000000000000002070a0c0d0f0e0d0c0b0c0d0d0e0a0907040000000000000000030608090a0807060401000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030709090908060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c263039434c565e696e7c8490959ea6a59e948f827a6e685e5246392d20140700000000000000000000030b17232e38424d57616c727f8c939aa2aab0b9b8b0a7a098928c85817d7b7978787a7c7e838990959ea5a098929297a2adbac6c9bdb0a3968a7d7063574a3d3024170a00000000000000000000000000000000000000000000000000000000050f1c252e373f464a4c4c4846423b3936302c27201d18130e09030000000000000000000000000000000000000000060b12181f252a2e34383a3937332d261d140a00000000000000000000000000000000000000000000000000000b17222d38424a50535859575654524c4f4d4a4846443f3e3b3a37312e2d2a25201f1c17120f0b06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a46535e6975818e96928e8b8885827e7b78736f6a66615e57535049443f382f2b262018130c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3946525e686d747372727170706f6e6e6d6d6d6c656c6c6b6b6b6b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6d798693a0acb9c6c7bbafa39986796c6d6d6e6f6f70717172737374716d62564a3d3124170b000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1c6b9ac9f938679665c504446535f6c7986929facb9c5bdb1a4978a7e7164574b3e3124180b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000309141f29333c464f59616c727f8b929ca5a59d96918780786e69625b524c443e352f281f18120b050100000000000000000000000000000000000000000000000000000000000000000007121d27313945515c676f7c86929facb9c5d2cfc5bbb0a69f92877c6f675d51483e33291d140a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171c1f2025272621201e1a140c0700000000000000000000000000000000000000000000000000000000000000000000070e1316191a1c1b1a191819191a1b171614100b0500000000040a0f13151617151413110d070c0b09070604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f1315161615130f0a04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061017232e38424b555e686e7b849196a0a7a69e938e82796d685e564c41362a1e1105000000000000000000000006111c26303b45505a626d727f8892989fa6adb2b8b1aaa29f98928e8a8886858587888b90959d9fa39f95908585929fabb8c5cabdb0a3978a7d7064574a3d3124170a000000000000000000000000000000000000000000000000000000030d17212e373f495156585854534d4746413a38322c29241d1a140e090300000000000000000000000000000000020a11171d242930363940454646443f382f261b1106000000000000000000000000000000000000000000000000030f1c28333f4a545b6065666462615e565c5a57555350494b4847423e3b3a36302d2b28221f1b17110e0903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b86929f9e9b9897928e8b8884807c77736e6963605b535049413e373129241d160d060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111d2a36414c565e6167666565646463626261616060605b5f5f5f5e5e5e5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d606d798693a0acb9c6c5b9ac9f9286796660616162636364656566676765625a50453a2e211509000000000000000000000000000000000000000000020f1c2835424f5b6875828e9ba8b5c1c8bbafa49a86796d60534644505c667986939facb9c6beb1a4988b7e7165584b3e3225180b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d17212a343d47505a626d73808d939ea6a8a099928c837b726d615e565045403a3128231c150c030000000000000000000000000000000000000000000000000000000000000000030d18232f39434e58606d79849199a3afbbc7d4cabeb3a99f948c7f726a60554b40362c21170b02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f1213181b191514120e0902000000000000000000000000000000000000000000000000000000000000000000010a12191f2325262927272625252627282323201c160f080000070f151b1f2223232220201d181b1917151313100c07090706040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b161b1f222323221f1b150d0801000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c182228343f4a545d676d7a839196a1a8a89f948e81786d675d564c443b3025190d010000000000000000000000000a141e29333e48515b626d727d868f949ea1a8acb1b4aeaaa29f9b97999292929795979d9fa69e99928d837b84919eaab7babfbdb0a4978a7d7164574a3e3124170b00000000000000000000000000000000000001040607080a0b0b0b09141f29333f49515b626565615e5754524c48433d39352f2a251f1a140e090300000000000000000000000000060b141c22282f353b42464b515353504941382d22170c02000000000000000000000000000000000000000000000006121f2b3844505b666c7273716f6d686a68666461605b535855534d4b4846423d3938332d2b27221b1a14100b0300000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b989da0a7a9a19e9b9896918d8884807b75706c65605b535047433c352f281f17110a020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d1925303a444c52545a5959585757565655545453535350495252525151515150505050505050505050505050505050505053606d7a8693a0adb9c6c5b8ac9f9285796c5f5455555657575859595a5a585650483f34291d1105000000000000000000000000000000000000000000020f1c2935424f5c6875828f9ba8b5c2ccc0b6a093867a6d6053474653606d79869aa4afbbc8beb1a5988b7e7265584b3f3225180c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050f18222b353e48515b606c77818e949fa7aba39f9590867e756e68615a514b433d342e271e150b00000000000000000000000000000000000000000000000000000000000000010b151f2934404b55606a73808d95a0abb5c0cbd2c6b9ada2978f82786c60584e43392f241a0f050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306060b0e0c0807050200000000000000000000000000000000000000000000000000000000000000000000000a131c242a2f3233353433323232333434302f2c27211a110807101920272b2e2f302f2d2c292427262422201f1c1818161413110d0707060400000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a111721272c2f302f2e2b272019130c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e2a343c44505c666d79839095a0a8aaa1969082786d665d554c433b32291e140800000000000000000000000000020c17212c363f49515b626c707b828b91969da0a7a9acafaeaba7aba39f9e9ea1a9aba39f9b948f8780797885919eaaacaeb4b5b1a4978a7e7164574b3e3124180b0000000000000000000000000000030607070d1113141516171818181a25313b45515b636d72726e6966615e56544f4745413a36312a251f1a140c0701000000000000000000020a11171d262d333940454d52555c60605b53493f33271e140a00000000000000000000000000000000000000000000000613202d394653606c787e7f7e7c7a79777573716e6c656764625f575854524d4946443f3937332d2a251f1b16100c060000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d868b90959a9ea1a9a8a8a19e9996918c87827d78716c65615a534e45403a3128221c140b03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e29323a4146474d4d4c4b4b4a4949484847474646443f4545454544444444444444444444444444444444444444444753606d7a8693a0adb9c6c5b8ab9f9285786c5f524848494a4a4b4c4c4d4e4b4a453f362d22180c01000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2d2baada093877a6d6054474754606d7a8793a0b6c0ccbeb2a5988b7f7265584c3f3225190c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061019232c363f44505b656d78828f95a0a8afa79f98928b827a706c605d554f44403930271c120700000000000000000000000000000000000000000000000000000000000007121d27313945515c676f7c87929fa8b1bdc7d1d1c5b8ab9e92857b6e665b50463c31281d120800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121c252e353b3f404241403f3e3f4040413d3c38332c231a0f1019222b32373b3c3d3b3a39352f3433312f2d2c2823252321201d18161413100c0706030000000000000000000000000000000000000000000000000000000000000000000000000000020c141c232832383b3c3c3b373229241e160d0700000000000000000000000000000000000000000000000000000000000000000000000000000007121d27303c46505a606d78828f959fa8aea29891847a6d665c544b433a312920170d020000000000000000000000000000060f1b242d373f49515961696e777e848b9095999d9fa3aba6a7a7a8a7a7aca49f9c99928f89827c746d7986929d9e9fa2aaa8aba4978b7e7164584b3e3125180b000000000000000000000000060b10121316181d2020222324242525252a36424d57636d727f7f7b77726d6863605954514b46423b36312a251f18120b0300000000000000050c141c23282f383f444b51575e61676d6c655b50443c30261c110600000000000000000000000000000000000000000006121f2b37434e5865727f8b8c8a8987858482807d7b797674716e696864615e575653504a46443f3836312c271f1c17110a03000000000000000000000000000000000000000000000000000000000000000000000000000a1623303c4955616c707a7f83888d92979da0a7acaba8a09e99928f89837e78716c625f58514b433d332d261d150d0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c1720293036393a41403f3f3e3d3d3c3b3b3a3a3a3937332d383838383737373737373737373737373737373737373a4754606d7a8793a0adbac6c5b8ab9f9285786c5f52453c3c3d3e3e3f4040413e3d3a342d241b11060000000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5bebfbaada194877a6e6154474754616e7a8794a1adbad2bfb2a5988c7f7265594c3f3226190c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007111a2427333f49535c666d79839096a1a9b1aaa29f948f857d746d676059514a42392e23180c0200000000000000000000000000000000000000000000000000000000030d18232f39434e58606d79849199a3afbac3cfd3d2c5b8ab9f92857b6e665c51443d32291d140a000000000000000000000000000000000000000000000000000000000000000000000000000000000306070c0d0a07060401000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e19242e3740474b4d4f4e4d4c4b4c4c4d4e4a48443d352c211618222b343d4347494a4847454042413f3e3c3a38342e32302d2c292423201f1d181312100b060501000000000000000000000000000000000000000000000000000000000000000000000a141e262e343d4348494947433d352f282018100800000000000000000000000000000000000000000000000000000000000000000000000000020b18232e39434e58626c74818e949ea7afa59f92867c6f685e544b423931281f170e050000000000000000000000000000000009121b252d373f474f575f656c71797e83888d90929997999a9b9b9b9a999a93908b86827d756e6a6e7a879290919298979b9fa2988b7e7165584b3e3225180b00000000000000000000020a11171c1f202324292c2d2f303131313232323a46535e69727f8b8b87837f7a756f6b65605d55534d46423b363129241d150d090300000000070f171e262e343c424a50555d60696e7379786c60584e42382e2317110a02000000000000000000000000000000000000000815212e3a47535f6a7884919997959892908f8d8a888583807e7b7874716e696763605b5453504946423b38322c28231c150c0a0400000000000000000000000000000000000000000000000000000000000000000000000814202d39444f5961686d72777c80858a90959da0a7acacaba39f9b95908a837e766f6a605d554e443f382f271f170e0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e171e252a2d2e343332323131302f2f2e2e2d2d2d2b27222c2b2b2b2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2e3a4754616d7a8794a0adbac7c5b8ab9e9285786b5f524538303031323233343432312e29221b1209000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9b1b2b2b4aea194877b6e6154484855616e7b8894a1aebbc3bfb2a6998c7f7366594c403326190d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081217222d38414a545d676e7a849197a1aab4aea69e97928a81796f6b605c544a4034281e1308000000000000000000000000000000000000000000000000000000010b151f2934404b55606a73808d95a0abb5c0ccccc7c3c2baada2979083786d60594f443b2f261c110600000000000000000000000000000000000000000000000000000000000000000000000000060c101213181a161413100d07070501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007131f2a3540495257595c5a5a595858595a5b56554f473d33271c202a343d464e5456565553514b4f4e4c4a48464540413f3c3a39352f2f2d2c2924201f1c1713110d08040000000000000000000000000000000000000000000000000000000000000006111c2630383f444f545656544e45413a322a221a11080000000000000000000000000000000000000000000000000000000000000000000000000a141d2834404b555f6a717e8b939da6b0a99e938a7e716a5f564c423930271f160d050000000000000000000000000000000000000a131b252d353e454d535b60666d72777c808386898b8c8d8e8e8e8d8c8987837e7a75706b62606c788285848485888b8e9298988b7e7265584b3f3225180c000000000000000000080c141c23282b2d302f35393a3b3d3e3e3e3e3f3f3e4854616e7b86929895908c86817c77726d67615e57534d46423b352f271f1a150b060000091119212930383f444e545b60676d737b808581746a5f544a3f3428221c140b030000000000000000000000000000000000000915222f3c4855626f7b8896a1a4aaa29f9d9b99979892908d8b8884817e7b7774706c6663605b53534d48443d38342e261e1b160d080200000000000000000000000000000000000000000000000000000000000000000004101c28333e474f565d61656a6f74797e838a90959da0a7adafaca7a09d95918a827c746d676058504a4239312920170f0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050c13191d202127262625242423232221212020201f1b171f1f1e1e1e1e1d1d1d1d1d1d1d1d1d1d1d1d1d1d212e3a4754616d7a8794a0adbac7c4b8ab9e9185786b5e5245382b242425262627272524211d18110900000000000000000000000000000000000000000000000003101d2a3643505d697683909ca4a4a5a5a7a9a194887b6e6155484855626f7b8895a2aeb6b7b8b3a6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111b262f39424b555e686e7b859298a2abb5b0a9a19e938e847c736d665c51443a3025190d01000000000000000000000000000000000000000000000000000007121d27313945515c676f7c87929fa8b1bdc7cac2bbb7b6b8b3a99f958d80736b61564d42382d22170e0400000000000000000000000000000000000000000000000000000000000000000000030a11171c1f2025262320201d181413110d08060200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a16232f3b47525c63666867666565656667676360594f44382c2026323c464e5860626362605d555c5a59575553514b4d4b494745413f3c3a38352f2d2b2823201d1913100c0700000000000000000000000000000000000000000000000000000000000b17232e38424a50596063626058524c443c342c231a12080000000000000000000000000000000000000000000000000000000000000000000006111b262f3845515c676f7c86929fa5afada2978e81746c61584e443a30271e150d0400000000000000000000000000000000000000010a131b232c333c414950545c60656a6f73767a7c7e8080818281807f7d7a76726d686360595b656c76787777797b7e8285898d8b7e7265584b3f3225180c00000000000000020b111a1e262e34383a3c4040454748494a4b4b4b4c4c4b4c5965727f8c959d9f9d98928e89837e7a746e69615e57534d454039312b262017110a0a121b232b333b424a50585f666c717980868d92877c6f665c504440332d261d150c0400000000000000000000000000000000000a1724313d4a5764707d8a9896999b9d9fa2aaa6aaa29f9c9a9796918e8b8784817c78746f6c65615e57544f46443f38302b272019130d050000000000000000000000000000000000000000000000000000000000000000000b17212c353e444c5254585f62666d71787d838a90959fa2a9b0b1aca7a09d94908780796f6a605b544b433a322921170e050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d1113141a1a191818171616151514141313120f0b1212121111111111111111111111111111111115212e3b4854616e7b8794a1aebac7c4b8ab9e9185786b5e5245382b1f171819191a1b181715110c060000000000000000000000000000000000000000000000000004101d2a3743505d6a76839098979798999a9d9f95887b6e6255484956626f7c8995a2a9a9aaabada6998d8073665a4d4033271a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d27303a434c565f696f7c869299a3afbbb3ada59d96918780786d60564c41362a1d110500000000000000000000000000000000000000000000000000030d18232f39434e58606d79849199a3afbac3cec2b8b0aba9abadb1a79f93887d70685e544a3f332820160c020000000000000000000000000000000000000000000000000000000000000000030c151c23282c2d3233302d2c292421201d1914120e09060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4b57636e73757473727172737374706b6055483c2f232b37434e58606a6f706e6d676a6967666462605c555a585654514b4c494745403c3a38342e2d2a251f1c18120f0a040000000000000000000000000000000000000000000000000003101c28343f4a545c606b6f6f6a605d564e463e362c241a12080000000000000000000000000000000000000000000000000000000000000000000b17222d38414e58606d79839198a2aeb1a79f92857a6d615a50463c32291e150c03000000000000000000000000000000000000000000010a111a212a2f383f444b5153585f6266676d6f7173747475747472706d6865615d56544f535b60696c6a656c6e7175797d80827b6e6155483b2e221508000000000000010b141d232c30383f4446494c4b51535556575758585858585757626f7c838a90959d9f9f9b95908b85807b746e69615e57514b433e373127221b14131c252d353d454d545c606a6f787e848c9298999082786d605b52443f382f271e160d04000000000000000000000000000000000916222f3c4955626f7c86888a8c8e909298989b9ea1a9a8a7a8a19e9b9796918d8985807c78736e6963605953504a423e38322a251e170e08010000000000000000000000000000000000000000000000000000000000000005101a232c323a4146474e53545c60656c70787d838b92979fa6aeb4b1aca69f99928d847c726c665d554c443b332920170d040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010507070e0d0c0c0b0a0a090808070707060503000005050504040404040404040404040404040815222f3b4855626e7b8895a1aebbc8c4b7ab9e9184786b5e5145382b1e120b0c0d0d0e0b0b090501000000000000000000000000000000000000000000000000000003101d2a3643505d6976828b8b8a8b8b8c8e909298887b6f625548495663707c89969c9c9d9d9ea1a99a8d8073675a4d4034271a0d01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b151e28313b444d57606a707d87929fa4aeb7b9afa8a099928c8275685e5246392d201307000000000000000000000000000000000000000000000000010b151f2934404b55606a73808d96a0abb5c0ccc5bcb0a69f9c9fa2a9afa49a92857a6e665b50443d32281e130800000000000000000000000000000000000000000000000000000000000000000a151e262e34383a3f403d3a39352f2e2d2924211e1a15130f0a050100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2633404d596673808281807f7e7f7f80817d7063564a3d30232e3b47535f6a6f7c7d7b7a7877757472716f6d6769676563605d55585653514b4946443f3a3936302c28231d1b150f0a04000000000000000000000000000000000000000000000006121f2b3844505c666d747c7c746d685f5850483e362c241a110700000000000000000000000000000000000000000000000000000000000000030f1b27333f49535f6a73808c95a0aab4ac9f958b7e72685e52483e342a20170c03000000000000000000000000000000000000000000000000080f181d262d33394045464e5355555d6062646667686868676663615e5654524c48414950535c5f535b606164666d7074756e695f53463a2d2114070000000000000a131d262f353e424a50535659555d606263646464656565656464636a6f777d838990959c9fa09d98928d86817b746e69605d555047423c332d261d17262e373f474f575e666d737c838b91969fa29f948d80746d635b504a423930281f160b020000000000000000000000000000000815222e3b4754606a6f787b7d7f818385888b8e9197989b9fa2aaaba7a8a09e9a97918d8984807b75706b64605c545047433d3630292019130c040000000000000000000000000000000000000000000000000000000000000008111a20283035393c43474b51535b60656c70787e858f949fa3aab1b8b0aba39f9691877f786d675e564d453b32291f160b02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c8995a2afbcbfc1b7ab9e9184786b5e5145382b1e12050000010100000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b7e7e7e7e7f7f81838588877b6e6154484a5663707d898f8f8f9090919795978d8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c161f29323c454e58616b717e8b929ca5afb8bab2aba39f94877a6d6154473a2e21140700000000000000000000000000000000000000000000000007121d27313945515c676f7c87939fa8b2bdc7cabeb3aa9f948f9297a2adaca1978f82786c60594f443a302419100700000000000000000000000000000000000000000000000000000000000006111c2630383f44464b4d494745403d3a3935302e2b26221f1b15110d0803000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3845525e6b78848f8d8d8c8b8b8c8d8d8073665a4d4033272f3c4855626f7c87898886858482817f7d7b79777674726f6d67686562605d555653504a4746413a38342e2b26201b16100b050000000000000000000000000000000000000000030f1b27333f4953606d78818987817a6f6a615a50483e362c23190f0500000000000000000000000000000000000000000000000000000000000005121f2b3744505b656f7c87929fa7b1afa49a9083786c60564c41362c22190e050000000000000000000000000000000000000000000000000000060b141b22272e34383c4347484b51535658595a5b5b5b5a595654524c4746413a383f44464f5249505355545c60636768615f574d42372b1e12050000000000050e1c252f3841474f545c60636669676d6e7071717171727271717070706e6d70767d838990949da0a29f99928e86817b736d67615a534e443f382f292228384049515960696e787f8790959ea1a9aea69d928b7f736e605b544b433a31281d140a00000000000000000000000000000006131f2b37434e5860666c6e70727477797b7e8185888b8f92989c9fa3ababaaa9a19e9a96918d87827c77716d66615a544e46413a3229241e160d0700000000000000000000000000000000000000000000000000000000000000080e161e24292d32373940454950535b60656c717b828b9298a0a7b0b8b5afa8a099928c81796d685e574d443a31281d140a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afb2b3b4b7ab9e9184786b5e5145382b1e12050000000000000000000000000000000000000000000000000000000000000000000000000714212d3a46535f696e7272717172727476797b7d70695e53464754606d798182828383848587898b8d8174675a4e4134271b0e010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d17202a333d464f59626c73808c939da6b0b9b9aea49e9285786c605346392d2013060000000000000000000000000000000000000000000000030d18232f39434e58606d79849199a4afbac3cfc6baaea2988f8285929fa6b0a99f948c7f736b60564c41352922190d0400000000000000000000000000000000000000000000000000000000000c17232e38424a505358595653514b4a4746413b3a37312e2b27201d19130f0b0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111e2b3744515e6a7784919a9998989899998c7f7366594c403328343f4a546774818e99959792908f8d8c8a88868482807e7c7a7774726f6d676662605c5454524c4645403937322c27211c160f0a0400000000000000000000000000000000000005121f2b3744505b6574808d93938d847c706c615a50483e352b21170c030000000000000000000000000000000000000000000000000000000004101c2834404a54606c78839099a3aeb9ac9f93877c6f665b50443a30241a100700000000000000000000000000000000000000000000000000000000020a11171d23282c31373a3c404547494b4d4d4e4f4e4d4c4a4746413a3935302d33373943453f4446484b5153565a5c55534d453c31261a0e0200000000020d17202e37414a535961666d6f7376787a7b7c7d7e7e7e7f7f7e7e7d7d7c7b79777573767d838990959fa2a39f99928e868079716c625f575049413b332d33404a525b626b6f7b838c9299a0a7adb2baaea49b918b80746c665c554c433a2f261b11060000000000000000000000000000030f1b27323c464e545b6061636668666c6e7175787b7e82858a8f92999d9fa7aaadaba8a19e99928f89837e78706c626058524c443e352f281f19100800000000000000000000000000000000000000000000000000000000000000040c13191d20262b2e34383f444950535b60696e777f8690959fa6afb7bbb2aba39f938f837a6e695e564c433a2f261c11060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97aca4a5a6a7aaab9e9185786b5e5245382b1f120500000000000000000000000000000000000000000000000000000000000000000000000005121e2a36424d575f6165656464656667656c6e706b60574d4245515d676d747575767677787a7c7e807d6f6356493c3023160900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e18212b343e47505a636e74818e949ea7b1aca49d928b7e72655b5044372b1f120500000000000000000000000000000000000000000000010b151f2934404b55606a73808d96a0abb5c0ccc6bdb0a69f92857b7e8b949ea9b0a69f92877d6f685d52463f342a1f160c0100000000000000000000000000000000000000000000000000000003101c28343f4a545c60656663605d555754524c4847423c3b37322d2a251f1b17110b060000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111e2a3744515d6a7784909da6a5a4a5a5998c7f7266594c3f332c3844505c667884919796999b9d9c9a99979993918f8d8b898684817f7c7a76736f6d6665615e5653514b47433c38322c27211b150c0701000000000000000000000000000000000613202d394653606c788591969f9691867e716c615a50473d33291e150b0000000000000000000000000000000000000000000000000000000006121f2c3844515c66717e8a959fabb5b1a79c8f82756a5f544a3f32291e120800000000000000000000000000000000000000000000000000000000000000060b12181c1f262b2e2f35393a3c3e4041414241413f3d3a3936302d292422272b2d362d3337393b4045464a4d4f4846423c332a1f1409000000000009141f29324049535c646b70787c7f83858688898a8a8b8b8b8b8b8a8a898988868482807c77767d838b92989ea5a39f98928c847e766e6a605b534d453e383f44525c636d727d8590959fa3abb1b9bdc0b6ada39b928c80786d675d554c41382d22170b0000000000000000000000000000000a15202b343c424a5053555759545b606165686a6e7275797e82868b90959c9ea6acafadaba39f9b95908b847d766f6a615e565045413a312b221a12060000000000000000000000000000000000000000000000000000000000000002080d11151b1d23282d33383f444950575e656c727c838f949ea5afb8bdb5afa59e9590847b6e685e564c42382d22170d0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a9a969798999b9d9f9e9285786b5f5245382c1f1205000000000000000000000000000000000000000000000000000000000000000000000000020e1a26313b454d5355585857585859535b60616360594f453b414b555d60676869696a6a686d6f71736f6b6054483b2f2215090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f19222c353f48525b606d78828f959fa8a19e928d80746d6253493f33271b0f030000000000000000000000000000000000000000000007121d27313945515c676f7c87939fa8b2bdc7cbbfb5ab9f948b7f7275828f97a2adafa39991847a6d615b51463c31281d130700000000000000000000000000000000000000000000000000000006121f2c3844505c666d7273706d676764615d5655534d4947433d3936302b27221b17110c06000000000000000000000000000000000000000000000000000000000000000000000000000000000004111d2a3744505d6a7783909daab2b1b2a5988c7f7265594c3f322d3a4653606d788285878a8c8e919299999c9f9f9e9c9a989993918e8b8986837f7c7975716d6864605c54534e48433d38322b262018120b0300000000000000000000000000000005121f2b3744505b656e7c849095a09892877e716c61594f453b30271d1207000000000000000000000000000000000000000000000000000004101c2834404b55606d7984919ea7b1b8aba095897d7063584e42382d20170d00000000000000000000000000000000000000000000000000000000000000000000070c10151b1f2124292c2d2f3133343535353433302e2d2a25201d19171b1f202922272b2d2e34383a3d41423b3a37312a21180e0300000000020e1925303b44515b646e747d83898c8f9297959697979798989898979796969992918f8c89847e78797f858e939ea1a9a29f96918a837b726c655e575048424a505c646e737f8792979fa7aeb5bdc3c9c8bfb5ada49c928d81796d675d53493f33271b0f030000000000000000000000000000040e19222b2f383f4446484a4c4a50535558585f6265676d71757a7f83898f949b9fa4acb0afaca7a09d95918a837c756d68615a514c433d342c2417110a020000000000000000000000000000000000000000000000000000000000000001050a0f12181b22272d33383f444d535b606a6e79828f939ea6b0b9c0bbafa79f9691847a6d685d544a3f33281f160c01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707d88898a8b8b8c8e9093999285786c5f5245392c1f12060000000000000000000000000000000000000000000000000000000000000000000000000009141f29333b4246484b4b4b4b4c4c4950535556544f473d333a434b51545a5c5c5c5d565d606264666360594f44382c1f130700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007101a232d364044505c666d798390969a96918980776c605b5141382d22170b00000000000000000000000000000000000000000000040d18242f39434f59606d79849199a4afbac3d0c7bbaea3999083776c6e7b85929fa6b0aba1968f82756d62584e433a2f24180f060000000000000000000000000000000000000000000000000004111d2935414c56606d787e807d7a7673706d6865625f5756544e4746413a37332d28221c17110a0300000000000000000000000000000000000000000000000000000000000000000000000000000004101d2a3743505d6a7683909da9b6beb2a5988b7f7265584c3f322c3844505c666d76787b7d7f828486898c8f9298999c9fa3a49f9d9b989992908c8985827e7a75706d66625f58544f48443d373129241d150d080100000000000000000000000000030f1b27333f49535f6a6e7a839097a19992877e706b60574d42392e23180c030000000000000000000000000000000000000000000000000006131f2c3845515c67727f8b96a0acb9b2a99d9083776b6054463c2f261c0e05000000000000000000000000000000000000000000000000000000000000000000000000040a0f1215181d20202325262728282827262321201d1913110d0b0f12131c171b1f2023282c2d3034352e2d2b261f180f06000000000005111e2a36424d56636d74808a9095999c9fa2a9a3a4a4a4a4a5a5a4a4a3a3aba39f9d9b9996918b827a727a818a92979ea6a8a19e9490867f776e69615a524a545b606e74808b9299a1a9b1bbbfc6cfcec9c6bfbaaea49d938e82796d655b5044372b1f12050000000000000000000000000000000710191d262d3338393b3d3f3f4446484b4e5355555d6064686d72777c82888f939a9ea6adb3b1aca8a09d949089817a706c605d554e463e3628231c140c0200000000000000000000000000000000000000000000000000000000000000000000070c11171b22272d333b414950585f676d78818f949fa7b1bbc1b9b1a8a09690837a6d665b50443d31281d1307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916222f3b4854606b707b7c7d7e7f80818486898c85786c5f5245392c1f120600000000000000000000000000000000000000000000000000000000000000000000000000030d18212931363a3b3f3f3e3e3f3f3f4446484948443d352b313a4145474e4f4f50504c525456585a56544f473d32271b0f030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008111b2428343f4a545d676d7a848c8d8a847d746c655b50493f2f261b1106000000000000000000000000000000000000000000010c161f2935404b55606b73808d96a0abb5c0ccc7beb2a89f92877c6f6569717e8b949ea9b2a89e938b7f726a5f554b41352921180d030000000000000000000000000000000000000000000000000713202c3945525d6873808b8c898683807d7a76726e696662605854524c46443f38332d28231c150c09030000000000000000000000000000000000000000000000000000000000000000000000000004101d2a3743505d6a7683909da9b6beb1a5988b7e7265584b3f3937343f4a545c6069696e707275777a7c7f8386898c9092999c9fa4ababa39f9d9997928e8b86827d79746f6a636059544f47433c352f271f19130c04000000000000000000000000000b17222d38414e575f686e7b859299a39992877d70695e544b4034281f1409000000000000000000000000000000000000000000000000000713202d3a4653606d7985919ea8b2b9ada1968a7e7164594f44342a1d140a0000000000000000000000000000000000000000000000000000000000000000000000000000000306070d11131416181a1a1b1c1b1a19171413110d08050100030506060b0f1213181c1f2023272922211e1a140e060000000000000714202d3a46525e69737f8c929da0a7a9abadb3afb0b1b1b1b2b2b1b1b0b0b5aeacaaa8a8a09e948f83796e757e858f949fa3aba69f98928b827b716c635b515b666c74808c929fa3abb3bbc2cbcdc7c4bdb9b4aeacaaa29f948f83786c605346392d20130600000000000000000000000000000000070b141c22282b2d2e302d3338393b3e4347484b5153565e61656a6f757c82878f949ea1a9afb6b1aca69f9c938e857d746d67605850483f342e261e140a000000000000000000000000000000000000000000000000000000000000000000000000060b11171b22272f383f444e555d666d78828f95a0a9b3bec2bab2a8a0958f82786c60594f433a2f24180d030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202c38444f5960696e6f7071727374777a7c7f8074675a4d4134271a0e010000000000000000000000000000000000000000000000000000000000000000000000000000060f181f262a2d2e32323131322d3337393b3d3b38322b23282f35393a4142424343414547494b4d4948443d352b21160a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091217232e38424b555e686d7a80807d79706b605b53493f372d1d140a0000000000000000000000000000000000000000000007131d28313a45515d676f7c87939fa8b2bdc7ccc0b6aca0968c80736a5f626c75828f97a2adb0a69f92867c6f675d51453e332a1f150b0100000000000000000000000000000000000000000000000714212d3a4754606d7a8692999992908d8a86837f7b77736f6a65615e56535049443f38342e261e1a140c0700000000000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683909ca9b6beb1a4988b7e7165584b3f46434241424a5053575e61636668676d6f7376797c8083868b9093999d9fa7aca9a9a29f9b99928f8a85807c766f6b636059534e4540393129241e160d0600000000000000000000000006111b262f3c454e565e69707d87929fa39992857b6e665c51453c31261a0e0500000000000000000000000000000000000000000000000713202c38444f5964717e8b97a1adbab8ab9e9184796d6053463d3220180b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000001040607090b0d0e0e0f0e0e0c0a070705010000000000000000000305070c101313171a1c1514120e0903000000000000000814212e3b4754616e7b87929fa4acb1b6b8babebcbdbdbebebdbdbdbdbdbcbfbbb9b7b5b2aca69f958e81746c717a828c9299a1a9aaa29f948f857e736d605c606c78808d929ca4aeb5bdc5cdc6c2bcb7b2acaaa29f9b98928e8a857a6d6154473a2e2114070000000000000000000000000000000000020a11171c1f20222422282b2d2e31373a3b4045474c52545860626a6f757c828a91979fa4acb3b8b0aba59e97928a817a6f6a615a51443f3830261c110600000000000000000000000000000000000000000000000000000000000000000000000000060b11171d262d333c434c545c666d79839097a2adbac1c3bab1a79f948c7f736b60554b41352920150a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c27333d474f575e61626364656668676d7072746e64584c3f33261a0d00000000000000000000000000000000000000000000000000000000000000000000000000000000060d141a1e2122252524252522272b2d2e302f2c2721191d24292c2d343536362f35393a3c3e403c3b38322b23190f040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c263039434c565e686d7374716d676059504941382d241b0b02000000000000000000000000000000000000000000050e18242f3a434f59606d79849199a4afbac3d0c8bbafa49a9184796d60585a616e7b85929fa6b0aea3999184796d605a50453c31271d120700000000000000000000000000000000000000000000000a1724313d4a5764707d8a989ea29f9d9a9993908c8884807c77726d6863605b53504a443f38302b261f18120b030000000000000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9b6beb1a4978b7e7164584b4b52504f4e4e4f49505352545759555d606366676d7073767a7e83878b90959b9fa3abadababa39f9b97928d88827c76706b625f58514b433e352f281f1810070100000000000000000000000a141d2a333c444d57606b73808d98a2a1979083786d60574d42372b21160b00000000000000000000000000000000000000000000000916222f3b4854606b7783909da9b3beb3a99a8d8074665c5044382c1f120700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000102020201000000000000000000000000000000000000000406070a0e0f08070502000000000000000004101c2834404a5466737f8c99a3afb8bcc2c5c5beb9b8b5b2b1b1b0b0b0b0b0b1b3b5b8babdb9b0a79f93877c6f686e757f879297a0a7aea69f97928a80746d666c73808d939da4aebbbfc6c8c1bbb6b0aba8a09e98928e8a86827e796d685e5246392d20130700000000000000000000000000000000000000060b0f12131517171c1f2022262b2e2f35383a4146474e545860626a6f757e858e939aa1a9b1b9b7afa9a19e938e847c706c625b504a42382e231713090000000000000000000000000000000000000000000000000000000000000000000000000000060b141b2227313a424b545d676e7b85929fa5afbcc5c3b9b0a69f93877d70675d51453c31261b0f040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b16212b353d454d52545657585859555d60636667645c52473c3023170b000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e1214151818181819171b1f20222322201b160f13181d20212729292924292c2d2f3133302f2c27211911070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141e27313a444c565e61666764605c554f443f382f261b1209000000000000000000000000000000000000000000020d17202935414b55606b73808d96a0abb5c0ccc9beb3a99f93887d70675c51525e68717e8b939ea9b3aba0968e81756c62574e43392f23180f05000000000000000000000000000000000000000000000b1824313e4b5764717e8a8e92979a9ea1a49f9c9895918d89847f7a75706c65605b54504a423e373128231d150c0600000000000000000000000000000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5bdb1a4978a7e71645756585f5d5c5b5b5c535b605b53494c4b515356555c606366686e72767b7f83888e92999fa2a9aeaeaca9a19e9a948f89827d766f6a605d554f45413a312a2218120b0300000000000000000000020b18212a323b454f59616d7a86929fa99f958d8073695f53463d33271c100200000000000000000000000000000000000000000004101d2935404b5563707c8995a0acbbb9ada197897c6f63544a3f34281c1003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2c3844515c667784919dabb5c0c8c8bfbbb3adaba8a5a4a4a3a3a3a3a4a5a6a8abaeb4babbafa4998d807467616d727d8591959fa7b0a9a29f928c81786d717e8b929ca5aeb6bfcac3bcb8afaaa69f9c96918b86827e7a75716d675e564c41362a1e110500000000000000000000000000000000000000000003060608060b0f1213151a1f2124292c3036393d43474e54585f626c717a818891979fa7afb7bbb3ada59d9691867e726d605c544a3f3428251b12090000000000000000000000000000000000000000000000000000000000000000000000000000020a11171f283039424b555e69717e8a939eaab4becac2bbafa4999184796d60584e43372b20150a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050f19232b333b424648494a4b4c4d4b515356595a58524a40362b1f130700000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080c0c0b0b060b0f121315161613100b04070d1113141b1c1c1d191d202123252723221f1b160f0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c151f28323a444c5254595a5753514b433d332d261d140a0000000000000000000000000000000000000000000008131e29323a45515d676f7d87939fa8b2bdc7cec6b9ada1978e81746b60554b4d56616c75828f97a2adb2a89e938b7e716a5f554b40342921170c030000000000000000000000000000000000000000000613202d394653606c787e8185898d91969b9fa3a8a09d9995918c86827d78716c66605c545046423c342e271e180f060000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5bdb0a4978a7d71645b62656c6a686768696a656c655b5046474947494b515356565e6165696e72767c81868d92979fa3aaafb3adaba69f9c948f89827c736d676159514c433c3429231d150d0300000000000000000000060f182029333d46525e6873808d99a9a79f92867b6e61594f44382c1e130800000000000000000000000000000000000000000006131f2c3945515d6775818e9ba7b1bcb8ab9e9285796c605346392e23170c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003050605030000010406070606030000000000000000000000000000000000000000000000000000000713202d3a4653606d7986929facb9c5ccbfb6aea9a29e9b999897979696979798999b9fa2aaadb3b5ab9e918578695e636b707b8390959fa6b0ada49c938e827a7d87929fa4aeb7c0c5bebab1aca59e9b94908a847f7a75716d6764605d554c443a3025190d01000000000000000000000000000000000000000000000000000000030606090f1214181d1f252a2d32383c43474e535a61686d747d8590959da5adb5beb9afa8a19892877f746d665c504440372d241b1006000000000000000000000000000000000000000000000000000000000000000000000000000000060d161e27303a434d57616c75818e98a2aebac5ccc0b5aba1978d80736a5f53473d32271b0f03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000071119212930363a3b3c3d3e3f40404547494c4d4c4740382f24190e030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030506080a090703000000010406070e0f0f080d11131416181a1615130f0a04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d162028323a4146474d4d4a464540393027221b140b02000000000000000000000000000000000000000000060f1925303a44505a606d79849199a4afbac3d0c6bcb0a69e91857a6d60594f4344505a616e7a85929ea5afafa59f92867c6e675c51453e33291e150a00000000000000000000000000000000000000000006121f2b3844505b666c7174797c8084898e92989da0a7a7a09d99928e89837e78716d66615a534d454039302a2117110a03000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5bdb0a3978a7d7064626d727976757475767778786c605352545653514b4c49494c5254565e61656a6f757b80858c92989ea5acb1b8b0aaa69f9c9490878079706b605d554e463e342f271f150b0100000000000000000000060e17212a36414c56616e7b8896a1ada3998f82756b6054483a3024190d0100000000000000000000000000000000000000000714202d3a4753606d7985929facb8c0b5ab9a8e8174665b5044382b1c11060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f1213120f0b080d11131413120f0b06000000000000000000000000000000000000000000000000000815222f3b4855626e7b8899a3afbbc7c4baaea49c97928f8c8b8a8a8a8a8a8a8b8d8f92989fa2a9b2ada197877b6e615960696e7a838f949fa6b0ada59e948f84859299a3aeb6c0c1bcb4aea7a09d938f88837d78726d6764605d5553514b433a32291e130800000000000000000000000000000000000000000000000000000000000000000206070c1013191e20272b32373c434750565d606b707b838e939ba3adb5bfbab2aaa299938c80786d605c52493f362d22180d03000000000000000000000000000000000000000000000000000000000000000000000000000000040c151e28313b45505a616e7b86929fa9b3bec9c7bdb2a99f92877c6f62584e43372b1f150900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070f171f252a2d2e2f3031322f35393a3d3f413f3c362f261d12080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000102030001040607090b0d09090703000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e1620283036393a40413e3a38342e271e17110a02000000000000000000000000000000000000000000020b18212a36414c56616c74818e96a1abb5c0cccabfb4aa9e948a7e71685d52473d3e46525e68717e8a939ea9b3aea2989083796d605a50453b30261c11060000000000000000000000000000000000000000030f1c28333f4a545b6064666d7074787d81868b91959d9fa7aba39f9b95908a847e78706c615f57514b423c3328231c150c040000000000000000000000000000000000000000000000000000000000020f1c2935424f5c6875828f9ba8b5bdb0a3968a7d706365727f858382818182838584776b565e6162605d55585654514b4c4d5254586062696e737980868e939da0a7aebab7b0aba69f99928d847d756d675f585045403931271d12070000000000000000000000050f1925303a47535f697885919eabab9e93897d7063564c4135291d11050000000000000000000000000000000000000004101c2934404b5564717d8a98a2aebabbafa499897d7063544a3f33281c0a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171b1f201f1b171c191d2021201f1c17110a0200000000000000000000000000000000000000000000000a1724303d4a5763707d8a96abb5c0c9bdb2a89c928c85827f7e7e7d7d7d7d7d7e8082858b9297a1a9b2a9978a7d706457575e686d79828f949fa7b1afa69f96919297a2abb5bfc0bbafaaa29f959189827c76706c66605d5553514b47454039312920170d0200000000000000000000000000000000000000000000000000000000000000000000000004080d11161b20272b31373e444c525960696e79818c919ba3adb5bfbcb4aba49f928d81746e635b51483e342a1f150b01000000000000000000000000000000000000000000000000000000000000000000000000000000030c161f29333e46525e68727f8c97a1adb9c6d0c4bbafa3998f82766a6054473c31261a0e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d141a1e20212324252524292c2d30333433302b241d140b0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e161e252a2d2e3334312d2c28231d150c0600000000000000000000000000000000000000000000000a141d29333b46525e68707d8a939da8b2bdc7cfc7baaea2988f82756c61564c413536414c56616c75828f97a1adb4aaa0958d80746c61574d42382e23170e0500000000000000000000000000000000000000000b17222d38424a5053545c6063656c70757a7f848a90959c9fa6aca7a09d96918b847d756e69605c544d453e342e261e160d0400000000000000000000000000000000000000000000000000000000020f1c2835424f5b6875828e9ba8b5bcb0a396897d70636773808d908f8e8e8f909286796c5e686d6f6d67686563605d55595654524e54575e61676d737b818990959da4adb3bbb7b0aba39f96918a817a6f6a625a514b43392f23180c00000000000000000000040a0c151e2b37424d576a7683909da9afa59b8f8275685d5246392d2013070000000000000000000000000000000000000006131f2c3845515c6775828f9baab4bfb9ac9f93867a6d6053473a2d22170b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001090b141b22272b2d2b27222924292c2d2d2b28221c140b02000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0bdc5b9aca0968c8078757271717070707071727375797e859197a1ada6998c807366594d565e676d79828f959fa8b2b0a8a09d9fa2a9b3bdbdb5afa59e98928c837d756f6a64605b54514b4745403a39352f281f170e0500000000000000000000000000000000000000000000000000000000000000000000000000000001050a0f151b20262b323a41454f575e676d747f8b919ba3adb5bfbdb5afa49d938d80736d625a50463c31271d120700000000000000000000000000000000000000000000000000000000000000000000000000000000040d17212a36414d56606d7985929eaab4bfcbcbc0b5ab9f94897c6f62574d42372b1b1106000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e12141516171819181d202023262726231f19120b02000000000000000000000000000000000000000000000000000000000000030608090f0e0a0706040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050c13191d2021262724201f1c18120b03000000000000000000000000000000000000000000000006111c262f3b45505a616d7a85929ea5afbac4d0c7bdb1a79f92867b6e615a50443a30303b44505a616e7a85929ea5afb1a79d928a7e71695e544a3f342820170b020000000000000000000000000000000000000006111c262f383f44464a5053535b6063686d72787d83898f949ea0a8aca8a09d96918a827b736d665f5750443f3830281f160e05000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4bcafa396897c70636673808d999b9a9b9c9d9286796c656d7a7c7a7774726f6d67686563605d56565352555d60696e757d838d929fa2a9b1b9bdb5afa8a19e938e847c716c605c554b4034291c10040000000000000000070f151b1e27303846525e687885919eabb8ac9f92867a6d6154473a2e23180c000000000000000000000000000000000000000714202d3a4753606d7986929facb8c3b7aa9d908477675d5145392c1c1106000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009131b1d262d33373937332d362f35393a3938332d261d140a000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1bec4b7aa9e9184786c6666656464636364646566676d717b85919ea6a89b8f8275685c4f4c555d676d79839096a0a9b3b2acaaabadb3bbbbb3aba49f938f867f78706b62605853504a45413a39352f2c29241d160d0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f151b202830353d454d555c606d727f8b919ca3adb7c1c0bbaea59c928c7f726c61584e43392f23180d0300000000000000000000000000000000000000000000000000000000000000000000000000000000050f1925303b45515d67737f8c98a3aebac7d1c7bdb0a69b8e8275695f5347382d22170b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002050708090a0b070d11131416191a1a17130e08010000000000000000000000000000000000000000000000000000000000040a0f1215151c1b171413100c070501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d1113141a1a171313100c07000000000000000000000000000000000000000000000000030c17222d38424d57626c75828f97a1adb7c0cccbc0b5ab9f958b7f72695e53483e322829323e46525e68717e8a939ea9b3aea49f92857b6e665c50443d32291d140a00000000000000000000000000000000000000000a141d262d3338393f4446495053565d60656c70767d828a91969fa2aaaca8a09e948f8680796e69615a504a4239312820170e050000000000000000000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4bcafa296897c6f636673808c99a6a7a8a99f9285786c6c7883898684817f7c7a777572706d686663605c5454575e616b7079808a92979fa7b0b8c0bbb2aca59e9691867e746d675c5145382c1f13060000000000000007101920272b3039424c56616e7a8796a1adb9aea3998b7e7265544b4034281c1004000000000000000000000000000000000000091623303c4956636f7c8998a3aebac1b4a79a8e817467554b4035291d0a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007111b252d2f383f4446443f43424341454746443f382f261c11060000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec2b5a89c8f8275655b545857575757575758555c6069707d8a949fa99c908376695d50434b555d676d7a849197a2acb6b8b7b8babeb9b1a9a299938c817a726d666059544e46443f38352f2c2924201d18120c0400000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000040a0e161e2429333b434b515b626d727f8c919ca5afb9c3c0b7aea49f93887e716a5f554b4034291f150b010000000000000000000000000000000000000000000000000000000000000000000000000000000008141f2935404b55606d7a86929facb8c5cfcfc2b9ac9f93877b6e6253493f33271b0f030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010406070a0c0e0d0b0703000000000000000000000000000000000000000000000000000000000000060e151b1f2122282824201f1c1814110d08060200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010507070d0e0b07060400000000000000000000000000000000000000000000000000000b151e28333f4a545f69717e8b949ea9b3bec9d4c7bbafa3999083786d60574d42362c20202a36414c56616c75818e97a1adb9ada2979083786d60594f443b2f261c110600000000000000000000000000000000000000020b141c22282b2e34383a3f44464c52535b60646b70767d848c92989fa6aeaca69e98928c837b716c605c544b433a322920170d0400000000000000000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4bcafa295897c6f626673808c99a6b3b4ab9e9285786b707d899592908e8b898684817f7c7a76736f6d6664605d555960676d747e8590959fa6afb7c0bdb9afa8a098928b81796d6053473a2d201407000000000000040d19222b32373c424b545e68727f8c99a9b2bdb5ab9c908376665c5145382c1f1306000000000000000000000000000000000003101c28343f4a5466737f8c99aab4bfc0b6ac988b7e7165584b3e2f24180d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d18232d373f414950535049504f504c515453504a42382d22170b0000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d807467534a4b4b4a4a4a4a4a4b4b5157616c7683909ca99d9084776a5d5144434b555e686e7b85929aa4afbbc4c5c6bcb1a7a09792877f756e68605c544f47433c38332d2924201d1813100d070100000000000000000000000000000000000306060d0e0b0907060300000000000000000000000000000000000000000000040c1319212931394045515b636d727f8c939da7b1bbc5c0bbafa49a92867c6f675c51453e31271d120700000000000000000000000000000000000000000000000000000000000000000000000000000000020c18242f3945525d6875818e9ba9b3becad4c7bbafa4998d8073655b5044372b1f120500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006101820262b2e2f3534302d2c2923201e1914120e09040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d27303944505b666e7b86929fa6b0bbc5cfc9bdb2a89f92877c6f665c50453b31241a1925303b44505a616d7a85929ea5afb3a99f958d80736b60564c42382d22170e0500000000000000000000000000000000000000020a11171c1f23282c2d33373a41454950535960636b70797f868f949fa3abb0aaa39f9590867e746d665d554c443b32291f160c03000000000000000000000000000000000000000000000000010e1b2834414e5b6774818e9aa7b4bbafa295887c6f6266737f8c99a6b2b7ab9e9184786b74808d92989a9b989a93918e8c898683807c7975716d6764605d5c606c717b838f949ea5aeb7c0bfbbb2aaa29f938e8174685b4e4135281b0e0200000000010c161f2b343d43474d545c666e7a86929fabb8c4b9ac9f9286796d6053463a2d201307000000000000000000000000000000000006121f2c3844505c6676828f9ca9b5c2bbafa49a887c6f6255493c2f2216070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121e29343f4951535b605b535c5c5d555d60605b544a3f33281c0f0300000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d413e3d3d3d3d3e3f4045505a65727f8b98a89e9185786b544b403a434c565f69707d88939faab4bfcac5b8aca09590857d726d615e56514a423d37322b28221c1813100d0704010000000000000000000000000000000000060b0f12131a1a18151312100b0609080807060400000000000000000000000000000002080f171f272f343f49515b636d74818e95a0a9b3becac0b6aca2989083796d60594f43392f24180c020000000000000000000000000000000000000000000000000000000000000000000000000000000007121d2935414c5663707d8a97a2adb9c6d2ccc0b5ab9e9184786c605346392d2013090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005080a0b0e0706030000000000000000000000000000000000000000000000000000050e18222a31373a3c42413d3a38342f2d2a25211e1a15100d07010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000406070b0807050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d18232e39434e58606c78829098a2aeb8c1cdcec6b9ada1968d80746a60544a3f33291f12141e29323e46525e68717e8a939eaab4b1a79f93887d70685e544a3f332820170c030000000000000000000000000000000000000000060b0f12171c1f22272b3035383f44464f545961666d727b828c9299a1a8b1aea7a098928a81786d675e564c443b31281e150b000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4bbaea295887b6f6266727f8c99a5b2b7aa9e9184776b717e82868a8d91969a9f9d9b989992908c8985827e7a75716d67625f61696e79828e939da4aeb7b5aea9a29f97918b8276695c4f4336291c10030000000007121d28313d464e54575f666d78818f98a2aebac6bbaea399887c6f6255483c2f22150900000000000000000000000000000000000713202d3a4653606d7985929facb8c5b9ac9f9386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916222e3a46515b62656c656a6969696a676d6c665b5044382b1f120600000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d413431303031312e343e4854616e7b8796a19f928579665c5145383a444d57616c73808d98a2aebac6c3b7aa9d90837b706b635b524c444039302b271f1c17110d070401000000000000000000000000000000000000020a11171c1f2027272522201f1c17171615141413100c07010000000000000000000000000000050d151d2329373f49515b606d79839097a2adb9c1c7beb4aaa0958d80746b61554b4035291e140800000000000000000000000000000000000000000000000000000000000000000000000000000000010d1924303a4653606d7985929eabb8c5d1d2c7b9ada196897c6f6356493c30251a0e0200000000000000000000000000000000000000000000000000000000000000000000000000000002070a0c0d110e0b0707050100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050c111417171a1312100b060000000000000000000000000000000000000000000000020d17202a343c4347484f4e4a4745403b3936302e2b26201d18120e09030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c101314171514120e090300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f2834404b555f6a727f8c949faab4bfcad0c6bcb0a69e9184796d60584e42382e21170d0d17202a36414c56616c75828f98a2aebaafa49a92857a6e665b50443d33291e150a0000000000000000000000000000000000000000000003060c1012171b1f24292d33373d44484f545c60696e787f869196a0a7b0b1aaa29f938e82796d685e564c433a30271c12070000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3bbaea195887b6e6265727f8c98a5b2b7aa9d9084776a6c71757a7d8184898e92989c9fa39f9d9998928f8a86827e7a746f6a6460676d78818d929da5afaba39f97928c857f786d6053463a2d20130700000000010d18242f39434e586062696e78818f939eaab4becabfb5ab978a7d7064574a3d3124170a00000000000000000000000000000000000815222f3b4855626e7b8898a2aebac4b8ab9e918578665c5145382c1f1306000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4a56626d7279787776757677787a786c605346392d20130600000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d41342724242424232d3a46525e697884919ea29886796d6053463a323b454f59606d7985929facb8c5c1b4a79a8e81746b61595146413b342e271e1b150f0b06000000000000000000000000000000000000000000020b141c22282b2d3334322f2d2b282323222121201f1d18120b030000000000000000000000000000030b1218252d374045515c676e7b85929ea5afbcc5c6bcb1a79d928a7d70675d51453b3025190e030000000000000000000000000000000000000000000000000000000000000000000000000000000008131f2c3844515c6675828e9ba8b5c1cfd5c9bdb2a89a8d807467574d42362a1e11050000000000000000000000000000000000000000000000000000000000000000000000000000080e1317191a1e1b181413110d0805020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000810171c21232427201f1c17110a0200000000000000000000000000000000000000000008141e29323c464e53555b5b5753514b4746413b3a37312c29241d1a140f0a0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b12181d1f202422211e1a140d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e28313a45515c676f7c86929fa6b0bcc5d0cabfb4aa9e948a7e71675d51463c30261c0f05050e1925303a44505a616e7b86929fa7b1b6aca1978f82786c60594f453b30261c110600000000000000000000000000000000000000000000000003060b0f13191b22272b32383e424b51575e666c727c8490959ea6afb4aea59d948f837a6e685e554b42392e23180f0600000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3bbaea195887b6e6265727f8b98a5b2b6a99d9083766a6164676d7074787c81858a8f949b9fa3aaa29f9b98928f8a85817c76716d66666d78808d939ea6a099928d857f79726d665c5144382c1f12060000000004101d2935404b55606a6f757b828f939ea5afbcc5d0beb1a4978b7e7164584b3e3125180b00000000000000000000000000000000000a1724313d4a5764707d8a97aab4bfc3b6a99d9083766a544b4034281c1004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8785848382838485878175685b4e4235281b0f02000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d4134271a1717171e2a36424d576976828f9caa93877a6d6054473a2d36424d5763707d8a98a2aebac6c6b9ac9f93887c6f665c51443a3028231c150c0a0300000000000000000000000000000000000000000000000a141d262d33383940413e3c3a38342e302f2e2e2d2c29241d150d0700000000000000000000000000000107131c252934404b555e69707d8a939ea9b3becac3b9aea49e9184796d60564c41362a20150a0000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404a5465717e8b98a9b3bec9d5cfc4b7aa9e918477695e52463a2d201407000000000000000000000000000000000000000000000000000000000000000000000000020a12191f2326272b282421201d1914110e090401000000000000000000000000000000000000000000000000000000000000000000000000000000000008121a22282d3031342d2b28231c140c0200000000000000000000000000000000000000020e1925303b444e585f62686763605c5554524c4847423c39352f2b261f1b150f0a0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d151d24292c2d312e2d2a261f19130c04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c19242f3a434f59606d79839099a3aeb8c2ced0c7baaea2988f82756c61554b41342b1e140a000008131e29323e46535e69727f8c95a0acb8b3a99f948c7f736b60574d42382e23170f06000000000000000000000000000000000000000000000000000003080d11171b1f272c303940454d545b606a6f7a838f949ea5afbaafa69e9590837a6e675d544a40342822180d03000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3bbaea195887b6e6265727e8b98a5b1b6a99c908376695d555d6063656c6f74797e82888e92999fa2aaaaa39f9b98928d88837e79726d676c77818e949f959087807a726d67605c544a4034281c1004000000000613202c3945515d676f7c82868f949ea5afb7c1cecbbeb1a4988b7e7165584b3e3225180b00000000000000000000000000000000000c1926323f4c5965727f8c98a5b2bfc1b5a89b8e8275685b4f422e23180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2834414e5b6774818e92908f8f9091929084776a5d5144372a1e1104000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d4134271a0e0a0e1a2530404d5a6773808d9aa093877a6d6054473a2d3a46525e6975828f9baab4bfcac8bbafa49a9083786d60564c4135291e140b0300000000000000000000000000000000000000000000000006111c262f383f44464d4d4b4846443f3f3d3c3b3b3a38352f271f1911070000000000000000000000000000000a1318232f39434d57616b75818e97a2adbac3cbc0b9ada1968c7f73685e52463c31261a0f01000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232e3b4855616e7b8897a1adb9c6d2d2c5b9aca096877b6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000000000000000a141c242a2f32333835312e2d2a25201e1914110d0801000000000000000000000000000000000000000000000000000000000000000000000000000005101a242c33393c3e413a38342e261e140a0000000000000000000000000000000000000005111e2a36414c565f6a6f7574706d6765615e5655534e4745403937312b27201b150e090200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f181f272f35393a3e3b3a363129251e160e0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e2935414c56606b73808d95a0abb4bfcbd2c7beb1a79f92867b6e615a50433a2f22190c020000020d17202a36424d57606d7883919da5afbbb0a69f93877d70695e544a3f342821180e0300000000000000000000000000000000000000000406070706030000060b0f161b1e272e343b424a50585f686e79828f939ea6b0b8b0a79f959083796d665c51443f342a1f150b010000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3bbaea195887b6e6265717e8b98a4b1b5a99c8f8276695c4b5153535b6063676d71767c81868d92989fa3abacaaa29f9a95908b847f79726d6d78828f948f837c736d68605d55514a42392e23180c00000000000714202d3a4753606d7a868e92999fa6afb7c1c9d6cabeb4aa96897d7063564a3d3023170a00000000000000000000000000000000010e1b2834414e5b6774818e9aa7b4c1c0b3a69a8d8073675a4d4034271a0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9a9d9c9c9c9d9d9083776a5d5044372a1d1104000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d4134271a0e00091825323f4b5865727e8b98a094877a6d6154473a343f4a54616e7b86929facb9c3c4c8c0b6aca0958c7f72685d52463b3025190e010000000000000000000000000000000000000000000000000b17222d38424a50535a5a585553504a4b4a49484747454039312b23190f0400000000000000000000000000000007121d27313b454f59616e7b85929fa7b1bcc8c9bdb2a89f92867a6e61584e43372b1e1308000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a46535f697885929eabb8c5d1d5c9bdb2a8978a7e7164574a3e31241708000000000000000000000000000000000000000000000000000000000000000000000009121c262e363b3f4044413e3a3936302d2a25201d19130f0a030000000000000000000000000000000000000000000000000000000000000000000000000c17222c363e45494a4d46443f3830261c11060000000000000000000000000000000000000714202d3946525e686f7c82817d7975716e6866625f5753514b46423c37322b26201a140b060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d18212931394045474a4846423b3530282017110a02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d27303945525d68707d88939fa7b1bdc6d1ccc0b6aca0958c7f72695e53483e31281d100700000000050e1a25313b44515c66707d89939ea9b3bbafa49992857b6e665c50443e332a1f1509000000000000000000000000000000000001070c1013141312100c060000030b0c151d23282f383f444e565e676d78818f949ea6b0b9b1a8a0958f82786d605a50463c31271d12070000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3bbaea195887b6e6264717e8b97a4b1b5a89c8f8275695c4f4a4f495053555d60646a6f747b80868d92999ea6adaeaba79f9d96918b857f79716d79838b82796f6a605d56514b44403930271c120700000000000613202d394653606c788490959ea6b0b8c1c9d3d3c6baaea298887b6f6255483c2f2215090000000000000000000000000000000003101d293643505c6976838f9ca9b6c2beb2a5988b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7a9a8a9aa9d9083776a5d5044372a1d1104000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d4134271a0e010a1724313d4a5764707d8a97a094877a6d6154473a3844505c66737f8c99a3afb8b6b8bcc2beb1a79f92857a6d61564c41362a1e13080000000000000000000000000000000000000000000000030f1c28333f4a545b6066676562605c54585655545453514b433d352b21160b000000000000000000000000000000010b151f29333e46525e68727f8b95a0acb8c3cec4baaea2988e81746a5f53473a2f24190d0000000000000000000000000000000000040404040303030202020101010000000000000000000005121e2a36424d576976828f9ca9b5c2cfd9cec0b4a79a8d8174675a4e413025190d01000000000000000101010202020203030304040400000000000000000000000000020b1b242e3840474b4d514e4b4746413b3a36302c29241e1b15100b0600000000000000000000000000000000000000000000000000000000000000000005111c28333e485055575a53504a42382e2317120800000000000000000000000000000000000814212e3b4754616e7a858e8e8a85827e7a76726e6a65605d55534d47433c37312a251f17110a020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f29333b434b51535755534d46413a3228231c140c04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232e3943505a606d7a84919aa4afb9bfc1c3c5bbafa49a9083786d60574d42362c1f160c00000000000009141f2834404a54606b75818e97a2adb6b5aba1979082786d605a50453c31261a0e01000000000000000000000000000000030b12181c1f20201f1c17110a030000030b12181d262d333c444d555d666d78828f949fa8b2bab1a79f948e81746d62584e43392f23180c0300000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3bbaea195887b6e6264717e8a97a4b1b5a89b8e8275685b55575c595653505153585f62696e737a81878f939ea1a9afb1aba8a19e97918c847e786f7a7f796d675f58524c454039342e271e150b00000000000006121f2b3844505b666e7a838f939ea7b1bbc5d0cec5b8ab9f9285796d6053473a2d2014070000000000000000000000000000000004111e2a3744515d6a7784909daab7c3beb1a4978b7e7164584b3e3125180b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d1a2734404d5a6773808d9aa6b3b5b6a99d9083766a5d5043372a1d1004000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d4134271a0e01091623303c4956636f7c8996ab94877a6e6154473b3a4653606d7984919eabb1aba9abb1b9c2baaea2988d8073685e52463a2f24190d000000000000000000000000000000000000000000000006121f2b3844505b666c7374716f6d66676563626161605d554f473d32271b1004000000000000000000000000000000030d17212a36414d56606c7883919da8b2bdc8cabfb4aa9f93877c6e62564c4135291b1106000000000000000000000000030608091111111010100f0f0f0e0e0e0d0d0d0c0c0c0c0b0b0b0a0a0e1a2631404d5a6673808d99a6b3c0ccd9d0c3b6aa9d9083776a564c41362a1d110b0b0b0c0c0c0d0d0d0e0e0e0f0f0f1010101011110a0a08040000000000000000000a141d2d36404a52585a5e5b5754524c4746423b39352f2b261f1c17110c07000000000000000000000000000000000000000000000000000000000000000814212d3945505a616467605c544a3f3428241a110800000000000000000000000000000004101c2834404b556774808d979a98928f8b87837f7b76716d67615f57544e47433c363028231c140c060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007131d28313b454d555d6064615f57524c443e342e261e160d05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b55616c74818e96a1acb4b0b2b4b6b8b3a99f93887d6f665c51453b31241a0d04000000000000030c18232e39424f59616e7a85929fa7a9aaaba99f948d80736c61574d42372b1d13070000000000000000000000000000030d151d23292c2d2d2c28231c150c06000000070b141c2228323b434b545c666d79829096a1abb4b9b0a69e938b7e716a5f554b4034291f140900000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3bbaea195887b6e6264717d8a97a4b0b4a89b8e817568596163696662605c54565353575e61686e747b828a91979da5adb3b2aca9a19e96918a837c74726d675d554e45413a352f28231c150c03000000000000030f1c28333f4a545e686e79818f959fa9b3becac5bcb0a69b8e8174675c5145382c1f13060000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4bdb0a4978a7d7164574a3e3124170b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2733404d5a6673808d99a6b3c0b6a99c908376695d5043362a1d1003000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d4134271a0e010815222e3b4855616e7b88949999877b6e6154483b3d495663707d8996a1ada79f9d9fa7b1b9beb3aa9f92867a6e61564c4135291b1106000000000000000000000000000000000000000000000613202d394653606c7880807e7c79767472706f6e6e6d6760594f44382c20130700000000000000000000000000000000050f1925303b44505b66717e8a96a0acb8c5cfc6bbafa4998d8174685d5245382d22170b00000000000000000000040a0f1315161e1e1d1d1d1c1c1c1b1b1b1a1a1a1a191919181818171717171824313e4b5764717e8a97a4b1bdcad7d2c5b8ab9f928578685e5246392d2017181818191919191a1a1a1b1b1b1c1c1c1d1d1d1e1e171614100b0500000000000006111b262f3f48525c63666b6864615e5654524d4745413a37312b28231c18120c0700000000000000000000000000000000000000000000000000000000000a1723303c4955616c71746d665c50443f362c231a1108000000000000000000000000000006131f2c3845515c677885929ea1a29f9b9a93908c88837e79746e69626058534e46423b342e261e17110a0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d18242f3a434d575f676d716e69615e564f443f3830281f170e060000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c67717e8a939e9fa2aaa4a6a8aaacada1978e81746b60544a4033291f1208000000000000000007121c27303d46525e68727f8b959e9d9d9e9fa39d928a7e71695f53473a2f24180d01000000000000000000000000010b151f272f34383a3a38342e261e17110a030000020a111720293139424b545d676d7a849199a3aebab8afa59f92867c6e675c51453b31261a0e05000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3bbaea195887b6e6264707d8a97a3b0b4a79a8e817467616b7075726f6d666662605c5454565e616a6e757d848e939fa2a9b1b9b3ada8a19e959089817a716c605d554b403529241d18120b0300000000000000000b17222d38424c565e676d78839097a2adbac2bcb3a99e94897d7063554b4034291c10040000000000000000000000000000000005121f2c3845525f6b7885929eabb8c5bdb0a3968a7d7063574a3d3024170a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3bfb6a99c908376695d5043362a1d1003000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d4134271a0e010714212d3a4754606d7a878c8d8b877a6d6154473a414c566673808d99a8ab9f9590959fa7b1bcbaaea2988d8074685d5245382d22170b000000000000000000000000000000000000000000000915222f3c4855626f7b888d8b888583817e7d7c7b7a79706b6054483b2f221609000000000000000000000000000000000008141f28333f4a54606c7884919da9b3bec9ccc0b5ab9f92867a6d6053493f33271b0f030000000000000000060e151b1f21222a2a2a2a2929292828282827272726262625252524242424242424303d495663707c8996a3afbcd1dcd3c6baada297877a6d6154473a2e242424252525262626272727272828282929292a2a2a2a2423201c17100800000000000b17222d3841505a636e737774716d6865615e5654524c47433c38342e28231d18120b06000000000000000000000000000000000000000000000000000006131f2b37434e5864717e80786d605b51483e352c231a1107000000000000000000000000000713202d3a4653606d79868c91969c9fa4a49f9d9995908b85817b756f6a625f58524d443f383027221b140b0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111d2935404b555f696e797d7b756d686159504a4239312920180f060000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798591919192989597999b9d9fa39e92857a6d61594f42392e21170d000000000000000000000b151e2a36414c56606c788390919090919299959892857b6e61554b4135291d110400000000000000000000000007121d27313940454746443f383028231c150c0600050b1014171f283039424b555e686f7c87929fa6b0bdbaaea2989083796d60574d42362a21160b000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3bbaea195887b6e6263707d8a96a3b0b4a79a8d81746767707d827f7c7976726f6d6665615e57575f626c707a818a9297a0a7afb7b9b2aca79f9d938e857e756d675d5145382c1f130c070000000000000000000006111c262f3b444c555d666e7b85929fa6b0bbb2aaa2978f82756b605443392f23180c000000000000000000000000000000000006121f2c3844505c667985929facb8c5bcafa396897c706356493d3023160a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfb6a99c8f8376695c504336291d1003000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d4134271a0e010613202c3945515d67717e80807e7b6e685d52463946525e687783909daaa499908390959fabb8bfb4aa9f92867a6d6053493f33271b0f030000000000000000000000000000000000000000000815222f3b4855626e7b8895989892908d8b89888787877d706356493d3023160a0000000000000000000000000000000000020b17222d3844505b66717e8b97a1adb9c6d2c7baaea2988b7f72655b5044372b1f12060000000000000006101820262b2e2f373737373636363535353434343333333232323131313130303030303b4855626e7b8895abb5bfcbd7d6cabeb3a996897c6f6356493c30303131313232323333333434343535353536363637373731302d28221a1108000000030f1b27333f4953626c738084817e7a76726e6965605d56534e46443f38342e28231c17110b060000000000000000000000000000000000000000000000000815212e3b47535f6a77848d81746d635a50473e352c2418120b03000000000000000000000006131f2c3845515c676d7a7f848a8f939a9fa2aaa79f9d98928d87817c756f6a615e57504a423c332d261d160e0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3945515d676e7b848a87817a706b605c544b433b322a21180f0500000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c78818484858587888a8c8e909298948b7e71685d52473d30271c0f0500000000000000000000030c1925303b44505b666f7c83848383848687898b8d908376675d5145392c2013060000000000000000000000000c18232f39434b515353504a423d342e261e17110b10161c20232428273039434c56606a727f8b949fabb4bfb4aaa0958c8073695f53463d33271c10040000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3bbaea195887b6e6263707d8996a3b0b3a69a8d8073676d79858f8c8985827f7c7976726e6965615e5a61686d747d8590959ea5aebbbdb9b1aba59d97928a82796d6053473a2d2014070000000000000000000000000a141d29323b434b545f69717e8a949fabafa9a19892857b6e61594f4431271d120700000000000000000000000000000000000713202d3a4653606d798698a3aebac7bcafa295897c6f6256493c2f23160900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926323f4c5965727f8c98a5b2bfb5a99c8f8276695c4f4336291c1003000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d4134271a0e030e18212935414c55616c717373716e695f564c413a4754616d7a87939fab9f93877b83909daab4bfbaaea2988b7f72655b5044372b1f13070000000000000000000000000000000000000000000815212e3b4854616e7b8794aaa29f9c9a98969594998c7f7266594c3f3326190c00000000000000000000000000000000000006111c28333f4a54606d7985929eabb8c2cdcabfb4aa9e9184786c605346392d22170b000000000000040e18222a32373b3c4444444343434242424141414040403f3f3f3f3e3e3e3d3d3d3d3d3d3d4754616d7a8799a3aebbc7d3dbd0beb1a4978b7e7164584b3e3d3d3e3e3e3e3f3f3f4040404141414242424343434344443d3c39332c231a1005000005121f2b3744505b65717e8b918e8a87837f7b76716d68625f5853504a454039342e28231c17110a02000000000000000000000000000000000000000000000916222f3c4955626f7c88938c7f726c61594f473e3628231d150c060000000000000000000004101c2834404b555e686d72787d82878d92989fa4abaaa29f99938e88827c746e69605c544e443f382f2820181007000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d79849196938e857d746d665d554c443c332a21170e040000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505b666c75777778797a7c7d7f818385888982766c61564c41352b1e150b00000000000000000000000008141e28333f4a545f6a6f7678767778797a7c7e8183847a6d6054473a2d211407000000000000000000000004101c2934404b555c60605c544f443f383028231c171a21282c2f30352f2e313a444e58626d76828f99a3aebabcb1a79f92867b6e61594f44382c21160a0000000000000000000000000000000105090e1a2734414d5a6774808d9aa7b3bbaea195887b6e6263707c8996a3afb3a69a8d807367717e8b979998928f8c8985827f7b76726e6865615e606c707b838e939da4afb6beb6afa9a29f9590877c6f6255493c2f221609000000000000000000000000020b1720293139424d57616c76828f99a3a49f9791867d6f695e53473d331f150b0100000000000000000000000000000000000714202d3a4753606d7a8699a3afbbc7bcafa295897c6f6256493c2f23160900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2beb5a89c8f8275695c4f4236291c0f03000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d4134271a0e09141f2a333c454d535a6164666665625f574d443a3e4b5764717e8a9aa4a4998e81757f8b98a3aebabfb4aa9e9184786c6053463a2f24180d0100000000000000000000000000000000000000000714212e3a4754616d7a8794a0aeaca9a7a5a3a2ab988c7f7265594c3f3226190c000000000000000000000000000000000000000b17222d3844515c6673808d9aa7b1bcc8d0c6b9aca096897d706353493f33271b0f0300000000000a15202a343c43474951515050504f4f4f4e4e4e4d4d4d4d4c4c4c4b4b4b4a4a4a4a4a4a4a4a4a525d687986929facb9c5d2d8cbbfb2a5988c7f7265594c4a4a4a4a4b4b4b4c4c4c4c4d4d4d4e4e4e4f4f4f50505051514a49443e362c22170b00000613202d394653606c7884919e9b9a93908c87837e7a746f6a64605c54514b444039342e27221b140b07000000000000000000000000000000000000000006131f2b37434e586673808d9993887e706b615950483f342e271e18100a010000000000000000000c18232e39434c565e61666c70767b80868e93999ea6acaba49f9b948f87817b726d665f585049413a322a221911080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d192633404c5966737f8c96a09f97918a80786d675e564d453c332920160d03000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a545b60686a6b6b676d6f71737577797b7c796d605a50443a3023190c03000000000000000000000000020b17222d38424e585f626a6b6a6a6b686d6f717476776d675d5145392c201306000000000000000000000006131f2c3845515c676d6d666059504a423b342e2822232c33383c3d423c3b37323d46515b626e7b86929fa9b3bebaaea3988f82756b6054483d32271b0f0300000000000000000000000000060c1215181a2734414d5a6774808d9aa7b3bbaea195887b6e6263707c8996a3afb3a69a8d8073677380878d92979d9c9998928f8c87837f7a76716d686261696e79818d929fa4acb3aca49f97928b837d6f6a5f53473b2e21150800000000000000000000000000050e171f27303b45505a626f7c87929d9a938e857d6f6b60574d42352b210d0300000000000000000000000000000000000006131f2c3845515c677986929facb9c5bcafa396897c706356493d3023160a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1beb5a89c8f8275695c4f4236291c0f03000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d4134271a0e0e1a26313c454d575f616a6e6d665d55534d453c36424d576874818e9bac9f93877c6f7a86929facb9c4b9aca0968a7d7063554b4135291d110400000000000000000000000000000000000000000714202d3a4753606d7a8693aab4b8b6b4b1b0afa5988b7f7265584c3f3225190c0000000000000000000000000000000000000006111c2834404a54626e7b88959fabb8c4d1c8bdb2a89a8e8174655b5044372b1f120500000000030f1b26323c464e53555d5d5d5d5c5c5c5b5b5b5b5a5a5a5959595858585757575757575757575757566b7884919eabb7c4d1d9ccbfb3a6998c807366595757575757575858585959595a5a5a5a5b5b5b5c5c5c5d5d5d5d575550483e33281c1004000815222e3b4855616e7b88969ea1a49f9d99938f8b86817c76716d66605c55514a443f38332d261d18120b030000000000000000000000000000000000020d15222e3b47545f6a7784919d9a92867d706b615a51454039302a221b130a00000000000000000007121d27303a444c52545b6063696e737b81878f949da0a7afaca69e99938e867f786f6a605b534c443c342b231a110900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1c2835424f5b6875828e959fa6a19e928d82796e685f574d453b32281f150c030000000000000000000000000000000000000000000000000000000000000000000000000000000b17222d38424a50535b5e5e555d6062646668666c6e706d675d51483e32281e1007000000000000000000000000000006111c262f3c464e53555d5e5d5d565d61626567696a605d554b4135291d110400000000000000000000000714202d3a4753606d7979706b605c544d443f38332d2c353e44484a4e4947433c333f47535f6a73808c97a1adb9bfb4aa9e93897d7063584e43382c1f15090000000000000000000000000911181d2224252934414d5a6774808d9aa7b3bbaea195887b6e6263707c8996a3afb3a69a8d8073676e737b80858b90959b9f9f9c9a93908b87827e7a756f6a63676d77808c939aa4a9a19a938e857f786f6b60584e43372b1f13060000000000000000000000000000050d151e29333e47535f6a74808d908c87817a6f6b60594f453b3123190f0000000000000000000000000000000000000004101c2934404b556c7885929fabb8c5bdb0a3968a7d7063574a3d3024170a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1beb5a89b8f8275685c4f4235291c0f02000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d4134271a0e121e2b37424d575f696e767b786d675d544a40343a46535e697884919ea49a8e81756a75818e9ba8b2bdbdb2a89b8e8275675d5145392c20130800000000000000000000000000000000000000000613202d394653606c798698a3aebac3c0bebcb1a4988b7e7165584b3e3225180b00000000000000000000000000000000000000000c18232e3947535f6a7683909da9b6c3cecec3b8ab9e9184786c605346392d2013080000000006131f2b37434e585f626a6a6a6a696969686868676767666666656565646464646363636363636363636a7783909daab6c3d0dacdc0b4a79a8d8174676363636363646464656565666666676767686868686969696a6a6a64615a5044392d201408000815212e3b4854616e7b868c91979c9fa6a49f9c98928d88827d78726d67605c54504a443f382f28231d150c080200000000000000000000000000000008141f2a36424d57626f7c8896a0a39892867d706c635b514b433c342d251b0f060000000000000000000b151e29323a41464a5053575f61696e747c828990959fa4acb0aba49f98928c837c726c655d564e463d352c241b1209000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8390949ea6a49d948f837a6e695f574d443a31271e150a00000000000000000000000000000000000000000000000000000000000000000000000000000006111c262f383f44464f51514c5154555759545b606163605d554b40362d20160c000000000000000000000000000000000a141d2a343c434748505150504c525456585a5d5e54514b433a2f24180d010000000000000000000003101d2a3643505d697682847d736d665e57504a443f382f3e474f55575b55534e443f38424e57606d7985929ea9b3bebcafa59c9083766a6054483c31261a0e00000000000000000000020a121b23292e31323634414d5a6774808d9aa7b3bbaea195887b6e6263707c8996a3afb3a69a8d80736763696e73797e83898f93999ea49f9c99938f8b86827c76706b656c737f88939fa0979288817a726d6660594f463c32261b0f03000000000000000000000000000000030c17212b37434e58606d7a8383807c756d6860594f473d33291f110800000000000000000000000000000000000000000c18232f45525e6b7885919eabb8c4bdb0a3978a7d7064574a3d3124170a00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000b1825313e4b5864717e8b97a4b1beb5a89b8e8275685b4f4235281c0f02000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d4134271a0e14212d3a46535f696e7b828882796d665c51443f3b4854616e7b8796a19f93877c6f63707d8996a1adb9c3b8ac9f92867a6d6054473a2f24190d010000000000000000000000000000000000000006121f2b3844505b667986929facb9c5cdcabdb1a4978a7e7164574b3e3124180b000000000000000000000000000000000000000007121c2b37434e5866727f8c99a8b2bdc9d2c6b9ada197897c6f6256493c3025190d010000000815212e3b47535f6a6f77777776767675757574747473737372727272717171707070707070707070707075828f9ca8b5c2cfd9cec1b4a89b8e817570707070707071717171727272737373747474757575767676767777706c6155493c3023160a000714212d3a46535e696e7b80858a8f949b9fa3aaa29f9a948f8a847f79726d66605c545049413c342e271e19130c0500000000000000000000000000020e1925303a46535e6975818e9ba8aaa39892877e726d605c554e463f372d21180e030000000000000000030c1720293036383f44464d53575e616a6f757d838d939aa1a9b0afaaa29f9590877f776d685f584f473e362c241b11080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3946525e686e7a828f949ea5a69e9590847b6e695e564c433930261c11060000000000000000000000000000000000000000000000000000000000000000000000000000000a141d262d333839424444414547494a4c4a5053555653514b43392f241b0e0400000000000000000000000000000000020b18222a31373a3c43454344414647494b4e50514745413a31281d1307000000000000000000000005121f2c3845525f6b7885918780786e69605c54504a423d444f59616368625f585049413c45515d67727f8c97a1adb9c1b7ab9f94897c6f62574d42372b1b11060000000000000000000a141c252d343a3d3f423b414d5a6774808d9aa7b3bbaea195887b6e6263707c8996a3afb3a69a8d807367575e61676d71777d82878f939d9fa7a49f9c99928e88827d77716d6d727f8b919691857d746d68605c544f473d342a20150a0000000000000000000000000000000000060f1b26313c45525d686d7676736f6a615e564f473d342b21170d000000000000000000000000000000000000000000071e2b3744515e6a7784919daab7c4bdb1a4978a7e7164574b3e3124180b000000000000000000000000000000000000000000000000000000030608090d0b08070502000000000000000000000b1824313e4b5764717e8a97a4b1bdb5a89b8e8275685b4f4235281c0f02000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d4134271a0e15222e3b4855616e7b8590948f82786d605a50463d4a5763707d8a96a99c9083766a606c7884919eabb8c4baaea3988a7e7164564c4135291d110400000000000000000000000000000000000000030f1c28333f4a5f6c7885929fabb8c5d2cabdb0a4978a7d7164574a3e3124170b0000000000000000000000000000000000000000000f1a26313c4855626f7b8896a1acb9c5d2c9beb2a9998c807366564c41362a1d11050000000916222f3c4955626f7c8384838383828282818181808080807f7f7f7e7e7e7d7d7d7d7d7d7d7d7d7d7d7d7d828f9ca9b6c2cdcdcdc3b6a99d90837d7d7d7d7d7d7d7d7e7e7e7f7f7f7f80808081818182828283838384837e7064574a3d3124170a0005121e2a36424d575e696e73797d82888e92999fa3aba69f9c96918b847e79716d66605b534e454039302a251e160e0701000000000000000000000005111e2a36414d56616e7b86929facb4aaa39992877f746d675f5851493f332a1f1509000000000000000000050e171e252a2d33383c42464d52585f626b7078808892979fa6afb4aea79f99928c827a6f6a605950483e362c231a1007000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111e2a36414c565e686d79828e939ea6a79f9691847b6e685d554b42382e23170f060000000000000000000000000000000000000000000000000000000000000000000000000000020b141c22282b2d35372f35393a3c3e403f444648494745403931281d120900000000000000000000000000000000000006101820262b2e2f3738373035393a3c3e4143443a39352f281f160c01000000000000000000000006121f2b3844505c66798592938d837b716d66605b544f474855616b70756f6a605b534c44404b55606d7985919eabb5c0bbb0a69b8f8275695f5347382d22170b0000000000000000060f1c262e373f454a4b4f48474d5a6774808d9aa7b3bbaea195887b6e6263707c8996a3afb3a69a8d8073675a52555d60656b70757b828990959fa2aaaba39f9b948f89837e78716d727f8b8f847b706b615e56504a423d352b22180e040000000000000000000000000000000000000a15202935414c565d606a6a66625f58524c443d352b22190f05000000000000000000000000000000000000000004101d2a3743505d6a7683909da9b6c3beb1a5988b7e7265584b3f3225180c00000000000000000000000000000000000000000000000000030a0f1215151a181514120e090604000000000000000b1724313e4a5764717d8a97a4b0bdb4a89b8e8175685b4e4235281b0f02000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d4134271a111723303d4a5663707d89949f948d80746c62584e434c5965727f8c98a3998b7f72655b6674818e9aa7b4c1bfb4aa9c8f8275685d5245392c20130700000000000000000000000000000000000000000b17222d45525e6b7885919eabb8c4d1c9bdb0a3968a7d7063574a3d3024170a0000000000000000000000000000000000000000000a15212e3a47535f6a7884919eabb7c4d1cfc3b7aa9d908377685e5246392d2013070000000916232f3c4956626f7c899090908f8f8f8e8e8e8e8d8d8d8c8c8c8b8b8b8a8a8a8a8a8a8a8a8a8a8a8a8a8a8f949fabb7c0c0c0c0c0b8ab9f95908a8a8a8a8a8a8a8a8a8b8b8b8c8c8c8d8d8d8d8e8e8e8f8f8f9090908a7e7164574b3e3124180b00020e1a25313b454d575e61666d71767b81878e92999fa3aba8a19e96918b847e78716c655f58514b433d3630282018120b03000000000000000000050e1b242d3946525e6874808d99a3afbbb4aba399938c81796f6a625b51453c31261a0e02000000000000000000050c13191c22282b31373b42464e535960666d737d858f949fa4acb5b1aba39f948f847c706b615a50483e352c22190f0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d1925303b444c565d676d78818e949fa8a8a19691837a6d675d544a3f342821180c030000000000000000000000000000000000000000000000000000000000000000000000000000020a11171c1f20282b24292c2d2f312d3338393b3d3a39352f281f160c0000000000000000000000000000000000000000060e151a1f21222a2b2a24292d2e2f323436372d2c29241d160d040000000000000000000000000713202d3a4653606d7986989f9590857e78716c6661594f4a5763707d817c726c655e564f4645515d67727f8c99a3afbbc2b9ac9f93877b6e6153493f33271b0f03000000000000030e18212e3840495156585c55534e5a6774808d9aa7b3bbaea195887b6e6263707c8996a3afb3a69a8d8073675a4d4b51535960636a6e757c838b92989ea6afaca69f9c95908a847e766e727e827b6e696059524c443f38302b2318120b03000000000000000000000000000000000000040d19242f3a434c52545d5d5955534e46413a322b23191007000000000000000000000000000000000000000000020f1c2835424f5b6875828e9ba8b5c1bfb2a6998c7f7366594c4033261906000000000000000000000000000000000000000000000000060e151a1f2122272522211e1a1312100c0704010000000b1724313e4a5764717d8a97a4b0bdb4a89b8e8175685b4e4235281b0f02000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d4134271e1e1e222f3c4854606b76828f9a9d928b7e716a60554b49536874818e9b9f92867a6e615464717e8a97a7b1bcc5b9ac9f92867a6d6054473a2d2114090000000000000000000000000000000000000000061e2b3844515e6b7784919eaab7c4d1c9bcb0a396897d7063564a3d3023170a00000000000000000000000000000000000000000006121f2b37434e586774818d9aa7b4c0d1d1c4b8aca095877a6d6154473a2e2114070000000714212e3a4754616d7a87999d9d9c9c9c9b9b9b9a9a9a9999999898989797979796969696969696969696969c9fa6b0b3b3b3b3b3b3b3b1a79f9d969696969696969797979898989999999a9a9a9b9b9b9b9c9c9c9d95887b6f6255483c2f221509000009141f29333b454d52545c60646a6e747b81878e92999fa6aca8a19e96918b847e786e6a605c554f46413a3229241d150d0600000000000000020d17202b37434e58616e7b86929fabb5c0bdb4aba49f938e837c726d62574d42372b1e12060000000000000000000002080d11171c1f262b30363c43474f545c606b707a828c939aa3abb5b5aea69e9691867d706c615a50473e342b21170c020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008141e29323b434c555d666d78829096a1aaa8a0959082796d665c50443e332a1e150b00000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f12131c1e191d2021222422282b2d2e302d2c29241d160d04000000000000000000000000000000000000000000030a0f1215151d1e1d191d20212325272a2b21201d18130c04000000000000000000000000000714212d3a4754606d7a8793a79f97928b847e78706b61554b5b6874818e877f776d686059534d4b55616e7a86929facb9c5bbafa49a8d8073655b5044372b1f12060000000000000915202a33404a525b626569625f585a6774808d9aa7b3bbaea195887b6e6263707c8996a3afb3a69a8d8073675a4b4a47474f54585f626b6f787f868f949fa3abb0aba7a09d96918b827c7371756e695e574f46413a342e2d2c29231d150d0300000000000000000000000000000000000008131e28313a41454750504d4847433c3630292019110700000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3bfc1b4a79b8e8174685b4e412d22170b000000000000000000000000000000000000000000000006101820262b2e2f34312e2d2a26201f1c1813100d0703000b1724313e4a5764717d8a97a4b0bdb4a89b8e8175685b4e4235281b0f02000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d41342b2b2b2b2b2c38444f59626f7c87939f9f92877c6f675d51505b657683909d9c8f8276685e54616e7a8795a0acb8c5bbaea3998a7d7164574a3e31261a0e0200000000000000000000000000000000000004111e2a3744515d6a7784909daab7c3d0c9bcafa296897c6f6356493c30231609000000000000000000000000000000000000000000030f1a26313e4b5864717e8b97abb5bfcbd4c8bcb1a7968a7d7063574a3d302417090000000613202d394653606c7986939fa9a9a9a8a8a8a7a7a7a6a6a6a5a5a5a5a4a4a4a3a3a3a3a3a3a3a3a3a3a3a3a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a3a3a3a3a3a3a3a4a4a4a4a5a5a5a6a6a6a7a7a7a8a8a8a9a9a9a094877a6d6154473a2e2114070000030d172129333b42464a5153585f62696e747b81878f949ea1a8ada8a09e96918a827c736d676059524c443e352f271f18100600000000000008141e29323b47545f6a74818e98a2aebdc7c6bdb5afa59d9590867f72695f53473a2e21140800000000000000000000000000060b0f141a1f252a31373d424a505960686e7880889299a3abb5bbb0a8a09892867e716c61594f463c33291e140a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020d172029313a434b545c666e7a849198a2aea79f958f82786d605a50463c30271d120700000000000000000000000000000000000000000000000000000000000000000000000000000000000306060f080d1113141617171c1f20222320201d18120c04000000000000000000000000000000000000000000000000030608091012080d11131416181b1d1e1413110d070100000000000000000000000000000815222e3b4855616e7b8894a1a9a29f96918a837d70675d515c6875828f928c827a706b615e5753525e6875828f9ba9b3bec0b6ac9e9184786c605346392d22170b0000000000020e1a26313c45525c636d72756e6a5f576774808d9aa7b3bbaea195887b6e6263707c8996a3afb3a69a8d8073675d555753514b494e535960666c727b828c9299a1a9b1b1aca8a09e9490878079706b605c554b403d4043423a38342f271f150b010000000000000000000000000000000000010c161f282f35393a4343403c3b37322a251e170e070000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97acb6c0c2b6a99c8f83766953493f33271b0f03000000000000000000000000000000000000000000050e18222a31373a3c403e3b3a36312d2c2823201d18120f0b061724313e4a5764717d8a97a4b0bdb4a89b8e8175685b4e4235281b0f02000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d4137373737373838333d47535f6a74818e98a3999184796d605953606c7985929f998b7e716556525e687784909daab7c3bfb5ab9a8d817467574d42362a1e120500000000000000000000000000000000000004101d2a3743505d6a7683909da9b6c3d0c8bbafa295887c6f6255493c2f221609000000000000000000000000000000000000000000000a16222f3c4955626f7c8899a3aebbc7d3cdbfb2a6998c7f7366594c4030251a0e0200000714212e3a4754616d7a8799a4a1a0a49f9f9e9d9d9d9c9c9c9c9b9b9b9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9b9b9b9c9c9c9d9d9d9e9e9fa3aba1a2a194887b6e6155483b2e221508000000050f1721293036394044464e53575f61696e747c828a91969fa3abaca8a09d9490868079706b615e5650454039312a2217110a02000000060f1925303b44505a626f7c87939faab4bfcfd0c7c0bbafa7a09992887b6e6255483b2f22150800000000000000000000000000000003090e141a20262b30383f444f565e666c737e879299a3acb6bab2aaa29892877e716b61584e453b30261c110600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e171f283139424b545e686f7c86929fa5afa79e948e81746c62584e42392e23180c030000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000104060709060b0f121315161413100d0701000000000000000000000000000000000000000000000000000000000004050001050707090b0e101107060401000000000000000000000000000000000a1723303d4a5663707d8996a3b3ada8a09e9590867a6d60535c6976828f9c948f847d756e69615f575663707d8a97a2adbac7b9aca196897c706353493f33271b0f030000000006121e2b37424e57636e737e827c6e695f6774808d9aa7b3bbaea195887b6e6263707c8996a3afb3a69a8d80736d676764605d555553504f545b60696e777f879196a0a7b0b8b2aca69f99928d847d756d675c5146494d504f4745403931271d1207000000000000000000000000000000000000040d161e24292c2d3737332f2e2b262019130c05000000000000000000000000000000000000000000000000000916232f3c4956626f7c899aa4afbbc4b7aa9e918477655b5044372b1f12050000000000000000000000000000000000000000020c17202a343c4347484d4b4846423d3a38342e2c29241f1c17111724313e4a5764717d8a97a4b0bdb4a89b8e8175685b4e4235281b0f02000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d44444444444444454545434e58616e7b86929fa0968d81746b6156616e7b87989f92867a6d60544c566774808d9aabb5c0c4b7aa9e918477695f53463a2d21140700000000000000000000000000000000000003101d293643505c6976838f9ca9b6c2cfc8bbaea295887b6f6255483c2f221509000000000000000000000000000000000000000000000713202d3a4653606d7986929facb9c5d2cfc2b5a89c8f827569574d42362a1e120500000915222f3c4855626f7c889595949499939291919090908f8f8f8f8e8e8e8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8e8e8e8f8f8f90909091919292999494959696897c706356493d3023160a00000000050f171f252a2e34383c43474d53575f616a6f767e848c9299a0a7afaca69f99928c847d746d68615a514b433c3428231c140c0400030d18212a36414c56616c76829099a4afbcc6d0d0c7c0bbb0a7a0958f8276695f53473a2e211408000000000000000000000000000000000002090e151b1e262e343d444d545b606c717e87929aa4afbbbcb4aaa39992877d706a60574d42382e23170c0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d161f273039424c56606a717e8a939ea9b0a69d938b7e716a5f544b40342820150a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030606080a070604010000000000000000000000000000000000000000000000000000000000000000000000000000000001030400000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bab2aca79e918478675d51536a7683909d9e969189817b746e696058606d7985929fabb8c5bdb2a89a8e8174655b5044372b1f1205000000000814212e3a47535f6a73808b8f857b6e686774808d9aa7b3bbaea195887b6e6263707c8996a3afb3a69a8d80757a7774706d676662605b535450575e656c727d8491959fa6b0b9b9b0aba39f96918a81796d60535356595c5c53514b43392f23180e05000000000000000000000000000000000000040c13191d20212a2a2622211f1b150d080200000000000000000000000000000000000000000000000000000714212d3a4754606d7a86939facb9c5b9ac9f9286796c605346392d201306000000000000000000000000000000000000000008131e29323c464e53555a5855534d494644403a39352f2b28221c1b24313e4a5764717d8a97a4b0bdb4a89b8e8175685b4e4235281b0f02000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a5151515151515151515252524a525e6974808d99a39d928a7d70685e63707d8a969c8f8276685d524a5763707d8a99a3afbbc5b9aca096887b6e6155483b2e221507000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfc7bbaea194887b6e6155483b2e2215080000000000000000000000000000000000000000000006131f2c3845515c667784909daab7c3d0d1c4b8ab9e918578695e52463a2d20140700000b1824313e4b5764717e8a8988888786868585848383838382828281818181808080808080808080808080808080808080808080808080808080808080808080808080818181828282838383848484858686878888898a8a7f7265594c3f3226190c0000000000050d141a1c23282c31373c42464d53585f626c71797f8690959fa3abb0aba39f969189817a716c605d554e463f342e261e160e060b151f29333b46525e68717e8b949fabb5c0cecec5beb6afa69e9590837a6d61574d42372b1e120600000000000000000000000000000000000000040a0c141c2328323b424a505a626c717e88939fa5afb9bcb4aba39992867c6f695e544a3f34281e150a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d151e27303b444e58616c75818e97a2adafa59f92867c6e665c51453c31261a0c03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111e2a36414c566774818e9aa7b4c1baaea2988d80746755505b657784919da8a19e938e86817b6f6a605c6675818e9babb5c0c4b8ab9e9185786c605346392d201307000000000815222f3b4855626e7b88929791847a6d6574808d9aa7b3bbaea195887b6e6263707c8996a3afb3a69a8d80828683817d7a76726f6c65625f5854535b606b6f7b8390949fa7b1bab4aea9a19e9590877b6f625b6063666968605c554b40342920170e0400000000000000000000000000000000000001080d1113141d1d1a1515120f0a04000000000000000000000000000000000000000000000000000000000713202c3945525d687784909daab7c3baaea398877b6e6154483b2e21150600000000000000000000000000000000000000010d1925303a444e585f626764615f575653514a4745403938332d2b2624313e4a5764717d8a97a4b0bdb4a89b8e8175685b4e4235281b0f02000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2bec0b3a79a8d8074675e5e5e5e5e5e5e5e5e5e5e5f5f5f5b60616e7b87929fa49e91857a6d6165717e8b98998c807366564c4754606d7a86929facb9c5bdb2a8988b7e7265584b3f2f24180d010000000000000000000000000000000000020f1c2935424f5c6875828f9ba8b5c2cec7baaea194877b6e6154483b2e2115080404040404040404040404040404040404040404040404101c2834404b546874818e9ba7b4c1ced2c6b9ada197877b6e6154483b2e21150800000714212e3a4754616d7a7d7c7b7b7a7a7978787777767676767575757474747473737373737373737373737373737373737373737373737373737373737373737373737474747575757676777777787879797a7b7b7c7d7e7b6e6154483b2e21150800000000000003090e12181c1f262b31373b42464e535a61676d737c838c9299a0a8afaea8a09d938e857e746d675f5850443f38302820180f121d27313b45505a616e7a85929ea6b0bdc7ccc3bcb4aca49f948f837a6d685d52453c31261a0e02000000000000000000000000000000000000000000020a111720292f383f44505a616c727f8c939da7b1bcbdb5aba29892857b6e665c50443d30261c11060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c151e29323c46505a616d7a85929fa7b1aea2989083796d60584e43372b1e150a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005080a0b1210100f0e0d0d0e0f10110c0b09060100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3946525e687784919daab7bdb1a79f92867a6e615453606c7985929facada59e99928e877c6f625464717d8a99a4afbbc6b9ada197887c6f6255493c2e23180c000000000714212d3a4754606d7a85929e968f82776c74808d9aa7b3bbaea195887b6e6263707c8996a3afb7aa9d90838e92908d8a86837f7c78746f6a65615e565960696e7a829095a0a8b0aaa29f97918b837d706a62666c707376756d675c51453c332920160e05000000000000000000000000000000000000000104060710100d0908060300000000000000000000000000000000000000000000000000000000000004111d2935414c566774818d9aa7b4c0bfb4aa978a7d7164574a3e2e23170b0000000000000000000000000000000000000005111d2a36414c565f6a6f73716e696763605c5453514b46443f3837312c313e4a5764717d8a97a4b0bdb4a89b8e8175685b4e4235281b0f02000000000000000000000000000000000000000c1926323f4c5965727f8c98a5b2bfc0b3a79a8d80746a6a6a6a6a6a6a6a6a6b6b6b6b6c6c666c6d6c75818e9ba6a1978e81756c66727f8c9999897d7063564a45515d677784909daab7c3c1b4a79b8e817468554b4135291d11040000000000000000000000000000000000020f1c2835424f5b6875828e9ba8b5c1cec7baada094877a6d6154473a2e21141010101010101010101010101010101010101010101010100c18232e3f4c5965727f8c98a5b2bfcbd5c9beb3a996897d7063564a3d3023170a00000713202d3946525e686d706f6f6e6d6d676c6b6a6a6a69696969686868676767676767676767676767676767676767676767676767676767676767676767676767676767676868686969696a6a6a6b6b666d6d6e6f6f70716e695e53463a2d211407000000000000000000070c10151a1f262b31363c434750555c606a6f78808791959ea5afb2aca59d97928a81796f6a625a504a423a322a211818232f39434d57616c75818e97a2adb8c2ccc2bab2aaa29a938c82796d685d564c41332a1f1509000000000000000000000000000000000000000000000000060e171d262d333f48505a636d74818e95a0aab4bfbdb4aaa1979082786d60594f42382e23170c020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c17202b343e46525e68727f8b959fabb4aaa0958c7f736a5f53473e30261c110600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050c111417171e1d1c1b1a19191a1b1c1e191816120d07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8796a0acb8b5aba0958d8073685e5254616e7b8798a2aeb9afaba39f96897c6f6356606d7a86939facb9c6beb3a9998c7f7266544b4034281c10040000000713202c3945525d68727f8b959f948c7f7274808d9aa7b3bbaea195887b6e6263707c8996a3afb8aca09590959c9d9a99928f8c8884807c77726e6864605c5e686d79839096a1a69f98928c847e78706b6a6f73787c808382796d60584e453b322820160e05000000000000000000000000000000000000030606090d0e0f0d0a0706040000000000000000000000000000000000000000000000000000000000010d1924303e4b5764717e8a97a7b1bcc0b3a69a8d807367544a3f34281c10030000000000000000000000000000000000000713202d3946525e686f7c807e7b7773706d6664605d5553504a47433c39353e4a5764717d8a97a4b0bdb4a89b8e8175685b4e4235281b0f02000000000000000000000000000000000000000c1926333f4c5966727f8c99a5b2bfc0b3a79a8d8077777777777777777777777878787879797979786f7c88949fa99e938a7d706773808d9a93867a6d605447414c556875828e9ba8b5c1c4b7aa9d918477675d5145392c2013060000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1cec6baada093877a6d6054473a2d211d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d23303d495663707c8996a3afbcd0dacfbeb1a4988b7e7165584b3e3225180b000005111d2a36414c565e616362626161605d555e5e5d5d5d5c5c5c5c5b5b5b5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5b5b5b5c5c5c5d5d5d5e5e545c60616162636364615e574d42362a1e12050000000000000000000000040a0f141a1f262a31373e434b51585f666d737c838e939fa3abb3afa9a19e938e837c716c605c544c443c332a22222934404b555f69717e8a939ea9b3bec7c0bbb0a8a098928880776d675d564c443a3021180e0300000000000000000000000000000000000000000000000000050b141c2228363e48515b606d79839198a3aebac4bcb3a99f948c80736b60544a3f34281e1308000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e19222a36414c56606c7883909da6b0b1a79f92867c6e625a5042382e23170c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000810171d2123242b2a29282726262728292b2525221e1811090100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717e8a97a8b2bbaea3999183796d60564c5663707d8996aab4bfbdb1a89e9184796d60535d677784909daab7c3c3b6a99c908376665c5145382c1f130600000004111d2935414c56606d7883909d9f92877c74808d9aa7b3bbaea195887b6e6263707c8996a3afb6a99d938e8b90939a9d9f9c9997918d88837f7a75716d67615e676e7a8491979e9490867f79716d6d72777c8084898c8f8d80736a5f574d443a322820170e05000000000000000000000000000000060b0f1213161a1b1b1a171413100c07010000000000000000000000000000000000000000000000000000000814212e3b4754616e7b8795a0acb8c3b6a99c908376665c5044382b1f12060000000000000000000000000000000000000714212e3a4754616d7a858d8b8884807d7975716d6763605b54534e4745403e4a5764717d8a97a4b0bdb4a89b8e8175685b4e4235281b0f02000000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfc1b8ab9f928584848484848484848484848485858585868686847876828f9ca9a59e9184796d74818e9b908477685d5245404c5966737f8c99a6b2bfc6b9ac9f93867a6d6054473a2d2114070000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1cec6b9ada093867a6d6053473a2d2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2e3b4754616e7a8794aab4becad6ccbfb3a6998c807366594d4033261a0d0000010d1925303a444c5254575655555453514b5251505050504f4f4f4e4e4e4e4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4e4e4e4f4f4f5050505151514b515354555556575754534d453b31251a0e020000000000000000000000000003090e141a20262b313940454e545c606a6f79818c9299a1a9b2b3ada59d9591867e746d665d564d453c342b2a343c45515c676e7b85929fa5afbbc4bdb5afa69e9691867e736c655d554c443a32281e0f06000000000000000000000000000000000000000000000000000000020a1117242c363f45515d676f7c86929fa8b2bdc5bbb0a69f93877d6f665c50443a3025190d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007101925303a44505b666f7c88949eaab7aea3999083766c61544a3f34281c12070000000000000000000000000000000000000000000407090a0d0a0807060607080a0c0b0a08050000000008121a22282d3031383736353433333435363832312e29231b13090000000000010304050605040300000000000000000000000000000000000000000000000000000000000000000000000006121f2b37434e586774818d9aa7b4b1a79f92877c6f675c514b546673808c99a6b3c0b6aca0958c7f72665c51556774818e9aa7b4c1c5b9ac9f9286796d6053463a2d201307000000010d19242f3a44505c66707d89949e9991847a808d9aa7b3bbaea195887b6e6263707c8996a3afb4a79b8e817e83878c90959a9fa19e9a95908c86827e79736e6861686e7c8592938e827b736d6e73797f83888d9197999c92877c6f695e564c443a322920170e05000000000000000000000000020a11171c1f20232628282724201f1d18120b0600000000000000000000000000000000000000000000000000000714202d3a46525e697783909daab7c3b8ac9f9285796d6053463a2d2013090000000000000000000000000000000000000d192633404c5966737f8c979796918d8985827e7a74706c66625f5853514b464a5764717d8a97a4b0bdb4a89b8e8175685b4e4235281b0f02000000000000000000000000000000000000000d1a2733404d5a6673808d99a6b3b5b4b4ada29792919191919191919191919191919292929299928679707d8a97a1aca1968c807376828f9a8d817467564c413e4a5764717d8a97abb5c0c7bbafa499897c706356493d3023160a0000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1cec6b9ada093867a6d6053473a373737373737373737373737373737373737373737373737373737373737373a4653606d798698a2aebac6d3cec1b4a79b8e8174685b4e4135281b0700000008131e29323a4146474a4948484747454045444443434343424242414141414040404040404040404040404040404040404040404040404040404040404040404040414141424242434344444445404546474848494a4a4846423b33291f14090000000000000000000000000000000003090e151b1f272f343c424a515860676d757f879297a0a8b1b9afa7a098928b80786d685f574e463d35313c46505a606d79839097a2adb7c1bab2aba49f948f847c706c605b534c433a322820160c00000000000000000000000000000000000000000000000000000000000006121b242935404b555f6a737f8c96a0acb9c2c2bbafa4999183786d60564c41362a1e13080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e28333f4a54606a76828f9ca7b1b4ab9f948a7e71665c5044392e23180c00000000000000000000000000000000000000050b1014161719171413131314151719171714110c050005101a242c33393d3e45434342414040414243443f3e3a342d251b11070608080b0d101112121211100d0a060503000000000000000000000000000000000000000000000000000000000000000815212e3a47535f6a7784919daab4aa9f958c7f736a5f554b515c6676838f9ca9b6bbafa49a9184796d60544b5865727e8b98aab4bfc7baaea399897c6f6256493c2f2316060000000008131e28343f4a54606b75828f9ca1968f81808d9aa7b3bbaea195887b6e6263707c8996a3afb3a69a8d8073767b7f83888d92989ea1a09d99928f8a85807a746e696a707d868b81786e6f757b80858b90959a9ea1a9a39991847b6e685e564c443a322920170d0200000000000000000000080b141c22282b2d3033353534312d2c29241d17110a0200000000000000000000000000000000000000000000000005111e2a36424d5766737f8c99a7b1bcbaaea298887c6f6255493c31261a0e020000000000000000000000000000000000101d2a3743505d6a7683909b9fa09e9a98928e8a85817d78736f6a65605d55524d5764717d8a97a4b0bdb4a89b8e8175685b4e4235281b0f02000000000000000000000000000000000000010d1a2734404d5a6773808d9aa6a8a8a8a7a7a9a29f9d9d9d9d9d9d9d9d9d9d9e9e9e9e9f9f9f9f9285796d7985919eaba89f92867b778390978b7e7164584b3e3c4855626f7b8899a3afbbc7c0b5ab988c7f7265594c3f322619080000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1cec6b9ada093867a6d60534743434343434343434343434343434343434343434343434343434343434343434345515c677885929fabb8c5d2cfc2b6a99c8f8376695c50432e23180c000000020c1720293036393a3d3c3c3b3a3a38352f37373736363636353535343434343434343434343434343434343434343434343434343434343434343434343434343434343535353636363737372e34383a3a3b3c3c3d3e3b3a36312921170d03000000000000000000000000000000000000030a0d151d2329303940444e555d606d727d8591969fa7b0b8b1aaa39f928d827a6e695f584f473e3a434e58616c74818e95a0a9b3bebaafa8a199938d827a6e6a615a5049413a312820160e0400000000000000000000000000000000000000000000000000000000000000091218242f39434e58606d7984919ea7b1bcc7c0b5aba0958b7f72685e52463a2f24190d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b17222d38424e5863707d8995a0acb8b0a69e9184786d60544a4034281c100400000000000000000000000000000000000810161c202324262321201f20202123262423211c1710080c17222c363e45494a51504f4e4d4c4c4d4e4f514c4a463f372d23180f121415181a1c1e1e1f1f1e1c1a1613120f0b0600000000000000000000000000000000000000000000000000000000030f1c28333f4a54626f7c8895a0acaea2989083786d60584e4653606d7986929facb8b3a99f93887d6f675c514955626f7c8898a2aebac7bfb4ab988b7f7265584c3f2d22170b00000000010b17232e38424f59626f7c89949f9e938f84919eabb8bbaea195887b6e6263707c8996a3afb3a69a8d8073696e72777b80868c91969da0a39f9c97928d86817b746d6b707c7e786e747c81868d92979da0a7abadb2aba19690837a6d685e564c443b32291e14080000000000000000010a111a1d262d3338393c404142403d3a39352f27221b140b030000000000000000000000000000000000000000000000020e1a25303b4855616e7b88959fabb8bfb4aa998c7f7366574d42372b1e12050000000000000000000000000000000000101c2936434f5c697682898e92989c9fa29f9b98928e8984807c77726d67615e565764717d8a97a4b0bdb4a89b8e8175685b4e4235281b0f02000000000000000000000000000000000000010e1a2734414d5a6774808d9a9c9c9b9b9a9a9999989898989898989898999ca4ababababacac9f9285796673808d9aa7aea3988f8278849199887b6e6255483b3a4653606d7986929facb9c5c1b4a89b8e8175685b4e423025190d0100000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1cec6b9ada093867a6d605350505050505050505050505050505050505050505050505050505050505050505050504b556b7784919eaab7c4d1d1c4b7aa9e9184776b544a4034281c1004000000050e171e252a2d2e302f2f2e2e2d2c29242b2a2a2a2929292928282827272727272727272727272727272727272727272727272727272727272727272727272727272828282929292a2a2a2b23282c2d2e2e2f3030312e2d2a251f170f05000000000000000000000000000000000000000000030b12181e272e343c434b515b626b707b8490959ea6afb7b4aea49d948f847b6f6a60595048424b555f6a717e8b939da7b1bbb3ada59e96918780786d685f5850443f382f281f160e0400000000000000000000000000000000000000000000000000000000000000000007121d27313c45515c67707d8a959fabb7c3c7bdb1a79f92857a6d61564c4135291c12070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c262f3c4854606b7783909da9b2b8aca0968b7e72665c5144382c1f160a0000000000000000000000000000000008111a21282c2f3033302e2d2c2c2d2e303231302d28221a12111d28333e485055575e5d5c5b5a59595a5b5c5e585651493f34291e1a1f21222527292a2b2c2b2b292623201f1b17110b06000000000000000000000000000000000000000000000000000006121f2b3844505b6673808d99a8aea49f92867b6e665c50464956636f7c8998a2aeb6aca1978e81746b60554b4653606d7985929facb8c5c1b4a89b8e817568544a3f33281c0f030000000006111c26303d4754606a76828f9ca59e969196a1adb9bbaea195887b6e6263707c8996a3afb3a69a8d80736761656a6e747a7f848b91959fa2a9a29f98928d87817a726d6f72737b81878e92999fa2a9acb1b8b9bdb2a8a09590837a6d685e564c443b3025190e02000000000000010a131c232c2f383f4446494d4e4e4d4a47454039332d261d150c0300000000000000000000000000000000000000000000000914212d3a46535f697783909daab4beb7aa9d908377695f53463a2d21150a00000000000000000000000000000000000713202d3a4653606d787d81868b8f939a9ea0a29f9b96918d88837f7a736e68625f64717d8a97a4b0bdb4a89b8e8175685b4e4235281b0f02000000000000000000000000000000000000010e1b2734414e5a6774818d908f8f8e8e8e8d8d8c8c8c8c8c8c8c8c8c8c8c919ca8b8b8b8b8ab9f9285786c6e7b88959fabaa9e93897d86929286796d6053463a3844515c667784919daab7c4c3b6a99d9083766a564c41362a1e110500000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1cec6b9ada093867a6d605d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d6a7683909da9b6c3d0d2c5b9ac9f928679665c5144382c1f120600000000050c13191d20212423222221201f1d181e1d1d1d1d1c1c1c1b1b1b1b1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1b1b1b1c1c1c1d1d1d1e1e181c1f2021222223242421211e1a140d05000000000000000000000000000000000000000000000001070c151c2328313a4145515960696e7a838f949ea5afb7baaea69f9691857c706b615a504a545d676f7c86929fa5afbab0a9a29f938e847d736c665d564e463e332d261d160d0400000000000000000000000000000000000000000000000000000000000000000000010b151f2834404b55616b7683909da7b1bcc8c3baada2978d8073685d5245392e23180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d2c38444f5964717e8a96a1adb9b2a89e9184796d6053463d32271b0f01000000000000000000000000000005101a232c33383c3d403d3b3a38393a3b3d3f3e3c39332c241a14212d3945505a61646b6a69686766666768696b65625b51463a2e20262b2e2f31343637383938373633302d2b27221b17110a020000000000000000000000000000000000000000000000000613202d394653606c7884919eaba69d928b7e71695f544a424d5766737f8c99aab4afa49a91857a6d60594f4344505c667683909ca9b6c3c4b7aa9d918477665b5044382b1f120600000000000a141e2b37434e5863707d89959fa9a19ea1a9b2bdbbaea195887b6e6263707c8996a3afb3a69a8d8073675a575f62686d72797e848b92979fa3aaa39f99928e857f78727980868e939a9fa3abadb3b8bcc3c3c1bab1a7a09590837a6d685e564c41362a1e110500000000000009131c252e353d424a505356595b5b5a5753514b443f382f271e150b000000000000000000000000000000000000000000000005121e2b37424d5765727f8b98a2aebab8aca095887b6e6155483c32271b0f030000000000000000000000000000000006121f2b3844505c666d70757a7e83878c91969da0a7a19e9a95908b85807b746e6a64717d8a97a4b0bdb4a89b8e8175685b4e4235281b0f02000000000000000000000000000000000000000b1825323e4b5865717e8483838282818180807f7f7f7f7f7f7f7f7f7f7f8c99a6b2bfc5b8ab9e9285786b6a7683909dabafa59e91849198918477665c50443834404a546875828e9ba8b5c1c5b8ab9f928578685e5246392d20140700000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1cec6b9ada093867a6d6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a75828f9ca8b5c2cfd3c7baaea39886796d6053463a2d201307000000000002080d11131417161515141e2225262928282827272727262626252525242424232323222222222222222222222222222222222222222222232323242424252525262626272727282828292921201e19151617171514120e09030000000000000000000000000000000000000000000000000000030b12181f282f353f474f575e686d79828e939ea5afb7b8b0a8a09792867d706c615a535c666d79849198a2aeb4aea69f97928a817a706b605b544c443c3427221b140b04000000000000000000000000000000000000000000000000000000000000000000000000030d18232e39434f5963707d8a95a0acb8c6cabeb3a99f92857a6d60544a4034281c100400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b1c27333d4653606d7984919eabb8b9ada1968a7e7164594f44382c1d120700000000000000000000000000000b16212c353e44484a4c4a4746454547484a4c4a49453e362c221723303d4955616c717876767574737374757677726d62564a3e312d31373a3b3e4043444545454443403d3937332d27221b140b030000000000000000000000000000000000000000000005111e2a36414d5663707d8996a1a89f948d80746c61574d4247535f697683909da9b0a69f93887d70685d52473d3f4a546773808d9aa6b3c0c5b9ac9f9286796c605346392d2013060000000000020c1b27323d4854606b7683909da8adabadb2bbc4bbaea195887b6e6263707c8996a3afb3a69a8d8073675a4e53565d60666d71787f858d92999fa7aba39f97928b837f848c92989fa4acafb5babebfbab9b6b4b2b1b1a7a09590837a6e685e5246392d2014070000000000060f1b252e3740474f545b60636668686764605d555049413930271d120700000000000000000000000000000000000000000000020e1a26313c4754606d7a85929fabb5bcb1a7988c7f7265584e43372b1f14090000000000000000000000000000000003101c28343f4a545c6063676d71767b7f848a90959c9fa6a7a09d97928d86817b7570717d8a97a4b0bdb4a89b8e8175685b4e4235281b0f02000000000000000000000000000000000000000b1724313d4a56626c71777676757575747473737272727272727272727a8794a0adbac5b8ab9e9285786b65727e8b99a4afaca09691969c8f827669544a3f342e404d5a6673808d99a6b3c0c6baaea298877a6e6154473b2e21140808040000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1cec6b9ada0938679767676767676767676767676767676767676767676767676767676767676767676767676767676767676818e9ba7b4c1ced7cbbfb4aa93877a6d6054473a2d21140700000000000000010507070a09131c232a2e3133363535353434343333333232323131313030302f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f30303030313131323232333333343434353535352e2d2a251f170e0b08070502000000000000000000000000000000000000000000000000000000000000070d161d2429353d454d565e676d78818e939ea5afb7bab2a9a19892867e706c615b656d78828f96a0aab1aaa39f948f857e756d686059504a423a322a2217110a02000000000000000000000000000000000000000000000000000000000000000000000000000007121d27303e4855616b7783909daab4bfcac5baaea2988c7f72665c5144382c1f120700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b161f2c3844505c6674808d9aa9b3bdb2a99d9083776b605448392f23180c0000000000000000000000000004101c28333e474f555759565453515153545659575550483e33281c24313e4a5764717e84838281807f7f808182847f7265584c3f38393d4347484b4d4f51515252514f4d4946443f38332d261d150d030000000000000000000000000000000000000000000714202d3946525e6874818e9ba8a0968f82786d605a50453b4855616e7b88959faba99f948d80736b61564c41353e4b5865717e8b98a4b1bec7baaea398877b6e6154483b2e2115080000000000000a15202c38444f5964707d8a96a1adb8b9bdc4cdbbaea195887b6e6263707c8996a3afb3a69a8d8073675a534d4c52545c60666d727a808790959da4ada9a29f95908c91979fa2aaafb6bbb8b7b4b4aeaca9a7a6a4aaa29f9d9590837a6e6154473b2e21140800000000030d17212d374049515960666c6f73747573706d67605b534b43392e23180c05000000000000000000000000000000000000000000000914202c3945515d6774808d99a4afbbb6a99d9083766a6054473b31251a0e01000000000000000000000000000000000b17232e38424a5053555d6064696e73787d83898f949c9fa4a9a29f99928e87827c767e8a97a4b0bdb4a89b8e8175685b4e4235281b0f02000000000000000000000000000000000000000915212e3a45505a62656b6a696968686767666665656565656565656d7a8794a0adbac4b8ab9e9185786b616d7a86939facb2a8a09ea09a8d8174675a4e412e323f4c5965727f8c98a5b2bfcabeb3aa96897c6f6356493c3023171614100b05000000000000000000000000020f1c2835424f5b6875828e9ba8b5c1c2c2c2b6a99d908383838383838383838383838383838383838383838383838383838383838383838383838383838383838385919eabb8c4c7ccd1baaea194877b6e6154483b2e211508000000000000000000000007111c252d353a3e3f4242424141414040403f3f3f3e3e3e3d3d3d3c3c3c3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3c3c3c3d3d3d3e3e3e3f3f3f3f4040404141414242423b3936302920170d0200000000000000000000000000000000000000000000000000000000000000000000040c1318232b333b444c555d666d78818e939ea5afb8bbb3aaa29892877e706b606c77818e949ea8ada7a098928b827b716c605d564f443f382f2820180f0600000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e2c38444f5965717e8b98a2aebac7cabfb4aa9e9184796d6053463a2f23180c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a5463707c8997a1adb9b8aba095897c6f63554b4034291c10040000000000000000000000000714202c38444f596163666361605c5d6061636564615a5045392d2125323f4c5865727f8b908f8e8d8c8c8d8e8f8e8275685b4f3f4446494e5355585a5c5d5e5f5e5e5c5956535049443f382f271f150b010000000000000000000000000000000000000004111d2935414b55616e7b86929fa29891847a6d665c50483e434e586673808c99a7aba1979082786d60594f443a2f3d4a5763707d8a96a3b0bdcbbfb4aa96897c706356493d3023160a00000000000004101c27333d4653606d7884919eabb5c0c9cfc8bbaea195887b6e6263707c8996a3afb3a69a8d807368615e574e454b51545c60686d747c838d929fa2a9ada7a09d999ea1a9aeb4b9b7b2acaaa7aaa39f9d9b9997959892908f8d8b8275685b4f4235281c0f0000000009141f29333f49515b636b70787c808181807d79726c655c554b40342821170b0000000000000000000000000000000000000000000004111d2935414c55616e7b87939fabb5b8ab9f95887c6f62574d42362a1e13080000000000000000000000000000000006111c2630383f44464b5154575e61666c71777d83898f939a9fa6aba39f9a938f8983818e9aa7b4c1b4a89b8e8175685b4e4235281b0f020000000000000000000000000000000000000005111d29343f485056585e5d5c5c5b5b5b5a5a5959595959595959616d7a8794a0adbac4b8ab9e9185786b5e687683909ca9b6b2acaaa5988c7f7265594c3f32313e4b5764717e8a97a4b1bdd0beb1a4988b7e7165584b3e322b2423201c1710080000000000000000000000020f1c2935424f5c6875828f9ba8b5b6b6b6b5b5ab9f95909090909090909090909090909090909090909090909090909090909090909090909090909090909090909197a1adb8b9bbc0bdbbaea195887b6e6255483b2f22150800000000000000000000010d18232d373f464a4c4f4f4e4e4e4d4d4d4c4c4c4b4b4b4b4a4a4a494949484848484848484848484848484848484848484949494a4a4a4b4b4b4c4c4c4d4d4d4d4e4e4e4f4f4746413b32291f14080000000000000000000000000000000000000000000000000000000000000000000000010711192129323a434b545c666d78818e939ea6b0babcb3aaa39992877d706e74808d939ea6a9a29f9590867f776e69615a524c433d332d261d160d06000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c1c28333e4754606d7a86929facb8c5d0c5b9ada1968a7d7064554b4034291c100400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c17232e3a4653606d7985929eabb8bcb1a79b8e8175675c5145382c1f13070000000000000000000000000916232f3c4855616b7073706e6d67676d6e7072716c6155493c302325313e4b5864717e8b979c9b9a99999a9b9b8e8174685b4e4a505356585f626467696a6b6c6b6a696663605b535049413931271d1207000000000000000000000000000000000000000613202c3945515d6773808d99a39992867c6f685e544a3f3b4754606a7784919eaaa49992857b6e665c50473e322f3c4855626f7b8895aab3becabeb1a4988b7e7165584b3e3225180b000000000000000b161f2b3844505c6673808c99a3afbbc7d4c8bbaea195887b6e6263707c8996a3afb3a69a8d8073746e6960585048454a50565e616a6f78808a9297a2a9b1acaaa5abadb2bab2acaba8a09d9a979892908e8c8a8987858482807f7c6f6255483c2f221509000000020e1a26313b45515b636d737d83898c8e8e8d8a857f776d675c51453e33281c1003000000000000000000000000000000000000000000010d19242f3a46535f6975818e99a3aebbb1a79b8e8175695e53463a2f24190b02000000000000000000000000000000000a141e262e34383a4145474d53545b60646b70767c82878f949ea0a8aca49f9c95908e939da9b6c1b4a89b8e8175685b4e4235281b070100000000000000000000000000000000000000010c17222d363f454a4b5150504f4f4e4e4d4d4c4c4c4c4c4c4c54616d7a8794a0adbac4b8ab9e9185786b5665727f8c98a8b1bdb9b0a3978a7d7064574a3d32323d4a5663707d8996a3b0bcc9c0b3a6998d8073665a4d40383831302d28221a110800000000000000000000030f1c2936424f5c6975828f9ca8a9a9a9a9a9a9a8a79f9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ea1a9ababacafb5b0b1afa295887c6f6255493c2f2216090000000000000000000006121e2a353f495157595c5b5b5b5a5a5a5a5959595858585757575656565555555555555555555555555555555555555555555656565757575858585959595a5a5a5b5b5b5c5c54524d443b3025190e02000000000000000000000000000000000000000000000000000000000000000000000000070f1720283139424a545c666d78818f949fa8b2bbbcb4aba39992867d74808c929da5a59e97928b837c726c655e575045413a3128221c140b0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b16202c3945515d6775818e9baab4bfcbc9bdb2a99b8e8175675c5145382c1f1306000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505c6674818e9aacb6c0b8ab9f9285796d6053473a2e23180c0000000000000000000000000a1724303d4a5763707d7f7d7a7979797a7b7d7f7e7164574a3e312424313e4a5764717d8a97a4a8a7a6a6a7a79a8d8174675a51545b6063676a6e71737677787878777673706c65605b534b43392f24180c060000000000000000000000000000000000000714212d3a4754606d7a85929f9f93877e706a5f564c4238424d57626f7c8996a0a59f93877d70695e544a3f352c2d3a4754606d7a8798a2aebac5c0b3a6998d8073665a4d4033271a080000000000000003101c28343f4a54616e7b87929facb9c5cfc8bbaea195887b6e6263707c8996a3afb3a69a8d807c817b6f6a615a524540444c52585f666d737e859297a2adb8b7b2b8b9bdb2a8a19e9796918d8b888683817f7e7c7a79777574726f6a5f53473b2e21150800000005121e2a36424d57626d737f889095999b9b9a97928b81796d60594f44392d1f14090000000000000000000000000000000000000000000008131e2a36424d57616e7b86929faab4b9ac9f92867b6e61564c4135291d140a00000000000000000000000000000000020c141c23282b2f35393b42464a50535960636b6f757c828a91969fa2aaaca79f9d9a9da5afbac1b4a89b8e8175685b4e42352818120b030000000000000000000000000000000000000006111b242d343a3d3e444343424242414140403f3f3f3f3f4754616d7a8794a0adbac4b8ab9e9185786b5e626e7b8895a0acb8bbaea295887b6f6255483f3f3f3f4955626f7c8895a2afbbd0c1b4a79b8e8174685b4e4444453d3c39332c231a100500000000000000000003101c2936434f5c6976828f9c9d9c9c9c9c9c9c9c9c9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9ea5a9a9a9a9a9a9a9a9a9a7a09d9b9b9b9b9b9b9b9b9b9b9b9b9c9c9d9d9e9e9f9fa4aba3a5a6a396897c706356493d3023160a000000000000000000000916222e3a46515b636669686868676767666666656565646464636363626262626262626262626262626262626262626262626363636364646465656566666667676768686868615e564d41362a1e110500000000000000000000000000000000000000000000000000000000000000000000000000050e161f273038424a545c666d78829096a0a9b3bcbdb4aba3989286818c929ca4a09d938e857f786f6a605b534d453e352f281f17110a0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111d2935414c5563707d8a98a3aebac7cfc4b8ab9f9285796d6053473a2d201408000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a5463707d8a9aa4afbbbaaea2988a7d7064544b4034281c10040000000000000000000003101d293643505c6976838c89878686868687898c8275695c4f42362924313d4a5764707d8a97a3b0b3b2b2b3a69a8d807367555c60666c7074787b7e8082848485858482807c78716c655d554b40352922170c0000000000000000000000000000000000000915222f3c4855626f7c878f93928b7f726c61584e443a3a46535e6975818e9ba69e938c7f726b60564d42382e232c3945525d687885929fabb8b8bab5a89b8e8275685b4f422f24190d01000000000000000b17232e3846525e6975828f9ca9b3bec9c8bbaea195887b6e6263707c8996a3afb7aa9d9184868e857c716c635b514b4341464e545c606c707b85929fabb8c3bfc4c5b9aca196918b8784817e7b79767473716f6e686a696765625f584e43372b1f12060000000714212d3a46535f69727f8b939aa0a7a7a8a9a19e938e81746c6155493b31251a0e02000000000000000000000000000000000000000000010e1a26313b46535f6974808d98a2aebaafa3998d8073685d52453c2f261c110600000000000000000000000000000000020a11171c1f24292c3136383f44464f555960636a6f767d848c92989ea5adaba9a7a9afb7c0c1b4a89b8e8175685b4e423329241d150d050000000000000000000000000000000000000009121b22292e313238373636353534343333323232323a4754616d7a8794a0adbac4b8ab9e9185786b5e5f697784919daab7baada093877a6d60544c4c4c4c4c4c54616e7a8794a9b3becac2b5a99c8f8276695c505151514a49443e352c22170b00000000000000000003101c2936434f5c6976828f909090908f8f8f8f8f8f8f8f8e8e8e8e8e8e8e8e8e8e8e8e8e8e939eaab6b6b6b6b6b6b6aca095908e8e8e8e8e8e8e8e8e8e8e8f8f9090919191929399959798999b96897c706356493d3023160a000000000000000000000c1825313e4a57636d727575757474747373737272727171717070706f6f6f6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6f6f6f707070717171727272727373737474747575756e685e5246392d2014070000000000000000000000000000000000000000000000000000000000000000000000000000050d151e262f38424a545c666d7a849197a1aab4bfbdb4aaa298928d929ca29f959189817a726d665f585049413b3329241e160d060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d19242f3a4753606d7a86929facb9c5d2c6baaea2988a7d7064574a3d3024190d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17232e3a4754606d7a86939facb9beb4aa9b8e8275665c5145382c1f13060000000000000000000003101c2936434f5c6976828f96949892939994968e8275685b4f42352823303d4a5663707d8996a3b0bcbfbfb3a6998c8073665e676d72787c8084888b8d8f90919291918f8c89847e776d675d51453e34281d110000000000000000000000000000000000000815212e3a47535f6a6f7c82868880746d625a50463c333f4a54616e7b86929f9f948e81746d63594f443b30261c2935414c566a7784909daaababaeb3a99d9083766a564c4135291d11040000000000000006111c2a36424d5763707d8a97a1adb9c6c8bbaea195887b6e6263707c8996a3afb8aca09591929791867e736d605c554c443c454f59616c73808c97a2adb5b8b9bec4b7ab9e91847e7b7774716f6d6668666462615e565c5a5855534e463c32261b0f03000003101c28343f4a54616e7b86929fa4acb1b4b4b3ada59e938a7d7064574d42362a1e12050000000000000000000000000000000000000000000009141f2a36424d57616d7a86929fa7b1b5ab9f92857a6d60584e42382d22170d030000000000000000000000000000000000060b1013181d20252a2d33383d44484f54585f626c70797f868e939ea1a8afb4b6bac0c9c1b4a89b8e817568544d453e352f271f170e07000000000000000000000000000000000000000911171d2124252b2a29292828282727262626262e3a4754616d7a8794a0adbac4b8ab9e9185786b5e576773808d9aabb5c0b1a4978a7e71645859595959595959606d798697a2adbac6c3b7aa9d9084776a545d5d5e5e575550473e33281c10040000000000000000000b1825313e4b5864717e8383838383838382828282828282828181818181818181818181818e9ba8b5c1c3c3c3c3b6aa9d9083818181818181818181818282828383848485858687898a8b8d8e8f897c6f6256493c2f231609000000000000000000000c1926333f4c5966727f82828181818080807f7f7f7e7e7e7e7d7d7d7c7c7c7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7c7c7c7d7d7d7e7e7e7f7f7f8080808081818182817b6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000000000000000000030c141d263038424b545d686e7b859298a3aebac1bcb4aaa29f9a9da198928c837d756e68605c544e443f382f292019130c04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000813202c3945515d6776828f9ca9b5c2d1cabeb4aa9a8e817467564c4135291d110400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3945515d677784919daab7c4b8ac9f9285796d6053463a2d20130600000000000000000000030f1c2936424f5c6975828f9caaa39f9fa4ab9b8e8175685b4e42352823303c4956636f7c8996a2afbcc9bfb2a5998c7f7266686d797e84898d9196979a9c9d9e9f9e9d9c9996918b82796d605a5045392d1c1106000000000000000000000000000000000006121f2b37434e58606a6f767a7c786c605b51483e343844505b6673808d99a0969082786d605b51473d32291e19242f434f5c6976828f9c9f9e9fa2aaa39e928578685d5245392c20130600000000000000000e1a25303b4653606d7985929eabb8c4cfbbaea195887b6e6263707c8996a3afb6aa9e938e929798928a80756d675e564c444d57606b717e8a929ca9aaa8abadb2bbb9ac9f93877e716b676462605c5459575654524c4f4d4c4847433c342a20150a00000006121f2b3844505c6674818e99a3aeb6bec1c1beb9afa59d908377695e53463a2d21140700000000000000000000000000000000000000000000030e1a26313b46525e68727f8b959fabb4aea2988d80746a5f544a3f33281f150b0100000000000000000000000000000000000003070d11141a1c22282b33383d43484e535a61676d727b818991969ea5aeb3bcc2cbc1b4a89b8e8175665e575045403931292019100900000000000000000000000000000000000000060c111517181e1d1d1c1c1b1b1a1a191919212e3a4754616d7a8794a0adbac4b8ab9e9185786b5e5763707d8a99a4afbbb6a99c9083766a656565656565656565667885929fabb8c5c5b8ab9e92857866696a6a6b6b64615a5044392d2014080000000000000000000a1724303d4956626c7176767676767676767675757575757575757474747474747474747b8794a1adbac7d0ccbfb2a6998c7f74747474747474747474757576767777787878797b7c7d7e808182827a6d6154473a2e211407000000000000000000020f1c2835424f5b6875828e8e8e8e8d8d8d8d8c8c8c8b8b8b8a8a8a8989898888888888888888888888888888888888888888888989898a8a8a8b8b8b8c8c8c8d8d8d8e8e8e8f887b6e6155483b2e22150800000000000000000000000000000000000000000000000000000000000000000000000000000000020b141e263039424c565f696f7c86929fa5afbac3bcb4aeaca7a19792867f78706b615e56504a423c332d261d170e0801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b5565727f8c98abb5c0cbd0c3b7aa9d908477685d5245392c201307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111d2935414c556874818e9ba7b4c1baaea298897c6f6356493c2e23170b00000000000000000000020f1c2835424f5b6875828e9ba8aeacacafa89b8e8175685b4e423528232f3c4956626f7c8995a2afbcc8beb2a5988b7f72656d7a858b91969a9ea1a8a6a8aaabababaaa9a8a19e948f82766c615649382e23170b0000000000000000000000000000000000030f1b26313c464e586062686e6f6c665b50493f362d394653606c798592989791847a6d665c514940352b20171b2834414e5b6774818e989291929894969897877a6d6054473a2d211407000000000000000009141f2b3844505c6674818d9aa9b2bdc9bbaea195887b6e6263707c8996a3afb5a89b8e8185929f9f928c81796d685e564c545f696f7d87929fa4a69e9c9ea1a9b2bbafa49a92877d706a5f5553504a4c4b4947464142413f3c3b37322a22180e040000000713202d3a4653606d7985929eabb4bfc7d0cfc9c1b8aba095877b6e6154483b2e211508000000000000000000000000000000000000000000000009141f2a36414c56606c78839099a3aeb3aa9f93877c6f665b50443b31271d120700000000000000000000000000000000000000000104090e11171c1f272c32383c434750555c60696e757d848e939fa2aab0b8bfc2b6a99c8f82786e69615a514b433b332b221a1209000000000000000000000000000000000000000105090b0b1110100f0f0f0e0e0d0d0c14212e3a4754616d7a8794a0adbac4b8ab9e9185786b5e54606d7a86939facb9b7ab9f94887c72727272727272727272727784919eaab7c4c6b9ada1978679757676777778706c6155493c3023160a0000000000000000000815212d3945505a6264696a6a696969696969696968686868686868686868686868686e7b8794a1aebac7d4ccbfb2a6998c7f73686868686868686868686869696a6a6b6b666d6e6f7072737476766d685e5246392d201307000000000000000000000d1a2733404d5a6673808d999b9b9a9a9a99999998989897979796969695959595959595959595959595959595959595959595969696969797979898989999999a9a9a9b9b9286796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000000000000000000000000020c151e27303a444d57606a727f8b939ea8b1bcc6bfbab8ab9e92857b726d666059524c443f383027221b140b0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d18242f3c4956626f7c8999a3afbbc7d2c6b9ac9f93867a6d6054473a2d2114070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d19242f3f4b5865727e8b98acb6c0bfb4aa998c7f7266544a3f34281c1003000000000000000000020e1b2835414e5b6874818e9ba7b4b9b9b4a79b8e8174685b4e413528222f3c4855626f7b8895a2aebbc8beb1a4988b7e71656d7a86939d9e9c9a99999a9c9fa4acb3b7b5b2aca69e948b7e7164544a3f34281c100300000000000000000000000000000000000a15202a343d464e54565e6162605b544a3f372d2b3844505b66717e868c8e857c6e685e544b40372e231a0e1824313e4b5764717e87868585858687898c8e86796d6053463a2d201307000000000000000003101c28343f4a5463707c8996a1adb9c5bbaea195887b6e6263707c8996a3afb3a69a8d807e8a939e9c938e837a6d685e565c666e7b859299a3a29f948f9197a1abb5b6aca39992857c6f675d51453f403e3c3b39363034322f2e2b2620181006000000000815212e3b4854616e7b8797a1adbdc6d1d9dad4c8bcb1a7978a7d7064574a3d3124170a0000000000000000000000000000000000000000000000030d1925303a44505b666f7c86929fa6b0afa4999083786c60574d43392f241811080000000000000000000000000000000000000000000000060b0f161c21272c32373e434b51575e616b707a818b92989fa6aebabfb7ab9f948f837b716c605d554d453d342c241b13060000000000000000000000000000000000000003060709080707060400000404040714212e3a4754616d7a8794a0adbac4b8ab9e9185786b5e525d687783909daab6bcb0a69c8f827f7f7f7f7f7f7f7f7f7f7f7f84919eabb7c4c9beb3a99b8f828283838484847d7064574a3d3124170a00000000000000000005111d29343e485056585d5d5d5d5d5c5c5c5c5c5c5c5c5b5b5b5b5b5b5b5b5b5b5b616e7b8794a1aebac7d4ccbfb2a6998c7f73665b5b5b5b5b5b5b5b5b5c5c5d5d5e5e545c606162646566686969615e564c41362a1d1105000000000000000000000c1926323f4c5965727f8c98a5a7a7a7a6a6a6a5a5a5a4a4a4a3a3a3a2a2a2a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a2a2a2a3a3a3a4a4a4a5a5a5a5a6a6a6a7a7a79e918578665c5144382c1f1206000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c151e28323b454e58626d75818e95a0aab4bfcac6b9ada1978b7f726a5f554f46413b342e261e17110a020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a86929facb9c5d2c8bbafa49a8a7d7063574a3d3024170a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000816222f3c4955626f7c889aa4afbbc2b5a99c8f8276665c5044382b1f1206000000000000000000010e1b2834414e5b6774818e9aa7b4c1c1b4a79b8e8174685b4e413528222f3b4855626e7b8895a1aebbc8bdb1a4978a7e71646877839097928f8d8c8c8d8f939aa1a9b3bebdb9b0a69c908376665c5044382b1f12060000000000000000000000000000000000030e18222b343d43474c52545553504a42382d2528333f4a54626c717a7f817c6f6a5f564c42392e251c110a1723303d4955616c717a7a787878797b7d7f817f72675c5145382c1f13060000000000000000000b17232e394653606c7884919eabb8c4bbaea195887b6e6263707c8996a3afb3a69a8d8074818e96a19e9590837a6d685e606d79839097a1a198928b82859199a3afbbb4aba29791847a6d605a50453c312f2e2d2a25272522211f1b150e0600000000000916232f3c4956626f7c8995a9b3becad6e2e4d9cdbeb1a4988b7e7165584b3e3225180b00000000000000000000000000000000000000000000000008131e28333f4a545f6a727f8c949ea8b2ab9f958b7e72695e554b403529231a1209000000000000000000000000000000000000000000000000030b10161b20262b303940454d525960686d757e8590949ca4aeb4bcb0a69f9590857e746d675e574e463e362d2517110a02000000000000000000000000000000060c1012131615141312100c071111101014212e3a4754616d7a8794a0adbac4b8ab9e9185786b5e4c566773808d9aa6b3c0b7ab9f948f8c8c8c8c8c8c8c8c8c8c8c8c9196a1adb9b9babab6aa9e938f8f8f9090918a7d7063574a3d3024170a000000000000000000000c17222d363e45494b505050505050504f4f4f4f4f4f4f4f4e4e4e4e4e4e4e4e54616e7b8794a1aebac7d4ccbfb2a6998c7f7366594e4e4e4e4e4e4e4f4f4f505051514a5053545657585a5b5c5d54524c443a3025190d01000000000000000000000d1a2633404d596673808c99a2a2a1a1a1a0aaa39f9f9e9e9d9d9c9c9c9b9b9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9b9b9b9c9c9c9d9d9e9e9e9f9fa4a1a1a2a29f9386796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c16202a333d46515b606d79839198a3aebac2cabeb3a99f92867c6f675d51453e3328231c140c0600000000000000000000000000000000000000000000000000000000020608080a0a0a09090908080807070707060300000505040404040406131f2c3845515d677784909daab7c3d0ccc0b6ac998c807366594d4033261a070004050500000306060707070808080909090a0a0a0908060300000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7986939facb9c5b8ab9f9285796d6053463a2d201307000000000000000000010e1a2734414d5a6774808d9aa7b3c0c1b4a79a8e8174675b4e413428212e3b4854616e7b8794a1aebac7bdb0a3978a7d706465727f8a888582817f7f8082889297a1adb9c6c2b9ac9f9286796d6053463a2d201307000000000000000000000000000000000000061019222b32383b4146474946443f382f261c222d3842505a62686d72746f6a60574e443a30271d130a0814212d3945505a61686d6d676b666d6e707274726d62554b4034281c100400000000000000000006121f2b3844505b6674808d9aa9b3bebbaea195887b6e6263707c8996a3afb3a69a8d80737984919ea69f9590837a6d676a73808c95a0a09691867e757d87929fa6b0bcb3a9a0968e81756c62574d42372b21201e191a191515120f0a040000000000000815222e3b4855616e7b8898a2aebac7d2dbdcd5c9bdb2a8978a7d7164574a3e3124170b000000000000000000000000000000000000000000000000020b17222d38424e58606c77828f96a1aab1a79f92857b6e675d51453f352c241b120a01000000000000000000000000000000000000000000000000040a0f151b1e272e343b42464f565d606c717b828d929fa3aab3b8b0a79f97928a81796e69605850483f3727221b140b02000000000000000000000000030a11171c1f20232221201f1c181e1e1d1d1d1d212e3a4754616d7a8794a0adbac4b8ab9e9185786b5e525764707d8a97a9b2bdbbb0a69f9c9898989898989898989898989ea1a8b2acadadadaeafa59e9b9c9c9d9d94877b6e6154483b2e2115080000000000000000000006111b242d34393d3e434343434343434343424242424242424241414141414855616e7b8894a1aebbc7d4ccbfb3a6998c807366594d414141414141424243434444453f444648494a4b4d4e4f504746413a32281e130800000000000000000000020e1b2835414e5b6874818e969695959494939398929291919190908f8f8e8e8e8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8e8e8e8f8f8f909090919192929399949495969699887b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040e18212b343f45515d676f7c86929fa6b0bcc6c5baaea3989183796d605a50453c2f261b110600000000000000000000000000000000000000000000000000000003090e1214151717161616151515151414141312100b061211111110101010101d2935404b556874818e9ba7b4c1ced2c1b4a89b8e8175685b4e422f24180d11111112120b0f12131414141415151516161617171615130f0a0400000000000000000000000000000000000000000000000000000000000006131f2c3845515c677885919eabb8c4baaea298887b6e6255483b2f221508000000000000000000000d1a2733404d5a6673808d99a6b3c0c1b4a79a8e8174675b4e413428212e3a4754616d7a8794a0adbac7bcb0a396897d7063606c787e7b797574737274757c85929eabb8c5c7bbafa399877a6e6154473b2e2114080000000000000000000000000000000000000007101920272b3036393b3c3938332d261d141c262f3f4850565e6165686260584e453c32281e150b0105111d28343e4850565d60605d555c606163656865625b5143392e23180c00000000000000000000030f1c28333f4a54636f7c8997a1adb9bbaea195887b6e6263707c8996a3afb3a69a8d8073707d8a949ea7a0959083796d6f7c87929fa09590847c726d727f8c949faab4bcb2a89e938b7e71695f53473e31271d120d080c0908060300000000000000000713202d3a4653606d7985929facb6c0cad0d1cbc3b9aca096887b6f6255483c2f2215090000000000000000000000000000000000000000000000000006111c262f3c44505b656d7a849198a2aaada2979083796d605b51473e362d241c130a0100000000000000000000000000000000000000000000000000040a0c151d232830363d444c525a61696e78808a9298a1a9b1b9b1a9a29f938e837b6f6a615a514940332d261d140a0000000000000000000000030c151c23282c2d2f2e2e2d2c28232b2a2a2a2a2a292e3a4754616d7a8794a0adbac4b8ab9e9185786b5e5254616d7a8796a1adb9c2b8b0aba9a5a5a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a1a1a1a2a2a3a3a4a5a094877a6d6154473a2e211407000000000000000000000009121b22292d30313637373636363636363636353535353535353535353b4855616e7b8894a1aebbc7d4ccbfb3a6998c807366594d4035353535353535363637372e34383a3b3c3d3f404143433a3936302820160c020000000000000000000005111e2b3844515e6b77848a8989888888878786868585858484838383828281818181818181818181818181818181818181818181828283838384848585858686878888898a8a8a7d7164574a3e3124170b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f19222935404b555f6a727f8c949faab4bfcabfb4aaa0958e81746c61574d41382d22170b0200000000000000000000000000000000000000000000000000060e151a1e2122242323232322222221212120201f1c171f1e1e1e1e1d1d1d1d1d18242f404c5966737f8c99a6b2bfccd0c3b6a99d9083766a554b4035291d1d1e1e1e1e1f171c1f2020212121212222222323232423221f1b160f07000000000000000000000000000000000000000000000000000000000004101c2834404b556a7683909da9b6c3beb4aa968a7d7063574a3d3024170a000000000000000000000d192633404c5966737f8c99a6b2bfc1b4a79a8e8174675b4e413428212d3a4754606d7a8793a0adbac6bcafa296897c6f635b666c716f6c65676666676a737f8c99a6b2bfcbc0b5ab94877b6e6154483b2e2115080000000000000000000000000000000000000000070f161b1e252a2d2e2f2d2b28221c140b141d2d363f444c5254595b56544e463d332a20160c0300000c17222c363e444c525453514b50535456595b585651493f30271d120700000000000000000000000b17222d394653606c7985929eabb8bbaea195887b6e6263707d8996a3b0b3a69a8d80736c75828f98a2a7a0958f827876828f99a09590837b6e6a606c77828f98a3aebabaafa59f92867b6e625a5043392f24180c080705020000000000000000000006131f2c3845515c6775828e9aa4afbabec3c4c0bbb0a69e9184776a5f53473a2e21150800000000000000000000000000000000000000000000000000000a141d27333f49535e686f7c869298a3aba9a0958e81756d635a50483f362e251c130a000000000000000000000000000000000000000000000000000000030b12181f252a323a414550575f666d737e869297a0a7b0b8b3ada59d9590857c716c625b52443f382f261b1106000000000000000000000a151e262e34383a3c3b3a3a38342e37373737363636363a4754616d7a8794a0adbac4b8ab9e9185786b5e52525e687885919eabb8c4c2bbb3a9a29f93939393939393939393939393939393939494959596969797989995887b6e6255483b2f2215080000000000000000000000000911171d2124252a2a2a2a2a2929292929292929282828282828282f3b4855626e7b8895a1aebbc8d4ccc0b3a6998d8073665a4d4033282828282829292a2a2b23282c2d2e2f3132333536362e2d2a251e160e050000000000000000000000000a1724303d4a5763707d7d7d7c7c7b7b7a7a7a79797878777777767675757574747474747474747474747474747474747474747575757676777777787879797a7a7b7c7c7d7e7e7a6e6154473b2e21140800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000071018242f3a434e58606c78839098a2aebac3c6bcb1a89d938a7e71695f53493f33271e1308000000000000000000000000000000000000000000000000060f181f262b2e2f313030302f2f2f2e2e2e2d2d2d2b28232c2b2b2b2a2a2a2a2a2a2a2a313e4b5764717e8a97a4b1bdcad1c4b8ab9e918578675d5145392c2a2a2a2b2b2b2c22282b2d2d2d2e2e2e2f2f2f2f3030302f2e2b272019100700000000000000000000000000000000000000000000000000000000000c18232e424f5b6875828e9ba8b5c1bfb2a5988c7f7265594c3f3226190c000000000000000000000c1926333f4c5966727f8c99a5b2bfc0b4a79a8d8174675a4e413427202d3a4753606d7a8693a0adb9c6bcafa295897c6f62545b606462605b53595958626f7c8895a2afbbd1baada094877a6d6154473a2e211407000000000000000000000000000000000000000000040a0f14191e202122201f1c17110a020b1b242d323a4146474c4e4948433d342b21180e0400000006101a242c323a4145474745404446484a4c4e4b4a453f372d1e150b00000000000000000000000006121f2b3844505b6675818e9babb5c0aea195887b6e6263707d8996a3b0b3a69a8d8073676e7b86929faaa79e948d807d89949e9690837a6e695f5b656e7b86929fa8b2bdbaaea2988f82766c61554b4035291e1d1414110e0902000000000000000004101c2834404b55626f7c87939fa5adb3b6b7b5afa79f948b7e7265584e43372b1f12060000000000000000000000000000000000000000000000000000020b17222d38414c565f6a707d869299a4afa79e938c7f726c615a51483f372e251c120700000000000000000000000000000000000000000000000000000000070c141a202830353e454d545c606c717d8590959fa6b0b8baafa79f9791867e726d635c504941382d22171309000000000000000006111c2630383f4446494847464440444444444343434343434754616d7a8794a0adbac4b8ab9e9185786b5e524c566975828f9ca8b5c2c6baada2979286868686868686868686868686868686878788888889898a8b8b8c8d8a7d7063574a3d3024170a00000000000000000000000000060c111517181d1d1d1d1d1d1d1c1c1c1c1c1c1c1c1b1b1b1b222f3c4855626f7b8895a2aebbc8d5cdc0b3a69a8d8073675a4d4034271b1b1b1c1c1c1d1d1e171c1f20212324252728292a21201d19130c05000000000000000000000000000916232f3c4855616b7070706f6f6e6e6e6d6d6c656c6b6b6a6a6969696868676767676767676767676767676767676767676868686969696a6a6b6b6b656c6d6e6e6f6f7071716e685e5246392d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007131d28313c44505b666e7b86929fa7b1bcc8c3baafa59f92867b6e655b50443a3024190b0200000000000000000000000000000000000000000000030e18212a31373a3b3d3d3d3c3c3c3b3b3b3a3a3a3a38342e383838373737373737373737373c4956626f7c8995a2afbcd0d2c6b9ada197867a6d6053473a37373737373838382d3338393a3a3a3b3b3b3c3c3c3d3d3d3c3b38322b22190f0400000000000000000000000000000000000000000000000000000000071a2734404d5a6773808d9aa6b3c0c0b4a79a8d8174675a4e4134271b0e010000000000000000000c1925323f4c5865727f8b98a5b2bec0b4a79a8d8174675a4e413427202d3a4653606d798693a0acb9c6bcafa295897c6f6256505357555350494c4c54616e7b8794a1aebac6baada093877a6d6054473a2d211407000000000000000000000000000000000000000000000002080d1114141613120f0b06000009121b20293036393a3f413c3b38322b22190f06000000000008121a20283035393a3a3935383a3b3d3f413f3d3a342d241b0c03000000000000000000000000030f1c28333f4a5464717e8a99a4afbbafa295897c6f6263707d8a96a3b0b3a79a8d8074676973808d98a2aea69d928d85929e9891847b6e685e56535f69737f8c96a1acb9bfb4aa9f948a7e71675d51453a30252a21201e19140d0500000000000000000c18232e394754606a74808d939fa2a9aaaaaba39f959082786d6053463c31261a0f0300000000000000000000000000000000000000000000000000000006111b262f3a444e58606b707e87939fa3afa59f93877e716c625b51493f372e23180d020000000000000000000000000000000000000000000000000000000002090e161e2429333b424a505a616b6f7b838f949fa6b0b8b9b1a9a19892887f736e605b53493f3327251b1007000000000000000c17232e38424a505356555453514a51515150505050504f4f4f54616d7a8794a0adbac4b8ab9e9185786b5e524d596673808c99a6b3bfc5b8ab9f92857979797979797979797979797979797a7a7a7b7b7c7c7d7d7e7f8080817c6f6256493c2f23160900000000000000000000000000000005080a0b1010101010101010100f0f0f0f0f0f0f0f0e16232f3c4956626f7c8995a2afbcc8d5cdc1b4a79a8e8174675b4e4134281b0e0e0f0f101011060c101213151617181a1b1c1d1413110d080200000000000000000000000000000714202c38444f596163646363626261616060605b5f5e5e5e5d5d5c5c5b5b5b5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5b5b5b5c5c5c5d5d5d5e5e5f5b606061616263636465615e564c41362a1e11050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f28333f4a545f69727f8c95a0acb8c1ccc0baaea2989083776c60564c4135291d140a0000000000000000000000000000000000000000000009151f2a333c4247484a4a4949494848484847474746443f4545454444444343434343434343434754616e7a8794aab4bfcad5c9beb3a994887b6e615548434343434444444545453f4446474747474848484949494a4a4947433d342b20160a000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2bec2b5a99c8f8276695c4f4336291c10030000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d413427202d3a4653606d798693a0acb9c6bcafa295897c6f625649464a4846443f404754606d7a8793a0adbac6b9ada093867a6d6053473a2d2014070000000000000000000000000000000000000000000000000001050708090606030000000000090e171e252a2d2e32352f2e2c272119100700000000000000080e161e24292c2d2d2c292b2d2e30323532312e29231b120900000000000000000000000000000b17222d3a4754616d7a86939facb9b4a79a8e81746864707d8a97a3b0b4a79a8d817467616d7a86929faaaea49d9792979f92867c6f695e564d4d57606d7984919ea8b2bdbcb0a69e9184796d60564c413637362e2d2a251f170e050000000000000007121d2b37434e58606d78818c92979b9d9d9c99928e837a6d665c5044382a20150a00000000000000000000000000000000000000000000000000000000000a141d28323c464f59616c727f8b919fa3aba49992877e726d635b51493f352a1e1206000000000000000000000000000000000000000000000000000000000000040c1319212930383f44505960696e79828f949fa6b0b8bbb2aaa39a938c80746c655b504440372d22190e05000000000003101c28343f4a545c60626161605c545e5e5d5d5d5d5d5c5c5c5c5c616d7a8794a0adbac4b8ab9e9185786b5e524a5764717d8a97aab4bfc6baada297897c6f6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6e6e6e6f6f707071727374746f6a6054473b2e2215080000000000000000000000000000000000000003040403030303030303030202020202020a1723303d4a5663707d8996a3b0bcc9dbcec1b4a89b8e8175685b4e4235281b0f020202030304000003060708090a0c0d0e1010070705010000000000000000000000000000000004101c28333e474f55575756565555555454535350495251515050504f4f4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4f4f505050515152495053535455555657575854524c443b3025190d01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d17222d38424d57606d7883919da5afbdc6cabeb4aa9f958b7e71685d52453c2f261b11060000000000000000000000000000000000000000020e1a26313c454d535557565656565555555454545353504a5252515151515050505050505050505053606d798698a2aebac6d3cfbbafa295887c6f625550505050505151515152524a505353545454545555555656565756544e463d32271b0f030000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1bec3b7aa9d9084776a5d5144372a1e06000000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d413427202d3a4653606d798693a0acb9c6bcafa295897c6f6256493c3e3c3937333a4753606d7a8693a0adb9c6b9aca09386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000000000000000000050c13191d2021262823221f1b160f07000000000000000000040c13191d202120201d1f20212326282524221d1811090000000000000000000000000000000613202d3946525e687683909da9b6b8ac9f92867a6d64717d8a97a4b0b4a79a8e8174675e6873808d98a2aeaea9a19e9f948b7f726a5f574d4445515c66717e8b96a0acb9c2b9aca1968c8073685e52464343433b3a36302920170d02000000000000000f1b27323d44505c666d777f858b8f90918f8c8781796d685e544a3f3428180e030000000000000000000000000000000000000000000000000000000000020b16202a343d47505a626d737f8b9299a2aaa39992877f726d635b51463a2f22160a0000000000000000000000000000000000000000000000000000000000000002080f171e262e343e474f575f676d79828f949fa6b0b8bcb4aca49f928c80776c605b52493f342b20170c020000000006121f2c3844505c666d6f6e6d6d666b6b6a6a6a6a69696969696969696d7a8794a0adbac4b8ab9e9185786b5e524855616e7b8898a3aebac7beb3a99a8d80736760606060606060606060606060606161626263636464656667686260584e43382b1f13060000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdcacfc9c2b5a89c8f8275695c4f4236291c0f030000000000000000000000000000000203030000000000000000000000000000000000000000000b16212c353e44484a4a4a4949484847474746443f45444444434342424241414141414141414141414141414141414141414242424343444444453f444647474849494a4b4b4746413b32291e1408000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c262f3c44515c66707d89939eabb4bfcbc5bcb1a79e92857a6d60584e41382d22170b000000000000000000000000000000000000000006121e2b37424d575f62646363636262626161616060605c5f5f5f5e5e5e5d5d5d5d5d5d5d5d5d5d5d5d5c667985929facb8c5d2c9bcafa296897c6f635d5d5d5d5d5d5d5e5e5e5f5f5f5b606060616161626262626363636260584e43382b1f13060000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0bdc4b7aa9e9184776b5e51442e23170b000000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d413427202d3a4653606d798693a0acb9c6bcafa295897c6f6256493c312f2d2b2d3a4753606d7a8693a0adb9c7bbafa39986796c605346392d2013060000000000000000000000000000000000000000000000000000000000000000000000000000000002080d111314191b1615130f0a04000000000000000000000002080d11131414131012131517191b181815110c060000000000000000000000000000000005111d2a36414c566673808c99abb5baaea2988c7f7266717e8a97a4b1b4a89b8e81756856606d7a86929facb8b3ada99c8f82786c60584e4d4d4d4b54606d7884919ea9b3bebdb2a89f92867a6d61564c5050504746423b32291f1409000000000000000a152028343f4a545c656c727a7e828384827f7b746d675e564c42382e23170600000000000000000000000000000000000000000000000000000000000000040e18222b353e48515b636d737f879298a1a9a399938b7f726d63574b3e3225180c000000000000000000000000000000000000000000000000000000000000000000060c141c2328343d454d555d676d79828f949fa6b0b9beb6afa49c928d80746d635b51463d32291e140a000000000713202d3a4653606d787c7b7a79797877777777767676767676767676767a8794a0adbac5b8ab9e9285786b5f524653606c7986929facb9c5c4b7aa9e9184776a5f53535353535353535353535354545555555656575858595a5b56544e463d32271b0f030000000000000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1babebbbdbfb6a99c8f8376695c504336291d100300000000000000000000000000000000000000000000000000000000000000000000000000000005101a232c33383c3d3d3d3c3c3b3b3b3a3a3937332d3837373636363535343434343434343434343434343434343434343535353636363737382d3337393a3b3b3c3c3d3e3e3b3936302920170d020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d2834404a54606b75828f99a3aebac6cec2b9ada1978d80746a5f53493f33271c1106000000000000000000000000000000000000000814212e3a47535f696e7070706f6f6f6e6e6e6d6d6d6d666c6c6b6b6b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6b7884919eabb7c4d1c9bcb0a396897d706a6a6a6a6a6a6a6a6a6b6b6b6c6c666c6d6d6d6e6e6e6f6f6f7070706f6a6054473b2e2215080000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdc5b8ab9e9285786b5f4a3f34281c10030000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d413427252d3a4653606d798693a0acb9c6bcafa295897c6f6256493c2f2525252d3a4753606d7a8693a0adb9c5b9ac9f928679655b5044372b1f1205000000000000000000000000000000000000000000000000000000000000000000000000000000000000010507070c0e09090703000000000000000000000000000000010407070706040607080a0c0e0c0b0905010000000000000000000000000000000000010d1925303d495663707d8999a3afbbb4aa9e9184786c717e8b97a4b1b5a89b8e8275685b5d6874818e9aa6b0bbb1a4978b7e71675d5a5a5a5a5a5a5a5c66717e8b97a2adbac4baaea2988d8073685d5c5c5d5d54524d443b3025190e02000000000000040b17232e38424a535b60686d7275777776736e69605d554c443a30261c11060000000000000000000000000000000000000000000000000000000000000000061019232c363f48515b636d727d8691979fa6a49f918c7f7266594c3f3326190c00000000000000000000000000000000000000000000000000000000000000000000020a1117222b333b434c555c676d79828f949fa7b1bbc0bbaea49d928c80736d62584e443a30261c11060000000916222f3c4955626f7c888887868585848484838383838382828282828282909ca9b6c3c4b8ab9f9285786c5f5244505b667784919daab7c4c5b9aca096887b6e625548464646464646464646474747484849494a4a4b4c4d4d4e4947433d342b20160a000000000000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4abadb3aeb0b2b4aa9d9083776a5d5044372a1d11040000000000000000000000000000000000000000000000000000000000000000000000000000000008111a21282c2f303130302f2f2e2e2d2d2d2b27222b2b2a2a292928282827272727272727272727272727272727272828282929292a2a2a2b22272b2d2d2e2e2f303031322e2d2a251e170e0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b18232e39424f59616e7b86929faab4bfcbc9beb3a99f92877c6f655b5044382e23170c000000000000000000000000000000000000000815222f3b4855626e7b7d7d7c7c7c7b7b7b7b7a7a7a797979787878777777767676767676767676767676767783909daab7c3d0cabdb0a3978a7e76767676767676767777777878787979797a7a7a7a7b7b7b7c7c7c7d7d7c6f6256493c2f2316090000000000000000000000000000000000000000000000000000000a1723303d4a5663707d8996a3b0bcc5b8ac9f928579665c5044382b1f12060000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d41343232323a4653606d798693a0acb9c6bcafa295897c6f6256493c32323232323a4753606d7a8693a0adb9c5b8ac9f9285796c5f493f33271b0f03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814202d3a4753606d7a86929facb9b9aca0968a7d70717e8b97a4b1b5a89b8f8275685c56626f7c88949fabb7b7ab9e9184796d676767676767676767676d7985929fabb8c5bfb4aa9f92857a6d6869696a69615e564d42362a1e11050000000000000006111c263038414950565e6165686a6a6966625f57514b433a32291e150a0000000000000000000000000000000000000000000000000000000000000000000007111a242d364049515b626b707c858f949fa2a2988d8174675a4e4134271b0e0000000000000000000000000000000000000000000000000000000000000000000000000610192129313a434b555c676d79828f95a0a9b3bcbfb6aea49c928b7f726a60564c42382e23170b0100000815222e3b4855616e7b889494989291919190909090908f8f8f8f8f8f8f90949fabb5b6b7b8ab9f9285786c5f523f4a546975828f9ca8b5c2c9bdb2a8998c7f7266564c413a3a3a3a3a3a3a3a3a3a3b3b3b3c3c3d3d3e3f4041413c3b38322b22190f04000000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b989d9fa2a9a2a3a5a7a99d9184776a5e5144372b1e110400000000000000000000000000000000000000000000000000000000000000000000000000000000000810161c202324242323222222212120201f1b171e1e1d1d1d1c1c1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1c1c1d1d1d1e1e171b1f20202122222324242521201e19140d0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121c27303d46535f6974818d98a3aebac6cfc5bbafa3999083786c60544a3f34281c1106000000000000000000000000000000000000101c2936434f5c6976828a8989898988888887878786868685858584848484838383838383838383838383838386929facb8c5d2d1c4b7aa9e9184838383838383838384848484858585868686878787878888888989898a84786b5e5145382b1e12000000000000000000000000000000000000000000000000000000091623303c4956636f7c8996a2afbcc7baaea29886796d6053463a2d2013070000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d413f3f3f3f3f4653606d798693a0acb9c6bcafa295897c6f6256493f3f3f3f3f3f3f4753606d7a8693a0adb9c5b8ab9f9285786c5f52452d22170b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3945515d677683909da9b6bdb2a89c8f8276717e8b98a4b1b5a89c8f8275695c535f6a7683909cacb6b9aca1968c8073737373737373737373737373808d9aa6b3c0c6baaea2988c7f7575757676766e695e52463a2d20140700000000000000000a141e262f383f444c5254585c5d5e5c5955534d45403a312920170c03000000000000000000000000000000000000000000000000000000000000000000000008121b242e3740495159616a6f7b828b92989992867b6e6255483b2f22150800000000000000000000000000000000000000000000000000000000000000000000000000070f171f283139434b555c676d79839097a1aab4bfc0b6ada49f92877c6f685e544a3f34281e130800000714212e3a4754616d7a8794aaa29f9e9e9d9d9d9d9c9c9c9c9c9c9c9c9c9c9fa6a8a8a9abacac9f9285796c5f52464e5a6774818d9aa7b4c0cec3b6a99d908376685e5246392d2d2d2d2d2d2d2d2d2e2e2f2f30303131323334352f2e2b272019100700000000000000000000000000000000000000000000000000000000000000000000000000000c1926323f4c5965727f8c90919297949596989a9c9e9185786b5e5245382b1f1205000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b1014161717171616151514141413120f0b06111110100f0f0f0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0f0f0f10101111060b0f121314141516161718181414110d080200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e2a36424d57616e7b86929faab4bfcbcbc0b5ab9f948b7e71665c5044382d22170b0000000000000000000000000000000000000e1b2734414e5a6774808d969696959595949494939399929292929191919090909090909090909090909090909298a2aebac6d3d2c5b9aca09691909090909090909090919191929292929993939494949595959596968f8275695c4f4236291c0f0000000000000000000000000000000000000000000000000000000916232f3c4956626f7c8995a2afbcc7bbafa39986796d6053463a2d2013070000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a4d4c4c4c4c4c4c4c53606d798693a0acb9c6bcafa295897c6f62564c4c4c4c4c4c4c4c4c53606d7a8693a0adb9c5b8ab9f9285786c5f5245392c1f12000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b556773808d9aa6b3c0b9ac9f93877b727e8b98a5b1b2a99c8f8276695c4e5865727e8b9aa4afbbb2a89f928780808080808080808080808080818e9ba8b4bfc0beb3aa9f92858182828383827b6e6154473b2e2114080000000000000000020c141d262d333a4146474b4f50514f4c4847423c352f281f170e050000000000000000000000000000000000000000000000000000000000000000000000000009121c252e373f474f585f696e767e868d8f867e71695f53473a2e2114080000000000000000000000000000000000000000000000000000000000000000000000000000060d161f273139434b555d676e7b859198a3aebac0bfbbaea39991847a6d665c50443a2f24190d01000714212e3a4754616d7a87949d9d9c9b9b9b9a9a9a9a9a9a9a9a9a9a9a9a9a9a9b9b9c9d9e9fa39f9285796c5f52464c5965727f8c98a5b2bfcbc6b9ac9f93877a6d6154473a2e212020202020202121222222232324252526272823221f1b160f070000000000000000000000000000000000000000000000000000000000000000000000000000000915222f3c4855626f7c828384858687888a8c8e90929285786c5f5245392c1f120600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000407090a0a0a09090808080707060503000004040303030202010101010101010101010101010101010101010202020303030404000003050607080809090a0b0b0807050100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c1a26313b46525e6974808d98a3aebac7d1c7bdb0a69e9184786d60544a3f33281c0f0300000000000000000000000000000000000c1926333f4c5966727f8c99a3a2a2a2a1a1a1a0a0a0a39f9f9f9e9e9e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9fa2aab4bfcad6d4c8bdb2a8a09e9d9d9d9d9d9d9d9d9d9d9e9e9e9f9f9fa3a0a0a0a1a1a1a2a2a2a39a8d8074675a4e4134271b0e0000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afbcc5b9ac9f928679675c5145382c1f13060000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d8074675a585858585858585858606d798693a0acb9c6bcafa295897c6f625858585858585858585858606d7a8693a0adb9c5b8ab9f9285786c5f5245392c1f120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18242f3d4a5763707d8a96a8b2bdbbafa49a8c7f737f8b98a3a4a6a89c8f8376695c5054616e7b87939facb9baaea399928d8d8d8d8d8d8d8d8d8d8d8d8d8e939eaab2b3b3b3b3ada297928e8f8f8f90877a6e6154473b2e211408000000000000000000020b141b22273035393a3f42444443403b3a373129241d160d050000000000000000000000000000000000000000000000000000000000000000000000000000000a131c252d353e464e575e616d727b80827d716c61574d42372b1e1206000000000000000000000000000000000000000000000000000000000000000000000000000000040d151f273139434b555e696f7c86929fa4aebac4bfb5aba1968f82786d60564c4135291d1104000815222f3b4855626e7b889191908f8e8e8e8e8e8d8d8d8d8d8d8d8d8d8d8d8e8e8e8f90919299959286796c5f53464a5764707d8a97a3b0bdcac8bbafa49a8a7e7164574b3e31261a1313131314141415151616171718191a1a1b1615130f0a04000000000000000000000000000000000000000000000000000000000000000000000000000000000815212e3a47535f6a6f76777778797a7b7d7f8183858783776a5d5144372a1e11040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141f2a36424d57616e7a86929facb9c3cecfc2b9aca0968b7e71665b5044382b1f160b00000000000000000000000000000000000c1926333f4c5966727f8c99a5a8a8a7a7a6a6a5a5a5a4a4a3a3a2a2a2a1a1a0a0a0a0a0a0a0a0a0a0a0a0a0a0a8aab0b8c1ccd7d4c9beb5aca7a4a0a0a0a0a0a0a0a0a0a1a1a1a2a2a2a3a3a3a4a4a5a5a6a7a7a8a69a8d8073675a4d4034271a0d0000000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a96a3b0bdc5b8ab9f9285786c554b4034281c10040000000000000000000c1825323f4b5865727e8b98a5b1bec0b3a79a8d80746765656565656565656565656d798693a0acb9c6bcafa295897c6f656565656565656565656565656d7a8693a0adb9c5b8ab9f9285786c5f52452d22170b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a8796a1adb9c0b6ac9e9184777f8c969698999b9c908376695d50525e697683909da9b6bfb4aba39f9a9a9a9a9a9a9a9a9a9a9a9a9a9b9ea5a6a6a6a6a6a7a7a9a29f9b9b9c9c918478685e5246392d20140700000000000000000000020a11171e25292d2e3235373736332f2e2b261f18130c0400000000000000000000000000000000000000000000000000000000000000000000000000000000010a121b232c343c454d525b62696e73756f6b615a50453c31261a0e0200000000000000000000000000000000000000000000000000000000000000000000000000000000030d151f273139434d57606a717e8b929da8b2beb8b7b2a89f948c7f73685d5245392c201306000a1623303d495663707d8684848382828181818181818080808080808080808181828283848687888986796c5f52464956626f7c8995a2afbcc3c1c0b6ac9a8e817467574d42362a1e12070707070708080809090a0a0b0c0d0e0e0908060300000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b37434e585f62696a6a666d6e6f70727476787a7a6d6054473a2d2114070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030e1a25303b46525e6875818e9ba7b1bcc8d4c9bdb2a89d9184786c6053463e33281c1003000000000000000000000000000000000d1a2734404d5a6773808d9a9c9b9b9a9a9a9999989897979796969595949494939393939393939393939393939c9ea6b0bbc7d3cfc3b7aca39b9893939393939393939494949595959696969797979898999a9a9b9c9b8e8175685b4e4235281b0f0000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0bdc4b7ab9e9184786b5e51452e23180c000000000000000000000c1925323f4c5865727f8b98a5b2bec0b3a79a8d807472727272727272727272727272798693a0acb9c6bcafa295897c727272727272727272727272727272798693a0adb9c5b8ab9f9285786c5f4a3f33281c0f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3946525e687884919eabb8c4b9aca196897d7e88898a8b8c8f919083776a5d504d5666727f8c99a8b2bdbdb4aeaca8a09e99999999999999999999999999999999999a9a9a9a9b9b9c9d9d9e918478695e52463a2d201407000000000000000000000000060b13191d202125292a2b292622211e1a150d07010000000000000000000000000000000000000000000000000000000000000000000000000000000000000009111a222a333b424651575e61676963605950483e332a1f1509000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d151f28313b454e58626c74808d96a0acb1acaaa7aca49f92857a6d6054473a2d211407000916222f3b4854606b70797877767675747474747474747474747474747474747575757678797a7b7d7d7063564a3d4855626e7b8895abb5b8b6b4b3b2ab9e918478695f53463a2d2114070000000000000000000000000000010200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b26313c464e53555c5d545c60616263656769686e6d685d5245392c20130700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141f2a36414c56636f7c8995a0acb8c5d0cec4b8aca0958a7d7164594f44382c1f140900000000000000000000000000000000101d293643505c6976828f8f8f8f8e8e8d8d8c8c8c8b8b8a8a89898988888787878787878787878787878787878f949eaab7c3d0ccbfb3a79b918b878787878787878787878788888989898a8a8a8b8b8c8c8d8e8e8f909083766a5d5043372a1d100000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1bec4b7aa9d9184776a5e5144372b1e07000000000000000000000c1926323f4c5965727f8c98a5b2bfc3b6a99c90827f7f7f7f7f7f7f7f7f7f7f7f7f7f7f8c98a5b2bfcbc0b3a79a8d807f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f8c99a5b2bfc5b9ac9f928679665b5044382b1f1206000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111d2a36414c566975828f9ca8b5c2bdb2a89b8e81787b7c7d7e7f8284868276695c504855626e7b8896a0acb8c6bfb9aca096918c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8d8d8d8d8e8e8e8f90919192877a6e6154473b2e2114080000000000000000000000000002080d111314181c1d1e1c191514120e090300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081019202930363f454d53545a5c56544f473e362c21180e0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d161f29333d46505a606d7984919aa4a7a09d9a989a93918b7f7265584c3f3225190c000713202c38444f5960636c6b6a6a6968686867676767676767676767676767676868696a656c6d6f70706b6054483a4754616d7a8799a3aeacaaa8a6a6a5a196887b6e6155483b2e2215080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a15202a343c43474850504a5153545557595b565e61605d564c4135291d1104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020d1925303b4854606b7783909daab4becad4c8bdb1a89d9083776b6155483b31251a0e00000000000000000000000000000000101d293643505c6976828383828281818180807f7f7e7e7e7d7d7c7c7b7b7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a828f9ca8b5c2cfcbbeb1a4988b7f7a7a7a7a7a7a7a7a7a7a7b7b7b7c7c7c7d7d7e7e7e7f808081828283848376695d5043362a1d100000000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec3b6a99d9083766a5d5043372a1d10040000000000000000000d192633404c5966737f8c99a6b2b8b8b8ab9f94908b8b8b8b8b8b8b8b8b8b8b8b8b8b8c919ba7b4c0ccc1b5a99d928d8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8c919ca7b4bababaaea39886796c605346392d2013060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d192530404d596673808c99a6b3bfc4b8ac9f92867a6e6f70717375777a796d60534747535f6a7784919eaab7c4c4b7aa9e91847f7f7f7f7f7f7f7f7f7f7f7f7f7f7f80808080818181828283848586887c6f6256493c2f231609000000000000000000000000000000010507070c0f1111100d0808060200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070e171f252a333b4246484d4f4948433d342c241a0f06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d17212b343e45515d67707d88939f9b95908e8b898684817b6e6154473b2e2114080003101b27323d474f54565f5e5e5d5c5b5b5b5b5b5a5a5a5a5a5a5a5a5a5a5a5b5b5b5c535b606162636360594f44394653606c7986929fa29f9d9b9a999897968b7e7265584b3f3225180c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040e18222a31373a3c434440444647484a4c4e4c525454524c443a3024190d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008141e2c38434f5965727e8b98a2aebac6d3cec3b8aca0958a7d7063574d42362a1c11060000000000000000000000000000000f1c2835424e5a667076767676757574747373727272717170706f6f6f6e6e6d6d6d6d6d6d6d6d6d6d6d6d6d75828f9ca8b5c2cfcabeb1a4978b7e716d6d6d6d6d6d6d6d6e6e6e6f6f6f70707071717272737474757676777670665a4e4235291c0f0000000000000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3bfc1b4a89b8e8175685b4e4235281b0f020000000000000000000d1a2633404d596673808c99a6acababababa69f9c9898989898989898989898989898989ba3adb8c4d0c5b9aea49d9a989898989898989898989898989898999ca3adadadaeaeb4a093867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081724313d4a5764707d8a97aab4bfc7baaea2988a7d716463656668676d6d675d5145434e586773808d9aa6b3c0c5b8ac9f92857a737373737373737373737373737373737374747474757676777879796f6a6054483b2e22150900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d141a212931363a3b40423c3b38322b221a12080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050f19222935404b55606b74808d928e8884817e7c7a78746e695e52463a2d20140700000b16212b353d444849525151504f4f4e4e4e4e4e4e4d4d4d4d4d4d4d4d4d4e4e4f4f49505354555656544f473d3744505b65788592969892908e8d8c8b8a89888073675a4d4034271a0d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006101820262b2e2f362e34383a3b3c3d3f414146474745413a32281e13080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020f1b27323d4754606d7a85929fabb8c2cdd4c8bcb1a79c8f8276695e5346382d22170b0000000000000000000000000000000d1926323e49545e66696a69696868676767666665656464646363626261616160606060606060606060606976828f9ca9b5c2cfcabeb1a4978b7e7164606060606060616161626262636363646464656566676768696a6a69665e544a3e32261a0d0000000000000000000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1bfb3a6998c807366594d4033261a0d000000000000000000010d1a2734404d5a6773808d9aa49f9f9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9ea1a8b2bdc9d5c9beb3a9a19e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9f9f9fa4a0a0a1a1a1a1a094877a6d6154473a2e2114070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8898a3aebac4bfb4aa9b8e8175675c5859555d60605d554b403e4b5764717e8a97aab4bfc5baaea2988c7f72656666666666666666666666666666676767676868696a6a6b666d6660584e43382c1f1307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090f171f252a2d2e3436302f2c272119100800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000071018242f3a434f59606d798386817c7774726f6d6767615e564d42362a1e11050000040f19232b32383b3d464544434342414141414141414141414141414141414242423f444647484a4a48443d35333f49536a77838c8a88858381807f7e7e7d7b786d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060e151b1f21222923282c2d2e2f30323036393b3a3935302820160c0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030608090a0a09090908080808070707060300000505040404040303030303000a16202c3945515d6774818d9aa7b1bcc8d4cdc3b9ac9f93877b6e61544a3f33281c0f0300000000000000000000000000000a16212d38424c545a5c5d5c5c5c5b5b5a5a5959595858575756565655555454545454545454545454545c6976838f9ca9b6c2cfcabeb1a4978b7e71645854545454545454545555565656575757585859595a5b5b5c5d5d5d5a544c43382d22160a0000000000000000000000000000000000000000000000000000030f1b27333f49536976838f9ca9b6c2c0b6ac978a7e7164574b3e3124180b000000000000000000010e1a2734414d5a6774808d9499939291919191919191919191919191919191919191919196a1acb9c5cfc6b9ada1979291919191919191919191919191929292939a9393949494959594877a6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c7986929facb9b7b5b4ac9f9285796d60534c4b515353514b43393b4855626e7b8898a2aeb9b8b5b4aa9e9184786c605959595959595959595959595a5a5a5a5b5b5b5c5d5e545c605c544e463d32271b0f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d141a1e2121272923221f1b160f0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007131d28313d45515d676d797a746f6a676562605d5554524d443b3025190e0200000007111921272c2f303938373736353535343434343434343434343434343435352d3337393a3c3d3d3c38332b2d3e4b5764717e7f7d7b79777573737271706e6d665c5144382c1f1206000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f1215151d181c1f2021222426252a2d2e2d2c29241e160e04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f12151517161616161515151414141312100c0612121111111010101010101010111d2935414b55626f7c88959fabb8c4d1d4c7bbafa4998c7f73665b5044382b1f1207000000000000000000000000000005101b26313a42494e5050504f4f4e4e4e4d4d4c4c4b4b4b4a4a494948484747474747474747474747505c6976838f9ca9b6c2cfcbbeb1a4988b7e7165584b4747474747474848484949494a4a4b4b4b4c4d4d4e4f4f5051504e4a433a31271c1105000000000000000000000000000000000000000000000000000005121f2b3744505b657784919eaab7c4bbafa49a897c6f6256493c2f231609000000000000000000000d1a2633404d596673808787868685858585848484848484848484848484848484848484919eabb7c1c2c3b8ab9e92858484848484848484848484848585858686868687878788888889877a6d6154473a2e21140700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505b667784919daaacaaa9a7a6a2988a7d7064574a4045474745403931394653606c7985929facadaba8a7a5a196897c6f63564c4c4c4c4c4c4c4c4c4c4d4d4d4d4e4e4e4f4f50514b5153514b423d342b21160a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e1214151a1c1615130f0a0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f2935404b555d666d6d68625f58585654514b4746423b32291f14090000000000070f161b2022232c2b2b2a292828282828272727272727272727272728282822272b2d2e2f30302f2c2723303d4955616c7172706e6c6668676665646362605c544a4034281c1004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060809070c10121314151719191e202121201d19130c04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060e151b1f21222423232322222221212120201f1c171f1f1e1e1e1d1d1d1d1d1d1d1d1d1d18242f3a47535f6a7683909da9b6c3cfd7ccc0b5ab9e9184786c605346392e23180c0000000000000000000000000000000a151f2831383e42434343434242414140403f3f3f3e3e3d3d3c3c3c3b3b3a3a3a3a3a3a3a3a3a43505d697683909ca9b6c3cfcbbeb1a4988b7e7165584b3e3a3a3a3a3b3b3b3c3c3c3d3d3d3e3e3f3f4041414243434443423e3831281f150a0000000000000000000000000000000000000000000000000000000613202d394653606c7986929facb9c5b9ac9f93867a6d6054473a2d211407000000000000000000000613202d394653606c787b7a7a797878787878787878787878787878787878787878787a8793a0adb5b5b6b1a4978a7e7878787878787878787878787878787979797a7a7a7b7b7b7c7c7b76685e5246392d201307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a546975828f9ca49f9e9c9b9998978e8174685b4e41393a3a39352f2b3844505b667683909da9a19e9c9a98979a8d8174675a4e4140404040404040404040404141414142434344404546454039302b22190f040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080d0f0909070300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d18242f39434b545c60605d56534e4b494745413b3a36302920170d02000000000000040b101316161f1e1e1d1c1c1b1b1b1b1b1b1a1a1a1a1a1a1a1a1a1b1b1c171b1f202122232322201c212d3945505a6164666361605b545a595857565553514a42392e23180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004060708090a080d1114141413110d080200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006101820262b2e2f3030302f2f2f2e2e2e2d2d2d2c28232c2b2b2b2a2a2a2a2a2a2a2a2a2a2a2a2a2b37434e5866737f8c99a9b3bec9d5d2c7b9aca196897d7063544b4034281c10040000000000000000000000000000030d161f262d32353637363635353434343333323231313130302f2f2e2e2e2d2d2d2d2d2d2d3743505d6a7683909da9b6c3d0cbbeb1a4988b7e7165584b3e322d2d2e2e2e2f2f2f3030303131313232333434353637373635322d271f160d030000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8899a3aebac3b7aa9d908477685d5245392c2013060000000000000000000006121f2b3844505b666c6e6d6d676c6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6e7b8794a1a7a8a9aaaca5988b7e726b6b6b6b6b6b6b6b6b6b6b6b6b6c6c666d6d6d6e6e6e6e6f6f6e695e564c41362a1e1105000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222d414d5a6774808d9a9a93918f8e8d8b8a8983766a5d5043372d2d2c292428333f4a546774818d9a9997928f8d8b8a88878174685b4e413533333333333333333334343434353536372e34383a38342e271e19100700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d283139424a515354524c47433f3c3a39352f2d2a251f170e050000000000000000000307090a13121110100f0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0f060b0f1213141517171613111d28343e4850555759575553504a4d4c4b4b4a484644403930271c120700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010507080707040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040e18222a31373a3c3d3d3c3c3c3b3b3b3b3a3a3a38342e383838373737373636363636363636363636313c4955626f7c8897a1adb9c6d2d5c9bdb2a89b8e8175665c5145382c1f1306000000000000000000000000000000040d151b212628292a2929292828272726262625252424232323222221212121212121212a3744505d6a7783909daab6c3d0cbbeb1a4988b7e7165584b3e322521212121222223232324242425252626272828292a2a2a2926221c150d04000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97abb4bfc0b3a79a8d807467564c4135291d110400000000000000000000030f1c28333f4a545b606161605d555e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e626e7b88959a9a9b9c9d9fa2998c7f73665e5e5e5e5e5e5e5e5e5e5e5f5f5f5c606060616161626262615e574c443a3025190d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061925323f4c5865727f8b8e8a86848281807f7e7c796d6053473a2d20201f1d18222d3f4b5865727e8b908c898582807f7d7c7a746f65594d4034262626262626262627272727282828292a23282c2d2c28231d150c0700000000000000000000000000030506080807070606030000050404040403030303030303030302020202020202020202020202020202020202020202020202020202020202020202020303030303040404040505050505000003060707070707080807050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f2830394044464745413a37312f2d2c2924201e19140d0500000000000000000000000000000605040403020202010101010101010101010101010102000003050607090a0a09070c17222c363e45494b4c4a4846443f40403f3e3d3b3a38342e271e150b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a15202a343c4347484a4949494948484847474746443f4545454544444443434343434343434343434343434653606c7885929eabb8c5d1dacec4b8ab9f9285796d6053463a2d22170b00000000000000000000000000000000030a1016191c1d1d1d1c1c1b1b1b1a1a1919181818171716161515141414141414141d2a3744505d6a7783909daab6c3d0cbbeb1a5988b7e7265584b3f32251814141515151616161717181818191a1a1b1c1c1d1e1d1c1a16110a030000000000000000000000000000000000000000000000000000000003101c28343f4a546773808d9aa6b3c0bcb1a7978a7d7164574a3e2f24190d0100000000000000000000000b17222d38424a5053545453515257595e5f5e5e5e5e5e5e5e5e5d5d5d5d5d5d626f7c888e8d8d8e8f909298978d8073675d5d5d5d5e5e5e5e5e5f5f5f5f5f5b605b5454545555555654524d453a32291e130800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c84817d7a777674737271706d675d5145382c1f14131015222f3c4855626f7c87837f7c79757472706f6d68655d53483c30241919191919191a1a1a1a1b1b1b1c1c1d181c1f201f1c18120b03000000000000000000000000060b0f12131514141413120f0b061111111010101010101010100f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f10101010101111111112121212120c10121314141414141514120e0902000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d161e272e34383a3a39352f2b262321201d1814110e09020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006101a242c34393d3e3f3d3b3938332d333231302f2d2c28231c150c0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060707070604010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b26313c464e5355575656565555555454545353504a52525251515150505050505050505050505050505050505b6574818e9babb5c0cbd7d3c6baaea298897d706353493f33271b0f030000000000000000000000000000000000050a0d0f101010100f0f0e0e0d0d0c0c0c0b0b0a0a09090908080707070707111e2a3744515d6a7784909daab7c3d0cbbeb1a5988b7e7265584b3f3225180c0808080909090a0a0a0b0b0c0c0d0e0e0f101011100f0d0a0500000000000000000000000000000000000000000000000000000000000006121f2c3844505c667683909ca9b6c3b8aca095877a6e6154473b2e21140800000000000000000000000006111c262f383f4446484747525b63666b6b6b6b6b6b6b6b6a6a6a6a6a6a6a6a6a6d798081808182828385888a8c80746a6a6a6a6a6a6b6b6b6b6b6c6c6c6c666c66635c52484849494846423b332920170d0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815222e3b47545f6a6f7774706d67696866656463605d554b4035291d10060815212e3a47535f6a6f7a76736f6c6667656462605d56534b41372c20140d0d0d0d0d0d0d0d0e0e0e0e0f10070c10131313100c07000000000000000000000000020a11171b1f2022212120201f1c171e1e1e1d1d1d1d1d1d1d1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1c1d1d1d1d1d1e1e1e1e1f1f1f1f171c1f20202121212121201e1a140d05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c151c23282c2d2d2c29241e1b161413110d0705020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008121a22282d303133302e2d2b28222625242322201f1c18120b03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080b060b101213141413110d070908060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b37434e585f626363636262626161616060605c5f5f5f5e5e5e5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5364717e8a99a3afbbc7d4d6cabeb4aa9a8d8174655b5044372b1f1205000000000000000000000000000000000000000103030403030202010101000000000000000000000000000000000004111e2b3744515e6a7784919daab7c4d0cbbeb1a5988b7e7265584b3f3225180c000000000000000000000000000001010203040403030100000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7985929facb8c3b6aa9d908377685e5246392d201407000000000000000000000000000a141d262d3338393b3a4b57636e737878787878787777777777777777777777777777777777777777787b7e7f7c777777777777777778787878787979797979736e63574b3b3c3c3b3a36302921170e0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2b37434e585f626b6763605d555b5a58575653514b43392f24180c0006121f2b37434e585f676d676662605b5458575554524c4441392f251a0f04000000000000010101010202030000040607060400000000000000000000000000020b141b22272b2d2f2e2e2d2d2b28222b2b2a2a2a2a2a2a292929292929292929282828282828282828282828282828282828282828282828282828282828282829292929292a2a2a2a2b2b2b2b2c2c2c23282c2d2d2d2d2e2e2e2d2a251f170f09000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b12181c1f2021201d19130f0a0706040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000810171d212324262422201f1c1719181817151312100c0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306090e121415171a171c1f202120201d181a1515120f0a03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815212e3a47535f6a6f70706f6f6f6e6e6e6e6d6d6d666c6c6b6b6b6a6a6a6a69696969696969696969696969696969696d7a86929facb9c5d2dbd0c4b8ab9e9184786c605346392d201306000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111e2b3844515e6b7784919eaab7c4d1cbbeb2a5988b7f7265584c3f3225190c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c8898a2aebabcb1a7998c7f7266564c41362a1e110500000000000000000000000000020b141c22282b2d33404d59667380848585858484848484848484848484848484848484848484848484848484848484848484848484848485858585868686868073665a4d40332f2e2d2a251f170f0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b26323c464e54555e5b5754514b4e4d4c4b494745403931271d120700030f1b26313c464e555d605d555653504a4c4a494745413a322f271d1309000000000000000000000000000000000000000000000000000000000000000000000a141d262d3337393b3b3a3a3938332d38383737373736363636363636363635353535353535353535353535353535353535353535353535353535353535353535353636363636373737373838383838392e34383a3a3a3a3a3b3b3a363029211b120900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070c1012131413110d08010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c1115171819171513120f0b060c0b0a080706040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001050a0f13151a1e2021242723282b2d2e2d2c29242622211f1a15100b0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915222f3c4855626f7c7d7c7c7c7c7b7b7b7a7a7a79797978787878777777767676767676767676767676767676767676767683909da9b6c3d0dbd2c5b9ada196887c6f6255483c2f221508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111e2b3844515e6b7784919eaab7c4d1cbbeb2a5988b7f7265584c3f3225190c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121e2b37424d576673808c99aab4bfb8ab9f95887b6e6155483b3025190e020000000000000000000000000000020a11171c1f2936424f5c6975828f92919191919191919190909090909090909090909090909090909090909090909090909091919191919292929292998f8376695c5043362921201e1a140d050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a15202a343c434749514e4a47454141403f3e3d3a38352f271f150b0100000a15202a343c434b5153514b4946443f3f3d3c3a39352f28201d150b0100000000000000000000000000000000000000000000000000000000000000000006111b262f383f44464847474746443f454544444443434343434343434342424242424242424242424242424242424242424242424242424242424242424242424242424343434343444444444545454545463f444647474747474846423b332d241b110600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000406070707040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005080a0b0c0a08060603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d11151b1f22252a2d2e31342e34383a3a3a39352f332f2e2b26201c160c0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111e2b3844515e6b77848a8989898888888787878686868685858584848483838383838383838383838383838383838383838385919eabb8c4cdcecfc9bdb2a9988b7e7265584b3f3025190d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4d1cbbfb2a5988c7f7265594c3f3226190c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212d3a47535f697784909daab7beb3aa9d908376695f53463a2d1e14080000000000000000000000000000000000060b0f1b2835424e5b6875818e9b9e9e9e9e9e9e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9e9e9e9e9e9f9f9f9f9c8f8276695c4f4336291c14120e090300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040e19222a32373b3c44413d3a39352f333231302d2c29241d150d03000000030e18222a313a40454745403c3938332d312f2d2c29241e160d0b03000000000000000000000000000000000000000000000000000000000000000000000b17222d38414950535554545353504a52515151505050505050504f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f50505050505151515152525252524a5053535454545454524d453f362d23180c0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090e13191d20272b2e30363a3b3e40433f44464747454042403c3a37312c272118120b0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020f1c2835424f5b6875828e969695959594949493939a93929292919191909090909090909090909090909090909090909090909197a1adb9c0c1c2c3c4c1b5a89b8e827568564c41362a1e11050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3845525e6b7885919eabb8c4d1ccbfb2a6998c7f7366594c403326190d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8895a0acb8baaea2988b7f7265574d42362a1e0d02000000000000000000000000000000000000000e1b2734414e5a6774818d9aa7abababaaaaa49c999898989898989898989898989898989898989898989898989898989b9ea5abababacaca89c8f8275695c4f4236291c0f05020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007101920262b2e2f3834302d2c292427252423201f1d18120b0300000000000610181f282f35393a39352f2d2b2822242221201d19130c040000000000000000000000000000000000000000000000000000000000000000000000030f1b27333f49535b6062616160605b5f5f5e5e5d5d5d5d5d5d5c5c5c5c5c5c5c5c5c5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5c5c5c5c5c5d5d5d5d5e5e5e5e5f5f5f5f5f5c606060606161615e5751483f34291d1105000000000000000000000000000000000000000000000000000000030608090f0f0e0d0c0b0c0c0e100c0b09060100000000000000000000000000000000000000000000000105090b0b100f0d0c0b0c0d0e0f100c0b090601000000000000000000000000000000000000000000000000000000000002050708090806050300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d14191e252a2d32373b3c4246484a4d504a50535453514b4f4d4847433c383328231d150c03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d1a2734404d5a6773808d9aa2a2a2a1a1a1a1a0a0a49f9f9f9e9e9e9d9d9d9d9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9ea1a9b3b2b3b4b5b6b7b8b8ab9e918578685e5246392d2013070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3845525e6b7885919eabb8c4d1ccbfb3a6998c807366594d4033261a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2b37434e5866727f8c99a7b1bcb5ab9f92857a6d6054473b31261a0e00000000000000000000000000030607060300000d1a2633404d596673808c99a6b3b7b7b7a89c928d8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8e939eaab8b8b8b5a89b8f8275685c4f4235291c0f02000003060706030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070e151b1f22222b282421201d181a1918161413100c070100000000000000060d161d24292c2d2c2924201f1c1717161413110d080100000000000000000000000000000000000000000000000000000000000000000000000005121f2b3744505b656c6e6e6d6d6c666c6b6b6b6a6a6a6a696969696969696969686868686868686868686868686868686868686868686868686868686868686868686869696969696a6a6a6a6b6b6b6b6b6c6c6c666d6d6d6d6d6e6e69625b51453a2e22150900000000000000000000000000000000000000000000000000040a0f1315161c1c1b1a191818191b1d191816120d07000000000000000000000000000000000000000000060c111517181d1c1a191818191b1c1d191816120d07000000000000000000000000000000000000000000000000000003090e121415161413120f0b0609070603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020200000000000000000000090e171f252a3036393c4347494d5254575a5c545c6061605d555c5955534e48443d342e271e150d030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7a6a6a5a5a4a4a4a3a3a3a2a2a2a2a2a2a2a2a2a1a1a1a1a1a1a1a1a1a1a1a1a1a2a2a2a2a2a3a3a3a3a4a5a6a7a8a9aaabacada197877a6d6154473a2e2114070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2c3845525f6b7885929eabb8c5d1cdc0b3a69a8d8073675a4d4034271a0d01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c15222e3b4754606a7683909da9b6bbafa3998d8073675d514539291f14090000000000000000000000060c10121312100c060f1926323f4c5965727f8c98a5b2bfc0b3a6998d807e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e818e9ba8b4c1c1b5a89b8e8275685b4f4235281c070f060c10121312100c0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f1315161e1b171413110d070c0b0a0706040000000000000000000000040c13181d2020201d1813120f0b06090707040100000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c787b7a7a7a797978787877777776767676767676767675757575757575757575757575757575757575757575757575757575757575757575757575757676767676777777777878787878797979797a7a7a7a7a7b726d62564a3d3124170b000000000000000000000000000000000000000000000000070f161b1f2223292827262625252627292625221e181109010000000000000000000000000000000000000911181d2124252a29272525252627292a2525221e181109010000000000000000000000000000000000000000000000060e141a1e21222321201f1b1718151312100b06070502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010406070f0f08070502000000000009131b202930363a4146474e5455575e616467696b666d6d6d676b6966625f58544f45403930271f150b0100000000000000000000000000000003060709090703000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a546875818e9b9b9a9998989897979796969696959595959595959595949494949494949494949595959595969696969798999a9a9b9c9d9e9fa3a996897c706356493d3023160a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabb8c5cbccc0b3a79a8d8074675a4d4134271a0e0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e2a36424d57626f7c88959fabb8b4ab9f92877b6e61554b413529180d03000000000000000000030a11171c1f201f1c171c1b1b25323e4b5865717e8b98a4b1bebcafa296897c7171717171717171717171717171717171717171717171717171727e8b98a5b1bec1b5a89b8e8275685b4f423528181b1b1c171c1f201f1c17110a030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060809110e0a070604010000000000000000000000000000000000000001070d11131413110d0706030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b88878786868685858484848383838383838382828282828282828282828282828282828282828282828282828282828282828282828282828282828283838383838484848485858585858686868687878787877e7265584b3f3225180c000000000000000000000000000000000000000000000007101920272b2e2f3635343332323232343632312e29231b1309000000000000000000000000000000000009121b22292e31323735333232323334353632312e29231b130900000000000000000000000000000000000000000000060f181f262b2d2e302e2d2b27222522201f1c171414110e0806040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001080d1113141b1b1514120e0903000006111b252d323b42464c525458606267696e7173767778797a7a797875736f6a636059514b433931271d120700000000000000000000000000060b1012131615130f0a040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505b667784908f8e8d8c8c8b8b8b8a8a8a8989898989888888888888888888878787878787878888888888898989898a8a8b8c8d8e8f909191929994958b7e7265584b3f3225180c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3946525f6c7985929facb8bdbebfc1b4a79a8e8174675b4e4134281b0e010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b1924303a46535e6975818e9ba7b1baaea3998e8175695e53433a2f241806000000000000000000040c151c23282c2d2c282329282823313e4b5864717e8b97a4b1bebcafa296897c6f65656565656565656565656565656565656565656565656565727e8b98a5b1bec1b4a89b8e8175685b4e4235282328282923282c2d2c28231c150c030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005010000000000000000000000000000000000000000000000000000010406070604010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d79869394939992929291919090909090908f8f8f8f8f8f8f8f8f8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8f8f8f8f8f9090909091919191929292929299939393939494897d7063564a3d3023170a00000000000000000000000000000000000000000000040f19222b32383b3c424241403f3e3f3f41433f3e3a352d251b110705050505050505050505050505050506111b242d343a3d3e4342403f3e3f404142433f3e3a342d251b11070000000000000000000000000000000000000000061018212a31373a3b3c3b3937332d312f2d2b282321201e191413100c0704000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c13191d2021282821201e1a140b06000c18232d373f444d52565e61666a6f73787b7d80838485868786868582807b77706b605c554b43392f23180c0400000000000000000000020a11171c1f2023221f1b160f070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c7883838281807f7f7e7e7e7d7d7d7c7c7c7c7c7c7c7c7b7b7b7b7b7b7b7b7b7a7a7a7b7b7b7b7b7c7c7c7c7d7d7d7e7f80818283848586878888897f7266594c3f3326190c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabb0b1b1b2b4b4a79b8e8174685b4e4135281b0e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d2935414c56616e7b87929facb9b4aa9f92867b6e61574d4231281d13070000000000000000040d161e262e34383a38342e3635352e343e4b5864717e8b97a4b1bebcafa296897c6f63585858585858585858585858585858585858585858585865727e8b98a5b1bec1b4a89b8e8175685b4e4238342e3535362e34383a38342e261e150a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c677885919ea0a39f9f9e9e9e9d9d9d9d9c9c9c9c9c9c9c9c9c9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9c9c9c9c9c9d9d9d9d9e9e9e9e9e9f9f9fa3a0a0a0a0a094877b6e6154483b2e211508000000000000000000000000000000000000000000000a16202b343d4347494f4f4e4d4c4b4b4c4e504c4a463f372d23180d1212121212121212121212121212120c18222d363f454a4b504f4d4c4b4b4c4e4f504c4a463f372d23180d01000000000000000000000000000000000000030e18222a333c424648494746443f403e3c3a38342e2e2d2a25201f1c1813100c07000000000000000000000000000000000000000000000000000000000000000000000000000000040d161e24292c2d35352e2d2a251f17110a121d29343f4951565e61686d73777c8084878a8d8f9192939a9993918f8c88837d756d675c554b40342920150a000000000000000000070c141c23282b2d302f2c2721191009010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505b666c77767574737372727171717070706f6f6f6f6f6f6f6f6f6e6e6e6e6e6e6e6e6e6e6e6e6e6f6f6f6f6f707070707172737475767778797a7b7c7c786d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2c3845525f6b7885929ea4a3a4a5a5a7a9a89b8e8275685b4f4235281c0f020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c262f3845525d6874808d99a3afbaaea2988d8074695f53453b311f160c0100000000000000010c161f2830383f4446443f43434241423f444b5864717e8b97a4b1bebcafa296897c6f63564b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b5865727e8b98a5b1bec1b4a89b8e8175685b4e46454042414243433f4446443f3830261c110600000000000000000000010507070c0c0b0a090807060400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060609090908080707070603000005050504040404040404040404040404040404040404040404040404040404040404050500000406070707080808090909090605030000000000000000000006131f2c3945515d677885919ea5a4a4a3a3a2a2a1a1a1a0a0a0a0a0a0a39f9f9f9f9e9e9e9e9e9e9e9e9e9e9e9fa2aaa8a8a8a8a8a8a8aba39f9e9e9e9e9e9e9e9e9e9e9f9f9f9fa3a0a0a0a0a1a1a1a1a2a2a3a3a4a4a5a5a6a094877a6d6154473a2e211407000000000000000000000000000000000000000000030f1b27323d464e54565c5b5a59595858595a5c595751493f35291e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1d29343f485056585d5c5a585858595a5c5d585651493f34291e12060000000000000000000000000000000000000a15202a343c454d535556545350494d4b4846443f3e3b3936302d2c29231f1c18120f0a030000000000000000000000000000000000000000000000000000000000000000000000040d161f282f35393a42423b3a363027221b1415222e3a46515b62696e737a8084888d9196979a9c9e9f9fa4a49f9e9c9995908981796d675c51453c32271b0f00000000000000000810181e262e34383a3c3b38322b231b130900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c28333f4a545b606a6a696867666565656464646363636362626262626262626261616161616161616161626262626263636363646566676768696a6b676d6e6f6f6d665c5044382c1f12060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3845525e6b7885919897979798999a9d9f9b8f8275685c4f4235291c0f02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d17222d38424e58606d7a86929fabb5b0a69f92857a6d61574d4233291f0d04000000000000000007131d28313a424a5053504a504f4e4e4f4a50535864717e8b97a4b1bebcafa296897c6f6356493e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3f4b5865727e8b98a5b1bec1b4a89b8e8175685b5453514b4f4e4e4f504a5053504a42382e23170c000000000000000002080d1113141919181716151312100c070c0b0908070603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200010406070809090a0b0c0c0807050200000000000000000000000000000000000000060b0f1213161616151514141312100c06121211111111111111111111111111111111111111111111111111111111111111111112070c10121314141415151516161613120f0b0600000000000000000714202d3a4753606d7a86939998989797969695959494949493939393999292929292929191919191919191919298a2aeb5b5b5b5b5afa3999291919191919191919192929292929993939394949494949595969697979898999995887c6f6255493c2f22160900000000000000000000000000000000000000000006131f2b38434e5860626968676665656565676965625b51463a2e2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2e3a45505a62656a68666565656667686965625b51463a2e2216090000000000000000000000000000000000030f1a26313c464e575f616361605b535a585553504a4b4746413d3a38342f2c28231d1a150f0b060000000000000000000000000000000000000000000000000000000000000000010c161f28313a4145474e4e4846423b332d261d1724313d4a56626d727b80868c91969a9ea1a8a6a9aaabacafafacaba8a79f9d938e82796d60584e43372b1d120700000000000109111a222a30383f44464948433d352d251b1207000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222d38424a50535e5d5c5b5a5959585858575757565656565655555555555555555554545454545454555555555556565656575758595a5b5c5d5e555d60616263605c544a3f34281c10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b78848c8b8a8a8a8b8c8e9092988f8276695c4f4336291c10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f28333f4a54606a74818d98a2aeb4ab9f948b7f72685e52453b3121170d0000000000000000010d18242f3a434b545c605c545d5c5b5b5b545c605c64717e8b97a4b1bebcafa296897c6f635649444444444444444444444444444444444444444b5865727e8b98a5b1bec1b4a89b8e8175685d61605c545b5b5b5c5d545c605c544a3f34281c1003000000000000040c13191d2021262625242321201f1c181a191716151312100b060907060400000000000000000000000000000000000000000000000000000000000000000003060708090b0d0e070d111314151516171818191514120e0903000000000000000000000000000000020a11171c1f2023232222212121201f1c171f1f1e1e1e1e1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1e1e1e1f1f181c1f20202121212222222323201f1b17110a020000000000000a1623303d495663707c898c8c8b8b8a8a8989888887878787878686868686858585858585858585858585858586929facb8c1c1c1b9ac9f928785858585858585858585858585868686868787878788888889898a8a8b8b8c8c8d8d8a7d7164574a3e3124170b0000000000000000000000000000000000000000000815222e3b4754606a6f75757473727172727476726d62574a3e3838383838383838383838383838383838383838383d4a56626c7176757372717273747576726d62564a3e3125180b000000000000000000000000000000000006121f2b37434e585f696e6f6e6c6568676462605c545754524c4a4745403a38342e2b261f1b17110a0200000000000000000000000000000000000000000000000000000000000007131d28313a434c52545b5b54524d443f382f292125323f4b5865727f868d92989ea0a8abacb2afb0b2b6b9bbbbb9b8b5b1aba59e948d80746a605447392e23180c000000000109131b232c343c424a505356544f473f372d2418120b03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c262f383f444651504f4e4d4c4c4b4b4b4a4a4a49494949494949494848484848484848484747474848484848494949494a4a4a4b4c4d4e4f50514c515455555653504a42382e23170c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e807f7e7d7e7e7f818385888a8174685b4e4135281b0e02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d28313944505b666f7c87939faab4aea3999083776c60564c4133291f0f05000000000000000004111d2935404b555d666d666a6a6968686869666d6664717e8b97a4b1bebcafa296897c6f63565050505050505050505050505050505050505050505865727e8b98a5b1bec1b4a89b8e817568686d6d6669686868696a6a666d665c5044382c1f12060000000000040e161e24292d2e33333231302e2d2c28232726242321201f1c1717151313100c070907060400000000000000000000000000000000000000000001050707060b101213151618191b1d181d20202122232424252521211e1a140d0500000000000000000000000000020b141c22282b2d2f302f2f2e2e2d2d2c28232c2b2b2b2b2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2b2b2b2c23282c2d2d2e2e2e2f2f2f302f2d2b27221b140b0200000000000915222f3c4855626f7c80807f7f7e7e7d7d7c7c7b7b7a7a7a7a7a797979797979787878787878787878787878808d9aa7b3c0cdc4b7aa9d9184787878787878787878787879797979797a7a7a7a7b7b7b7b7c7c7d7d7e7e7f7f8080817c6e6255483b2f2215080000000000000000000000000000000000000000000916232f3c4956626f7c828281807f7e7e7f81837f7265594c45454545454545454545454545454545454545454545454b5865717e8382807f7e7e7f8182837f7265584c3f3225190c00000000000000000000000000000000000815212e3a47535f6a6f7b7c7a79777573716f6d666764615e565753514b4645403937312b27221b140b0a04000000000000000000000000000000000000000000000000000000010d18242f3a434c565d606868615e575049413b33272235424f5c6875828f989fa2aaa8a6a5a3a2a2a4a5a9abb0b8bdc3c2bcb8afa69f93877c6f62544b4034281c100400000009131b252d353e464e545c6063605951493f3628231d150c0701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d262d3338394443424140403f3f3e3e3e3d3d3d3c3c3c3c3c3c3c3c3c3b3b3b3b3b3b3b3b3b3b3b3b3b3c3c3c3c3c3d3d3d3d3e3f404142434441454748494946443f3830261c11060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1723303d4955616c71737271707172727476797b7d7a6e6154473b2e2114080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081118242f39434d57606c78839099a4afb0a69f92867c6e655b50443a3021170d0000000000000000000613202c3945515d676d7978777676757475767879716c717e8b97a4b1bebcafa296897c6f635d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d65727e8b98a5b1bec1b4a89b8e8175686d7a79777675747576767779786d6053463a2d20130700000000020c1620283035393a3f3f3e3d3c3b3a38342e3432312f2e2d2b28232422201f1c1818161413100c07070604000000000000000000000000030607080d11131417171c1f2021232526282924292c2d2e2f30303132322e2d2a251f170f050000000000000000000000000a141d262d3338393c3c3c3b3b3a3a3a38342e38383838373737373737373737373737373737373737373737373737373737373737373838382e34383a3a3a3b3b3b3c3c3c3c3937332d261d140a00000000000815212e3a47535f6a6f74737272717170706f6f6e6e6e6d6d6d6d6d6d666c6c6c6c6b6b6b6b6b6b6b6b6b6b74808d9aa7b3c0cdc4b7aa9d9184776b6b6b6b6b6b6b6b6b6c6c6c656c6d6d6d6d6e6e6e6e6f6f707071717272737374746e6a5f53473a2e211408000000000000000000020507080a090704000000000c1825323f4b5865727e8b8e8d8c8c8b8b8c8d8f8376695c515151515151515151515151515151515151515151515151515a6774808d8f8d8b8b8b8c8d8f8f8275695c4f4236291c0f03000000000000000000000000000000000915222f3c4855626f7c868987858482807e7b797674716e686764605c5553514b47433c37332d261d1b150c07010000000000000000000000000000000000000000000000000004111d2935414b555d686d75756e69605b534d453e332d33404c5966737f8c99a8a09e9b999897969697989c9fa6acb1bac3c8c1bbafa4998e8175665c5145382c1f1306000008121b252d373f474f585f666d6f6b625b51483e342e271e18130c04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b141c22282b2d373736353433323232313131303030302f2f2f2f2f2f2f2f2f2e2e2e2e2e2e2e2e2e2e2f2f2f2f2f30303030313233343435362f35393a3b3c3c3a38342e261e150a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815212d3945505a61646665646464656667656c6e706e685e5246392d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121a232935404b555f69727f8b959fabb2a89e948c7f726a5f53493f32291e0f060000000000000000000714202d3a4753606d7986858483828181828284877e71717e8b97a4b1bebcafa296897c6f6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a727e8b98a5b1bec1b4a89b8e81756c78868684828281818283848584786b5e5145382b1e120500000008131e28323a4146474c4c4b4a494846444042413f3e3c3b3a38342e312f2d2c28232422201f1d18161312100c070604010000000004060b10121315191d20212423282b2d2e30313335362f35393a3b3c3c3d3e3f3f3b3a36312921170d030000000000000000000006111c262f383f44464949494848474746443f4545454544444444444444444444444444444444444444444444444444444444444444444445454540444647474748484849494946443f382f261b11060000000006121f2b37434e585f62676666656564646363626261616161606060605c5f5f5f5f5f5f5e5e5e5e5e5e5e6774808d9aa7b3c0cdc4b7aa9d9184776a5e5e5e5e5e5e5e5f5f5f5f5b606060606161616161626263636464656566666767625f574e42372b1e12060000000000000003090e121415171614100b0500000b1824313e4b5764717e8a979a99989898989a8f8275695e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e6673808c9999989898999a9b8e8175685b4e4235281b0f0200000000000000000000000000000004101c2834404a546774818d999892908f8d8b888583817e7a7774706d6763605c54534e46443f382f2b262018120b030000000000000000000000000000000000000000000000000613202c3945515d676d7a81817b726c655f574f443f382f3d4a5763707d8a979696918e8c8b8a89898a8b90949da0a8b1bcc6ccc0b5ab9f9285796d6053463a2d2013070008111a242d373f495159616a6f787c726d625a504540393029241d160d09030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171c1f202b2a2928272626252525242424232323232322222222222222222221212121212121222222222223232323242425262728292a24292c2d2e2f302d2c28231c150c030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111d28343e4850555759585757575859535b606164615e564c41362a1e11050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a121b242c363e45515d676e7b85929fa7b1a9a1968f82756d62584e41382d20170c000000000000000000000815212e3b4854616e7b879291908f8e8e8e8f918b7e71717e8b97a4b1bebcafa296897d7777777777777777777777777777777777777777777777777777777e8b98a5b1bec1b5a89b8e82756c788592918f8e8e8e8f90919285786c5f5245392c1f12060000010d1924303a444c525459595857565453514a4f4d4c4a494846443f403e3c3a38342e312f2d2c292423201f1c181413110d0806070c1013171c1f2022252a2d2e302e34383a3b3c3e404143444045474848494a4b4b4c4846423b33291f1409000000000000000000000b17222d38424a50535656555554545453504a525252515151515050505050505050505050505050505050505050505050505050505151515252524a515353545454555555565653504941382d22170b00000000030f1a26313c464e53555a595958585757565655555454545454535353504a52525252525252525252525a6774808d9aa7b3c0cdc4b7aa9d9184776a5e52525252525252525249505353535454545455555556565757585859595a5a5b55534e453c31261a0e02000000000000060d141a1e21222322201c160e08020a1724303d4a5763707d8a96a3a6a5a4a5a59b8f82756b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b727f8c99a5a5a4a5a6a79b8e8174685b4e4135281b0e0200000000000000000000000000000006121f2c3844515c667784909da29f9d9b9a979892908d8a8784807d7975706d66625f58535049413e373229241d150d0700000000000000000000000000000000000000000000000714212d3a4754606d79838e8e867e776e6961595049413a3a4753606d79858d8a878481807e7d7c7c7d7f83889195a0aab4bfcac7baaea298897c6f6356493c3023160907101a232c363f49515b626b707c83897f726c615a514b423c352f281f1a140d05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f12131e1d1c1b1a1919181818171717161616161616161615151515151515151514141415151515151616161617171718191a1b1c1d191d2021222223201f1c17110a030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c17222c363e45494b4d4c4b4a4b4b4c495053555754524c443b3025190d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131c242d363e48515b606d79839097a2adaaa29791847a6d615b51463c2f261b0e05000000000000000000000714212e3a4754616d7a87949d9d9c9b9b9b9c978a7e71727e8b98a5b1bec0b7aa9e918483838383838383838383838383838383838383838383838383838384919eabb7c1c1b5a89b8f82756b7885919e9c9b9b9b9c9d9d9285786b5f5245382c1f1205000005111d2935414c565d61666665646361605c545c5a5957565453504a4d4a48464540403e3c3a38352f2f2d2c282321201d19141212181d1f23282b2d2f3036393a3d403f444648494b4c4e50514b51535455565757585854534d453b31251a0c030000000000000000030f1c28333f4a545b6062636262616160605c5f5f5f5e5e5e5e5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5e5e5e5f5f5f5c60606161616262626362605b53493f33271b0f03000000000a15202a343c4347484e4d4c4c4b4b4a4a4949484847474747474646443f464645454545454545454d5a6774808d9aa7b3c0cdc4b7aa9d9184776a5e5145454545454545463f444646474747474848484849494a4a4b4b4c4c4d4d4e4847423c332a201509000000000000070f171f262a2d2e302f2c272119140d0a1623303d495663707c8996a3afb2b1b1a89b8e81787878787878787878787878787878787878787878787878787878787878787f8b98a5b1b1b1b2a79a8d8174675a4e4134271b0e010000000000000000000000000000000713202d3a4653606d7986919695989a9c9fa3a29f9d9a9795908d8a85817d79746e6a63605b534f47433c352f271f191007000000000000000000000000000000000000000000020e1b2835414e5b6874818e9598928b827b706b605b534c433b45515c67707d807d7a77757372706f6f7172767c839198a2aebac6cabeb3aa978a7d7164574a3e3124170b0e19222c353e48515b626d727d869193887e716c605c544e45403a312a251f170f080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060611100f0e0d0d0c0c0b0b0b0a0a0a0909090909090909090808080808080808080808080809090909090a0a0a0a0b0c0d0e0f080d1113141516161312100c06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006101a242c34393d3e403f3e3d3e3f3f3f4446484a4746413b32291e140800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a131c252e373f48505a636d75818e95a0a9aba39892857c6f685d52493f332a1d140a00000000000000000000000714202d3a4753606d7a869aa4a9a9a8a7a8a4978a7d71727f8c98a5b2b3b3b3aca096919090909090909090909090909090909090909090909090909090909196a1adb4b4b4b4a89c8f82756b7885919ea9a8a7a8a9a99e9185786b5e5245382b1f120500000713202d3946525d686d727271706f6e6d666a686765646261605c5459575553514b4d4b494745403f3c3a38342e2d2c2924211e1d24292c2e34383a3c3f4146474a4d4a5053545658595b5c5e555d6061626363646565615e574d42362a1e150b000000000000000006121f2b3844505b666c6f6f6f6e6e6d6d6d666c6c6b6b6b6b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6b6b6b6c6c666d6d6d6e6e6e6f6f6f6f6c655b5044372b1f120500000000030e18222a31373a3c41403f3f3e3e3d3d3c3c3b3b3b3b3a3a3a3a3a38342e3939383838383838414d5a6774808d9aa7b3c0cdc4b7aa9d9184776a5e51443838383838392d3337393a3a3a3a3b3b3b3b3c3c3d3d3e3e3f3f404041413b3a37312a21180e030000000000071119212931363a3b3d3c38332a251e170e16222f3c4955626f7c8895a2afbbbeb8ac9f92868484848484848484848484848484848484848484848484848484848484848485929eabb8bebeb3a69a8d8073675a4d4034271a0d0100000000000000000000000000000006121f2c3844515c6674818487898b8d909299999d9fa4a7a09d9a98928e8a85817b76706c656159544e454039312b2218120b030000000000000000000000000000000000000004111e2a3744515d6a77849095a09f948f857d736c655d554d45404b55606b7073706d6868666564636364656a6f7b86929facb8c5d0beb2a5988b7f7265584c3f3225190b17202b343d47505a626d727f8792989a92877e746d665f58514b433e3631292119110800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040302010000000000000000000000000000000000000000000000000000000000000000000000000000000000000101020001040607080909070603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008121a22282d30313332313131322d3337393b3d3b3936302920170d020000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121c252e373f49515a616c737f8c939ea7afa39992867d6f6a5f564c41372d21180b0200000000000000000000000613202d394653606c7986939facb5b4b4b0a4978a7d71737f8c99a6a7a6a6a6a6a8a09e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ea1a8a7a7a7a7a7a89c8f82766b7884919eabb5b4b4b5aa9e9184776b5e5144382b1e11050004111d2935414c56616d7a7f7f7e7d7c7b797876757472716f6e6d6668666462605c545a575553514b4c494644403d3a39352f2e2b2c2f35393a3f4446484b4c5254575a545c606163646668696b6b676d6e6f6f707172726e695e53463e30271d1207000000000000000613202d394653606c797c7c7c7b7b7a7a797979787878787777777777777777777777777777777777777777777777777777777777777777777878787979797a7a7a7b7b7b7c7c7c776c605346392d201306000000000006101820262b2e2f343333313a41454749484848484747474644404645454544444444434343434d5a6774808d9aa7b3c0cdc4b7aa9d9184776a5e51444343434344444444454545463f444647474747484848494746413a3234342f2e2b2620180f060000000000061019232b333b4246484a48443d363029201815222f3b4855626e7b8895a1aebbc6baaea29892919191919191919191919191919191919191919191919191919191919191919297a1adb9c6c0b3a6998d8073665a4d4033271a0d0000000000000000000000000000000004101c2834404a54646f74787a7c7e808386898d9093999da0a7aaa29f9b97928d88827d78706b625f58514b433d3428231d150c04000000000000000000000000000000000000000814212e3b4754616e7a839195a09f9792887f776d675e574d45434f5960636663615e56595857565657585f6975818e9ba8b4c1ccbfb2a5998c7f7266594c3f332619141d29323d464f59616c727f8b9299a2a399928b80796f6a605d555046423b332b23190f050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000810171d21232426252424242522272b2d2e312e2d2a251e170e0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000020d18232e373f49515b626c717e87939fa5afa39f92877e706b60584e443a30251b0f0600000000000000000000000005121f2b3744505b657985929facb8c1bdb0a3978a7d7073808d999a9a9a9a999999999999999999999999999999999999999999999999999999999999999999999a9a9a9a9b9b9b9b8f83766b7784919eaab7c1c1b7aa9d9184776a5e5144372b1e1104000613202c3945525d6875828c8c8b8a898786858382807f7d7c7b79777573716f6d6668666462605d55585653514a4a4745413b3a3738394045474a50535558565e61636669666d6e6f717374767778797a7b7b7c7d7e7e7f7b6e61594f42392e231810070000000000000b1724313e4a5764717e89898888878787868685858585848484848383838383838383838383838383838383838383838383838383838484848585858686868687878788888889897f7265584b3f3225180c000000000000060e151a1f212227242f3a434c5254555555555454545353514a525252515151515050505050505a6774808d9aa7b3c0cdc4b7aa9d9184776a5e51505050505050515151515252524a5053535454545455555554524c443a302522211e1a150e060000000000040e18222b353d454d535556544f46413b3229231d222e3b4855616e7b8894a1aebbcabfb4aaa29f9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9ea1a9b3becabfb3a6998c807366594d4033261a0d00000000000000000000000000000000000c18232e3942535d6468686d6f7174767a7d8083878c90959a9fa2aaa9a29f9a948f8a837d766f6a605d554e4640342e271e160e040000000000000000000000000000000000000714202d3946525e686e7a839095a0a29a938c82796e695f574d45474f54565a5754524c4d4b4a49494a4e5766727f8c99a5b2bfcbbfb2a5988c7f7265594c3f3226191c262f3b444e58606b717e88939fa3ababa39f928d837c746d67615a534d453d352b21160b0000000000000000000000000000000000000000000000000000000000000406070e100e0c0a0806050300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c111517181a1918171818171b1f20222421201e19140d05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121e2a353f49515b636d727e879299a4aba39f918b7e716c61594f463c32281e130900000000000000000000000000030f1b27333f495f6b7885929eabb8c5bdb0a3968a7d7073808d8d8d8d8d8d8d8d8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8d8d8d8d8d8e8e8e8e8e8f83766a7784919daab7c4c3b6aa9d9083776a5d5044372a1d1104000714212d3a4754606d7a8692999897969a9391908f8d8c8a8987868482807d7b79777573716f6d67686562605c545754514c48474244484b5153545c60626568686d70737677797b7c7e7f8183848586868788898a8a8b8b83766b61544b40342823190f0600000000000b1824313e4b5764717e8a9695959494939992929292919191919090909090909090909090909090909090909090909090909090909090919191929292939a93949494959595968b7e7164584b3e3125180b00000000000000030a0f1215151d2935414c565d606262626161616060605c5f5f5f5f5e5e5e5d5d5d5d5c5c5c5c6774808d9aa7b3c0cdc4b7aa9d9184776a5e5c5c5c5c5c5d5d5d5e5e5e5e5f5f5f5c606060616161616262615e564c41362a1e14120e09030000000000000a15202a343d474f575f61636059524c443e342f27222e3b4855616e7b8894a1aebbc8bbafa49a93929292929292929292929292929292929292929292929292929292929292929399a4afbbc7bfb3a6998c807366594d4033261a0d000000000000000000000000000000000007121c2730414b5359565d60626567676d7073767b7f83888d92989fa2aaaba69f9c95908a827c746d67605851454039302820160e04000000000000000000000000000000000005111e2a36414d565e686e7a839095a0a49f938f847b6e695f574e464448494d4a474641403f3d3c3c3f4b5865727e8b98a5b1becbbfb2a5988c7f7265594c3f322617222d38424d56606a707d87929aa4afb5b5aea49d9590878079706c615e574f473d33271c1004000000000000000000000000000000000000000000000000000001070c1013141b1d1b19171513120f0b060705010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005080a0b0d0c0b0a0b060b0f121315171414110d08020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a16222f3b46515b636d727f879299a3aaa299928b7f726c625a50473d342a20160c0100000000000000000000000000000b17222d45515e6b7884919eabb7c4bdb0a3968a7d706f7d81818080808080808080807f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f8080808080818181818182827f726a7784909daab7c3c3b6a99d9083766a5d5043372a1d1004000a1724313d4a5764707d8a92979597989a9b9d9d9b9a9897959992908e8c8a88868482807e7c7a7775726f6d666664605d5555534e4f54555d6064666d6f7274777a7d8082848687898b8c8e8f91929299949596969798958a7d70665c51453e352b21180e05000000000916222f3c4955626f7c8895a2a1a1a0a0a39f9f9f9e9e9e9e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9e9e9e9f9f9fa4a0a0a1a1a1a2a296897c706356493d3023160a00000000000000000003060813202c3945525d686d6f6f6e6e6e6e6d6d6d666c6c6c6b6b6b6a6a6a6a69696969696974808d9aa7b3c0cdc4b7aa9d9184776a696969696969696a6a6a6b6b6b6b6c6c666d6d6d6d6e6e6e6f6f6d685e5246392d2013070200000000000000030f1b26313c464f5960696e706b615e564f454039312a2e3b4854616e7b8794a1aebac6b9ac9f93888686868686868686868686868686868686868686868686868686868686868687939facb9c6bfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000b151e2f3941484d4c52545658555d606366696e72777c80868d92989fa3ababa7a09d948f8780796f6a635b514b423a322820160d0300000000000000000000000000000000020e1925303b444d565e686d7a839096a1a69e9691847b6e695f584e463c3d403d3a393630323130323f4b5865727e8b98a5b1becbbeb2a5988b7f7265584c3f32252028333f4a545e686f7c869299a3acb6c0bfbbaea79f99928d847d756e6960594f44382c20130700000000000000000000000000000000000000000000000000030b12181c1f20282a28262321201f1b171413110d080604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030506080a0807050100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1825323e4b57636d727f8b9399a3a9a19892877f726d635a50483e352b22180e04000000000000000000000000000000061e2b3845515e6b7884919eabb7c4bdb0a3968a7d706b6f74747474737373737373737373737373737373737373737373737373737373737373737373737373737474747474757575726d6a7784909daab7c3c3b6a99d9083766a5d5043372a1d1004000815222f3b4855626e7c838587888a8b8d8f90929796989b9d9f9f9d9b99979992918f8d8a888684827f7c797673706d6765625f57596063676d7175797c7e8184878a8d8f9192999697999b9c9e9e9fa3aba2a2a3a4a79d9083796d605a50473d332a20170c030000000a1723303d4a5663707d8996a0a0a49f9f9e9e9e9d9d9c9c9c9b9b9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9ea1a9aaaaaaaaaaaaaba39f9c9c9d9d9e9e9fa3aba1a1978a7d7164574a3e3124170b00000000000000000000000714212d3a4754606d7a7c7b7b7b7b7a7a7a79797979787878777777777676767676767676808d9aa7b3c0cdc4b7aa9d918477767676767676767677777777787878797979797a7a7a7a7b7b7b7c7a6d6154473a2e211407000000000000000006121f2b37434e58606b707b7d756e686159514b433c332e3b4754616e7a8794a1adbac1b4a89b8e81797979797979797979797979797979797979797979797979797979797979797e8b98a4b1bebfb3a6998c807366594d4033261a0d000000000000000000000000000000000000030c1d272f373c3a414547494b4b515356575e61656a6f747a80858d92999fa7aeaca69f9a938d847c736d605c544c443a32281f150c030000000000000000000000000000000008141f29323b444c565e686e7a849198a2a8a09691847b6e6a5f584e463c32302e2d2a25252425323f4b5865727e8b98a5b1becbbeb1a5988b7e7265584b3f322528323a44505b666e7a859298a2abb5bec7cbc0b9b1aba39f96918a827b706b6054483c2f221609000000000000000000000000000000000000000000000000030d151d23292c2d35363432302e2d2b272221201d191313100c070401000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c919fa4a69e9691867d716d635b51483f362c2319100600000000000000000000000000000005121e2b3845515e6b7884919eabb7c4bdb0a3968a7d7063636767676767676666666666666666666666666666666666666666666666666666666666666666666667676767686868686865626a7784909daab7c3c3b6a99d9083766a5d5043372a1d1004000814212e3a47535f6a6e77787a7b7d7f8082838587898c8e909299989a9d9fa39f9d9b99979993918e8b898583807d7a76726e6a67666b7075797d8185888b8e919696999c9e9fa3aba4a6a7a9aaabacafb5aeafb0b1aca0958d80736c61594f453c32291e150b0000000c1926333f4c5966727f8c9494939993929291919090908f8f8e8e8e8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d9197a1adb6b6b6b7aea399928f90909191929299939494958c7f7266594c3f3326190c00000000000000000000020f1c2835424f5b68758188888888878787868686868585858484848483838383838383838384919eabb7c4d1c5b8ac9f9286828383838383838383838484848485858586868686878787878888888276695d5043362a1d1003000000000000000815212e3a47535f6a707d8689827a706b605c554e463e353a4754616d7a8794a0adbac1b4a89b8e81756c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c717e8b98a4b1bebfb3a6998c807366594d4033261a0d000000000000000000000000000000000000000b151d252b302f35393a3c3e4045474a4d5254585f62686d737a808790959fa3abb0aca49f9691877f756d665d564c443a31271e150a00000000000000000000000000000000020d172029323b444c565e686f7c86929fa4a8a19691857c6f6a5f584e443b3127201d19181825323f4b5865727e8b98a5b1becbbeb1a4988b7e7165584b3e32242f3a444e58606c78828f97a1aab4bdc6d0d7cbc3bdb5afa8a19e948f867d7063564a3d3023170a0000000000000000000000000000000000000000000000010b151f272f34383a4143413f3d3b3937332d2e2d2924201f1c1813110d080100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105070708090a09080706040000000000000000000000000000000000000000000000000000000000000000000504030101000001020203050101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1b2734414e5a6774818d98a2a29f948f847c706b625a51493f362d231a11070000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4bdb0a3968a7d7063606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606060606a7784909daab7c3c3b6a99d9083766a5d5043372a1d10040006121f2b37434e585f626a686d6f7072737577787a7d7f818486888b8d9092999a9d9fa4aba49f9e9b989892908d8a86837f7b777472777c81868a8e9297989b9ea0a8a6a9aaacaeb5b1b2b4b6b7b8b9bbc0bbbcbdbcb1a79f93887e716b60574d443b30271c120700000d192633404c5966737f8887878786868585858484838383828281818181818181818181818181818181818181818185919eabb8c3c3b9ac9f9286828383848485868687878888897f7366594c403326190d00000000000000000000000d192633404c5966737f8c95959494949393939992929292919191909090908f8f8f8f8f8f9196a1adb9c5d2c6baaea298928f8f8f8f8f8f8f8f90909091919191929292939a939394949494958d8174675a4e4134271b0e01000000000000000915222f3c4855626f7c8692938f857d746d675f584f473f3a4754606d7a8793a0adbac1b4a89b8e8175685f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f65717e8b98a4b1bebfb2a6998c7f7366594c403326190d00000000000000000000000000000000000000030b131a201e24292c2d2f2f35393a3d4246484e53565e61686d737c838b9299a1a9b1afa8a099928c81786d685d564c433930261c110600000000000000000000000000000000050e172029323a444c56606a717e8a929ca5a8a19791857c6f6a5f564c43392f261b11081825323f4b5865727e8b98a5b1becabeb1a4978b7e7164584b3e312935414c56606a727f8c949fa9b3bcc6cfd8d6ccc3beb6afa9a19e96918b8174675b4e4134281b0e000000000000000000000000000000000000000000000007121d2731394045474e504e4c4a4846443f3d3a3935302d2c2823201d19130f0a040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002050708090a0b0b0a09070604000000000000000000000000000000000000000000000000000000040607080d11131415161616151413100c07060200000000000000000000000000000000000000000000000000020608081211100e0d0d0d0d0e0f10120e0d0b0803000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b86929998928b827b6f6a615950483f372e241b1108000000000000000000000000000000000005121f2b3845525e6b7885919eabb8c4bdb0a3968a7d706d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d7784909daab7c3c3b7aa9d9084776a5d5144372a1e110400020f1a26313c464e5355565d6062646567686a686d70727577797c7e8083868a8d9093999a9da0a7a8aaa29f9c9999928f8c8884807f84898e92989b9fa2a9a7aaacb2b3b5b7b9bbbfbab9bfbbb9b8b8b8b8b8b7b7b7b8afa49a92867d6f695f564c42392e23180c00000613202d394653606c777b7b7a7a797979787877777776767575757474747474747474747474747474747474747475828f9ca8b5c2c5b9ac9f928678767777787879797a7a7b7c7c796d6053463a2d20130700000000000000000000000b1824313e4b5764717e8a97a1a1a1a1a0a0a0a39f9f9f9e9e9e9d9d9d9d9c9c9c9c9c9c9c9ea1a8b2bdc9d5cabfb4aaa29f9c9c9c9c9c9c9c9c9c9d9d9d9e9e9e9e9f9f9fa4a0a0a0a1a1a1988c7f7265594c3f3226190c0000000000000000101d2a3643505d69768390989e97928a80796e6a615951443f4754606d7a8793a0adbac1b4a89b8e8175685e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e65717e8b98a4b1bebfb2a6998c7f7366594c403326190d000000000000000000000000000000000000000001090f1413191d20212324292c2d30363a3c43474c52565d606a6f777f8791969fa7b0b2aba39f938e827a6d685d554b42382e23170e0500000000000000000000000000000000050e172029323b444e58616c73808c939ea8a9a19792857c6f685e554b41382d22170e1825323f4b5865727e8b98a5b1becabdb1a4978a7e7164574b3e31313a45525d686f7c87929fa6b0bbc5ced7d0cac0bab2aca49f97928b847e786d6053463a2d20130700000000000000000000000000000000000000000000000c18232f39434b51535b5d5b5956545350494a4746413d3a38342e2c29241e1b16100c0701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507090e1214151617181717151313100c070401000000000000000000000000000000000000000004070c10131317191d20212223232322201f1d1814120f090300000000000000000000000000000000000000000003090e1214151f1e1c1b1a1a191a1b1c1d1f1b1a18140f080100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3a47535f69717e878f8d867e766e695f584f473f362e251c120900000000000000000000000000000000000005121f2b3845525e6b7885919eabb8c4bdb0a3978a7e797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797979797883909daab7c3c4b7aa9d9184776a5e5144372b1e110400000a15202a343c43474e555c60605b545a5c565e61636568676d6f7174767a7d8083868a8d9195999da0a7aaa9aba39f9c9896918d8c91969b9fa2aaabadb3b4b7b5b3b2b1b1b0afaeadacb5aeacacabababababababababaca39892857b6e685e544a4034281c10040005121f2b3744505b656c6e6e6d6d6d666c6b6b6b6a6a69696968686767676767676767676767676767676767676774818d9aa7b4c0c7bbafa399877a6e6a6a6b6b666d6d6e6e6f6f6d665c5044382c1f120600000000000000000001070c1825313e4b5864717e8b97a3a2a2a1a0a39f9f9e9e9e9e9d9d9d9d9d9c9c9c9c9c9c9c9c9ea1a8b2bdc9d5cabfb4aaa29f9c9c9c9c9c9c9c9c9c9d9d9e9e9f9fa3a0a0a1a1a2a2a3a3a4a4988b7e7265584b3f3225180c00000000000000000b1825313e4b5864717e879298a19e928d837c706b625b50494753606d7a8693a0adb9c1b4a89b8e81756b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b717e8b98a4b1bebfb2a6998c7f7366594c403326190d000000000000000000000000000000000000000001020301080d11131416181d2020252a2d31373a41464c52585f656c727c8490959fa6b0b5afa59e9490837a6d675d544a3f342820170d0200000000000000000000000000000000050e172029323c46505a606c77818f96a1ada9a19791847a6e675d53493f332720161825323f4b5865727e8b98a5b1becabdb1a4978a7e7164574b3e2f3a43505a606d7a849199a3afb8c2cdd5cec5bebaaea8a09a938d857f79716d665c5044382c1f12060000000000000000000000000000000000000000000004101c2934404b555c60686967656361605b535754524c4a4645403a39352f2c271f1c18120c0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000004090e1214151a1e2021232424242422201f1c1813110d070100000000000000000000000000000000070c1012181c1f2023252a2d2e2f2f302f2e2d2c2924211f1a150e0902000000000000000000000000000000000000060e151a1e21222b2b29282726262728292a2c272724201a130b020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121e2b37424d57616c717d82807b726d615e564e463e352d241c130a0000000000000000000000000000000000000005121f2c3845525f6b7885929eabb8bebeb2a59a908a86868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686869095a0acb8c3c4b7aa9e9184776b5e5144382b1e06000000030e18222b37424e575f676d6c6665615e5654545659555c60626567676d7073777a7d8084888c9195999ea0a8aeaca9a8a09e9a999da0a8acaeb4b8bab6afaca8a7a6a5a4a3a2a1a0a0a0a39f9f9f9e9e9e9e9e9e9e9e9e9e9e9791847a6e665c5144382c1f120600030f1b27333f49535b6062616160605c5f5f5e5e5d5d5d5c5c5b5b5b5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a66727f8c99a5b2bfcbc0b5ab95887c6f625e5e5f5c606061616262605c544a3f34281c10030000000000000000030b12181d2633404d596673808c979695959494999292929191919190909090908f8f8f8f8f8f8f9196a1adb9c5d2c6baaea298928f8f8f8f8f8f8f8f909091919192929993949495959596969797988d8073675a4d4034271a0d01000000000000000a1724303d4956626c717e869298a29d9590867d726d605b534a53606d7a8693a0adb9c1b4a89b8e81787878787878787878787878787878787878787878787878787878787878787e8b98a4b1bebfb2a6998c7f7366594c403326190d00000000000000000000000000000000000306070e0e0c0a0806050707070d1013141a1e20262b30363a41454e535b606a6f7a8290949fa6b0bbafa69f959082796d665c50443e32291e14080000000000000000000000000000000000050e17202b343e44505b656d7a84919ea5afa9a1969083796d655b50443d32281e1825323f4b5865727e8b98a5b1becabdb0a4978a7d7164574a3e35414c55616c75818e96a1abb5c0cad3cbc3bcb3aea49d969188817a726d67605c544a3f34281c10030000000000000000000000000000000000000000000006131f2c3845515c676d74767472706e6c656663615d565753514b4745413a38322c29231d18120b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002070a0c0d0e0d0b0800070c10141a1e2122252a2d2e30303131302f2d2c2823201d18130c0400000000000000000000000002080e12181c1f23282c2d303036393a3b3c3d3c3b3a39352f2e2b26201a140d0500000000000000000000000000000000060f181f262b2d2e3837363434333334353536383433302b251d140b01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1a26313c45505a616b6f75736e69625b524d443c342c231b120a010000000000000000000000000000000000000005121f2c3845525f6b7885929eabb2b2b2b1aba29a9793939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939da0a7b1b5b6b7b8ab9e9185786b5e52452d22170b000000000814212e3a47535f6a6e797975726d6865605d56535051535558555d606367686d7074777b7f84888c91969fa3abb5b2acaaa7a5aaacb2b8babfc0b6aca49f9b9a99989796959493939399929292929291919191919192929292929083796d6053463a2d20130700000b17222d38414950535554545453514a525251515050504f4f4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e5864717e8b97a4b1bed1bdb0a3978a7d706457514a5053545455555653504a42382e23170c0000000000000000030d151d24292c3643505c6976828b8a8989888887868685858584848484838383838382828282828284919eabb7c4d1c5b8ac9f928682828282828282838383848485858686868787888889898a8a8a8b8b83776a5d5044372a1d1104000000000000000815212d3945505a626c707d869298a2a09892877f746c655c5453606d798693a0acb9c5b8ac9f92868484848484848484848484848484848484848484848484848484848484848485929fabb8c5bfb2a6998c7f7366594c403326190d000000000000000000000000000000060b1012131b1b19171513120f0b060a0906090e12151b1e252a2f353c4149505860686e798290949fa7b1b8b0a79f948f82786d60594f443b3025190b020000000000000000000000000000000000050e192227333f49535d68707d8a939da8b2a89f958f81776c60594f443a30241925323f4b5865727e8b98a5b1becabdb0a3978a7d7064574a3d3945515d67717e8a939ea8b2bdc7d1c9c1b9b1aaa29f928d847d746d67605c55504a42382e23170c0000000000000000000000000000000000000000000004111d2935414b55606d798183817f7d7b797673706d686763605c5554524c48433d38342f28231d150c090300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070e1316191a1b1a17140b12181c1f262a2d2e30363a3b3c3d3e3e3d3c3a38342e2c29241d160d0800000000000000000000050d14191c23282c2e34383a3d4041464748494949484745403b3a37312a251f170f070000000000000000000000000000030e18212a31373a3b45444341404040404142434541403c362f261d1308000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915202a333e48505960636967615e575146423b322a221a110900000000000000000000000000000000000000000006121f2c3945525f6c7885929fa5a5a5a5a5a5a4a4a3a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a6a6a6a7a8a9aaacab9e9285786b5f4a3f33281c0f03000004101c2834404b55626e7c8585827e7a76716d6864605c54524c4b4b515357565d6064676a6e73777c80848a9299a3afbbb9b7b3b2b7b8bdc3c6c8bbafa49a938f8d8c8b8a898887878686868685858585858484848585858585858585867c6f6255483c2f221509000006111b262f383f4446484847474644404545444444434342424241414141414141414141414141414141495663707c8996a3afbcd0beb1a5988b7e7265584b3f4446474748494946443f3830261c110600000000000000010b151f272f35383a414a5663707d7e7d7d7c7b7b7a7a79787878787777777776767676767676767676818d9aa7b4c0cdc4b7aa9e9184777676767676767676777778787879797a7a7b7b7b7c7c7d7d7e7e7f7e7064574a3d3124170a000000000000000005111d29343e48505a616b707d869299a3a299938c80776d665c54606d798693a0acb9c7baaea29892919191919191919191919191919191919191919191919191919191919191919297a2adbac6bfb2a6998c7f7366594c403326190d00000000000000000000000000020a11171c1f202828262421201f1b171a171614100b050a0f13191e24292f383f444e565e676d79829095a0a9b3b9b0a69e948d80736b61564c41362a1d140a000000000000000000000000000000000000071017222d38414c56616b74818e96a1adb1a79e938c7f726b60564c4135292025323f4b5865727e8b98a5b1bec9bdb0a3968a7d7063574a3d434e58606d7a84919ea5afbac4cfc8c0b7afa7a098928a80796f6b605d55514b443f3830261c1106000000000000000000000000000000000000000000000613202c3945515d6773808c908e8c89878583807d7a7774706d6764605d56544f47454039342e271e1a140b0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a12191e2325262726241f151c23282c31363a3b3f424648494a4b4a4a484645403a39352f281f1a120a0100000000000000050e171f252a2e34383a4045464a4d4c5254555656565553514b4847433c363029211911070000000000000000000000000009151f2a333c42474852514f4e4d4d4c4d4e4f50524e4c4841382f251a0f03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030e18212c363e474f54565c5a54524d453f363029201810080000000000000000000000000000000000000000000006121f2b3844505c66788592999998989898989897979797979797969b9ea19e9796969696969696969696979aa2acacacacacacb0a69e9c96969696969da0a7b1aaa29f9996969797979898989999999a9a9b9c9e9fa39f928578665b5044382b1f1206000006131f2c3845515c6775818e928f8b86827e7a75716d66615e56544e46474a4c525457585f62666a6f73777d86929facb2adaba9abb0b8bcc3cac6b9ac9f938682807f7e7e7d7c7b7a7979797979787878787878787878787878787879786f6a5f53473a2e2115080000000a141d262d3337393b3b3a3a3a38342e3838373736363635353434343434343434343434343434343b4855626e7b8895a9b3becac0b3a6998d8073665a4d40383a3a3b3b3c3c3a38342e261e150a000000000000000007121d2731394045474e5054606b707170706f6f6e6d6d676c6b6b6b6b6a6a6a6a6a6969696969696974818e9ba7b4c1cec4b8ab9e9185786b696969696969696a6a6b6b6c666d6d6d6e6e6f6f707071717172706c6155493c3023160a0000000000000000000c17222d363e485059606b707d87929aa4a49f928d81786d665c606d798693a0acb9cabeb4aaa29f9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ea1a8b2bdc9bfb2a6998c7f7366594c403326190d000000000000000000000000020c141c23282b2d343533302e2d2b2722272423201c16100802080d13191d262d333d444c555d676d79839097a1abb5b8b0a69f93887d70685e52463d2f261c110600000000000000000000000000000000000006111b262f3a434f59606d7a84919ea5afafa59f92877d6f685d52463e322825323f4b5865727e8b98a5b1bec9bcb0a396897d7063564a3d47535f6a74808d97a1adb7c1ccccbfb6aea59e9590857e746d676059514c454039342e261e150a00000000000000000000000000000000000000000000000714212d3a4754606d7a86929c9a98969892908d8a8684817d7975716d6863605953514b454039302a261f17110a0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a131c242a2f32333433302b1e272e34383b4246484c4d525456575757575553514b4745403a312c241c130a000000000000020d1720293036394044464b5153565a565e616262636261605d5555534e46423b332b231910060000000000000000000000020e1a26313c454d53555e5e5c5b5a59595a5b5c5d5f5a58534a41362b20140800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f1a242c353d4348494f4d4846423b332a251f170e0700000000000000000000000000000000000000000000000713202d3a4653606d79878c8c8c8c8b8b8b8b8b8b8b8a8a8a8a8a8a8e9397928a8a8a8a8a8a8a8a8a8a8a8a909aa6b2b9b9b9b7aa9e948f8a8a8a8a8a9195a0aba298928c8a8a8a8a8a8b8b8c8c8c8d8d8d8e90919298959386796c605346392d20130600000713202d3a4653606d7985929c9b99928f8b86827d79736e6862605853514a4445474a4e53555a616b6f7c849199a3aba8a19e9c9fa6acb1babec5bbafa49a91857e787271706f6e6d6d6d666c6c6c6b6b6b6b6b6b6b6b6b6b6b6c6c6c6c625f584e43372b1f1206000000020b141b22272b2d2f2e2e2d2d2c28232b2b2a2a2a2929282828272727272727272727272727272d3a4753606d7a8697a2adbac6c1b4a79b8e8174685b4e41352d2d2e2e2f2f2d2c28231c150c0300000000000000000c18242f39434b51535a5c5759606364646362626161605c555f5e5e5e5e5d5d5d5d5d5c5c5c5c5c6875828e9ba8b5c1cec5b8ab9f9285786c5f5c5c5c5c5c5d5d5e5e5e5f5c6060616162626263636464656564615a5044392d20140800000000000000000006101b242d363e474f59616b717e88939fa5a49d938e81786d66606c7986939fb5c0c6baaea29892909090909090909090909090909090909090909090909090909090909090909196a1acb9c5bfb2a6998c7f7366594c403326190d0000000000000000000000000a141e262e34383a41413f3d3b3937332d34302f2c28211a11080001080b141b2227323b434b555d676e7b859299a4afbbbbafa49a92857a6e61594f42382d22170b000000000000000000000000000000000000000a141d28313e45525d68707d8a939eabb5afa39991847a6d615a50443a3024323f4b5865727e8b98a5b1bec9bcb0a396897d7063564a444f59626f7c87929fa9b2bec9c7c0bbada49d938e837b716c605c554f45413a342e28231c150c0300000000000000000000000000000000000000000000000b1825323e4b5865717e8b989fa3abaaa29f9c999a93918d8a85827e7a746f6b65605c55514b423e363128221c140b0400000000000000000000000000000000000000000000000000000000000000000000000000000000000007101c252e353b3f4041403c362f30394044464d535559575e61636364646362605c5553514b433e362e251c1209000000000008141f29323b41464a5153555c60636769686d6e6f706f6e6d6767625f58524d453d352b22180b020000000000000000000006121e2b37424d575f616b6a6967676666676868696b67645c53483c3024180b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008121a232b32383b3c42403b3a3630292119140d0500000000000000000000000000000000000000000000000006121f2b3844505c66717e7f7f7f7f7f7f7e7e7e7e7e7e7d7d7d7d7d818e92857e7d7d7d7d7d7d7d7d7d7d7e8a97a3b0bdc6c2b5a89c8f827d7d7d7d7d839199a39f92857f7d7d7d7d7e7e7e7f7f7f8080818283848587888986786c605346392d20130600000713202d3a4653606d78828990949d9f9c99928f8a847f7a756f6a64605c54504a443f47505a616c717d859196a1a79f9d96918f949da0a7adb3bbc0b6aca197918b837c736d66616060605c5f5f5f5f5f5e5e5e5e5e5e5f5f5f5f5f5f5f55534e463c31261b0f0300000000020a11171b1f2022212121201f1c181f1e1e1d1d1d1c1c1b1b1b1b1b1b1b1b1b1b1b1b1b1b202c3945515d677885929fabb8c5c2b6a99c8f8376695c50432f242121222223201f1c17110a03000000000000000004101d2935404b555d606769636159565857565655555453514b52525151515150505050504f4f4f5c6975828f9ca8b5c2c2c4b9ac9f928679655b504f4f4f5050505151524a5053535455565757565757575858575550483e33281c10000000000000000000000009121b242c353d474f59616c727f8b939da7a59e938e81786d6565798699a4afbbc5b8ab9f92868383838383838383838383838383838383838383838383838383838383838384919eabb7c4bfb2a6998c7f7366594c403326190d000000000000000000000006111c2630383f44464e4e4c4a4846443f41403d3c38332c231a0c030000020a111720293139434b555f69707d87939fa8b2bdb6aca1978f82756b60544a3f33281b1106000000000000000000000000000000000000020b161f2935414c56616b75818e99a3afb5aba1968f82756c61564c413529323f4b5865727e8b98a5b1bec9bcafa396897c706356494854606b76828f99a3afbbc4c7bdb5afa39c928d81796e69615a514b433d352f28231d17110a030000000000000000000000000000000000000000000000010e1b2834414e5b6774818d909299989c9fa3abaca49f9d9a98928e8b86817c77726d67605c545046423b332d261d160d0600000000000000000000000000000000000000000000000000000000000000000000000000000000020b19222e3740474b4d4e4c47413839424a5153575f616569696e6f707171706f6d6765605d55504840372e241b0f05000000020e1925303b444d52545c6064676d707376787a7b7c7c7c7b7a77736e6a615e574f473d342a1d140a000000000000000000000814212d3a47535f696e787776747373737374757678746e64584c4033271a0d01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008101921272c2f3036342e2d2a251f170f09020000000000000000000000000000000000000000000000000003101c28343f4a54626c71737272727272727271717171717170707a85919790837b707070707070707070798693a0acb9c6c0b3a79a8d8074707070707c87929fa2989287817a7271717172727273737374757677797a7b7c7b6e665b5044382b1f1206000006121f2b3844505c666d767d838990959d9f9f9c96918c86817c77716d66605c54504a4f59616c717e869297a1a09d95908a84828991959fa2a9afb5bdb2a9a19e95908780796f6a625b53504a52525252525151515252525252525252524847433c342a20150a00000000000000060b0f1213151514141312100c0711111110100f0f0f0e0e0e0e0e0e0e0e0e0e0e0e101d2935404b556a7784909daab7c3c4b7aa9d9184776a564c4135291d141516161312100c060000000000000000000006131f2c3845515d676d7476706b64605b544f4948484747454045454544444444434343434343505c6976838f9ca9b4b5b6b7b9aea39886796c6053464343434347494d535559555c60626363646362605d5555534d443f3830261c1106000000000000000000000009111a232b343e47505a626d74818e959fa9a59e938e81776c6c7986939facb9c3b6a99c9083777777777777777777777777777777777777777777777777777777777777777e8b98a4b1bebfb2a6998c7f7366594c403326190d00000000000000000000000b17232e38424a50535b5b5957545350494e4d4a48443e352c1e150b00000000060e171f283139434d57606b74808d96a1acb9beb3a99e93897d70665b5044382d22170b00000000000000000000000000000000000000040d19242f3a444f59626e7b87929faab4b2a89e938a7e71685d52453d32323f4b5865727e8b98a5b1bec9bcafa296897c6f635649505a63707d89949fabb5c0c7beb5aba49f918c80786d675f57504540393129241e18120c060000000000000000000000000000000000000000000000000000091623303c4956636f7d808386898c8f92999b9fa2a9aaaaa29f9b98928e89847f79726d66625a534d443f382f281f180f070000000000000000000000000000000000000000000000000000000000000000000000000000000a141d2a3440495257595a58524a41404a545c6064696e7276787b7c7d7e7d7d7c7976726d67615a514940372d21170d03000005111e2a36414d565e61666d7175797d8082858788898989888683807b756e6960594f463c2f261b11060000000000000000000815222e3b4855616e7b8484828180807f80818283858074675a4e4134271b0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070f161b1f2223292721201e1a140d05000000000000000000000000000000000000000000000000000000000b17232e3842505a6264666666656565656565646464646468727f8c97a09590847c726c65636363636d798693a0acb9c6c0b3a79a8d80746763636a727f8c959fa299928e857f796f6b6565666666676768696b686d6e706e695f544a3f33281c0f03000003101c28343f4a545c606b70767d838990959da0a19e99928e89837e79716d66605c5457606b717e879298a29f95918a837e79767d838b92979fa3abb0bbb2ada79f99928d837c726d605d554d45454545454545454545454545454546453c3a37312a22180e0400000000000000000003050608080707070604000005040403030302020101010101010101010101010d18242f434f5c6976828f9ca9b5c2c5b8ac9f928579685d5245392c2013080909070603000000000000000000000006131f2b37434e58606d7981837d77716c666159534d443f3a38342f38383837373737313a404547505d6a7683909da7a8a8a9aaacafa093867a6d6053473d44484e5455575f626569676d6f707070706f6d6767625f57504a42382e23170b050000000000000000000000081119222c353e48515b606d79839097a1aca59d938d80746d7986929facb9c3b6a99d9083766a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a717e8b98a4b1bebfb2a6998c7f7366594c403326190d0000000000000000000003101c28343f4a545c606768666361605b535b5a57554f473e30271c120700000000050d161f28313b454f59606d7984919ea6b0bcbbafa59d9083786c6053493f33271b0f030000000000000000000000000000000000000008131e28323e47535f6974818e98a3aebaafa59e91857a6d60594f4438323f4b5865727e8b98a5b1bec8bcafa295897c6f62564955616c7683909da6b0bdc7c0b6aca499938b7f746c665d554d453e342f271f19130c07000000000000000000000000000000000000000000000000000000000915222f3b4854606b6f74777a7c7f82868a8e92979c9fa6acacaaa29f9b95908b847f79716c615f57504a423a312a211910070000000000000000000000000000000000000000000000000000000000000000000000000006111b262f3c46525b636667645c524444515c666d71767b7f828587898a8a8a8a8886837f79716c635b51493f33291f140900000714202d3946525e686e73797e8285898d8f9297959596959992908d88827b706b60584e41382d22170b0000000000000000000915222f3c4855626f7b88918f8e8d8c8c8d8e8f908f8276695c4f4336291c100300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f1315161c1a1514120e0903000000000000000000000000000000000000000000000000000000000006111c26303e4850565859595959585858585858585759616d7a85929ea7a09691867e786f6b625f606d798693a0acb9c6c0b3a79a8d8074675a58606c7883909da5a39f98928c847d736d6760595a5a5a5b5d565d606263615f574d42382d22170b000000000b17232e38424a505960636b70767d838a90959fa2a39f9b95908b847e78716d66605f696f7d8792999f97928b837d76716d6b70787f858d92999fa6afb5b9b1aba39f9590877f756d675e574e463d35383838383838383838393939392f2e2b2620181006000000000000000000000000000000000000000000000000000000000000000000000000000000000000071b2834414e5b6774818e9aa7b4c1c6baaea298877a6d6054473a2d211407000000000000000000000000000000000815222e3b4754606a75818d8f8a837e78706b615f57504a423a322a2b2b2b2b2a2c363e434b5153515d6a7784909a9a9b9c9c9d9fa3a094877a6d615447484f5458606267696e727577797b7c7d7d7c7c7a77736e69605c544a3f342822170b00000000000000000000000008101a232c363f45515c676e7b85929aa4afa59d928b7f727986929facb9c3b6a99d9083766a5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d65717e8b98a4b1bebfb2a6998c7f7366594c403326190d0000000000000000000006121f2b3844505c666d747472706e6c656967676361594f42392e23180c0000000000040d161f29333d45515d67707d8a949fabb7c1b8aca0958b7e71655b5044372b1f140900000000000000000000000000000000000000010c16202b37424d57616e7b86929faab4b9ada1978e81746b6054483e303f4b5865727e8b98a5b1bec8bcafa295897c6f62564f5964707d8a959fabb8c2bfbbafa49a93877e726d605b544b433c3329231d150d0801000000000000000000000000000000000000000000000000000000000007131f2c38434f59606367676d6f72767a7e81858a90949a9fa3aaaeaca7a09d96918b847e766e69605b544b433b332b221910060000000000000000000000000000000000000000000000000000000000000000000000050e17222d38414e58636e73746e64564c4653606d787e83888c8f929796969797969992908b847e726d635b51453b31251a0e02030f1b27333f4953616e7a80848a8f92989a9c9ea1a9a2a3aba39f9d9a948f857d706a5f53493f33271b0f0300000000000000000815212e3b4854616e7b87949c9a9a99999a9b9b9c8f8275695c4f4236291c0f03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030709090f0d0807050200000000000000000000000000000000000000000000000000000000000000000a141e2d363e45494b4c4c4c4c4c4c4b4b4b4b4d57616b75818e97a2ada8a198928b827c766f6a606d798693a0acb9c6c0b3a79a8d8074675a505b666f7c89939eabaaa29f96918780796f6b625b514a4f504c5254555655534d453c2f261c11060000000006111c2630383f444f545960636b70767d838c92989fa6a79f9d96918b847e78706b676e7b8592999f948f857e78706b646060666d727a808790949fa3abb2bab5afa7a099928b81796e695f584f473e352c2b2b2b2b2c2c2c2c2c2c2c22211f1b150e06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfcabfb4aa95887b6f6255483c2f221509000000000000000000000000000000000916232f3c4956626f7c89939c95908a847d756e69605b544c443c342b22191c28333e4850555d605d556a77838d8d8e8e8f8f9192999794877a6e61544f545960636a6f74777b7f82848688898a8a89888684807b736d665c50443e33281c100200000000000000000000000008111a242834404b555e69707d88939fa8aea49f92877d7986929facb9c3b6aa9d9083776a65656565656565656565656565656565656565656565656565656565717e8b98a4b1bebfb2a6998c7f7366594c403326190d000000000000000000000713202d3a4653606d7881817f7d7b7977767473706b61544a4034281c10040000000000040d17212935404b55616b7683909ca7b1bcbcb1a79d9184786c6053463b31251a0e0200000000000000000000000000000000000000040d1a26313c46525e6973808d98a2aebab3a99d93897d6f635a5042383f4b5865727e8b98a5b1bec8bbafa295887c6f625554606b7783909da7b1bcbfb6ada39f93887e716c635b504a4239312a2118120b0300000000000000000000000000000000000000000000000000000000000000030f1b27323d474f5456555d606365686d7175797e83888d92989fa3abb0aca8a19e96918b827b726c665d554d453d342b22180f06000000000000000000000000000000000000000000000000000000000000000000050f172027333f49535f6a73808074685e524f5c6976828a9095989c9ea1a9a3a4a4aba39f9c96918a7f726d62574d42362a1e130805121f2b3744505b6578848c91979b9fa2aaa8a9abacafb5b5afacaaa69e9792867c6f655b5044372b1f120500000000000000000814212e3b4754616e7a8794a1a7a6a6a6a6a7a89b8f8275685c4f4235291c0f02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c1b242d34393d3e403f3f3f3f3f3f3f424b555e69707d8a939ea9b3b2aaa29f949089827c6f626d7a8693a0adb9c6c0b4a79a8d8174675a4a54606a75818e99a3aeaea8a099938d847c726d605c544b4341454748494847423c332a1d140a0000000000000a141e262e343d44484f545961636b70787f868f949ea1a9a8a19e96918b837d756e7983919799928c827b726d66615953545c60686d747c838c9299a1a8b0b8bbb1aba39f938e837b6f6a60594f473e352b1e141f1f1f1f1f1f1f1f1515120f0a0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1bed0bcb0a396897d7063564a3d3023170a000000000000000000000000000000000916232f3c4956626f7c8791969e9d96918a827b736c665d564e463d342b22212d3945505a61676d676b6a707e8080818182838486888a8c877b6e61545960636b6f767c8084888c8f919299969697969a93918d8780786d605a5044392d1e130800000000000000000000000000081218232e39434d57606b74818d96a1acafa39992857b86929facb8c3b7aa9d9084777272727272727272727272727272727272727272727272727272727272727e8b98a4b1bebfb2a6998c7f7366594c403326190d000000000000000000000915222f3c4855626f7b888e8c8a8785848281807d70665c5144382c1f1206000000000000060f18242f39434f5963707d89959fabb8c3b8aca096897d7063574d42362a1e120500000000000000000000000000000000000000000915202a36424d57616d7a85929fabb8bbafa59d9083766c61544a3f3f4b5865727e8b98a5b1bec8bbaea295887b6f62555863707d89959fabb9c1b7aea49b918b7f726c625a51443f382f271f180f07010000000000000000000000000000000000000000000000000000000000000000000a16212b353d4348494b515356565d6064676d71767b80868e92999fa6aeb2ada8a19e948f867f786d675f574e463d342a22180e0400000000000000000000000000000000000000000000000000000000000000050f172129323b44505b656f7c87877a6e61555a5c6976838f9c9e9c9a99999a9b9fa2a9aeaca9a19e918b7f72695e53463a3024190d0b13202d394653606c7985929ea1a19e9d9c9b9c9e9fa4abacb2b9b6b0a9a2989083786c605346392d20130600000000000000000714212e3a4754616d7a8794a0adb3b3b2b3b4a89b8e8175685b4e4235281b0f020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b22292d303133333332323039424a545d676e7b85929ea5afbbb9b3aea69f9c948f8275686d7a8793a0adbac6c0b4a79a8d8174675a4e4e58616e7b86929facb9b2aba49f9691877f746d665d554b40393a3b3d3b3a37312a21180b02000000000000020c141c232833383d44484f555961666d727b828a92979ea5aca8a09e959089827b828f959792877f776e69605c544f4f4a50565e616a6f787f8791969fa6afb7bdb5aea59e9590857c6f6b61594f473d30261c110612121212131209080603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1723303d4a5663707d8996a3b0bcd0beb1a4988b7e7165584b3e3225180b000000000000000000000000000000000915222e3b4854606a6f7c848e939ca09e948f867f786d685f584e463d342a23303c4955616c717a797876757576777879757677797b7e8080786d605a616b70767c82888d9196989c9e9fa3aba3a3aca49f9e99928d81746c6155493a3025190d010000000000000000000000000007121d27303b454f59606d7984919ea5afaba197908486929facb9c5b8ab9e92857f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f818e9ba8b5c1bfb2a6998c7f7366594c403326190d000000000000000000000815222f3b4855626e7b889599969892918f8e8d86796d6053463a2d2013070000000000000007121d28313e4854606b7683909dabb5c0bdb2a89b8f8275695e53463a2d2114080000000000000000000000000000000000000000030e1a25303b46525e6874808d9aa6b0bbb8ab9f958a7d70665c50443f4b5865727e8b98a5b1bec8bbaea295887b6f62555f6a76828f9ca7b1bcb9afa59c928b7f726d625a50483f332d261d150d060000000000000000000000000000000000000000000000000000000000000000000000040f19232b32383b3c404547494c5254555c60646a6e747b81878f949fa2aab1b2aca69f98928c82796e6960584e463c342a20160b020000000000000000000000000000000000000000000000000000000000030d172129333b444e58606c7883908b7e71646267616673808d97928f8d8c8c8d8e92979fa2aab2ada39f92867b6e61564c4135291d1818181f2b3744505b6576828f99969791908f8f909193999ea1a8b2bdbbb3aaa0958a7d7064574a3d3124170a00000000000000000714212d3a4754606d7a8793a0adbabfbfc0b4a79b8e8174685b4e4135281b0e0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000911171d212425262626232e39424a545c666d79839097a1adb9b3adaaa29f98928d847c6e626d7a8794a0adbac7c1b4a79a8e8174675b4e46535f6974818e9ba7b1bdb5afa8a099928b80786d675d5145382d2f302e2d2b261f180f060000000000000000020a111721272c33383d44484f545c60696e767e858e939ea1a9aca7a09d938f868f949691857d726c655e575c5c5c5c5c5c5c5c585f666d737c8490949da5afbcbfbbafa7a09791857d706b61594f42382e23170b00050606060600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915222f3c4855626f7b8895aab4bfcabfb2a6998c7f7366594c403326190d0000000000000000000000000000000007131f2c38434e58606a6f79818c919fa39e98928c827a6f6a60584e463c3329313e4a5764717e868584838282838485867f72676d6f7173736d665c616c717d83898f949a9ea0a8a8aaacafb5b0b0b6afacaba39f938a7d7064564c41362a1e110500000000000000000000000000000b151e29333d45515d67707d89939daab3a9a095909298a3aebac6b9ada197928c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8e939eaab6c3bfb2a6998c7f7366594c403326190d000000000000000000000815212e3b4854616e7b8794a1aaa39f9d9c9a98867a6d6053473a2d20140700000000000000010c161f2c38444f5965727f8b99a3afbbc3b9ac9f93877b6e6154483b3025190d01000000000000000000000000000000000000000009141f2a36414c56626e7b88949fabb7bcb1a79d9184786d60544a3f4b5865727e8b98a5b1bec8bbaea195887b6e6255626f7c88949faab9bab1a79e938c80736d625b51483f3628221c140b030000000000000000000000000000000000000000000000000000000000000000000000000007101921272c2f2f35383a3c4145474b5153575f62696e747b828b92989fa7afb9b0aaa29f948f837b6f6a60584e463c32281d140a000000000000000000000000000000000000000000000000000000000009141f29333b454d565f6a717e8b958e8175696e746d686f7c8888858281807f8082858b9298a2aeb9aea2988e8175685d5245392c252525252527333f495366727f8c8c8987858483828384868a9196a1abb5bfbcb1a79b8e8174685b4e4135281b0e02000000000000000714202d3a4753606d7a8693a0adb9d1ccc1b4a79a8e8174675b4e4134281b0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c1115171819191c2834404a545c666d78818f95a0a9afaca9a19e98928d8680796e6a616e7a8794a1adbac7c1b4a79b8e8174685b4e424d57626f7c88959fabb8b9b7b2aba39f928d82796d6053493f33272322211e1a150e060000000000000000000000060b161c21272c33383e424a50575f616c717a818a9297a0a7afaca59e9a939a9e91847c706b696969696969696969696969696969696b6f7a828e939daab4bfc1b9b1a9a19792867d706b60544a3f34281c1003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8798a2aebac6c1b4a79a8e8174675b4e4134281b0700000000000000000000000000000000030f1b27323d464e5860676d757f8b9299a3a39f948f847c6f6a60584e453b2f313e4b5764717e8a9291908f8e8f90918d8073676062646667605c5464717e8990949c9fa6a4a2a1a0a1a3a8aaafb7c0bbb9b5afa59d908377685e5246392d2013070000000000000000000000000000030c17212935414b55606b74818e98a2aeb1a7a09d9fa3aab4bfc9beb3a9a19e989898989898989898989898989898989898989898989898989898989898989b9ea5afbac6bfb2a6998c7f7366594c403326190d000000000000000000000814212e3b4754616e7a8794a1b4aeacaaa9a39986796d6053463a2d2013070000000000000000040d1c27333d4754616d7a86929facb9c5bbafa4998c7f7265564c41362a1d11050000000000000000000000000000000000000000030d1925303a47535f6a7683909ca9b3beb8aca0968b7e71665c50444b5865727e8b98a5b1bec7bbaea194887b6e615d6774818e9aa6b0bdb2a89f958e81776c605b51493f362d2417110a02000000000000000000000000000000000000000000000000000000000000000000000000000000070f161b1f2224292c2d2f35393a4045464e53575e61696e767e8690959ea5aeb6b4aea69e9590857c6f6a5f584e443a2f261b1106000000000000000000000000000000000000000000000000000000020e1a25303b454d575e686e7c85929e9184786e7b817a6e6a6f7c7b78757473737375797f86929fa6b0b4aa9f92867a6d6054473a323232323131312d3a4753606d79807f7d7a787776757678797d849199a3aebbc3b7aa9d9184776a5e5144372b1e1104000000000000000713202d3a4653606d798693a0b4bfcbcdc0b3a79a8d8074675a4d4134271a0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005080a0b0d121f2c3844515c666d78818f939ea7aca49f9c97928c85807a736d675f616e7b8794a1aebac7c1b4a89b8e8175685b4e424754606a7683909dabb2acaaa7a8a19e9b948e8175655b5044372b1f1514120e090300000000000000000000000000050b10161c21272c30383f444d535a61686d757d8590959ea5afafaca49fa49b8e817975757575757575757575757575757575757575757579818e98a2aebac6c3bbb2a9a29892867d70665c5044382b1f1206000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3945525d687985929facb8c5c2b5a89c8f8275695c4f422f23180c00000000000000000000000000000000000a16212b343d464e555d606d737e87929fa4a69e9691867c6f6a5f574d41382d3d4a5663707d89969e9d9b9b9c9d998d8073665a5557595a5350596673808c999f9f9c999796949495969b9ea5adb5bfc6c0b9ac9f93867a6d6154473a2e211407000000000000000000000000000000050f18242f3a434f59616e7a86929fa9b2b1acaaacaeb4bcc6c9bdb2a9a19e979797979797979797979797979797979797979797979797979797979797979a9da4aeb9c5bfb2a6998c7f7366594c403326190d000000000000000000000714212d3a4754606d7a8793a0b5bab8b7ac9f928679665c5044382b1f12060000000000000000000b16202d3946525e6876828f9caab4bfc0b5ab9c908376685e5246392d20130700000000000000000000000000000000000000000008131e2b37434e5864717e8a97a1adb9bdb2a89e9184786d6053464b5865727e8b98a5b1bec7baaea194877b6e61606d7a85929facb8b4aba1969083796d655b50493f372d241b1206000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f1315181d1f2024292c2e34383c42474d52575f626c717b838e939ca4aeb6bab0a7a09792857c6f6a5f564c41382d22170b04000000000000000000000000000000000000000000000000000005121e2a36424d575e696e7a8491979f938679717e8b847b706b6f6e6a6967666667666d727e8a949faab7aea3988b7f7265584b3f3f3f3e3e3e3e3e3e3e45515d676d7372706d686a696869666d717b87929facb9c5b8ab9f9285786c5f5245392c1f12060000000000000006121f2c3844515c66798699a3aebac7cdc0b3a69a8d8073675a4d4034271a0d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d79828f939ea5a19e9a938f8a857f7a736d68605d55616e7b8894a1aebbbdbdb5a89b8f8275685c4f42434e5864717e8b99a4a8a09e9a9696918f8c8984786c605346392d20130606020000000000000000000000000000000000050b10161c1e262e343b424650565e616b707b838e939fa4abb3afaca99e938e84828282828282828282828282828282828282828282828286929facb8b9bababcb3aaa3989184786d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111d2935414c566a7784919daab7c4c3b7aa9d9084776a554b4034291c100400000000000000000000000000000000040f19222b343d434b515b636c717e8b929ca5a8a09892857c6f695e53493f333c4956626f7c8995a2a9a8a8a9a6998c7f7366594c4b4d4d464a5764717d8a9698928f8c8a89888788898e939ca3adbcc5c8bbafa49a897c6f6356493c302316090000000000000000000000000000000007131d28313d46525e68737f8c96a1adb9b8b7b9babfc6cfc5b9ada196918a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8d929da9b5c2bfb2a6998c7f7366594c403326190d000000000000000000000713202d3a4653606d798699a4afbbc5b8ab9f9285786c5f4a3f34281c100300000000000000000005111e2a36414c5664717e8b98a3aebac5b9ac9f92867a6d6154473a2e211407000000000000000000000000000000000000000000020f1a26313c4653606d7985929eabb8c3b9aca1968a7d7064584e4b5865727e8b98a5b1bec7baaea194877b6e6165717e8b98a2aebaaea39991847a6e675d53493f372d251b12090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000307070c101314191d2023282c31373b42464d535a62696e79818d929ca4aeb7b9b1a9a29792857c6e685e53493f332720150a00000000000000000000000000000000000000000000000000000714202d3a46525e696e7b849196a0a499887b707d8a91857d736d675f605c5459545c606c76828f9ca9b5b4aa9b8e827568564c484b4b4b4b4b4b4b4a4a4a4b555d60676663615e565c5c545c606974818e9ba7b4c1b9ac9f9286796c5f5346392c2013060000000000000004101c2834404a5f6c7986929facb9c5ccc0b3a6998d8073665a4d4033271a0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d798592999d9996918c87827e79736d68615e565155626e7b8895a1aeb0b0b1b2a99c8f8376695c50433c4754616d7a86939f9b96918d8a8784827f7d786d655b5044372b1f1205000000000000000000000000000000000000000000050b0c141c232831363e444c525961696e79818c9399a2a9b2b9afa59e96918f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f9298a2aeacadadadaeaeb4aaa196887b6e6155483b2e22150800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d19242f434f5c6976828f9ca9b5c2c5b8ab9e928578675c5145382c1f13060000000000000000000000000000000000071019222b313a4145515a626c737f8c939ea9aaa29791857b6e655b50443b3b4855626e7b8895a1aeb5b5b2a5998c7f7266594c3f40403a4653606d79848c8986827f7d7c7b7a7b7d818c919ca9b3becac0b6ac978a7d7064574a3d3124170a00000000000000000000000000000000010c161f2a36414c56606d7984919ea8b2bdc3c5c7cbd1d1c4b8ab9e91847d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d808d9aa7b4c0bfb2a6998c7f7366594c403326190d0000000000000000000006131f2c3845515c667986939facb9c5b8ab9e9285786b5f52452e23170b00000000000000000000010d1925303a4754606d7a86929facb8c5bbafa3998b7e7164584b3e2f24180d010000000000000000000000000000000000000000000a151f2c3845515c6773808d9aa8b2bdbdb2a89c8f82766a5f534b5865727e8b98a5b1bec7baada194877a6e616a7683909daab4b0a69f92877c6f685e554b41382d251b12090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000206080811100e080d1113181c1f262b30363c424750575e676d77808d929da5afb9bbb3a9a19791847a6d655b50443c31261b0c03000000000000000000000000000000000000000000000000000815212e3b4854616e7b849196a0a8ab96897c707c8997928880796f6a6d66615a50505a64717e8a97a8b2b7ab9e918478685e535558585858585857575757575757575a5957575757575755535765727f8c98a5b2bfb8ac9f9285796c5f5246392c1f130600000000000000000c18232e46525f6c7985929facb8c5ccbfb2a6998c7f7366594c403326190d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c67707d8791908c8984807b76716d67605d56524c4855626f7b8895a2a3a3a3a4a5a79d9084776a5d51443946525e68768390928e8884807d7a787573706d665c53493f33271b0f030000000000000000000000000000000000000000000000020a11171f262a323a41464f575e676d757f879297a0a8b2b7afa8a09e9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9fa29fa0a0a0a0a0a1a1a2a3a895887b6f6255483c2f2215090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081b2835414e5b6874818e9ba7b4c1c6b9ada197867a6d6053473a2d2014070000000000000000000000000000000000000710191f282f354048505a636d75828f97a2ada9a1979082776c60574d423b4754616e7a8794abb4bfbeb2a5988b7f7265584c3f33343845515c676e7c807d797672716f6e6d6e70757f8c97a2adbac6bdb0a4978a7d7164574a3e3124170b0000000000000000000000000000000000040d1925303b45515d67717e8b96a1adb9c5d0d3d7dcd1c4b7aa9e9184777070707070707070707070707070707070707070707070707070707070717e8b98a4b1bebfb3a6998c807366594d4033261a0d0000000000000000000004101c2834404b5f6c7985929facb8c4b7ab9e9184786b5e5145382b1e0600000000000000000000000813202c3945515d6776828f9ca9b5c2c0b5ab9b8e817468554b4035291d100400000000000000000000000000000000000000000004101c2834404b55626f7c8896a1adb9c4b7ab9f94887c6f62554b5865727e8b98a5b1bec7baada094877a6d626e7b88959fabb2a99e948c7f726a60564c43392f261b1309000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e1214151e1d1b19191819191a1b1a1f252a31373f454d555c656c73808d939ea7b1bcbbb3a9a1968f82776c60584e43372b1e150a000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a949fa8b2a4988b7e717b88959a938d847c6f79716c625a5054606d7a8796a1adb9aca196877a6e615f6265656565646464646464646464646464646464646464615f5764717e8b97a4b1beb8ab9f9285786c5f5245392c1f12060000000000000000071f2c3945525f6c7885929fabb8c5ccbfb2a5998c7f7266594c3f3326190c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2934404b55606b707d8483807c78736e6964605d55524c46414955626f7c88959696969797989a9c9184786b5e493f36414c5666737f8b86817c7774706e68686663605c544a41382d22170b00000000000000000000000000000000000000000000000008111a21272c2f3030363e454d555d606d727d859196a0a8b1b9b2acaaa8a8a8a49a9392929292929292929292929292929292929299939393939394949595969695887b6f6255483c2f221a1108000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3bfc9beb3a994887b6e6155483b2e22150800000000000000000000000000000000000000070d161d2429363f48525b616e7b85929fa8b2a99f948b7f72695e52463a4753606d7a8699a3aebabeb1a5988b7e7265584b3f322834404b555f6a6e73706d67666463616162636d7a85929fabb8c5bdb0a3978a7d7064574a3d3124170a00000000000000000000000000000000000008141e2935404b55606d7984919eaab4becad6e4ded1c4b7ab9e9184786b64646464646464646464646464646464646464646464646464646465717e8b98a4b1bebfb3a6998c807366594d4033261a0d00000000000000000000000c18232e45525f6b7885929eabb8c4b7aa9d9184776a5e5144372b1e11050505050505050505050504111d2935414c556673808d99a6b3c0c3b7aa9d908477675d5145392c201306000000000000000000000000000000000000000000000c18232e3947535f6a7884919eabb7c4bbb0a69a8e8174675d515865727e8b98a5b1bec7baada094877a6d6673808d99a7b1aca1978f82776c60584e443b31271d140a0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000060e151a1e21222b2927262525252627282a27261f262b333b434b535b606c77818e959faab4bfbbb2a89e948c7f736a5f53473e30261c11060000000000000000000000000000000000000000000000000916232f3c4855616b76829099a3aea6998c80737a8794a49f968c7f7b857e716c605b545d687884919eabb7b2a895887c6f626a6f727271717171717171717171717171717171717171706e695f64717e8a97a4b1bdb8ab9e9285786b5f5245382c1f12050000000000000005121f2c3845525f6b7885929eabb8c5cbbfb2a5988c7f7265594c3f3226190c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232f39434f59606b707776736f6c66615f5753514b45413a3b4855616e7b88898989898a8a8c8e90928579655b5044373a4754616d7a7e7b756f6a6763615e56595653514a42392f261b1106000000000000000000000000000000000000000000000005101a232c33383c3d41414140434b515b636b707b849196a0a7b1bab9b7b5b5ac9f938887868686868686868686868686868686868686868686868787878888898a8a877b6e6154473b332c231a10050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1becfbcafa296897c6f6356493c302316090000000000000000000000000000000000000000040c1318242d364046525e68717e8b96a1acb0a69f92857b6e61554b4145515c677986929facb9beb1a4988b7e7165584b3e322f3a434c51585f626663605d5557565554555d677683909da9b6c3bdb0a3978a7d7064574a3d3124170a000000000000000000000000000000000000020c18242f3944505c66727f8c98a2aebac7d2ddded1c4b8ab9e9185786b63636363636363636363636363636363636363636363636363636365717e8b98a4b1bec0b3a69a8d8073675a4d4034271a0d0100000000000000000000071e2b3845515e6b7884919eabb7c3b7aa9d9084776a5d5144372a1e121212121212121212121212120d19242f3e4a5764717d8a97aab4bec6b9ac9f93867a6d6053473a2d2014070000000000000000000000000000000000000000000007121d2b37434e586774818d9aaab4bfc2b8ac9f92867a6d60535865727e8b98a5b1bec6baada093877a6d6a7784919daaafa49a91857a6d655b50463c32291f150b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f1820262b2e2f38363433323232333435373433302b212931394149505b656d78839098a2aebac2bab0a69f92877c6f625a5042382e23170c0000000000000000000000000000000000000000000000000714202c38444f59626e7c87929fa9a79a8d8074798693a0a8978a7d7c89877e726c665e566975828f9ca8b5b0a396897d70636f7c7e7e7e7e7e7e7e7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7b6e6664717e8a97a4b1bdb8ab9e9185786b5e5245382b1f12050000000000000005121e2b3845515e6b7884919eabb7c4cbbeb2a5988b7f7265584c3f3225190c000000000000000000000000000000000000000000000000000000040607070604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d27313d474f5960636a6a6663605b54534d47454039352f3a46535f69767b7c7c7c7d7d7e7f81838585786c605346393946525e686d726e696260585754524c4c4a4644403930271d140a0000000000000000000000000000000000000000000000000b16212c353d44484a4e4e4d4d4d4c4c515960696e7b849095a0a8b2bbc4c2b8ab9f92857c7979797979797979797979797979797979797979797a7a7a7b7b7c7c7d7d7e71685e5248443e352c21160b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a96a3b0bdd0bdb1a4978a7e7164574b3e3124180b0000000000000000000000000000000000000000000107121b242a36414d56606d7984919eaab4aea2988d8074675d5145404b556c7885929fabb8bdb1a4978a7e7164574b3e3135414c555d6061605b545b6060626260584e556875828f9ba8b5c2bdb0a3968a7d7063574a3d3024170a0000000000000000000000000000000000000007121d28343f4a54606d7a85929facb6c0ccd8ded1c5b8ab9e9285787070707070707070707070707070707070707070707070707070707070717e8b98a4b1bec0b3a79a8d8074675a4d4134271a0e0100000000000000000005111e2b3844515e6b7784919eaab7c3b6a99d9083766a5d5043372a1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f222e3b4855616e7b8898a2aebac6bbafa499897c6f6356493c3023160900000000000000000000000000000000000000000000000f1b26323d4a5763707d8a98a2aebac7baaea2988a7e7164555865727e8b98a5b1bec6b9ada093867a6d6e7b8896a0aca99f93887d70685e53493f342b20170d0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000030e18212a31373a3b4443413f3f3e3f40414244403f3b362e26272f383f49535c666e7b86929fa6b0bcc2bbafa3999082766c61544a3f34281c1003000000000000000000000000000000000000000000000004101c28333e47535f6a73808d97a1a79a8d8174798699a3a399887b7d8993887f786e68606774818e9aa7b4b1a4978a7e716976828b8b8b8b8b8b8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a86796d64717e8a97a4b1bdb7aa9e9184776b5e5144382b1e11050000000000000005111e2b3844515e6b7784919eaab7c4cbbeb2a5988b7f7265584c3f3225190c00000000000000000000000000000000000000000000000001070c1013141312100c07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b151f2b353d474f54565e5d595653504a46423b39352f292a36424d575f696e6f6f7070707172747678786c655b50443736414c565e6165615e57544e4a474641403d3a38342e271e150b02000000000000000000000000000000000000000000000004101c27333d474f55565a5a5a5a5a59595958575f696e7a839096a0a9b3bec6baada29792867d716c6c6c6c6c6c6c6c6c6c6c6c6c6c6c656c6d6d6d6d6d6e6e6f707071716c615657554f473e33281c100400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c8895aab4bfcbbfb2a5988c7f7265594c3f3226190c000000000000000000000000000000000000000000000009121925303b44505c66727f8b98a3aeb4aa9f92857a6d60544745525f6b7885929eabb8bdb0a4978a7d7164574a3e313945515d676d6e6c666b656c6d6f6f6a60545b6874818e9ba7b4c1bcb0a396897d7063564a3d3023170a00000000000000000000000000000000000000010c17232e3845515d6773808d9aa4afbbc8d4dfd2c5b8ac9f92867d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d808d9aa7b3c0c0b4a79a8d8174675a4e4134271b0e0100000000000000000004111e2a3744515d6a7784909daab7c2b6a99c8f8376695c5043362c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2d394653606c7985929fabb8c5c0b5ab988b7f7265584c3f3225190c00000000000000000000000000000000000000000000000a14202d3a4753606d7986929facb8c5bfb4aa9b8f8275675d5865727e8b98a5b1bec6b9ada093867a6d737f8c99a8ada1978e81746b60564c41382d22190e0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915202a333c42474851504e4c4c4b4c4c4d4e504d4c4740382e1d262d38414b545f69717e8b949fabb7c1c0b5ab9f948a7e71665c5044382c1f160b0000000000000000000000000000000000000000000000000b16212b37434e58606d7985919ea79b8e81747986929f9f9286797d8a9a938c827a6e6d6673808d99a6b3b2a5988b7f726a768390989898979797979797979797979797979797979798867a6d64717e8a97a4b1bdb7aa9d9184776a5e5144372b1e11040000000000000004111e2b3744515e6a7784919daab7c4cbbeb2a5988b7f7265584c3f3225190c0000000000000000000000000000000000000000000000030b12181c1f20201f1c18120b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d1a232b353d44484951504d4946443f3836312c29241d26313b454d575f61636363636464656769666c665b53493f33303a444c52545854524d47433d3b393630302d2c28231c150c030000000000000000000000000000000000000000000000000714202c38444f596163676767676666666565656464686e7a849197a1adb9c6beb3a9a29892877e716c6464646464646464646464646464646464646464656565666666676767676361594f44382c20140700000000000000000000000000000000000000000000000000010406070909080807070604000005050404040403030303030303030714212e3a4754616d7a8798a3aebac7c0b3a79a8d8074675a4d4134271a0600000000000000000000000000000000000000000001050908141f28343f4a54606d7a86929facb8aea2988b7f7265564c41515e6b7884919eabb7bdb0a3968a7d7063574a3d303a4754606d7a7b79787778797a7c7c6f665c5b6874818e9ba7b4c1bcafa396897c706356493d3023160a00000000000000000000000000000004080a0a0a06111c2935414c55616e7b87939facb9c6d1d3cac1baaea29892898989898989898989898989898989898989898989898989898989898989898d929da9b4b5b5b4a79a8e8174675b4e4134281b0e0705020000000000000004111d2a3744505d6a7783909daab6c2b5a99c8f8276695c4f4338383838383838383838383838383838383838383744505b657683909ca9b6c3c0b3a79a8d8074675a4d4134271a07000000000000000000000000000000000000000000000006131f2c3845515d6775828f9ca8b5c2c5b8ac9f92867a6d605865727e8b98a5b1bec8bbafa49a86796d7783909daaa69e92857a6d61594f443a2f261b10080100000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1a26313c454e53555e5c5a59585858595a5b5d5a58524a40362b1b262f39424d57626c7683909ca6b0bbc7bdb0a69e9184786d6053463d32271b0f000000000000000000000000000000000000000000000000050f1a26313c45515d6773808d9aa79b8e82757985929f9d9184777e8a979f948d8179796d727f8c98a5b2b2a6998c7f736976838f9ca4a4a4a4a49c9999999999999ea0a8a4a4a4a39986796c64717e8a97a4b1bdb7aa9d9084776a5d5144372a1e11040000000000000004111e2a3744515d6a7784909daab7c3cbbeb1a5988b7e7265584b3f3225180c00000000000000000000000000000000000000000000050d151d23292c2d2d2c28231c150c03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008111a232b32383b3d4443403c3938332d2a261f1d18141f2a333c454d5355565656565757595b545b605b544a41382d28323a4146474b4846423b37322e2d2a2523201f1c18120b03000000000000000000000000000000000000000000000000000916232f3c4855616b707474747373737272727271717171717b85929eabb8c5c5bbb3aaa29992877e73717171717171717171717171717171717171717172727272737373747473706b6155483c2f231609000000000000000000000000000000000000000000000001070d11131416151514141413100c0712111111111010101010101010101013202d3946525e687985929facb8c5c1b5a89b8e8275685b4f422d22170b0000000000000000000000000000000000000000060c1115171817232e3845515d6775828f9ca8b5b4aa9d908377685e5246515e6b7784919eaab7bcb0a396897d7063564a3d36434f5c697682878685848586878986796d605b6874818e9ba7b4c1bcafa296897c6f6356493c3023160900000000000000000000000000050b1014161717161619242f3a46535f697683909cabb5c0cbccc1b8b0aaaaa29f969696969696969696969696969696969696969696969696969696969696969a9da4a7a7a8a9a9a89b8e8175685b4e4235281b1514120e0903000000000004111d2a3744505d6a7783909daab6c2b5a89c8f8275695c4f454545454545454545454545454545454545454545453f49536875818e9ba8b4c1c2b5a89b8f8275685c4f422e23180c000000000000000000000000000000000000000000000004101d2935404b5565727e8b98abb5bfc7baaea2988a7e71645365727e8b98a5b1bec6b9ac9f9386796e7b8795a0ab9f948a7e71685d52473d352f281f19130c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000006121e2b37424e575f626b6967666565656667686a67645c52473b30231d27303b45505a636f7c89949eaab7c3c2b9aca1968a7e7164594f44382c1c11060000000000000000000000000000000000000000000000000a15202935404b55626e7b88959f9c8f82757885929f9b8f82757f8b98a6988c7f7e837a717e8b97a4b1b3a79a8d80746976828f9ca9b1b1a89c928d8d8d8d8d8d9196a0acb0ac9f9286796664717e8a97a4b1bdb6aa9d9083776a5d5044372a1d11040000000000000004111d2a3744505d6a7783909daab6c3cbbeb1a5988b7e7265584b3f3225180c000000000000000000000000000000000000000000060f171f272f34383a3a38342e271e150b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008111921272c2f30373733302d2b28221c1a14100c0e18212a333c4246484949494a4a4b4c4e4a5053504a42382f2620283036393a3f3b3a36302b2721201e19171312100c070000000000000000000000000000000000000000000000000000000a1723303d4a5663707d81818080807f7f7f7f7e7e7e7e7d7d7e808d9aa7b3c0c2c2bcb4aba399938b807d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7e7e7e7e7f7f7f8080808081807d7063574a3d3024170a00000000000000000000000000000000000000000000040c13181d20202322222121201f1c181f1e1e1e1e1d1d1d1d1d1d1d1d1d1d1d1d1d2a36414c566b7784919eaab7c4c3b6a99d9083766a544a3f33281c0f030000000000000000000000000000000000000911181d21242527272935404b5565717e8b98aab4b8aca095877a6e615447515e6a7784919daab7bcafa296897c6f6356493c3744515d6a77849093929191929998877a6d605b6874818e9ba7b4c1bcafa295897c6f6256493c2f2316090000000000000000000000000810171c20232423232222212a36424d5765727e8b99a3afbbc7c7bbb0a69e9c9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9b9b9c9d9d9b8e8275685b4f4235282422211e1a140e060000000004111d2a3744505d6a7783909daab6c2b5a89c8f8275695c525252525252525252525252525252525252525252525252525a6773808d9aa6b3c0c3b6aa9d9083776a544b4034281c100400000000000000000000000000000000000000000000000c18242f3c4956626f7c8999a3aebbc7bfb4aa9b8f8275655b65727e8b98a5b1bec5b8ac9f928579717e8b97a7a99c8f82766c615a534e4540393129241e160d0700000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3a47535f6a6e7776747272717273747577736e64584c3f3326151e2a333f4854606b75828f9ca7b1bcc8bdb2a89d9083776b605448382e23170c000000000000000000000000000000000000000000000000030c18242f3947535f6a7683909d9c8f82767985929f998c7f73808d9aa197897c818e83797d8a96a3b0b4a89b8e81756975828f9ca8b5b3a6998d80808080808084919eaab7ac9f9285796c64717e8a97a4b1bdb6a99d9083766a5d5043372a1d10040000000000000004101d2a3743505d6a7683909da9b6c3cbbeb1a5988b7e7265584b3f3225180c0000000000000000000000000000000000000000060f18212931394045474644403930271c1207000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070f161b2022232b2a2623201f1c17110e090400060f18212a31373a3b3c3c3d3d3d3e3f413f4446443f382f261d161e252a2d2e322e2d2a251f1b1414110d080706040000000000000000000000000000000000000000000000000000000004111e2b3744515e6a77848d8d8d8d8d8c8c8c8b8b8b8a8a8a8a8a8d929da9b5b5b5b5b5b5b4aba49f928d8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8b8b8b8c8c8c8d8d8d8d8d85786b5f5245382c1f12050000000000000000000000000000000000000000040d161d24292c2d302f2e2e2d2d2c29232b2b2b2b2a2a2a2a2a292929292929292929253043505c6976838f9ca9b6c2c4b7ab9e918478665b5044382b1f1206000000000000000000000000000000000009121b22292e31323433332f3b4855616e7b8898a2aebab1a7978a7e7164574a505d6a7783909daab6bcafa295897c6f6256493c3744505d6a7783909d9f9e9e9fa393867a6d605b6874818e9ba7b4c1bbafa295887c6f6255493c2f221609000000000000000000000008111a21282d303130302f2f2e2e313b4754616d7a86929facb9c5c3b7aa9e948f8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8e8e8e8e8e8f9091918f8275685c4f423530302e2d2b261f180f0600000004111d2a3744505d6a7783909daab6c2b5a89c8f8275695f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f66727f8c99a5b2bfc5b8ab9e928578665c5145382c1f130600000000000000000000000000000000000000000000000713202d3a4653606d7986929facb9c5c5b8ab9e9285796c6065727e8b98a5b1bec5b8ab9f92857874818e9ba7a79a8d8079716c625f58514b433d352f281f191008010000000000000000000000000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b8483817f7f7e7f7f8081838073675a4d4034271a18212c38434f59636f7c8995a0acb8c7c4b8aba095897c6f63544a3f34281c100300000000000000000000000000000000000000000000000007121d2b37434e5865727f8b989c9083767986929f98897c75828e9b9e91857984918f827d8996a3afb5a89c8f82756975828e9ba8b5aca09386787373737375828f9ba8b5ab9e9285786b64717e8a97a4b1bdb6a99c8f8376695c504336291d10030000000000000003101d2a3643505d697683909ca9b6c3cbbeb1a4988b7e7165584b3e3225180b00000000000000000000000000000000000000071018212a333b434b515353514a42392e23180c04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040b101316161e1d1a1613120f0b060000000000060f181f262b2d2e303030303131322d33383938332d261d140b13191d20212521201e1a140f0a070501000000000000000000000000000000000000000000000000000000000000000004111e2a3744515d6a7784909a9a9a9999999898989797979797979a9da4a8a8a8a8a8a8a8a8a8a8a49c9997979797979797979797979797979797979797979898989999999a9a9a9285786b5f5245382c1f120500000000000000000000000000000000000000010c161f282f35393a3c3c3b3b3a3a38342f3838383737373736363636363636363636363636424e5b6875818e9ba8b4c1c5b9ac9f9286796c605346392d2013060000000000000000000000000000000006111b242d343a3d3e4140403f3f4653606c7985929facb8b4a79a8d8174675a4e505d6a7783909daab6bbafa295887c6f6255493f3f43505d6a7683909da9aaabaca39986796c605b6874818e9ba7b4c1bbaea295887b6f6255483c2f22150900000000000000000000030c1a232c33393c3d3d3c3c3b3b3a3a3a46525e6875828f9ca8b5c2c2b5a89c8f8280808080808080808080808080808080808080808080808080808080808081818181818181818282838484868074675a4d413d3d3d3b3a37312a21180e03000004111d2a3744505d6a7783909daab6c2b5a89c8f82756b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b717e8b98a4b1bec6b9ada19786796d6053463a2d201307000000000000000000000000000000000000000000000006131f2c3845515c677783909daab6c3c6b9ada297887b6f6265727e8b98a5b1bec4b8ab9e9185787884919eabab9d928d847e766f6a605d554f45413a312b2219130c0400000000000000000000000000000000000000000000000000000000000000000000000000000915222f3c4855626f7b888f8d8c8b8b8b8c8d8e8f8276695c4f4336291c0f1b27323d4854606b7784919dacb6c0c8bcb1a79a8e8174665c5044382c1f1206000000000000000000000000000000000000000000000000010f1a26313c4955626f7c88989d9083777986999f9285797683909d9a8d807a8693948f84919eaab7b6a99d9083766a75818e9ba8b4aca09386796d66666875828f9ba8b5ab9e9185786b64717e8a97a4b1bdb5a99c8f8276695c4f4336291c10030000000000000003101d293643505c6976838f9ca9b6c2cbbeb1a4988b7e7165584b3e3225180b000000000000000000000000000000000000071019222a333c454d555c60605c544a40342820150a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000307090a11100d090606030000000000000000060e141a1e21222323232324242622282b2d2b28221c140b02080d111314181514120e090200000000000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683909ca7a6a6a6a5a5a79f9d9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9ea0a8a5a5a6a6a6a79e9185786b5e5245382b1f12050000000000000000000000000000000000000007131d28313a4045474948484747474540454545444444444343434343434343434343434343434d5a6673808d99a6b3c0c7bbafa399877a6e6154473b2e211408000000000000000000000000000000010c18222d363f454a4b4d4d4c4c4b4b505b667683909da9b6b7aa9d9084776a564c505d6a7783909daab6bbafa295887c6f62554b4b4c4c505c6976838f9ca9b6b8ac9f928679655b5b6874818e9ba7b4c1bbaea295887b6f6255483c2f221509000000000000000000000a151e2c353e44494a4a49494847474747464c5665717e8b98a8b2bdc0b3a69a8d807474747474747474747474747474747474747474747474747474747474747474747474747474757676777879746e64584949494a4a4846423c332a1f1409000004111d2a3744505d6a7783909daab6c2b5a89c8f82787878787878787878787878787878787878787878787878787878787878787d8a96a3b0bdcabeb3a994877a6d6154473a2e211407000000000000000000000000000002050708090707050104101c2834404b556774818e9aa7b4c1cabeb3a9988b7e726565727e8b98a5b1bec4b7ab9e9184787b8796a1a19e9c9d96918a827c746d676059514c433d3429241e160d07000000000000000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b87949a99989898999a9b8f8275695c4f4236291c0a16212c38444f5965727f8b9aa4afbbc8c3b8ab9e9285796d6053463a2d201308000000000000000000000000000000000000000000000000000913202d3a4653606d7985929d9083767a86939c8f82767885929e95897c7c899a9f969196a0acb9b7aa9d9184776a74818e9ba7b4aca09386796d605c6875828f9ba8b5ab9e9184786b64717e8a97a4b1bdb5a99c8f8276695c4f4336291c10030000000000000003101c2936434f5c6976828f9ca9b5c2cabeb1a4978b7e7164584b3e3125180b00000000000000000000000000000000030b1218222b343c454d575e676d6d665c51443c32261b0f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000404000000000000000000000000000003090e12141516161617171819171c1f201f1c17110a020000010507070c08070502000000000000000000000000000000000000000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b3b3b2b2ab9f95908f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f9196a0acb2b3b3b3aa9e9184776b5e5144382b1e1105000000000000000000000000000000000000010d18242f3a434b5153565555545453514b52525151515150505050505050505050505050505050505865727f8b98a5b2becbc0b5ab95897c6f6256493c2f23160900000000000000000000000000000005111d29343f485056585a5a5959585857546874818e9ba7b4b8ac9f928579685e54545d6a7783909daab6bbafa295887c6f625758585859595c6976828f9ca9b5b8ab9f9285786c5f5b6874818e9ba7b4c1bbaea295887b6f6255483c2f22150900000000000000000006111c26303e474f55575656555554545453535355616e7b8896a1acb9c4b8ab9e9184786c67676767676767676767676767676767676767676767676767676767676767676767676868696a6a656c65645c55565656565755534d453c31261a0e020004111e2a3744515d6a7784909daab7bbb9ac9f92878585858585858585858585858585858585858585858585858585858585858585929fabb8bfc0baaea194877b6e6154483b2e21150800000000000000000000000003090e121415161413110d080c18232e3f4b5865727e8b98acb6c0ccc1b4a89b8e81756865727e8b98a5b1bec4b7aa9d9184777e8b97a1979290949f9e948f878079706b605d554f473f352f281f1910070100000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a8794a1a5a5a4a5a6a79b8f8275685c4f4235291c0f0f1b27323d4754616e7a87939facb9c6c6b9ada197897d7063564a3d2f24190d0100000000000000000000000000000000000000000000000006121f2b3844505c6676838f9c9083767a8793998c7f737b87979d9084777f8c999f948f949fabb7b7aa9e9184776b74818e9ba7b4aca09386796d605c6875828f9ba8b5ab9e9184786b64717e8a97a4b1bdb5a99c8f8276695c4f4336291c100300000000000000030f1c2936424f5c6975828f9ca8b5c2cabeb1a4978b7e7164584b3e3125180b000000000000000000000000000000050c151d2328343d464e575f696e79796d60584e43372b1f130600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205070809090a0a0a0b060b0f1213120f0b06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020f1c2935424f5c6875828f9ba8b5c0bfb6a99d90838282828282828282828282828282828282828282828282828282828282828282828282828282828284919eaab7bfc0b7aa9d9084776a5d5144372a1e110400000000000000000000000000000000000004111d2935404b555d606362616160605c555f5e5e5e5e5d5d5d5d5d5c5c5c5c5c5c5c5c5c5c5c5c5c5c64707d8a97a3b0bdd1bdb0a4978a7d7164574a3e3124170b0000000000000000000000000000000915212e3a45505a626567666665656564646773808d9aa6b3baaea298877a6d616161616a7783909daab6bbafa295887c6f63646465656666676875828f9ba8b5b8ab9e9285786b5f5b6874818e9ba7b4c1bbaea295887b6f6255483c2f2215090000000000000000000c17232e38424f596164636362626161606060605c5f697884919eabb7c4b9ada197897d7063555e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5f5f5f5f5c606060616161616262626263636363615f574d42372b1e12050004111e2b3744515e6a7784919daaaeaeaeaea39992929292929292929292929292929292929292929292929292929292929292929298a2aeb1b2b3b5aea195887b6e6255483b2f2215080000000000000000000000050d141a1e21212321201d191b1b1a232f3c4956626f7c899aa4afbbc8c4b7ab9e9184786965727e8b98a5b1bec3b6aa9d908377818e9a9e9285839096a09f99938d847d746d6760595145413a312a2218120c04000000000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a8794a0adb2b1b2b2a89b8e8175685b4e4235281b0f0b16202d3946525e687683909da9b6c3c9beb3a99a8d807467564c4135291d110400000000000000000000000000000000000000000000000003101c28343f4a546673808d998f83767a879497897c707d8a97978b7e75828f9b998f838f9ca9b6b7ab9e9184786b74818e9ba7b4aca09386796d605c6875828f9ba8b5ab9e9184786b64717e8a97a4b1bdb5a99c8f8276695c4f4336291c100300000000000000020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e7164584b3e3125180b0000000000000000000000000002080f171e272e343e464e585f696e7b8482756a5f53473b2e211508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060606030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4c1bdb0a3968a7d75757575757575757575757575757575757575757575757575757575757575757575757575757575808d9aa7b3c0c3b6aa9d9083776a5d5044372a1d11040000000000000000000000000000000000000613202c3945515d676d6f6f6e6e6d6d676c6b6b6b6b6a6a6a6a69696969696969696969696969696969696f7c8895a2afbbc8bfb2a5988c7f7265594c3f322619060000000000000000000000000000000b1724313d4a56626d71747373727271717070727f8c98a5b2bfb4aa95887c6f6e6e6e6e6e7783909daab6bbafa295887c7070717172727273736f75828e9ba8b5b8ab9e9185786b5e5b6874818e9ba7b4c1bbaea295887b6f6255483c2f221509000000000000000003101c28343f4a54616c70706f6f6e6e6d6d6d6d6d666c6c74818e9ba7b4c1beb2a99a8e8174676a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6b6b6b6b6c6c6c666d6d6d6d6e6e6e6e6f6f6f6f7070706e695f53463a2d2114070005121e2b3845515e6b7884919ea2a2a2a2a1aba39f9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9fa2aaa4a4a5a7a8a9a295897c6f6256493c2f23160900000000000000000000050f171f252a2d2e2f2e2d2a25282727262d3a4753606d7a86939facb9c6c5b9ada196877b6e65727e8b98a5b1bec3b6a99d90837783909d988c7f7a849197a1a49f969189817a6f6b625b524c433c3429241d160d050000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0adbabebeb4a79b8e8174685b4e4135281b0e05111e2a36414c5666737f8c99abb5c0cbc3b6aa9d908377685d5245392c201306000000000000000000000000000000000000000000000000000b17232e3e4b5764717e8a978f82767b889592857973808d999285797985929e92877c8895a2afb8ab9e9185786b74818e9ba7b4aca09386796d605c6875828f9ba8b5ab9e9184786b64717e8a97a4b1bdb5a99c8f8276695c4f4336291c100300000000000000020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e7164584b3e3125180b000000000000000000000000050d14192129303940455058606a6f7b8491887c6f6255493c2f221609000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2834414e5b6774818e9aa7b4c1bdb0a3968a7d70696969696969696969696969696969696969696969696969696969696969696969696969696974808d9aa7b3c0c3b6a99c908376695d5043362a1d10030000000000000000000000000000000000000714202d3a4753606d797c7b7b7a7a7a797978787877777777767676767676767676767676767676767676767a8794a1adbac7c0b4a79a8d8174675a4e412d22170b0000000000000000000000000000000b1825323e4b5865717f80807f7f7e7e7e7d7d7c808c99a6b3beb1a4988b7e7b7a7a7a7a7a7b83909daab7beb1a4978b7e7c7d7d7e7e7f7f80807d74818e9ba7b4b7aa9e9184776b5e5b6874818e9ba7b4c1bbaea295887b6f6255483c2f221509000000000000000006121f2c3844505c66707d7d7c7c7b7a7a7a7a7979797979797e8b97a4b1bec4b8ab9f928579777777777777777777777777777777777777777777777777777777777778787878797979797a7a7a7a7b7b7b7b7c7c7c7c7d7d7b6e6155483b2e2215080005121f2b3845525e6b788591959595959595959595949494949494949494949ea0a8ababababababa39b989494949494949495959696979798999a9b9d9e96897c706356493d3023160a000000000000000000030d17212931363a3b3c3a39363035343333323845515c677885929eabb8c5c9bdb2a896897d7065727e8b98a5b1bec2b6a99c8f837886929f92857a6e7b859298a3a8a09e928e847d726d605d564e463f352f281f170e0600000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693a0b5c0ccc0b4a79a8d8174675a4e4134271b0e010d1925303c4956636f7c8999a3afbbc7c6b9ac9f93867a6d6054473a2d211407000000000000000000000000000000000000000000000000000616232f3c4956626f7c89958f82757c89968e817476828f988d80737d8997988d81788693a0acb8ab9e9285786b74818e9ba7b4aca09386796d605c6875828f9ba8b5ab9e9184786b64717e8a97a4b1bdb5a99c8f8276695c4f4336291c100300000000000000020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e7164584b3e3125180b0000000000000000000003090e171f252a333b434b515a626a6f7c8591968c7f7266594c3f30251a0e020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002050708090707050100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0bdb0a3968a7d70635c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c6774808d9aa7b3c0c3b6a99c908376695d5043362a1d10030000000000000000000000000000000000020f1b2835424e5b6875818988888787868685858584848484838383838383838383838383838383838383838382909ca9b6c3cac2b5a99c8f82766953493f33271b0f030000000000000000000000000003101c2936434f5c6976828d8d8c8c8b8b8a8a89898c929ca8b4bfb3a79b908b878787878787879095a0acb8bfb3a69b908b898a8a8b8b8b8c8c8b7e74818e9aa7b4b7aa9d9184776a5e5b6874818e9ba7b4c1bbaea295887b6f6255483c2f22150900000000000000000713202d3a4653606d7986898988888787878686868686868586929facb8bbbabaada297918484848484848484848484848484848484848484848484848484848484848485858585868686868787878788888888898989898a8275685c4f4235291c0f0003101c2936434f5c69768288888888888888888888888888878787878787879196a0acb8b8b8b8a79b918b87878787878787888889898a8a8b8c8d8e909192887b6f6255483c2f22150900000000000000000009141f29333b42464849474641424141403f3f3f404b556a7783909daab6c3cfbeb2a5988b7f7265727e8b98a5b1bec2b5a99c8f827c8898998d8073696f7d86929fa4aca59d9691877f756d685f5851454039312920180f07000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798699a4afbbc7c0b3a79a8d8074675a4d4134271a0e000814202d3a4753606d7986929facb9c5c7bbafa4998a7d7063574a3d3024170a000000000000000000000000000000000000000000000000000714212e3a4754616d7a87988f82757e8a988a7d7079859292867b75818e9b92867a798693a0acb8ac9f9285796c74818e9ba7b4aca09386796d605c6875828f9ba8b5ab9e9184786b64717e8a97a4b1bdb5a99c8f8276695c4f4336291c100300000000000000020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e7164584b3e3125180b000000000000000001070c141a202930363e454d555c606c717c8591979c8f827669574d42362a1e1105000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e121415161413110d080a0707050100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0bdb0a3968a7d70646464646464646464646464646464646464646464646464646464646464646464646464646774808d9aa7b3c0c3b6a99c908376695d5043362a1d10030000000000000000000000000000000000010e1b2834414e5b6774818e959494939a9392929191919190909090908f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f90949fabb7bcbdbeb7aa9d918477655b5044372b1f120500000000000000000000000000020f1b2835424e5b6875818e999998989897979696999ca4aeb9c3b7aca39b98949494949494949da0a7b1bcc3b7aca29b979696979798989996897c74808d9aa7b3b6aa9d9083776a5d5b6874818e9ba7b4c1bbaea295887b6f6255483c2f221509000000000000000006121f2c3844505c66778490969595949493939393999292929298a2aeaeaeaeaeb3a9a096919191919191919191919191919191919191919191919191919191919191919192929292939a939394949494959595959696968c7f7366594c403326190d00000613202d394653606c787b7c7c7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b84919eaab7c4beb1a4988b7e7b7b7b7b7b7b7b7b7c7c7d7d7e7e7f8082838486857a6d6054473a2d2114070000000000000000020e1a25313b454d53545654524c4f4e4e4d4c4b4b4b4f5c6875828f9ba8b5c2cdc0b3a79a8d807467727e8b98a5b1bec2b5a89b8f827e8a9792867b6e616b717e8a929ca6afa8a199928c817a6f6a625b514b433b332a2119100800000000000000000000000000000000000000000000000000000000000006121f2b3844505c667986939facb9c6c0b3a6998d8073665a4d4033271a0d0006131f2c3845515c677783909daab6c3ccc0b5ab998c7f7266594c3f33261908000000000000000000000000000000000000000000000000000713202d3946525e687985928e82757f8b92867a707c89988d80737a8692948b7e727986939fb5b9ac9f9286796c74818e9ba7b4aca09386796d605c6875828f9ba8b5ab9e9184786b64717e8a97a4b1bdb5a99c8f8276695c4f4336291c100300000000000000020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e7164584b3e3125180b00000000000000030b12181f252a323b414650575e676d747e869297a19f928578695e52463a2d20140700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d141a1e21212321201d1919171413110d08070604010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0bdb0a3968a7d71717171717171717171717171717171717171717171717171717171717171717171717171717174808d9aa7b3c0c3b6a99c908376695d5043362a1d10030000000000000000000000000000000000000c1926323f4c5965727f8c98a1a1a0a49f9f9e9e9e9e9d9d9d9d9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9fa6b0afb0b0b1b2ac9f9286796c605346392d20130600000000000000000000000000010e1b2834414e5b6774818e9aa4a4a3a2a2a1a1a0a3a5abb3bdcbbfb4aaa39f9f9f9f9f9f9f9f9fa3abb5c0cbbcb3aba5a2a0a1a2a3a3a4a295887c74808d9aa7b3b6aa9d9083776a5d5b6874818e9ba7b4c1bbaea295887b6f6255483c2f221509000000000000000003101c28343f4a546976838f9ca2a1a1a0a0a0a0a0a39f9f9f9fa2aaa1a1a1a1a1a1a1a8a09e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9e9e9e9e9f9f9f9fa4a0a0a0a1a1a1a1a2a2a2a2a3978a7e7164574b3e3124180b000005121f2b3744505b656c6e6f6f6f6f6f6e6e6e6e6e6e6e6e6e6e6e6e6e7784919daab7c4bdb0a3978a7d706e6e6e6e6e6e6e6f6f70707171727475767879786d675d5145392c201306000000000000000005121e2a36424d575e6162615e565c5b5a5a59585858585a6774818d9aa7b4c0cdc2b5a99c8f827669727e8b98a5b1bec1b5a89b8e81808d998e8175695e616c73808c949faab2aba39f938f847c726d605d554d453c332b221a1108000000000000000000000000000000000000000000000000000000000003101c28343f4a5f6c7985929facb8c5bfb3a6998c807366594d4033261a0d0004101c2934404b556774818e9aa7b4c1d2c1b4a79b8e8174685b4e412f24190d0100000000000000000000000000000000000000000000000005111e2a36414c566a7784908e8175808c8f827573808c92857a717e8b988f82776c798699a4afbaaea39986796674818e9ba7b4aca09386796d605c6875828f9ba8b5ab9e9184786b64717e8a97a4b1bdb5a99c8f8276695c4f4336291c100300000000000000020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e7164584b3e3125180b000000000003090d151d232931363e444d525a61696e79818b9298a2a9a298877b6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050f171f252a2d2e302e2d2925262321201d19171413100d0706020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0c0b3a69a8d807e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e828f9ca9b5c2c3b6a99c908376695d5043362a1d10030000000000000000000000000000000000000c1926323f4c5965727f8c98a1a1a0a0a39f9f9e9e9d9d9d9c9c9b9b9b9b9b9c9c9c9c9c9c9c9d9d9d9d9d9d9e9fa2aaa2a3a4a5a6a7a398877a6e6154473b2e21140800000000000000000000000000020f1c2835424f5b6875828e9897979696959594939699a1abb6c7baaea39892929292929292929299a3afbbc7b5aba199969494959697979896897c74808d9aa7b3b6aa9d9083776a5d5b6874818e9ba7b4c1bbaea295887b6f6255483c2f221509000000000000000005121f2b3744505b657784919a9a9999989797969696969695959595959494949494949494949494949494989ba2aaaaaaaaaaaaaaa29f9494949494949494949494949595959696969797979898989999999a9a9a9b9b988b7f7265584c3f3225190c0000030f1b27333f49535b606262626262626262626261616161616161616b7784919eaab7c4bdb0a3978a7d70646161616161626263636464656667686a6b6c6b605d554c4135291d110400000000000000000714212d3a46535e696e6f6d686a6968676666656565656566727f8c99a5b2bfccc4b7aa9e91847766727e8b98a5b1bec1b4a79b8e81828f96897d7063575a606d78839098a2aeb5afa59e9691867e756d675e574d453d342b231a120800000000000000000000000000000000000000000000000000000000000b17232e45525f6c7885929fabb8c5bfb2a6998c7f7366594c403326190d00000c18232f3f4c5966727f8c99a5b2bfccc3b6a99d9083766a564c4135291d110400000000000000000000000000000000000000000000000006111c2630404c5966737f85847e717d84867e717683908c807376839092867b6e657986939facb9b4a09386796d74818e9ba7b4aca09386796d605c6875828f9ba8b5ab9e9184786b64717e8a97a4b1bdb5a99c8f8276695c4f4336291c100300000000000000020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e7164584b3e3125180b00000003090e151a1f272f343b424650565e616c717b838e939fa2aab3aa96897d7063564a3d302317090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040e17212931363a3b3c3a39353033302e2d29252320201d1814120e0906030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0c1b5a89d928d8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8f949faab7c3c3b6a99c908376695d5043362a1d10030000000000000000000000000000000000010e1b2834414e5b6774818e959494939398929291919190908f8f8f8e8e8f8f8f8f8f8f8f90909090909091919192989495969798999a9b96897c6f6356493c302316090000000000000000000000000004111e2a3744515d6a77848c8b8b8a898988888787898f99a5b1c5b9ac9f92868585858585858587929facb9c5b1a5998f89878888898a8b8b8c8a7e74808d9aa7b3b6aa9d9083776a5d5b6874818e9ba7b4c1bbaea295887b6f6255483c2f22150900000000000000000613202d394653606c79868e8d8d8c8c8b8b8a8a89898989898888888888888787878787878787878787878b909ba6b7b7b7b7aea2989287878787878787878787878788888889898a8a8a8b8b8b8c8c8c8d8d8d8e8e8e8f8e8174685b4e4135281b0e0000000b17222d384149505355555555555555555555555555545454545e6b7784919eaab7c4bdb0a4978a7d7164575454545455555656575758595a5b5d5e5f5e54514c433a2f24190d0100000000000000000815212e3b4854616e7b7c7a79777574747372727272727272727e8a97a4b1bdcac5b9ac9f9286796d727e8b98a5b1bec1b4a79a8e8184919184786c6053505c666e7b86929fa6b0bbafa8a098928b81796e695f574e463d352c241a120800000000000000000000000000000000000000000000000000000000061f2c3845525f6b7885929eabb8c5bfb2a6998c7f7366594c403326190d0000071825313e4b5864717e8b97a4b1becac5b8ab9f928578685d5245392c2013060000000000000000000000000000000000000000000000000b17232e38424a57636d737877716c707779716c727f84857a6e7b88938a7e71696c7986929facb9ada093867a6d74818e9ba7b4aca09386796d605c6875828f9ba8b5ab9e9184786b64717e8a97a4b1bdb5a99c8f8276695c4f4336291c100300000000000000020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e7164584b3e3125180b0003090e141a20262b313940454d535a61686e757e8590959da5aeb4b2a5988c7f7265594c3f31261a0e00000000000000000000000000000000000000000000000000000000000000000105070708080706040000000000020c162029333b42464849474641413f3d3a393530302d2c2924211e1a13120f0b06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0c5b9aea49d9a979797979797979797979797979797979797979797979797979797979797979797979797979797979c9fa6b0bbc7c3b6a99c908376695d5043362a1d10030000000000000000000000000000000000020f1c2935424f5c687581898887878786868685858484848383828282828282828282838383838383838484848485868788898a8b8c8d8e8f8a7e7164574b3e3124180b00000000000000000000000000000c1926323f4c5965727f7f7e7e7d7d7c7c7b7b7a7d8996a3b0bcb3a79a8d807878787878787883909daab6bcafa296897d7a7b7c7c7d7e7f7f807c74808d9aa7b3b6aa9d9083776a5d5b6874818e9ba7b4c1bbaea295887b6f6255483c2f22150900000000000000000713202d3a4653606d7881818180807f7f7e7d7d7d7c7c7c7c7c7c7b7b7b7b7b7b7a7a7a7a7a7a7a7a7a7b7e8b98a4b1bec4b8ab9f92857b7a7a7a7a7a7a7a7a7a7b7b7b7b7c7c7c7d7d7d7e7e7e7f7f8080808181818282828073675a4d4034271a0d00000006111b262f383f444648494948484848484848484848484848515e6b7884919eabb7c4bdb1a4978a7e7164574b4848484849494a4a4b4b4c4d4f505153524745413a31281e13080000000000000000020f1b2835424e5b68758189878584828181807f7e7e7e7e7e7e7e808d9aa7b3c0c9c7bbafa399877a6e727e8b98a5b1bec0b3a79a8d8086928c7f73665b504a545f69727e8b949fa9b3bab2aaa39f938e837b6e6960584f473e362c241a1007000000000000000000000000000000000000000000000000000005121f2b3845525e6b7885919eabb8c4bfb2a6998c7f7366594c403326190d00000a1623303d495663707c8996a3afbccfc6baaea298877a6d6054473a2d211407000000000000000000000000000000000000000000000003101c28343f4a545c60686a6b6a696968666c66686d7277786d6d7a82867f736c686c7986929facb9ada093877a6d75818e9ba8b4aca09386796d69696975828f9ba8b5ab9e9185786b64717e8a97a4b1bdb5a99c8f8276695c4f4336291c100300000000000000020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e7164584b3e3125180b080e141a1f262a31373e434b51575e616c717b828a92979fa7afbabfb5a89b8e827568574d42362a1c1106000000000000000000000000000000000000000000000000000000000406080d11131415151312100c0706030008131e28323b454d53545654524c4e4c4a474641403d3a39352f2d2b26201f1c17110e0902000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0c4b8ada39c99969696969696969696969696969696969696969696969696969696969696969696969696969696969b9ea5afbac6c3b6a99c908376695d5043362a1d10030000000000000000000000000000000000000814212e3b4754616e7a7c7b7b7a7a7a7979787878777776767675757575757575767676767676777777777778797a7b7c7d7d7e7f808182817b6e6154473b2e21140800000000000000000000000000000b1825313e4a57626d7272727171706f6f6e6e707c8996a3afbcb3a79a8d80746c6c6c6c6c7783909daab6bbafa295887c6f6e6f7070717273736f74808d9aa7b3b6aa9d9083776a5d5b6874818e9ba7b4c1bbaea295887b6f6255483c2f221509000000000000000006121f2b3844505c666d7574747373727271717070706f6f6f6f6f6f6e6e6e6e6e6e6e6e6e6e6e6e6e6e707d8a97a3b0bdc5b8ab9f9285786e6e6e6e6e6e6e6e6e6e6e6e6f6f6f707070717171727272737373747474757576736e64584c3f3326190d000000000a141d262d3337393b3c3c3c3c3c3b3b3b3b3b3b3b3b3b45525e6b7885919eabb8c4beb1a4978b7e7164584b3e3b3b3b3c3c3d3d3e3e3f4142434546453a39352f281f160c010000000000000000000d1a2733404d5a6673808d9892908f8e8d8d8c8b8b8b8b8b8b8b8d929da9b5bcbcbdc0b5ab94887b6e727e8b98a5b1bec1b4a79b8e818e93877b6e61544a424d57626d76828f97a2adbabcb4aea59e9590847b6f6a605950483e362c22190f040000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4bfb2a6998c7f7366594c403326190d00000815222e3b4855616e7b8894a9b3bec9cabeb3aa94887b6e6155483b2e221508000000000000000000000000000000000000000000000006121f2b3844505c666d757676767675757575747474747474747474757a74747474747986929facb8ada194877a6e75828f9ba8b5aca09386787575757575828f9ba8b5ab9f9285786c64717e8a97a4b1bdb5a99c8f8276695c4f4336291c100300000000000000020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e7164584b3e3125180d14191f252a31363c43474f555c60696e757e858f949fa2a9b1b9c0c4b8ab9e918478695f5346382d22170b0000000000000000000000000000000000000000000000000001070c101314191d20212222201f1c181312100b0d1924303a444d575e6163615e565b595654524c4c4a4745403b3a37312d2b28221c1a140f0a0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0c0b4a79c918c898989898989898989898989898989898989898989898989898989898989898989898989898989898e939eaab6c3c3b6a99c908376695d5043362a1d10030000000000000000000000000000000000000714202d3946525e686e6f6e6e6e6d6d6c656c6b6b6a6a6a69696868686868696969696969696a6a6a6a6a6a6b676d6e6f70717273747576756e695e52463a2d20140700000000000000000000000000000916222e3a46515b6265666564646363626263707c8996a3afbcb3a79a8d8074675f5f5f6a7783909daab6bbafa295887c6f62626364646566676774808d9aa7b3b6aa9d9083776a5d5b6874818e9ba7b4c1bbaea295887b6f6255483c2f221509000000000000000003101c28343f4a545c606868676766666564646363636363626262626261616161616161616161616164707d8a97a3b0bdc5b8ab9f9285786c616161616161616161616262626363636464646565656666666767676868686967645c52473c3023170b00000000020b141b22272b2d2f2f2f2f2f2f2f2f2f2f2e2e2e2e34404b546c7885929fabb8c5beb1a5988b7e7265584b3f322e2f2f3030313132333435373839382d2c29241e160d04000000000000000000000c1825323f4b5865727e8b989f9d9c9b9a9999989898989898989a9da4aeaeafafb0b1aea195887b6e727e8b98a5b1bec2b5a89c8f828f908376695e53423b45515b616e7b85929fa8b2bdbfbaafa7a09691857c706b615a50483e342b20160a0000000000000000000000000000000000000000000000000004111e2b3744515e6a7784919daab7c4bfb2a5998c7f7266594c3f3326190c00000714202d3a4753606d7a8697a1adb9c6d0bcafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000713202d3a4653606d78818383838282828281818181818181818181818181818181818187929facb9aea194877b6e75828f9ca8b5b5a89c8f82828282828285919eabb8ac9f9286796664717e8a97a4b1bdb5a99c8f8276695c4f4336291c100300000000000000020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e7164584b3e312518191e252a30363b42464e535961676d737b828b92979ea6adb3bbc3cbc5b9ada196887b6e61544a3f33281c0f030000000000000000000000000000000000000000000000070c12181c1f2024292d2e2e2e2d2c2823201f1c17111d2935414c565e696e6f6d686a686663615e56595653514b4847423d3938332d2a251f1a150f0a030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0bfb2a5998c7f7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c818e9ba8b5c1c3b6a99c908376695d5043362a1d100300000000000000000000000000000000000005111e2a36414c565e61626261616060605b5f5e5e5e5d5d5c5c5c5b5b5c5c5c5c5c5c5c5d5d5d5d5d5d5e5e555d6061626364656667686968615e574d42362a1e1105000000000000000000000000000006121e29353f49515759595858575656555663707c8996a3afbcb3a79a8d8074675a525d6a7783909daab6bbafa295887c6f625556575858595a6774808d9aa7b3b6aa9d9083776a5d5b6874818e9ba7b4c1bbaea295887b6f6255483c2f2215090000000000000000000b17232e38424a50535b5b5a5a59595b5d5c5c5c5b5b5b5a5a5a595959595858585757575757575764707d8a97a3b0bdc5b8ab9f9285786c5f57575757575757575858585959595a5a5a5a5b5b5b5c5c5c5c5a5b5b5b5c5c5a58524a40362b1f13070000000000020a11171b1f20222222222222222222222222222c3845515c667986929facb9c2bfb2a5998c7f7266594c3f3326222223232424252627282a2b2c2b21201d19130c0400000000000000000000000b1825323e4b5865717e8b98a4a3a2a1a1a0a49f9fa4a0a0a0a0a0a0a0a1a1a2a3a3a4a6a295897c6f727e8b98a5b1bec3b6aa9d9083908c7f7266574d42333f46525e69727f8b96a1acb9c3c1b9b1a8a19792867d716c615a50463d32271b0f0300000000000000000000000000000000010101010000000004111e2a3744515d6a7784909daab7c3bfb2a5998c7f7266594c3f3326190c000006131f2c3845515c677885929eabb8c5cabdb0a3978a7d7064574a3d3124170a00000000010101000000000000000000000000000000000815222e3b4855616e7b8890908f8f8f8f8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e9299a3afb2aea195887b6e76828f9ca9afaeaa9e948f8f8f8f8f8f9197a1adafafa39986796d64717e8a97a4b1bdb5a99c8f8276695c4f4336291c100200000000000000020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e7164584b3e31251e252930363b42464d53585f626b70797f868f949fa2a9b0babec5cdd5c9bdb2a9998c7f73665b5044382b1f1207000000000000000000000000000000000000000000030b12181d23292c2d3035393a3b3b3a38342e2d2b28231c202d3946525d686e7b7c7a78767472706d68686663605d5555534d4a46443f3836302b26201a150d0701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0bdb0a3968a7d706f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f74808d9aa7b3c0c3b6a99c908376695d5043362a1d1003000000000000000000000000000000000000010d1925303b444c52545655545454535350495251515150504f4f4f4f4f4f4f4f4f505050505050505151514b51535455565758595a5b5c5b54524d453b30251a0e020000000000000000000000000000010d18232d373f464a4c4c4b4b4a4a49495663707c8996a3afbcb3a79a8d8074675a505d6a7783909daab6bbafa295887c6f6255494a4b4c4d5a6774808d9aa7b3b6aa9d9083776a5d5b6874818e9ba7b4c1bbaea295887b6f6255483c2f22150900000000000000000006111c2630383f44464f4e4e535d656869696968686867676766666666656565646464646464646464707d8a97a3b0bdc5b8ab9f9285786c6464646464646464646465656566666667676768686868696969615f574d4f4f4d4c4740382e24190e0300000000000000060b0f1213151616151515151515151515202d3a4653606d798699a3afb4b5b7b3a6998c807366594d4033261a161617171818191a1c1d1e201f1413110d08010000000000000000000000000d1a2633404d596673808c999896959594949993939993939393939394949595969798999b96897d70727e8b98a5b1bec4b7ab9e918491887b6f6255483c3136424d56606d7984919ea8b1bdc8c3bab2a9a19892877e716c61584e43372b1f130600000000000000000000000106090b0c0e0e0e0d0d0d0c0c0c111d2a3744505d6a7783909daab6c3bfb2a5998c7f7266594c3f3326190c080808101c2934404b556a7783909daab6c3cabeb1a4978b7e7164584b3e3125180c0c0c0d0d0d0e0e0d0c0a070200000000000000000000000815212e3b4854616e7b87949c9c9c9c9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9fa3aba5a6a6a295887b6f7683909ca3a2a2a2a69e9c9c9c9c9c9c9ea1a9a2a2a3a093877a6d64717e8a97a4b1bdb5a99c8f8276695c4f4336291c120e09030000000000020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e7164584b3e31242930353b41464d52575f616a6e757d848c92989ea6adb3bbc1cacfd7dacfc4b7ab9e9184786c605346392e23180c0000000000000000000000000000000000000000060c151d23282f34383a3e41464748484644403d3a38342e27222e3a4754616d7a8589878583817f7d7a787573706d6765615f575653504a46423b37312b262018130c040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0bdb0a3968a7d70636363636363636363636363636363636363636363636363636363636363636363636363636774808d9aa7b3c0c3b6a99c908376695d5043362a1d10030000000000000000000000000000000000000008141e29323b41464749484847474746443f4545444443434342424242424242434343434343444444444440454748494a4a4b4c4d4e4f4f4746423b33291f14090000000000000000000000000000000007111b252d353a3e3f3f3f3e3e3d3d495663707c8996a3afbcb3a79a8d8074675a505d6a7783909daab6bbafa295887c6f6255493d3e414d5a6774808d9aa7b3b6aa9d9083776a5d5b6874818e9ba7b4c1bbaea295887b6f6255483c2f221509000000000000000000000a141e262e34383a42414d59656f7576767575757474747473737372727271717170707070707070707d8a97a3b0bdc5b8ab9f9285787070707070707070717171717272727373737474747575757676766e695f534643403f3c362e261c120800000000000000000000030506080909090909080808080814212d3a4754606d7a8793aaa6a7a8aaaca79a8d8074675a4d4134271a0e090a0a0b0b0c0e0f101213120706040100000000000000000000000000020f1c2935424f5c6875828e8c8b8a898887878686868686868686878787878889898a8b8c8e8f8a7e71727e8b98a5b1bec5b8ac9f92859184776a5f53473a2e303b45515c67717e8b95a0acb8c3ccc4bbb3aaa29992877e716a6054473b2e22150800000000000000000000070d121618191b1b1a1a1a19191919181d2a3743505d6a7683909da9b6c3bfb2a5998c7f7266594c3f332619141414141418232f43505d697683909ca9b6c3cbbeb1a5988b7e7265584b3f3225181919191a1a1a1b1b1a1917130e08000000000000000000000714212e3a4754616d7a8794a0a9a9a8a8a39b9896969696969da0a7a7a7a7aba39f969696979798999a9a95897c6f768390979695959595959595959595959595959596969794877b6e64717e8a97a4b1bdb5a99c8f8276695c4f433629211e1a140d0600000000020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e7164584b3e312f353a41464c52575e61696e747b828a91969fa3aab0babec5cdd6d9d4d2ccc5b9aca1968a7d7063544b4034281c1004000000000000000000000000000000000000080f181e272e34394045474b4c5254555553514a4a46443f38332d323f4b5865727e8b979792908e8c898784827f7d7a76726e696763605b54524d47433c373129241d160d0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0bdb0a3968a7d70636262626262626262626262626262626262626262626262626262626262626262626262626774808d9aa7b3c0c3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000020d1720293036393b3c3b3b3b3a3a3937332d38373737363635353535353636363636363637373737372f35383a3b3c3d3e3f40414243423b3a36302920170d02000000000000000000000000000000000009131b23292e313233323131303d495663707c8996a3afbcb3a79a8d8074675a505d6a7783909daab6bbafa295887c6f6255493c34414d5a6774808d9aa7b3b6aa9d9083776a5d5b6874818e9ba7b4c1bbaea295887b6f6255483c2f22150900000000000000000000020c141c23282b2d35424e5b68758183828282828181818080807f7f7f7e7e7e7e7d7d7d7d7d7d7d7d808d99a6b3c0c5b8ac9f92867e7d7d7d7d7d7d7d7d7d7e7e7e7f7f7f7f80808081818182828283827b6e6155483b3433302b241c140b0100000000000000000000000000000000000000000000000815212e3b4854616e7b8798999a9b9c9d9fa29b8e8174685b4e4135281b0e0200000000000102040506050000000000000000000000000000000000000c1926333f4c5966727f81807e7d7c7b7b7a7979797979797a7a7a7a7a7b7b7c7c7d7e808183837c6e727e8b98a5b1bec6baaea298928d807467584e43372b2834404b55606d7884919da7b1bcc8c4bdb9b3aba39992867c6f6256493c2f2316090000000000000000010911181e22252628272727272626262525252a3743505d6a7683909da9b6c3bfb2a5998c7f7266594c3f3326212121212121212936434f5c6976828f9ca9b5c2cbbeb2a5988b7f7265584c3f32252525262626272727282726231f19120a0200000000000000000714212d3a4754606d7a8793a0b5b5b5a79b918b89898989899095a0acb4afa399928989898a8b8b8c8d8e8e897c6f76838b8a89898888888888888888888888888888898a8a8b887b6e64717e8a97a4b1bdb5a99c8f8276695c4f43362e2d2a261f180f06000000020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e7164584b3e363a41454c52565e61696e747b81878f949ea0a8aeb4bcc1cacfd4d1cdc8c7c0bbb9b2a89b8f8275665c5145382c1f130600000000000000000000000000000000010a111a212a303940454b515357565d616161605c545653504a443f382f414e5b6874818e9ba29e9d9b999696918f8c8986827f7b7774706c66615e57534e47433c352f281f18120b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0bdb0a3968a7d706f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f74808d9aa7b3c0c3b6a99c908376695d5043362a1d10030000000000000000000000000000000000000000050e171e252a2d2e2f2f2e2e2d2d2d2b27222b2b2a2a2929292828292929292929292a2a2a2a2a2a2b24292c2d2e2f30313233343536352e2d2a251f170e05000000000000000000000000000000000000010911181e22252626282c2b303d495663707c8996a3afbcb3a79a8d8074675a505d6a7783909daab6bbafa295887c6f6255493c34414d5a6774808d9aa7b3b6aa9d9083776a5d5b6874818e9ba7b4c1bbaea295887b6f6255483c2f2215090000000000000000000000020a11171c1f2a3744505d6a7783908f8f8f8e8e8e8d8d8d8c8c8c8c8b8b8b8a8a8a8a8a8a8a8a8a8d929ca8b4c1c6baaea298928a8a8a8a8a8a8a8a8a8a8a8b8b8b8c8c8c8d8d8d8d8e8e8e8f8f8f887b6e6255483b2f22231f19120b020000000000000000000000000000000000000000000000000714202d3a4753606d79868b8c8d8e8f909298968e8275685b4f4235281c0f0200000000000000000000000000000000000000000000000000000000000c1825323e4b57636d72747372706f6e6e6d6d676c666d6d6d6d6d6d6d6e6e6f707071737476776e6a727e8b98a5b1becabfb4aaa2978a7d7064574a3d3126232e3944505c66717d8a95a0acb8bdb9b2aca9a29e98928e8175685b4e4235281b0f020000000000000009131b23292e31323434343433333332323231313743505d6a7683909da9b6c3bfb2a5998c7f7266594c3f332e2e2e2e2e2e2e2e2e36424f5c6975828f9ca8b5c2cbbfb2a5988c7f7265594c3f323132323233333334343433322f2a241c140a00000000000000000713202d3a4653606d798699a3afbbb1a4988b7f7c7c7c7c7d83909daab6ac9f92877d7c7d7d7e7f7f808181827a6e6f7d7e7d7d7c7b7b7b7b7b7b7b7b7b7b7b7b7b7c7c7d7d7e7e786d64717e8a97a4b1bdb5a99c8f8276695c4f433f3b3a36312921180d030000020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e7164584b3e42464c52565e61686e747b81878e93999ea6acb2babfc6ced2cec8c5c3bcb8b5afaca8a09d9285796d6053463a2d201307000000000000000000000000000000000a131c232c333c434b51555c606468686d6e6e6d666863605c545049413b44505d6a7783909a989b9ea2a9a8a19e9b9998928f8b8884807d78736e69625f58534e45403a3128231d150c0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0beb2a5988b7f7c7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7c818e9ba8b4c1c3b6a99c908376695d5043362a1d1003000000000000000000000000000000000000000000050d14191e2021232221212120201f1b171e1e1e1d1d1c1c1c1c1c1c1c1c1c1d1d1d1d1d1d1d1e1e181d1f202122232425262728292821201e1a140d050000000000000000000000000000000000000000010b141d252b3033343938373d495663707c8996a3afbcb3a79a8d8074675a505d6a7783909daab6bbafa295887c6f6255493c38414d5a6774808d9aa7b3b6aa9d9083776a5d5b6874818e9ba7b4c1bbaea295887b6f6255483c2f22150900000000000000000000000000060b101b2835424e5b6875818e9b9c9b9b9b9a9a9a9999999998989897979797979797979797999ca4aeb9c4cabfb4aaa29f9797979797979797979797979898989999999a9a9a9b9b9b9b9c9386796d6053463a2d2013130e08010000000000000000000000000000000000000000000000000006131f2c3845515d676f7c7f7f808182848587898b8174675a4e4134271b0e0100000000000000000000000000000000000000000000000000000000000a16222e3a46515b63666766656362626161605c605c606060606060616162626364656668696a6265727e8b98a5b1bed0c6b8aca096877a6d6154473a2e211d28343f4a54606c7883909daab4b2aca8a09e97928c86817a6e6154473b2e2114080000000000000007111b252d353a3e3f4141414040403f3f3f3e3e3e3e43505d6a7683909da9b6c3bfb2a5998c7f7266594c3f3b3b3b3b3b3b3b3b3b3b3b424f5b6875828e9ba8b5c1ccbfb2a6998c7f7366594c403e3e3e3f3f3f4040404141403f3b362e261c12080000000000000006121f2c3844515c667986929facb9afa295897c6f6f6f6f76838f9ca9b6ac9f9286796f7071717273737475766e686b6f7171706f6f6f6e6e6e6e6e6e6e6e6e6f6f6f6f707171716d6664717e8a97a4b1bdb5a99c8f8276695c4f4b4c4846423b33291f14090000020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e7164584b484d53565d60686d737a80868e92999fa4abb0b9bdc4cbcac7c5c2bcb8b7b1acaba49f9c96918b83786c605346392d20130600000000000000000000000000000009121c252d353e454e555c60676d7175787a7b7b797875706d66605b534d45414d5a67748087898c8e9297999da0a8a8aaa39f9c9896918d89847f7b756f6a625f58514b433e342e271e170f07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0c0b3a79b918b888888888888888888888888888888888888888888888888888888888888888888888888888888888e939eaab6c2c3b6a99c908376695d5043362a1d10030000000000000000000000000000000000000000000002080d11141416151514141413120f0b0611111010100f0f0f0f0f0f0f101010101010111111070c1013141516171718191a1b1c1c1414110e090200000000000000000000000000000000000000000008131d262f363c404145454444495663707c8996a3afbcb3a79a8d8074675a505d6a7783909daab6bbafa295887c6f6255494445454d5a6774808d9aa7b3b6aa9d9083776a5d5b6874818e9ba7b4c1bbaea295887b6f6255483c2f2215090000000000000000000000000000030f1b27333f49536875818e9b9f9e9e9d9c9c9b9b9b9a9a9a9999999998989898989898989b9da5afbac6cbbfb4aaa39f98989898989898989899999a9a9b9b9c9c9d9d9e9e9f9fa3aa9f9286796c605346392d2013060300000000000000000000000000000000000000000000000000000004101d2935404b555f6a6f727273747577797b7d7e7a6d6154473a2e21140700000000000000000000000000000000000000000000000000000000000006121e2a353f495157595b5958575655545453514b5053535353545454545556565758595b5c5d5865727e8b98a5b1becbc4b7aa9d918477685e5246392d2017232e3844505b65727f8b98a3aea8a19e96918b85807a746e685e5246392d201407000000000000010d18232d373f464a4c4e4e4d4d4d4c4c4c4c4b4b4b4a4a505d6a7683909da9b6c3bfb2a5998c7f7266594c474747474747474747474747474e5b6875818e9ba8b4c1ccbfb2a6998c7f7366594c4a4b4b4b4c4c4c4d4d4d4e4e4d4b4740382e24190e0200000000000004101c2834404a5f6c7985929facb8afa295897c6f63636976838f9ca9b6ac9f9286796c636464656667676869615e60636564636262626262626262626262626262626363646565605c64717e8a97a4b1bdb5a99c8f8276695c58585955534d453b31261a0e0200020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e7164584f54575e61686d737a80868d92989fa3abafb5bdc1c9c5c4bfbab8b5b1acaaa7a09d99938f89847e786d655b5044372b1f1205000000000000000000000000000007111b242d373f474f575f676d72797e82858788888684817d78726c655e5750474c58646e747a7c7f8285898c91969a9fa2aaaca9a8a09e9a96918c87817c756f6a605d55504540393029211910070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0c3b8ada39b98959595959595959595959595959595959595959595959595959595959595959595959595959595959b9ea5afbac6c3b6a99c908376695d5043362a1d1003000000000000000000000000000000000000000000000000010507080908080807070605030000040404030302020202020303030303030304040404000004060708090a0b0c0d0e0f100f0807050200000000000000000000000000000000000000000000030f1a252f3841484c4e52525150505663707c8996a3afbcb3a79a8d8074675a505d6a7783909daab6bbafa295887c6f6255505151524e5b6774818e9aa7b4b7aa9d9084776a5d5b6874818e9ba7b4c1bbaea295887b6f6255483c2f22150900000000000000000000000000020c141f2b3744505b657783909892919190908f8e8e8e8e8d8d8d8c8c8c8c8c8c8c8c8c8c8c8e939da9b6c2c7baaea398928c8c8c8c8c8c8c8c8c8c8c8d8d8e8e8f8f90909191929298939499877b6e6154483b2e21150a03000000000000000000000000000000000000000000000000000000000c18242f39434e585f626566676869656c6e70716d685e5246392d201307000000000000000000000000000000000000000000000000000000000000020d18232e373f464b4c4e4d4b4a494848474645404446464747474747484849494a4b4d4e50515865727e8b98a5b1becbc1b4a79b8e817468564c41362a1d111c27333f4953606d7a86929fa39f96918a847f79736e68615e564d41362a1e110500000000000006121e29353f495157595b5a5a5a5a595959585858575757565d6a7683909da9b6c3bfb2a5998c7f7266595454545454545454545454545454545b6774818e9aa7b4c1ccbfb2a5998c7f7266595757575858585959595a5a5a5b5a58524a40362a1f1307000000000000000c18232e45525f6b7885929eabb8afa295897c6f625c6976838f9ca9b6ac9f9286796c5f57585859555d60656565646464636363626261616160605c6060606060606060606060606064717e8a97a4b1bdb5a99c8f82766964656565615f574d42362a1e120500020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e716458596063696e737a80858d92989fa3aaafb5bbc0c6c3bdb9b7b4aeaca8a7a09d9995908c87827d78716d665c53493f33271b0f0300000000000000000000000000050f19232d373f495159616a6e797f858a8f9297949993918e89847f776e69615a5048525c64676d6f7275797c7f84898d92989ea1a9aeacaaa8a19e99928e87817c736d67615a514b423b332b2219100700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0c5b9aea49d9a989898989898989898989898989898989898989898989898989898989898989898989898989898989c9fa6b0bbc7c3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814202b36414a53595b5f5e5e5d5d5c63707c8996a3afbcb3a79a8d8074675a595d6a7783909daab6bbafa295887c6f625c5d5d5e5f585b6874818e9ba7b4b7aa9e9184776b5e5b6875818e9ba8b4c1bbaea295887b6f6255483c2f221509000000000000000000000000000a141e262e394653606c7886878685858483838282818181818080807f7f7f7f7f7f7f7f7f7f818e9ba7b4c1c5b8ac9f92867f7f7f7f7f7f7f7f7f7f8080818182828383848485858686868787887d7063574a3d30231c150c0300000000000000000000000000000000000000000000000000000007121d27313c464e535558595a5b535b60616365615e564c41362a1e11050000000000000000000000000000000000000000000000000000000000000007111c252e353a3e3f41403f3d3c3b3b3a3a3834383a3a3a3a3a3a3a3b3b3c3d3d3e4041434c5865727f8b98a5b2becbbeb1a4988b7e7165584b3e3025190d17222d3845525d6875818e9b99928c847e78726d67615e56524d443b3025190e020000000000000916222e3a46515b6265676767676666666565656464646363636a7683909da9b6c3bfb2a5998c7f726661616161616161616161616161616161616774818d9aa7b4c0cbbfb2a5988c7f7265636364646465656566666667676766635c52473b2f23170a00000000000000071f2b3845525e6b7885919eabb8afa295897c6f625c6976838f9ca9b6ac9f9286796c5f534b4c515d676d72727271717070706f6f6f6e6e6d6d6d666c6c6c6c6c6c6c6c6c6c6c6c6c6c717e8a97a4b1bdb5a99c8f827670717172726e695f53463a2d21140700020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e716460656b70757b80858c92989fa2aaaeb4bbc0c0bbb9b6b2adabaaa29f9c9895908c88837f7b75706c65605c544a41382d22170b00000000000000000000000000020b17212b353f49515b636b707c848c92979b9ea1a9a49f9e9b96918b827b706c615a504a52555d606365666c6f73777c81858c92979fa2aaafb2acaba39f9a938e878079706c605c544d453c342b22191007000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0c2b5a99d928d8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8f949fabb7c4c3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1824303c48535d64676c6b6a6a696968707c8996a3afbcb3a79a8d8074676666666a7783909daab6bbafa295887c6f68696a6a6b6b65626875818e9ba8b4b7ab9e9184786b5e5b6875828e9ba8b5c1bbaea295887b6f6255483c2f22150900000000000000000000000006111c2630383f44505b656e7a7a797978777776757575747474747373737272727272727272727d8a97a3b0bdc5b8ab9f92857872727272727272727273737474757576767777787879797a7a7b7b786d6053463a342e261e150a000000000000000000000000000000000000000000000000000000010b151f2a343c4347494c4c4d4e49505354565854524c443a3025190d0100000000000000000000000000000000000000000000000000000000000000000a131c232a2e3233343332302f2f2e2e2d2c282b2d2d2d2d2d2d2e2e2f2f30313233353f4c5965727f8c98a5b2bfcabdb0a3978a7d7064574a3d31241708111b2935414c5663707c899692878079716c66605d55524c46413b32291f1408000000000000000b1825313e4a57626d72747474737373727272717171717070706f7683909da9b6c3bfb2a5998c7f726e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e74808d9aa7b3c0cbbeb2a5988b7f726f7070707171717272727373737474736e63584b3f3226190c00000000000005121e2b3845515e6b7884919eabb7afa295897c6f625c6976838f9ca9b6ac9f9286796c5f534b4b53606d797f7f7e7e7e7d7d7c7c7c7b7b7b7a7a79797979797979797979797979797979797e8a97a4b1bdb6aa9d90837d7d7e7e7e7f7b6e6155483b2e22150800020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e71676d72777d82878d92979fa2aaaeb4babbb9b6b5afaca9a8a19e9a98928f8b8783807b77726e6963605b53504a42382f261b1106000000000000000000000000000a141d29333d47515b636d727d8691969ea2a9abadb3afacaba9a19e948f857e716c61584e444c515456545b6062666a6f747a7f858c92989ea5adb3b5afaca49f99928d847d746d665e574e463d342b22190f060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0c0b4a79a8d807e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e828f9ca9b6c2c3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d1a2733404c59646f7478787777767675747d8996a3afbcb3a79a8d807473737373737783909daab6bbafa295887c75757676777878726d6875828e9ba8b5b8ab9e9285786b5f5c6875828f9ba8b5c2bbafa295887c6f6255493c2f2216090000000000000000000000000b17232e38424a5053535e686e6d6c666b6b6a69696868686767676666666665656565656565707d8a97a3b0bdc5b8ab9f9285786c6565656565656566666767686869696a6a6b6b6c666d6d6d6e6e6d665c5046443f3830261c1106000000000000000000000000000000000000000000000000000000030d18222a32373b3c3f3f40413f4446484a4b4746413a32291e1308000000000000000000000000000000000000000000000000000000000000000000010a11181e2225262826252423222121201f1c1f2020202021212121222323242526333f4c5966727f8c99a5b2bfcabdb0a4978a7d7164574a3e3124170b0d1924303a4854606b778490857d736d67605b54514b46413b36302920170d02000000000000000c1926323f4c5965727f81818080807f7f7f7f7e7e7e7d7d7d7c7c7c83909daab7c3bfb3a6998c807a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a818e9aa7b4c1ccc0b3a6998d807c7c7d7d7d7e7e7e7f7f7f80808081818073665a4d4033271a0d00000000000005121e2b3845515e6b7884919eabb7afa295897c6f625c6976838f9ca9b6ac9f9286796c5f57585858616e7a878b8b8b8a8a8a898988888887878786868686868686868686868686868686868a909aa6b2bfb8ab9f95908a8a8a8b8b8b7e7164584b3e3125180b00020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e71747a7f84898f92999fa2a9aeb4b9b6b5afaca9aba49f9d9996918d8a86827e7b77736e6a65615e57535049443f3830261d140a0000000000000000000000000006111b262f3b454f59626d727f879298a0a8adb3b8b9bebbb9b8b2ada69f9792877e716a60564c414547494a505356586062686d72797f868e939ea1a9b0bbb6afaba39f96918a80786e6960584e463d342b21180d0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0bdb0a3968a7d72727272727272727272727272727272727272727272727272727272727272727272727272727274808d9aa7b3c0c3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2834414e5b6774818585848383828281828f9ca8b5c0b6a99d90827f7f7f7f7f7f7f84919eabb8c1b5a89b8f81818283838484857f726875828f9ba8aeafac9f9285796c5f5c6975828f9ca8b5c2bcafa295897c6f6256493c2f231609000000000000000000000003101c28343f4a545c605c565e6160605b5e5e5d5d5c5b5b5b5b5a5a5a59595959595959595964707d8a97a3b0bdc5b8ab9f9285786c5f59595959595959595a5a5b5b5c5c5d5d5e5e5f5c6060616162605c5f5e53504a42382e23170c0000000000000000000000000000000000000000000000000000000007101820262b2e2f3233342d3337393b3d3e3a3936302920170d020000000000000000000000000000000000000000000000000000000000000000000000070d121618191b1a18171615151413131012131314141414141515161617192633404c5966737f8c99a6b2bfcabdb1a4978a7e7164574b3e3124180b08131e2c38444f5964717e837b6f6b605d55504a45403936302a251f170e050000000000000003101c2936434f5c6976828e8d8d8d8d8c8c8c8b8b8b8a8a8a898989889095a0acb8c5c1b4a89c928c8787878787878787878787878787878787878787878e939da9b5c2cdc1b4a89c928d8989898a8a8a8b8b8b8c8c8c8d8d8d8e85786b5e5245382b1f1205000000000005121e2b3845515e6b7884919eabb7afa295897c6f62626976838f9ca9b6ac9f9286796c63646465656668788592989797979696969595949494939393939393939393939393939393939393979aa2acb2b2b3b1a79f9d9697979895887b6e6255483b2f22150800020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e7b81858b91959b9fa3abadb3b4aeaca9aba39f9d999993908c8884817d7975726e6966625f5854524d46443f38342e261e150b02000000000000000000000000000b17222d38414d57606b727f8b9399a2aab2b9bec5c6c9c7c6c4bdb9b0a9a29992877c6f685e52463e3a3c3f4446494e54565d60676d737b818a92979fa6aebbbbb5afa8a19e928d837b6f6a60584e463d332a1f160c01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0bdb0a3968a7d70656565656565656565656565656565656565656565656565656565656565656565656565656774808d9aa7b3c0c3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2834414e5b6774818e919190908f8f8e8f949eaab4b3b3ab9f95908c8c8c8c8c8c8c9196a1adb4b4b4aa9e938f8e8f8f9090918a7d716975828f9ca1a1a2a49f928679665c5c6976828f9ca9b5c2bcafa296897c6f6356493c30231609000000000000000000000006121f2b3844505c666d666b6b6a6a696968686868676767676767666666666666666666666666707d8a97a3b0bdc5b8ab9f9285786c66666666666666666666676767686868686969696a6a6a6a6b6b6b6b6c6b605c544a3f34281c100300000000000000000000000000000000000000000000000000000000070e151b1f212225262722272b2d2e30322e2d2a251e170e050000000000000000000000000000000000000000000000000000000000000000000000000002060a0c0c0e0d0c0a0908080707060406070707070707070808090a0d1a2633404d596673808c99a6b3bfcbbeb1a4988b7e7165584b3e3225180b02101b27323d4955616c71766e696059514b443f38352f2a251e19140d050000000000000000000d1a2733404d5a6673808d999a9a99999998989897979796969696959da0a7b1bcc8c4b9aea49c999494949494949494949494949494949494949494949a9da5afbac5d0c4b9aea49c99959696969797979898989999999a9a8e8275685b4f4235281c0700000000000005121e2b3845515e6b7884919eabb7afa295897c6f6f6f6f76838f9ca9b6ac9f92867970707171727272707784919ea4a4a3a3a3a2a2a2a1a1a0a0a09f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa3a3a4a4a5a6a6a7a7a8a8a3a3a4a093867a6d6053473a2d20140700020f1c2935424f5c6875828f9ba8b5c2cec4b7ab9e9184888d92989da0a8acafaeaca9aaa39f9c999992908d8a86837f7c7874706d6765615e5755534e4846423b37332d28231c150c0300000000000000000000000000030f1b27333f49535e696f7d87929fa4abb3bcc3cacfc7c7cbd2cfc9c2bcb3aba39991847a6d61594f43392f3338393d43474c52555d60696e757d858f949da4afb6bebbb2ada49d9590857c6f6a60584e453c31281d1207000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0bdb0a3968a7d70636161616161616161616161616161616161616161616161616161616161616161616161616774808d9aa7b3c0c3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d1a2734404d5a6773808d9a9d9d9c9c9b9b9c9ea6a7a7a7a6a6a79f9d999999999999999ea1a9a7a7a7a8a8a59e9b9b9b9c9d9d96897c6f6976828f94949595979a9986796d605c6976838f9ca9b6c2bcafa396897c706356493d3023160a00000000000000000000000713202d3a4653606d787978787776767575757474747474747473737373737373737373737373737d8a97a3b0bdc5b8ab9f928578737373737373737373737373747474757575757676767777777778787879786d665c5044382c1f12060000000000000000000000000000000000000000000000000000000000040a0f13151619191a171b1f2021232521201e19130d050000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000d1a2733404d5a6673808d99a6b3c0cbbeb1a5988b7e7265584b3f3225180c000b16212d3945505a61646a615f574f454039332d29241d19140e0802000000000000000000000c1925323f4c5865727f8b98a5a6a6a6a5a5a5a4a4a4a4a3a3a3a2a2aaacb1b9c3cecabfb6aea8a6a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a7a9afb7c0cbd5cac0b6aea8a6a2a2a3a3a3a4a4a4a5a5a5a6a6a6998d8073665a4d402f24180c00000000000005121e2b3845515e6b7884919eabb7b1a4988b7e7c7c7c7c7c83909daab6ac9f92877d7d7d7d7e7e7f7f7d7885919c9b9b9a9998989897979796969695959595959595959595959595959596969797989899999a9a9b9b9c9c9d9d94877b6e6154483b2e21150800020f1c2935424f5c6875828f9ba8b5c2cec5b9ada19691969a9fa2aaaba9a6aaa29f9c999892908c898683807d7a76726f6a6763605d5554524d4847433c3a36302b27221b17110a0300000000000000000000000000020d17202b3744505b656e7b859299a3aeb5bdc5c5c4bdbababec5c6cacec5bdb4aba1968e81756b61554b4035292b2d32373a41454b51565e616c707a828d929fa4acb6c0bdb9aea79f9792857c6f6a60574d43392f24180e050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0bdb0a3968a7d706e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e74808d9aa7b3c0c3b6a99d9083766a5d5043372a1d100400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d1a2734404d5a6773808d9a9f9e9d9c9c9b9b9b9b9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9b9b9b9c9c9d9d9e9e9fa396897c6f68758188878788888a8d90867a6d605c6976838f9ca9b6bebcafa396897c706356493d3023160a00000000000000000000020f1b2835424e5b687581868584848383828281818181818180808080808080808080808080808080818e9ba8b5bebeb9ac9f92868080808080808080808080808080818181828282828383838484848485858584796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000030608090c0c060b0f12131517181413110d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d1a2734404d5a6773808d9aa6b3c0cbbeb2a5988b7f7265584c3f3225190c0004111c28333e485055575d55534d453d352f28221c18120e08020000000000000000000000030f1b27333f49536773808d9aa3a3a2a2a2a1a1a0a49f9f9e9e9e9d9d9fa2aab4becac9bdb2a8a19e9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9ea1a9b3bec9d5c9beb3a9a19e9e9e9f9fa4a0a1a1a2a2a3a3a4a49a8e817467554b4035291d1004000000000005121e2b3845515e6b7884919eabb7b3a69b908b89898989899095a0abb8afa3999289898a8a8b8b8b8c807a86908f8f8e8d8c8c8b8b8a8a8a8a898989898989898989898989898989898989898a8a8b8c8c8d8d8e8e8f8f90909191897c6f6356493c3023160900020f1c2935424f5c6875828f9ba8b5c2cec9bdb2a8a19ea1a8a6a9a29e9c9a9798928f8c898683807d7a7673706d6866625f585753514b4846423b3a37312d2a251f1b17110c0600000000000000000000000000000008131e2935404b55606c77839097a1abb5bfc4bdb9b7b1adadb1b8babec5cec6bdb2a99e938a7d70675d51453a302520272b2f353940454d525a61686e78808b939aa4afbbbfc0b9b1a9a19792867c6f695f554b40352920160c0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1beb1a4978b7e7b7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7b818e9aa7b4c1c3b7aa9d9084776a5d5144372a1e110400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1b2835414e5b6874818e989291908f8f8f8e8e8e8e8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8e8e8f8f8f909091929299948a7d70636d7a7b7a7b7b7c7e808384786d605d697683909ca9b0b1b3b0a396897d7063564a3d3023170a00000000000000000000010d1a2734404d5a6773808d929191908f8f8e8e8e8e8e8d8d8d8d8d8d8d8c8c8c8c8c8c8c8c8c8c8c8e939eaab2b2b2b2aea398928c8c8c8c8c8c8c8c8c8c8c8d8d8d8d8e8e8e8f8f8f8f9090909191919192928578665c5044382c1f1206000000000000000000000000000000000000000000000000000000000000000000000000000000030506080a0b070705010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cbbfb2a5988c7f7265594c3f3226190c00000c17222c363e45494a504846423c3329241d17110c07010000000000000000000000000005121f2b3744505b6575828f9797969695959494939a939292919190909298a2aebac6c5b9aca196919090909090909090909090909090909090909090909297a1adb9c6d2c6b9ada19792919292939a94949495959696979798908376675d5145382c1f1306000000000005121e2b3845515e6b7884919eabb7b7aca29b9895959595959da0a7b1bcb5aba39f969696979798978b7e7c848383828180807f7e7e7e7d7d7d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d7d7e7e7f7f80808181828283838484857d7063574a3d3024170a00020f1c2935424f5c6875828f9ba8b5c2ceccc0b6aca49f9e9b999697928f8d8a8885827f7c797673706d676663605d5655534e4a4745403b3a36302e2b26201e1a140f0b0600000000000000000000000000000000010d1925303945515d67717e8b959fa9b3bdc1bab2acaba4a1a0a4abadb3bcc4ccc4bbafa59e9184796d60564c4135291e1b1e24292f353b424650565e666d747f88939fa3adb6c0c2bbb3a9a29892857b6e675d51453f32281e130800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4bcbcb2a69b908b878787878787878787878787878787878787878787878787878787878787878787878787878787878e939da9b5bdbdb7aa9d9184776a5e5144372b1e11040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111d2a3744505d6a778387868584838382828281818181808080808080808080808080808080808081818182828383838485868687887f7265686d6e6e6e6e6f717477786d665c5d6a7683909da3a4a5a6a9a3968a7d7063574a3d3024170a00000000000000000000000c1926333f4c5966727f8c999e9d9d9c9c9b9b9b9b9a9a9a9a9a9a999999999999999999999999999b9ea5a5a5a5a5a5a5aaa39f9999999999999999999999999a9a9a9b9b9b9b9c9c9c9d9d9d9d9e9e9e9c90837669544a3f34281c1003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0ccbfb2a6998c7f7366594c403326190d000005101a242c33393c3e433b3a37312a2118120b06000000000000000000000000000000000613202d394653606c79858b8a8a89898888888787868685858584848386929fabb8c5c4b7ab9e918483838383838383838383838383838383838383838385929eabb8c5d1c5b8ab9e928584858586868787888889898a8a8b8b8c867a6d6053473a2d201407000000000005121e2b3845515e6b7884919eabb7baafa59e9b9a9a9a9a9a9ea1a8b2bdb6aca49f9b9c9d9d9e9f968a7d707877767574747372727171717070706f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7070717172737374747575767677777878706b6155483c2f23160900020f1c2935424f5c6875828f9ba8b5c2cec8bbafa49a93918e8c8a878582807e7b797673706d676663605d555754524c4847433d3a38352f2d2a25211f1a15120e090300000000000000000000000000000000000005111e2a36414c56606d7984919ea7b1bbc1b7afa8a19e979494989fa2a9b2bac4cdc1b9aca1968c7f73685e52463a30251913191d242930363e444c545c606d727f8b919ba4aeb8c2c5bbb3aaa2979083796d605b51443a3025190d04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004060f1c2935424f5c6875828f9ba8b0afafafaca29b97949494949494949494949494949494949494949494949494949494949494949494949494949494949a9da5afafb0b0b1aa9e9184776b5e5144382b1e110806030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7b7a797878777675757575747474747373737373737373737373737373737474747575757676777778797a7a7b796d605d60626161626264676a6b605c545d6a77839097969798999c9f978a7d7064574a3d3124170a00000000000000000000000d1a2633404d596673808c999e9d9c9c9b9b9a9a9a9a99999999999898989fa2aaa29f99989898989898989898989898989898989d9fa7a6a6a9a19e9998989899999a9a9a9b9b9c9c9c9d9d9d9e9e9f9f9c90837669564c41362a1e1105000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2834414e5b6774818e9aa7b4c1d0bfb3a6998c807366594d4033261a0d00000008121a22282d3031372e2d2b261f180f0701000000000000000000000000000000000005121f2b3744505b65717e7e7d7d7d7c7c7b7b7a7a797979787877777683909da9b6c3bfb2a5998c7f767676767676767676767676767676767676767676818e9ba8b5c1cbbeb1a4988b7e787879797a7a7a7b7b7c7c7d7d7e7e7f7f786d6053463a2d201307000000000005121e2b3845515e6b7884919eabb7b6aa9e938e8d8d8d8d8d9196a1adb9afa49a938e8f90919192988b7f726c717e7e7b787572706d67656463636362626262626262626262626262626263636464656b6f7c80796d6869696a6a6b6b6361594f44382c20140700020f1c2935424f5c6875828f9ba8b5c2cec6b9ac9f938884827f7d7b787673716f6d666663605c555653514b4a4745413c3b37322d2c2924201e1a14120f0a050200000000000000000000000000000000000000000713202d3946525e6873808c96a1adb9c1b7afa59e96918a87878b9297a1a8b2bcc6c9bdb2a89f92857a6d61564c41362a1c110d12181f252a323b424a505b626d727f8c929da6b0bbc5c5bcb3a9a0958e81756d62564c41362a20150a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c1013141c2936424f5c6975828f9ca3a3a3a2a2a1a1a1a0a0a0a0a0a0a0a0a0a1a1a1a1a1a1a1a1a1a1a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a1a1a2a2a2a3a3a4a4a49e9185786b5e5245382b1f1615130f0a04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a46525e696e6d6d666b6a696968686868676767676767676767676767676767676767676768686869696a6a6b6b676d6e6e6d675d52545554545555575a5d5e53504a5d6976838b8a898a8b8c8f92988a7d7164574a3e3124170b00000000000000000000020e1b2835414e5b6874818e919190908f8e8e8d8d8d8d8d8c8c8c8c8c8c8c9298a298928d8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b90959faaada197918c8b8b8c8c8c8d8d8e8e8e8f8f909090919191929298928578685e5246392d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2834414e5b6774818e9aa7b4bebbbdb3a6998d8073665a4d4033271a0d000000000810171c2123242a22211e1a140e0600000000000000000000000000000000000000030f1b27333f4953626c71717170706f6f6f6e6e6d6d676c6b6b6b6a7683909da9b6c3bfb2a5998c7f726969696969696969696969696969696969696975828e9ba8b5c1cbbeb1a4988b7e716b6c676d6d6e6e6f6f707071717272726d665c5044382c1f1206000000000005121e2b3845515e6b7884919eabb7b4a89b8e81808080808084919eabb7ac9f938881828384858586877f73717e8a8b8885827f7c7975726e6964605c5556565656565656565656565656565659606b6f7d868d8073695e5d5d5e5e5f57554f473e33281c100400020f1c2935424f5c6875828f9ba8b5c2cbbeb1a4988b7e777573706e6969676462605c545653514b4a4745403d3a39352f2e2b26201f1d1814120e09060200000000000000000000000000000000000000000000000714212e3a4754616d7a86929fa9b2bdb9afa59e938e847e7a7a7e859196a1aab4bfcac4baaea2988d8073685e5246382e23170b070c1419202930383f44515b626d74808d949fa9b3bec9c5bcb1a79e938b7e72685e52463c32261b0f03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b12181c1f2023293643505c6976838f979796969595959494939393939393939393999ca3adadb3a9a29f9793939393939393939393939393939393939393939494949595969696979798989285786b5f5245382c2522221f1b150e0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111e2a36424d565e6161605c545d5c5c5c5b5b5b5b5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5b5b5c5c5c5d5d5e555d606162605d554b4748474848494b4d505146444955626f7c7e7d7d7d7e8082868a8a7d7063574a3d3024170a0000000000000000000004111e2a3744515d6a77838585848383828281818080808080807f7f7f7f7f86929f9285807f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f839098a2ab9e91857f7f7f7f7f808080818182828283838484848585868686887a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7adb3aeb0b2a79a8d8074675a4d4134271a0e0100000000050c111417171d1514120e09030000000000000000000000000000000000000000000b17222d3841505a626564646463636262616160605c5f5f5e5e6a7683909da9b6c3bfb2a5998c7f72665d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d6875828f9ba8b5c2cabeb1a4978b7e7164555c60616161626263636464656565605c544a3f34281c1003000000000005121e2b3845515e6b7884919eabb7afa295897c7373737376838f9ca9b6ac9f9286797676777879797a786d7783909797928f8c8986827e7b76716d67605c555049494949494949494949515a616b6f7d869292867b6e615a505151524a48443e352c21160b0000020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e71686663615e575a575553504a494745403d3a39352f2d2c2924211f1b1413100c0705020000000000000000000000000000000000000000000000000006131f2b37434e5865727f8c98a2aebbbdb1a79e938e8179716e6d717b849198a2aebac3cabeb3aa9f92867a6d61544a3f34281c100302090e171e262e343f49515b606d78828f97a1adb9c1cec3b9afa59f92857a6d61584e43372b1f15090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d151d23292c2d2f2f3643505c6976828b8a8a898989888888878786868686868686868c919ca8b4ada297928a8686868686868686868686868686868686868686878788888889898a8a8a8b8b8c85786c5f52453931322f2e2b26201910070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1925303b444d52545453504a50504f4f4f4e4e4e4e4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4e4e4e4f4f505050514b5153545553514b433a3b3b3b3b3c3e4144453a3b4754606a6f717070717273767a7d7f796d6053473a2d20140700000000000000000000000713202d3a4653606d7879787777767675747474747373737373727273808d98a29892857e7772727272727272727272727272727b85929fa6a19791857f7972737373747474757576767677777878787979797976685e5246392d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9b9fa2a9a1a3a5a79a8d8174675a4e4134271b0e0100000000000005080a0b1008070502000000000000000000000000000000000000000000000006111b262f3f485056585857575656555555545453514b52525d6a7683909da9b6c3bfb2a5998c7f7266595050505050505050505050505050505c6875828f9ba8b5c2cabeb1a4978b7e716458515354545555565657575858595953504a42382e23170c00000000000005121e2b3845515e6b7884919eabb7afa295897c6f67676976838f9ca9b6ac9f9286796c6a6a6b666d6d6d6e7b889095989d9b9998928f8b87827e79726d67615a524c443c3c3c3c434b515b636c717d869298988e81756c61584e45453d3c38332c231a10050000020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e7164595754524d4d4b4846443f3d3a38342f2d2c292421201d1915120f0a060400000000000000000000000000000000000000000000000000000000000815222e3b4754606a7783909daab4bfb5aba0958e81786d676161696f7c86929fa7b1bcc8c5baaea3988c7f72665c5044382b1f150a0000050c141c2328373f44505c666d7a85929ea5afbcc6cbc1baada2978d81746a5f53473c31261a0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b151f272f34383a3c3c3c3c4855626f7c7e7d7d7d7c7c7c7b7b7a7a7a797979797979797f8c99a9b3ab9f92857e787979797979797979797979797979797979797a7a7a7b7b7c7c7c7d7d7e7e7e7f7d7064574a3e3e3e3e3c3b37322a22190e04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141f29323b4246474746443f444342424242414141414040404040404040404040404040404141414242424343444440454747484745403a312f2e2e2f2f313437382d37434e586062656463646566676d70726d675d5145392c201306000000000000000000000006121f2c3844505c666d666b6b6a69696868676767676666666669707d8a929daaa297928b837d78726d67656565656565656569717e8b949fa9a197928c847f786f6b676768686969696a6a6a6b6b6c656c6d6d675e564c41362a1e1105000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020f1c2835424f5b6875828e919297949597999b9a8e8174675b4e4134281b0e010000000000000000000004000000000000000000000000000000000000000000000000000000000a141d2d363f454a4b4b4a4a4a49494848474746454045505d6a7683909da9b6c3bfb2a5998c7f7266594c434343434343434343434343434f5c6875828f9ba8b5c2cabdb1a4978a7e7164574b474747484849494a4a4b4b4c4c46443f3830261c110600000000000005121e2b3845515e6b7884919eabb7afa295897c6f625c6976838f9ca9b6ac9f9286796c5f5e545c6060616d7a8084888b90959a9f9f9c99938f8a857f79716c615e564e463c3f464e555c606d727e869298a29e938b7e716a5f574e463c342c28211a1108000000020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e7164584b484642403e3c3a38342e2d2c292320201d181413110d08060300000000000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c8895a0acbcbbaea3999183796d665d55575f6a727f8b959fabb8c3cbbfb4aa9e9184786d6053463c31261b0f010000020a11172528343f4a545e68717e8a939eaab4bfcbcabeb3a99f93877c6f62574d42372b1d120700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d2731394045474949494848535f6a6f71717070706f6f6e6e6e6d6d6d6d6d6d6d6d6f7c8997a2adada297928a817a706d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6e6e6f6f6f70707171717272706c61554a4a4b4b4b4947433c342a20150a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020d17202930363a3b3a3a38342e3636353535353434343434343434343434343434343434343434353535363637372f35393a3b3b3a39352f28222121222224272a2b27323c464e54555857565758555d606365605d554b4035291d1004000000000000000000000003101c28343f4a545c605c545e5d5d5c5b5b5a5a5a5a5a555d676e7b85929fa4aea9a29f94908a847f796d6058585858585857626c76828f99a4a9a29e97918b837c746d68615a5c5c5d5d5d5e5e5e5f5b6060605d554c443b3025190d01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717f8384858687888a8c8e908e8175685b4e4235281b0f02000000000000000000000000000000000000000000000000000000000000000000000000000000020b1b242d343a3d3e3e3e3d3d3c3c3c3b3b3a3a383444505d6a7783909daab6c3bfb2a6998c7f7366594c403636363636363636363636424f5c6975828f9ca8b5c2cabdb1a4978a7e7164574b3e3a3b3b3c3c3d3d3e3e3f3f3f3a38342e261e150a0000000000000005121e2b3845515e6b7884919eabb7afa295897c6f625c6976838f9ca9b6ac9f9286796c5f534a5053545e686d73777b7f83888d92989fa29f9c97918b847e756d685f584e464650585f676d747f889298a2aaa59f92867c6e695f584e463c31261a0f0800000000020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e7164584b3e3a3630312f2d2c2823201f1c181413100d070604010000000000000000000000000000000000000000000000000000000000000000000005121e2a36424d576774818d9aa7b1bcb4aa9f92877c6f675c544b4e58606c7883909da7b1bcc8c6b9ada1968a7d7064584e43372b1e130800000000061317232e38424c56616c75828f98a3aebac6cfc5bbafa4998f8276695f5347392f24180c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232f39434b5153565555555555585f626464646363626262616160606060606060606d7985929fabb3a9a29f938e847d736c6560606060606060606060606060606161616262636363646465656564615956575757585855544e463c32261b0f030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e171f252a2d2e2e2d2c2823292929282828282727272727272727272727272727272727272728282929292a2a24292c2d2e2f2d2c29241d1614151516181a1d1e202b343c4347494b4a4a4a4b4b5153575853514b43392f24180d010000000000000000000000000c17232e38424a5053504a5150504f4f4e4e4d4d4c555d676d79839097a2adb8b3ada69f9c96918c8275685c4f4c4c4c4c505a626f7c87939facada9a19e959089817a716c605d554b50515151524950535353514b433b32291e140800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1724313d4a56626c71777878797a7b7d7f8184868074675a4d4134271a0e010000000000000000000000000000000000000000000000000000000000000000000000000000000009121b22292e313231313130302f2f2e2e2d2d2c3744505d6a7783909daab6c3c0b3a6998d8073665a4d40332a2a2a2a2a2a2a2a2a36424f5c6975828f9ca8b5c2cabdb0a4978a7d7164574a3e312e2e2f2f303031313232322d2c28231c150c030000000000000005121e2b3845515e6b7884919eabb7afa295897c6f625c6976838f9ca9b6ac9f9286796c5f534d4e4e4c565e6166696e72777c80858d92989ea6a19e97918a817a6e6a60584e525a626a6e79818c939aa3aab4aea29891847b6f6a5f584e43372b1f120600000000020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e7164584b3e312a252422201f1c171413100c0706040100000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a46535f697885919eabb8baaea3988d80746a5f554b4244505b66707d8995a0acb8c4c9bdb2a89c8f82766a5f53473a2f24190d010000000006111c26303a44505a616e7b86929faab4bfcaccc0b5ab9f93877b6e61554b4035291d10040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2934404b555c60626262626261616161606060605c5f5f5f5f5f5e5e5e5e5e5e5e5c6675828f9ba8b5b3ada59e96918880776d675f575e5e5e5e5e5e5e5e5e5e5e5e5f5f5f5c6060606161616262626363636364646465625f584e43372b1f1306000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d14191e202121201f1c171d1c1c1c1b1b1b1b1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1b1b1b1c1c1d1d1d181d1f20212220201d18130c080808090b0e110f19222b32373b3c3e3d3d3e3f4045474a4c4745403931281d12070000000000000000000000000006111c2630383f4446443f44444343424141414c565e676d79828f959fa9b1ababa39f9b959089827b6e6154483f3f3f3f47535f6a74818e9ba7b1b2ada7a09d938e857e746d675d554b404445453f44464647454039312920170d0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915212e3a45505a62656a6b666d6d6e707275777a786d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000000000000000000000000000911181d21242525242423232222222121202a3744515d6a7784909daab7c3c0b3a69a8d8073675a4d4034271d1d1d1d1d1d1d2936424f5c6975828f9ca8b5c2cabdb0a4978a7d7164574a3e312422222323242425252626201f1c17110a03000000000000000005121e2b3845515e6b7884919eabb7afa295897c6f625c6976838f9ca9b6ac9f9286796c5f595a5b5b5c5a5854575f61656a6f747a80868f949fa3a9a19e938f847c6f6a60575e616c717c838e939fa4acb4bcb4aaa19691847c6f6a5f53473a2e21150800000000020f1c2935424f5c6875828f9ba8b5c2cabeb1a4978b7e7164584b3e31251a18151312100c060604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8897a1adb9b9ac9f92867b6e61584e43393f4a54606b7783909da9b2bec9c4b7ab9f94887c6f62564c4135291d110400000000000a151e29323e46535e6974808d98a2aebac6d2c7bbafa49a8d8073675d5145382c1f13060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c676d6f6f6f6f6e6e6e6e6d6d6d6d6d666c6c6c6c6b6b6b6b6b6b6b6b6b6b727e8b98a5b1bebaafa8a19a938c81796e696b6b6b6b6b6b6b6b6b6b6b6b6b6b6c6c666d6d6d6d6e6e6e6f6f6f707070717171716f6a5f54473b2e2215080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090e111414141312100c060f0f0f0f0e0e0e0e0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0e0e0e0f0f0f1010070c10131414151413110d07010000000000010407101920272b2e2f323130312f35393a3d3f3a39352f281f160c0100000000000000000000000000000a151e262e34383a38342e37363635353946525e686e79828f949fa7a8a7a09d99928f89837d766e695e53463a323237434e58626f7c8895a0acb2adaba8a59e97928a81796d675c514538382d3337393a3a39352f271f170e0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111d29343f485056585d545c606162646668676d6d665c5044382c1f120600000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c11151718181717171616151514141e2b3744515e6a7784919daab7c4c0b3a79a8d8074675a4d4134271a10101010101c2936434f5c6976828f9ca9b5c2cabdb0a3978a7d7064574a3d3124171516161717181819191312100c060000000000000000000005121e2b3845515e6b7884919eabb7afa295897c6f64646976838f9ca9b6ac9f9286796c66666767686867645c525355585f62686d737a828b9299a3aba59e9691857c6f6960696e757e8690959da5afb6b7b2acaaa8a09691857c6f6255483c2f22150900000000030f1c2936424f5c6975828f9ca8b5c2cbbeb1a5988b7e7265584b3f322518090907060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a9b3bdb2a89a8d8174695e52463c3138424f5964717e8b97a1adb9c6c7bbb0a69a8d8174685d5245392c2013080000000000030c17202a36424d57616d7a86929facb8c2cdccc0b6ac9f9285796d6053473a2e23170b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d797c7c7c7b7b7b7b7a7a7a7a7a79797979797878787877777777777777777b8895a1aebbc1bab2aca49f938f837b777777777777777777777777787878787979797a7a7a7b7b7b7b7c7c7c7d7d7d7e7e7e7c6f6255493c2f2216090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000205070807070603000003020202020101010101010101010101010101010101010101020202030304000004060708080706040100000000000000000000070f151b1f22222524232424292c2d30322d2c29241d160d04000000000000000000000000000000030c151c23282c2d2c28232a2a29282e3b4754616e7a838f949ea29f9c9895908b86827d76706b615e574d42362a26323c4754606a7783909daaa8a19e9b99979695938e82796d6053463a2d22272b2d2d2d2c29241d150d0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c18222d363f454a4b504a505354555759555d60605c544a3f34281c100300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105090b0b0b0b0a0a0909090808111e2b3744515e6a7784919daab7c4c1b4a79a8e8174675b4e4134281b0e030303101c2936434f5c6976828f9ca9b5c2cabdb0a3978a7d7064574a3d3124170a090a0a0b0b0c0c0c07060300000000000000000000000005121e2b3845515e6b7884919eabb7afa295897c7171717176838f9ca9b6ac9f92867972727373747575746e64584c484e53565e61686e757f879299a3aea8a19792857b6e6d727b828b9298a0a7afb1acaaa8a09d9996918d887d7064574a3d3124170a0000000003101c2936434f5c6976828f9ca9b5c2cbbeb2a5988b7f7265584c3f3225190c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3b9aca096887c6f62564d42342a2f3d4653606d7984919eaab4bfcac2b8ac9f92867a6d6054473a3024190d010000000000050e1a25313b46525e6874818d9aa6b0bcc7d2c7baada2978b7e7164544a3f34281c10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d898888888888878787878786868686858585858584848484848484848484919eaab7bcbcbcbeb6afa59e9591868484848484848484848484848485858586868686878787888888898989898a8a8a8b8b8074675a4d4134271a0e010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f13151618171717181d1f20242520201d18120c040000000000000000000000000000000000030a11171c1f201f1c171d1d1d293643505c6976838f959c9998928f8c88837f7a75706b636059534d453b3125202b37434e5865727f8b989b9896918e8c8b89888685827a6e6154473b2e211b1f2020201f1d18120b0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111b242d343a3d3e443f444647484a4c4b515453504a42382e23170c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111e2b3844515e6b7784919eaab7c4c1b4a79b8e8174685b4e4135281b0e020003101d293643505c6976838f9ca9b6c2cabdb0a4978a7d7164574a3e3124170b000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7b2a6998c7f7e7e7e7e7e83919daab7ac9f93877e7f7f80808181828074675a4e4143474c52565e616d727e87929fa5afa9a197908379797f868f939fa2aaaba8a7a09d9996918c8884807c706c6155493c3023160a0000000003101d293643505c6976838f9ca9b6c2cbbfb2a5988c7f7265594c3f3226190c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b556a7783909daab6b7aa9e9184776a6054443b30222c3844515c66727f8c98a2aebac7c6baaea2988b7e7165564c4135291d110500000000000009141f2a36414c56626f7c88949fabb7c4d0cabeb3a99b8f8275665c5044382b1f12060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7b87999595959494949493939393999292929292919191919191919191919196a0acafafafafafafafafa7a098929191919191919191919191919191929292939a9393949494959595969696969797978a7e7164574b3e3124180b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030608090b0a0a070c10131417191413100d07010000000000000000000000000000000000000000060c10121312100c061015222f3b4855626e7b848c908c8985827f7b77726d68636159544f46423b33291f1b27323c4754606d7a86928f8b8884817f7e7d7b7a78756e685e5246392d20141213131413100c0701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b22292e31322e34383a3a3b3d3f41454746443f3830261c11060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7c4c1b4a89b8e8175685b4e4235281b0f020003101d293643505c6976838f9ca9b6c2cabdb1a4978a7e7164574b3e3124180b000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7b4a89c928c8a8a8a8a8a9195a0acb8afa499938b8b8c8c8d8e8e8f8376695d5043373a41464c525b626c717e8b939eaab3a9a0958f82848c92989ea5a9a29f9b9895918c8884807c77736f6a615a5044392d2014080000000003101d2a3643505d697683909ca9b6c3ccbfb2a6998c7f7366594c403326190d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515d677985929facb8b3a6998d807366584e4332291f2834404a54616d7a86929facb8c5cabfb4aa9c8f8276685d5246392d201308000000000000030d1925303a47535f6a7683909ca9b6c3cdcfc5b8ab9f9285796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c7986929fa2a1a1a1a1a0a0a0a0a0a39f9f9f9f9e9e9e9e9e9e9e9e9e9e9e9ea0a8a3a3a3a3a3a3a3a3a3a3aaa29f9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9f9f9fa4a0a0a0a1a1a1a2a2a2a3a3a3a4a396897c706356493d3023160a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000406070a0c07060401000000000000000000000000000000000000000000000000030607060300000814212e3a47535f696e798083807c7975726f6a65615e56554f48443d363129211715202c3945525d68748185827e7b78757371706e6d6769615e564c41362a1e110506070706040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000911181d21242523282c2d2e2f312f35393a3a38342e261e150a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2c3845525f6b7885929eabb8c5c2b5a89b8f8275685c4f4235291c0f020003101d293643505c6976838f9ca9b6c2cabeb1a4978b7e7164584b3e3125180b000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7b8ada49c9997979797979da0a7b1bcb5aba49f989899999a9a9b8e8174685b4e42424241414146515a616c75818e98a3aeb1a79e948f90959fa19e9b9897928e8b8884807b77736f6a66625f5850473e33281c10040000000003101d2a3643505d697683909ca9b6c3ccbfb3a6998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8698a2aebab2a8968a7d7063574a3d322418232e3946525e6875828e9baab4bfcbc5b9ac9f92867a6d6154473a3024190d0100000000000008131e2b37434e5865727f8b98a7b1bcc8d3c6baada297897c6f6256493c2f2316080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a87999b9b9b9a9a9a9a9999999998989897979797969696969696969696969696969696969696969696969696969696969696969696969696969697979797989898999999999a9a9a9b9b9b9c9c9c978a7d7164574a3e3124170b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121e2b37424d575f676d7376736f6d6665625f5854524c48443d38332a251f170f111d2935414c56606d787a75726e696866646362605d5554524c443b3025190d01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c11151718171c1f2021222424292c2d2d2c28231c150c03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505b667985929facb8c5c2b5a89c8f8275695c4f4236291c0f030003101d293643505c6976838f9ca9b6c2c9beb1a4988b7e7165584b3e3225180b000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7b9aea49c9998989898989da0a8b2bdb5aba49f999a9b9b9c9d9a8d8074675a4d4f4f4e4e4d4d4c4c505a616d7a86929facb8b0a69e9c9d9d9796918e8c8885827e7b77736f6a66625f5855534e4640372e24190e020000000004101d2a3743505d6a7683909da9b6c3ccc0b3a6998d8073665a4d4033271a0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b8794aab4b9ada196877a6d6154473a2e21141c2935414c5664717e8a98a3aebac7c7bbaea3998b7e7164564c4135291d1104000000000000020f1b26313c4854616e7b8795a0acb8c4d1cabeb3a9998c7f7366594c402f24190d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1723303d4a5663707d898f8f8e8e8e8d8d8d8d8c8c8c8c8b8b8b8a8a8a8a898989898989898989898989898989898989898989898989898989898989898989898989898a8a8a8b8b8b8c8c8c8c8d8d8d8e8e8e8f8f8f8f908c7f7366594c403326190d0000000000000000000001040607080807070706030000050504040403030302020201010101010101010101010101010101010101010101010101010101010101010202020303030404040505000003050607070708070604010000000000000000000000000000020507080f0e08080602000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1a26313c454d555d6066696663605c5455534e4746413a38332c27211a140d050d1924303a44505c666d6d6765625f575958565553514b4746413b32291e140800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105090b060c101213141517181d2021201f1c17110a030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c798698a3aeb8b8bab5a99c8f8276695c4f4336291c10030003101c2936434f5c6976828f9ca9b5bbbcbeb1a5988b7e7265584b3f3225180c000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7b5a89c928d8b8b8b8b8b9196a0acb8afa499938d8d8e8f8f90918f8276695c555c5c5b5b5a5a595958585e6874818e9baab4b8b0aaa095918a8784827f7c7975726e6966625f585a5b5b5c5957524940352a1e13070000000004111d2a3744505d6a7783909daab6c3cdc0b3a79a8d8074675a4d4134271a0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915222f3c4855626f7b8895a2aeb7ab9e918478685e5246392d20131925303a4754606d7a86929facb8c5cbbfb5ab9c8f8275685d5245392c201307000000000000000a15202d3a46525e697783909daab6c3d0d0c2b6a99c8f837669564c4135291d110400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1723303d4a5663707d82828281818181808080807f7f7f7f7e7e7e7d7d7d7d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d7d7d7d7e7e7e7e7f7f7f808080818181818282828383837f7366594c403326190d000000000000000001070d111314151414141312100b06121111111010100f0f0f0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0f0f0f10101011111112120b0f1213141414141413110d07010000000000000000000002090e1114141c1b1514120e090300000000000000000000000000000000000000000000000000000000000000000000000004060708090a0a0908070604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009151f2a333c434b5153595d595653514a4847433c3936302c27211c160e09030008131e28343f4a545c60605d5555534d4c4b4a484745403b3936302920170d0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306070708070d1113141312100c0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8693aaababacaeb4a99c908376695d5043362a1d100300030f1c2936424f5c6975828f9ca8aeafafb1b2a5988b7f7265584c3f3225190c000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7b3a6998d807e7e7e7e7e84919daab7ac9f938780818182838384858276695f616868686767666666656564646f7c8998a2aebab7aa9d91837e7a7875726f6c66656565666666676768686866635b52473b2f23160a0000000004111e2a3744515d6a7784909daab7c3cdc0b4a79a8d8174675a4e4134271b0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afb6a99c8f837669564c41362a1e1113202c3945515d6775828f9babb4bfcbc5b9ac9f92867a6d6054473a2f24180c0000000000000005121e2a36424d576773808d9aa6b3c0d0d1c5b8ab9e928578685d5245392c20130600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916222f3c4854606b707575757574747474737373737272727171717170707070707070707070707070707070707070707070707070707070707070707070707070707070717171717272727373737474747475757576767677736d63574b3e3225190c00000000000000040c13181d202021212120201f1c171f1e1e1e1d1d1d1c1c1c1b1b1b1b1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1b1b1b1b1c1c1c1d1d1d1e1e1e1f171b1f202021212120201d18130c040000000000000000050d141a1e2021292722211e1a150f0b040000000000000000000000000000000000000000000000000000000000040607070c1013131416171716151413100c07060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030e18212a31394045474d504d494644403c3a37312d2a251e1c16100b05000000020b17232e38424a505353514b484742403e3d3b3a39352f2d2a251e170e0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001040607070603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a87949d9e9e9fa3aaa49d9083766a5d5043372a1d100400020f1c2935424f5c6875828f9ba2a1a2a3a4a7a5988c7f7265594c3f3226190c000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7afa295897c7272727276838f9ca9b6ac9f92867974747576777778767066696e757575747473737272717170707985929facb8b8ab9f928579707070707070717172727273737474747575736e63574b3f3225190c0000000005111e2b3844515e6b7784919eaab7c4cdc1b4a79a8e8174675b4e4134281b0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a96a3b0b5a89b8e8275685b4f423025190d111d2935414b5564717e8b99a3aebac7c7bbaea3998b7e7164554b4035291d1004000000000000020e1a25303e4a5764717d8a97a9b3becad2c6b9ada197877a6d6054473a2d21140700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202c38444f596063696968686867676767666666666565656464646463636363636363636363636363636363636363636363636363636363636363636363636363636464646465656566666666676767686868696969696a66635b51463b2f23160a000000000000040d161d24292c2d2e2e2d2d2d2b28232c2b2b2b2a2a2a292929282828272727272727272727272727272727272727272727272727272727272727282828292929292a2a2a2b2b2b22272b2d2d2d2e2e2d2c29241d160d04000000000000050e171f252a2d2e35342e2d2b261f1b16100b0500000000000000000000000000000000000000000000000104070c10131417181c1f20212223232322201f1c181312100b06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f181f272f35393a4043403c3a38342e2e2b26201d1913100b0500000000000006111c2630383f44464745403b3a373131302f2d2c2924201e19140d050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b889191919292989597999083776a5d5044372a1d110400020f1c2835424f5b6875828e9695949596989a9d998c7f7266594c3f3326190c000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7afa295897c6f65656976838f9ca9b6ac9f9286796c6868696a6b6b6966616e7b8182818180807f7f7f7e7e7d7d7d83909daab6baada2978c7f7c7c7c7c7d7d7d7e7e7f7f80808081818282807366594d4033261a0d0000000005121f2c3845525f6b7885929eabb8c5cec1b4a89b8e8175685b4e4235281b0f02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303d495663707c8996a3afb4a79a8e8174675b4e4134281b080d18242f3a4754606d7a86929facb9c5cbbfb5ab9c8f8275675d5145392c1f1306000000000000000915212e3b4854616e7b8797a2adbac6d3c9beb3a995887c6f6255493c2f221609000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c27333d474f54565c5c5c5b5b5b5a5a5a5a595959595858585757575756565656565656565656565656565656565656565656565656565656565656565656565656575757585858595959595a5a5a5b5b5b5c5c5c5c5d5d5957514940352a1e12060000000000010c161f282f35393a3b3b3a3a3a38342e38383837373736363635353534343434343434343434343434343434343434343434343434343434343434343535353636363737373838382d3337393a3a3a3b3a39352f281f160c0100000000030d17202930363a3b42413b3a37312c27211c170f0a040000000000000000000000000000000000000002080d1113181d1f202323282c2d2e2f30302f2e2d2c2923201f1c17110d080200000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d151d24292c2d333633302d2c2823211f1a15110d08020000000000000000000a141e262e34383a3a39352f2e2b26252322201f1d1814110d080200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000407090a0e0706040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030607090c0e101112121211100e0c090605030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7983848484858586888a8c8e84776a5d5144372a1e110400020f1b2835424e5b6875818a89888888898b8d90928c7f7366594c403326190d000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7afa295897c6f625c6976838f9ca9b6ac9f9286796c5f5c5c5d5e5e5c5663707d898f8e8e8d8d8c8c8b8b8a8a8a899095a0acb8beb3a99c918c89898989898a8a8b8b8b8c8c8d8d8d8e8e8f83776a5d5044372a1d110400000004101d2935404b556c7985929facb8c5cec1b5a89b8e8275685b4f4235281c0f02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c8895a2afb3a69a8d8073675a4d4034271a0d0713202c3945525d6876828f9ca9b5c2cfc5b9ac9f92867a6d6053473a2d201408000000000000000714212d3a46535e697885929fabb8c5d2cfbdb0a4978a7d7164574a3e3124170b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b16212b353d44484a4f4f4f4e4e4e4e4d4d4d4d4c4c4c4c4b4b4b4a4a4a4a494949494949494949494949494949494949494949494949494949494949494949494a4a4a4a4b4b4b4b4c4c4c4d4d4d4e4e4e4e4f4f4f5050504c4b4640372e23190d02000000000007131d28313a4045474847474746443f454545444444434343424242414141414141414141414141414141414141414141414141414141414141414141414242424343434444444545453f4446474747474745403a31281d1307000000010b151f29333b4246474f4e4847423c38322d28221b160e0903000000000000000000000000000000040a0f13191d2024292c2d302e34383a3b3c3d3d3c3b3a38342f2d2b28231c19130c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b12181d1f20262a2623201f1c1815120f0a05010000000000000000000000020c141c23282b2d2d2c2924211e1a1817151413100c0705010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b101416171a1413110d0701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c10121316191b1d1e1f1f1f1e1d1b191613120f0b0600000000000000000000000000000000000000030608090a090703000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3945515d676d767777787879797b7d7f817f7366594c403326190d0000000815222e3b4855616e7b7e7c7b7b7c7c7e818385877e7164574a3e3124170b000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7afa295897c6f625c6976838f9ca9b6ac9f9286796c5f53505051525055626e7b88959b9a9a9999999898979796969da0a7b1bcc5bcada39c99969696969697979798989999999a9a9b9a8e8174675b4e4134281b0e0100000006131f2c3845515d677986939facb9c2c3c2b5a89b8f8275685c4f4235291c0f02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b8895a9b3b3a79a8d8074675a4d4134271a0e04111d2935414c5665727f8c98a9b3bec9c7baaea399897d7063564a3d3025190e0200000000000005121e2a36424d576a7783909daab6c3d0ccbfb2a6998c7f7366594c403326190d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050f1a232b33383c3d4242424241414141404040403f3f3f3e3e3e3e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e3e3e3e3f3f3f4040404141414142424243434344403e3b352e251c12070000000000010d18242f3a434b51535454545353504a52525151515050504f4f4f4e4e4e4e4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4e4e4e4e4f4f4f50505051515152524950535354545453514b433a2f24180d01000007121d27313b454d52545c5a55534d48443d39332c27211a140c06000000000000000000000000050c11161b1e24292c2f35393a3d4040454647494a4a49484745403d3a38342e29251e160e080100000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c1013141a1d1a161312100c070603000000000000000000000000000000020a11171c1f20201f1d1814120e090a080706040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f161c2023232720201d18130c040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b1011171c1f202325282a2b2b2c2b2b29282622201f1b17110f09030000000000000000000000000000040a0f131516161613100b04000000000000000000000000000000000000000000000000000000000000000000000000000004111d2935404b555d606a6a6a6b6b676d6f717375736d63574b3e3225190c0000000714212d3a46535f696e71706f6e6f70717476797b716c6155493c3023170a000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7afa295897c6f625c6976838f9ca9b6ac9f9286796c5f51535454555556616e7a8794a1a3a2a1a1a0a49f9f9f9e9e9ea1a9b2bec9bfb5ada9a19e9e9e9e9e9f9fa3a0a1a1a2a2a3a4a5998d8073665a4d4033271a0d000000000714202d3a4753606d7a8699a4afb3b5b6b8b5a99c8f8276695c4f4336291c1003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8797a1adb4a89b8e8175685b4e4235281b08010d19242f3c4855626f7c8897a1adb9c6cbbfb4ab9a8d807367564c41362a1e1105000000000000020e1a2531424f5c6875828f9ba8b5c2cecdc1b4a79a8e8174675b4e4134281b0e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008111a21272c2f30363635353534343434333333333232323131313130303030303030303030303030303030303030303030303030303030303030303030303030303131313132323233333333343434353535363636363733322f2a231c130a00000000000004111d2935404b555d6061616060605c5f5f5f5e5e5e5d5d5d5c5c5c5b5b5b5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5b5b5b5c5c5c5c5d5d5d5e5e5e5f5f5b6060606161605d554b4035291d110400000c18232f39434d575e616867615f57544f49443e38322a261f17110a030000000000000000040a0f171c21272c3035393a4045474a4d4b515354555656565553514b4a46443f383530282019130c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000406070d100d09070604000000000000000000000000000000000000000000060b1012131413100c0706020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008111a21272c2f30342d2c29241d160d050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b10161c1c23282c2d3032353737383938383634322f2d2b27221b1a150e09030000000000000000000000070e151b1f22222322201b160f0700000000000000000000000000000000000000000000000000000000000000000000000000010d18242f3a434b51535d5e5e5e555c606264666866635b51463b2f23160a00000005121e2a36424d575f616463626162636567666d6e69615a5045392d211408000000000000000000000000000000000000000000000005121f2b3845525e6b7885919eabb8afa295897c6f625d6976838f9ca9b6ac9f9286796c5f5c606061616262626f7c89959797969594939a93929291919197a1adb9c6c6b9ada19791919191919292999394949596969798998e8174685b4e4135281b0e020000000714212e3a4754616d7a8794a0a5a7a8aaabada99c8f8376695c504336291d1003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3945525d687885919eabb5a99c8f8276695c4f433025190e020813202d394653606c7885929eabb8c5d1c3b7aa9d908477685e5246392d20140700000000000000091a2734414d5a6774808d9aa7b3c0cdcec1b5a89b8e8275685b4f4235281c0f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f161c2022232929292828282727272726262626252525242424242323232323232323232323232323232323232323232323232323232323232323232323232324242425252526262626272727282828292929292a2a2625231e19120a010000000000000613202c3945515d676d6e6e6d6d6d666c6c6b6b6b6a6a6a69696968686867676767676767676767676767676767676767676767676767676767676767676868686969696a6a6a6b6b6b6c6c656c6d6d6d6e6d675d5145392c2013060004101c2934404b555e696e75746e69636059555048433d363128231c150c06000000000003090e161b22282d32383a4145474b51535659545c60616263636261605c555753504a46413a3229241e160d050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000003060707060400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050f1a232c33383c3d413a39352f281f170e06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c161c21272c2e34383a3c3f4143444545454443413f3c3937332d2b26201a150b0600000000000000000007101920262b2e2f302f2c27211911070000000000000000000000000000000000000000000000000000000000000000000000000007131d28313a404547505151514b51535557595b5957514940352a1e1206000000020e1a26313b454d535557565555555658545c60615e5750483e33281c1105000000000000000000000000000000000000000000000005121f2c3845525f6b7885929eabb8afa295897c6f69696976838f9ca9b6ac9f9286796c6c666d6d6e6e6f6f6d717e8a8c8b8a8988878786868585858484919eabb8c4c4b8ab9e91858484848585868687878888898a8b8b8c8d83766a5d5043372a1d10040000000815212e3b4854616e7b879a98999a9b9d9ea1a99c908376695d5043362a1d10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111d2935414c566976838f9ca9b6aa9d9083776a564c41362a1e110505121f2b3744505b6575828e9ba8b5c1cfc5b8aca095877a6e6154473b2e211409000000000000000d192633404c5966737f8c99a6b2bfcccfc2b5a89c8f8275695c4f4236291c0f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b101416171c1c1c1b1b1b1b1a1a1a1a19191919181818171717171616161616161616161616161616161616161616161616161616161616161616161617171717181818181919191a1a1a1b1b1b1b1c1c1c1d1d1d191916120d0700000000000000000714202d3a4753606d7a7b7a7a7a797979787878777777767676757575747474747474747474747474747474747474747474747474747474747474747474747575757676767777777878787979797a7a7a7a796d6053473a2d2014070006131f2c3845515c676e7b82817b756f6b64615a544e46423b342e261e17110a020000060d141a21272c33393d44484c5254555d60636669666d6e6f70706f6e6d676763605c54524c443e352f281f170e05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b16212c353d44484a4d4745403a312920180f07000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b121821272c3338383f4446494c4e505152525251504e4c4946443f3837312b262017110a02000000000000071119222a32373b3c3d3b38322b23191007000000000000000000000000000000000000000000000000000000000000000000000000010c161f282f35393a43444445404546484a4c4e4c4b4640372e23190d020000000009141f29333b4246484a49484849494b4a505354524d453e362c22170c00000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabb8afa295897c7676767676828f9ca9b6ac9f928679787979797a7a7b7b7c7a6f7c807f7e7d7c7b7a7a7979797878787c8895a2afbbbcafa396897d787878787879797a7a7b7b7c7d7e7f7f807e7164584b3e3125180b000000000714212e3a4754616d7a888b8b8c8d8f90929796999083776a5d5044372a1d110400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d19242f414e5a6774818d9aa7b4ab9e918578685e5246392d201407030f1b27333f495365727e8b98a9b2bdc9c8bcb1a7978a7e7164574b3e31261a0e020000000000000c1926323f4c5965727f8c98a5b2bfcbcfc2b6a99c8f8376695c504336291d1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000407090a0f0f0f0f0e0e0e0e0d0d0d0d0c0c0c0b0b0b0b0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0b0b0b0b0c0c0c0d0d0d0e0e0e0e0f0f0f101010110d0c0a06020000000000000000000f1c2835424f5b6875828787878686868585858484848383838282828181818180808080808080808080808080808080808080808080808080808080818181818282828383838484848585858686868787878276695d5043362a1d10000714202d3a4753606d79838f8d87827c77706c626058534d443f383028231c140c04060f171f262a32383e45494f54565d6065676d70737678797a7c7d7d7c7b7a7774706d66615e565045413a312920170e0500000000000000000000000000000000000000000000000000000000020507080a080705010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c27333d474f55565a53514b433b322a2119100701000000000000000000000000000000000000000000000000000000000000000000000000000000050d151d242933383d44484a505356585b5d5e5e5f5e5e5c5b595553504947433c373127221b140b0200000000060f19232b343c4347494948443d352b22190e04000000000000000000000000000000000000000000000000000000000000000000000000040d161d24292c2d3737372e34383a3c3e4042403e3b352e251c12070000000000030d17212931363a3b3e3d3c3b3c3d3e3f44464846423b332c241a100500000000000000000000000000000000000000000000000006131f2c3946525f6c7985929facb8b7aa9d9083838383838385929fabb8afa399898485858686878788888981746f737271706f6e6e6d6d666c6c6b6f7c8995a2afbcbcb0a396897d706b6b6b6c666d6d6e6e6f6f7071727374716c6156493d3024170a000000000713202d3946525e686f7d7e7e7f80828385878a8c8e83776a5d5044372a1d11040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081825323e4b5865717e8b98a8b2ada196877a6e6154473b2e211407000b17222d3b4855626e7b8896a1adb9c5cec1b4a79b8e817468574d42372b1e12060000000000000c1825323f4b5865727e8b98a5b1becbcfc2b5a89c8f8275695c4f4236291c0f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1a2734414d5a6774808d94939399939292929191919090908f8f8f8e8e8e8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8e8e8e8f8f8f8f909090919191929292999393948e8275685b4f4235281c0f000c1926333f4c5966727f8c9599938f89837d766f6a615f57504a423c342e261e160e0d17212931363d43485055596063686d72767a7d808385868788898989888683817d79736d68625a514c433b322920160b020000000000000000000000000000000000000000000000000002080e111414161414110d080806050300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202c38444f59606367605d554d443c332b2318120b0300000000000000000000000000000000000000000000000000000000000000000000000000050f171f272f353d44484f54545c606365686a6a6b6c6b6b69676562605b53534e47423c332d261d140b020000040e18212b353d464e545556544f473d342b20160d05000000000000000000000000000000000000000000000000000000000000000000000000040c13181d20202a2b2b23282c2d2f31333533322f2a231c130a00000000000000060f171f262a2d2e31302f2e2f302e34383a3b3a363029211a12080000000000000000000000000000000000000000000000000006121f2b3844505b667986929facb0afaca0959090909090909297a2adadb5aba1969192929399939494958a7d70636765646463626160605c5f5f63707c8996a3afbcbdb0a3978a7d70645e5e5f5c606061616263636465666764615a5045392d2115080000000005111e2a36414c56606b6f717172747577787b7d7f827f7265584c3f3225190c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8896a1acb2a9978a7d7164574a3e2f24180d010614212e3a47535f697884919eabb8c4d1c4b8ab9e918578695f53473a2e2114080000000000000b1825323e4b5865717e8b98a4b1becbcec1b4a89b8e8175685b4e4235281b0f000000000000000000000406070907060400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2734404d5a6773808d9aa0a0a49f9f9f9e9e9e9d9d9d9c9c9c9b9b9b9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9b9b9b9c9c9c9d9d9d9e9e9e9f9f9fa3a0a09a8d8074675a4d4134271a0e00111e2b3744515e6a778491999e9f9b95908a837c756e69605c544e443f3830282018141f29333b42464f545a61646b6f757a7f8386898c90929794959696959992908d8a84807a716c605d554c443b32281d140a000000000000000000000000000000000000000000000000050d14191e20212321201e19171513120f0b060604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916232f3c4855606b70746d675e564e453d3529241d150d080200000000000000000000000000000000000000000000000000000000000000000000030d172129313940454f54596063666d6f72747677787878777674726f6c65625f58534e443f382f261d140a00050c16202a333d474f585f626360594f463d32281f170f0500000000000000000000000000000000000000000000000000000000000000000000000001070d1113141d1e1e181c1f20222426282625231e19120a010000000000000000060d141a1e212224232222222323282c2d2e2d2a251f170f0800000000000000000000000000000000000000000000000000000613202d394653606c798699a3a4a3a3a2a7a09d9c9c9c9c9c9fa2a9a1a1a1a1a8a19e9e9f9fa4a0a1a194877a6e615a5958575655545453514a5763707d8a96a3b0bdbdb0a4978a7d716457524b51535454555556575858595a585650483e34281d110500000000010d1925303a444f59606365656667686a696e707375726d62564a3e3125180b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a46535f697884919eabb3a79a8d807467554b4035291d110406121e2b37424d576875828e9ba8b5c1d1c6b9ada197887b6e6255483b2f2215080000000000000c1926323f4c5965727f8c98a5b2bfcbcdc0b4a79a8d8174675a4e4134271b0e0000000000000001070c101314161313100c070300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1a2734414d5a6774808d9aa7b5afacacabababaaaaaaa9a9a9a8a8a8a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a8a8a8a9a9a9aaaaaaabababacacafb5a79a8d8074675a4d4134271a0e000d1a2633404d59667380878f939da09f9d949089817b736d665f58504a423a322a221a26313b454d535960636c71777c81868b909299999c9fa2a9a2a3a3aba39f9d9a96918c857e766d675e564c443a2f261b110600000000000000000000000000000000000000000000050e171e252a2d2e302e2d2a252422201f1b171312100c070503000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2934404b5563707d80796e685f574f473f352f271f19130e080200000000000000000000000000000000000000000000000000000000000000010b151f29333b434b515960636b7074797c7f8183848585858483817f7c78746e6a625f57504941382f261c11060e161e28323c454f59606a6f706b60584e443a312921170d0200000000000000000000000000000000000000000000000000000000000000000000000000010406071011070c1013131517191b191916120d07000000000000000000000003090e121415171615151616171c1f2021201e1a140d050000000000000000000000000000000000000000000000000000000713202d3a4653606d79869398979796959594949494949494949494949494949595959696979798999a95887b6e62554c4b4a4948474746444a5764717d8a97a4b0bdbeb1a4978b7e7164584b40454647474848494a4b4c4c4d4b49453e362d22170c00000000000008131e29323d474f54565858595a5c575e6163666865625b51463a2e22160900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121e2a36424d576774818e9aa9b2aa9d908377675d5145392c201509020e1a26313f4c5965727f8c98abb5c0cbc9beb2a9978b7e7164584b3e2f24190d0100000000000d1a2633404d596673808c99a6b3bfccccbfb3a6998c807366594d4033261a0d000000000000030b12181d1f2023201f1c18120f0b060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1b2734414e5a6774818d9aa7a9a8a7a7a6a6a5a5a4a4a4a3a3a3a3a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a3a3a3a4a4a4a5a5a5a6a6a7a8a8a9a9a79b8e8174685b4e4135281b0e000c1925323f4b57636e737b828990959fa49f9c938e877f786f6a605c544c443c342c242a36424d575f616b6f767e84898e92989c9fa3aba9abadb3afb0b0b5aeacaaa8a19e97928b82796e685e564c41382d22170b030000000000000000000000000000000000000000020d1720293036393b3d3b393630312e2d2b2722201f1c1813120f0b0603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c6775828d837a6e6a6059514540393129241e19140d0500000000000000000000000000000000000000000000000000000000000007121d27313b454d555d606b70767d8185898b8e9091919291918f8e8c8885817b766e6a605b534a42382d22170f182028303a444d57606b6f7c7d706a60564c433b33291f1409000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000040607090b0d0f0d0c0a06020000000000000000000000000000020507080b0a090809060c1012131514120e0903000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a868c8b8a8a898988888787878787878787878787878788888989898a8a8b8c8d8e8b7e7164584b3e3d3c3b3b3a3a3e4b5864717e8b97a4b1b1b2b1a5988b7e7265584b3f383a3a3b3b3c3c3d3e3f40413e3d39342d241b1006000000000000020d17202b353d4348494b4b4c4d4f4d525457595b585651493f34291e1206000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1a26313d4a5663707d8997a1adac9f92867a6d6053473c31261a0e01091623303c4956636f7c8999a3afbbc7cfc1b4a79a8e817467564c4135291d110400000000010e1b2734414e5a6774818d9aa7b4c0cdcbbfb5ab978a7d7164574a3e3124170b0000000000060d151d24292c2d302d2c28231f1b17110f0a030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1b2834414e5b6774818e9a9d9c9b9b9a9999989898979797969696969595959595959595959595959595959595959595959595959595959595959595959596969697979898989999999a9b9b9c9d9d9b8f8275685c4f4235291c0f000a16232f3b47525c63696e757d838d9399a0a59e99928c837c726d665d564e463e362d2d3a46535f696e757c838a91959b9fa3aaacaeb5adaeafb1b3b7b8bcbbb9b6b2ada9a19e948f837a6e685e53493f33271f1509000000000000000000000000000000000000000008141e29323b41464749474641403e3b3937332d2d2c2823201f1b17120f0b060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d79859290847c6f6b625b514b433d35302a251e170e0a01000000000000000000000000000000000000000000000000000000000c18242f39434d575e676d747d83898e9297989b9d9d9e9f9e9e9c9a9897928d88827b726c655b544a3f33282018212a323a434c565f696f7d86867c6f685d554d453b30251a0e020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000306070807050200000000000000000000000000000000000000000000000000000000000006131f2c3945515d67727f7f7e7e7d7c7c7b7b7a7a7a7a7a7a7a7a7a7a7a7a7b7b7b7c7c7d7d7e7e7f8081827e7164584b3e31302f2e2d323f4b5865727e8b98a4a4a4a5a6a5988b7f7265584c3f322d2d2e2e2f30303132333431302d28221b12090000000000000000050e19232b32383b3c3e3e3f41424246474a4c4f4c4a463f372d23180d01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000913202d3a4653606d7984919eabafa3998a7e7164574e42372b1d12070714202d3a4753606d7a86929facb9c5d0c3b7aa9d908477685d5245392c2013060000000003101c28343f4a546875818e9ba8b4c1cec7bbaea399887b6f6255483c2f221509000000000610181f272f35383a3c3a38342e2b27221b1a15100b0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101c2936434f5c6976828f90908f8f8e8d8d8c8b8b8b8b8a8a8a8989898988888888888888888888888888888888888888888888888888888888888888888989898a8a8a8b8b8b8c8c8d8d8e8f8f9091919083766a5d5043372a1d100007131f2a35404952575f616b6f79808791969fa6a39f9590867f786d685f5850483f372e3b4855616e7b828990959da0a7aaa8a5a3a2a1a0a1a2a4a6aaacb1b8bcc3bdb9b3ada69f9590847a6d655b50443c31261a0e03000000000000000000000000000000000000020e1925303b444c52545654524c4d4a4846443f3c3a38342e2d2b27221f1b17110f0a04010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b5564707d8a989691857d726d605d554f46413a363029201c130a00000000000000000000000000000000000000000000000000000004101d2935404b555e696e79818990959b9ea2a9a7a9aaabababaaa9a7a9a19e9a948f867f776c665b50443f32282328333c444c555d686e7b859291847a6d675e574d42362a1e12050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b55626d7272717170706f6f6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6f6f707070717273737475716c6156493d3023222126323f4c5965727f8c97979798989a9c998c7f7266594c3f3326212122222324252526272524211d1710090000000000000000000007101921272c2f303232333430363a3b3d40423f3e3a342d251b1107000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505c6673808d9aa6b0ab9c8f83766a5f5347392f24180c0613202c3945515d677784909daab7c3d0c6b9ac9f93867a6d6054473a2d2114070000000006121f2c3844505c667683909ca9b6c3cfc5b9ac9f9286796d6053463a2d201307000000040d18222a3139404547494645403937332d2b26201b160f0b060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111d2a3744505d6a778384848382828181807f7f7e7e7e7d7d7d7d7c7c7c7c7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7c7c7c7d7d7d7e7e7e7f7f7f80818182838384858583766a5d5043372a1d1000020e19242e3740454d535960666d737d848f949da4a7a099928c827a6f6a615a51493f3743505c6976828f939d9fa7a8a09d9b9896959493949697999da0a7acb1b9c1c5beb9b0a7a0968f82776c60574d42372b20150a00000000000000000000000000000000000005111e2a36414c565e6163615e565a5755535049494644403c3937332d2b27221b1b15110d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515d6775818e9ba19792877f756d676059524c46413b322e251c0c03000000000000000000000000000000000000000000000000000006131f2c3945515d676e7b838e939d9fa7abadb3afacabacaeb4b3b6b4b3adaba69f98928b81786c605b51443a302e343d454d565e676d7a849197968f82796e695e52463a2d20140700000000000000000000000000000000000307090a0c0a0707040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18242f3943515b626565656464636262616161616161616161616161616162626263636464656667686864615a5045392d21151926323f4c5965727f8a8a8a8a8b8b8d90928c7f7366594c4033261914151516171819191a181715110c06000000000000000000000000070f161b1f222325252627252a2d2e30333532312e29231b130900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a54626f7c88949eaaab9f94887b6e62554b4035291d1207101d2935404b556774818e9aa7b4c1d1c7bbafa499897d7063564a3d30231709000000000713202d3a4653606d7985929facb8c5d0c3b6a99d908376665c5144382c1f12060000010c161f2a343c434b51535653514b46443f3837312c271f1b17110a02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101c2936424f5b6671777877767675747473737272717171707070706f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f707070717171727272737374757576767778787671665b4e4236291c10000007121c252e333c42474f545c606b6f7a828d929fa4aba39f948f847c716c625b51494043505c6976838f9ca39f9c9896918e8c8988878788898a8c90959da0a7afb7c1c9c2b9b1a89e948c7f72695f53473c31261a0f0000000000000000000000000000000000000714202d3946525e686e706e6869666461605b535653514a4846443f3937332d2b27201d19130f0a030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7985929fa9a299928b81796f6b615d56524c443f372e1e150a0000000000000000000000000000000000000000000000000006121f2b37434e58606d798390959da5abadaba6aba39f9e9fa2aaa7abadb3b9b8b0aaa29f938d80746d62564c41363940454f575f686d79829096a09f948f837b6e6154483b2e211508000000000000000000000000000000040b1013161619161413110d080707040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d27313f495157595958575756565555545454545454545454545454545555565656575758595a5b5c585650483e34281d1114212d3a4754606d7a7d7d7d7e7e7f808386887f7265594c3f3226190c0809090a0b0c0d0e0b0a0805000000000000000000000000000000040a0f1315161818191a1a1e20212426282525221e18110901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17232e3847535f6a75828f9ca6b0a69a8d8074675d5145392f24180c0d18242f3e4b5865717e8b98abb5c0cbccc0b5ab998c7f7366594c403025190e020000000916222f3c4955626f7c8898a2aebac7c9bdb2a8998c7f7366544a4034281c1004000008131e28313c464e555d6063605c5453504947433c38322b27221b140b0903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1a26323e4a555f666a6b6a6a69686867666665656564646463636363626262626262626262626262626262626262626262626262626262626262626262626363636464656565666666676868696a6a6b6c6a665f554a3e32261a0e0000000a131c212a31373d424b515960676d78808c939aa4aea69f9691867e726d625b5149404d5a6673808d9898928f8b8884817f7d7b7b7a7b7c7e80838990959ea5afb8c1cbc3bab0a69f92877b6e62584e43372b1d12070000000000000000000000000000000004101d2935404b55616e7a7c7a787573716e6c656663605c545553504946443f3837322c29241e1a15100b0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b37434e5864707d8a98a2aeaba39f938e847d746d68615e5651493f30261c11060000000000000000000000000000000000000000000000000815212e3a47535f6a75818e95a0a7ada9a19e99969992919298969a9fa2a9aebabcb4aea59d928b7f72685e52463d434b515960696e7a8290949fa8a69f958e8174675b4e4134281b0e0000000000000000000000000000070f161b202223252321201d19161413110d080704010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b151f2d373f464a4c4c4b4b4a4949484847474747474747474747474748484849494a4a4b4b4c4d4e4f4b49453e362d22170c13202c3945525d686d7071717171727376797b786d6053463a2d2013070000000000000001000000000000000000000000000000000000000000030709090b0b0c090e11141417191c191816120d0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c2b37434e58626f7c89949facab9f9285796d60554b4035291e140a16222f3c4955626f7c8899a3afbbc7d2c2b5a99c8f827669564d42362a1e1105000004101c2934404b5565727e8b98aab4bfcac5b9ada196887c6f6255493c2e23180c0000010d19242f3a434e585f676d6f6d6663605b53534e48443d37332d261d1a140c070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a16222d38434d555b5d5e5d5d5c5c5b5a5a595858585857575756565656555555555555555555555555555555555555555555555555555555555555555556565657575758585859595a5a5b5c5c5d5e5e5f5d5b554d43382d22160a000000010a0f181f262b303940454f555d666d747f88939fa3ada8a09892887f726d635b51494854616e7b868d8a86827f7b777572706f6e6d6e6f7173777d838e939ea6b0bac4ccc2bbafa3998e81756a5f5347392e23180c000000000000000000000000000000000613202c3945515d67758189878582807d7b7976736f6d666562605b5353504947433c3935302b26201c16100b04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030e18212e3a47535f6a75828f9baab4b4aea59e969188817a736e68635b5142382e23170c0000000000000000000000000000000000000000000000000915222f3c4855626f7c88939ea7a9a29f97918c898786858587898d92979da4aeb4bdbaaea49f92867a6d61564c454f555c606b707b8490949fa6aaa29f91897d7063564a3d3023170a0000000000000000000000000007111921272c2f3032302d2c29242321201d191413110d080603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d1b252d353a3e3f3f3e3e3d3d3c3c3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3c3c3d3d3d3e3f404041423e3d39342d241b1004111d2935414c565d6063646464656567666d6f6d665c5144382c1f120600000000000000000000000000000000000000000000000000000000000000000000000000020507080a0d0f0c0b09060100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1a26313c4854606a76828f9aa4ada2978b7e71675d51453b30261c1114202d3a4753606d7986929facb9c5d1c5b8ab9e928578695e52463a2d201407000006131f2c3845515c6774818e9ba7b4c1cbbfb4ab9e9184786a5f53473b2e1c1207000004111d2935414c555f6a6f797c79746f6c65625f58544f46443f382f2a251f18120b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111c27313b434a4f505151504f4f4e4e4d4c4c4b4b4b4a4a4a4a494949494848484848484848484848484848484848484848484848484848484848484949494a4a4a4b4b4b4c4c4c4d4e4e4f5050515252504e4a433b31271c11050000000000060e151a1e272e343d434c545c606d727f8b919ca4adaaa29a938b7f736d635b5146535e69707d817d7a76726e69686563626160616364666b7079818e949ea8b2bdc9cbc0b5ab9f93877c6e62554b4034281c10040000000000000000000000000000060f18202d3a4753606d7a869297918f8d8a888583807c7975726f6c6563605b53544e4745413a37312c28211b160f0a04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915202b37434e58626f7c87939facb9bfbaafa8a09a938e86807a726d63544a3f34281c10030000000000000000000000000000000000000000000004101d2935404b556874818e9ba5aaa297928b85807c7b7978797a7d80858d929fa3abb4bfbaaea2988d8073685e52525960676d737d8591969fa6a79f98928b7f726b6054483c2f221609000000000000000000000000020b19232b32383b3d3f3d3a39352f302d2c292421201d191312100c0603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a131b23292e313232323131302f2f2e2e2e2e2e2e2e2e2e2e2e2e2e2e2f2f2f30303131323334353531302d28221b1209010d19242f3a434c5254575757575858545c6062605c544a4034281c10040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a15202c38434e58626f7c87939fa9a99e9184796d60574d42382e2317131f2c3845515c677784919daab7c4d0c6b9ada197877a6e6154473b2e21140800020b14202d3a4753606d7985929eabb8c5c7baaea3998c7f7366584e43372b1f0b0000000613202c3945515d676f7c858985817c78736e6a636059535049413d363128231d150c06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151f2931383e42444544434342414140403f3f3e3e3e3d3d3d3d3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3d3d3d3e3e3e3f3f3f4040414242434344454543423e3831281f150a0000000000000003090c151d2328313a424a505b626d727f8c929ca5afaca49f918c7f736d635a504d57606b7074706d6765615f5759565554545556575960676d78828f96a1acb9c3cdc7bbafa4998e8174675c5145382c1f130600000000000000000000000000020c18212c38444f5964717e8a98a19e9c999798928f8c8985827f7c78746f6c6562605854524c47433c38332c27211b150e090300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d1a26313a47535f6a75818e9aa4afbbc8c1bab2aca49f98928d867f72665c5044382c1f12060000000000000000000000000000000000000000000006131f2c3945515d677885919eaba29892857e79736f6e6d66676d70747a808a9299a3aebabfb4aa9f92867a6d61565d606b6f7980879297a0a8a39f9590867e726d62594f44382c2013070000000000000000000000000a141d2b353d4448494c494745413f3d3a3935302d2c2924201f1c17120f0b060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a11181e2225262625242423232222212121212121212121212121212222232323242425262728292524211d171009000008131e28313a4145474a4a4a4b4b4c4b51535553514a42392e23180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27323d4754606a74818e97a2ada1968c7f73695f544a3f342822181c2934404b556875828f9ba8b5c2cec9beb3a9968a7d7063574a3d30241707000a141d2b37424d5764717e8a97a2adb9c6bfb5ab9f92867a6e6154473c32261b0f0000000714212d3a4754606d7a859197928e8984807b75706b64605b534f46423b342e271e180f07010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d171f272d323637383737363535343333323232313131303030302f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f303030313132323233333334353536373738393736322d271f160d03000000000000000000030b12181f2830383f44515b636d73808c939ea7b1afa39b918c7f726c61594f4f5960636764605d5555534d4c4a48484748494b4f555d666d7a84919ea7b1bcc8ccc0b5ab9f9285796d6053463a2d201309000000000000000000000000000a141e2a333c4854606b76828f9caaaba8a6aaa29f9c9998928f8c8885807c78736f6a65605d56534e48443e38322b26201a140b060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f2b37424d57626e7c87939facb6c0ccccc3beb6afaaa29f989285796d6053463a2d201307000000000000000000000000000000000000000000000714202d3a4753606d7a8696a1ac9f92867c716d666361605c5d6063686d747e87929fa5afbebaaea2988b7e716561686d747d848c9299a2a8a099928c837b716c625b51473d33271c1004000000000000000000000006111c262f3d474f5456585654524c4c494745413d3a39352f2d2c28231f1b17110f0a0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070d121618191918181716161515141414141414141414141414151515161617171818191a1b1c181715110c06000000010c161f282f35393a3d3e3e3e3e3f404546484644403930271c120700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a16212b38434e58616d7a85929fa5a89f92867b6e665c50443e342a2118232f404d596673808c99a6b3bfd2cfbfb2a6998c7f7366594c402e23180c06111c262f3847535f697683909ca9b3bec7bbaea3998e8175685e5246392a20150a0000000d1a2633404d596673808c97a19e9a96918d88827c76706c656059534d454039302a2118120b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d151c2226292a2b2a2a29292827272625252525242424232323232222222222222222222222222222222222222222222222222222222222222222232323242424252525262627272829292a2b2b2c2a2926221c150d04000000000000000000000000070d161e262e343f49515b636d75818e95a0a9b3ada39f93887e716b60574d4f54565a5753514b4846423f3d3c3b3a3b3c3e434b545d68717e8a95a0acb8c5d0c7baaea2988a7d7063574a3d31261a0e02000000000000000000000006111c26303c45515b63707d89949fabb8b5b3b3aeaba9aaa29f9c9897918d8984807c77726d68625f58554f48443d37322a251f17110a0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e28313a47535f6975818e9aa4afbec7d2d5d0c7c0bbb3a99f948c7f72665c5044382c1f1206000000000000000000000000000000000000000000000815222f3b4855626e7b8895a9a6998c80736a605c545453505154565d616c717e8b939eacb6bfb4aa9a8e8174686d737a818891959fa3a29f96918780786e69625a51493f352b21160b0000000000000000000000000b17222d38424f5960636563605d56595654524c4a4745413c3a38342e2b27221b1b15100c070100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000106090b0c0c0b0b0a0a090908080808080808080808080808080809090a0a0a0b0c0d0d0e0f0b0a0805000000000000040d161e24292c2d30313131322e34383a3c3a38342e271e150b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040f1b27323d46525e68717e8b939ea8a2989083786d60594f463c332a2224313e4a5764717d8a97abb5c0cccec1b5a89b8e827568544b4034281c101017222d38424e58626e7b88949fabbbc5beb3a99f92867b6e62564c41362a1e1105000000111d2a3744505d6a778390999fa2a8a19e99948f89837d78706b615e57514b433c3329231d150d040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b11161a1c1d1e1e1d1c1c1b1b1a191918181817171717161616161515151515151515151515151515151515151515151515151515151515151616161717171818181919191a1b1b1c1d1d1e1f1f1d1c1a16110a030000000000000000000000000000040c151c2328373f49525b606d79839097a2adb9afa49a92877d6f695f554b48494e4a4745403b3a3631302f2e2d2e303139424c56616c7783909daab4becacabeb3aa9b8e817468574d42362a1e120500000000000000000000000b17232e38424d57626d7683909ca6b0bbc2c0bebab8b6b4aeaca8a9a19e9a96918d88847f7a746e6a636159544f47433c363128221c140b0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c19242f3a43505a626e7b87939facb6c0d0d9d9d0c7bdb4aba1979082786d60544a3f34281c1003000000000000000000000000000000000000000000000714212d3a4754606d7a8797a2a396897c706358514a48464445474c525a626c75818e9aa4afbbb7aa9d918477737a80858d939aa0a39f98928c847c736d665f5750483f372d23190f050000000000000000000000030f1c28333f4a54606b7072706d68686663605d565754524c4946443f3937332d2b261f1d18120e090200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000102020000000000000000000000040c13191d2021242424242523282c2d2f2d2c28231c150c03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a16202a36414c56626d75818f96a1aa9f958c7f736b61584e453c3427222f3c4855626f7b8899a4afbbc7d1c4b7aa9e918477665c5145382c1f13192228333f4a545f6a74818d9aa6b0bbc3b9ada1978d8073695f53443b3025190d010000000e1a2734414d5a677480878d92989fa2aaa69e9c95908a837d756e69605c554d453e342f271f160d04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050a0e1011121110100f0e0e0d0d0c0c0b0b0b0a0a0a0a09090909090909090909090909090909090909090909090909090909090909090909090a0a0a0b0b0b0c0c0c0d0d0e0f0f101011121210100e0a050000000000000000000000000000000000030a1117252d374045515d676e7b85929ea5afb6aca39992857b6e675c51453e413d3a39352f2d2a26232221212223272f3a43505a65717e8b98a2aebac6d0c5b8ab9e928578695f53463a2d2114070000000000000000000003101c28343f4a545f69727f8b949fabb8c2ccd0cac6c5c2bfbab8b5b3adaba8a19e9a96918c86817b76706b636059544e46423b332d261d17110a0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e2935414c55616c75828f99a4afbec7d2ddd2c7beb5aba39991857a6e665c5042382e23170c00000000000000000000000000000000000000000000000713202c3945525d687885929fa4978a7d71665d55524c4d4b4a494a4b505a616e7b87939facb9b9ac9f93877c80868c92979fa49e99928d8680796f6b605c544d453f362d251b110800000000000000000000000006121f2b3844505b66707d7f7c7a777572706d686764605d565653504a46443f3837312c29241d19140f0a0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001080d1113141717171818181c1f2022201f1c18120b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d1925303a44505a606d7a849199a3a79f92877d706a5f574e463d332d2d3a4653606d7986939facb9c6d0c6b9ac9f9386796d6053463a2d2019222b343c44505b666f7c87929facb9c2b9aea49e92857a6d60574d4232291e1408000000000d1926333f4c58646e747b80868c92989ea5aaa79f9d959189827b736d675f575045403931281f160e050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131c252935404b555f69717e8a939ea9b3b4aba2979083796d605a50443a302d2c2924211e1a1715151415151d28313e4753606d7985929fabb8c5d2c6b9ada197887b6e6155483b2e2215060000000000000000000006121f2b3844505c666e7b86929fa6b0bcbfc1c2c4c6c7cccac6c5c2beb9b8b2adaba8a09e98928d88827d76706b625f58534d443f382f28231c140c0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121c27303945515d67717e8a949eabb5c0d0d9d8ccc0b6aca39992877d70685e544a3f30261c1106000000000000000000000000000000000000000000000004111d2935414c566976828f9ca89d9083786d67605d5659585756575858595f697683909da9b6bbafa49a93878d92989fa29f9c938e87817a736d676059504a423c332d241b1309000000000000000000000000000613202d394653606c78848b898784827f7d7a7774706d686663605c5453504947433c39352f2a251f1b150e0903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010406070a0b0b0b070c101313151312100c07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e29323f45525d686f7c87929aa4a39992867c6f695f584f443f382f3845515c667884919eabb7c3c4c5bbafa499887b6e6255483b2f222429343d464f59606c78829099a3afbbbab1a79d928a7e71685d52453c3120170d02000000000b1723303c47525c64696e747a80868e939da0a7aba7a09d938f867f796e69615a514b433a312820170e05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001050707090b0c0d0d0d0c0b0a080705020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1318242f39434d57616c75818e97a1adb9b3a9a0958d80746c61564c41362a201d1814120e09090807080b161f2c3945515d6775828f9ca8b5c2cfcabeb3a9978a7e7164574b3e2d22170b00000000000000000005121e2a36424d57606d78839098a2aeafb1b3b4b6b7b9bbc0c1c4c5c9c9c6c4bdb9b7b2acaaa29f9a948f8a837d766f6a615e57504a423c342e261e170e0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e18232e39424e58606d7a84919ea6b0bdc7d2d2ccbfbbafa49a92877e716b60564d42382e1e150a000000000000000000000000000000000000000000000000010d1924303d4a5764707d8a96a09f958e8179726d68676665646363646566686a73808c99a6b3c0b6aca49a939a9fa29f9a948f89817b746e68605d554f443f38302a211b12090100000000000000000000000009111d2935414c5663707c89969696918e8c898784817d7a76736f6d6663605b53534e4745403936302b26201a140d080200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000406070907060400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c17202935414c56606a717e88939fa4a29891847b6f6a60595049413b35404b54697683909ca9b6b6b7b8b9b5ab968a7d7063574a3d30282f353e464e58606b727f8c949fabb5bbb2a8a0958d81746c61564c41332a200e05000000000007131f2b36404a52575e61686d737b818990959da4aeaca59e98928c837b716c605c554b433a322920170d04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080d111314161819191a191818171414110e0806040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d27313b45505a616d7a85929ea7b1bbb1a79d928a7d70685e52463d30271d12070502000000000004101d2935404b5565727f8c98a9b3becacfc0b3a79a8d807467544a3f33281c0f0300000000000000000714212d3a46535f69737f8c959faaa2a3a4a6a7a9abacafb5b5b7b9bdc1c5c6c9c5c3bdb8b4aeaca69f9c959089827c756e69605b544e443f3830292017110a0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b17202834404a54606a74808d96a1adb8c1d0d0c7c0bbada49f93887e716c61594f443b30261c0c03000000000000000000000000000000000000000000000000000813202d3a4653606d78849198a29e938e847f7a767473727070707172737577797f8c98a5b2bfbeb6aca49fa09d98928e88827c756e69615e56514b433d342e261e180f0900000000000000000000000000060f1b242c3945525d6874818d9aa8a09e9b999696918d8a8683807c79746f6c65625f5853514b46423b37322a261f19130c0701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e19242f3a444e58616c727f8c929ca4a19691857c6f6b605b534d4540424e5b6875818e9ba8aaaaaaabacafa5988b7f7265584c3f2e343a41455058606a707d87929fa6b0bbb3a9a1969083796d605a50443a2f21180e000000000000030e19242e3840454d53565e61696e757d838d929fa2aaafaaa29f9590867e746d675d554c443b322920160c0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306090e121415191d202123242526272625242321201e191413100c070100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b151f29333e46525e68717e8b95a0acb8b9aea49e92857a6d61594f42392e23180c01000000000000000c18242f3c4955626f7c8897a2adb9c6d0c3b6a99d908376665b5044382b1f120600000000000000000815222e3b4855616e7b8692949495959697999b9c9e9fa4aba8aaacb2b5b8babec4c5c8c6bfbab8b0aba79f9d948f87817b726c665f58504a423b3227221b140b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d29323b44515c666f7c87939fa9b2bdcacfc7beb6afa39c928c7f726c625a50473d32291e150a000000000000000000000000000000000000000000000000000006121f2b3844505c666f7c869298a09e96918b868381807e7d7c7d7e7f808183858c919ba7b3c0bbb0a69e9c95918b86817c766f6a625f57524c45403a3128231c150c0600000000000000000000000000020b18212a36414c56606d7a85929fabacaaa8a5a8a09e9a9992908c8985817c78736f6a65605d55524d47433c36312a251e18120b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000205070810111010100f0f0f0f0e0e0e0e0d0d0d0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d0d0d0d0e0e0e0f0f0f0f1010101110080705020000000000000000000000000000000000000000000000000000000000000000000000000000000105090b0b110e0c0a09090a0b0e100b0a080500000000000000000000000000000000000000000000000000000000000000000000000001010201000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e28323d46505a626d73808c929fa4a19791857d726c655e57514b454d596673808c999e9d9d9d9e9fa4ac9a8d8074675a4d41383f444c525a616a6f7c869299a3afb8b2a9a19791847b6e675d51483e32281e0f060000000000000008121d262e333b42464c52575e616b6f79818a9298a1a8b1aea7a098928a81796d675d564c443b32281e150a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f13151a1e212225292d2e2f31323333333231302e2d2a25201f1d18120e0903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d17212a36414c56606c7883909da6b0bbb9ada2978e81746b60544b4034281d1207000000000000000713202d394653606c7985929eabb8c5d1c5b8ac9f9286796c605346392d20130600000000000000000b1825323e4b5865717e868687878888898b8c8e8f919399989b9ea0a8a8abadb3b7b9bdc4c6c6c2bbb7b1aba69f9a938e867f786e6a605c544d443d332d261d150c040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c262f3b444f59606d78839099a4afbbc4cfc6bdb5aca49f918c80736d625a50483e352b20170c03000000000000000000000000000000000000000000000000000003101c28343f4a545f6a707d8690959ea09e9992908e8c8b8a898a8b8b8c8e9092989ba3adb8c3b7aa9e948f89847f7a746f6a626058534d46413b352f281f17110a0300000000000000000000000000000a141d29333b46525e6873808c97a2adb9b7b5b2b2acaaaba39f9d9997928d8984807c77726d67615e56534e46423b363029231d150d0701000000000000000000000000000000000000000000000000000000000000000000000000000002090e1214151d1d1d1d1d1c1c1c1b1b1b1b1a1a1a1919191919191919191919191919191919191919191919191919191919191a1a1a1b1b1b1b1c1c1c1c1d1d1d1d1514120e0903000000000000000000000000000000000000000000000000000000000000000000000000060c111517181e1b1817161617181a1d181714110c06000000000000000000000000000000000000000000000000000000030607080a0c0d0d0e0f0e0d0c0b0907060400000000000000000000000000000000000000000000000000000000000000000000000000010c16202b343e48515b646e73808c939aa3a19792877f776e69605d55514b5864717e8b929190909192939a95968f8275695c4f41454a50565d606c717d859298a2abb5b1a8a19792857c6e695e554b40362c20160c0000000000000000010b141d212931363a41464d525960676d747e869196a0a7b1b1aaa29f928d82796d685e564c443a30261c1106000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c10151b1f22262a2d2e3035393a3c3e3f4040403f3e3d3b3936302d2c29241d1a140d05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f1925303a44505b66707d89949eaab7beb3a99e93897d70665c5145392f24180d0100000000000005121f2b3744505b6575828f9ba8b5c2cec7baaea398887b6e6155483b2e22150800000000000000000b1724313d4a56626c71787a7a7b7b7c7c7e8081838486898c8e9196979b9fa2a9abacb2b8babfc6c7c2bcb8b0aca49f98928b837c736d665e564f443f382f271e160d050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f17222d38424d56616b73808d95a0abb5c0cdc5bcb4aba39a938b7f736e635b51483f362c23190e05000000000000000000000000000000000000000000000000000000000b17232e38424e58616b707c838b91969a9e9f9c9a99989796969798999b9d9fa2aaadb5bfc2b5a89c8f827d77726d68625f58544e47423c363029241d160d0600000000000000000000000000000006111c262f3b45505a616e7a86929fa9b3bec4c1bfbdb9b7b5afaca9a9a29e9a96918d88837e79736e69625f58534d46413a342f271f18130c04000000000000000000000000000000000000000000000000000000000000000000000000050d141a1e2021292a2a2a29292928282828272727262626262626262626262626262626262626262626262626262626262626262627272728282828292929292a2a2a22211e1a140d06000000000000000000000000000000000000000000000000000000000000000000000911171d2124252b2825232323232527292423211d171008000000000000000000000000000000000000000000010507060b1012131517191a1a1b1b1b1a1918161313100c07000000000000000000000000000000000000000000000000000000000000000000000000040d19222c363f49525c646e737f889298a0a299928c827b736d67605d5554616e7b83858484838485868788898a8376695d504c51545c60686d747e869297a1aab4afa79f9691857c6f6a5f574d43392f241a0d04000000000000000000020b0f171f252a30353b42464f555d606c717b8491959fa7b1b4aea49d948f837a6e685e564c42382e23170f06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030b12181c1f272b2e31363a3b3e414647494b4c4c4d4c4b4b4a4746413e3a39352f2a251f170f0701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e28333f4a54606b75828f9ca6b0bbbbafa59d9184796d60554b4035291e1308000000000000030f1b27333f495365727f8b98a5b2bed1cbbfb4aa96897d7063564a3d3023170a00000000000000000915212e3a45505a62656c6d6d6e6e6f7071737476787a7c7f8184878b8e9297999ea1a8acaeb4b8bcc3c7c2beb6afaaa29f9590867f786e6860595049413930281f170e05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e182228333f4a545e68707d88939fa7b1bdc7c5bcb4aaa39992887f736d635b52493f362d241a1107000000000000000000000000000000000000000000000000000000000006111c26303c464f59616a6e797e848a8d91969698999a9a9a9a999998979694989ca3adb8bcb0a396897d706b65605d56544e47433d37312a251e18130c04000000000000000000000000000000000b17222d38424d57626c75828f98a2aebcc5d0cecec8c5c4c0bbb9b6b3adaba8a19e9995908b85807b756f6a615f57524c4540393129241d160d0600000000000000000000000000000000000000000000000000000000000000000000050f171f252a2d2e3637373636363535353534343433333333323232323232323232323232323232323232323232323232323233333333343434353535353636363737362e2d2a261f170f06000000000000000000000000000000000000000000000000000000000000000009121b22292e3132373532302f2f3031343631302d28221a120800000000000000000000000000000000000205080d111314171c1f20222425262728282726252523201f1c18120f0a040000000000000000000000000000000000000000000000000000000000000000000007101a242d37404a525c636d727e8691969ea39f948f867f79726d67625f5e696e77787777777778797a7b7c7d7b6e615454555d60666d717a818a9298a1a9b2aca49f9590847b6f6a60584e453b31271d1208000000000000000000000000050d141a1e252930363d434b515a61696e7b8390959fa8b2baaea69f9590837a6e685d544a3f342821180c0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070d151d23292c32373b3c4246484b4c5254565758595a5958575654524c4b474540393631292118120b0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b17222d38424f59626f7c89949fabb7c1b8aca0968c7f72675d51453a2f24190d000000000000000b17222d3d4a5663707d8996abb5c0cbd0beb2a5988b7f7265584c3f3225190c000000000000000005111d29343f4850535b6060616162626364666869676d707275777a7e8185898d91969b9fa2aaacb1b7bbc2c7c0bbb4aea79f99928c827a706b605b534b423a312920170f0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c16202a343c44505b666e7a85929aa4afb9c3cabfb4aaa29892877e726d635b524940372d241b1208000000000000000000000000000000000000000000000000000000000000000a141e2a343e474f575f676d71787d808487898b8c8d8d8e8d8d8c8c8a89878c919ca7b4bcafa396897c70635954524c47433c37322b261f19140d070100000000000000000000000000000000030f1c28333f4a545f69717e8b949eaab4bebec0c2c4c5c9cecbc7c5c3beb9b8b2adaba7a09d97928d86817c756e69615e56514b433d352f281f17110a0200000000000000000000000000000000000000000000000000000000000000020d17212930363a3b434443434342424242414141414040403f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f404040404141414242424243434344433b3a36312921170d0300000000000000000000000000000000000000000000000000000000000006111b242d343a3d3e44413f3d3c3c3d3e41433e3d39332c241a1006000000000000000000000000000003090e1214191e202123282b2d2e30323334343534333231302d2c28231d1b160c070100000000000000000000000000000000000000000000000000000000000000000008121b252e38404a525b626c717c848e939ea19f98928c847e7a746e6a6763616a6b6b6a6a6a666d6d6e6f706e695e5e6164676d71787e848e939fa3aaaea8a19a938d837a6e6960584e463c33291f150b000000000000000000000000000003090e13191f252a3139404550575f696e7a839096a0a9b3b8b0a79f9590837a6d665c50443f332a1e140a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000711191f272f34383d4347494d535558565e61626465666666656463615e565853514b46423b3329241d150d030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c262f3d4854606a7683909ca8b2bdbdb2a89e9285796d60564c4135291c11060000000000000615222e3b4855616e7b8899a3afbbc7cdc0b4a79a8d8174675a4e4134271b060000000000000000010c18222d363f4149505353545455555658595b555d60636568686e7175797c8084898e92989da0a7abb0b6bbc1c5bfbab1aba39f9490857d726c655c544b433b322921170e050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e28323c464f59606c78828f97a1acb6c0cbc6baaea29892867e716c625b514940372e251b12090000000000000000000000000000000000000000000000000000000000000000020c18222c353e454e555c60666c7074777a7c7e7f8081818080807f7d7c7b7f8c98a5b2bcafa296897c6f63564945413a37322b27201a150d080200000000000000000000000000000000000006121f2b3844505b666e7b86929fa6acafb5b1b3b5b7b9bdc0c3c5c7cbcac6c4bdb9b7b1aca9a29e99928e87817b746d68605c554f45413a3128231c140c0500000000000000000000000000000000000000000000000000000000000009141f29333b42464850505050504f4f4f4e4e4e4e4d4d4d4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4d4d4d4e4e4e4e4f4f4f4f505050504846423b33291f14090000000000000000000000000000000000000000000000000000000000010c17222d363f454a4b514e4b4a49494a4b4d504b49453e362c22170c00000000000000000000000003090e141a1e21252a2d2e2e34383a3b3d3f4040414241403f3e3c3a38342e2c272118120b0300000000000000000000000000000000000000000000000000000000000000000009131c262e374049515a616a6f7a818a91979fa29f96918b85807b7774706d676866646363626161626363646668686e71757a7e848b91969da5aeaba39f96918880786e685f574e463d342a21170d030000000000000000000000000000000002080d141a1f272f353e454d575e686d7a849197a2abb5b9b1a7a0958f82786d605b51453c30261c110600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d19232b31394045474e5456575f616568686d6f71727373737271706e686865605d55534d453f352f271f150c03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d2c38434e5863707d8a96a0acb9c3b9ada1978c7f72685d5245382e23170b0000000000000713202d3a4653606d7986929facb9c5cfc2b5a99c8f8276695c4f432d22170b00000000000000000006111b242d2f383f44464747484849494b4d4e4b51545659565e6164666d6f73787d81868b90959c9fa6aaafb7bcc2c2bdb4aea69f9791877f776d665d554c443b332920170e040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d27303a444e58606b737f8c949fa9b3bec7c5c4b8ac9f92867d706c615a5147433c342e261e170f07010000000000000000000000000000000000000000000000000000000000000006101a232c333c434b51545b606367686e6f717373747474737372716f727f8c98a5b2bcafa295897c6f6256493c352f2b26201b160e090300000000000000000000000000000000000000000613202d394653606c788290989e9e9fa3aba4a6a8aaacb2b3b6b9babfc5c6cac9c5c3bcb8b3adaba39f9a938e86807a736d676059514b433d342e261e170e0700000000000000000000000000000000000000000000000000000000020e1a25303b454d52545c5d5d5d5c5c5c5b5b5b5b5a5a5a59595959595959595959595959595959595959595959595959595959595959595a5a5a5b5b5b5b5c5c5c5c5d5d5d55534d453b31261a0e020000000000000000000000000000000000000000000000000000000005111d29343f485056585e5b5856565656585a5c575550483e33281d110500000000000000000000060e151a1f262a2d3036393a3e3f4446484a4c4d4d4e4e4e4d4c4b4946454039383229241d150d030000000000000000000000000000000000000000000000000000000000000000010a141c252e373f4850585f676d757e858d93999fa19e98928d8884807d7977757371706f6f6e6e6e6f70717375777a7e81868b91969ea1a8aca49f99928d847d736d665e564d453d342b22180f050000000000000000000000000000000000000002090d151d2429333c454d565e686e7b859299a3afbbb9b1a79f948e81746d62574e42382e23170b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f2b353d434b515358606267696e7175787a7c7e7f7f807f7e7e7d7a7875716d67615e575145403931271e150a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b1b27323d4855616b7784919eaab7c3beb3a99f92857a6d60544a3f34281c1003000000000006121f2c3844505c667784919eaab7c4d0c3b7aa9d9084776a544a3f33281c0f0300000000000000000009121b1d262d3337393a3a3b3b3c3d3e4041414547494c4c5254545c6063656c70747a7e83898f949b9ea5abb1b9bdc4bfbab0a9a199928c81786d675e564d453b322920160d040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091318232e39424c565f6a707d87929fa6b0bbbfbbb9b7b4a79a8e8179726d66615a534e443f3830292118130c040000000000000000000000000000000000000000000000000000000000000008111a212a303940454a505357565e61636566676767676666656465727f8c98a5b2bcafa295897c6f6256493c2f241e1b150f0a04000000000000000000000000000000000000000000000b1825323e4b5865717e8b9090919292999698999b9ea0a8a6a9acaeb4b8babec5c6cac8c5beb9b5aeaca49f99928d867f796f6b605d554f443f3830292019100900000000000000000000000000000000000000000000000000000005121e2a36424d575e61696a6a6969696868686867676766666666656565656565656565656565656565656565656565656565656566666666676767686868686969696a6a69615f574d42362a1e1205000000000000000000000000000000000000000000000000000000000915212e3a45505a62656a68656362626364676964615a5045392d211408000000000000000000060f1820262b31363a3b4146474a4a5053555758595a5b5b5a5958585653514b48433d352f271f150c030000000000000000000000000000000000000000000000000000000000000000020a131c252d363e464e555d606c717a80878f939a9fa29f9a96918d89868482807e7d7c7b7b7b7b7c7c7e808184878a8e92989da0a8aba39f9a938f868079706b605c544d443c332b22190f0600000000000000000000000000000000000000000000030b1218212a333b444c565f69707d87929fa7b1bdb9b0a69d928b7f726a5f544a3f34281f1409000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d28313d474f555c60646a6f74787b7e818487898a8b8c8d8c8b8a898784827e79746e69625b514b433930261c1106000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a16212c38444f596673808c99a7b1bcc5baada2978c7f72665c5044382b1f1409000000000003101c28343f4a546976828f9ca9b5c2cfc4b8ab9e918578665b5044382b1f120600000000000000000000090b141b22272b2d2d2e2e2f2f3031332f35393a3d3f4146474a5053535b6063676d71777d82898f939d9fa7acb2babfc2bbb3aba39f938e82796e685e574d443b32281f160c0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121b252834404b545e686e7c859299a3afb8bdb5aeacabada99d938e847f79716c625f58504a423b3329241d160d0700000000000000000000000000000000000000000000000000000000000000080f181e272e34383f44464a4c52545658595a5a5b5a5a59595966727f8c99a5b2bbafa295887c6f6255493c2f22160f0a040000000000000000000000000000000000000000000000000b1825323e4b5865717e82838484858687898b8d8f9196979a9c9fa3ababadb3b8babec5c7cac6bfbbb6afaba39f98928c847d746d676059504a423b322b221b120600000000000000000000000000000000000000000000000000000714202d3a46525e696e7677767676757575757474747473737372727272727272727272727272727272727272727272727272727272737373737474747575757576767677766e695f53463a2d211407000000000000000000000000000000000000000000000000000000000b1724313d4a56626c71777472706f6f70717476716c6155493d3023170a0000000000000000030e18212a31373b4246484c525457545c60616365666767686766656463605c55544f45403931271e150a000000000000000000000000000000000000000000000000000000000000000000010a131b242c343c434c515a61686d747c82878e93999ea0a09e9a9992918f8c8a8a898888878888898b8c8e9195979b9fa2aaa8a09d99928e87827b736d676059514b423b322a2119100700000000000000000000000000000000000000000000000001070f182129323a444d57606b73808d959fabb5c0b8afa59f92867b6e665c50443b31251a0e04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d18242f39434f5960676d71777c8184888b8e919695979899999998979696918e8b85807b726d605d554b42382e23170c0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c28333e4855626e7b88959fabb8c7beb3a99e9184786d6053463b30251a0e0200000000000c17232e414e5a6774818d9aa7b4c0cdc5b9ac9f9286796c605346392d2013060000000000000000000000020a11171b1f20202121222223252624292c2d303036393b3f4446495053555d60656b70767c828990959ea0a8aeb4bcc2bdb5afa59e948f837a6e695e564d443a31281e150a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008121b242d373f45515c666d7a849197a2abb5bbb2aba39f9ea1a8a59d96918b847e766f6a605c544d453e352f281f19100800000000000000000000000000000000000000000000000000000000000000060c151d23282d3338393d414647494b4c4d4e4e4d4d4d4c5966727f8c99a5b2bbaea295887b6f6255483c2f22150900000000000000000000000000000000000000000000000000000b1724313d4a56626c717676777878797b7c7e808284878a8d9092999b9fa2a9abadb3b7bcc2c6cac7c0bbb5aeaaa29f9691888079706b605c544c443d342d2417110a020000000000000000000000000000000000000000000000000815212e3b4854616e7b8283838383828282818181818080807f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f8080808181818182828282838383827b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e84817e7d7c7c7d7e80837e7164574b3e3124180b00000000000000000915202a333c42474d5355565e616467666d6e707273737475747372716f6d67636059514b433930261c11060000000000000000000000000000000000000000000000000000000000000000000109121b222a313a414550565d606a6f757c81878c91969a9da0a39f9d9b9997969695949495959697999b9da0a7aca49f9d9995918c86817b756e69605d554f454039302920180f07000000000000000000000000000000000000000000000000000000060f172029323c454f59606d78839099a3afbbc0baaea3989083786d60574d42362a20150a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b55606b70797e83898e9196989b9ea1a8a4a5a6a6a6a5a4a8a19e9b97928d867e756d675d544a3f34281e140a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b16212e3a47535f697783909dabb5c0c5b9aca1968a7d7064574d42362a1e12050000000000061926323f4c5965727f8c98a5b2bfcbc7bbafa399877a6d6154473a2e21140700000000000000000000000000060b0f1213141415151616181a181d202123252a2d2e34383a3f44464b51545961636a6f757c838a91969fa3aab1babfc0bbafa69f9590847b6e685e564c433a30261c110600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008111a242d363f49525b606d78829096a0a9b3b8b0a9a1999291969fa6a8a19e96918a827c736d665f575045403a312b221a120900000000000000000000000000000000000000000000000000000000000000030b12181c22282b2d3036393b3c3e404041414140404c5966737f8c99a6b2bbaea295887b6f6255483c2f22150900000000000000000000000000000000000000000000000000000915212e3a45505a6265696a6a6b656c6e70717375777a7d8083868a8e92979a9fa2a9abb0b8babfc5cac6bfbbb4aea8a09a938d847d736d665e564f473f3627221b140b0300000000000000000000000000000000000000000000000a1724303d4a5763707d8a9090908f8f8f8e8e8e8e8d8d8d8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8d8d8d8e8e8e8e8f8f8f8f9090897c706356493d3023160a000000000000000000000000000000000000000000000000000000020f1c2835424f5b6875828e8e8b898989898b8d8e8275685b4f4235281c0f02000000000000020e1a26313c454d53575f6166686d717477797b7d7f8080818181807f7e7c79756f6b605d554b42382e23170c00000000000000000000000000000000000000000000000000000000000000000000000910181f282f353e434c52585f626a6f757b7f84898d9195979a9d9fa2a9a3a2a2a1a1a1a2a3a4a3aaa29f9c9a9a93908d89847f7b746e6a625f57514b433d342e271e170e060000000000000000000000000000000000000000000000000000000000050e17202a333d44515c666f7c87929faab3bebfb4aa9f958c7f72695e53463c31261b0f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3945515d67707d848b90959a9ea1a8a29f9e9d9d9d9fa2aaabadb2acaba9a29f98928b82796d665c50443d30261c110600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121e2b37424d5765727f8b99a3afbbc7bdb2a89c8f8276695e52463a2d20140800000000000b1724313e4a5764717d8a97a4b0bdcacbc0b5ab95887b6f6255483c2f22150900000000000000000000000000000003050607070808090a0b070d11131416191e2023282c2d33373a4145474f555860626a6f767e848c92989fa7aeb4bcc1b8b0a7a09691847a6e685d554b42382e231710070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008111a232c363f48515b636d74818e949fa8b2baaea69f979186848f949da4ada8a19e948f8780786e69615a514b433c342c241b13060000000000000000000000000000000000000000000000000000000000000000070c11171c1f20252a2d2e3032333434343433404c5966737f8c99a6b2bbaea195887b6e6255483b2f221508000000000000000000000000000000000000000000000000000005111d29343f485056585c5d5d5e5b606163656668686e7073767a7d8185898d92979c9fa6acaeb4b9bec5c9c5bfbab2aca49f96918880786e68605950483f332d261d150c03000000000000000000000000000000000000000000000815222f3b4855626e7b88959d9c9c9c9b9b9b9b9a9a9a999999999898989898989898989898989898989898989898989898989898999999999a9a9a9b9b9b9b9c9c9c9d94877b6e6154483b2e211508000000000000000000000000000000000000000000000000000000020e1b2835414e5b6874818e9b9896959596979a8e8175685b4e4235281b0f0200000000000006121e2b37424d575f62696e72777a7d818486888a8b8c8d8e8e8d8c8b8b8986827c756d675d544a3f34281d12070000000000000000000000000000000000000000000000000000000000000000000000060d161e2429313a41454e53585f62696e73777c8084878a8e90929796979898999a9a999998979598928f8d8a8783807c77726e68625f58534d45403a3128231d150c0500000000000000000000000000000000000000000000000000000000000000050e18212834404a545f6a74818d98a2aebac6bcb1a79f92867b6e61584e43372b20150900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8591969d9f9f9c99969792919090919298999ea1a9afb6b3adaaa29f948f82786d60594f42382e23170b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1a26313c4754616e7a86929facb9c5c4b9ac9f93877b6e6154483b3025190d0100000000091623303c4956636f7c8996a2afbcc9d1bcafa396897c706356493d3023160a0000000000000000000000000000000000000000000000000000010406070b141c22282b2d2b282b2f35393d44484e545860626c71797f8690959fa2aab1b9c0b9b1a8a09690837a6d675d544a3f342822190e04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009121a232c353e48505a626d73808c939da6b0b4aea49d9490857c7a828d929fa3abaca69f99928c837b716c605d554e463e362d2517110a030000000000000000000000000000000000000000000000000000000000000000060b0f1213191e20212325262727282733404c5966737f8c99a6b2bbaea194887b6e6155483b2e2215080809090a0a0a0b0b0c0b07060400000000000000000000000000010c18222d363f454a4b4f50514950535456585a565e616467676d7175797d81858b90949a9fa2aaadb3b9bec4cac3beb6afa8a19a938d827a6f6b625a51443f382f261e150b020000000000000000000000000000000000000000000815212e3b4854616e7b8794a1a3a3a3a2a2a1a1a0a0a39f9f9e9e9e9e9e9e9e9e9e9ea2a9a5a5a5a5a5a5aaa29f9e9e9e9e9e9e9e9e9e9e9f9f9fa4a0a0a1a1a2a3a3a194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa5a3a2a2a3a49b8e8174685b4e4135281b0e020000000000000814212e3a47535f696e767b7f83878a8d9092999698999a9a9b9a99989798928f8981796d665c5044392e23180c000000000000000000000000000000000000000000000000000000000000000000000000040c13191f282f353c43474e53575e61666b6f74777a7e81838587898a8b8c8c8d8d8c8c8b8a88878583807e7a77736f6a66615e56534e47423c352f281f18120b03000000000000000000000000000000000000000000000000000000000000000000060f18232e39424e58616d7a85929faab4bfc2baaea3988e81746a5f53473c31261a0f0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080c0c0b0b0a0a0a090913202d3a4653606d7985929e9b99928f8c8987858483838485888c91979fa4acb6bab4aea69e948e81746b60544a3f34281c1007070808080809090909090a0a0a0a0b0b0b0b0b0c0c0908060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915202d3946525e6876828f9ca9b5c2c8bbafa49a8b7f7265564c41362a1e1105000000000915222f3c4855626f7b8895a2aebbd1cabdb1a4978a7e7164574b3e3124180b000000000000000000000000000000000000000000000000000000010b141d1d262d33383938332d26292c33383d43474e545a61666d727b838b9298a0a7afbabfbab2a8a0959083796d665c50443f342b20160c0200000000000000000000000000000000000000000000000000000000000000000000000000000000000006121b242c353e47505a626c727f8b929ca5afb2aaa29f928d827a6f6d78808b9299a3abb0aba39f9590857e746d67605850483f3728231c150c040000000000000000000000000000000000000000000000000000000000000000000306080d1114141618191a1b1b2633404d596673808c99a6b3bbaea194887b6e6155483b2e221515151616161717181818181413100c0701000000000000000000000006111b242d343a3d3e4343443f444648494b4d4c525457555d6064666d7074797e83888d92989ea2a9adb3babfc6c7c0bbb2aca49f948f847d716c635b5049413830261d140a0000000000000000000000000000000000000000000a1623303d495663707c8996979796969595959494939992929291919191919191919297a2adb2b2b2b2aea298929191919191919191919192929399939494959596979796897d7063564a3d3023170a000000000000000000000000000000000000000000000000000000000d1a2733404d5a6673808d99a6b0afafb0a79a8e8174675b4e4134281b0e010000000000000815222f3b4855626e7b83888c9095979a9d9fa3aba5a6a6a7a8a7a6a5aaa29f9b938e82786d60544b4034281c100400000000000000000000000000000000000000000000000000000000000000000000000001080d161e242932373c43474d535459606367686e717476787a7c7e7e7f808080807f7f7d7c7a787673716e686662605854524d47433c373129241d160d0700000000000000000000000000000000000000000000000000000000000000000000000007121c27303c46525e68737f8c98a2aebac7bfb4aa9f93877c6f62584e43372b1d13070a0807050100000000000000000000000000000000000000000000000000000000000000000000000000000000000002080e111414191818181717161616151f2b3844505c6674818e928e8a86827f7d7a7877767677797c80848d939aa4acb6bfbab0a69d93897d70665c5044382b1f14141414151515151616161616171717171818181818191515120f0a0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111e2a36414c5665717e8b98a9b2bdc9c0b6ac9c8f8376685e5246392d201308000000000814212e3b4754616e7a8794aab4bfcbcbbeb2a5988b7f7265584c3f3225190c0000000000000000000000000000000000000000000000000000000a131d262f2f383f4446443f382f2820272c32373d434850545c606a6e787f8690959da5aeb4bcbab1a79f958f82786d605a50463d32281e130800000000000000000000000000000000000000000000000000000000000000000000000000000000020a1117242d363e474f59616c717e88939fa4adb0a8a098928a80786e68666d737e879299a3aab4afa79f98928a81796f6a615a514940342e261e160d04000000000000000000000000000000000000000000000000000000000000000000000001050708090b0d0d0e1a2633404d596673808c99a6b3baaea194877b6e6154483b2e21212222222323242424252525201f1c18120b03000000000000000000000009121b22292e313236372d3337393b3d3e404146474a4b5154545c6063676d71767b80858c92979ea1a9aeb4bbc0c7c4beb6afa69f9691877e726d605b534a42382f261c110600000000000000000000000000000000000000000c1925323f4c5865727f8b8b8a8a898989888887878686868585848484848484848485929eabb8bfbfb8ac9f928684848484848484848485858586868687878889898a8b8b8a7e7164574b3e3124180b000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5b2bcbcb4a79a8d8174675a4e4134271b0e010000000000000c1926323f4c5965727f8c95999da0a7a7a8a7a7a7a8a9acaeb4b4b3b2b4aeaca59e948c7f73665c5145382c1f13060000000000000000000000000000000000000000000000000000000000000000000000000000040c131920262b31373b4246484f5456565e6164676a686d6f717272737373737272706f6d68696764615e5656544e4746413b37312b262018130c0400000000000000000000000000000000000000000000000000000000000000000000000000000b151e2a36414c56616d7a86929facb8c3c6bbafa4998f82756a5f53473a2f241813171414110d0806030000000000000000000000000000000000000000000000000000000000000000000000000000050d14191e2021262525242424232322222228343f4a54616d7a8485817d7a7672706e686b6a6a666d6f73798088939aa4afbbc1b8afa59d9083786d6053463a2f24202121212122222222222323232324242424242525252522211f1b150e060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1925303b4855616e7b8896a1adb9c5c6b9ac9f93867a6d6154473a3024190d010000000714202d3a4753606d7a8698a3aebac7ccc0b3a6998d8073665a4d4033271a0d000000000000000000000000000000000000000000000000000009121c252f3841424a5053504a423a31281d20272b32383e424b51575f666c727b838e939fa2aab2bab9b1a79f948d80746c62584e443a3024190f050000000000000000000000000000000000000000000000000000000000000000000000000000040c141c2328363f485059616b717e87929aa4afafa69e9691867e746d665e5c606c717e879298a2aab4b1aaa29f938e847c716c625b52443f3830281f160d030000000000000000000000000000000000000000000000000000000000000000000000000000000000010d1a2733404d5a6673808d99a6b3baada194877a6e6154473b2e2d2e2e2f2f2f303031313132322d2c29231d150d0300000000000000000000000911181d212425292a22272b2d2e30323036393b3d4145474a5153555d60646a6e747a7f858c91979fa2aaafb5bdc2c7c0bbb0a9a199928b7f746c655c544a42382d2217130a000000000000000000000000000000000000000714212e3a4754616d7a7f7e7e7d7d7c7c7b7b7b7a7a7979797878777777777777777f8c99a6b2bfc1b5a89b8e8177777777777777777878787979797a7a7a7b7c7c7d7e7f7f7a6d6054473a2d211407000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2bec0b3a79a8d8074675a4d4134271a0e010000000000000b1724313e4a5764717d8a97a7a8a19e9d9c9b9a9a9b9d9fa3aaaeb4bcbfbab8afa69f9285796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000000000000000000001080d151b20262b31363a3d4348494d5254575b565e61636465656667676666656462615e565a5754524c4947433d3936302b26201a150d0701000000000000000000000000000000000000000000000000000000000000000000000000000000030c1925303a46525e6874818d9aa7b1bcc8c0b5ab9e94887b6e62554b4035291f202421201e1915130f0a040100000000000000000000000000000000000000000000000000000000000000000000050e171e252a2d2e33323231313030302f2f2e2e2e3846525e686d797974716d686663615e565d545c6062676d737f88939fa8b2bdc0b8aca0958a7e7164554b41352d2d2d2e2e2e2e2f2f2f2f2f3030303031313131313232322f2e2b262018100600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212d3a46535f697884919eabb8c4c7bbafa4998b7e7165564c4135291d110500000006131f2c3845515d677986929facb9c5cdc1b4a79a8e8174675b4e4134281b0e0100000000000000000000000000000000000000000000000008111b242e37414a53545b605b544b433a2f24181b21272c303940454e545b60696e79818b9298a1a8b1b9b9b0a69d928b7e716a60564c41352921170d03000000000000000000000000000000000000000000000000000000000000000000000000060d161e262e343f48505a616c707d879299a3acaca49f948f847c716c605c54505a616c707d869298a2abb5b3aea59d9691867e726d635c504a423931281f150c0300000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2733404d5a6673808d99a6b3baada094877a6d6154473a3a3a3b3b3b3c3c3d3d3d3e3e3f3e3a38342f271f150b010000000000000000000000060c111517181c1d171b1f20212325252a2d2e2f35393a4044464b5153585f62686d737a7f858c92989fa4abb0babec5c2bbb2aba39f918c80776d665c544a3f3328251c11080000000000000000000000000000000000000713202d3946525e686d7271717070706f6f6e6e6d6d6d666c6b6b6b6b6b6b6b6b737f8c99a6b2bfc1b5a89b8e82756b6b6b6b6b6b6b6b6b6c6c666d6d6d6e6e6f70707172726d675d5145392c201306000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1bec0b3a69a8d8073675a4d4034271a0d010000000000000815222e3b4855616e7b889599969691908f8e8d8e8f9092989fa3aab4bfc7c1baada2978a7d7064574a3d3124170a0000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f151b1f252a2d32383b3c4146474b4e4c525456575859595a5a595958575554524c4d4b4746413c3b37322d2a251f1a150e090300000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e2935414c56626e7b8895a0acb8c4c7bdb0a69a8d8074675d5145392c2c2d302e2d2a25221f1b16110d080100000000000000000000000000000000000000000000000000000000000000020d1720293036393b3f3f3e3e3d3d3d3c3c3b3b3b3b3a414c565e676d6c6664605d565654524c504a5053555d606c73808d96a1adb9c5bcb1a79b8f8275675d51453a3a3a3a3a3b3b3b3b3c3c3c3c3c3d3d3d3d3e3e3e3e3e3f3f3c3a37312a22180e040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121e2a36424d576875818e9ba8b4c1ccc0b5ab9c8f8276685d5246392d20130700000004101d2935404b556b7885919eabb8c4cec2b5a89b8f8275685c4f4235291c0f02000000000000000000000000000000000000000000000009111a232c363f49535c64666c665d554b4135291d11161b1e272e343c424a50575f676d747e869196a0a7b0b8b8aea49f92867c6f685d52463e33291f14090000000000000000000000000000000000000000000000000000000000000000000000060f18202830383f44515a626c717e869299a3aba9a19a938c827a6f6a615a514a44505a616b707d869299a3afbbbaafa8a09892877f736e605c544b433931271e150b02000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2733404d5a6673808d99a6b3baada094877a6d6154474647474748484949494a4a4b4b4b4b4745403931271d12070000000000000000000000000105090b0b10060b0f1213151618191e202124292c2e34383a4045474e53565d61676d72797f868e93999fa6aeb4bcc2c4bdb5aea39c928d81786d665b504440372d231a0f06000000000000000000000000000000000005111d2935414c565e61656564646363626262616160605c5f5f5e5e5e5e5e5e66737f8c99a6b2bfc1b5a89b8e8275685e5e5e5e5e5e5e5e5f5f5c6060616162626364646565605d554c4135291d1104000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1bec0b3a6998d8073665a4d4033271a0d000000000000000714212d3a46535f6977838e8c89878483828180818283868c9298a3aebac2cabeb3a9998c7f7366594c403326190d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f141a1e21272c2f3036393b3e41414647494b4b4c4d4d4d4d4c4c4a49474641403e3b3936302e2b27201e19140f09030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020d1925303a47535f6a7783909daab6c3d0c1b8ab9f92857a6d6053473a34383a3d3b3936302e2b27201d19130d0802000000000000000000000000000000000000000000000000000000000008141e29323b4146474c4b4b4b4a4a494949484847474747474c555c60605b5454524c4a474641463f44464b515a606d7984919eabb7c4c3b9ac9f92867a6d6054474647474747474848484849494949494a4a4a4a4b4b4b4b4b4c4847433c342a20150a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1a26313f4b5865727e8b98a9b3bec9c5b9ac9f92867a6d6154473a2e211407000000000c18242f44515e6a7784919daab7c4cfc2b6a99c8f8376695c504336291d10030000000000000000000000000000000000000000000108121b232c353e48515b646e74786d675d5145392c20160a0c151d23282f383f444d555c606c717c8490959fa6afb7baaea39891847a6d615a50453b30251a0d04000000000000000000000000000000000000000000000000000000000000000000030e18212a323a424a505b626c717e879298a3aba69e97928880786d685f585044403e475059616b707d87929fa4aeb7bab2aaa399938b80746d665d554b433930271d140a000000000000000000000000000000000000000000000000000000000000000000000000000000010d1a2734404d5a6773808d9aa6b3baada093877a6d60545053535454555555565657575758585853514b43392f23180c0000000000000000000000000000000000030000030506080a080e111414181d2023282c2f35393c43474c52555d60676d737b818790949fa2aab0babec5bfbbada49d938e81786c605c52493f352c21180d0400000000000000000000000000000000010d1925303a444c525458585757565656555554545353504a5251515151515966737f8c99a6b2bfc1b5a89b8e8275685b51515151515152524a50535354545556565758585854514c433a2f24190d01000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1bebfb3a6998c807366594d4033261a0d0000000000000005121e2a36424d57626f7c817f7d7a7876757474747576797f86929fa6b0bcc7c0b4a79a8d8174675a4e4134271b0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e12161b1f22252a2d2e313036393a3c3e3f3f404040403f3f3d3c3a393630312e2d2a25221f1b16110e0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e2b37434e5866727f8c99a8b1bdc8c6baaea2988b7e7265564c414045464a4746413c3b37322c29241e19130d08010000000000000000000000000000000000000000000000000000020e1925303b444c5254595858575757565655555554545454545454535353535353504953535353535353535353515d67737f8c99a9b3bec7baaea3988a7d706457505353535454545455555555555656565657575757575858585855534e463c31261b0f03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915222f3b4855626e7b8897a1adb9c6c7bbafa3998b7e7164584b3e2f24180d01000000071d2a3643505d697683909ca9b6c3cfc3b6a99d9083766a5d5043372a1d10040000000000000000000000000000000000000000040c1319242d353e47505a636d748184796d6054473d32271b0f030b12181d262d333c434b515a616a6f7b838f949ea5afb7b4aaa1968e81756c61574d42362a1f160c01000000000000000000000000000000000000000000000000000000000000000009141f2a333b444c545c606d727e879299a3aaa29f948f857d736c665d564e463e34353e474f59616b727f8b929ca5afbabcb4aba49f928d81786d675d554b42392f261c11060000000000000000000000000000000000000000000000000000000000000000000000000000010d1a2734404d5a6773808d9aa6b3b9ada093867a6d605f5b606060616162626263636464646565605c554b4034291c100400000000000000000000000000000000000000000000000000020507070d1113181c1f24292c31373a41464b51555d60686e747c828b92989fa6aeb3bcc3bfb6aea59e938d80746e635b51473e332a1f160b020000000000000000000000000000000008131e28323a4146474b4b4b4a4a4949484848474746443f45454444444c5966737f8c99a6b2bfc1b5a89b8e8275685b4f444444444545453f44464747474849494a4b4c4c4745413a31281e130800000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1bdbfb2a6998c7f7366594c403326190d00000000000000020e1a26313b47535f6a6f7573706d686a6968676768676d727e8a949fabb7c4c1b5a89b8e8275685b4f4235281c0f020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002050a0f1315191e202124252a2d2e30313232333434333332312f2e2d2a252421201e1915130f0a050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020f1a26313c4854616e7b8795a0acb8c5cabeb4aa9c8f8376685e52464b51535754524c4947433d39352f2a251e19130c040000000000000000000000000000000000000000000000000005111e2a36414c565e616665656464636363626261616161616160606060606060605b605f5f5f5f5f5f5f5f5f5f5f55616e7b8897a1adb9c6bfb4aa998c7f73665f5c60606060616161616262626262636363636464646464656565625f584e43372b1f1206000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c7985929eabb8c5cbc0b5ab9a8e817467554b4035291d11040000030f1c2936424f5c6975828f9ca8b5c2cfc3b7aa9d9084776a5d5144372a1e060000000000000000000000000000000000000000060d161e2429363e474f59616c727f8c8c7f7366594f43382c1d120700070b141c22283139404550585f696e79828e939ea5afb7b2a89e938a7e71695e52463e31281d120700000000000000000000000000000000000000000000000000000000000000020e1a26313b454d565d666d747f889399a3a7a098928b827a706b605b544c443c34282c353e474f59626d73808d939ea8b2bcbdb5afa49c938e82796d675d544a42382d2217130900000000000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3b9ada093867a6d6c6c656c6d6d6e6e6e6f6f707070717172716d675c5145382c1f130600000000000000000000000000000000000000000000000000000000000104070c1012181d1f262b30353a40454b51565e616a6f777f868f949fa2aab1b9c0c0b7afa59d928d80736d635a50453c31281d140a00000000000000000000000000000000020c1620283035393a3f3e3e3d3d3d3c3c3b3b3a3a3a38342e383838404c5966737f8c99a6b2bfc1b5a89b8e8275685b4f4238383838382e34383a3a3a3b3b3c3d3d3e3f3f3a39352f281f160c0100000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1bdbfb2a5998c7f7266594c3f3326190c000000000000000009141f2b37434e585f62686663615e565c5b5a5b555d606c7683909ca9b6c3c1b5a89b8e8275685b4f4235281c0f02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000307080e11141418191d202123242526262727262625242221201d19181414110e08060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a15212d3a46535e697784919daab7c4d0c5b9ac9f92867a6d61544b555c6063615e5656544e4745413a363029241e160d090200000000000000000000000000000000000000000000000714202d3946525e686e727271717070706f6f6e6e6e6e6d6d6d6d6d6d6d6d6d6d6c656c6c6c6c6c6c6c6c6c6c6c6c6c6c697885919eabb8c4c1b4a89b8e81756c6c666d6d6d6d6d6e6e6e6e6f6f6f6f6f70707070717171717172726f6a5f53473a2e2115080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3744505b6575828f9ba8b5c2d1c3b7aa9d908477675d5145392c2013060000020f1b2835424e5b6875818e9ba8b4c1cec4b7ab9e9184786b5e51452e23170b000000000000000000000000000000000000020a11171f282f353f485059616b717e88939184776b605448392f24180c0000020a11171f272f343e464e565e676d78818e939ea5afb7afa59f92857b6e615a5043392f24180d0300000000000000000000000000000000000000000000000000000000000005121e2a36424d575f686d78808b939aa4a49f9590867f776e686159504a423a322a22232c353e47515b606c77818e96a0aab4bfc0bbaea59d948f82796d665c544a3f3328251b1107000000000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3b9aca093867879797979797a7a7a7b7b7c7c7c7d7d7e7e7e7e796d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000004070c10151a1e24292f353940454d52585f656c727b828b9298a0a7aebabec1b7aea49c928c7f726c61574e433a2f261b110600000000000000000000000000000000040e161e25292d2e3232313130302f2f2f2e2e2d2d2c28232b2b33404c5966737f8c99a6b2bfc1b5a89b8e8275685b4f42352b2b2b2b23282c2d2d2e2e2f2f30313132322d2c29241e160d040000000000000000000000000000000000000000000000000000000000010b1724313e4a5764717d8a97a4b0bdbfb2a5998c7f7266594c3f3326190c0000000000000000030f1b26323c464e53555b595654524c4f4e4d4e4b515a66737f8c99a6b2bfc1b4a89b8e8175685b4e4235281b0f020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002050708080d111314161818191a1a1a1a191917161413110d0808070502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121e2a36424d576774818d9aa7b4c0d0c7bbafa3998b7e716554545c676d706e686662605854524c46413a352f28201a140d05000000000000000000000000000000000000000000000814212e3b4754616e7a7f7e7e7e7d7d7c7c7c7b7b7a7a7a7a7a7a7a7a7a7a7979797979797979797979797979797979797979828f9ca9b5c2c3b6aa9d908379797979797a7a7a7a7a7b7b7b7b7c7c7c7c7c7d7d7d7d7e7e7e7e7e7f7c6f6255483c2f22150900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27333f49536673808c99a6b3bfd2c6b9ac9f93867a6d6053473a2d2014070000010e1b2734414e5a6774818d9aa7b4c0cdc5b8ab9e9285786b5f4a3f34281c100300000000000000000000000000000000070b141b2227313a4145515a616b707d87929a96897c6f63554b4035291d1004000000060d151d2329343c444d555d666d78818e939ea5afbaada2978f82766c61554b4035291f15090000000000000000000000000000000000000000000000000000000000000714212d3a46535f696e7a828d929fa4a099938d837c726c655e564f443f382f2820181a232c353f44505b656d79849198a3aebac1c0b7afa69e948f82786d665b504440372d23190e050000000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0aea1958a87868686868686878788888889898a8a8a8b8b897d7063564a3d3023170a00000000000000000000000000000000000000000000000000000000000000000000000004090f13191d24292f353b41464e535b60696e767e8590959da4aeb4bcc0b7aea49f93887e706a5f564c41382d22170c0300000000000000000000000000000000040c13191d2021252524242323232222212120201f1c171e2633404c5966737f8c99a6b2bfc1b5a89b8e8275685b4f4235281e1e1f171c1f202021212223232425252521201d19130c04000000000000000000000000000000000000000000000000000002070b0d0d0e1724313e4a5764717d8a97a4b0bdbfb2a5988c7f7265594c3f3226190c0808080808080808080a15202a343c4347494e4c4a47464142414141404b5864717e8b97a4b1bec1b4a79b8e8174685b4e4135281b0e0d07060400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001050707090b0c0c0d0d0d0d0c0c0a090707050100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1a25313d4a5764707d8a97a9b3becacbc0b5ab9c8f8275665b5c666d797d7a77736f6a65605d56524c45413a322a251f170f06000000000000000000000000000000000000000000091623303c4956636f7c898b8b8a8a8a898988888887878787878787868686868686868686868686868686868686868686868688939facb9c6c4b8ab9f958986868686868686878787878888888888898989898a8a8a8a8a8b8b8b8b8174675a4e4134271b0e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222d3e4b5764717e8a97acb6c0ccc7bbafa499897c6f6356493c302316080000010d1a2734404d5a6773808d9aa6b3c0cdc5b8ac9f928579665c5044382b1f12060000000000000000000000000000030b12181d262d333c434c515b636c717d869299a39a8e8174675d5145382c1f150a00000000030b1218222a323b434c545c666d78818e939ea6b0b3a99f948a7e71675d51453c31261a0e0400000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b838f949da29f95918780786e6a605b534d443e332d261d160e111a2327333f49535d676f7c86929fa5afbcc5c1b8b0a69e948e81786c605c52493f352b20170c0300000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0bbafa39992929292929993939494959595969697979795887b6e6255483b2f221508000000000000000000000000000000000000000000000000000000000000000000000000000002080d13181d242930363c414950575e616c717b838d929fa2aab2bac0bbafa49a92867c6e685d53493f33271e150a000000000000000000000000000000000002080d1113141818181717161615151514141312100c192633404c5966737f8c99a6b2bfc1b5a89b8e8275685b4f4235281c12060c101213141414151616171819191413110d08010000000000000000000000000000000000000000000000000001080e1317191a1b1a24313d4a5764707d8a97a3b0bdbeb2a5988b7f7265584c3f32251915151515151515151515151518222a32373b3c42403d3a39353035342f3d4a5764707d8a97a3b0bdc1b4a79a8e8174675b4e4134281b1a1a1413100c0701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000914212e3b4754616e7b8797a2adbac6d1c5b8ab9f9285796c60606d78828a8683807c77726d68615e56524c443e3630292117110a02000000000000000000000000000000000000000714212e3a4754616d7a8799989797969696959594949494949493939393939393939993929292929292929292929292929292939aa4afbbc8c8bcb1a79f99929292939a93939394949494959595959596969696979797979798988b7e7165584b3e3225180b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000616222f3c4955626f7c889aa4afbbc8ccc0b5ab988c7f7265594c3f3025190d0100000d1a2733404d5a6673808d99a6b3c0ccc7baaea29886796d6053463a2d201307000000000000000000000000040a0c151d23282f383f444e555d606d727e879298a2ab9f9285796d6053473c31261b0c0300000000010710182029313a424a545c666d78818f949fa7b1b0a69e9184796d60574d42372b20150a00000000000000000000000000000000000000000000000000000000010d1a2734404d5a6773808d959f9e98928c837d736d665f575049413b3228221c140b04081117222d38414b555f6a727f8b939ea9b3becac1b8b0a69e938d80746e635b51473d33291e150b00000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0bbb3aba39f9f9f9f9fa3a0a0a1a1a1a2a2a3a3a3a4a09386796d6053463a2d2013070000000000000000000000000000000000000000000000000000000000000000000000000000000001070d12181f252a2f383f444d535a62696e79808a9298a1a8b1b9c0b6aca29891847a6d655b50443c30261c1106000000000000000000000000000000000000010507070c0b0b0a0a0a0909080807070706030d192633404c5966737f8c99a6b2bfc1b5a89b8e8275685b4f4235281c0f000003060707070808090a0a0b0c0c070604010000000000000000000000000000000000000000000000000000020a12191f232627272726313d4a5764707d8a97a3b0bdbeb1a5988b7e7265584b3f322522222222222222222222222222222222262b2e2f3533302e2d29252827313d4a5764707d8a97a3b0bdc0b4a79a8d8174675a4e413427272727201f1d18120b0300000000000000000000000000000000000205070807050200000000000000000000000000030608091111100f0e0e0e0f101110100d0a05000000000000000000000000000000000000000000000001020303040403030200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a46525e697885929fabb8c5d2c6baada297887c6f6265717e8b9493908d89837f7a736d68605d565046423b3328221c140b030000000000000000000000000000000000000713202d3946525e687986929fa4a3a3a3a2a2a1a1a1a1a0a0a0a0a0a0a0a0a0a09fa49f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa4acb6c0cccdc3b9b1aba39f9f9f9fa4a0a0a0a0a1a1a1a1a2a2a2a2a2a3a3a3a3a4a4a4a4a396897c706356493d3023160a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306080909090808070706030000040714202d3a4753606d7a86939facb9c6d2c1b5a89b8e827568564c41362a1d110500000d192633404c5966737f8c99a6b2bfcccabfb4aa93877a6d6054473a2d2114070000000000000000000002090e151b1e272e343b414950585f676d757f889299a2aaada2978a7e7164584e43372b1e150b000000000000060e171f283039424a545c666d78828f95a0a9b3ada1968d8073695f53473c31261b0f04000000000000000000000000000000000000000000000000000000000915222f3c4855626f7c869297938e867f786f6b605c544e443f382f292017110a02000006111b262f3a434e58626d75818f97a2adbac2cbc2b8afa59d928d80736d62594f453b30271c1207000000000000000000000000000000000000000000000000000000000000000000010e1b2834414e5b6774818e9aa7b4beb3a9a19e93939393939394949495959696979798999a94877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c14191d262d333b424650575f676d747e8691969fa7afb8beb4aaa0968f82776c60574e42382e23170c030000000000000000000000000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfc1b5a89b8e8275685b4f4235281c0f0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a141c242b2f3334343433333d4a5764707d8a97a3b0bdbeb1a5988b7e7265584b3f322e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e313d4a5764707d8a97a3b0bdc0b3a79a8d8074675a4d4134333334342d2c29241d150d03000000000000000000000000000002090e11141414110e0902000000000000000000040a0f1315161e1d1c1c1b1a1b1c1d1d1d1c1a16110a0300000000000000000000000000000001050707090b0d0f0f10111110100f0d0b09080603000000000000000000000000000000000000000000000000000000000000000000000000000005111e2a36424d576a7683909da9b6c3d0cabeb3a9988b7f7265667683909d9f9d9995908b86807a736d68615a524d453d332d261d150d0400000000000000000000000000000000000714212d3a4754606d7a87999f9f9e9e9d9d9c9c9b9b9a9a9a9a9a9a99999999999898989898989898989898989898989898989c9fa6b0bbc7c9beb3a9a19e989898989999999a9a9a9b9b9b9c9c9c9d9d9d9e9e9f9f9fa4a0a0978a7d7064574a3d3124170a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a0f12151516151514141312100c061110131f2c3945515d677884919eabb7c4d1c4b7ab9e918478685e5246392d20130d0d0d0d1926333f4c5966727f8c99a5b2bfccd0baada194877a6e6154473b2e2114080000000000000000040a0f141a20272b303940454d535b606a6f7a818c939aa3abb4b3a99c9083766a5f53473d30271d1207000000000000050d161e272f38424a545c666d7a839197a1aab2a89f92867b6e62584e43372b20160a000000000000000000000000000000000000000000000000000000000815212e3a47535f6a707d858c89827b726d666059514a423c332d261d170e0600000000000a141d28313c46515b616e7b85929fa7b1bdc7cac1b7aea49c928b7f726b60574d42392e23180e050000000000000000000000000000000000000000000000000000000000000000010e1b2834414e5b6774818e9aa7b4b9ada19792868686868686878788888989898a8b8b8c8d8e8a7d7063574a3d3024170a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080b141b222731363e454d555c606c717c8490959ea5aeb6bcb2a89e948b7f726a5f544a3f34282015090000000000000000000000000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfc1b5a89b8e8275685b4f4235281c0f020000000000000000000000000000000000000000000000000000000000000000000000000000000000000008121c262e363b3f404140403f3f4a5764707d8a97a3b0bdbeb1a5988b7e7265584b3f3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3d4a5764707d8a97a3b0bdc0b3a69a8d8073675a4d403f404041403a39352f271f150b010000000000000000000000050b1014191e2021201e19140d0500000000000000070e151b1f21222b2a292828272829292a2a2926221c150d0400000000000000000000010406080d11131416181a1b1c1d1d1d1d1c1c1a181515120f0a04010000000000000000000000000000000000000000000000000000000000000000000000020e1a2530414e5b6774818e9aa7b4c1cdd0c1b5a89b8e8275686d7986929d9fa7a7a09d98928d86807a716c615e574f443f382f271f160e0500000000000000000000000000000000091623303c4956636f7c89999292919190908f8f8e8e8e8e8d8d8d8d8d8c8c8c8c8c8c8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8f949fabb7c3c6b9ada197928b8b8b8b8c8c8d8d8d8e8e8e8f8f8f909090919191929293999394948c7f7266594c3f3326190c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060e151a1f21222322222121201f1c171e1e1d1d1d2935404b556976828f9ca9b5c2cfc5b9aca196877a6d6154473a2e211a1a1a1a1a1a25323f4c5865727f8b98a5b2becbc7bbaea194887b6e6155483b2e221508000000000000050b10151b1f252a32373e434b51575f656c727c848f939fa4acb5bdb7ab9f94887c6f62594f42392e23180c00000000000000040c151d263038424a545d686e7b859298a3aeaea3998e81756a5f53473d32271b0f0300000000000000000000000000000000000000000000000000000006121f2b37434e58616b707b7f7c756e69605c544f4440393027221b140b05000000000000020b161f2a343f46525e68727f8b959fabb5c0cbc9c0b6aea49f92877d70695e544a40342820170d0200000000000000000000000000000000000000000000000000000000000000010e1b2834414e5b6774818e9aa7b4b8ab9e9285797a7a7a7a7a7a7a7b7b7c7c7d7d7e7f808081817a6e6154473b2e21140800000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000020a11171f252a333c434b515a616a6f7a838f939da4aeb6bab0a69f92867c6e665c50443c31261a0d0400000000000000000000000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfc1b5a89b8e8275685b4f4235281c0f02000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e19242e3840474c4d4e4d4d4c4c4b5764707d8a97a3b0bdbeb1a5988b7e7265584b484848484848484848484848484848484848484848484848484848484848484848484a5764707d8a97a3b0bdc0b3a6998d8073665a4d4b4c4c4d4d4d4745403931271d120700000000000000000000080f161c1f252a2d2e2d2a251f170e09000000000007101820262b2e2f383736353434343536373735322d271f160d030000000000000001070d111314191d20212325272829292a2a2a2928272522211f1b15110d080100000000000000000000000000000000000000000000000000000000000000000000091925323f4c5865727f8b98a5b2becbd0c4b7aa9d918477676675818990959ea1a8aaa29f98928d857e756e696159504a4239312820170e050000000000000000000000000000000c1825323f4b5865727f8786868585848483838282818181818080808080807f7f7f7f7f7e7e7e7e7e7e7e7e7e7e7e7e7e7e7f828f9ca9b6c2c5b8ab9e92857f7e7f7f7f7f80808081818282828383838484848585858686868787878175685c4f4235291c0f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006101820262b2e2f2f2f2e2e2d2d2c28232b2a2a2929242f414d5a6774808d9aa7b3c0cdc9bdb2a895897c6f6256493c2f2626262626262626323f4b5865727e8b98a5b1becbc8bbafa295887c6f6255493c2f2216090000000000080f161c20262b30363c434750555c60696e777f8691969ea5afb6bec7bbb0a69b8e81756b60544b4034281c100400000000000000030b141e263039424c565f696f7d86929fa5afab9f93877c6f62584e43372b1f1509000000000000000000000000000000000000000000000000000000030f1a26313c464f5961696e736f6a615e57514a423d342e271e17110a020000000000000000040d18222a36414d56606c78839099a3afbbc7d1c8bfbbafa39992857b6e665c51443e32291f140900000000000000000000000000000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4b8ab9e9285786d6d6d6d6d6d6e6e6f6f7070707172737474746e685e5246392d2014070000000000000000000000000000000000000000000000000000000000000000000002050708100a0907040000000000060b141a212a3039404550585f686e79818d929da4aeb6baaea2989083786d60574e42372b1f160c01000000000000000000000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfc1b5a89b8e8275685b4f4235281c0f0200000000000000000000000000000000000000000000000000000000000000000000000000000000000007131f2b36404a52585a5a5a595958585764707d8a97a3b0bdbeb1a5988b7e7265585555555555555555555555555555555555555555555555555555555555555555555555555764707d8a97a3b0bdbfb3a6998c80736659585859595a5a5a53514b43392f24180c00000000000000000009111921272c30363a3b3a363029201b1209000000040e18222a32373b3c4444434241414142434443423e3831281f150a0000000000040a0f13181d202125292d2e303234353636373736363533312f2e2b26201d19130c040000000000000000000000000000000000000000000000000000000000000000000a1723303d4a5663707d8996a3b0bcd0d2c5b9ac9f9286796d606f757d838a91969fa6aeaaa29f97918a827b706b605b544b433a322920170e0400000000000000000000000000000713202d3a4653606d787a79797878777776767575747474747473737373737372727272727272727272727272727272727274818e9aa7b4c1c2b6a99c8f83767272727273737374747475757576767777777878787979797a7a7a7b7a6d6054473a2d211407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d18222a31373a3c3c3c3b3b3a3a38342e383737363635353f4c5965727f8c98a5b2bfcbcebdb1a4978a7e7164574b3e333333333333333333333e4b5865717e8b98a4b1becbc9bcafa296897c6f6356493c30231609000000020b111a21272c31373b42464e545a61676d727b828b9298a0a8afbbc0c7d0c2b6aa9e93897d70665c5145382c1f13060000000000000000020c151e27303a434d57606b727f8b939ea8afa49a8f82756a6054473c31261a0e020000000000000000000000000000000000000000000000000000000a15202a343d474f575e6166626058524d4440393028231c150c06000000000000000000000006101925303b44505b666f7c87929fabb5c0cbd7cbc0b5aba1979083786d605a50443b3025190d04000000000000000000000000000000000000000000000000000000000000020f1b2835424e5b6875818e9ba8b4b8ab9e9285786b606060606161616262636364646566676868615e564c41362a1e1105000000000000000000000000000000000000000000000000000000000000000002090e1214151d171614100b050000000003090f181e272e343e464e565e676d78808d929da4aeb6b4aa9f958c80736a5f53473e31281d1207000000000000000000000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfc1b5a89b8e8275685b4f4235281c0f020000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17232f3b47525c64676767666665656464707d8a97a3b0bdbeb1a5988b7e7265616161616161616161616161616161616161616161616161616161616161616161616161616164707d8a97a3b0bdbfb3a6998c8073666464656566666767605d554b4035291d10040000000000000009121b232b33383b42464746423b322d241b100700000a15202a343c43474951504f4f4e4d4e4f5050504e4a433a31271c1105000000060e151b1d24292c2d3035393a3c3e404242434444434342403e3c3a37312c29241e160d0800000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b8794aab4bfcad4c7bbafa399887c6f62656b6f787e848f949fa4acaea9a19e948f857d736c665d554c443a322920160d040000000000000000000000000006121f2b3844505c666d6d6d666c6b6b6a6a696968686767676767676666666666656565656565656565656565656565656976828f9ca9b5c2c1b4a79b8e81746865656666666767676868686969696a6a6a6b6b6c6c666d6d6d6e6e6d675d5145392c2013060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010b151f2a343c434748494848474746443f4544444343424241414b5764717e8a97a4b1bdcaccbfb2a5998c7f7266594c4040404040404040404040404b5764717e8a97a4b1bdcac9bcb0a396897d7063564a3d3023170a0000010b151d232b33383c43474d525860626c71797f8690949fa2aab2bac1cbc7c5c0bbafa59e9184796d6053463a2d201307000000000000000000030c151e28313b454f59626d75818f96a1abac9e93897c6f62574d42372b1e1308000000000000000000000000000000000000000000000000000000030e18222c353d454d53545956544e46423b342e271e18120b030000000000000000000000000008141f28333f4a545f6a74818e99a3afbbc6d1d1c7bdb3a99f958d80746c61564d42362a1f160c010000000000000000000000000000000000000000000000000000000000020f1c2835424f5b6875828e9ba8b5b8ab9f9285786c5f53535354545555565656575858595a5b5b54524c443b3025190e0200000000000000000000000000000000000000000000000000000000000000050d141a1e20212a2322201c160f080000000000060c151d2328343c444c555d666c74808d929da4aeb7b1a79f92877b6e625a5043392f24180d020000000000000000000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfc1b5a89b8e8275685b4f4235281c0f020000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1926333f4c58646e737473737272717170707d8a97a3b0bdbeb1a5988b7e726e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e707d8a97a3b0bdbfb2a6998c7f737071717272737374736d675d5145392c1f1306000000000000030c1b242d353d44484d5254524d443e362d22190f05030f1b26323c464e53555e5d5c5b5b5a5b5c5c5d5d5b554c43382d22160a00030c101820262b2f35393a3d414647494b4d4e4f505050504f4f4d4b4847433c39352f281f1a1108000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8698a2aebac6d3cbc0b5ab978a7e71645960656c717a828c939aa2aab3ada69e97928880786d675d564c443a32281f160c0200000000000000000000000003101c28343f4a545c6061605c606160605c555f5e5e5d5d5d5c5c5c5c5c5c5c5c5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5e687784919eaab7c4bfb4ab998c7f73665b5c5c5c5c5d5d5d5d5e5e5e5e5f5f5f5f5c606060616160616161605d554b4135291d1104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d27313c464e5355565555545453504a52515150504f4f4e4e4d5663707c8996a3afbcd0cdc0b4a79a8d8174675a4e4d4d4d4d4d4d4d4d4d4d4d4d4d5764717d8a97a4b0bdcacabdb0a4978a7d7164574a3e3124170b000009131d272f353d44484e53575e616a6f767e848c92989fa6aeb4bcc3c5c0bbb9b5afaca69f968b7e7265584b3f3225180c00000000000000000000030c161f29333d47515b616d7a849199a4afa69b8f8275695f53473a3025190d0100000000000000000000000000000000000000000000000000000006101a232c333b4246484c4947433d363028231c150c07000000000000000000000000000000020b17222d38424e58616e7b87929fabb5bfcbd7cfc5bbb1a79d928a7e71695e52463e31281e13080000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5b9ac9f9286796c5f4a47474747484849494a4a4b4c4d4d4e4e4746413b32291e140800000000000000000000000000000000000000000000000000000000000000050f171f252a2d2e37302f2c27211a11080000000000030b1218222a323b434b545b606e74808d929da4aebbaea3998f82766c61554b4035291e13080000000000000000000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfc1b5a89b8e8275685b4f4235281c0f020000000000000000000000000000000000000000000000000000000000000000000000000000000000010d1a2734404d5a6773808180807f7f7e7e7d7d7f8c99a6b2bfbfb2a6998c7f7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7f8b98a5b1bec1b4a79a8e817d7d7e7e7e7f7f808080796d6053473a2d2014070000000000000b151e2d363f474f54565e615e5650483e342b21170d06131f2b37434e585f626b6a696867676768696a6a665e554a3e32261a0d000c151e222a31373a4145474a4c525456585a5b5c5c5d5d5d5c5b5a5855534e4745413a312c231a120800000000000000000000000000000000000000000000000000000000000006131f2c3845515c677985929facb8c5d2d1beb2a5988b7f726558535b60686d7880889298a2aab4b0a9a19a938c81796d685e564c443a31281e140a000000000000000000000000000b17232e38424a5053545c666d6e6d6d676c6b6b6a6a69696969696969696868686868686868686868686868686868686d7a86939facb9c6baaea399897c70686868696969696a6a6a6a6b6b6b6b6c6c6c666d6d6d6d6d68625b5454514b433a2f24180d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18242f39434e585f626262616160605c5f5e5e5d5d5c5c5b5b5a5a59626e7b8895aab4bfcbcfc2b5a89c8f8275695c59595959595959595959595959595963707d8a96a3b0bdc9cabeb1a4978b7e7164584b3e3125180b00030f1a252f3941474f54585f62696e747c838a91969fa2aab0babfbeb9b8b5afacaba39f9c948f877d7063574a3d3024170a0000000000000000000000040d17212b343f46525d68707d87939fa9ac9f93877b6e61564c4135291d11050000000000000000000000000000000000000000000004050504040008111a212931363a3b403c3b38322a251f18120b03000000000000000000000000000000000006111c262f3c46535f6974818e99a3aebbc7d3d6cdc2b9aea49f92857b6e615a50433a2f24190d030000000000000000000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5b9ac9f938679665c50443a3a3b3b3c3c3d3d3d3e3f404141413b3936302920170d02000000000000000000000000000000000000000000000000000000000000020d17212930363a3b433d3c38332b231a0e0500000000000007101820293139424a505c646e74808d929da6b0b5ab9f948a7e71675d51453a3024190d0200000000000000000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfc1b5a89b8e8275685b4f4235281c0f02000000000000000000000000000000000000000000000000000000000000000000000000000000000004111e2b3744515e6a77848d8d8c8c8b8b8a8a898c919ca8b4c0c0b4a89c918c8888888888888888888888888888888888888888888888888888888888888888888888888888888888888b919ba7b3bfc2b5a99d938e898a8a8b8b8c8c8d8d877b6e6154473b2e211408000000000007121d27303f4850596063696e69615a50463d33291f160b15212e3b47535f6a6f777776757474747576777671665b4e4235291c10030d1e2730343c43474b515457565e616365676869696a6a6969686664625f5854524c433e362c241a0d04000000000000000000000000000000000000000000000000000000000004101c2934404b556b7884919eabb7c4d1ccc0b3a6998d8073665a4950565e666c737d869298a3aab4b3aca49f938f827a6d685e564c433a30261c110600000000000000000000000006111c2630383f444653606d787b7a797979787877777676767676767575757575757575757575757575757575757575757e8a9aa4afbbc5b9ac9f9286797575757575767676767777777778787878797979797a7a7a7a726d62564745413a31281d1307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b555f6a6f6f6f6e6e6d6d666c6b6b6a6a69696868676766666d7a8798a3aebac7d0c4b7aa9d9184776a6666666666666666666666666666666666707d8996a3b0bcc9cbbeb1a5988b7e7265584b3f3225180c000814202b37414b535960636a6f747b818790949ea1a8aeb4b9b8b5b3adababa39f9c99928f89827d706b6155483c2f231609010000000000000000000000060f19222935414c56606b74808d97a1ada4998d8174685e5246392d20150a0000000000000000000000000000000000000003060711121111111010100f171f252a2d2e332f2e2b27201a140c0709090909090909090909080808080808080808080a141d2a36424d57616e7b86929facb9c4ced9d4cbc0baaea2988f82756c61554c4135291f14090000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9b6bbafa49a86796d6053463a2e2e2e2f2f3030313132333435352e2d2a251e170e050000000000000000000000000000000000000000000000000000000000000009141f29333b424648504a48443d352b20170d02000000000000060e171f272f383f44525c646e74808d949ea7b1b0a69e9184796d60564c4135291e140800000000000000000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfc1b5a89b8e8275685b4f4235281c0f020000000000000000000000000000000000000000000000000000000000000000000000000000000000020f1c2935424f5c6875828f9a99999898979796999ca3adb8c4c4b8ada39c99949494949494949494949494949494949494949494949494949494949494949494949494949494949494989ba3acb7c3c5baafa59d9a9697979798989999918578695e52463a2d20140700000000000c18232e3942505a626b70777b716c61594f453b31281d1416222f3c4955626f7c8483828281808182838383766a5d5043372a1d100b151f303942464e53555d606467686d6f7173757576777776767573716f6a66605d5650483e362c1f160c0100000000000000000000000000000000000000000000000000000000000c18232f44505d6a7783909daab6c3d0cec1b4a79b8e8174685b4e444c545b606b707d869298a3abb5b6afa59e9490837a6d685d554c42382e23170f050000000000000000000000000a141e262e343d4a5763707d87878686858584848383838383828282828282828281818181818181818181818181818183909dacb6c0c5b8ab9f928581818182828282838383838484848485858585868686868787877f7265584c3f352f281f160c01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515d67767c7c7b7b7a7a797978787777767675757474737373737986929facb8c5d2c5b8ac9f928579737373737373737373737373737373737373737c8996a3afbcc9ccbfb2a5998c7f7266594c3f3326190c000b1824303c48535d646b70767c81868e939a9fa6acb2b4b3adaba8a9a19e9b99928f8b86827c766f6b61594f44382c1e1c130a00000000000000000000000007101924303a444f59606d7a84919ea6ab9f92867a6d6154473c32271b0f0000000000000000000000000000000000060c1012131e1f1e1e1e1d1d1c1c1c1b1a1e21212623221f1b1818171717161616151515151515151515151515151515151515151a26313b46535e6975818e9ba8b2bdc9d5ddd6cabeb3aa9e938a7d70675d51453b31251a0e0200000000000000000000000000000000000000000000000000000004101d2a3743505d6a7683909da9b6c0b6a093867a6d6053473a2d2122222323232425252627282821201e19140d0500000000000000000000000000000000000000000000000000000000000000040d1a25303b454d52545d56544f473d32291e140800000000000000050d151d262d33404a525c606d78828f959fa8b2ada1968c7f73685d52463b3025190d01000000000000000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfc1b5a89b8e8275685b4f4235281c0f020000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa6a5a5a4a4a3a3a6a8adb5bfcacabfb6ada8a6a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a5a7acb5bec9cbc0b7afa9a7a3a3a4a4a5a5a69d9083776a574d42362a1e11050000000004101c2834404b54626c717d84877e716b60574d433a2f261c1724313e4a5764717d8a908f8e8e8d8e8f8f9085786b5e5245382b1f07121d2731424b54585f62676d7074777a7c7e808182838383838282807e7b77736d68615a50483e31281e13080000000000000000000000000000000000000000000000000000000000071d293643505c6976838f9ca9b6c2cfcfc2b5a99c8f8276695c4f43424a5059616b707d869299a3afbbbbafa69f9590837a6d675d544a3f342821170b020000000000000000000000020c141c232f3b4855626e7b88939993929291919090908f8f8f8f8f8f8f8f8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e9095a0acbec7c2baaea298928e8e8e8e8f8f8f8f909090909191919192929292939a9393948a7d7064574a3d31241d160d040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d79868988888787868685858484838382828181808080808086929facb8c5d2c6baaea2988d8080808080808080808080808080808080808080818e9ba7b4c1cacbbfb3a6998c807366594d4033261a0d000e1a2733404c59646f747d82888e92999fa4acafacaaa7a9a19e9c9997928e8b86827e7a756f6b6360594f444039302e251c0e0400000000000000000000000008131e28323d45515d67717e8a949faba2988c7f7266584e43372b1c12070000000000000000000000000000030a11171c1f202a2b2b2b2a2a2a2929292828272727262626252525242424232323222222222222222222222222222222222222222222212a36424d5763707d8996a0acb9c5d2dedbd0c5bcafa59e91847a6d60574d42362a1e130800000000000000000000000000000000000000000000000000000004111d2a3744505d6a7783909daab6baada093877a6d6054473a2d2115151616171718191a1a1b1b1414110e080200000000000000000000000000000000000000000000000000000000000000010c161f2a36424d575e616a6360594f443b3025190e0300000000000000030b141c2228384044505c666d79839096a1aab2a89f92857a6d61564c41362a1e1308000000000000000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfc1b5a89b8e8275685b4f4235281c0f02000000000000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b556875828e9ba1a0a49f9f9e9d9ea0a8b2bdc9c7bcb1a79f9d9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9fa3abb4aeaeaeaeb0a69e9c9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9c9fa6b0bbc7c9beb2a9a19e9d9e9e9e9f9fa39d9084776a564c4135291d11040000000006131f2c3845515c66717e879192877d6f695e554b42382d221724313d4a5764707d8a979c9b9a9a9a9b9c9184786b5e5145382b1e0c18232f3943545d656a6f747a7d818487898b8d8e8f8f9090908f8e8d8b8884807a706c615a50433a2f24190d01000000000000000000000000000000000000000000000000000000020f1c2835424f5b6875828e9ba8b5c1ced0c3b7aa9d9084776a544a3f383f444f59606b707d87929fa6b0bab9b0a7a0959083796d665c50443e33291d140a000000000000000000000000020a13202d3a4653606d798693a49f9f9e9e9d9d9c9c9c9c9c9c9c9c9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9da0a7b1bcc2b8b0abaaa29f9b9b9b9b9b9c9c9c9c9d9d9d9d9e9e9e9e9f9f9f9fa4a0a095887b6e6255483b2f22150c040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515d6778859195949493999292919190908f8f8e8e8d8d8c8c8c8c9298a2aebac6d3cabfb4aa9c928d8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8e939da9b6bcbdbec0b3a69a8d8073675a4d4034271a0d000e1b2835414e5b687481898f949b9fa3aba8aba39f9d9a9797928f8c8885817e7a76716d68636059545153514a4240372e20160c020000000000000000000000020c16202935414c55616c76828f99a4aa9d9184776a605447392e23180c00000000000000000000000000030c151c23282c2d37383837373736363635353534343433333232323131313030302f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2e2e2e2e2e2e2e2e2e313b4653606c7884919eaab7c3ced9e1d7cec1b9ada1968d8074695e53463a3025190d01000000000000000000000000000000000000000000000000000004111e2a3744515d6a7784909daab7baada194877a6e6154473b2e211409090a0a0a0b0c0d0e0e0e0807050200000000000000000000000000000000000000000000000000000000000000000008131e28313a46525e696e76706b60564c41362a1f14090000000000000000020a11172628343f4a545d676e7a849198a3aeaea2988d8073685e52463a2f24190d000000000000000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfc1b5a89b8e8275685b4f4235281c0f02000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3945515d6777839095949499939291919196a0acb9c5c4b7ab9f95908e8e8e8e8e8e8e8e8e8e8e8e8e8e8e9299a3aebabbbbb7aa9e948f8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8f949fabb7c4c6b9ada197919091919292929995928578685d5245392c201306000000000713202d3a4653606d798592999992857b6e675d544a3f33282023303d4a5663707d8996a3a8a7a7a7a89e9184786b5e5145382b1e101c2934404b55656f757c81868a8d919696989a9b9c9c9d9d9c9c9b999796918c857e706c61564c4135291d1104000000000000000000000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1ced1c5b8ab9e928578665c504438333e474f59616b727f8c949ea8b2bdb9b1a79f958f82786d605a50453b2f261b11060000000000000000000000000714212e3a4754616d7a8794a0a0a39f9f9e9d9d9c9c9c9c9c9b9b9b9b9b9a9a9a9a9a9a9a9a9a9a9a9a9a9c9fa6aaacb1b9c3bab0a69f9c9a9a9a9a9a9a9b9b9b9c9c9c9c9d9d9d9e9e9e9fa2aaa0a1a1a194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b556a7683909da1a1a0a39f9f9e9e9d9d9c9c9b9b9a9a999999999fa2aab4bfcad6d0c6bcaea49c99999999999999999999999999999999999999999b9da5afaeafb0b2b3b4a79a8e8174675b4e4134281b0e000f1c2835424f5b6875828e9b9fa6a49f9e9c999992908d8b8885827f7c7875716d6865615e56544f545c605c5451494032281e1308000000000000000000000000040e19242f3a43505a626e7c87939faba095887c6f62544a4034281c10040000000000000000000000000a151e262e34383a44454444444343434242424141414040403f3f3f3e3e3e3d3d3c3c3c3c3c3c3c3c3c3c3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b44505b65727f8c99a7b1bcc8d4e0e0d5c9bdb2a99f92877b6e61564c41362a1d1105000000000000000000000000000000000000000000000000000005111e2b3844515e6b7784919eaab2b4aea194877b6e6154483b2e21150800000000000000010202000000000000000000000000000000000000000000000000000000000000000000000000071119242f3a434f59616e7b837d70685e52463b31261a0e02000000000000000000061417232e38424b555e686f7c86929fa5afaa9f92867a6e61564c4135291c11060000000000000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfc1b5a89b8e8275685b4f4235281c0f0200000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8789888887868685858484919eaab7c4c3b6a99d908381818181818181818181818181818186929facb9c5c2b5a89c8f82818181818181818181818181818181828f9ca9b6c2c4b8ab9e9185848484858586878889877a6d6054473a2d2114070000000006131f2c3845515c6674818e98a1979083796d665b50443e322823303d495663707c8996a3afb4b3b4aa9e9184776b5e5144382b1e131f2c3845515c677581888e92999a9ea0a8a4a6a8a8a9aaaaa9a9a8a6a8a09e9792877e70685d5245392c201306000000000000000000000000000000000000000000000000000000010e1b2834414e5b6774818e9aa7b4c1cdd2c6b9ac9f9386796d6053463a2d353d474f59606c77828f96a1adb9c1b9b1a79e948d80746c61574d41382d22170b030000000000000000000000091623303c4956636f7c8995949499929291919090908f8f8f8f8e8e8e8e8e8d8d8d8d8d8d8d8d8d8d8d8d8f949fabb7bcc3bdb2a89f948f8d8d8d8d8d8e8e8e8e8f8f8f9090909191919292989394949595968a7d7063574a3d3024170a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111e2a36414c566a7783909da3a3a2a1a1a0a39f9f9f9e9e9e9e9d9d9d9d9d9d9ea1a9b3bec9d5d5c9bdb2a8a19e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9e9e9fa2aaa0a1a3a4a5a6a7a89b8e8175685b4e4235281b0f000a1723303d4a5663707d899399979a93918f8c898683817e7b7875726f6c6564615e5654524c4e585f666d66635b51443a3025190d0100000000000000000000000008131e28313e47535f6a75818e99a3a79a8d8074665c5144382c1f1308000000000000000000000006111c2630383f4446515251515150504f4f4f4e4e4e4d4d4d4c4c4c4b4b4b4a4a4a494949484848484848484848484848484848484848484848484848484953616e7b8795a0acb8c5d1dee6dacfc4bbafa3998d8074685e5246392d20150a000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919ea4a5a7aba194887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f19232935414c56616b75818e867a6e61574d42362a1e13080000000000000000000006111c263039434c565f6a727f8b939ea8aea2988d8073685d5245382e23170c0000000000000000000000000000000000000000000000000000000000000d192633404c5966737f8c99a6b2bfc1b5a89b8e8275685b4f4235281c0f02000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3945515d67707d7c7b7b7a7a797878777d8a97a3b0bdbeb1a5988b7e74747474747474747474747474747885929fabb8c5bcafa295897c7474747474747474747474747474747d8a97a3b0bdbfb2a6998c7f7777787879797a7b7c7d70685d5245392c2013060000000004101c2834404b54616e7b86929fa0958f82786c605a50443a2f24303c4956636f7c8996a2afbcc0b7aa9d9184776a5e5144372b1e14202d3a4753606d7a86939b9fa3a49f9e9d9d9c9d9ea1a9acaeb4b5b3b2aca9a19992857a6d6054473a2d211407000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0cdd4c8bbafa49a877a6d6154473a2e2c353e44505b656d7a84919ea5afbcc3b9b0a69d928b7e71695e53493f33271f150900000000000000000000000c1926323f4c5965727f898887878686858484838383838282828282818181818180808080808080808080828f9ca9b6c2c0b5aba0968f82808080808181818182828283838384848485858586868787888889898073665a4d4033271a0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3946525e687885929797969595949399929292929191919190909090909297a1adb9c6d2d2c5b9ada19691909090909090909090909090909090909191929298939495969798999a9c9b8f8275685c4f4235291c0f000916232f3c4855606b74818b8d8a888684827f7c7a7774716e69696662605b5354524c47464c565f6a6e79736d63564c4135291d11050000000000000000000000080f161c1f2b37434e58626e7b87929fac9e9285796d6053463a3024190d01000000000000000000000c17232e38424a50535d5e5e5e5d5d5d5c5c5c5b5b5a5a5a595959585858575757565656555555555555555555555555555555555555555555545454545454545e697784909daab7c3d2dde8e0d7cbc0b5ab9f92867a6d6154473c32261b0f030000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929697999b9ea195887b6e6255483b2f2215080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e18212b353d45525d68707d8a938d8074695f53463a3024190d01000000000000000000000a141e28313b444e58626d75818e96a0acaa9f92857a6d60544a3f34281c100300000000000000000000000000000003060708080707060603000005040d192633404c5966737f8c99a6b2bfc1b5a89b8e8275685b4f4235281c0f04050000030506070707080706040000000000000000000000000000000000000000000000000000000004101d2935404b55606b706f6f6e6d6d6c656b707d8a97a3b0bdbeb1a5988b7e726868686868686868686868686c7885929fabb8c5bcafa295897c6f68686868686868686868686868707d8a97a3b0bdbfb2a6998c7f736b6b6b6c676d6e70706b60564c4135291d110400000000000c18232e3946525e6973808d97a19e948d80736c61564c4135292f3c4955626f7c8895a2afbbc3b7aa9d9084776a5d5144372a1e131f2c3845515c677784919d9a979a9392919090909297999fa2aab4bcbdb9b3aba1978c7f7265594c3f3226190c000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdd8ccc0b6a194877a6e6154473b2e2127333f49535e686f7d89939eaab4bfc2b8aea49f92857b6e655b50443c31261a0b02000000000000000000000714212e3a4754616d7a7c7b7b7a797978787777767676767575757575747474747474747474747474747a84919eabb8c3bbafa4999184797474747474747475757576767676777777787879797a7a7b7b7c7c7d7b6e6154483b2e21150800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3b4754616e7a878b8a8a8988888786868685858585848484848383838385929eabb8c5d1d1c4b7ab9e9184838383838383838383838383838383838484858586868788898a8b8d8e8f908f8276695c4f4336291c10000714202c38444f59606d787e807e7c7a787572706d676764615f575955535049474641424b555e686e7c857f73685e5246392d20150a0000000000000000000008111921272c2f313c47535f6974818e9aa4a1978a7d7064564c4135291d110500000000000000000003101c28343f4a545c606a6b6b6a6a6a69696968686867676766666565656464646363636262626262626262626262626262626161616161616161616161616161616774808d9aacb6c0ccd8e4e8dcd1c7baaea2988c807366584e43372b1f12060000000000000000000000000000000000000000000000000004111e2b3744515e6a778388898a8c8e919695887b6f6255483c2f22150900000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e17202a333d47515b606d7a84919e92867b6e61564c4135291d120700000000000000000000020c161f29323c46515b606d7a84919aa4aea2988c7f72665c5044382c1f140900000000000000000000000000060c1012131514141413120f0b06121111192633404c5966737f8c99a6b2bfc1b5a89b8e8275685b4f4235281c111111120b0f1213141414151312100c070000000000000000000000000000000000000000000000000000000c18242f39434f5960636362616160605b64707d8a97a3b0bdbeb1a5988b7e72655b5b5b5b5b5b5b5b5b5b5f6c7885929fabb8c5bcafa295897c6f625b5b5b5b5b5b5b5b5b5b5b64707d8a97a3b0bdbfb2a6998c7f73665e5f555d6062636360594f433a2f24190d01000000000007121d2a36424d57606d7a85929ea69c928a7e70685d52453d312f3c4855626f7b8895a2aebbc3b7aa9d9084776a5d5144372a1e1e1c2934404b556774818e908d8a8786858483838485888c9298a2aab4bfc5bdb3a99c8f8276695c4f4336291c10030000000000000000000000000000000000000000000000000000010d1a2734404d5a6773808d9aa6b3c0cdd1d2baaea194877b6e6154483b2e21222d38414c56606b75818e98a2aebac5c0baaea2988f82776c60574d42372b1d140a000000000000000000000713202d3946525e686d6f6e6e6d6d666c6b6a6a69696969696868686868676767676767676767676d79839097a1adb9b9afa59f93877d6f676767676767686868696969696a6a6a6b6b6b656c6d6d6e6e6f6f706e695e52463a2d20140700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d797f7e7e7d7c7c7b7a7a7979797878787877777777777777808d9aa7b3c0cdccbfb2a5998c7f7777777777777777777777777777777777787879797a7a7b7c7d7f8081828384807366594d4033261a0d0004101c27333d44505c666d7173716f6d67696663605d555855534d4c4846443f3a3a434b545d676d7a8491867a6d6154473c31261a0f000000000000000000050f19232b33383c3d3b424d57626e7b87939fa99b8e8275685d5246392d20130700000000000000000006121f2c3844505c666d777877777776767675757574747473737372727271717170706f6f6f6f6f6f6f6f6f6f6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e707d8a9aa4afbbc8d4dcdcdcd6cabfb4aa9e9184786a5f53473b2e21150800000000000000000000000000000000000000000000000000000713202d3a4653606d787b7c7e7f8184888b887b6e6155483b2e221508000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d162029323b454f59626d74818e96a1998d8174685d5246392f24180c0100000000000000000000040d17202a343f45515d676f7d88939fa9aa9e9184796d6053463b30251a0e0200000000000000000000030a11171c1f2021212120201f1c171f1e1e1e1d2633404c5966737f8c99a6b2bfc1b5a89b8e8275685b4f4235281d1e1e1e1f171b1f2020212121201f1c18120b030000000000000000000000000000000000000000000000000007121d27313d474f55565655555453535764707d8a97a3b0bdbeb1a5988b7e7265584e4e4e4e4e4e4e4e525f6c7885929fabb8c5bcafa295897c6f62564e4e4e4e4e4e4e4e4e5764707d8a97a3b0bdbfb2a6998c7f736659524b5154555656544f473d31281e1308000000000000000e1a25303b45515d67727f8c98a2a49e91857a6d60594f43392f3b4855616e7b8894a1aebbc3b6aa9d9083776a5d5044372b2b2b2b232f3b4855626e7c8583807d7b797877767677787c80869298a3aebac7c4b7ab9e9184786b5e5145382b1e12050000000000000000000000000000000000000000000000000000000d1a2733404d5a6673808d99a6b3c0c2c4c6bbaea194887b6e6155483b2e221b262f3a444f59616e7b86929fa9b3becabeb3aa9f948b7f72695f53473e2f261b110600000000000000000005111d2a36414c565e6163626465656565656565656565656666656565656565656565656565676d79828f959fa9b2bcb1a79d938c7f736b60555e5e5e5d5d5c5c5c5c5c5d5d5d5e5e5e5f5b6060616162626363615e574d42362a1e120500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3945515d676d72727170706f6e6e6d6c656c6c6b6b6b6b6a6a6a6a6a73808d99a6b3c0ccccc0b3a6998d80736a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6b6b656c6d6d6e7071727374757677736e63574b3f3225190c00000b162128343f4a545c6065666462605d55595653514b4b4847423f3c3937333b444c555d666d798390968b7f7265584e43372b1c110600000000000000000b16212b353d44484a484647535f6976828f9ca99f92867a6d6154473a2e2114070000000000000000000713202d3a4653606d78838584848483838282828181818080807f7f7f7e7e7e7d7d7d7c7c7c7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7b7a7a7a7a7b87939facb9c6cfcfcfd0d0d0c6b9ada196887c6f6255483c2f221509000000000000000000000000000000000000000000000000000006121f2b3844505c666d6e6f717274787b7e7f776c605346392d2013060000000000000000000000000000000000000000000000000000000000000000000000000000000000050d161f28323b444d57606b727f8b939da89f92867a6d61554b4035291d12070000000000000000000000050e18222935414c55606b74818e97a1ada1968a7e7164574d42362a1e1205000000000000000000030c151c23282c2d2e2e2d2d2d2b28222b2b2b2a2a2a33404c5966737f8c99a6b2bfc1b5a89b8e8275685b4f42352a2a2a2b2b2b22272b2d2d2d2e2e2d2c28231c150c03000000000000000000000000000000000000000000000000010b151f2c353d44484a49484847474a5764707d8a97a3b0bdbeb1a5988b7e7265584b41414141414145525f6c7885929fabb8c5bcafa295897c6f625649414141414141414a5764707d8a97a3b0bdbfb2a6998c7f7366594c41454748494a48443d352b1f160c010000000000000009141f2935414c55606d7a86929faca1978e81746b60554b40353b4854616e7b8794a1aebac3b6a99d9083766a5d5043383838383838383a47535f6a6e787674716e6c666a6a696a6a6f737c86929facb8c5c5b8ac9f9285796c5f5246392c1f13060000000000000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3b4b6b8b9beaea295887b6f6255483c2f22141d28323d46525e6973808c97a1adb9c7c5bcb0a69f92867b6e61594f41382d22170b000000000000000000010d1925303a444c525e696e7171717172727272727272727272727272727272727272717171717a828f949ea7b1bbb8ab9f958e81746d666c6b6b6b6a6a6a6969686868676666656464636261605d555a55565654524d453b30251a0e02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b555d60666564646362626160605b5f5f5f5e5e5e5e5d5d5d66737f8c99a6b2bfcccdc0b3a79a8d8074675d5d5d5d5d5d5d5d5d5d5d5d5d5d5e5e5f5b606061626364656667696a6b66635c52473b2f23160a0000050b17232e38424a5053585a575553514b4c494745403e3b3a37312f2e343e454d565d676d78828f959d9083766a5f5347382e23170b0000000000000004101c27333d474f545655534d4d5764717d8a97a1a0998b7e7265584b3f3225180c00000000000000000006121f2c3844505c6678859191919090908f8f8f8e8e8d8d8d8c8c8c8b8b8b8a8a8a8989898888888888888888888888888888888888888888888787878787878787878788939aa4afbbc2c2c2c2c3c3c4c4bdb2a8978a7e7164574b3e3124180b000000000000000000000000000000000000000000000000000003101c28343f4a545c606263646668696e71726c655b5044372b1f120500000000000000000000000000000000000000000000000000000000000000000000000000000000050e172028313a444c565f69707d87929fa5aea2988c7f72675d5145392f24180e040000000000000000000000071019242f3a434f59616d7a85929ea7a89c8f8276695e52463a2d20150a0000000000000000000a151e262e34383a3b3b3a3a3938332d38383737373636404c5966737f8c99a6b2bfc1b5a89b8e8275685b4f42363637373738382d3337393a3a3a3b3a38342e271e150b00000000000000000000000000000000000000000000000000030d1a232c33383c3d3c3c3b3a3d4a5764707d8a97a3b0bdbeb1a5988b7e7265584b3f353535353945525f6c7885929fabb8c5bcafa295897c6f6256493c35353535353d4a5764707d8a97a3b0bdbfb2a6998c7f7366594c40393a3b3d3d3c38332b231a0d040000000000000000020d19242f3a45525d6874818d9aa4a99d93897d70675d51453c3b4754616e7a8794a1adbac3b6a99c908376695d50454545454545454545434e585f626b6a676461605b545d5d585f626a74818d9aa7b4c0c5b9ac9f9286796c5f5346392c2013060000000000000000000000000000000000000000000000000000000d1a2633404d596673808c99a6a7a8a9abadb2afa295887c6f6255493c2f221616202a36424d57606d7985929eabb5c0ccc2baaea2989083766c6153493f33271b110600000000000000000008131e29323b4854616e7b7e7e7e7e7e7e7f7f7f7f7f7f7f7f7f7f7f7f7f7f7e7e7e7e7e7e7e8390949ea6b0b9c3b6aa9d90837a7a7979797878777777767676757574747373727170706f6e6d676967605c544a46423b33291f1409000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d18242f39434b515359585757565555545353504952525251515151505966727f8c99a5b2bfcccdc1b4a79a8e8174675b5050505050505050505050505051514950535354555657585a5b5c5d5e5957524940352a1f130700000006111c2630383f44464b4d4b494745403f3d3a39352f2e2d2b2730383f444f575f686d79828f949e9f95887b6e62544a3f34281c10030000000000000713202c38444f596063615f574f53606d7985919796918a7e7265584b3f3225180c00000000000000000003101c28343f4a54697683909c9d9d9d9c9c9c9b9b9b9a9a9a99999898989797979696969595959595959595959595959595959494949494949494949494949494949494959fa4acb6b5b5b5b5b6b6b7b7b8b8b2a5988b7f7265584c3f3225190c0000000000000000000000000000000000000000000000000000000b17232e38424a505355565759575f616565605b53493f33271b0f03000000000000000000000000000000000000000000000000000000000000000000000000000000060f172029323a434c565e686e7b859299a3afb4aa9e9185796d60554b40352920160c02000000000000000000000008131e28313d46525d68717e8a959fac9f93877b6e6154483c32261b0f000000000000000006111c2630383f44464847474746443f4545454444434343424c5966737f8c99a6b2bfc1b5a89b8e8275685b4f4243434344444445453f4446474747484644403930271c12070000000000000000000000000000000000000000000000000008111a21272c2f30302f2e313d4a5764707d8a97a3b0bdbeb1a5988b7e7265584b3f3229292c3945525f6c7885929fabb8c5bcafa295897c6f6256493c2f292929313d4a5764707d8a97a3b0bdbfb2a6998c7f7366594c40332d2f30302f2c27211a11080000000000000000000008131e2935414c56626e7b87939faca59e9184796d60574e423a4754606d7a8793a0adbac3b6a99c908376695d5151515151515151515151514e53555e5d5a575453504a51514e535864717e8a97a4b1bdc5b8ac9f9285796c5f5246392c1f13060000000000000000000000000000000000000000000000000000000d1a2633404d596673808c98999a9b9c9ea1a9a7a295897c6f6256493c2f23160e1a25303b45515d6773808d99a4afbbc7cabfb4aa9f948a7d70655b5044382d22170b00000000000000000005111e2a36414c566975828b8b8b8b8b8b8b8b8b8c8c8c8c8c8c8c8c8b8b8b8b8b8b8b8b8b8b90959fa6b0b8c1c4b8ab9f95908786868685858584848383838282818181807f7f7e7d7c7c7b7a7876736d665c504438302921170d020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d2831394045474c4b4b4a494948474746443f454545454444444c5965727f8c98a5b2bfcbcec1b4a89b8e8175685b4e44444444444444444444444444453f4446474748494a4c4d4e4f50514d4b4740372e24190e02000000000a141e262e34383a3e403e3c3a39352f302d2c292422262d333c424a505961696e7a828f949ea6a7998d8073665c5044382b1f150b0000000000000916222f3c4854606b706e696059505c66737f8a8b88847e726d62564a3d3124170b000000000000000000000c17232e424f5b6875828e9ba8aaa9a9a9a8a8a8a7a7a7a6a6a6a5a5a5a4a4a4a3a3a2a2a2a2a2a2a2a2a2a2a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a8a8a8a8a8a8a9a9a9a9aaaaabacaca5988c7f7265594c3f3226190c00000000000000000000000000000000000000000000000000000006111c2630383f444648494b4c4d5355585953504941382d22170b000000000000000000000000000000000000000000000000000000000000000000000000000000080f182129323a444c565e686e7a849197a2abb5b9ada1978b7f72675d51453d32281e13080000000000000000000000010c161f2935414c56616c7683909da7a4998c7f7266584e43372b1c1106000000000000000c17232e38424a50535454545353504a52525151515050504f4f5966737f8c99a6b2bfc1b5a89b8e8275685b4f4f4f505051515152524950535354545453514a42392e23180c0000000000000000000000000000000000000000000000000000080f161c202323232224313d4a5764707d8a97a3b0bdbeb1a5988b7e7265584b3f363636363945525f6c7885929fabb8c5bcafa295897c6f6256493c36363636363d4a5764707d8a97a3b0bdbfb2a6998c7f7366594c40332622232322201c160f080000000000000000000000010d19242f3a47535f6976828f9cabaca0968d80736a5f53473a4753606d7a8693a0b5c0c2b6a99c8f8376695e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e63707d8996a3b0bcc5b8ab9f9285786c5f5245392c1f12060000000000000000000001020606050505040404030302020201010c1925323f4c5865727f898b8c8d8e8f9197969a9e96897c6f6356493c30231609141f2935404b55616e7b87939facb9c6d0c6bcb0a69d9083786c6053493f33271b0f0300000000000000000714202d3946525e6878859298989898989898989898989999989898989898989898989898979da0a7b0b4b5b6b7b8b1a79f9d94939992929291919190908f8f8f8e8e8d8d8c8b8b8a89888887858380786d6053463a2d20170f050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f282f35393a3f3f3e3d3d3c3b3b3a3937332d38383838373f4c5865727f8b98a5b2becbcec2b5a89b8f8275685c4f423737373737373737373737372d3337393a3a3b3d3e3f4041424344403f3b352e251c12070000000000020c141c23282b2d3233312f2d2c29242320201f252a2f383f444d545c606b707b8390949ea6b0ab9e9184796d6053463d30271c12070000000006121e2b37424e5763707d7b706b625b54606d787e7e7c77716c625b51453a2e22150900000000000000000005111d2a36414c56697683909ca2a2a1a1a0aaa39f9f9e9e9d9d9d9d9d9d9c9c9c9c9c9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9c9c9c9c9c9d9d9e9e9f9fa4998c7f7266594c3f3326190c000000000000000000000000000000000000000000000000000000000a141e262e34383a3b3c3e3f4246484b4c46443f382f261b1106000000000000000000000000000000000000000000000000000000000000000000000000000107111a212a333b444c565d686d7a839096a0a9b3bdbeb3a99e9185796d60594f443a3025190d040000000000000000000000040d1924303a44505a63707d8a959fab9d9084776a5f5347382e23170b00000000000003101c28343f4a545c6061616060605b5f5f5e5e5e5d5d5d5c5c5c5b66737f8c99a6b2bfc1b5a89b8e8275685b5c5c5c5d5d5d5e5e5e5f5f5b6060606161605c544a4034281c10040000000000000000000000000000000000000000000000000000050b10141617161724313d4a5764707d8a97a3b0bdbeb1a5988b7e7265584b42424242424245525f6c7885929fabb8c5bcafa295897c6f625649424242424242424a5764707d8a97a3b0bdbfb2a6998c7f7366594c4033261916171614100b050000000000000000000000000008131e2b37424d5764717e8a99a3aea89f92877b6e62564c414653606d798699a3afbbc2b5a99c8f82766b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b707c8996a3afbcc4b8ab9e9185786b5e5245382b1f12050000000000000004090c0e0f131212121111111010100f0f0f0e0e0d13202d3a4653606d797d7e7f80818385878a8d9196887b6e6255483b2f2215090d18242f3946535e6975828f9baab4bfcacec2b8aca0958a7d70655b5044372b1f130800000000000000000814212e3b4754616e7a879896979798989899999a9a9b9b9b9c9c9d9d9e9fa2aaa1a2a2a3a4a5a5a6a7a8a8a9aaabaeb1abaaa1a0a39f9f9e9e9e9d9d9d9c9c9b9b9b9a999998979796959497918f85796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d161d24292c2d33323131302f2f2e2d2d2b27222c2b2b2b323f4b5865727e8b98a5b1becbcfc2b5a99c8f8276695c4f43362a2a2a2a2a2a2a2a2a2a2b22272b2d2d2e2f303132333436373833322f2a241c130a00000000000000020a11171c1f2025272422201f1d18181d242931363d414950575f666d737d8590959fa6b0b9ada1968a7d7064584e42392e23180c020000000814212e3a47535f6a7783857d726d62605c666d71716f6a64615a51483f34291d11050000000000000000000713202d3946525e68788591969595949494939892929191919190909090908f8f8f8f8f8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8f8f8f8f8f8f90909191929399998c807366594d4033261a0d00000000000000000000000000000000000000000000000000000000020c141c23282b2d2f303131363a3b3e3f3937332d261d140a00000000000000000000000000000000000000000000000000000000000000000000000000030b1218232c333c454d565e686d7a839095a0a8b2bbc5c4b9ada1978c7f736b60564c41352920150a00000000000000000000000008131e28323e4855616b7683909da7a095887c6f62544a3f34281c1003000000000006121f2c3844505c666d6e6e6d6d6c666c6b6b6b6a6a6a696969686868737f8c99a6b2bfc1b5a89b8e82756868686969696a6a6a6b6b6b6c656c6d6d6d6e6d665c5144382c1f1206000000000000000000000000000000000000000000000000000000000407090a0a1724313d4a5764707d8a97a3b0bdbeb1a5988b7e7265584f4f4f4f4f4f4f4f525f6c7885929fabb8c5bcafa295897c6f62564f4f4f4f4f4f4f4f4f5764707d8a97a3b0bdbfb2a6998c7f7366594c403326190d0a090704000000000000000000000000000000010e1a26313c4754606d7a86929facafa3998e8174685e524644505c667986929facb9c2b5a99c8f827878787878787878787878787878787878787878787878787878787878787878787d8996a3afbcc4b7ab9e9184786b5e5145382b1e1205000000000002090f15181b1c1f1f1f1e1e1e1d1d1d1c1c1c1b1b1b1a1a1f2c3845515c676d707273747576787a7d818488867a6d6053473a2d20161616161d2a36424d5763707d8a98a2aebac6d3c8bcb1a79d9083786c6053463a3024190d01000000000000000815222e3b4855616e7b8889898a8a8b8b8c8c8d8d8d8e8e8f8f9090919192989494959696979899999a9b9c9c9d9fa2aaa2a4a5a6a7a9aaababaaaaaaa9a9a9a8a8a7a7a6a6a5a4a3a3a2a39992867c6f665c5145382c1f13060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c12181d2020262524242322222120201f1b171f1f1e25323e4b5865717e8b98a4b1becbcfc3b6a99c908376695d5043362a1d1d1d1d1d1d1d1d1d1e171b1f202021222324252728292a2b2625231f19120a01000000000000000000060b101213181a18161413191c23282f353b42464e535b60696e7880889297a0a7b0b8bdb2a99c8f82766a60544a4034281e13080000030f1b27333f4953626e7b8892877e766f6a615f606464625f585550483f362d23150d070000000000000000000714212e3a4754616d7a87898989888887878686858585848484848383838383828282828282818181818181818181818181818181818181818181818181818181818181818282828282828282838384848585868687877e7164574a3e3124170b0000000000000000000000000000000000000000000000000000000000020a11171c1f20222324262a2d2e32322d2b27221b140b02000000000000000000000000000000000000000000000000000000000000000000000000050d151d2329353e454e575e686d7a839095a0a7b1bac3cdc9beb3a99f92877d6f685e52463c32261b0f030000000000000000000000020c16202c38444f5963707d8995a0a79a8d8073665c5044382b1f120600000000000713202d3a4653606d787b7a7a7a797979787878777776767675757575757f8c99a6b2bfc1b5a89b8e82757575757576767677777778787979797a7a7a7b796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdbeb1a5988b7e72655c5c5c5c5c5c5c5c5c5c5f6c7885929fabb8c5bcafa295897c6f625c5c5c5c5c5c5c5c5c5c5c64707d8a97a3b0bdbfb2a6998c7f7366594c403326190d00000000000000000000000000000000000000000915202c3945525d6876828f9cacb5ab9f92867a6d61554b404a5f6c7986929facb9c5b8ac9f928684848484848484848484848484848484848484848484848484848484848484848485919eabb8c4c4b7aa9d9184776a5e5144372b1e110400000000030c141b202527282c2c2b2b2b2a2a2a292929282828272727262834404b555c60636566676869686d7074787c7e71675d5145392c22222222222225313b4653606d7985929facb8c5d2cdc3b8aca0958a7d7164564c4135291d1104000000000000000714212d3a46535f69767c7c7d7d7e7e7e7f7f80808181828282838384858586878888898a8a8b8c8d8d8e8f9091929894969798999b9c9d9e9fa4aba3a5a7a9abacafb5b3b2b2b1b0afa59f92877d706a5f544b4034281c100400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070d10131419181817161615141413120f0b12121825313e4b5864717e8b97a4b1becad0c3b6aa9d9083776a5d5044372a1d1111111111111111060b0f12131414151617191a1b1c1d1e1a1916130e07000000000000000000000000000306070b0d0d141a1e24292e343940454d535860656c727b838c939aa2a9b1b9c2c4b7ab9f94897c6f665c51443a3024190d010005121f2b3744505b65737f8c99928b827c756e695f656c65605c554b433c352f271f19110700000000000000000713202d3a4653606d787d7d7c7c7b7b7a7a7a79797878777777777776767676767675757575757575757575757575757575757575757575757575757575757575757575757575757575757676767677777879797a7a7a716c6155493c3023170a00000000000000000000000000000000000000000000000000000000000000060b1012131516181a1e21222526201f1b17110a02000000000000000000000000000000000000000000000000000000000000000000000000060e171f272f343f474f575f696e7a8390959fa7b1b9c3ccd5cfc4bbafa39991847a6d61584e43372b1f1306000000000000000000000000040e1c28333e4855606b7783909daa9e9185796d6053463a2d2013070000000004101d2a3743505d6a7683878787868686858585848484838383828282828283909daab7c0c0b8ab9e9184828282828282838384848485858586868687878783776a5e5144372b1e1104000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdbeb1a5988b7e726969696969696969696969696c7885929fabb8c5bcafa295897c6f69696969696969696969696969707d8a97a3b0bdbfb2a6998c7f7366594c403326190d000000000000000000000000000000000000000004111d2935414c5665727e8b9aa4afaea3988c8073675d5145535f6c7986929facb9c5baaea298929191919191919191919191919191919191919191919191919191919191919191919197a1adb9c6c3b7aa9d9084776a5d5144372a1e1104000000020c151e252c313435393938383837373736363535353434343333332e39434b51535658595a5b565e6163676a6f716c61554b40352f2f2f2f2f2f2f2f2f3845515c6775828f9ca8b5c2d0d4c8bcb1a79c8f8275685d5245392c2013070000000000000005121e2b37424d575f6a6f6f70707171727273737374747575767677777879797a7b7c7c7d7e7e7f808181828384858688898a8b8d8e8f909193999597989a9c9e9fa4aba6a8abacb2aa9e938b7e716b60584e42392e23180c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010406070c0c0b0a0a0908080706050300000b1824313e4b5764717e8a97a4b1bdcad0c4b7aa9d9184776a5e5144372b1e060004040404040400000305060707080a0b0c0d0e0f10110d0c0a07020000000000000000000000000000000000050f171f252a2f353940444b51575e616a6f787f8690959fa4acb3bbc3cbc7bbb0a69d9083786d60564c4135291d1104000613202d394653606c7884919d9f948f87817b6e696c78746d675d554e454039312b23190c030000000000000006121f2c3844505c666d70706f6f6f6e6e6d6d6c656c6b6b6a6a6a6a6a6a6969696969686868686868686868686868686868686868686868686868686868686868686868686868686869696969696a6a6b6b6c676d6d6d68615a5045392d2114080000000000000000000000000000000000000000000000000000000000000000000306070809090e121415181913120f0b06000000000000000000000000000000000000000000000000000000000000000000000000020a11172029313940455159616a6e7b8490959fa7b1b9c3cbd5d4cec8c0b5aba1968f82756a5f54473b2e221508000000000000000000000000000b16212c38444f5965727f8b98a3a197897d7063564a3d3023170a0000000005121e2b3845515e6b788491949393999292929191919090908f8f8f8e8e8e9095a0acb4b4b3b3ada196918e8e8e8f8f8f909090919191929292999393949185786b5e5245382b1f1205000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdbeb1a5988b7e75757575757575757575757575757885929fabb8c5bcafa295897c7575757575757575757575757575757d8a97a3b0bdbfb2a6998c7f7366594c403326190d0000000000000000000000000000000000000000010d19242f3b4754616e7a87939facb4aa9e9285796d605347535f6c7986929facb9c5bfb4aaa29f9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9ea1a9b3bec9c3b6a99d9083766a5d5043372a1d100400000009141e2730373d41424645454544444443434342424241414040403f3f3f3e404546494b4c4d4e4c525457585f6264615a50433c3c3c3c3c3c3c3c3c3c3c3c404b5565727f8b98aab4bfcad6cec3b9ac9f92867a6d6054473a2e23180c00000000000000020e1a26313c454e585f62636364646565656666676768686869696a6a6b666d6d6e6f6f70717272737475757677787a7b7c7d7f80818283858687888a8c8d8f91939997999c9ea1a8a3988e81746c62594f463c30271d12070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1bec8c9c4b7ab9e9184786b5e51452d22170b0000000000000000000000000000000000000001030405000000000000000000000000000000000000000000040e17212931363a41454a51555d60696e757c838b92989fa7afb6bec5c9c5c4beb8aca0958c7f73685d5245392c20130705121e2a36424d5763707d8996a0a69f9a938e867b6e748181796d675f58514b433d352b1e150b0000000000000003101c28343f4a545c60646363626261616160605b5f5e5e5e5e5d5d5d5d5d5c5c5c5c5c5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5c5c5c5c5c5c5d5d5e5e555c6061605d5650483e33281c1105000000000000000000000000000000000000000000000000000000000000000000000000000000020507080b0c06050300000000000000000000000000000000000000000000000000000000000000000000000000060b141c2228323b434b515b626b707c849196a0a7b1b9c2cbd4cdc8c3bdb8b1aca49f94887c6f6255493c2f2216090000000000000000000000000005101c27333d4754616d7a86929f9d978e8174675b4e4134281b0e00000000030f1c28333f4a546a7683909da0a0a39f9f9e9e9e9d9d9d9c9c9c9b9b9b9b9da0a7a7a7a7a7a7a6a8a19e9b9b9b9b9c9c9c9d9d9d9e9e9e9f9fa3a0a09c8f8276695c4f4336291c1003000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdc3b7aa9d908382828282828282828282828282828287929facb9c5c3b6a99c908282828282828282828282828282828283909daab6c3bfb2a6998c7f7366594c403326190d0000000000000000000000000000000000000000000814202d3946525e687784919daab7ada1978b7e7265584e535f6c7986929facb9c5bbb0a69f9c939393939393939393939393939393939393939393939393939393939393939393979aa2abb6c2c3b6a99c908376695d5043362a1d10030000040f1b25303941484d4f5252525151515050504f4f4f4e4e4e4d4d4d4c4c4b4b4b4a4a4a494949494949494a4e53555755504949494949494949494948484848484855616e7b8898a2aebac6d3d3c7bbaea3998b7e7165554b4034281c10040000000000000009141f2a333c464e54555656575758585959555c6060605c605f5f5f5f5c60616162636364656666676869696a676d6e6f71727374767778797a7c7d7f81838486888a8c8f9196969892867b6e615a50473d342a1e150b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bbbcbcbdb8ab9e9285786b5f4a3f33281c0f03000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c162029333b42464c52545c60676d737b818790959fa2aab1bbc0c5c3bdb9b7b2adaaa29f92867a6d6054473a2d2114070714212d3a46535f6975828f9ca8b0aba2989083786d7a868e82796f6a605d554f473d30271d1207000000000000000c17232e38424a5053575656565555545453535049525151515150505050504f4f4f4f4f4f4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4f4f4f4f4f4f4f4f50505151524b51535454524c443e362c22170c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171d262d333d444d555c606d727d859196a0a8b1b9c2cbccc8c3bcb8b2aca7a09a938e83796d6053473a2d20140700000000000000000000000000000b16202d3946525d6875818e92918c857d706356493d3023160a0000000006121f2b3844505b667784909d9f9e9e9d9d9c9c9c9c9c9c9c9c9b9b9b9b9b9b9b9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9b9b9c9c9c9d9d9e9f9fa49c8f8276695c4f4336291c1003000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdc5b8aca095908f8f8f8f8f8f8f8f8f8f8f8f8f8f8f9299a3afbbc7c4b7ab9f94908f8f8f8f8f8f8f8f8f8f8f8f8f8f8f90959fabb8c4bfb2a6998c7f7366594c403326190d00000000000000000000000000000000000000000005111e2a36414d566874818e9ba7b4b3a99d9184776a5f53535f6c7986929facb9c5b7ab9f948f8787878787878787878787878787878787878787878787878787878787878787878a909aa6b2bec2b5a99c8f8276695c4f4336291c100300000915202c37414b53595b5f5f5e5e5e5d5d5d5c5c5c5b5b5b5a5a5a59595958585857575756565656565656565656565656565656565555555555555555555555555555606c7985929facb8c5d2d7cbbfb5ab9c8f8276675c5145382c1f130600000000000000030e18212a343c434749494a4a4b4b4e585f62676d6d6d666c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c666d6e6f7072747678797b7d80828487898b8d8073695e53483e352b22180c03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926323f4c5965727f8c98a5aeaeafafb0b2ac9f928579665b5044382b1f120600000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e28323b454d53565d60666d717980868e939a9fa7aeb4bcbfbbb9b6b2adaba9a19e98928d83786d6053463a2d201307121e2a36424d57616e7b87939facaba39992867c6e717e8b948f837c736d6760594f42392e23180c0000000000000006111c2630383f44464a4a4949484847474746443f454444444444434343434343424242424242424242424242424242424242424242424242424242424242424242424242424242424243434343444445404547474745413a322c241a10050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040b141c22282f383f444e565e676d747f879297a1a8b2bac3cac7c0bbb9b1aca8a09d95908781796d675c5145382c1f1306000000000000000000000000000005111d2935414c56626f7c858684807a706b6054483b2f221609000000000613202d394653606c79869299929291909090908f8f8f8f8f8f8f8f8e8e8e8e8e8e8e8d8d8d8d8d8d8d8d8d8d8d8d8d8d8e8e8e8f8f90909191929399949184786b5e5145382b1e1205000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdc8bcb1a7a09d9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9fa3abb5c0cbc7bcb0a69f9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9d9fa7b1bcc8bfb2a6998c7f7366594c403326190d000000000000000000000000000000000000000000020e1925303f4b5865727e8b98aab4b8aca096887b6f6255535f6c7986929facb9c2b6a99c8f827a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7e8a97a3b0bdc2b5a99c8f8276695c4f4336291c100300000c1825313d48535d65686c6c6b6b6b6a6a6a6969686868676767666666656565646464636363636363636363636362626262626262626262626262626262626262626262657783909daab6c3d0dcd1c5b9ac9f9286796d6053463a2d2013070000000000000000060f19222a32373b3c3c3d3d3e47535f6a6f79797979797979797979787878787878787878787878787878787878787878787878787878787879797979797a7a7a7a7b7b787a7c7f80796d60574d42362d231a100807050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c99aaa1a2a2a3a4a5a7a39886796c605346392d2013060000000000000000000000000000000000000000000000000000000000000000000000000000000000010d1925303a444d575e61686d72797e848c92989fa4acb1bab9b6b5aeaca9a8a19e9a97918c8580796d665c5044382b1f120b19222d3a46525e6974808d99a4aca49992877d706a76828f9c9590878079706b60544b4034281c1004000000000000000a151e262e34383a3d3d3c3c3c3b3b3a3a3937332d383737373737373636363636353535353535353535353535353535353535353535353535353535353535353535353535353536363636363737382f34383a3a3a39353028201a12080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d161d262d333c424a505860686e79818c9399a2a9b2bac3c5bebab6afaca7a09d96918b837c746d675d554b4034291c10040000000000000000000000000000010d1924303a47545f6a6f787977736e6860594f44382c201307000000000713202d3a4653606d79858786868584838383838383828282828282828281818181818181808080808080808080808081818182828383838484858686878885786c5f5245392c1f1206000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdc9bdb2a8a19e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9fa3abb5c0cbc8bdb1a8a09d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ea0a8b2bdc9bfb2a6998c7f7366594c403326190d000000000000000000000000000000000000000000000816222f3c4955626f7c8898a2aebab2a8988c7f7265554b5f6c7986929facb9c2b5a99c8f82766d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d707c8996a3afbcc2b5a99c8f8276695c4f4336291c100300000e1b2734414d59656f7579787878777777767676757575747473737372727271717170707070706f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6e6e75818e9ba8b4c1cedbd3c7bbafa399887b6e6255483b2f22150800000000000003090e12141920262b2e2f3030313c4855626f7c868686868686868685858585858585858585858585858585858585858585858585858585858585858686868686878787878781757072736d675d51453b31241b17191514120e09030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2633404d596673808c98949495959697999a9c93867a6d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000005111d2935414c565e696e747a7f848b91979fa2aaafb6b4aeaca9aba39f9c9996918d89847f7a736d675d544a3f34281c10141d2a36424d57616e7b86929faba49a93877e716b6f7c88949fa099928d847d70665c5145382c1f130600000000000000030c151c23282c2d3130302f2f2e2e2e2d2d2b27222b2b2b2a2a2a2a2a29292929292828282828282828282828282828282828282828282828282828282828282828282828282929292929292a2a2b23292c2d2e2d2c29241e160e080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f282f383f444d545b606a6f7a838e939fa4abb3bcc3bcb8b3adaca49f9c95908a847e786f6a605d554c43392f23180c0000000000000000000000000000000008131e2b37434e585f656c6d6666615e564f473d32271b10030000000006131f2c3845515c676d7a7a7979787777767676767676767575757575757574747474747474747373737373737373737474757575767677777878797a7a7b7b6e6155483b2e22150800000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdc5b9aca196919090909090909090909090909090909299a3afbbc7c5b8aca095919090909090909090909090909090909196a0acb9c5bfb2a6998c7f7366594c403326190d000000000000000000000000000000000000000000000713202d3a4653606d7985929facb8b6a99c8f8276675d515f6c7986929facb9c2b5a99c8f827669606060606060606060606060606060606060606060606060606060606063707c8996a3afbcc2b5a99c8f8276695c4f4336291c100300000f1c2835424f5b6875818685858484848383838282828181818080807f7f7e7e7e7d7d7d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7b7b7b7b7b7b7b7b7b7b808d9aa7b4c0cdd2d3cbc0b5ab968a7d7063574a3d3024170a0000000000050d141a1e202124242322222323303c4956636f7c899893939a939292929292929292929292929292929292929292929292929292929292929292929292939a9393939494948f8376696567605d554b4133292223242521201e1a140d0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707e868787888889898a8c8d8f91877b6e6154483b2e21150800000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3946525e686e7b80858c91969ea1a9aeacaaa8aba39f9d9a9992908c8984807c78736d68605d554b42382e2317111b262f3846525e6974808d99a3a39f93887e716c6975818e9ba6aba39f969185796d6053463a2d2013070000000000000000030a11171c1f20242323232222212120201f1b171e1e1e1e1d1d1d1d1d1c1c1c1c1c1c1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1c1c1c1c1c1c1c1c1d1d1e1e181c1f202121201d19130c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007131d28313a424a50575f666c727c8490959ea5afb5bdb9b8b1aca9a29f9a938f8a837e78716d666058514c433a31271d120700000000000000000000000000000000020f1b26323c464e535b60605c5454524c443d352b21160b000000000004101c2834404b555d686d6e6d666b6b6a6a696969696969696968686868686868676767676767676767676767676767676768686969696a6a6b656c6d6e6e6e695f53463a2d21140700000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdc4b7ab9e918483838383838383838383838383838387929facb9c5c4b7aa9d918483838383838383838383838383838384919eaab7c4bfb2a6998c7f7366594c403326190d0000000000000000000000000000000000000000000006121f2b3844505c667683909da9b6b9ac9f92867a6d60535f6c7986929facb9c2b5a99c8f8276695c5959595959595959595959595959595959595959595959595959595963707c8996a3afbcc2b5a99c8f8276695c4f4336291c100300000f1b2835424e5b6875818e929191919090908f8f8f8e8e8e8d8d8d8c8c8c8b8b8b8a8a8a898989898989898989898989898989898988888888888888888888888888888888888d929da9b5c4c5c5c7cbbeb2a5988b7f7265584c3f3225190c00000000050f171f252a2d2e3130302f2e2d2e2f3c4855626f7b8895aaa0a49f9f9f9f9f9d9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9f9fa4a0a0a0a0a19c8f8276695c5a54514b433a2f2e2f3031322e2d2a251f170f05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303c4955616c70787a7a7b7b7c7c7d7f81828483796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a868d92989ea1a8a9a6a8a09e9b989992908d8a86837f7c78746f6c66605d56514b433a30261c1117222d38414e58616e7b86929fa39f918b7f726c616e7b87939facaea49d928b7f72665c5145382c1f130600000000000000000000060c10121317171616151514141413120f0b06111111111010101010100f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f1010101011070c101314141413110d0802000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d18242f3a434b545b60696e787f8691969fa7afbab8b3adaba7a09d97928d87827d77716c66605c544e45413a31281f150b0100000000000000000000000000000000000a15202a343c4149505353514b4746413b322b23190f040000000000000c18232e39434c565d6061605c545e5d5d5d5d5c5c5c5c5c5c5c5c5b5b5b5b5b5b5b5a5a5a5a5a5a5a5a5a5a5a5a5a5a5b5b5b5c5c5d5d5e5e5b60606162615f574d42362a1e120500000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdbeb1a5988b7e77777777777777777777777777777885929fabb8c5bcafa295897c7777777777777777777777777777777d8a97a3b0bdbfb2a6998c7f7366594c403326190d0000000000000000000000000000000000000000000003101c28343f4a546875818e9ba8b4baaea3998a7d7064575f6c7986929facb9c2b5a99c8f827669656565656565656565656565656565656565656565656565656565656565707c8996a3afbcc2b5a99c8f8276695c4f4336291c100300000c1926333f4c5966727f8c999e9e9e9d9d9d9c9c9b9b9b9a9a9a99999998989897979796969696969696969696969595959595959595959595959595959595959595959595959a9da4aeb7b7b8b9bbbfbab3a6998d8073665a4d4033271a0d000000030d17212930363a3b3e3d3c3b3b3a3b3c3d4754616e7a8794aab4afacacaca095908f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f949fabb6adadada89c8f8275695c4f4745413b3a3a3b3c3c3d3f3b3a36302921170d030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814202d3944505a61666c6e6e6e6f6f707172747577776d665c5145382c1f130600000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7986929fa2a9a19e9c999696918e8b898683807d7a76736f6c6563605b54524c45403a31281e140f1b27333f4953606a74818e98a399928b7f726d626a74818e99a4afa49c928d80736d62544b4034281c10040000000000000000000000000306070a0a090909080807070605030000040404040404030303030302020202020202020202020202020202020202020202020202020202020202020202020202020303030303040400000406070707070401000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111d2935404b555d666c727b838c9298a1a9b1b4aeaca9a19e9a95908b85807b76706b64605b54504a423d352f281f160d03000000000000000000000000000000000000040e19222a2f383f44464645403b39363029201911070000000000000007121d27303a434c52545453514b515050505050504f4f4f4f4f4f4f4f4e4e4e4e4e4e4e4d4d4d4d4d4d4d4d4d4d4d4e4e4e4f4f5050505149505353545555534d453b31261a0e0200000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdbeb1a5988b7e726a6a6a6a6a6a6a6a6a6a6a6a6c7885929fabb8c5bcafa295897c6f6a6a6a6a6a6a6a6a6a6a6a6a6a707d8a97a3b0bdbfb2a6998c7f7366594c403326190d00000000000000000000000000000000000000000000000b17232e404d596673808c99a6b3bfb4ab9a8d817467555f6c7986929facb9c2b5a99c8f827672727272727272727272727272727272727272727272727272727272727272727d8996a3afbcc2b5a99c8f8276695c4f4336291c100300000b1825323e4b5865717e8b98a4abaaaaaaa9a9a9a8a8a8a7a7a6a6a6a5a5a5a4a4a4a3a3a3a3a3a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a1a1a1a7a9a9aaaaababacaeb5aeaea69a8d8073675a4d4034271a0d00000009141f29333b4246484b4a4948474748494a4b53606d798698a2aebab9b7aa9d908382828282828282828282828282828282828282828282828282828282828f9ca9b6b9bab5a89b8f8275685c4f4c4b494747474748494a4c4846423b33291f140900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c28333e4750545b60616161626263646667696a6a605c544b4034281c1004000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c6774818e96989697918f8c8a8784817f7c797673706d676662605b5353504a45413a352f281f160c121f2b3744505b656f7c87939f9992877e726d62626f7c87939faba39c928c80736e645b5142392e23180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3945515d676d787f8690959fa3aab0abaaa39f9b97918d88837e79746e6963615953504a443f383029241e160d0400000000000000000000000000000000000000000710191d262d3337393a38342e2d2a251e170e070000000000000000000b151e28313a414547474645404444434343434343434242424242424241414141414141414040404040404040404141424242434344443f44464747484846423b33291f14090000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdbeb1a5988b7e72655d5d5d5d5d5d5d5d5d5d5f6c7885929fabb8c5bcafa295897c6f625d5d5d5d5d5d5d5d5d5d5d64707d8a97a3b0bdbfb2a6998c7f7366594c403326190d0000000000000000000000000000000000000000000000061825313e4b5864717e8b97a4b1beb7aa9e918477675c5f6c7986929facb9c4b7aa9d91847f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f808e9aa7b4c1c2b5a99c8f8276695c4f4336291c100300000d1a2633404d596673808c99a1a1a0a0a39f9f9e9e9d9d9d9d9c9c9c9c9c9b9b9b9b9b9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9b9b9b9c9c9c9c9d9d9e9e9fa3aba1a2a29a8d8074675a4d4134271a0e0000020e1a25303b454d525457575655545454565758565c667985929facb8bdb0a4978a7e76767676767676767676767676767676767676767676767676767676798693a0adb9c1b5a89b8e8275685b54595856545453545556575854524d453b30251a0e020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222c353e424a505354545555565657595a5c5e5d53514b42392e23180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b55616e7a848c8b89878582807d7a7775726f6d676763605d555653504946443f38352f29241d160d0613202d394653606c7883909a9892877e716c62616b76828f99a4a49f918c80736e645c52493f30271d12070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000106090b0c100f0e0d0c0d0e0f1007060400000000000000000106090b0c0f0e0d0c0c0c0c0d0e0f080705020000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d79828c92989fa7acaaa69f9c98928e8a85807c77726d67625f57554f46443f38342e261e19130c0400000000000000000000000000000000000000000000070b141b22272b2d2d2c2823201e19140d0500000000000000000000030c161f282f35393a3b3a38342e373736363636363636363535353535353534343434343434343434343434343434343535363636372d3337393a3b3b3b3a36312921180d030000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdbeb1a5988b7e7265585050505050505050525f6c7885929fabb8c5bcafa295897c6f62565050505050505050505764707d8a97a3b0bdbfb2a6998c7f7366594c403326190d0000000000000000000000000000000000000000000000091623303c4956636f7c8996abb5bfb9ac9f93867a6d605f6c7986929facb9c5b8aca096918c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8e929da9b5c2c2b5a99c8f8276695c4f4336291c100300000f1b2835424e5b6875818e9595949493999292929191909090908f8f8f8f8f8e8e8e8e8e8e8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8e8e8e8f8f8f8f9090919192929994949595968d8174675a4e4134271b0e000005121e2a36424d575e616463636261606162636563606b7885929eabb8bdb0a4978a7d7169696969696969696969696969696969696969696969696969696d7a8693a0adb9c1b4a89b8e8175685e616564626160606162636465615e574d42362a1e120500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005101a232c2f383f44464747484849494a4c4e4f51504645403930271d1207000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232e3946525e686e7b7f7e7c7a787673706d68686562605c555753514b4946443f3938332d29241e18130c04091623303c4956636f7c89939590867d716c625c67707d89949fa39a938c7f736e645c524a40372d1e150b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d121518191d1b1a1a191a1b1c1c1413100c070100000000070d121618191c1b1a191818191a1b1c1514120e090300000000000000000305060708090a090807060300000000000000000000000000000000000000000916222f3c4955626f7c88949fa3aaa49f9d9994908b86817d79736f6a65605d55534d48443e38332d28231c140c0801000000000000000000000000000000000000000000000000020a11171b1f20201f1c1814110d0802000000000000000000000000040d161e24292c2d2e2d2c28232a2a2a2a292929292929292928282828282828272727272727272727272727272728282829292a2a22272b2d2d2e2f2e2d2a261f180f06000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdbeb1a5988b7e7265584b44444444444445525f6c7885929fabb8c5bcafa295897c6f625649444444444444444a5764707d8a97a3b0bdbfb2a6998c7f7366594c403326190d00000000000000000000000000000000000000000000000814212e3b4754616e7a8799a3aebbbbafa499887b6f625f6c7986929facb9c5bdb2a8a09d9898989898989898989898989898989898989898989898989898989898989898989a9da5afbac5c2b5a99c8f8276695c4f4336291c10030000111e2b3744515e6a7783898888878787868685858484848383838382828282828281818181818181818181818181818181818181818181818181818181818181818181818282828383838484858686878788898989807366594d4033261a0d00000714202d3a46525e696e71706f6e6e6d6e6f7072706b6b7885929eabb8bdb0a4978a7d71645c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c606d7a8693a0adb9c1b4a89b8e817568686e72716f6e6d6d6e6f6f70726e695e52463a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008111a1d262d3338393b3b3b3c3c3d3e3f414244443a38342e271e150b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d2a36414c565e696e73726f6d68696663615e56585653514b4a4745403c3937332d2b28221c19130d0701000713202d3a4653606d7981898c837c706b615a606d7984919da19892887f736d635c524a40382e251b0c0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010911181e2224252a2827262627282929201f1c18120b0300010911181e2225262827272625252627282822211e1a140d060000010507060b0f12131415161716151312100c060603000000000000000000000000000000000613202d394653606c788491999f9b9a93908c88837e7a75706d66625f5853514b47423c38332b28221c17110a0200000000000000000000000000000000000000000000000000000000060b0f12131313100c070501000000000000000000000000000000040c13191d202121201f1c181d1d1d1d1d1d1c1c1c1c1c1c1c1c1b1b1b1b1b1b1b1a1a1a1a1a1a1a1a1a1a1a1b1b1b1c1c1d1d1d171b1f2020212222211e1a140d0600000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdbeb1a5988b7e7265584b3f373737373945525f6c7885929fabb8c5bcafa295897c6f6256493c37373737373d4a5764707d8a97a3b0bdbfb2a6998c7f7366594c403326190d00000000000000000000000000000000000000000000000714202d3946525e687986929facb9c0b5ab978a7d71645f6c7986929facb9c5bdb2a8a09e9999999999999999999999999999999999999999999999999999999999999999999b9ea5afbac6c2b5a99c8f8276695c4f4336291c100300000916222f3c4955626f7c7c7c7b7b7a7a7979787878777776767676767675757575757474747474747474747474747474747474747474747474747474747474747474747575757676767777787879797a7b7b7c7d7d796d6053463a2d20130700000815212e3b4854616e7b7e7d7c7b7a7a7b7c7d7e7d706b7885929eabb8bdb0a4978a7d71645f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f606d7a8693a0adb9c1b4a89b8e8175686e7a7f7e7c7a7a7a7a7b7c7d7f7b6e6154483b2e2115080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080b141c22282b2d2e2e2e2f2f303133343637372d2c28231d150c030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1925303b444d575e61666563615d56595754524c4c494645403d3a39352f2d2b27221f1c17110d080100000006131f2c3845515c666d757d7f796e6a6059606a73808d95a09792867e726d635b524a40382e261c1309000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009131b23292e31323635343333343436362d2c29231d150d0309131b23292e3132353433333232333334352e2d2a261f170f06080d111314171b1f20212223232221201f1c1715120f0a04000000000000000000000000000006121f2b3844505b66707d8792928f8b87837f7b76716d6863605c54534e4745403937312c281f1c17110b060000000000000000000000000000000000000000000000000000000000000000030506070604000000000000000000000000000000000000000001080d111314141313100c07101010101010100f0f0f0f0f0f0f0e0e0e0e0e0e0e0e0d0d0d0d0d0d0d0d0d0e0e0f0f0f1010060b0f12131414151514120e09030000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdbeb1a5988b7e7265584b3f343434343945525f6c7885929fabb8c5bcafa295897c6f6256493c34343434343d4a5764707d8a97a3b0bdbfb2a6998c7f7366594c403326190d000000000000000000000000000000000000000000000005111e2a36414c566b7885919eabb8bfb2a6998c7f73665f6c7986929facb9c5b9aca096918c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8e939ea9b6c2c2b5a99c8f8276695c4f4336291c100300000815222e3b4754606a6f6f6f6e6e6d6d6d666c6b6b6a6a6a6a6969696969686868686867676767676767676767676767676767676767676767676767676767676767686868696969696a6a6b6b666d6d6e6f6f70706d675c5145382c1f130600010e1a2734414d5a6774808a8a8988878787898a8b82756b7885929eabb8bdb0a4978a7d716c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6d7a8693a0adb9c1b4a89b8e817568717e8a8b898787868788898a8b7e7165584b3e3225180b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171c1f20212122222323242627292b2a201f1c18120b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008141e29323b454d525459585654524c4d4a4746413f3c3a38342e2d2c2924201f1b17120f0b0600000000000004101c2834404b545c606b70726d675f5855626f7c87929f9691857c716c625b514940372e261c140a010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111b252d343a3e3f434241403f404142433a38342f271f150b111b252d353a3e3f4241403f3f3f3f4041423b3a36312921171114191d202122272b2d2e2f2f302f2e2d2c2823211f1b150d0701000000000000000000000000030f1c28333f4a54606b717e8585827e7a77736e6965605d5653504a47433c39352f2b261f1c160f0b06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001040607080706040000040303030303030303020202020202020101010101010101010101010101010101020203030300000305060708080807050200000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdbeb1a5988b7e7265584b41414141414145525f6c7885929fabb8c5bcafa295897c6f625649414141414141414a5764707d8a97a3b0bdbfb2a6998c7f7366594c403326190d0000000000000000000000000000000000000000000000020e19253044515d6a7784909daab7c1b4a89b8e8175685f6c7986929facb9c4b7aa9e91847f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f818e9ba7b4c1c2b5a99c8f8276695c4f4336291c1003000006131f2b37434e586062636262616160605c5f5f5e5e5d5d5d5d5c5c5c5c5c5b5b5b5b5b5b5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5b5b5b5c5c5c5c5d5d5e5e545c60616162626363605c554b4034281c100400010d1a2734404d5a6773808d96969594939495968e81756c7885929fabb8bdb0a4978a7e79797979797979797979797979797979797979797979797979797979798693a0adb9c1b5a89b8e827568707d8a9695949393949596978b7e7165584b3e3225180b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f121314141515161617191b1c1e1d1313100c07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020d172029333b4246474c4b49474641403d3a3936302f2d2c282320201d1813120f0b06030000000000000000000c18232e39424b5159606365605c554e5d6976839099938e847b6f6a615a514940372e251c140a0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d18232d373f464a4c504e4d4d4c4d4e4f4f4745403931271d1218232d373f464a4c4f4e4d4c4b4b4c4d4e4f4846423b33291f1e2024292d2e2d3337393a3b3c3d3c3b3a38342e2e2b262018120c040000000000000000000000000b17222d38424f59626c717a7975716e6866615f5754524c46443f3837312c29241d1a15100b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdbeb1a5988b7e7265584e4e4e4e4e4e4e4e525f6c7885929fabb8c5bcafa295897c6f62564e4e4e4e4e4e4e4e4e5764707d8a97a3b0bdbfb2a6998c7f7366594c403326190d000000000000000000000000000000000000000000000000081d293643505c6976838f9ca9b6c2b6aa9d908377655b6c7986929facb9c2b5a99c8f827673737373737373737373737373737373737373737373737373737373737373737d8996a3afbcc2b5a99c8f8276695c4f4336291c10030000030f1b27323c464e545556555554545453504a52515151505050504f4f4f4f4f4f4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4f4f4f50505051514b515354545556565653514b43392e23180c0000000d1a2633404d596673808c99a2a1a1a0a1a29b8e8175667986929facb6b6b6ac9f92868585858585858585858585858585858585858585858585858585858586929facb6b7b7b5a89b8f827568707c8996a2a1a0a0a1a2a2978a7e7164574b3e3124180b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060608080809090a0b0c0e0f1111070604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e17202930363a3b403f3c3a393530302e2d2a2523201f1c181413110d07050300000000000000000000000007121d27303940454f54565953514b4c5966727f888d8a817a6e69605850483f372e251c130a02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121e29343f495156585d5b5a59595a5b5c5c53514b43392f23181e29353f495157595b5a5a595858595a5b5b55534d453b31262a2d3035393a3e3f44464748494a494846443f3c3a373129241d160d04000000000000000000000006111c262f3d47505a62676d6d6665615e5655534d4745413a38342e2b26201d18120e090300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1bdbeb1a5988b7e72655b5b5b5b5b5b5b5b5b5b5f6c7885929fabb8c5bcafa295897c6f625b5b5b5b5b5b5b5b5b5b5b64707d8a97a3b0bdbfb3a6998c807366594d4033261a0d0000000000000000000000000000000000000000000000020f1c2835424f5b6875828e9ba8b5c1b8ac9f9285796c606c7986929facb9c2b5a99c8f827669666666666666666666666666666666666666666666666666666666666666707c8996a3afbcc2b5a99c8f8276695c4f4336291c10030000000a15202b343c43474949494848474746443f454544444343434343434242424242414141414141414141414141414141414141414141414141414141414141414141424242434343444445404546474848494a4a4645403930271d12070000000c1926323f4c5965727f8c98a5aeadadaea89b8e81756c798698a3a9a9a9a9a9a39892929292929292929292929292929292929292929292929292929292929298a2a9aaaaaaaaa89c8f8275696f7c8996a2adadadadaea3978a7d7064574a3d3124170a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e171f252a2d2e3332302e2d29242421201d19161313100c07060401000000000000000000000000000000000b151e272e343d44484a4c4745404b57636d727c807d746d685f574e463e362d251c130a010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915222e3a46515b6265696867666667676969605c554b4034291c222e3a46515b626568676666656566666768615f574d42363036393b4146474b49505354555656555453504a4847433c352f281f160d0400000000000000000000000a141d2c353e4850555d60605c5454524d4846423b39352f2b28231c1b15100d0701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1bebeb1a5988b7e726767676767676767676767676c7885929fabb8c5bcafa295897c6f67676767676767676767676767707d8a97a3b0bdc0b3a6998d8073665a4d4033271a0d0000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0baaea298877a6d606c7986929facb9c2b5a99c8f8276695c5959595959595959595959595959595959595959595959595959595963707c8996a3afbcc2b6a99c8f8376695c504336291d1003000000040e19222b32373b3c3c3c3b3b3a3a3a38342e383737373736363636363535353535343434343434343434343434343434343434343434343434343434343434343535353636363637372e34383a3a3b3c3c3d3d3a38342e271e150b000000000c1825323f4b5865727e8b98a5b1babab4a89b8e81756d7a86939d9d9d9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9d9d9d9d9e9e9c8f8276696f7c8995a2afbab9bab0a3968a7d7063574a3d3024170a0000000000000000010507070f0f0e0e0e0d0d0c0c0c0b0b0b0b0b0b0a0a0a0a0a0a0a0a0909090909090909090909090909090909090909090909090909090909090909090a0a0a0a0b0b0b0b0b0c0c0c0c0d0d0d0d0d0e0e0e0e0e0f0f0a09070400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d141a1e202126252321201d19171413110d08070604000000000000000000000000000000000000000000030c151d232833383c3d3f3a383b46515b636a6f73706b605d564d453d342c241b130a01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1824313e4a56626d727675747372737475766d675c5145382c1f25313e4a57626d72757473727272727374756e695f53463a3b4146474c525457535b60616262636261605c5455534e45403931281f160c0100000000000000000000020b1a232d363e434b515353514b4746413b3a36312c29241f1c17110f0a04010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bebeb1a5988b7e74747474747474747474747474747885929fabb8c5bcafa295897c7474747474747474747474747474747d8a97a3b0bdc0b3a69a8d8073675a4d4034271a0d0100000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3bfbfb4aa94887b6e61657986939facb9c2b5a99c8f827669626262626262626262626262626262626262626262626262626262626263707c8996a3afbcc3b6a99c908376695d5043362a1d10030000000007101920272b2e2f302f2f2e2e2d2d2c28232b2b2a2a2a2a292929292928282828282827272727272727272727272727272727272727272727272727272727282828292929292a2a2b23282c2d2e2e2f2f30302d2c28231d150c03000000000b1824313e4b5764717e8a97a4b1bdc1b4a89b8e81756d7a879090909090908f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f909090909091919191908376696f7c8895a2afbbc6bcafa396897c706356493d3023160a00000000000002080d1113141c1b1b1b1a1a1a19191818181818171717171717171716161616161616161616161616161616161616161616161616161616161616161616161617171717181818181819191919191a1a1a1a1b1b1b1b1b1c171614100b0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090e1114141918161413110d08070705010000000000000000000000000000000000000000000000000000030b121821272c2f30322d2c3540495158606267636159524c433b332b221a12090100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f838180807f80818282796d6053473a2d2026323f4c5965727f8281807f7e7e7f8081817b6e61554843474c5254565d616467656c6d6e6f706f6e6d6667625f58514b433931281d1207000000000000000000000008111b242d31394045474645403b3936302d2a26201d1913100b06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926323f4c5965727f8c98a5b2bfc3b6a99c908281818181818181818181818181818186929facb9c5c2b5a89b8f82818181818181818181818181818181828f9ca9b5c2c0b3a79a8d8074675a4d4134271a0e0100000000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5b2bfbbafa295887c6f626c79869aa4afbbc2b5a99c8f82766f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f707d8996a3afbcc3b6a99d9083766a5d5043372a1d10040000000000070e151b1f2222232222212121201f1c171e1e1e1d1d1d1d1c1c1c1c1c1c1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1c1c1c1d1d1d1e181c1f20212122232323201f1c18120b0300000000000a1724313d4a5764707d8a97a3b0bdc1b4a89b8e81756d7982838383838383838382828282828282828282828282828282828282828282828282828282828283838383838484848484858175686f7c8895a2afbbc8bcafa296897c6f6356493c302316090000000000050c13191d2021292828272727262625252525242424242424242423232323232323232323232323232323232323232323232323232323232323232323232323232324242424242525252526262626262727272728282828282423201c16100800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080d0c0907070501000000000000000000000000000000000000000000000000000000000000000000070c161c20222326201f2e3740464e54555a57554f45413a312921191008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f8e8d8c8c8d8e8f887b6e6155483b2e222a3743505d6a76838e8d8d8c8b8b8c8d8e897c6f6256494e54565e6165686d717376797a7b7c7d7c7b7977746f6a605d554b43392f24180d02000000000000000000000009121b1f282f35393a3a38342e2d2a25211e1a14110d08030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c99a5b2b8b8b8ab9f94908e8e8e8e8e8e8e8e8e8e8e8e8e8e8e9299a3aebac7c3b6aa9e938f8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8f949fabb9bbbfb4a79a8e8174675b4e4134281b0e0100000000000000000000000000000000000000000000000c1926323f4c5965727f8c98a5b2bfbcb0a396897d70636d798693a0b6c0c3b6a99d90837c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7f8b98a5b1bec3b6aa9d9083776a5d5044372a1d1104000000000000040a0f1315161616151514141312100c0611111010101010100f0f0f0f0f0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0f0f0f10101011070c1013131415151617171313100c07000000000000000a1724313d4a5764707d8a97a3b0bdc1b4a89b8e8175676d7677777676767676767676767676767676767676767676767676767676767676767676767676767676767677777777787878756f626f7c8895a2afbbc8bcafa296897c6f6356493c3023160900000000050e171e252a2d2e36353534343333333232313131313131313130303030303030302f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f2f3030303031313131313232323233333333333434343434353535302f2c28211a1108000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b1014161719141c252e343c4347494d4a48443e352f281f180f0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020f1c2935424f5c6875828f9b9a99999a9a93877a6d6054473a2d212a3643505d697683909a99999898999995887b6f62554e586062686e72767a7e8083858788898988878684807c756d675d554b4035291f1409000000000000000000000000090d161d24292c2d2d2c2823201e1914120e09040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2633404d596673808c99a6acababababa69f9c9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9fa3abb4bfcbc6bbb0a69e9b9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9c9fa6abacaeb5ada79b8e8174685b4e4135281b0e0200000000000000000000000000000000000000000000000c1925323f4c5865727f8b98a5b2bebdb1a4978a7e71646d7a8693a0adb9bfb7ab9f95908888888888888888888888888888888888888888888888888888888888888888888b919ba7b7b8b8b7aa9d9084776a5d5144372a1e1104000000000000000003060809090908080707070603000004040404030303030302020202020101010101010101010101010101010101010101010101010101010101010102020203030303040000040607070809090a0a0706040000000000000000000a1724313d4a5764707d8a97a3b0bdc1b4a89b8e81756860696a6a6a6a696969696969696969696969696969696969696969696969696969696969696969696969696a6a6a6a6b6b6b6b6865626f7c8895a2afbbc8bcafa296897c6f6356493c30231609000000020c1720293036393a424241414140403f3f3f3e3e3e3e3e3e3d3d3d3d3d3d3d3d3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3d3d3d3d3e3e3e3e3e3f3f3f3f4040404040414141414142423d3c38332c231a1005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000407090a0c07131c222b32373b3c403d3c383329241e160d060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020f1c2835424f5b6875828e9ba7a6a5a6a49a867a6d6053473a2d20293643505c6976838f9ca6a5a5a5a5a195887b6e625554606a6f757a7f83868a8d8f9298959596959a93918d8781796d675d51453b30251a0e02000000000000000000000000040c12181d2020201f1c1814110e08050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d1a2733404d5a6673808d99a39f9f9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9fa4abb5c0ccc9beb2a9a19e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9f9fa3a0a1a19b8e8175685b4e4235281b0f0200000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1bebeb2a5988b7f72656e7a8794a1adadb4aeaca79f9d959595959595959595959595959595959595959595959595959595959595959595989ba3abababababaa9d9184776a5e5144372b1e11040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0bdc1b4a89b8e8175686767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676f7c8895a2afbbc8bcafa396897c706356493d3023160a00000008131e29323a4146474f4e4e4e4d4d4d4c4c4b4b4b4b4b4a4a4a4a4a4a4a4a4949494949494949494949494949494949494949494949494949494949494949494949494a4a4a4a4b4b4b4b4b4c4c4c4c4c4d4d4d4d4e4e4e4e4e4f4a48443e352c21160b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a101920272b2e2f34302f2c282119130c04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400020f1b2835424e5b6875818e9ba8b3b2ac9f9386796c605346392d202936424f5c6975828f9ca8b2b1b1aea194887b6e615556626f7c82868c9092999a9c9fa2aaa2a3aca49f9e9a938e83796d60574d42362a1e12050000000000000000000000000001070d1013141313100c07050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d939992929291919191919191919191919191919191919191919399a4afbbc7c6b9ada19791919191919191919191919191919191919192929299939495958e8275685b4f4235281c0f0200000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1bebfb2a6998c7f73666e7b8895a1a1a0a0a39f9fa19e9d9d9d9d9d9d9d9d9d9d9ea1a9a2a2a2a2a2a2aaa29f9d9d9d9d9d9d9d9d9d9d9d9e9e9e9e9e9e9e9f9f9e9184776b5e5144382b1e11050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0bdc1b4a89b8e817574747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747c8895a2afbbc8bdb0a3968a7d7063574a3d3024170a0000010d1925303a444c52545c5b5b5a5a5a595958585858575757575757575756565656565656565656565656565656565656565656565656565656565656565656565656565657575757575858585859595959595a5a5a5a5b5b5b5b5b57554f473e33281c100400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070e151b1f2222272423201c160d08010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105090b0b110c0b0e1b2834414e5b6774818e9aa7b4b8ac9f928579655b5044372b1f2935424f5c6875828f9ba8b5bebaaea194877b6e61545d6a77838f92999c9fa3aba1a2a4aaacb1b6afacaca49f958e8174695e52463a2d201407000000000000000000000000000000010406070706040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c1926333f4c5966727f868686868585858584848484848484848484848484848484848487939facb9c6c4b8ab9e918484848484848484848484848484848585858585868687878888898276695c4f4336291c100200000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1bdc0b3a79a8d8074676f7c8995949494939892929792919191919191919191919197a1adafafafafaea298929191919191919191919191919191919191919293999185786b5e5245382b1f12050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1bdbdb7aa9e9184818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818181818f9ba8b5c0c1bdb0a3978a7d7064574a3d3124170a000005111d2a36414c565e61696868676766666665656464646464646464636363636363636362626262626262626262626262626262626262626262626262626262626263636363646464646465656565666666666667676767676868686361594f44382c2014070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f1315161a171614100b0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c111517181e1818151b2734414e5a6774818d9aa7b4b8ab9e9285786b5f493f33271b2835424f5b6875828e9ba8b5c1baada094877a6d61545c6976828f9c9c999796959495979da0a7b1bbb9b6afa79f93877b6e6154483b2e2115080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080e111825313e4a57636d727a7a79797878787878787878787878787878787878787878787885929fabb8c5bcafa295897c7878787878787878787878787878787878787879797a7a7b7c7d7b6e6155483b2e2215120e09030000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0bdc1b4a79b8e8174686f7c88888887878686868792858484848484848484848485919eabb8bbbbb8ac9f92868484848484848484848484848484848485858586878783776a5e5144372b1e11040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b0b0b0b0aca096918d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8f939eaab3b4b5b6b0a4978a7d7164574a3e3124170b00000713202d3946525e686d7575747474737372727271717171717170707070707070706f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f70707070717171717172727272737373737374747474747575706b6155483c2f23160900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030608090d0a09070400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000911171d2124252b2524221d2734404d5a6773808d9aa6b3b8ab9e9185786b5e52452d22172835424e5b6875818e9ba8b4c1baada093877a6d60545a6673808d918f8c8b898887888a9095a0a7b1bcc0bbafa49a8c7f7265594c3f3226190c000000000000000000000000000000000404030202010100000305060503000000000000000000000000000000000000000000000000000000000000000000000000000000000504020101000000000003050605030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030608090d0c0b0a0a09090a0b0c0d080705020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d14191e20212e3a46515b63676d6d6c666c6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6c7885929fabb8c5bcafa295897c6f6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6c666d6d6e6e6f706e695f53463a2d22211e1a140e0600000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdc1b4a89b8e8175686c787c7b7b7b7a7a79778390847b7777777777777777777e8b98a4b1bec2b5a89b8f82777777777980827e7a77777777787878787878797a7a796d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4a3a3a3a3a3a8a09e9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9b9ea5a5a6a7a8a9aaa4978b7e7164584b3e3125180b00000714212e3a4754616d7a828181818080807f7f7e7e7e7e7e7d7d7d7d7d7d7d7d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d7d7d7d7e7e7e7e7e7f7f7f7f7f808080808181818181817d7063574a3d3024170a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a121b22292d30323732312e292733404d5a6673808d99a6b3b7aa9e9184776b5e5144382b1e2835414e5b6874818e9ba7b4c1b9ada093867a6d605355626e7b868582807e7d7b7b7c7e839095a0acb8c4c0b6ac9b8e8174685b4e4135281b0e020000000000000000000000030608091110100f0f0e0e060b0f1213120f0b060000000000000000000000000000000000000000000000000000000000000000000105090b0c12110f0e0d0d0d0d060b0f1213120f0b0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040a0f1315161a181817161616171718191514120e09030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e171f252a2d2e33353f4951555d6060605b5f5f5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5f6c7885929fabb8c5bcafa295897c6f625e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5f5f5c606061626263615f574d4236332e2d2b261f180f06000000000000000000000000000000000000000a1724303d4a5763707d8a96a3b0bdc1b5a89b8e827568666c6f6f6e6e6d6d717d8a9591847b6f6b6a6a6a6a6a717e8b98a4b1bec2b5a89b8f8275656e7a838d8f8b85807b76706c656b6b6b656c6d6e6d675d5145382c1f1306000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b97979797969696969696969695959595969fa3aaa9a19e979595959595959595959fa2aaa7a7a7a7a7a7a39b9895959595959da0a8a7a7a8a09e98959595969696979797989898999a9b9c9d9e988b7e7165584b3e3225180b00000814212e3b4754616e7a878e8e8d8d8d8c8c8b8b8b8b8a8a8a8a8a8a8a8a8989898989898989898989898989898989898989898989898989898989898989898989898989898a8a8a8a8a8b8b8b8b8c8c8c8c8c8d8d8d8d8e8e8e8e8c7f7265594c3f3226190c0000000000000000000003080c0e0e0f0f0e0e0e0d0d0c0c0c0b0b0b0b0b0b0b0a0a0a0a0a0a0a0a090909090909090909090909090909090909090909090909090a0a0a0a0a0b0b0b0b0c0c0c0c0c0d0d0d0d0e0e0e0e0e0f0f0f0d0c0a0702000000000000000000000000000000000000020507080706040000000000000000000000000000000000000000000000020507080e0a060503000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141c242d34393d3e443f3d3a342d33404c5966737f8c99a6b2b7aa9d9084776a5d5144372a1e2834414e5b6774818e9aa7b4c1b9aca09386796d6053535f696e7978757371706f6e6f717883909daab7c3c2b5a99c8f8276695c4f4336291c1003000000000000000000040a0f1315161d1d1c1c1b1b1b1b171b1f201f1b17110a02000000000000000000000000000000000000000000000000000000000000060c121518181f1d1c1b1a1a1a1a1a171b1f201f1b17110a0200000000000000000000000000000006040100000000000000000000000000000000000000000000000000070e151b1f2222262524242323232324252621211e1a140d05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020d1720293036393b3f3f3f3f434b51535353504a5252525151515151515151515151515151525f6c7885929fabb8c5bcafa295897c6f62565151515151515151515151525252524a5153545455555655534d453f3f3f3b3a37312a21180e030000000000000000000000000000000000000a1723303d4a5663707d8996a3b0bcc2b5a89b8f8275685b6062626161616c7883909d9691857d736d67615a65717e8b98a4b1bec2b5a89b8f82756c788390959c97928d88837d78706c63615b606061605d554b4035291d1004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1926323f4c5965727f8a8a8a8a8a8a8a89898989898989898888899298a3a197918b8888888888888888889298a2aeb4b4b4b4a79b918b88888888889196a0a9aca096918b8888888989898a8a8a8b8b8c8c8d8e8f9192938c7f7265594c3f3226190c00000714202d3946525e687885919b9a9a9999999898979797979797979796969696969696969595959595959595959595959595959595959595959595959595959595959696969697979797979898989899999999999a9a9a9a9a9b96897d706356493d3023160a000000000000000001090f14181a1b1c1b1b1b1a1a1a191918181818181818171717171717171616161616161616161616161616161616161616161616161616161617171717171818181819191919191a1a1a1a1a1b1b1b1b1c1c1a1916130d0700000000000000000000000000000003090e1214151313100c070000000000000000000000000000000000000003090e1214151b1713120f0b0600000000000000000000000000000000000000000000000000000000000000000000000306070707050100000000000000000000000000000000000000040d1c262e363f45494b514b4a463f37333f4c5966727f8c99a5b2b6a99d9083766a5d5043372a1d2734414e5a6774818d9aa7b4c0bbaea39986796c60534d575f676d676966646362616266717e8b98a4b1bec3b6a99d9083766a5d5043372a1d10040000000000000000070e151b1f21222a2a29292828282822272b2d2b27221b140b0c030000000000000000000000000000000000000000000000000000000911181d2224252b2a2927272726272722272b2d2b27221b140b02000000000000000000000307090a12100e0a070704010000000000000000000000000000000000000007101920272b2e2f33323130302f2f303132332e2d2a251f170f05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008141f29323b4146474c4c4c4b4b4b4a4a494949484848484848474747474747474646464646525f6c7885929fabb8c5bcafa295897c6f62564946464646464747474748484848494949494a4a4a4a4b4b4b4b4c4c4c4c4846423c332a1f1409000000000000000000000000000000000000091623303c4956636f7c8996a2afbcc2b5a89c8f8275695c535555555e69717e8b95a0a09791868079716c6165717e8b98a4b1bec2b5a89b8f82756573808b9299a29f9a94908a837d77706b6360595453514b43392f24180f06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a7d7d7d7d7d7d7d7d7d7c7c7c7c7c7c7c7c7d86929f9e91857e7c7b7b7b7b7b7b7b7c85929fabb8c0beb2a5988b7f7b7b7b7b7c849197a1aa9e91847f7c7c7c7c7c7d7d7d7e7e7e7f80818283848586877e7164574b3e3124180b000005111e2a36414c566a7783909da7a7a6a6a5a5a5a4a4a4a4a4a4a3a3a3a3a3a3a3a3a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a3a3a3a3a4a4a4a4a4a5a5a5a5a6a6a6a6a6a7a7a7a7a194877a6e6154473b2e21140800000000000000030b131a20242728292828272727262625252525252524242424242424232323232323232323232323232323232323232323232323232323232323232424242424252525252526262626272727272728282828292625231e19120a01000000000000000000000000050d141a1e2121201f1c18120c0700000000000000000000000000000000060e141a1e21222824201f1b17110b0600000000000000000000000000000000000000000000000000000000000000060c1012131413110d080200000000000000000000000000000000010c161f2e3840485056585e5856514940383f4c5965727f8c98a5b2b6a99c908376695d5043362a1d2734414d5a6774808d9aa7b3c0b9ac9f928679655b50444d555d605d55595856555454626f7c8995a2afbcc3b6a99c908376695d5043362a1d10030000000000000007101820262b2e2f37373635353434352d33373937332d261d1e150c020000000000000000000000000000000000000000000000000009121b23292e31323837353434333333342d33373937332d261d140a0000000000000000040b101316161f1d1a171413110d080603000000000000000000000000000000040e19222b32373b3c403f3e3d3d3c3c3d3e3f403b3a36312921170d03000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1925303b444d52545959585858575757565655555555555554545454545453535353535353535f6c7885929fabb8c5bcafa295897c6f625653535353535353545454545555555556565656575757575858585859595955534d453c31261a0e0200000000000000000000000000000000000916232f3c4956626f7c8995a2afbcc2b6a99c8f8376695c5048505a616e7b85929fa7a9a199928c847e766e69717e8b98a4b1bec2b5a89b8f8275686d737e879298a2a69f9c95908a837d77706b615e5650454039312a21180e030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3946525e686d70717170707070707070706f6f6f6f6f75828f98a3a1979187807b756f6f6f6f6f7885929fabb8c5bdb0a3978a7d706f6f6f6f7b859198a3a096918b837e79727070707171717272737475767778797a716c6155493d3024170a00000613202c3945525d687884919e9f9e9d9d9c9c9b9b9b9b9a9a9a9a9a9a999999999999999898989898989898989c9ea6b0afafafafafaea49c9998989898989898989999999a9a9a9a9b9b9b9b9c9c9c9c9d9d9e9e9fa3aaa1a195887b6e6255483b2f221508000000000000010b151d252b3034353535353434333333323232323131313131313130303030303030303030303030303030303030303030303030303030303030303030303131313132323232323333333334343434343535353533322f2a241c130a0000000000000000000000080f171f252a2d2e2d2c28231d18120b0300000000000000000000000000060f181f262b2d2e34312d2b27221b17110a02000000000000000000000000000000000000000000000000000000030a11171c1f2021201d19130c0400000000000000000000000000000007121d2831404a525a62656a65625b524a403f4b5865727e8b98a5b1b6a99c8f8376695c504336291d2734404d5a6773808d9aa6b3c0b8ac9f9285796c5f493f434b5153514b4d4b4a484855616e7b8894a1aebbc2b6a99c8f8376695c504336291d1003000000000000040e18222a32373b3c4443434242414142423f4446443f382f30271e140900000000000000000000000000000000000000000000000006111b252d343a3d3f454442414040404040413f4446443f382f261b1106000000000000070f161b2022232c2a272421201d191312100c06040000000000000000000000000a15202b343c4347494d4b4b4a4949494a4a4b4c4846423b33291f140900000000000000000000000000000000000000000000000000000000000000000000000000000000000005111e2a36414d565e61666665656464646363636262626261616161616161606060606060606060606c7885929fabb8c5bcafa295897c6f6260606060606060606061616161626262626363636364646464656565656666615f574d42372b1e120500000000000000000000000000000000000916222f3c4955626f7c8895a2afbbc3b6a99c908376695d504f59626c75828f97a2adb3aba39f96918a827b6e717e8b98a4b1bec2b5a89b8f827568636c717d869299a3aca7a09d95908a837d746d68615a514b433c332a20150900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111d2a36414c565e6164646464646363636363636363626b727f8b939eaaa9a199928d86817c6f6a626c7885929fabb8c5bdb0a3978a7d70646262696f7c86929fa6a09e95908b857f79726d6764656565666768696a666c6d67615a5045392d21150800000714212d3a4754606d7a869397929190908f8f8f8e8e8e8e8d8d8d8d8d8d8d8c8c8c8c8c8c8c8c8c8c8c8c8c8c8f949eaab7bcbcbcb4a89c928d8c8c8c8c8c8c8c8c8c8c8c8d8d8d8e8e8e8e8f8f8f8f90909091929298939495958a7e7164574b3e3124180b00000000000009131d272f373c4041424241414140403f3f3f3e3e3e3e3e3e3e3d3d3d3d3d3d3d3d3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3c3d3d3d3d3d3e3e3e3e3f3f3f3f3f404040404141414141424242403f3b352e251c120700000000000000000008111a212931363a3b3a38342e28231c150c080200000000000000000000060f18212a31373a3b413d3937332d27221b140b0802000000000000000000000000000000000000000000000000060c151c23282c2d2e2d29251e160e0700000000000000000000000000010d18242f3943525c646c7177726d645c52493f4b5865717e8b98a4b1b6a99c8f8376695c504336291d2733404d5a6673808d99a6b3c0b8ab9f9285786c5f524d4d4d4d4d4d4d4d4d4d4d4d54616e7a8794a1adbac2b5a99c8f8276695c4f4336291c10030000000000000a15202a343c43474950504f4f4e4e4e4e4f495053504941423930261b100400000000000000000000000000000000000000000000010c18232d373f454a4b52504f4e4d4d4d4d4d4e495053504941382d22170b000000000007111921272c2f30393734312d2c2924201f1c1713100c07040000000000000000030f1b27323c464e5455595857575656565657585954534d453b31251a0e0200000000010304050506050404020000000000000000000000000000000000000000000000000000000714202d3946525e686e7272727271717070706f6f6f6f6e6e6e6e6e6e6d6d6d6d6d6d6d6d6d6d6d6d6d7885929fabb8c5bcafa295897c6f6d6d6d6d6d6d6d6d6d6d6d6e6e6e6e6f6f6f6f707070707171717172727272726e695f53463a2d21140700000000000000000000000000000000000915222f3c4855626f7b8895a2aebbc3b6a99d9083766a5d4d57606b717e8b949ea9b3bdb4aea8a19e948e8275717e8b98a4b1bec2b5a89b8f8275685a626b707d87929aa4afaca7a09d959089817a716c605d554e463c31261a0f020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d1925303a444c525457575757575757565656565a616b707d87939fa6b0b3aba39f99928e877c6f626c7985929facb8c5bdb0a4978a7d71645757606a727f8b949eaaa7a09d97928c857f79706b615e56595a5b5c545b60605d5550483e34281d11050000091623303c4956636f7d89878685848483838282818181818181808080808080807f7f7f7f7f7f7f7f7f7f7f7f828f9ca9b5c2c8c0b3a6998d807f7f7f7f7f7f7f7f7f7f8080808181818182828282838383848485858687878888898174675a4e4134271b0e0000000000030f1a252f3941484d4e4f4e4e4e4d4d4d4c4c4b4b4b4b4b4b4b4a4a4a4a4a4a4a494949494949494949494949494949494949494949494949494949494a4a4a4a4a4b4b4b4b4c4c4c4c4c4d4d4d4d4d4e4e4e4e4f4f4d4b4740372e24190d0200000000000000040d1a232c333b42464846454039342e271e19130b060000000000000000020b18212a333c4246484e4a46443f38332d261d19130b0600000000000000000000000000000000000000000000060f181e262e34383a3a393530282019100700000000000000000000000004101d2935404b55646e737e847f736e645b51474b5764717e8a97a4b1b5a99c8f8276695c4f4336291c2633404d596673808c99a6b3bfb8ab9f9285786c5f5a5a5a5a5a5a5a5a5a5a5a5a5a5a616e7a8794a1adbac2b5a89c8f8275695c4f4236291c0f030000000000030f1b26323c464e53555d5d5c5c5b5b5b5b5b535b605b53544b42372c2115090000000000000000000000000000000000000000000005121d29343f495156585e5d5c5a5a5a595a5a5b535b605b53493f33271b0f03000000040f19232b32383b3d4543413d3a3935302d2c28231f1c1813100c0701000000000006131f2b37434e5860626665646363626263646566615e574d42362a1e12050607090c0e10111112131211100e0b08070502000000000000000000000000000000000000000000000814212e3b4754616e7a7f7f7f7e7e7e7d7d7c7c7c7b7b7b7b7b7b7a7a7a7a7a7a7a79797979797979797985929fabb8c5bcafa296897d7979797979797979797a7a7a7a7b7b7b7b7c7c7c7c7d7d7d7d7e7e7e7e7f7f7f7f7b6e6155483b2e22150800000000000000000000000000000000000815222f3b4855626e7b8895a1aebbc3b6aa9d9083776a5d565e696f7d87929fa6b0b8b1aba69e9a938e847b6e717e8b98a4b1bec2b5a89c8f8275695c59606b717e88939fa5afb1aca79f9d938e857e746d675f584e43372b1f120600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e28323a4146474a4a4a4a4a4a4a4a4a515a616c707d869299a4afb1aba9a19e99928d847a6d61667986929facb9c5bdb1a4978a7e7164574e58606c77828f98a2aeaca9a19e97928c847d756e685e564c4f504a505353514b433e362c22170c0000000713202d3a4653606d787c7b7978777776767675757474747474747473737373737373727272727272727272737f8c99a6b2bfc7baaea194877b72727272727272727273737374747474757575757676767677787879797a7a7b7c7c7b6e6154483b2e21150800000000000814202b37414b53595b5c5b5b5a5a5a5959585858585858575757575757575656565656565656565656565656565656565656565656565656565656565657575757575858585858595959595a5a5a5a5a5b5b5b5b5c5957524940352a1e1307000000000000010c161f2c353d454d535453514b4440393029251e17110a020000000000000a141d2a333c454d53555b57535049443f382f2a251e17110a0200000000000000000000000000000000000000060f18212a30383f44464746413a322a22190d0500000000000000000000000613202c3945515d6773808b918b80736d62594f4a5764717d8a97a4b0b5a99c8f8276695c4f4336291c2633404d596673808c99a6b3bfb8ab9f9285786c676767676767676767676767676767676e7a8794a1adbac2b5a89b8f8275685c4f4235291c0f02000000000006131f2b37434e585f626a6a6968686767686869656c65655d54493d3125190c010101010101010101010101010101010101010101010915222e3a45515b62656b6a686767666666676769656c655b5044372b1f12050000000b16212b353d44484952504d4a4745413d3a38342e2c28231f1c18120e09030000000815222e3b4754606a6f73727170706f6f707172736e695e53463a2d211410131416181b1c1d1e1f201f1e1d1b181514120e090200000000000000000000000000000000000000000b1724313e4a5764717d8a8c8b8b8b8a8a8a898988888888888887878787878786868686868686868686869297a2adbac0c0b1a5998f89868686868686868686868787878788888888898989898a8a8a8a8b8b8b8b8c8c8b7e7265584b3f3225180c00000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc4b7aa9d9184776a565e686e7b859299a3aeb1aba79f9d948f87817a6e69727e8b98a5b1bec2b6a99c8f8376695c4f59616c727f8c939ea9b3b8b1aba59e97928a81796e6a5f53473a2e211408000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c1620283036393a3d3e3e3d3d3d3d43515b626c717e869298a2ababa79f9d97928c86807a6d68606c798699a3afbbc7beb1a4978b7e7164584b505b656e7b86929fa9b2b3ada9a19e96918a827a6e685e5246433f444647454039312c241b100600000006121f2c3844505c666d6f6e6d676b6a6a696968686868676767676767666666666666666565656565656566737f8c99a6b2bfc7baaea194877b6e656565656565656666666767676768686868696969696a6a6b6b666d6d6e6e6f706e695e52463a2d20140700000000000c1824303c48535d64686868686767666666656565656464646464646463636363636363636363636363636363636363636363636363636363636363636363636464646465656565656666666667676767676868686866635b52473b2f23160a00000000000007131d28313d474f575e61605c55514a423d353027221b140b050000000006111b262f3b454d575f616764605b535049413d363027221b140b050000000000000000000000000000000000040e18212a333c424a505354524c443c342a20170e06000000000000000000000714202d3a4753606d7a86929d928b7f726b60574d5764707d8a97a3b0b5a89c8f8275695c4f4236291c2633404d596673808c99a6b3bfb8ab9f9285787373737373737373737373737373737373737a8794a1adbac1b5a89b8e8275685b4f4235281c0f0200000000000815212e3b47535f6a6f777676757574747575767779756f655a4d4134281b0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e1824313d4a56626d72787775747373737373747678786c605346392d201306000003101b27323d474f54565f5d5a5754524c4a46443f3a38342e2c29231d1a140f0b06000916222f3c4955626f7c807e7e7d7c7c7c7d7d7e7f7b6e6154483b2e21181c1f20232528292a2b2c2c2c2b2a282521201e1a140e09030000000000000000000000000000000000000815212e3b4854616e7b879a989897979796969695959595949494949494949393939393939393939393939fa2a9b3b3b3b3b3aba199969393939393939393939393949494949595959596969696979797979898989895897c6f6256493c2f23160900000000000000000000000000000000000815212e3b4854616e7b8794a1aebac4b7aa9d9184776a5e686e7a839097a1abaca79f9d959089827c746d6765727f8b98a5b2bec3b6aa9d9083776a5d50505a626d75818f97a1adb9bcb8afa9a29e938e847c6e6255483b2f22150800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e161e252a2d2e313131313135414c56626d727e879298a2a9a19e9a95908b85807b746d675d606d7a8693a0b5c0c0beb1a4988b7e7165584b49535e69737f8c96a1adaba9aaa29f9c9a938f847a6d6154473a3338393a39352f281f1b12090000000003101c28343f4a545c606261605c555d5d5c5c5c5b5b5b5b5a5a5a5a5a5a5a59595959595959595959595966737f8c99a6b2bfc7baaea194877b6e615959595959595959595a5a5a5b5b5b5b5c5c5c5c5d5d5d5e5f5c606061626263615e574d42362a1e120500000000010e1a2734404d59646f74757574747473737272727171717171717170707070707070706f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f7070707070717171717272727272737373737474747474757575736d63574b3f3225190c0000000000010d18242f3a434f5960696e6d67605c544f46413a332d261d170e060000000b17222d38414d575f696e74706c65605b534f46413a332d261d170e06000000000000000000000000000000020b16202a333c454d545c60615e564e463c322920180f080200000000000000000613202c3945515d6774818d989f92877d70695e545663707d8996a3b0b5a89c8f8275695c4f4236291c2633404d596673808c99a6b3bfb9ac9f928680808080808080808080808080808080808080808d9aa7b4c0c1b4a89b8e8175685b4e4235281b0f0200000000000916222f3c4955626f7c8383828281818181828284858175685c4f4235291c1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a25323f4b5865727f8583828180808080808183858276695c504336291d1000000713202c38444f5960636c6a6764605d565653504a4645403a38342f2a261f1b17110d081a2733404d5a6673808c8b8a8a898989898a8b8c807366594d40332623292c2d2f3234363738383938373735312e2d2a251f1a140d0600000000000000000000000000000000000713202d3a4653606d7986939fa5a4a4a3a3a3a2a2a2a2a1a1a1a1a1a1a0a0a0a0a0a0a0a0a0a0a0a0a0a0a6a6a6a6a6a6a6a6a6a6a6a2a0a0a0a0a0a0a0a0a0a0a0a0a1a1a1a1a2a2a2a2a3a3a3a3a4a4a4a4a5a5a194877a6e6154473b2e21140800000000000000000000000000000000000815212e3b4854616e7b8794a1aebac4b7aa9d9184776a686e7a839095a0a9a39f9b95908a837d766f6a605d65727f8c98a5b2bfc4b7aa9d9184776a5e5148515b616d7a85919ea6b0b5aeaca8a19e9a969083766a5d5043372a1d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050c13191d2021242424242c3945525d68727f889299a29e9a97918d89837e79736e69605d55606d7a8793a0adb2b3b4b2a5988b7f7265584c414d56606d7984919ea79f9d999892908d8a88837b6e6154483b2e2b2d2d2c29241d160d090000000000000c17232e38424a5053565453514b5150504f4f4e4e4e4e4e4e4d4d4d4d4d4d4d4c4c4c4c4c4c4c4c4c5966737f8c99a6b2bfc7baaea194877b6e61544c4c4c4c4c4c4c4d4d4d4e4e4e4e4f4f4f4f50505051514a5053545455555654524d453b30251a0e0200000000020e1b2835414e5b687481828181818080807f7f7e7e7e7e7e7e7e7d7d7d7d7d7d7d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d7d7d7d7d7e7e7e7e7f7f7f7f7f8080808080818181818282807366594d4033261a0d000000000004111d2935404b55606b707b79726d666059524c443f382f292017110a02030f1b27333f49535f696e7b817d78706c656059524c443f382f292017110a02000000000000000000000000000a141d28323c454e575f666d6d685f584e443a322a2119130c040000000000000004101d2935404b55616e7a86929f9992857b6e665c5663707c8996a3afb5a89b8f8275685c4f4235291f2633404d596673808c99a6b3bfbaaea398928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d929da9b5c2c1b4a79b8e8174685b4e4135281b0e0200000000000a1724313d4a5764707d8a908f8f8e8e8e8e8e8f919184776a5e5144372b27272727272727272727272727272727272727272727272727272835424e5b6875818e908f8d8d8d8c8d8d8e8f908376695d5043362a1d1000000916222f3b4854606b70787674706d686763605c5453514b4745403936312b27221b19131926333f4c5966727f8c9897969695959697988c7f7266594c3f332d2f34383a3c3f414344444546454443413e3b3a36302a261f170f09000000000000000000000000000000000714212d3a4754606d7a879aa4a0a49f9f9e9e9d9d9c9c9c9c9b9b9b9b9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9b9b9c9c9c9d9d9e9e9e9f9fa3a0a0a1a1a1a194877b6e6154483b2e21150800000000000000000000000000000000000815222e3b4855616e7b8894a1aebbc4b7aa9d9184776a6e7a839095a0a29f99928e89837d76706b625f585966737f8c99a6b2bfc2b8ab9e9185786b5e4a3f46525e68707d8a939eaaaba39f9b96918d88847e7064574a3d3124170a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d111314171717212d3a4754606d7a86929a9b97928e8985807c77716d67615e575154616d7a8794a0a5a5a6a7a8a6998c807366594d4045515d67737f8c999b95908c888583807e7b776e695e53463a2d212020201d18120c040000000000000006111c2630383f44464b51535855534d45434242494d4f52515150504f4f4e4e4e4e4d4d4d4d4d4d4c5966737f8c99a6b2bfc7baaea194877b6e61544c4c4c4c4d4d4d4d4d4e4e4e4e4e4f4f50505151524d4c47444647474849494846423b33291f1409000000000004111e2b3744515e6a77848f8e8e8d8d8d8c8c8b8b8b8b8b8b8a8a8a8a8a8a8a898989898989898989898989898989898989898989898989898989898989898a8a8a8a8a8b8b8b8b8b8c8c8c8c8d8d8d8d8d8e8e8e8e8f8376695c504336291d1003000000000613202c3945515d67707d86847f786f6b615e565049413b3228231c140c05121f2b3744505b656e7b858e8a837d786f6b615e565049413a3227221b140b04000000000000000000000006111c262f3a444e575f696e797a6f6a5f564c443c3329251e160e07000000000000010d18242f3946525e68737f8c96a1979083796d6058626f7c8995a2afb5a89b8e8275685b4f42352d2c2833404d596673808c99a6b3bfbfb4aaa39f9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9da4aebac5c1b4a79b8e8174685b4e4135281b0e0200000000000a1723303d4a5663707d89969c9b9b9a9a9b9b9c9d9083776a5d5044373434343434343434343434343434343434343434343434343434343435414e5b6874818e9b9b9a9a9999999a9a9c8f8275695c4f4236291c0f0005111d2a36414c5663707d8583807d7a7773706d6663605c5453514b46423b37332d29241e1925323f4b5865727e8b98a4a3a3a2a2a3a4988b7e7265584b3f363a3b404547494b4e4f505152535251504e4b4846423b363129211b1209000000000000000000000000000000091623303c4956636f7c89959494999392919190908f8f8f8f8f8e8e8e8e8e8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8e8e8e8f8f90909091919292929993939494959595897c706356493d3023160a00000000000000000000000000000000000815222f3b4855626e7b8895a1aebbc4b7aa9d9184776a717e8b939f9b98928d87827c77706c636059534e596673808c99a6b3b4b5b6ac9f928579665b5044414c56616b75828f9ba59d99928e8984807c77706c6155493c3023160a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010507070a0b13202c3945525d68727f8b918e8a85817d79746f6a64605c55524d4854616e7b8794999899999a9c9e9a8d8174675a4e41404b55616e7a86928e88837f7c797673716e69615e574d42362a1e131413100d07010000000000000000000a151e28313b444c555c6065615f575145404b545a5c5e5e5d5d5c5c5b5b5b5a5a5a5a5a5a5a59595966737f8c99a6b2bfc7baaea194877b6e615959595959595a5a5a5a5a5a5b5b5b5b5c5c5d5d5e5e5a58524a403a3b3b3c3d3b3a36302921170d030000000000020f1c2835424f5b6875828e9b9b9a9a99999998989898979797979797979696969696969696969696969696969696969696969696969696969696969696969696979797979898989898999999999a9a9a9a9a9b9b9a8d8074675a4d4134271a0e01000000000714202d3a4753606d798592918b837d746d68605b534d443d342e261e160d13202d394653606c7883909795908a837d746d68605b534c443d332d261d160e05000000000000000000000b17222d38424c565f6a6e7b84857c6f685e564e453f3530282019110a01000000000007121d2a36414c56606d7984919ea0958c80736a5f626f7c8895a2afb5a89b8e8275685b4f423d3a38342e404d596673808c99a6b3bfbfb4aaa29f97979797979797979797979797979797979797979ba2acb7c3c1b4a79b8e8174685b4e4135281b0e0200000000000a1623303d495663707c8996a3a8a8a7a7a8a8a99c8f8376695c5043414141414141414141414141414141414141414141414141414141414141414d5a6774808d9aa7a7a6a6a6a6a6a79b8e8275685b4f4235281c0f000713202d3946525e68768390908d8a8683807d7974706d6664605c55534d46443f38352f2a2524313e4b5764717e8a97a4b0afafafb0a4978a7e7164574b3e4246484b515356585b5c5d5e5f5f5f5e5d5b5854524d46423b332d241b110800000000000000000000000000000c1926323f4c5965727f898887878686858584848383828282828281818181818080808080808080808080808080808080808080808080808080808080808080808081818282828383848484858586868687878888888989807366594d4033261a0d00000000000000000000000000000000000915222f3c4855626f7b8895a2aebbc4b7aa9e9184776b6c78818d928f8a85807b756f6b64615a544f474d5a6673808d99a6a7a8a8a9aba29886796c6053463a444f59626f7c88949e938e86817c78736f6a64615a5044392d2014080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111d2935414c56636d727f84817d7974706d6662605853514b46424754616d7a878c8c8b8c8d8d8f91968e8275685b4f423946525e68748085817c76726f6d666764615f57534d453b31251a0e0706040100000000000000000000010d18242f3a434c565e676d716e69625b514b545d65686b6b6a6a69696868676767676767666666666666737f8c99a6b2bfc7baaea194877b6e656565656666666666676767676768686869696a6a6b6b67645c52473c2e2f2f302e2d2a251f170f05000000000000010e1a2734414d5a6774808d9aa7a7a7a6a6a5a5a5a4a4a4a4a4a4a4a3a3a3a3a3a3a3a3a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a3a3a3a3a3a4a4a4a4a5a5a5a5a5a6a6a6a6a7a7a7a7a7a5988b7f7265584c3f3225190c00000000000c1925323f4c5865727f8b979e959088817a716c655e564f443f3830281f1716232f3c4956626f7c899299a09d959089817a716c655e564f443f382f2820170f060000000000000000030f1c28333f4a545d686e7c849191847a6d685f575046413a322b231c130a0000000000010d1925303b45515d67717e8b95a09f92867c6f66626e7b8895a1aeb4a89b8e8175685b4e494a46454039404d596673808c99a6b3bfbaaea298928a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8b909ba6b3bfc1b4a79b8e8174685b4e4135281b0e0200000000000916232f3c4956626f7c8995a2afb4b4b4b4b5a89c8f8275695c4f4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d5a6673808d99a6b3b3b3b3b3b3a79b8e8174685b4e4135281b0e000714212e3a4754616d7a86939d9a9993908d8985817d7974706d67615f5753504945413a363029303d4a5763707d8a96a3b0bcbcbcb0a3968a7d7063574a464d5354555c60626567696a6b6b6c6b6a6a6864615e57534d453f362d231a0f05000000000000000000000000000714212d3a4754606d797c7b7b7a7979787877777676767675757575747474747473737373737373737373737373737373737373737373737373737373737373737474747575767676777778787879797a7a7a7b7b7c7c7c7a6d6154473a2e21140700000000000000000000000000000000000916222f3c4955626f7c8895a2afbbc4b7aa9e9184776b666d788085827d79736e6963605955504844434d5a6773808d9a9a9a9b9b9c9fa293877a6d60544743434754606a75828f9189817b746f6c65625f585550483e33281c100400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d19242f3a43515b636d727875706d6663605c54544e464540393946525e68717e807f7f7f8081828487898276695c4f4336414c56646e7479746f6a6662605c545755534d46423b33291f1409000000000000000000000000000004111d2935404b555e686e797e7b726d605c545a656f757877777676757574747474747373737373737372737f8c99a6b2bfc7baaea194877b727272727272737373737374747474747575757676777778746e64584c3f3322222321201e1a140d0500000000000000010e1b2734414e5a6774818d9aa5a4a4a3a3a2a2a2a1a1a1a1a1a1a0a0a0a0a0a09fa39f9f9f9f9f9f9f9fa3abb5afafafafafb6aca49f9f9f9f9f9f9f9fa4a0a0a0a1a1a1a1a2a2a2a2a3a3a3a4a4a5a5a6a7a7a5988b7e7265584b3f3225180c00000000000d192633404c5966737f8b9299a09a938e857e776e686159504a423931292018202d394653606c787f8691959da09d938e857e776d6860595049413a322921181007000000000000030d1a242b3844505b666d7a8491969690837a6e6a625a524c443d352e251c0c03000000000008141e2935404b55606c7883909da3999083786c616e7b8894a1aeb4a89b8e8175685b50555753514b42404d596673808c99a6b3bfb8ac9f92867e7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7e8b97a4b1bec1b4a79b8e8174685b4e4135281b0e0200000000000916222f3c4955626f7c8895a2afbbc1c1c1b4a89b8e8175685b5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a66727f8c99a5b2bfc0bfc0b4a79a8d8174675a4e4134271b0e000a1724313d4a5764707d898e92979c9f9d9a97928e8a85817d79736e6963605b53514c46413a352f3c4956636f7c8996a2afbcc8bcafa296897c6f63565153575e6165676d6f7274767777787978777674716e69615f5750483f352c21170d030000000000000000000000000613202c3945515d676d6f6e6e6d6d676c6b6b6a6a6969696968686868676767676767676767676767676767676767676767676767676767676767676767676767676768686969696a6a6b6b6b6c666c6d6d6e6e6e6f6f706d685d5246392d20130700000000000000000000000000000000000916232f3c4956626f7c8995a2afbcc4b7aa9e9184776b5c666d737975716d67615e57544f4f4f4f4f4f4f5a6773808d8e8e8d8e8f90929894877b6e61544f4f50504e58626f7c87847d746e6963605b53544e49443e362c22170b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e28314049515b62656b6863605c5453504a47433d38342e36414c56626c7173727272737475787a7c7b6e6155483b303b44525c64666c66625f585553504a4a4846423b36312921170d0300000000000000000000000000000613202c3945515d676e7a838b867f746d665e5668758185848483838282818181818080808080807f7f7f7f828f9ca9b5c2ccc0b3a6998d807f7f7f7f7f7f7f80808080808181818181828283838484848074675a4d4134271a161514120e0903000000000000000003101c28343f4a546975828f9a99989797969695959594949494949493939393939399929292929292929299a3afbbbcbcbcbbafa49a939292929292929399939393949494959595959696969697979899999a9a9b9a8d8073675a4d4034271a0d01000000000c1925323e4b57636d737f8791969e9f97928b827a706b605c544b433b322a221f2b3844505b666c727c838e939fa39d97928b827a6f6b605b534c443b332a2219100700000000010b151f2b37424e57606c78828f96a09f9590847c716c615e564f4740372e1e150b0000000000020c18242f3944505b66707d8a96a09f958b7f72696e7a8794a1adb4a89b8e8175685b5a6164605c544b404d596673808c99a6b3bfb8ab9f9285787070707070707070707070707070707070707a8794a1adbac1b4a79b8e8174685b4e4135281b0e0200000000000915222f3c4855626f7b8895a2aebbc8cdc1b4a79a8e81746767676767676767676767676767676767676767676767676767676767676767676767676767727f8b98a5b2becbccc0b3a69a8d8073675a4d4034271a0d000a1623303c4955616c707c81858a8f939a9fa29e9b97928e8a85807b75706c65605d55524c4540393c4855626f7b8895a2aebbd1bbafa295887c6f62555c6065696e7276797c7e818283848586858483817e7b756e69625a50473e33291f140900000000000000000000000004111d2935414b555d6062626161605c555e5e5d5d5c5c5c5c5c5b5b5b5b5b5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5b5b5b5c5c5d5d5d5e5e5f5f5b606060616162626263615d564c4135291d11050000000000000000000000000000000000091623303c4956636f7c8996a2afbcc4b7aa9e9184776b545c60656c6564605d555c5c5c5c5c5c5c5c5c5c5c626f7c8181818181828385888a887c6f625c5c5c5c5c5d5d606a6f7b79706b615e575f5f5f56554f473d33271c1005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f2e3740495156585e5b5753514a46443f3838322c2825303a44505a626466666566666769686d6f6e695f53473a2d32414a52545b605b54534e4846443f3e3b3a36312a251f170f050000000000000000000000000000000714202d3a4753606d79839095928b81786e685f6774818e9190908f8f8e8e8e8d8d8d8d8d8d8d8c8c8c8c8c8f949eaab7c3cdc1b4a89c928d8c8c8c8c8c8c8c8c8d8d8d8d8d8d8e8e8e8e8f8f9090918e8174675b4e4134281b0e080705020000000000000000000006121f2b3844505c6678858e8d8c8b8a8a8989888888888787878787878786868686868686868585858687929facb9c5c9c6b9ac9f93888685858585868686868687878788888888898989898a8a8b8b8c8c8d8e8e8f8f8376695d5043362a1d1003000000000a16232f3b46515b636d727c848f949fa19e948f857d736d665d554d443c342a2228343f4a545c606a6f79818b9299a2a19e948f847d726c655d564d453c342b2219100700000007121d27313947535f6a737f8c949ea8a79f9691867e756d68605952494030271d1207000000000007121d28333f4a54606c7884919ea79f92867b6e6d7a8794a0adb4a89b8e81756859616c706d665c51454d596673808c99a6b3bfb8ab9f9285786c646464646464646464646464646464646e7a8794a1adbac1b4a79b8e8174685b4e4135281b0e0200000000000815222e3b4855616e7b8894a1aebbc7cdc0b3a79a8d80747474747474747474747474747474747474747474747474747474747474747474747474747474747e8b98a4b1becbccbfb3a6998c807366594d4033261a0d000814202d39444f59616b6f74797e82878e92989ea1a29f9b97928d87827d78726d67615e56514b433e4754616e7a8794abb5c0cbbbaea295887b6f6260676d71767b7f8386898b8e8f909192929291908e8b87827b716c62594f453b31251a0e020000000000000000000000010d18242f3a434b51545655545453514b52515150504f4f4f4f4f4e4e4e4e4e4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4e4e4f4f4f5050515151524a5053535454555555565654524c443a3024190d010000000000000000000000000000000000091623303c4956636f7c8996a2afbcc4b7aa9e9184776b696969696969696969696969696969696969696969696a6f75757474757576797b7d7f796d696969696969696a6a6a696e6d676b6b6b6c6c6c6c6361594f44382c20140700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d1c252e373f464a4b514e4a4644403a38342e2b271f1c1e29323e48505658595958595a5a565d6163615f574d42372b2f3841424a5053504a47433c3a38342e2e2d2a261f1a140d05000000000000000000000000000000000c1926333f4c5966727f8c959f9f938e837a6f6a65727f8c989d9d9c9c9b9b9a9a9a9a9a9a999999999999989c9ea6b0bbc7d0c4b9aea49c99989898989899999999999a9a9a9a9a9b9b9b9c9c9d9d988b7f7265584c3f3225190c00000000000000000000000000000713202d3a4653606d788282807f7e7e7d7d7c7c7b7b7b7b7b7a7a7a7a7a7a7a79797979797979797979808d9aa7b3c0cdc3b6a99c90827979797979797979797a7a7a7b7b7b7b7c7c7c7c7d7d7d7e7e7f8080818182838175685b4f4235281c0f020000000006121e2a354049515b626a6f7a828c9399a39f97928880786d675e564e463c342a2b3844505c666d716d6d747f879297a1a69f9691877f776d685e574e463d342b2219100600000c18242f3943505a626e7b86929fa6b0b1a8a098928b817a706b635b5242392e23180c0000000000010b17222d3844505b66727f8b98a2a2988f82756d7a8693a0b5b4a89b8e817568606b707d786d605b514d596673808c99a6b3bfb8ab9f9285786c5f5757575757575757575757575757616e7a8794a1adbac1b4a79b8e8174685b4e4135281b0e0200000000000815212e3b4854616e7b8794a1aebac7d0c3b7aa9d908380808080808080808080808080808080808080808080808080808080808080808080808080808080828f9ca9b6c2cfccbfb2a5998c7f7266594c3f3326190c0004101c28333e474f596063676d71767b81868c92979fa2a9a29f99938f89847f7a746d68605d5550454753606d7a8699a3afbbc7bbaea195887b6e676d72797e83878c909299989a9c9d9e9e9f9e9d9d9b97938f867e716c61574d42362a1e140800000000000000000000000007131d28313a414547494848474645404544444343434342424242414141414140404040404040404040404040404040404040404040404040404040404040404141414242434343444445453f444647474748484949494746413a32281e13080000000000000000000000000000000000000a1623303d495663707c8996a3afbcc4b7aa9e9184777676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767677777777777878787878797978706b6155483c2f23160900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a131c252d343a3d3f45423d3a38342e2b28231c1b161017202d363e45494b4d4c4c4c4d4e4c52545655534d453c3126262f2f383f4446443f3837322d2b282322211e1a140e090300000000000000000000000000000000000815222e3b4855616e7b859298a39d9590847c6f6a717e8b98a4a6a5a5a4a3a2a2a2a2a2a1a1a1a1a0a0a0a0a6a8adb6bfcad1c6bbb1a9a4a1a0a0a0a0a0a0a1a1a1a2a2a2a3a3a4a4a4a5a6a7a7a4978a7d7164574a3e3124170b000000000000000000000000000006121f2b3844505c666d75757472717170706f6f6f6e6e6e6e6e6e6d6d6d6d6d6d6c666c6c6c6c6c6c74808d9aa7b3c0cdc3b6a99c9083766c6c6c6c6c666c6d6d6d6e6e6e6e6f6f6f6f70707071717272737474757576756f65594d4134281b0e0200000000020d19232e374049515860686d777f879298a2a19a938d82796e685f584e463c3336414c56606d787d786d6d727d859196a0a8a199928c827a6e695f584e463d342b22180f0504101d2935404b55616c76828f99a3aeb8bab2aaa29f938f847d736d63544b4034281c1004000000000006111c28333f4a54606d7a85929faa9e94897d70798699a3aeb4a89b8e81756863707d8981746d62594f596673808c99a6b3bfb8ab9f9285786c5f5959595959595959595959595959616e7a8794a1adbac1b4a79b8e8174685b4e4135281b0e0200000000000814212e3b4754616e7a8794a1adbac7d1c4b8aca095908d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8f949fabb7c4d0cbbfb2a5988c7f7265594c3f3226190c00000b17212c353e464f54555c60646a6e747a7f858c92989fa3aaa49f9c96918b85807a736d67615a524c515d677986929facb9c5bbaea194887b6e6d797f848b9095989d9fa3aba7a9aaaaabacabaaa9a7a59e9892877e70695e53463b3025190d010000000000000000000000010c161f282f35393a3c3b3b3a3a38342e383737363636363535353534343434343434343434343434343434343434343434343434343434343434343434343434343535363636373738382d3338393a3a3b3b3b3c3c3d3a3935302820160c020000000000000000000000000000000000000a1723303d4a5663707d8996a3b0bcc5b8ac9f92868282828282828282828282828282828282828282828282828282828282828282828282828282828282828283838383838484848484858585858586857d7063564a3d3023170a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a131b23292e31323835302d2c28231f1c17110f0a050e1b242d34393d3e403f3f3f4041414647494847423c332a1f1d1d262d33383938332d2b26201f1c171514120e0903000000000000000000000000000000000000000714212d3a46535f696f7c86929fa49f9691857c6f73808c999a999998979696959595959594949494939393999ca4adb9c4ccc0b4a99f9895939393939393949495959596969697979898999a9b9b988b7f7265584c3f3225190c000000000000000000000000000003101c28343f4a545c606968676665646463636262626161616161616060606060605b5f5f5f5f5f6774808d9aa7b3c0cdc3b6a99c908376695f5f5f5f5b6060606061616162626262636363636464656666676768696968655d53483d3125190c00000000000007121c252e373f464e565e656c737d869298a2a49f948f837a6f6a5f584e453c3846525e68727f8a80736a6b707c849196a0a8a39f948f847b6f6a60584e463c342a21170d06131f2c3845515d67717e8a949fabb4bfc4bcb4aea59e9691888073665c5145382c1f13060000000000000b17222d3845515d6774808d99a4a69d9083767986929facb4a89b8e8175686673808d8b7f726b6057596673808c99a6b3bfb8ab9f9285786c666666666666666666666666666666666e7a8794a1adbac1b4a79b8e8174685b4e4135281b0e0200000000000714212d3a4754606d7a8793a0adbad2d4c8bcb1a7a09d9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9c9fa6b0bbc7d3cbbfb2a5988c7f7265594c3f3226190c000005101a232c343d43484b5153585f62686d737a7f858d92989fa6aca8a09d98928d857f79706c605d564f556b7885929eabb8c5baaea194877b6e74818c91979d9fa7a5a4a3a2a1a2a4a7acafb6b7b6b4afaaa39992867b6e61564c41362a1e1105000000000000000000000000040d161d24292c2d2f2f2e2e2d2c28232b2a2a29292929292828282828272727272727272727272727272727272727272727272727272727272727272727272728282829292a2a2a2b2b22282b2d2d2d2e2e2f2f2f302e2d29241e160e04000000000000000000000000000000000000000a1724303d4a5763707d8a96a3b0bdc7baaea298928f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f90909090919191919192929292928b7f7265584c3f3225190c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010911181d2224252b2824201f1c1812100b0600000009121b22292d303133333233333035393a3c3b3a37312a21180b141c22282b2d2b28221c1b1312100b0607050200000000000000000000000000000000000000000005121e2a36424d57606a717e8a929da7a19792867d75828e8e8e8d8c8b8a89898988888888888787878786868c929ca8b4c1c9bcb0a4988d88868686868687878788888989898a8a8a8b8b8c8d8e8f8f8e8175685b4e4235281b0f0200000000000000000000000000000b17232e38424a50535c5b5a595857575656555555555454545454545453535353504a5353525a6774808d9aa7b3c0cdc3b6a99c908376695d52524a5053535354545455555555565656565757585859595a5b5b5c5c5b59534b42372c201509000000000000000a131c252d343d444c535b606b707d869298a2a69e9590847c6f6a5f574d45414e58616e7a8592877c6f666a6f7b849196a0a9a69e9691857c6f6a60584e463c33291f16101c28343f4a54606d7985919ea6b0bdc6cdc5bcb4aea59e969186796d6053463a2d20130700000000000006111c2935414b55616e7b87939fac9f958a7d7885929fabb4a89b8e8175686576838f92877d6f695e576673808c99a6b3bfb8ab9f9285787373737373737373737373737373737373737a8794a1adbac1b4a79b8e8174685b4e4135281b0e0200000000000714202d3a4753606d7a8693a0b5c0ccd7ccc2b8b0aaa9a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a7a9afb7c0cbd6cbbeb2a5988b7f7265584c3f3225190c00000008111a222b3238394045474e53565e61676d737a80868f949ea1a9acaaa29f98928c847d756d6860595e6b7784919eaab7c4baada094877a6d73808d9aa1a09e9a999897969595979b9fa4acb6c0c1bcb4aba2988d8074685e5246392d20140600000000000000000000000000040c13181d202123222121201f1c181e1e1d1d1c1c1c1c1c1b1b1b1b1b1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1b1b1c1c1c1d1d1e1e1e171c1f20202121222222232321201d19130c0400000000000000000000000000000000000000000a1724313d4a5764707d8a97a3b0bdcabfb4aaa29f9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9d9d9d9d9d9e9e9e9e9e9f9f988b7e7265584b3f3225180c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d121518181e1b171312100c07030000000000000910171d212425262625262724292d2e302e2d2b261f180f060a11171c1f201f1c17110f0a06030000000000000000000000000000000000000000000000000000020e1a26313b454e58616c74808d959fa9a29892867d80838281807f7e7d7d7c7c7c7b7b7b7b7b7a7a7a7a79808c99a6b3bfc8bbaea195887b797979797a7a7a7b7b7b7c7c7d7d7d7e7e7f7f80818283838174685b4e4135281b0e00000000000000000000000000000006111c2630383f44464f4f4d4c4b4b4a4a49494848484848474747474747474646443f46464d5a6774808d9aa7b3c0cdc3b6a99c908376695d50463f44464647474748484848494949494a4a4a4b4b4c4d4d4e4e4f504f4d48423930251b0f0400000000000000010a131b222b323a41495059616b707d869298a2a7a09691857c6f695f574d4953606a74818e989083786d60696e7a849197a1a9a8a09791857d6f6a60584e453b31281d141f2c3844505c66727f8b97a1adb8c2ccc4bbb3aaa29f938e847d70665c5145382c1f1306000000000000000d18242f3a46535f6975828f9ba7a79d90837885929eabb4a89b8e8175686c7985929991857b6e69616673808c99a6b3bfb8ac9f92867f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f808d99a6b3c0c1b4a79b8e8174685b4e4135281b0e0200000000000713202d3a4653606d798699a4afbbc7d4c7bbb0a69f9c979797979797979797979797979797979797979797979797979797979797979797979797979797979a9da5afbac5d1cbbeb2a5988b7f7265584c3f3225190c0000000008101921272c2f34383c43474c52555d60686d737b828a91979da5adaeaaa29f96918a817a706b635b6a7783909daab6c3baada093877a6d707d8a989796918e8c8b8a8988888a8e939aa4afbbc1c6bdb4aa9f92867a6e6154473b2d22170b000000000000000000000000000001070d111314161515141313100c0711101010100f0f0f0f0e0e0e0e0e0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0e0e0e0f0f1010101111060b0f121314141415151616161413110d08020000000000000000000000000000000000000000000b1724313e4a5764717d8a97a4b0bdcbbfb4aaa39f9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9da0a7aaabababababa5988b7e7265584b3f3225180c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000106090b0c120f0a07060400000000000000000000060c111517181a1919191a191d20212322211e1a150e060000060b0f1213120f0b060000000000000000000000000000000000000000000000000000000000000009141f29333d46505a606d78839098a2aaa29892867d76757473727271706f6f6f6f6f6e6e6e6e6d6d6d737f8c99a6b2bfc7baaea194877b6e6d6d6d6d6d6e6e6e6f6f6f707071717172737474757677746f64594c403327170f080000000000000000000000000000000a141e262e34383a4242413f3e3e3d3d3c3c3c3b3b3b3b3b3b3a3a3a3a3a3a3938332d414d5a6774808d9aa7b3c0cdc3b6a99c908376695d50433338393a3a3a3b3b3b3b3c3c3c3c3d3d3d3e3e3f3f40414142424342413d3730271e14090000000000000000000109101920282f383f444f59606b707d869298a2a8a19791857b6e695f56505b656f7c87939f958c7f72695f686e7b859197a2ada9a19792857c6f6a5f574d433a2f261c27333f4953606d7984919ea9b3becac3bab2a9a198928a817a706b60544b4034281c10040000000000000007131d2a36424d5763707d8995a0ab9f95897c84919eabb4a89b8e8175686e7b8897a19791847b706c6673808c99a6b3bfbaaea398928c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8d929ca8b4c1c1b4a79b8e8174685b4e4135281b0e02000000000006121f2c3844505c667986939facb9c6d2c3b7aa9f948f8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8e939da9b5c2cecbbeb1a5988b7e7265584b3f3225180c0000000000070f161b1d23292c31373a41464b51565e61696e767e848e939fa2a9b0aea8a19e938e847d726d606976838f9ca9b6c2baada093877a6d6d7a868e8b8784817f7e7d7c7b7c7e8188939fa5afbac6c6baaea3988b7e726553493f33271b0f030000000000000000000000000000000104060709080807070604000004040303030302020202010101010101010101010101010101010101010101010101010101010101010101010101010102020303030404050000030606070708080809090a0707050100000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1bdc7baaea398929090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909095a0acb7b8b8b8b1a4988b7e7165584b3e3225180b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005020000000000000000000000000000000005080a0b0d0c0c0c080d111314161514120e090300000000000306060603000000000000000000000000000000000000000000000000000000000000000000030d18212b343e44515c666e7b86929fa7aaa29892877d706a6666656463636262626262616161616066737f8c99a6b2bfc7baaea194877b6e616060606061616262626363636464656566676868696a68645d53483c3029211a11080000000000000000000000000000020c141c23282b2d3635343332313130302f2f2f2e2e2e2e2e2e2d2d2d2d2d2d2b2834414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362b2d2d2d2d2e2e2e2f2f2f2f30303030313132333334343536363534312c251e150c020000000000000000000000070e161d262d333e474f59606b6f7d869299a4a9a19791847b6e695e57606c7883909aa49f92867b6e665f696f7c85929fa4aea9a29792857c6f695e554b42382d222b3744505b65717e8b96a1acbbc4c3bab2a8a19792867e756d6860594f42392e23180c0000000000000000010e1a26313b4854606b7783909daca79b8e8284919daab4a89b8e817568727f8b98a9a19691857e746e73808c99a6b3bfbfb4aaa39f99999999999999999999999999999999999999999ca4aeb9c5c1b4a79b8e8174685b4e4135281b0e02000000000003101c28343f4a5f6c7985929facb8c5cfc2b5a99c8f827e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e818e9aa7b4c1cdcbbeb1a5988b7e7265584b3f3225180c000000000000040a0f12181c1f262b30363a41454c52575f616c717a818a92979fa6aeb2ada59e9691877f756d6775828f9ba8b5c2b9ada093867a6d68717e817e7b77747271706f6e6f71747e8b939eaab6c4cbbfb4aa9b8e8275655b5044372b1f1205000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a97a4b1bdc5b9ac9f928683838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383909daab7c3c5beb1a4978b7e7164584b3e3125180b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001050707090808060200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f19222834404a545f69727f8b959fabaaa39992867c6f695f565756565655555555555454545966737f8c99a6b2bfc7baaea194877b6e6154535354545455555656565757575858595a5b5c5c5d5b59534846423b332c231a10050000000000000000000000000000020a11171c1f202928272625242423232222222221212121212121202020201f2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a20202021212122222222232323232424252526262728282929282825201b140c0300000000000000000000000000040b141b2227353d474f59606b707d87939fa6a9a19691847b6e665f69717e8b959faca2989082786d605f6a707e8a929da7b1a9a29792857b6e675d544a3f33282d394653606c7884919da8b2bdc4bbb2a8a09691857c716c605d564f473d30271d120700000000000000000009141f2c38444f5965727f8c9aa4ac9f928785929eabb4a89b8e81756775828f9ca8a8a197928a817473808c99a6b3bfbfb4aaa29f97979797979797979797979797979797979797989ba3adb8c3c1b4a79b8e8174685b4e4135281b0e020000000000000c17232e45525f6c7885929fabb8c5cdc0b3a79a8d80747171717171717171717171717171717171717171717171717171717171717171717171717171717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b000000000000000001070c10151a1e252a2f353a41464d535a61676d747e8590949da4afb5afa9a199928c81796d74818e9ba7b4c1b9ada093867a6d606c7174716e6967666564636262646c75818e9ba8b2bdc9c5b8ab9e9285796c605346392d201306000000000000000000000000000000040403020102030406000000000000000000000000000000000000000000000000000000000503020102030404000000000000000000000000000000040302010203050000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b97a4b1bec4b7ab9e91847876767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767d8996a3afbcc9bdb1a4978a7e7164574b3e3124180b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000071018232e39424d57606c78839099a3afaba29892857b6e685d544a4f4f4f4f4f4f4f4f4f4f5966737f8c99a6b2bfc7baaea194877b6e61544f4f4f4f4f4f4f4f50505050505151515151524b5153545454524d453e352c21160b00000000000000000000000000000000060b1012131c1c1a1918181717161615151515151414141414141413131a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d1314141415151515161616161717171818191a1a1b1b1c1d1c1b19150f0902000000000000000000000000000000020a1117232b353d474f59606b737f8c949ea8a9a1969083786d666e7b86929fa7b1aa9f948e81746e63616c74808d959faab3a9a1979083796d665b50443d3134404b5563707d8995a0acbac4bcb3a9a09691847b6f6a615a524c443d352c1e150b0000000000000000000003101b27323d4854616e7b87939faca399929297a1adb4a89b8e81756d7985929facb2a9a19e91847973808c99a6b3bfbaaea298928b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b919ba7b3c0c1b4a79b8e8174685b4e4135281b0e02000000000000061f2c3945525f6c7885929fabb8c5cdc0b3a79a8d80746764646464646464646464646464646464646464646464646464646464646464646464646465717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b000000000000000000000004090f13191d242930363b424650555d606c717b828d929fa4abb4b2aba39f938e837a74808d9aa7b3c0b9ada093867a6d6062646764615e575958575655555a626f7c8896a0acb9c5c6b9ada197887b6e6155483b2e2215080000000000000000000000010507081111100f0e0f1011130c0b0906010000000000000000000000000000000000000004080a0b11100f0e0f1011110706040100050302010202070a0c0d110f0e0e0f10110b0a0806070b0a090707080a0908060300000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1bec4b7ab9e9184786b696969696969696969696969696969696969696969696969696969696969696969696969696969696969696969707c8996a3afbcc9bdb1a4978a7e7164574b3e3124180b000000000000000000000000000000000000000000000000000000040607080707040104060707060401000000000000000000000000000000000000000000000000030709090e0d0c0b09090a0b0d0f070705010000000000000000000000000000000000000000000000000000000000000000000000000000020507080b0a08070604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121c27303b44505b666f7c87929faab4aaa19791847a6d665c5c5c5c5c5c5c5c5c5c5c5c5c66737f8c99a6b2bfc7baaea194877b6e615c5c5c5c5c5c5c5c5c5c5d5d5d5d5d5e5e5e5e5f5f5c606061615e574f473e33281c100400000000000000000000000000000000000306070f0f0e0c0b0b0a0a0909090808080808080707070707070e1a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d10070708080808090909090a0a0a0b0b0c0c0d0e0e0f0f100f0e0c090400000000000000000000000000000000000000061119232b353d464f59606c77828f96a0aaa89f958d80746d78839098a2aeb9b0a69e938d80736d62606d78839098a2aeb3a9a0958f81786c60584e43393845515c6774818e9ba7b1bcbdb4aaa19791847a6e6960585045413a322c231a0c0300000000000000000000000b16202d3a46525e697683909cababa39f9ea1a9b3b4a89b8e8175707d8998a2aeb1a79d938a7e7173808c99a6b3bfb8ac9f92867e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7f8b98a5b2bec1b4a79b8e8174685b4e4135281b0e02000000000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a575757575757575757575757575757575757575757575757575757575757575757575865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b0000000000000000000000000002080d13181e252a31363e434c515a61696e78808c9399a2aab4b5afa59e9590837b808c99a6b3bfb9ada093867a6d6053585b5854524d4c4b4a494849535f6a7784919eaab7c4c9beb3a996897d7063564a3d3023170a00000000000000000002080d1114141e1e1c1b1b1b1d1e1f191816120d0700000000000000000000000000000000050c111417171e1d1b1b1b1c1d1e1413100d0712100f0e0f0e1317191a1e1c1b1b1c1d1e1817141314171715141415171515120f0a040000000000000000000000000000000000000000000000000c1825323f4b5865727e8b98a5b1bec4b7ab9e9184786b5e5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d63707c8996a3afbcc9bdb0a4978a7d7164574a3e3124170b00000000000000000000000000000000000000000000000001070c101314151413110d1013141413110d07010000000000000000000000000000000000000000040a0f1315161b1a1917161617181a1c1413110d08020000000000000000000000000000000000000000000000000000000000000000000003090e1214151816151313100c070b0907060400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b151e28333f4a545f6a74818e98a3aeb3a9a0968f82786d6868686868686868686868686868737f8c99a6b2bfc7baaea194877b6e6868686868686869696969696a6a6a6a6a6a6b6b6b6c676d6d6e6e6961594f44382c201407000000000000000000000000000000000000000003020100000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d10030000000000000000000000000000000000010102030302020000000000000000000000000000000000000000000000081119232b343d44505b656d7a849198a2aea79d928b7e73808d959faab4bfb8afa59c928b7f726c61666e7b85929fa5afb1a79e938c7f736a60554b403a4753606d7985929fabb8bfb5aba29891857b6e685f574e463e353028201a110800000000000000000000000005121e2a36424d5765727f8b99a4afafacabadb3bbb4a89b8e817575818e9baab2a99f958e81746c73808c99a6b3bfb8ab9f9285787171717171717171717171717171717171717a8794a1adbac1b4a79b8e8174685b4e4135281b0e02000000000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b000000000000000000000000070d131619191b191f262a313a414550575e666d747f879298a2aab4bbafa79f959184808d9aa7b3c0b9ada093867a6d60534b4e4b4846423f3e3d3c3b434e586774818e9aa7b4c1cfbeb1a4988b7e7165584b3e3225180b0000000000000000050d14191e20212a2a29282728292b2c2625221e18110901000000000000000000000000000810171c2123242b29282728292a2a20201d181d1e1d1c1b1c1e1f2326272b292827282a2b24232120212423222121222422211f1b150e0600000000000000000000000000000000000000000000000c1926323f4c5965727f8c98a5b2bfc4b7ab9e9184786b5e5150505050505050505050505050505050505050505050505050505050505050505050505050505050505663707c8996a3afbcc9bdb0a4978a7d7164574a3e3124170b0000000000000000000000000000000000000000000000030b12181c1f202221201d191d1f2021201d18130c04000000000000000000000000000000000000070f161b1f22232827252423232425272821201d19130c050000000000000000000000000000000000000000000000000000000000000000060d141a1e2122252322201f1c181a18151313100c07070604010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c17222d38424e58616e7b86929facb6b2a89f948d80767575757575757575757575757575757f8c99a6b2bfc7baaea194877b757575757575757575767676767676777777777778787979797a7a7b706b6155483c2f231609000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000711192227333f49535d686f7c86929fa8aea49f92867f87939fa7b1bcc5c1b7aea49f93877d70645f69717e8a939eabb5afa59f92877c6f675d5145404b5564707d8a98a2aebabbaea39992867c6f695f564d453d3429241e160e0800000000000000000000000000020e1a25303b4754616e7a87939facb9b9b8b9bec1b4a89b8e81757a86929faca9a1969083786d6673808c99a6b3bfb8ab9f9285786c646464646464646464646464646464646e7a8794a1adbac1b4a79b8e8174685b4e4135281b0e02000000000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d413e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e3e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b00000000000000000000010a12191e2325262828282727282f353e454d545c606d727e869298a2aab4b9b1a7a096918d929da9b5c1b9ada093867a6d605347413e3b3a3630323130323e4b5865717e8b98a4b1becbbfb3a6998c807366594d4033261a0d00000000000000050e171e252a2d2e37373635343536373932312e29231b130900000000000000000000000008121a22282d303138363534353637372d2c29242a2b2a2827292a2a2f32333736353435363831302d2c2d31302f2e2d2f302f2e2b2620181006000000000000000000000000000000000000000000000d1a2633404d596673808c99a6b3bfc4b7ab9e9184786b5e5353535353535353535353535353535353535353535353535353535353535353535353535353535353535663707c8996a3afbcc9bdb0a4978a7d7164574a3e3124170b00000000000000000000000000000000000000000000030d151d23292c2d2f2d2c2924292c2d2d2c29241d160d040000000000000000000000000000000007101921272c2f30343332313030313233352e2d2a251e160e05000000000000000000000000000000000000000000000000000000000000060f171f262a2d2e31302e2d2c2823272422201f1c18171413110d08070502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c262f3c46525e6973808d9aa4afbbb0a69d928d8282828282828282828282828282828283919daab7c4cfc2b5a99c8f82828282828282828282828283838383838484848484858586868787877d7063574a3d3024170a000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000071017222d38414c565f6a727f8c96a0acaea298928b9399a4afb9c2c0bbb2aca49f948c7f736657616c75818e99a3aebbafa3999184796d60584e45515d6775828e9baab4bab0a69f92877d706a5f574d443c332b2219130c040000000000000000000000000000000914202d3946525e6876828f9cabb5c0c5c6cac1b4a89b8e81757e8b98a2a9a19791847a6e666673808c99a6b3bfb8ab9f9285786c5f5858585858585858585858585858616e7a8794a1adbac1b4a89b8e8175685b4e4235281b0f02000000000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d413431313131313131313131313131313131313131313131313131313131323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b000000000000000000000a131c242a2f32333535343434343333333b424a505b626c707d869298a3abb5b9b1a8a09e9a9da4aeb9c5b9ada093867a6d6053473a3232323232323232323d4a5663707d8996a3b0bcc9c1b4a79b8e8174685b4e4135281b0e020000000000020d1720293036393b4444434241424344463f3e3a352d251b11070000000000000000000005101a242c33393c3e44434241424344443a39352f37383635343537363b3f40444241414243443e3d39393a3e3d3c3a3a3b3d3c3b37322a22180e040000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0c4b7ab9e9184786b606060606060606060606060606060606060606060606060606060606060606060606060606060606060606063707c8996a3afbcc9bdb0a4978a7d7164574a3e3124170b00000000000000000000000000010407070a0b0a08010b151f272f34383a3b3a39352f35393a3a39352f281f160d040000000000000000000000000000040f19222b32383b3c41403f3e3c3c3d3e40423a3936302820160c0200000000000000000000000000000000000000000000000000000000050e17212931363a3b3e3d3b3a38342e33312f2d2c28232321201d191514120e0906040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d2a36424d57616e7b87939facb9b8aea49d948f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f9195a0acb8c5d0c3b7ab9f948f8f8f8f8f8f8f8f8f8f8f8f8f909090909091919191929293999399887b6e6255483b2f221508000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d1003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000106111b262f3a444e58606d7884919da6b0aaa29f989fa4abb5c0beb6afa8a19a938c82786d60535a616e7b86929faab3b5aba0968d80746a5f534753606d7a86929facb8b2a89e938b7f726b60584e453b322a21191008020000000000000000000000000000000005111e2a36414c5665717e8b99a3afbbc7d2cec1b4a89b8e817783909da9a19791857c6e685e6673808d99a6b3c0b8ab9f9285786c5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f616e7a8794a1adbac1b5a89b8e8275685b4f4235281c0f02000000000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d413427242424242424242424242424242424242424242424242424242425323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b000000000000000000030c1c252e353b3e40424141414140404040403f3f44515a616b707d869299a3aebbbab2acaaa7a9aeb6c0cbb9ada093867a6d6053473f3f3f3f3f3f3f3f3f3f3f4855626e7b8895a1aebbd1c2b5a89b8f8275685c4f4235291c0f02000000000008141e29323b41464751514f4e4e4e5051524c4a463f372d23180d010000000000000000000c17222c363e45494a51504e4e4e4f5051474540394345434241424444474b4d514f4e4e4f50514b494545474a4a484747484a4847433c342a20150a0000000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1c4b7ab9e9184786d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d707c8996a3afbcc9bdb1a4978a7e7164574b3e3124180b000000000000000000000001080d1113141718171511121d27313940454748474541444045474745413a31281f160c01000000000000000000000000000a16212b343d4348494e4d4c4a49494a4b4d4f4746413a32281e1308000000000000000000000000000000000000000000000000000000020d172029333b4246484b494846454042403e3c3a38342e302d2c292422211e1a1313100c0705010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b1a25303b46535f6976828f9ca9b3beb6aea69e9c9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9da0a7b1bcc8d3c7bbb0a69f9c9b9b9b9b9b9b9b9b9c9c9c9c9c9d9d9d9d9d9d9e9e9e9f9fa49f9386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d1003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070d11141a1d28323c44515c66707d8a949eabb4aeaca5acafb5bdb9b1aca49f96918880786d665c50535f6974808d98a2aebab2a89f93877c6f625a505764717e8a98a2aeb5aba1968f82756d62594f463c332920180f07000000000000000000000000000000000000010d1925303b4754616d7a86929facb9c5d2cec1b4a89b8e817d8a95a0a19791857b6e6a5f566673808d99a6b3c0b8ab9f9285786c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6e7a8794a1adbac2b5a89b8f8275685c4f4235291c0f02000000000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a1818181818181818181818181818181818181818181818181825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b0000000000000000000a151e2e3740464b4c4e4e4e4e4d4d4d4d4d4c4c4c4c4c5059606b707d87929fa4aeb9bdb9b7b3b5b9c0c8c6b9ada093867a6d60534c4c4c4c4c4c4c4c4c4c4c4c4c54606d7a8793a0b5bfcbc2b6a99c8f8376695c504336291d100300000000010d1925303b444c52545d5d5c5b5a5b5c5e5f595651493f35291e120a0a0a0a0a0a0a0a0b0b111c28333e485055575e5c5b5a5b5c5d5d53514b4e5051504f4e4f515152585a5e5c5b5a5b5d5e57555051545756555454555755534e463c32261b0f0300000000000000000000000000000000000000020f1c2835424f5b6875828e9ba8b5c1c4b7ab9e9184797a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7d8a96a3b0bdc9beb1a4988b7e7165584b3e3225180b00000000000000000000040c13191d2021232424211d18232f39434b51535554524c514b515354514b433a31281d1307000000000000000000000000030f1b27323d474f54565b5a5857565657585a5b54524c443a3025190d01000000000000000000000000000000000000000000000000000009141f29333b454d535558565553514b4f4d4b48464540403d3a39352f2e2d2a26201f1c1813110d08040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141f2a36424d5764717e8a97a1adb9c0b8b0aaa9aba49f9d9d9d9d9d9d9d9d9d9d9d9d9ea1a9b2bdc9d4c8bcb1a7a09d9d9d9d9d9d9d9d9d9d9d9e9e9f9f9fa4a0a0a1a1a2a2a3a4a59f928579685d5246392d201307000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001070d13181d20252a2d3237404a54616b75828f99a3aebab8b2b9bbbab2aca7a09a938d847d736c665c544a4d57616d7a85929fa9b3bbafa4998f82766c6153556774818d9aaab4afa49991847a6d615b51473d342a21170e0600000000000000000000000000000000000000000814202d3946525e6875828f9ca8b5c2cfcec1b5a89b8e8183909d9f9691857b6e695f575a6773808d9aa6b3c0b8ab9f9285797979797979797979797979797979797979797a8794a1adbac2b5a89c8f8275695c4f4236291c0f03000000000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b000000000000000006111c263040495257595b5b5b5a5a5a5a59595959595959595959616b717e8b929da6b0bcc5c4c0c1c5cbd2c6b9ada093867a6d60595959595959595959595959595959606d798699a3aebbc7c3b6a99d9083766a5d5043372a1d06000000000005111e2a36414c565e616a6a69686768696a6c65625b51463a2e22161617171717171717171718212d3945505a61646b69686768696a6a605d555b5d5e5d5b5a5c5d5d5c63666a69686768696b64615a5d6064636261606263625f584e43372b1f12060000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c1c1b9aca196918686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868a8f9aa5b2c4c5beb1a5988b7e7265584b3f3225180c0000000000000000010a0d161e24292c2d3031302d28222934404b555c6062605d565e555d60605d554b433a2f24180d01000000000000000000000007131f2c38434f59606367666564636364656668615e564c41362a1d110500000000000000000000000000000000000000000000000000020e1a25303b454d575f61646361605c555b5a575553514b4c4a4745413e3b3a36312d2c2823201d1913100c070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1a26313b4653606d7985929eabb8c4c2bbb7afa499939090909090909090909090909196a1adb9c5d1c5b8aca09590909090909090909090919191929293999394949495959697989998877a6d6154473a2e211407000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c12181d24292c31363a3d43474e5359626e7b86929facb9c5bebfb5ada8a09e959088807a706b605b544a4246525e68727f8c97a1adb9b5ab9f948a7d70655b5d677783909daab2a89f93877d70685e52493f352b22180f060000000000000000000000000000000000000005080a111d2935414c5665727e8b98a9b3bec9d1c4b8ab9e918490959e9590847b6e695f574e5a6773808d9aa6b3bbbaada297898585858585858585858585858585858585858586929facb8b9b9b5a99c8f8276695c4f4336291c1003000000000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b00000000000000000c17232e3842525b6366686867676767666666666665656565656565656c74808d949fabb7c4d1cdced1d6d3c6b9ada093867a6d6565656565656565656565656565656565667986929facb9c5c4b7aa9d9184776a5e51442d22170b00000000000714202d3946525e686e777776757475767779726d62564a3e312323232323232424242424242425303c4955616c7177767574757677776d675d666a6b696867686a6a606e7377757474757677716c61676d71706f6d6d6e706f6a5f53473b2e2115080000000000000000000000000000000000000004101d2a3743505d6a7683909da9b5b4b4b4b2a8a19e939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393969aa2abb6b7b8bab2a5988c7f7265594c3f3226190c00000000000000000a131c20282f35393a3d3e3d39342c2c3845515c676d6e6d686b6b6b676d6d675d554b4035291d110400000000000000000000000915222f3b4854606b6f747372716f6f707173756d685e5246392d2013070000000000000000000000000000000000000000000000000005111e2a36424d575f696e71706e6d676a68666462605c54595654514c4b4846423d3a38342e2d29251f1c18120f0a0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141f2c3845515c6774808d9aa8b2bdc9c6b9ac9f938783838383838383838383838384919eabb8c4d0c3b7aa9d9083838383838383838384848485858586868687878888898a8a8b8c8d8a7d7063574a3d3024170a000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d161d24292f35393b4246484e54585f626b707983909daab6c3c4b8ada39b96918a837c746d676159504a4238414c56606d7985919eacb6bdb0a69d9184786c60606d7a86929facada1968d80736b60564c41372d23191007000000000000000000000000000000000000060c111517181925303b4855626e7b8897a1adb9c6d2c5b9ada19691969f938e837b6e695f574d4d5a6774808d9aa7afaeaeb3a9a298929292929292929292929292929292929292929298a2aeb6acacada99c8f8376695c504336291d0701000000000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b0000000000000003101c28343f4a54636d737574747474737373737372727272727272727272727983909ca9b6c3cecfd2d7ddd3c6b9ada0938679727272727272727272727272727272727272727885929fabb8c5c4b8ab9e9185786b5e4a3f33281c0f03000000000814212e3b4754616e7a8384828181818384867f7265594c3f323030303030303030313131313132323e4a5764717e8483818181828383796d607176787675747577776c7380848281818283847e71646d797d7d7b7a7a7b7d7c6f6255483c2f2215090000000000000000000000000000000000000004111e2b3744515e6a7784919da8a8a8a7a7a7a7a6a6a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a3a7a8a8a9aaabaeb4a5998c7f7266594c3f3326190c0000000000000007121c252e323a4145474a4b49453e362d3a4753606d797b7a79777778797a7a75675d5145392c20130f0b06000000000000000000091623303c4956636f7d81807f7d7c7c7d7e80817a6d6154473a2e211407000000000000000000000000000000000000000000000000000714202d3a46525e696e7b7e7c7b7978767573716f6d66686663605d555755534d4a4645403a3935302c28231c1b15100b030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b55626f7b8896a1adb9c5c7bbafa4998a7d77777777777777777777777f8c99a6b2bfc7baaea194877b777777777777777777777878787979797a7a7a7b7b7c7d7e7e7f80817c6f6255493c2f221609000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d1003000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f282f353a4145474d53545860626a6f757d8490959fabb8c4c0b3a79b918c847e786f6b605d554f443f382f3a45515d6773808d9aa4afbbb8aca0968a7d706363707c8999a3afa69e9184796d60594f443a30251b11080000000000000000000000000000000000000910171d2124252a292d394653606c7985929eabb8c5d1c9bdb2a8a19e99928b81796e695f574d454e5a6774818d9aa2a2a1a1a1a1aaa29f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa49f9fa0a0a19c908376695d5043362a18120b030000000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b0000000000000006121f2c3844505c66737f8181818180808080807f7f7f7f7f7f7f7f7f7f7f7f7f808d9aa6b3c0c2c3c6ccd3d8ccbfb2a5998c7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f86929facb8c3c3b8ab9f928578665b5044382b1f120600000000091623303c4956636f7c89908f8e8d8e8f918e8175685b4e423d3d3d3d3d3d3d3d3d3d3d3e3e3e3e3f404c5865727f8b8f8e8d8e8f90867a6d6a7683848382818284837875818e8f8e8d8e908c7f7265717e8a89888787888a83776a5d5044372a1d110400000000000000000000000000000000000005121f2b3845525e6b7885919c9b9b9b9b9a9a9a9a99999999989898989898989898989898989898989898989898989898989898989898989898989898989898989999999a9a9a9b9b9c9d9e9fa2aaa2998c7f7366594c403326190d000000000000020d19232e3740444c525456575550483f363f4b5865727e888785848485868687796d6053473a2d201f1c17110a02000000000000000c1926323f4c5965727f8c8d8b8a89898a8b8d897c6f6356493c30231609000000000000000000000000000000000000000000000000000814212e3b4754616e7b868b898886858382807e7b79777573706d676764615f575653514b4746413a38342e2b26201c160f0b060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232e3947535f6a7884919eabb7c4ccc0b5ab9d9183786d6a6a6a6a6a6a6a6a737f8c99a6b2bfc7bbaea194887b6e6a6a6a6a6a6a6a6a6a6b6b6c6c666d6d6d6e6e6f6f7071727273746f6a5f53473b2e211508000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d28313940454b5154575e61666a6f757c828a91969fa7b1bbc0bfb2a5988c7f79716c656059514c433e332d2935404b55616e7b87939facb9bdb2a89c8f82766a66737f8c99abab9f948a7e71675d51473d32281e130900000000000000000000000000000000000009121b22292d30313736353744505b6575828f9ba8b5c2cfc8bdb2a8a09792877f746d675e574d45414e5a6774818d9695959594949493939a9392929292929292929292929292929292929292939a9393939394959083766a5d50433729231d150d0300000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b000000000000000713202d3a4653606d79858e8e8e8d8d8d8d8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8d929da8b5b5b5b6bbc1c9d3cdc0b4a89c918c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c9298a2aeb6b6b6b7ac9f9386796c605346392d201306000000000916232f3c4956626f7c89959c9b9a9b9c9b8e8175685b4e49494949494a4a4a4a4a4a4a4a4a4b4b4c4d4d5865717e8b989b9a9b9c9a86796d6c798591908e8d8f90877a74818e9b9b9a9b988b7e7265717d8a96959493959184776a5e5144372b1e11040000000000000000000000000000000000000613202c3946535f6c79868f8f8f8e8e8e8e8d8d8d8d8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8d8d8d8e8e8e8f909192989495968d8073665a4d4033271a0d00000000000006121e2a35404951565d606364615a50483f3e4b5764717e8a98929191929299877a6d6154473a332d2b28221c140b060000000000000b1825323e4b5865717e8b9898979696979895897c6f6256493c2f23160900000000000000000000000000000000000000000000000005111e2a36414d566774818d98969a9391908e8d8a888684827f7d7a7774716e696763605c5554524c4644403937312c271f1c17110a020000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d2b37434e586875818e9ba8b5c1c3c1b8aca0958b7e72675d5d5d5d5d5d6773808d9aa6b3c0c8bbaea295887b6f625d5d5d5d5d5d5d5e5e5e5f5f5c60606161616262636465666667625f584e43372b1f1306000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d10030000000000000000000000000000000000000000000000000000000000000000000000000000000000010d18242f39434b51555d6064696e72777c82878f949ea1a8a1acafb5bdb0a396897d7066605b534f45413a312822242f3946535f6976838f9ca9b3beb7ab9f94887c6f6575828f9ca8a3999082766c61554b40352b20160c01000000000000000000000000000000000006101b242d34393d3e434342423f495365727f8b98a9b3becac5b8aca09691857d726d605c554d4543404d5a677380898989888888878787868686868686868686868686868686868686868686868686868686868788898276695d504338342f271f150b01000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b0000000000000006121f2c3844505c6674818e9a9a9a9a9a999999999998989898989898989898989a9da4a8a8a8a8aaafb7c1ccd0c4b8ada39c9998989898989898989898989898989898989898989fa2aaa9a9a9a9aaaca49a877a6d6054473a2d211407000000000916222f3c4955626f7c8895a2a8a7a8a79b8e8174685b565656565656565656575757575757575859595a5b64717e8b97a4a7a89f938679666b7885919c9b9a9b93877a74818d9aa7a7a4988b7e7165707d8a96a2a0a09d9083776a5d5044372a1d1104000000000000000000000000000000000000000d192633404c5966737f8282828281818181808080807f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f8080808081818182838485868788898b8074675a4d4134271a0e0100000000000a16222f3b46515b63686d70716c625a50443e4a5764717d8a979f9e9e9e9f94877a6d615447443f3938332d261d17110d08020000000b1824313e4b5764717e8a97a4a4a2a2a3a295887b6f6255483c2f2215090000000000000000000000000000000000000000000000000714202d3946525e687885929eaaa49f9e9d9b99979992908e8c898684817e7b7874706d6765615e5653514a47433c38322b28221c140b09030000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1a26313f4c5865727f8b98aab4b8b6b4b3b1a79e9285796d60534950505b6774818e9aa7b4bfc0bbafa295887c6f6255505050505051515152524a5153535454555556575758595a5a55534e463c32261b0f03000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d1003000000000000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b555d60676d71767b7f84898f939a9e9f9b97949fa3abb5b5a89b8f8275695e5249413d352f281f171d2b37424d5764717e8a97a2adbabbb0a69a8e81746c7985929eab9f92877c6f625a5043392f23190e040000000000000000000000000000000000000c17222d363e45494b50504f4e4e4d55626f7c8897a2adbac6c4b7aa9d91847b706b625b514b4f4f504a4753606d797c7c7c7c7b7b7b7a7a7a79797979797979797979797979797979797979797979797979797a7b7c7c7b6e61554a4745403931271d1207000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b0000000000000003101c28343f4a5463707d8998a2a7a7a6a6a6a6a9a19e9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9ea5afbbc6d2c6bbafa59e9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9c9c9c9c9c9c9d9e9fa394877b6e6154483b2e211508000000000915222f3c4855626f7b8895a2aeb4b4a79a8e8174676363636363636363636363636464646464656566676868717e8a97a4b1ac9f9286796c6b7884919ea8a7a399867974808d9aa7b1a4978b7e7166707d8996a3ada99c908376695d5043362a1d1003000000000000000000000000000000000000000c1925323e4b57636d737675757575747474747373737372727272727272727272727272727272727272727272727272727272727272727272727272727272727273737374747475757677787a7b7c7d7e7b6e6154483b2e2115080000000000000c1825323e4b57636d737a7d7e716c62564c414a5764707d8a97a3aaaaaba093877a6d605447514c46443f382f27221b19130c0701000b1724313e4a5764717d8a97a4b0afafaea195887b6e6255483b2f2215080000000000000000000000000000000000000000000000000814212e3b4754616e7a879696989a9c9ea1a8a6aba39f9d9b999993908d8a8884807d7975716d6864605c54534e48443d38332d261d1a150d0801000000000000000000000000000000000000000000000000000000000000000000000000000000040c16222f3c4955626f7c8898a2adaba9a8a6a6a5a1978b7f72655b50444e5b6875818e9ba8b2b2b3b5afa296897c6f6356494444444444444545454044464747474848494a4b4b4c4d4e4947433c342a20150a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3945515d676d747a7e83878c91959b9f9a98928e8a889299a3afb9ac9f92877b6e6154473c2f29241e160d1a26313c4753606d7985929fabb8c2b8ab9e9285796e7a8797a2a4998e81746a5f53483e31281d110700000000000000000000000000000000000005111d29343e485056585d5c5c5b5b5a5a606c7985929fabb8c5c1b4a89b8e81756960595a5a5b5c5c5d5753575d676d706f6f6f6e6e6e6e6d6d6d666c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c666c6d6d6e6f706e695f575753514b43392f23180c000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b00000000000000000c17232e3a4653606d7985929fabb3b3b3b3ada197918e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8f939eaab6c3cfc3b6aa9e938f8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8f8f8f8f8f8f8f909091929995887b6e6255483b2f221508000000000815222f3b4855626e7b8895a1aebbb4a79a8d8174707070707070707070707070707070717171717273747475737d8a97a3b0ac9f92857973737784919eaaac9f92867973808d9aa6b1a4978a7e7373737d8996a3afa99c8f8376695c504336291d1003000000000000000000000000000000000000000a16232f3b46525b63666969686868686767676766666666656565656565656565656565656565656565656565656565656565656565656565656565656565656666666767676868696a6b676d6e6f70716e695e53463a2d2114070000000000000d192633404c5966737f86898a7e71685e52464a5763707d8a96a3b0b7ada093877a6d6054545e5953504a423b332d2a251e18120b030a1724313d4a5764707d8a97a3b0bcbaaea194877b6e6154483b2e2115080000000000000000000000000000000000000000000000000714202d3a4753606d798487898b8d8f9196979a9d9fa3aba8aba49f9d9a9796918d8985827e7a75706d66625f58544f46443f382f2b262019130c0400000000000000000000000000000000000000000000000000000000000000000000000000040d161d242d3a4653606d7985929fa19e9d9b9a999998989184786c6053464f5c6975828f9ca4a5a6a6a8aba396897d7063564a3d3a3a3a3a3a3a3a3a3a3a3b3b3b3b3b3c3c3d3e3f3f40413c3b37322a22180e0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7981868b8f939a9da097928d8a85827e7b87929facb9afa3998c7f7366574e42372b1e130c09141f2c3845515d6774818e9ba7b4c1b9ada297897d707c8995a99f93877b6e62584e43362c1f160c000000000000000000000000000000000000000815212d3945505a62646a696868676766666575828f9ba8b5c2c1b4a89b8e817568656667676868696964606463636363636262626161616060605c5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f60605c6060616162636263636363605c554b4034291c10040006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b000000000000000006121f2c3844515c6676828f9ca9b5c0c0b8ab9e918581828282828282828282828282828282818f9ba8b5c2cec2b5a89b8f8282828282828282828282828282828282828282828282828383838384868788877a6e6154473b2e211408000000000815222e3b4855616e7b8894a1aebbb5a89b8f817d7c7c7c7c7c7c7c7c7d7d7d7d7d7d7d7d7d7e7e7f80808182807d8a96a3b0ac9f92868080808085929eabab9f92857873808c99a6b3a89b8f81808080818e9ba8b4a89c8f8275695c4f4236291c0f030000000000000000000000000000000000000007131e2a3540495257595c5c5c5b5b5b5b5a5a5a5a5959595959595959595959595959595959595959595959595959595959595959595959595959595959595959595a5a5a5b5b5b5c5d555c6061626364615e574d42362a1e1205000000000004111e2a3744515d6a7784909992857a6e61564c4a5663707d8996a3b0b9ada093867a6d605d616a66605b544d443f38363029241d150d0a1724303d4a5763707d8a96a3b0bdbaada194877a6e6154473b2e2114080000000000000000000000000000000000000000000000000613202c3945515d676d787a7c7e808284878a8d9092999a9ea1a9abaaa7a8a19e9a98928f8b86827d79746f6a63605953504a423e373129241e160d070000000000000000000000000000000000000000000000000000000000000000000000010c161f282f353b44505c6676838f999792908e8d8c8c8b8b8a887b6e615448505c6976838f979798999a9c9ea1978a7d7064574a4747474747474747474747474748484848484949494745413a322b26201810060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a92989c9fa4ac9f9285817d7975717683909ca9b6b5ab9d9084776a5f53473a2e21140804101d2935404b5564717e8b97a8b2bdbeb3a99a8d81747d8a97a69b8f8275695f53463c31241a0d04000000000000000000000000000000000000000a1724303d4956626c71767675757474737272727f8c98a5b2bfc1b4a89b8e8175727273737475757676706d7070706f6f6f6e6e6d6d6d666c6c6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6c6c666d6d6d6e6e6f6f6f7070706d675c5145382c1f13060006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b000000000000000004101c2834404a5466737f8c99abb5c0c4b7aa9d918477757575757575757575757575757575798693a0acb9c6b9ada093867975757575757575757575757575757575757575757576767676767677797a7c7c76685e5246392d201407000000000815212e3b4854616e7b8794a1aebab6aa9e938f8989898989898989898989898a8a8a8a8a8a8a8b8c8c8d8e8d807d8996a3b0aea398928d8d8d8d9297a1adab9e918578737f8c99a6b2aa9e938f8d8d8d8e939eaab5a89b8e8275685b4f4235281c0f0200000000000000000000000000000000000000020d19242e3740464b4c4f4f4f4f4e4e4e4e4d4d4d4d4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4d4d4d4d4e4e4e4f504b51535455565854534d453b31251a0e020000000000010d1a2734404d5a6773808d9a978d8073685e52495663707c8996a3afb9ada093867a6d60686d77726c665e57504946413a352f271f150b1723303d4a5663707d8996a3b0bcbaada094877a6d6154473a2e21140700000000000000000000000000000000000000000000000004111d2935404b555d60686d6f717375787b7d8083868a8e9297999ea1a8acacabaaa29f9b99928f8a85807c76706b64605b544f47433c352f282018120b0300000000000000000000000000000000000000000000000000000000000000000007131d28313a41454d52546673808d8c8885838180807f7f7e7e7b6e695e5353535d6a76838b8a8b8b8c8d8f9297978a7e7164575353535353535353535454545454545555555555555654524c443b332a1f1409000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000000000000000000000a1723303d4a5663707d8999a2aaacafaa9d908377706d6766727f8c99a8b2b8aca095887b6e6255483b3024190d010c18242f3b4754616e7b8796a0acb8c4b8ab9e9185777f8b989f94897c6f62574d42342a20120800000000000000000000000000000000000000000b1825313e4b5864717e838382818180807f7f7e808c99a6b3bfc3b6a99c90827e7e7f808081818282837e797d7d7d7c7c7b7b7b7a7a79797978787878787878787878787878787878787878787878787979797a7a7b7b7b7c7c7d7d7d796d6053473a2d2014070006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b0000000000000000000c18232e3d495663707c8999a4afbbc5b9ac9f9286796d686868686868686868686868686d798693a0acb9c6b9ada093867a6d686868686868686868686868686868686868686969696969696a656c6d6f6f6a5e564c41362a1e1105000000000814212e3b4754616e7a8794a1adbabbafa59e9b969696969696969696969696969697979797979898999a978a7e7c8996a2afb4aaa39f999999999ea1a9b3ab9e918478727f8c99a5b2b0a69e9b9999999b9ea5afb4a79b8e8174685b4e4135281b0e02000000000000000000000000000000000000000007121c252e353b3e40434242424241414141404040403f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f40404041414142424340454748494a4b4846423b33291f1409000000000000000a1623303d495663707d89989f92867a6d61564c56636f7c8996a2afb9aca09386796d616d7a837f786e69605b53524c45403931271d121623303d495663707c8996a3afbcb9ada093867a6d6053473a2d201407000000000000000000000000000000000000000000000000010d18242f3a434b51565e6163656769696e7174767a7d8185898d91969b9fa3abadaeacaba39f9b97928d88827d76716c666159534e45413a3228231d150c0600000000000000000000000000000000000000000000000000000000000000010d18242f3a434b51575e61636f7d827f7b7876757373727271716e69606060606060626f7c7e7e7e7f7f808285888a8b7e71646060606060606060606060606161616161626262626262605d564d453b31261a0e020000000000000000000000000000000000000005040404030302020201010101000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d100300000000000000010101010202020202030303030304040404030301000000000000000000000000000714202d3a4753606d7a86929facb9b9ac9f92867a6d605c626f7b8896a1acb9b1a7998c7f7366564c4135291d11040714202d3a46525e697784919daab7c4b9ada197887b808d9a9c8f83766a6054453c3122180e0000000000000000000000000000000000000000000c1926323f4c5965727f8c8f8f8e8e8d8d8c8b8b8c929ca8b4c1c4b7ab9f94908b8b8c8c8d8d8e8f8f8b7e7c898a8989898888878787868685858584848484848484848484848484848484848484858585868687878788888889898a897c706356493d3023160a0006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b0000000000000000000714202d3a4753606d7a86939facb9c6bbafa399887c6f625b5b5b5b5b5b5b5b5b5b5b606d798693a0acb9c6b9ada093867a6d605b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5c5c5c5c5c5c5c5d535b606162625f584c443b3025190e02000000000714212e3a4754616d7a8794a0adbabfb6ada8a6a0a0a0a0a0a3a3a3a3a3a3a3a3a3a3a1a2a2a3a3a4a5a396897c7c8995a2afb2a9a19e979797979da0a7b1aa9d918477727f8c98a5b2aea49c99979797989ba3adb4a79a8e8174675b4e4134281b0e010000000000000000000000000000000000000000000a131c242a2f32333636353535353434343433333333323232323232323232323232323232323232323232323232323232323232323232323232323232323333333434343535362f34383a3b3c3d3e3b3a36312921170d03000000000000000713202d3a4653606d7985929f988d8073685e5256626f7c8995a2afb9ac9f9386796c626f7c898c827b716c65615e56514b43392f24181623303c4956636f7c8996a2afbcbbafa49986796d6053463a2d2013070000000000000000000000000000000000000000000000000007131d28313a40454c525456585a575e616467676d7074797c8084898e92999ea1a9acb2aeaca9a19e9a948f89837d78706b625f58524c443d342e271e180f0800000000000000000000000000000000000000000000000000000000000004111d2935414b555d60696e6e6e6f75726f6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6f71717172737375787b7e807b6e6d6d6d6d6d6d6d6d6d6d6d6d6d6d6e6e6e6e6e6e6f6f6f6f6d685f574d42362a1e1205000000000000000000000000000000010406071111111010100f0f0e0e0e0d0d0d0d0d0d0d0d0c0c0c0c0c0c0c0e1a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d100c0c0c0c0d0d0d0d0d0e0e0e0e0e0f0f0f0f1010101010111111100f0d0a05000000000000000000000006131f2c3945515d677683909ca9b6bbafa399897c7063565f6a7884919eabb7b6aa9d908377685d5245392c20130705111e2a36424d576774818d9aa7b4c0beb3a9978a7e818e9b978a7d7063584e43332a2010060000000000000000000000000000000000000000000a1724303d4a5763707d8a969b9b9a9a99999898999ca4aaafb7c1bcb0a69f9c979898999a9a9b9b95897c7a879996969595959494939a9392929191919191919191919191919191919191919191919292939a939494949595969699877b6e6154483b2e2115080006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b00000000000000000006131f2c3945515d677784919eaab7c4c0b5ab978b7e7164584f4f4f4f4f4f4f4f4f53606d798693a0acb9c6b9ada093867a6d60534f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f505050495053545555544e463b32291e140800000000000714212d3a4754606d7a8793a0adbab9ada49c9993939393939699a1abb0b0b0a69f9c9595969696979899978a7e7b8895a2aeada196918a8a8a8a9095a0acaa9d908377727e8b98a5b1a89c928c8a8a8a8b919ba7b3a79a8d8074675a4d4134271a0e01000000000000000000000000000000000000000000010a12191e23252629292928282828272727272626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262727272828282923292c2d2e2f30312e2d2a251f170f05000000000000000006131f2c3845515c6675828f9b9f92867a6d615556626f7c8995a2afbbafa49986796663707c899490857e78716d68605d554b4035291d16232f3c4956626f7c8995a2afbcb9ac9f938679665c5044382c1f120600000000000000000000000000000000000000000000000000010c161f282f353a414647494b4d4d525457555d6064666c6f73787d82868c91979ea1a8acb2b3adaba69e9c95908a847d766e6a605d564f454039302a221a110600000000000000000000000000000000000000000000000000000000000613202c3945515d676d787a7b7b7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7b7b7b7b7b7c7c7c7a6e695f53463a2d2114070000000000000000000000000001070d1113141e1e1d1d1d1c1c1c1b1b1a1a1a1a1a1a1a191919191919191919181a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d1818191919191a1a1a1a1a1b1b1b1b1b1c1c1c1c1c1d1d1d1d1e1e1d1c1a16100a0300000000000000000004101d2935404b5566737f8c99aab4bfb5ab998c7f736653586774818d9aabb4b9ac9f93867a6d6054473a2d211407020e1a25303e4a5764717d8a97abb4bfc0b3a69a8d8083909d9285796d6053463d3220180e000000000000000000000000000000000000000000000a1724303d4a5763707d8a969f9e9d9c9c9b9b9b9a9a9b9ea5afbabdb2a8a19e9b9c9c9d9d9e9fa295897c7986929fa2a2a2a1a1a0a0a49f9f9f9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9f9f9fa4a0a0a1a1a2a2a29f9286796c605346392d2013060006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b00000000000000000004101d2935404b556975828f9ca8b5c2c0b3a69a8d8073675a4d4a4a4a4a4a4a4a4a53606d798693a0acb9c6b9ada093867a6d60534a4a4a4a4a4a4a4a4a4a4a4a4a4a4b4b4b4b4c4c4c4c4c4d4d4647494947433c342920170d0200000000000714202d3a4753606d7a8693a0adb9b4a89c928c8686868686898f99a5b1b7ab9f948f888889898a8a8b8c8e8c7f7b8895a1aeab9e91847e7d7d7e83909daaa99c908376717e8b98a4b1a6998c807d7d7d7f8b98a5b2a6998d8073665a4d4033271a0d000000000000000000000000000000000000000000000000070d131619191c1c1c1c1b1b1b1b1a1a1a1a191919191919191919191919191919191919191919191919191919191919191919191919191919191919191a1a1a1a1b1b1b1c181c1f202122232521211e1a140d0500000000000000000004101c2834404b5465727f8b98a2988d8073675d55626f7c8895a2afb9ac9f9386796c63707d8a9697928a837e7a756d675d5145382c1f15222f3c4855626f7b8895a2aebbb9ac9f9286796c5f4a3f34281c10030000010101010100000000000000000000000000000000000000040d161d24293035393a3c3e404246474a4b5153545b6062666c70757a7f848b91969ea1a8aeb4b8b0aaa79f9d95918a827c746d686059514b433c342b2317110a020000000000000000000000000000000000000000000000000000000714212d3a4754606d798487878787878787878787878786868686868686868686868686868686868686868686868686868686868686868686868686868687878787878788888888888889877b6e6155483b2e221508000000000000000000000000040c13181d20202b2a2a2a2929292828282727272727262626262626262626252525252734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a25252525262626262727272727282828282829292929292a2a2a2a2b2a2926211c150d040000000000000000000c18242f3c4956636f7c8998a2aebab5a89c8f8275655b5763707d8a99a3aebaafa49a8a7d7063574a3d2e23180c090915222f3b4855626e7b8899a3aebac3b6a99c908284919a8d8174665c5044382c1f12090a0a0b0b0c09080603000000000000000000000000000c1925323f4c5865727f8b999291908f8f8e8e8e8d8d8e939eaab6b9aca196918e8f8f909091929794897d7a87999a99989897969695959594949493939598a0ababababababa39c9893939393939495959696979898999a9a9b9b99877a6d6054473a2d2114070006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b000000000000000000000c18242f404d5a6773808d9aa6b3c0c2b6a99c8f8276695657575757575757575757606d798693a0acb9c6b9ada093867a6d60575757575757575757575757575757575858585859595959595a53514a423937322a22170e050000000000000713202d3a4653606d798693a0b5c0b3a6998c80797a7a7a7a7d8996a3afb5a99c8f827c7c7c7c7d7d7e8081827e7b8895a1aeaa9d918477717176828f9ca9a99c8f8376717e8b98a4afa396897d7171717b8895a1aea6998c807366594d4033261a0d0000000000000000000000000000000000000000000000000002070a0c0d100f0f0f0f0e0e0e0e0d0d0d0d0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d0d0d0e0e0e0f070c101314151617181514120e090300000000000000000000000c18232e3c4956636f7c899aa49f9285796d6055626f7b8895a2aeb9ac9f9286796c64707d8a97a29f95908b8782796d6053473a2d2015222f3b4855626e7b8895a1aebbb9ac9f9286796c5f53462e23170c0d0d0d0d0d0e0e0e0c07060400000000000000000000000000000000040c13181e25292d2e303230363a3b3e4045474a5053545b6063686d72797e848b91969fa3aaafbab7b1aba7a09d948f87807a706b605c554e463d3527221b140b0200000000000000000000000000000000000000000000000000000915222f3c4855626f7b88969494949494949494939393939393939393939393939393939393939393939393939393939393939393939393939393939393939394949494949595959595998a7d7063574a3d3024170a0000000000000000000000040d161d24292c2d383737373636353535343434343333333333333333333232323232323234414d5a6774808d9aa7b3c0cdc3b6a99c908376695d50433632323232323233333333333434343435353535353636363636373737373635322d261f160d0300000000000000000713202d3a4653606d7985929facb8b8ab9f9285796c6053606d7986929facb9b6ac998d807366544b4034281c16151514202d3a4653606d7986929facb9c5b8ac9f9285879297897c7063544a3f34281c151616171818191615130f0a0400000000000000000000010e1b2834414e5b677481888786848382828281818180818e9ba8b5b7ab9e9184818283838484858687897e7c898e8d8d8c8b8a89898988888887878787888e98a4b7b7b7b7a79c918c8787878787878888898a8a8b8c8c8d8d8e8f8f887c6f6255493c2f2216090006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b00000000000000000000071825313e4b5864717e8b97a4b1bec5b8ab9e928578686464646464646464646464646d798693a0acb9c6b9ada093867a6d646464646464646464646464646464646464656565656566666666605c544a40342820191005000000000000000613202d394653606c798699a4afbbb2a5998c7f726d6d6d6f7c8995a2afb5a89b8f82756f6f70707172737476717b8895a1aeaa9d9184776a6976828f9ca9a99c8f8276717e8b98a4afa396897c70646e7b8895a1aea6998c7f7366594c403326190d0000000000000000000000000000000000000000000000000000000000000303020202020101010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101010202000004060708090a0b08070502000000000000000000000000000714212d3a4754606d7a86939fa2988b7e716458626e7b8895a1aeb8ac9f9285796c64717e8a97a4a7a09d9993887b6e6155483b2e221a222e3b4855616e7b8894a1aebbb9ac9f9286796c5f5346392c201a1a1a1a1a1a1a1a1a191413100c0701000000000000000000000000000001070d13191d20212325252a2d2e2f35393a3f44464a5053565e61676d72787e848c92989ea5adb3bbb8b1aca69e99928d847d736d675f584f473f332d261d140a00000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a8a1a1a1a1a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a1a1a1a1a1a1a2a2ab96897c706356493d3023160a00000000000000000000010c161f282f35393a444444434343424241414140404040404040403f3f3f3f3f3f3f3f3f3f3f414d5a6774808d9aa7b3c0cdc3b6a99c908376695d50433f3f3f3f3f3f3f3f4040404040414141414142424242434343434344444443423e3831281f150a000000000000000006121f2c3844505c6676828f9ca9b6baada297887b6f62555c677783909daab6b6a99c908376665c5145382c2423222121212b3844505c667784909daab7c3baaea2989292999184786c605346392e23222223232424252523221f1b160f07000000000000000000000815212e3b4854616e7b7b7a797877767575757474747d8996a3afb4a89b8e81757576767777787a7b7c7a7d828181807f7e7d7d7c7c7c7b7b7b7a7a7a7c8895a1aebbbfb2a5988c7f7a7a7a7a7a7b7b7c7c7d7e7e7f7f8081818283837c6f6255483c2f2215090006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b00000000000000000000091623303c4956636f7c8996a2afbcc6b9ada197877a7171717171717171717171717171798693a0acb9c6b9ada093867a717171717171717171717171717171717171717172727272727373736d665c5144382c1f1206000000000000000006121f2b3844505b667986939facb9b2a5988c7f726560626f7c8995a2afb5a89b8f82756863636364656668696e7b8895a1aeaa9d9184776a6976828f9ca9a99c8f8276717e8b98a4afa396897c70636e7b8895a1aea6998c7f7366594c403326190d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3945515d677784919eaa9c9083766a5f616e7b8894a1aeb8ac9f9285796c65717e8b98a4b1acab9e928578695f53473a2d2626262e3b4854616e7b8794a1aebab9ac9f9286796c5f5346392c2626262727272727272726201f1d18120b0300000000000000000000000000000002080d11131416181a1e202124292c2d3338393f44464c52555c60666d717980868f939fa2a9b0bbbcb8b0aba39f96918880796e6a605950443f382f261b1106000000000000000000000000000000000000000000000000000714212e3a4754616d7a8794abb4adadadadaea49d9a989898989898989898989898989898989898989898989898989898989898989898989898989898989898999ca4aeaeaeaeaeafa296897c6f6356493c302316090000000000000000000007131d28313a40454751515050504f4f4f4e4e4d4d4d4d4d4d4d4c4c4c4c4c4c4c4c4c4b4b4b4b4b4d5a6774808d9aa7b3c0cdc3b6a99c908376695d504b4b4b4b4b4b4c4c4c4c4d4d4d4d4d4e4e4e4e4e4f4f4f4f4f505050505151504e49433a31261c10050000000000000003101c28343f4a546673808d99a6b3beb3a9978b7e716458556874818e9ba7b4b8ac9f9286796d6053463a3130302f2e2e2e2d343f4a546875828e9ba8b5c1bfb4aaa29f9f9a8d8074665b5044382e2e2e2f2f30303132322f2e2b27201910070000000000000000000714202d3a46525e696e6e6d707d7b746d68686867707c8996a3afb4a89b8e81756f73746d67676d6e6f6d6f7675747372717170706f6f6e6e6e6d6d6e7a8794a1adbabeb1a5988b7e726d6d6d6d6e6e6f7070717172737374757576766f6a5f53473a2e2115080006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b000000000000000000000815222e3b4855616e7b8894aab4bfc2beb3a9998c7f7d7d7d7d7d7d7d7d7d7d7d7d7d7d7e8a97a4b1bdcabdb1a4978a7e7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7e7e7e7e7f7f7f7f7f8080786d6053463a2d2013070000000000000000030f1c28333f4a5f6c7986929facb9b2a5988c7f726559626f7c8995a2afb5a89b8f8275685c56575758595b626e7b8895a1aeaa9d9184776a6976828f9ca9a99c8f8276717e8b98a4afa396897c70636e7b8895a1aea6998c7f7366594c403326190d00000000000000000000000000000000000104060712111110100f0f0f0e0e0e0d0d0d0d0d0d0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d0d0d0d0d0e0e0e0e0f0f0f0f0f10101010101111110808060200000000000000000004111d2935414c556875828f9ba89f94887b6e62616e7b8794a1aeb8ab9f9285786c66737f8c99a6b2b1a79a8d807467574d423733333333333b4754616e7a8794a1adbab8ac9f9285796c5f5246393333333333333434343434322d2c29241d150d03000000000000000000000000000000000105070709090e111414181d1f22282b2d33383a41464b51545c60676d737b828a92979fa6afb5bdbdb5afa8a19a938d837c706b625a504941382d2217130a0000000000000000000000000000000000000000000000000713202d3a4653606d798699a3aebababab5a99d928d8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8d929ca8b4bbbbbbafa295887c6f6255493c2f221609000000000000000000010d18242f3a434b51535e5d5d5d5c5c5c5b5b5b5a5a5a5a5a59595959595959595958585858585858585a6774808d9aa7b3c0cdc3b6a99c908376695d5858585858585858595959595a5a5a5a5a5b5b5b5b5b5c5c5c5c5c5d5d5d5d5e5d5a544c43382d21160a00000000000000000c17232e3e4a5764717d8a97a9b3beb3a69a8d8073675a5865727f8b98acb6baaea398897c6f6256493f3e3d3c3c3b3b3a3a3a404d596673808c99a6b3bfc5bcb4aeaca499897d7063544a3f3a3a3b3b3b3c3d3d3e3e3f3c3b38322b22190f04000000000000000005121e2a36424d575e616269768286807a716c6563707c8996a3afb4a89b8e81757c8080796d606061626062696867666565646363626262616161616e7a8794a1adbabeb1a5988b7e726560606061626263636465656667676868696a625f584e43372b1f12060006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b000000000000000000000714212d3a4754606d7a8798a3aeb7b6b5b4a89c918c8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a909aa6b2bfcbbfb2a69a908a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8b8b8b8b8c8c8c8c8c887b6e6255483b2f2215080000000000000000000b17222d46525f6c7985929facb8b2a5988b7f726558626f7c8995a2afb5a89b8f8275685c4f4a4a4b4d55626e7b8895a1aeaa9d9184776a6976828f9ca9a99c8f8276717e8b98a4afa396897c70636e7b8895a1aea6998c7f7366594c403326190d00000000000000000000000000000001080d1113141e1e1d1d1d1c1c1b1b1b1a1a1a1a1a191919191919191919181818181818181818181818181818181818181818181818181818181818181818181819191919191a1a1a1a1b1b1b1b1b1c1c1c1c1d1d1d1d1d1e1e1514120f090300000000000000010d19242f404c5966737f8c99a6a69a8d807366616e7a8794a1adb8ab9f9285786c6774808d9aa7b3aca095897c6f62564940404040404040404754616d7a8794a0adbab8ac9f9285796c5f52464040404040404040404141413f3a39352f271f150b01000000000000000000000000000000000000000000020507070c1013171c1f22282b30363940454a50555d60696e757e858f949fa4abb4bcc0bbb2aca49f9590867d716c605b53493f3327251c1209000000000000000000000000000000000000000000000006131f2c3845515c667986929facb9c5c0b3a79a8d807f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f808d99a6b3c0c8bbaea295887b6f6255483c2f22150900000000000000000004111d2935404b555d606b6a6a6a69696868686767676766666666666666666665656565656565656565656774808d9aa7b3c0cdc3b6a99c9083766965656565656565656565666666666667676767686868686869696969696a6a6a6a69665e54493e32261a0d01000000000000000615222e3b4855616e7b8897a2adb9b6a99c8f8376695756636f7c899aa4afbbb4aa988c7f7265594c4b4b4a49484847474747464b5865717e8b98a4b1becec5bfb9ac9f93867a6d60544746474748484849494a4b4b4c4947433d342b20160a0000000000000000020e1a25303b454d52545d6a7783908d857e78726d707c8996a3afb4a89b8e8181898d8d80746b60545654565c555d6060605b5e5d5d5d5c5c5c5c616e7a8794a1adbabeb1a5988b7e72655b5b5c5c5c5d5d5d5e5e5b6060605c555c5d55534e463c31261a0f030006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b000000000000000000000613202c3945515d677985929fabaaa9a8a8a7a49c999797979797979797979797979797979aa2acb7c2cec3b7aca29a97979797979797979797979797979797979797979898989898999994877a6e6154473b2e211408000000000000000000121f2c3945525f6c7885929fabb8b1a5988b7e726558626f7c8995a2afb5a89b8f8275685c4f423e3f4855626e7b8895a1aeaa9d9184776a6976828f9ca9a99c8f8276717e8b98a4afa396897c70636e7b8895a1aea6998c7f7366594c403326190d0000000000000000000000000000040c13191d20212b2a2a2a29292928282727272726262626262626262625252525252525252525252525252525252525252525252525252525252525252525252525252626262626272727272828282828292929292a2a2a2a2a2a22211f1a150e0600000000000000081724313d4a5764707d8a97a3ab9e9285796d616d7a8794a0adb8ab9e9285786b6875828e9ba8b3a99d9184776a60544d4d4d4d4d4d4c4c4c4c54606d7a8793a0adbab8ac9f9285796c5f524c4c4c4c4d4d4d4d4d4d4d4d4d4c4745403931271d1207000000000000000000000000000000000000000000000000000004060b0f12171c1f252a2e34383f444b51575e616c717b828c9399a2aab2bac3beb6afa7a09892877e736c655b504440372d241b10070000000000000000000000000000000000000000000004101c2834404b546b7885929eabb8c5bcafa295897c7272727272727272727272727272727272727272727272727272727272727272727272727272727272727b8794a1aebac7bbaea194887b6e6155483b2e2215080000000000000000000613202c3945515d676d7777777676767575747474737373737373737372727272727272727272727272727274808d9aa7b3c0cdc3b6a99c908376727272727272727272727272737373737374747474747575757576767676767777777670665a4e4235291c0f03000000000000000714212d3a46535f697885929eabb8b8ab9e928578695e54606d7a86939facb9b5a89b8f82756855585857575655545454545353505764707d8a97a3b0bdcad0c3b7aa9d908477675d515353545454555556565757585856544e463d32271b0f03000000000000000009141f29333b4246505d6a77839097928b837e7a757d8996a3afb4a89b8e81828f9992897d70665c50474a545d676d6d6c656b6a6a6969696968686e7a8794a1adbabeb1a5988b7e72686868696969696a6a6b6b656c6d6d675c51504847433c342a20150a000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b0000000000000000000004111d2935414c556b7884919e9e9d9c9b9b9b9a9a9999999999999999999999999999999a9da4aeb9c5d1c5b9aea49d9a999999999999999999999999999999999c9fa6a4a5a5a5a5a5a094877a6d6154473a2e211407000000000000000005121f2c3845525f6b7885929eabb8b1a5988b7e726558626f7c8995a2afb5a89b8f8275685c4f42353b4855626e7b8895a1aeaa9d9184776a6976828f9ca9a99c8f8276717e8b98a4afa396897c70636e7b8895a1aea6998c7f7366594c403326190d00000000000000000000000000040d161e24292c2d3837373636363535353434333333333333333333323232323232323232323232323232323232323232323232323232323232323232323232323232323233333333333434343435353535353636363637373737372f2e2b2620180f060000000000000915222f3c4855626f7b8895a9ada1978a7d70646d7a8794a0adb8ab9e9285786b6976838f9ca9ada2978b7e7265585a5a5a5a5a59595959595959606d7a8693a0adb9b8ac9f9285796c5f595959595959595a5a5a5a5a5a5a5953514b43392f24180c000000000000000000000000000000000000000000000000000000000003060b0f13191d23282e343940454d535a61696e777f879298a1a8b2bac3c0bbb1aaa299928b80776c605c52493f362d22190d04000000000000000000000000000000000000000000000c18232e44515e6b7784919eaab7c4bcafa295897c6f656565656565656565656565656565656565656565656565656565656565656565656565656565656e7b8794a1aebac7baaea194877b6e6154483b2e2115080000000000000000000714202d3a4753606d7984848383838282828181808080808080807f7f7f7f7f7f7f7f7f7e7e7e7e7e7e7e7e7e828f9ca9b6c2cfc4b7aa9e91847e7e7e7e7e7e7e7e7e7e7f7f7f7f8080808080818181818182828282828383838384848276695d5043362a1d10030000000000000005121e2a36424d576976828f9ca9b5b9ada297877b6e61545d677784919eaab7b8ab9e91857867616565646363626161616060605b5f636f7c8996a2afbcc9cdc1b4a79a8e817467555b606060616161626263636465656260584e43382b1f13060000000000000000020d172129303644515e6a7784919d9e95908b8682808c99a6b3b4a89b8e817f8b9a9d9184786d60554c505c666d797a7978787776767676757575757b8794a1adbabeb1a5988b7f74747575757676767677777879797a796d6053463c3a37312a22180e03000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b00000000000000000000010d19242f43505d6a7683909392918f8f8e8e8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d929da8b5c1cec1b5a89d928d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8f949faab1b2b2b2ada093877a6d6054473a2d211407000000000000000005121f2b3845525e6b7885919eabb8b1a4988b7e716558626f7c8995a2afb5a89b8f8275685c4f42353b4855626e7b8895a1aeaa9d9184776a6976828f9ca9a99c8f8276717e8b98a4afa396897c70636e7b8895a1aea6998c7f7366594c403326190d000000000000000000000000010c161f282f35393a45444443434242424141414040404040403f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f404040404041414141424242424243434343434444443b3a37312a21180e0300000000000714212d3a4754606d7a8797a2ada99c8f8275686d7a8794a0adb8ab9e9285786b657784919daaab9f9285796d6667676767666666666666666666666d798693a0acb9b8ac9f9285796c66666666666666666666676767676765605d554b4035291d10040000000000000000000000000000000000000000000000000000000000000003080d12181c23282f353b424650575e656c727d869196a0a8b2bac3c3bcb3aba39f928d80746e635b51483f342b1f160c01000000000000000000000000000000000000000000071e2b3744515e6a7784919daab7c4bcafa295897c6f625959595959595959595959595959595959595959595959595959595959595959595959595959616e7b8794a1aebac7baaea194877b6e6154483b2e2115080000000000000000000613202d394653606c79859090908f8f8f8e8e8e8d8d8d8d8d8c8c8c8c8c8c8c8c8c8b8b8b8b8b8b8b8b8b8b8b8f949fabb7c4d0c5b9aca096918b8b8b8b8b8b8b8b8b8b8b8c8c8c8c8d8d8d8d8d8e8e8e8e8e8f8f8f8f8f909090909184786b5e5145382b1e120500000000000000020e1a2631404d5a6673808d99a6b3beb3a9968a7d706357556875828e9ba8b5b9ada196867a6d6e727271706f6f6e6e6d6d6d6c666c6c6e7b8894a1aebbc7cbbeb1a4988b7e716b6c656c6d6d6d6e6e6e6f70707171726f6a6054473b2e221508000000000000000000050f171f253845515e6b7884919ea7a09d98928e8c929ca8b4b4a89b8e817b87939f968b7f72675d5153606d788687868584848383838282828281818e9ba8b5c1c3b6a99d908381818182828283838384848585868783776a5d5044372b262018100600000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b0000000000000000000000081c2936424f5c69758288868584838281818180808080808080808080808080808080808d9aa6b3c0cdc0b3a69a8d8080808080808080808080808080808080828f9ca9b5bebfb9ada093867a6d6053473a2d201407000000000000000005121e2b3845515e6b7884919eabb7b1a4988b7e716558626f7c8995a2afb5a89b8f8275685c4f42353b4855626e7b8895a1aeaa9d9184776a6976828f9ca9a99c8f8276717e8b98a4afa396897c70636e7b8895a1aea6998c7f7366594c403326190d00000000000000000000000008131e28313a41454751515050504f4f4e4e4e4d4d4d4d4d4c4c4c4c4c4c4c4c4c4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4b4c4c4c4c4c4d4d4d4d4e4e4e4e4e4f4f4f4f505050505051514847433c332a20150900000000000613202c3945525d687885929fabac9f92867a6d6d7a8794a0adb8ab9e9285786b6c7985929faca3998d80736e73747473737373737373737373737373798693a0acb9b8ac9f92857973737373737373737373737373747474726d675d5145392c1f130600000000000000000000000000000000000000000000000000000000000000000000070c11171d242931363e454d535b606b707c849196a0a8b2bac3c5bdb5afa49c928d80736d635a50463c31281e1308000000000000000000000000000000000000000004111e2b3744515e6a7784919daab7c4bcafa295897c6f62564f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f54616e7b8794a1aebac7baaea194877b6e6154483b2e21150800000000000000000006121f2b3844505b667683909d9d9c9c9b9b9b9a9a9a9a999999999999999999989898989898989898989898989c9fa6b0bbc7d3c9bdb2a8a09e98989898989898989898989899999999999a9a9a9a9b9b9b9b9b9c9c9c9c9c9d9d9c8f8275695c4f4236291c07000000000000000000091724313e4a5764717d8a97abb5c0b2a6998c7f7366595966737f8c99a6b2bdb2a995887c6f7b7f7e7e7d7c7b7b7a7a7a7a79797978787a8793a0adbac6c8bbaea295887c7878797979797a7a7b7b7b7c7c7d7e7e7f7c6f6256493c2f2316090000000000000000000005101d2935404b556b7885929eabacaaa39f9286929facb9b4a89b8e817683909d9e92857a6d6057505c667985929392919090908f8f8f8f8e8e8e939eaab6c3c4b8ab9f95908e8e8e8e8f8f8f909090919192938e8175685b4e4235281a150e060000000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b00000000000000000000000815212e3b4854616e7b7b797877767575747473737373737373737373737373737373798693a0acb9c6b9ada0938679737373737373737373737373737373737e8b98a5b1bec6b9aca09386796d6053463a2d201307000000000000000005121e2b3845515e6b7884919eabb7b1a4988b7e716558626f7c8995a2afb5a89b8f8275685c4f42353b4855626e7b8895a1aeaa9d9184776a6976828f9ca9a99c8f8276717e8b98a4afa396897c70636e7b8895a1aea6998c7f7366594c403326190d0000000000000000000000010d19242f3a434c52545e5d5d5d5c5c5c5b5b5a5a5a5a595959595959595959585858585858585858585858585858585858585858585858585858585858585858585858585859595959595a5a5a5a5b5b5b5b5b5c5c5c5c5d5d5d5d5d5d55534e463c31261a0f020000000004111d2935414c566a7784909daaafa3998b7e716d7a8794a0adb8ab9e9285786b6e7b8798a2ac9f92877b6e7b8080808080808080807f7f7f7f7f7f7f808c99a6b3bfb9ac9f92867f7f7f7f7f7f7f7f8080808080808080807f796d6053473a2d201407000000000000000000000000000000000000000000000000000000000000000000000000060c12181f252a333b41495059616a6f7a849196a0a8b2bbc4c7c0bbaea49c928c7f726c62584e433a2f24190e050000000000000000000000000000000000000004111e2b3744515e6a7784919daab7c4bcafa295897c6f625c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c616e7b8794a1aebac7baaea194877b6e6154483b2e211508000000000000000000030f1c28333f4a546975828f9ca8a9a9a8a8a7a7a7a6a6a6a6a6a6a6a6a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a9abb0b8c2ccd8cec4bab2acaaa5a5a5a5a5a5a5a5a5a5a5a5a5a6a6a6a6a6a7a7a7a7a7a8a8a8a8a9a9a9a9a9a69a8d8073675a4d402e23180c0000000000000000000915222f3c4855626f7b8899a4afbbb5a89b8e827568545764717e8a97a4b1bdb0a4978a7d717e8b8b8a8a89888787878786868685858585929eabb8c5d1d1c5b8ab9e9285858585868686878787888889898a8a8b8b8074675a4d4134271a0e0100000000000000000006131f2c3945515d677985929facb8ada1978e818e9ba7b4b5a89b8e82757f8c99a1978d8073695e53566b7885919e9f9e9d9d9c9c9c9c9b9b9b9b9ea5afbac6c8bcb1a79f9d9b9b9b9b9c9c9c9c9d9d9e9e9f9a8d8073675a4d4034271a0a03000000000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b00000000000000000000000714202d3a46525e696e6e6d666a69686868676766666666666666666666666666666d798693a0acb9c6b9ada093867a6d6666666666666666666666666666727e8b98a5b1bec6b9aca09386796d6053463a2d201307000000000000000005121e2b3845515e6b7884919eabb7b1a4988b7e716558626f7c8995a2afb5a89b8f8275685c4f42353b4855626e7b8895a1aeaa9d9184776a6976828f9ca9a99c8f8276717e8b98a4afa396897c70636e7b8895a1aea6998c7f7366594c403326190d000000000000000000000004111d2935414c565d606b6a6a696969686868676766666666666666666665656565656565656565656565656565656565656565656565656565656565656565656565656565656666666666676767676868686868696969696a6a6a6a6a625f584e43372b1f120600000000010d19242f424f5c6975828f9ca8b5ab9c8f82756d7a8794a0adb8ab9e9285786b707d8996aaa69b8e8275727f8c8d8d8d8d8d8d8c8c8c8c8c8c8c8c8c8c929ca8b4c1baaea399928c8c8c8c8c8c8c8c8c8c8d8d8d8d8d8d8d8a7e7164574a3e3124170b0000000000000000000000000000000000000000000000000000000000000000000000000001070c141a20292f383f444f585f686e7a849196a0a9b3bcc6cbbfb6aea49c918b7e716a60564c41352920170d0200000000000000000000000000000000000004111e2b3744515e6a7784919daab7c4bcafa295897c6f696969696969696969696969696969696969696969696969696969696969696969696969696969696e7b8794a1aebac7baaea194877b6e6154483b2e21150800000000000000000005111d2a36414c566976838f9ca3a2a2a1a1a0a0a49f9f9f9f9f9f9e9e9e9e9e9e9e9d9d9d9d9d9d9d9d9d9d9d9ea1a9b3bec9d5cabfb4aaa29f9d9d9d9d9d9d9d9d9d9d9d9e9e9e9f9f9f9fa4a0a0a0a1a1a1a2a2a3a3a4a4a5a69a8d807467544a4034281c100400000000000000000713202d3a4653606d7986939facb9b7aa9d908477665b56636f7c8996aab4bfb2a6998c7f737c899697969695949494939399939292929297a1adb9c6d2d2c6b9ada29792929292929993939494949595969697978a7d7064574a3d3124170a000000000000000000000714202d3a4753606d7a8698a2aeb4aa9e91847d8a96a3b0b5a89b8f82757c8999a39f92867b6e61575d687885929b9a999897979696969595959699a1abb5c1c4b9ada49c9994949595969697979898999a9b9a8d8174675a4e4134271b0e00000000000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b00000000000000000000050f171f2a36424d575e6161605c545c5c5b5b5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a606d798693a0acb9c6b9ada093867a6d605a5a5a5a5a5a5a5a5a5a5a5a65727e8b98a5b1bec6b9aca09386796d6053463a2d201307000000000000000005121e2b3845515e6b7884919eabb7b1a4988b7e716558626f7c8995a2afb5a89b8f8275685c4f42353b4855626e7b8895a1aeaa9d9184776a6976828f9ca9a99c8f8276717e8b98a4afa396897c70636e7b8895a1aea6998c7f7366594c403326190d00000000000000000000000613202c3945525d686d7877777676757575747474737373737373727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272737373737374747474757575757576767676767777776e6a5f53473a2e2114080000000000081b2734414e5a6774818d9aa7b4ac9f92867a6d7a8794a0adb8ab9e9285786b727f8b98a59f94897c6f727f8c989a9a9a9999999999999999999999999ca4adb9c4bfb4aba39f9999999999999999999999999a9a9a9a988b7e7165584b3e3225180b00000000000000000000000000000000000000000000000000000000000000000000000000000003090e171d262d333e464e565e686e7a849197a1aab4bfcbc8bfb6ada39f92877c6f685d52453f32291e140800000000000000000000000000000000000004111e2b3744515e6a7784919daab7c4bcafa295897c7676767676767676767676767676767676767676767676767676767676767676767676767676767676767b8794a1aebac7baaea194877b6e6154483b2e2115080000000000000000000713202d3946525e687784919896959595949493999392929292929292919191919191909090909090909090909297a1adb9c6d2c6baaea298929090909090909090909091919192929292939a9393949494949595969797989899998f8276665c5144382c1f1206000000000000000006131f2c3845515c677784919eaab7b8ac9f9285796c6054616e7a8798a3aebab4a89b8e81757b8894a1a3a2a2a1a1a0a0a0a49f9f9f9e9ea1a9b3bbc5cfcbc1b7afa9a29e9e9e9f9fa3a0a0a0a1a1a1a2a3a3a295887b6f6255483c2f221509000000000000000000000815222f3b4855626e7b8895aab4aea3988c7f7d8996a3b0b5a89c8f82757a86929fa3988e8174695e606d7a878f8e8d8c8b8a8a8a8989898888898f99a5b1bdc1b4a89c928c88888889898a8a8b8b8c8c8d8e8f8e8275685b4f423528180f06000000000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b000000000000000001030d17212930363b454d52545553504a504f4e4e4e4d4d4d4d4d4d4d4d4d4d4d4d4d53606d798693a0acb9c6b9ada093867a6d60534d4d4d4d4d4d4d4d4d4d5865727e8b98a5b1bec6b9aca09386796d6053463a2d201307000000000000000005121e2b3845515e6b7884919eabb7b1a4988b7e716558626f7c8995a2afb5a89b8f8275685c4f42353b4855626e7b8895a1aeaa9d9184776a6976828f9ca9a99c8f8276717e8b98a4afa396897c70636e7b8895a1aea6998c7f7366594c403326190d00000000000000000000000714212d3a4754606d7a8484838383828281818180808080807f7f7f7f7f7f7f7f7f7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7f7f7f7f7f80808080818181818182828282838383838384837c6e6255483b2f22150800000000000d192633404c5966737f8c99a6b2aea3988a7d707a8794a0adb8ab9e9285786b74818d9aa69c9083766b727e8b98a5a6a6a6a6a6a6a39f9f9f9f9f9fa0a1a7afb8c3c5bcb4aea09f9f9f9f9f9f9f9fa6a6a6a6a6a6a7a4978b7e7164584b3e3125180b0000000000000000000000000000000000000000000000000000000000000000000000000000000000050b141b2227343c444d565e686e7b859198a3aebac0ccc8bfbaaea39991847a6d605b51443b3025190b02000000000000000000000000000000000004111e2b3744515e6a7784919daab7c4c3b6a99d9083828282828282828282828282828282828282828282828282828282828282828282828282828282828282828f9ca9b6c2c7baaea194877b6e6154483b2e2115080000000000000000000714212e3a4754616d7a878c8b8a8988888787868686868585858585858584848484848484838383838383838385929eabb8c5d1c5b8ac9f9286838383838383838384848484848585858686868687878787888889898a8a8b8c8c8d8d85796d6053463a2d201307000000000000000004101c2834404b556976828f9ca9b5baaea398877b6e6154606c7985929facb8b6a99d9083767c8895aaa29f9e9d9d9c9c9c9b9b9b9a9a9a9ea1a9b3becac6baafa59e9b9a9a9a9a9b9b9b9c9c9d9d9e9e9fa3ab95897c6f6256493c2f231609000000000000000000000a1723303d4a5663707d8996a3b0ac9f92867a7d8a96a3b0b5a99c8f82767783909daa9f92867b6e61616e7b838281807f7e7e7d7d7d7c7c7c7b7d8996a2afbcbfb3a6998c807b7b7b7c7c7d7d7e7e7f80818182838174685b4e41312921180d030000000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e010000000000000000000000000000000000000000000b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b00000000000000060c11141f29333b4246484f4e4d4c4b4b4a4a4a4949494949494949494949494949494953606d798693a0acb9c6b9ada093867a6d60534949494949494949494b5865727e8b98a5b1bec6b9aca09386796d6053463a2d201307000000000000000005121e2b3845515e6b7884919eabb7b1a4988b7e716558626f7c8995a2afb5a89b8f8275685c4f42373b4855626e7b8895a1aeaa9d9184776a6976828f9ca9a99c8f8276717e8b98a4afa396897c70636e7b8895a1aea6998c7f7366594c403326190d00000000000000000000000613202d394653606c79859090908f8f8f8e8e8d8d8d8d8c8c8c8c8c8c8c8c8c8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8c8c8c8c8c8d8d8d8d8e8e8e8e8e8f8f8f8f9090909090877a6e6154473b2e21140800000000000c1926323f4c5965727f8c98a5b2b4aa9a8d81747a8794a0adb8ab9e9285786676838f9c9f94897d7065717e8b98a4b1b3b3aba29a9793939393939393959da7b2bebfb4aaa29393939393939393939c9fa6b0b3b3b1a4978a7e7164574b3e3124180b000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a1117222a323b444d565e696f7c86929fa4aebac4d0cbbfb4aba0968e81756d62564c41362a1d140a000000000000000000000000000000000004111e2b3744515e6a7784919daab7c4c4b8ab9f95908f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f949fabb7c4c7baaea194877b6e6154483b2e2115080000000000000000000714212d3a4754606d7a807f7e7d7c7b7b7b7a7a79797979797878787878787877777777777777777777777777808d9aa7b3c0cdc3b6a99c9083777777777777777777777777787878797979797a7a7a7a7b7b7b7c7c7d7e7e7f7f808180796d6053473a2d2014070000000000000000000c18232e414d5a6774808d9aa7b3bfb4aa96897d7063565b657784919daab7b8ab9f9285787d8a95949892919090908f8f8e8e8e8d8d8d9297a1adb9c6c2b6a99e938e8d8d8d8d8e8e8f8f8f90909192929994958b7e7164584b3e3125180b000000000000000000000c1825323f4b5865727e8b98a5afa59a8e81747d8a96a3b0b6a99c8f837674818d9aa7a3998d8074685f696e777675747372717070706f6f6f6e7b8794a1adbabeb1a5988b7e726e6f6f7070717172727374757677746f64594c423b33291f14090000000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a0e0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0b1825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b0000000000000911181d2125303b454d52545c5b595858575757565656565656565656555555555555555555606d798693a0acb9c6b9ada093867a6d6055555555555555555555555865727e8b98a5b1bec6b9aca09386796d6053463a2d201307000000000000000005121e2b3845515e6b7884919eabb7b1a4988b7e716558626f7c8995a2afb5a89b8f8275685c4f4444454855626e7b8895a1aeaa9d9184776a6976828f9ca9a99c8f8276717e8b98a4afa396897c70636e7b8895a1aea6998c7f7366594c403326190d000000000000000000000005121f2b3744505b657784919d9c9c9c9b9b9b9a9a999999999999999999989898989898989898989898989898989898989898989898989898989898989898989898989898989899999999999a9a9a9a9b9b9b9b9b9c9c9c9c9d9d9d928578695e52463a2d20140700000000000b1825323e4b5865717e8b98a4b1b7aa9d9184777a8794a0adb8ab9e9285786d7985929f9c9083766b64717e8a97a4b1bdb2a69a908a868686868686868b95a1aebabaaea29889868686868686868690949fabb7bdb0a4978a7d7164574a3e3124170b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000610182029323b444d57606a717e8b929da8b2bdc7d1c6bdb2a89e938b7e72685e52463d2f261b11060000000000000000000000000000000004111e2b3744515e6a7784919daab7c4c7bcb1a79f9d9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9fa6b0bbc7c7baaea194877b6e6154483b2e2115080000000000000000000713202c3945525d686d747371706f6f6e6e6d6d6d666c6c6c6c6c6b6b6b6b6b6b6b6a6a6a6a6a6a6a6a6a6a74808d9aa7b3c0cdc3b6a99c9083766a6a6a6a6a6a6a6a6a6a6b6b6b6c6c6c666d6d6d6d6e6e6e6f6f7070717172737374746d675c5145382c1f1306000000000000000000071825323f4b5865727e8b98a5b1beb1a5988b7e726558536976828f9ca9b5baada297877a7f898887868584848383828282818181808085929eabb8c5c1b4a79b8e818080808181828282838384848586878788898174675b4e4134281b0e010000000000000000010d1a2734404d5a6773808d9aa6ab9e93887b707d8a97a3b0b6a99c908376717e8b98a4ab9f92867a6d615f616a6968676665646463636362626e7a8794a1adbabeb1a5988b7e72656262636364646565666768696a68645d55534d453b31261a0e0200000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4134271a1717171717171717171717171717171717171717171717171825323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b000000000109121b22292e3136424d575e616867666564646463636363636363626262626262626262626262626d798693a0acb9c6b9ada093867a6d6262626262626262626262626265727e8b98a5b1bec6b9aca09386796d6053463a2d201307000000000000000005121e2b3845515e6b7884919eabb7b1a4988b7e716558626f7c8995a2afb5a89b8f8275685c505151515155626e7b8895a1aeaa9d9184776a6976828f9ca9a99c8f8276717e8b98a4afa396897c70636e7b8895a1aea6998c7f7366594c403326190d000000000000000000000006131f2c3845515c677885919e9f9f9e9e9d9d9da0a8a6a6a6a6a6aba39f9b9a9a9a9a9a9a9a9fa2a9a5a5a5a5a7a09d9a9a9a9a9a9a9a9b9ea5a5a5a5a5a5a59d9a9a9a9a9a9a9a9a9b9fa2aaa7a7a7a7a8aaa39f9e9f9fa4a0a09e918578685d5245392c20130600000000000b1824313e4b5764717e8a97a4b1b5aca095877a7a8794a0adb8ab9e9285786f7c88989f94897d706364717d8a97a4b0bdb0a3978a7e797979797979798693a0acb9b8ac9f9286797979797979797982909ca9b6bdb0a3978a7d7064574a3d3124170a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060e172029323b454e58616c74818d96a0abb5c0cccfc4baafa59f92857a6e61584e41382d22170b0000000000000000000000000000000004111e2b3744515e6a7784919daab7c4c5baafa59d9a9999999999999999999999999999999999999999999999999999999999999999999999999999999999999a9da4aeb9c5c7baaea194877b6e6154483b2e21150800000000000000000004111d2935414c565d6067666563626262616160605c5f5f5f5f5f5f5f5e5e5e5e5e5e5d5d5d5d5d5d5d5d6774808d9aa7b3c0cdc3b6a99c908376695d5d5d5d5d5d5d5d5e5e5e5f5f5f5f5c606060616161616262636464656566666767605c554b4034291c10040000000000000000000a1623303d495663707c8996aab4bfb3a79a8d8074675a5a6774818d9aa7b4beb3a996897c7a7c7b7a797978777676767575757474747783909daab7c3bbaea195887c74747474747575767676777778797a7b7c7d7b6e6155483b2e22150800000000000000000005121e2a36424d576976838f9ca9a3998e8175707d8a97a3b0b6a99c908376707c8996aaaea2988c8073676265656463636262616161616060616e7a8794a1adbabeb1a5988b7e726560606161616262626363646464656565615f574d42362a1e120500000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d413427242424242424242424242424242424242424242424242424242425323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b0000000009131b242d343a3d3e46525e696e75747372717170707070706f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f798693a0acb9c6b9ada093867a6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f727e8b98a5b1bec6b9aca09386796d6053463a2d201307000000000000000005121e2b3845515e6b7884919eabb7b1a4988b7e71655c626f7c8995a2afb5a89b8f8275685d5d5d5e5e5e55626e7b8895a1aeaa9d9184776a6976828f9ca9a99c8f8276717e8b98a4afa396897c70636e7b8895a1aea6998c7f7366594c403326190d00000000000000000000000713202d3a4653606d798692999292919190909196a0acb3b3b2afa399928e8e8e8d8d8d8d8d9297a2adb1b1aca095908d8d8d8d8d8d8d8f939eaab1b1b1a99d938e8d8d8d8d8d8d8e8e9298a2aeb4b4b4aea398929292939993949493867a6d6054473a2d21140700000000000a1724303d4a5763707d8a96a3aba8a7a8978a7e7a8794a0adb8ab9e928578727f8b989c9083766b6063707d8a96a3b0bdb0a3978a7d706c6c6c6c6d798693a0acb9b8ac9f9285796c6c6c6c6c6c7683909ca9b6bcb0a396897d7063564a3d3023170a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e172029333d46505a606d79849199a4afbbc5d0ccc1baaea2988e81746a6053493f33271b0f0300000000000000000000000000000004111e2b3744515e6a7784919daab7c4c2b5a99d938e8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8d929da9b5c1c7baaea194877b6e6154483b2e211508000000000000000000010d19242f3a444c52545a59585756555554545353504a525252525252525151515151515150505050505a6774808d9aa7b3c0cdc3b6a99c908376695d505050505051515151515252524a505353545454545555565657575859595a5a5a53514b43392f23180c000000000000000003090e15212e3b4854616e7b8798a2aebab5a99c8f827669555966727f8c99a5b2bdb0a4978a7d716f6e6d6d666b6a6a696969686868676a7783909daab6c3bbaea295887b6f67676768686869696a6a6b6b676d6e6f706e695f53463a2d2114070000000000000000000714212d3a46535f697885929fa99f92867b6e717d8a97a4b0b6a99d9083766e7b8798a3aeaa9f92857a6d6e727171706f6f6e6e6e6e6d6d6d6d6e7a8794a1adbabeb1a5988b7e726d6d6d6d6e6e6e6f6f70707071717172726e695f53463a2d21140700000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d413430303030303030303030303030303030303030303030303030303030323e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b00000006101b252d363f454a4b4f54616e7b8181807f7e7e7d7d7d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7d8996a2afbcc4bcafa296897d7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c7c808d99a6b3c0cbbaada094877a6d6154473a2e211407000000000000000005121e2b3845515e6b7884919eabb7b1a4988b7e716868686f7c8995a2afb5a89b8f827569696a6a6a6b6b60626e7b8895a1aeaa9d9184776a6976828f9ca9a99c8f8376717e8b98a4afa396897c70636e7b8895a1aea6998c807366594d4033261a0d00000000000000000000000916232f3c4956626f7c88878686858584848384919daab7bfb9ac9f9287818181818080808085929fabb8b7aa9d908380808080808080818f9ba8b5beb4a79a8e81808080808181818186929fabb8c1b9ac9f92868585868687878788887d7063574a3d3024170a00000000000a1623303d495663707c8996a19e9c9a99988d817a8794a0adb8ab9e92857875828e9b94897d70635963707c8996a3afbcb0a3978a7d70646060606d798693a0acb9b8ac9f9285796c60606060697683909ca9b6bcafa396897c706356493d3023160a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e17212b343e45515d676f7d87939faab3becad6cabeb3aa9f93877c6f655b5044372b1f150a00000000000000000000000000000004111e2b3744515e6a7784919daab7c4c1b4a79a8e817f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f808d9aa7b3c0c7baaea194877b6e6154483b2e2115080000000000000000000008131e28323a4145474d4c4b4a49484848474746443f4646454545454545454444444444444444444d5a6774808d9aa7b3c0cdc3b6a99c908376695d504444444444444444454545463f44464747474748484849494a4b4b4c4c4d4e4e4745403931271d120700000000000000050d141a1e212d3a46525e697985929facb8b7aa9e918477675c5764717e8a97a4b1bdb2a5988b7f72656261605c545d5d5d5c5c5b5b5b5d6a7683909da9b6c3bbafa295887c6f625a5a5b5b5c5c5c5d5d5e555d60616263615f574d42362a1e12050000000000000000000815222e3b4855616e7b8897a2a2978d807369717d8a97a4b0b6aa9d9083776c7985929facada2978c7f727c7f7e7d7d7c7b7b7b7b7a7a7a7a79797b8794a1aebabeb2a5988b7f7879797a7a7a7b7b7c7c7c7d7d7d7e7e7e7f7b6e6155483b2e22150800000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d413d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3e4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b0000040e18222d373f485056585c56626f7c888e8c8b8b8a8a8a8989898989898989898888888888888888888888898f99a5b7b7b7b7b7a5998f89888888888888888888888888888888888d929ca8b9bbbfbaaea194877b6e6154483b2e211508000000000000000005121e2b3845515e6b7884919eabb7b1a4988b7e75757575757c8995a2afb5a89b8f8275767676777778776d676f7b8895a2aeaa9d9184776a6a76828f9ca9a99d908376727e8b98a5afa396897c706a6e7b8895a1aea69a8d8073675a4d4034271a0d01000000000000000000000613202d394653606c777b7a797978787777767e8b98a5b1beb8ac9f9285797474747473737784919eaab7b4a79a8d81747373737373737d8a97a3b0bbaea194887b737373747474747784919eaab7c1b5a89b8e81787979797a7a7b7b7c796d6053463a2d20130700000000000916222f3c4955626f7c889596918f8d8d8c8b837a8794a0adb8ab9e928578788591998f82766b6056636f7c8996a2afbcb0a3978a7d70645753606d798693a0acb9b8ac9f9285796c5f53535d697683909ca9b6bcafa296897c6f6356493c30231609000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050f19222935404b55606b74808d98a2aebac4cfd0c5bbafa49a9083786c6053463c32271b0f02000000000000000000000000000004111e2b3744515e6a7784919daab7c4bcafa295897c7373737373737373737373737373737373737373737373737373737373737373737373737373737373737b8794a1aebac7baaea194877b6e6154483b2e21150800000000000000000000010c1620282f35393a41403e3d3c3c3b3b3a3a3a38342e39393938383838383838373737373737414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043373737373737383838392e34383a3a3a3a3b3b3b3c3c3d3d3e3e3f404041413a38342f271f150b01000000000000050f171f252a2d2e36424d576a7783909daab6b9ac9f9386796d605663707c8996a3afbcb3a69a8d8073675a5453514a5150504f4f4f4e505d697683909ca9b6c3bbafa295887c6f62554e4e4f4f4f505051514b515454555655534d453b31261a0e020000000000000000000b1824313e4b5764717e8a97a79f92857a6d64717e8a97a4b1b7aa9d908477657784919eaab3a99d908377808c8b8a8a8988888887878787868686878d97a3afbcc0b3a79b918b8686868687878888888989898a8a8a8b8b8b7e7165584b3e3225180b00000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a4d4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4a4b5865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b00000a15202a343f49515a62656962616d7a879499989797979696969696969695959595959595959595959595959699a1aaaaaaaaaaaaaaa1999695959595959595959595959595959595999ca4acacaeb5afaea295887b6f6255483c2f221509000000000000000005121e2b3845515e6b7884919eabb7b6aa9d9083828282828282909ca9b6b8ab9e91858283838384848484796d6f7c8895a2afaa9d918477777777828f9ca9aa9d908477727f8b98a5afa396897d7777777b8895a1aea79a8d8174675a4e4134271b0e010000000000000000000005121f2b3744505b656c6e6d6d666c6b6b6a727e8b98a5b1beb8ac9f9285796c676767676b7784919eaab7b4a79a8d81746767676767707d8a97a3b0bbaea194887b6e67676767676b7784919eaab7c1b5a89b8e82756c666d6d6d6e6e6f6d665c5145382c1f130600000000000815222e3b4855616e7b888a87858281807f7e7b7a8794a0adb8ab9e92857879858c90877c6e625956626f7c8995a2afbcb0a3978a7d70645753606d798693a0acb9b8ac9f9285796c5f52505d697683909ca9b6bcafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000071018242f39434f59616d7a85929fa9b2bdc9d5ccc0b6ac9f958a7d7064584e43372b1f1409000000000000000000000000000004111e2b3744515e6a7784919daab7c4bcafa295897c6f666666666666666666666666666666666666666666666666666666666666666666666666666666666e7b8794a1aebac7baaea194877b6e6154483b2e2115080000000000000000000000040d161e24292c2d343332302f2f2f2e2e2d2d2b28232c2c2c2c2c2b2b2b2b2b2b2a2a2a2a34414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a2a2a2a2b2b2b2c2c23282b2d2d2d2e2e2e2e2f2f3031313232333334342d2c29231d150d03000000000000020b17212931363a3b3b424e5b6875818e9ba8b4bbafa499887b6e6255626e7b8895aab4bfb4a89b8e8175685b4e46444044434343424243505c6976838f9ca9b6c2bcafa295897c6f625649414242434343444441454748494a4846423b332a1f140900000000000000000006121e2b37424e576774818e9a9f958c7f726864717e8a97a4b1b7aa9d9184776a7783909daaa9a6a095887b7f8c989796969595949494949393939394979fa9b4c0c3b8ada39b989393939394949495959596969797979895887c6f6255493c2f22160900000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d8074675a575757575757575757575757575757575757575757575757575757575757575757575865717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b00030f1b26323c46515b626d71766f6a6d7a8693a0a2a2a1a0a39f9f9f9e9e9e9e9e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9e9e9e9f9f9fa3aba2a4a296897c6f6356493c30231609000000000000000005121e2b3845515e6b7884919eabb7b8aca095908f8f8f8f8f90949fabb2b2ada197918f8f9090909191887b6e6f7c8996a2afac9f92868383838386929fabaa9e918477727f8c99a5b2aa9d918483838383909daab4a79b8e8174685b4e4135281b0e0200000000000000000000030f1b27333f49535b606160605c545e5e65727e8b98a5b1beb8ac9f9285796c5f5a5a5e6b7784919eaab7b4a79a8d8174675a5a5a64707d8a97a3b0bbaea194887b6e615a5a5a5e6b7784919eaab7c1b5a89b8e8275685c606061616162605c544b4034281c100400000000000713202d3a4653606d787f7d7a7875747372716e7a8794a0adb8ab9e9285786d7a7f837f726a5f5356626f7c8995a2afbcb0a3978a7d70645753606d798693a0acb9b8ac9f9285796c5f52505d697683909ca9b6bcafa296897c6f6356493c30231609000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d28313d46525e68727f8c96a1adb9c6d1d2c7beb1a79c8f83766a6054473b30251a0e020000000000000000000000000004111e2b3744515e6a7784919daab7c4bcafa295897c6f625959595959595959595959595959595959595959595959595959595959595959595959595959616e7b8794a1aebac7baaea194877b6e6154483b2e211508000000000000000000000000040c13191d202127262524232222212120201f1c171f1f1f1f1f1f1e1e1e1e1e1e1e1d2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d1e1e1e1e1e1f1f171c1f202021212121222223232424252626272727201f1c18120b03000000000000000a141d29333b42464848474d596673808c99a6b3c0b5ab978a7d706457606d7a8798a2aebab6a99c8f8376695c504338342e373636363643505c6976838f9ca9b6c2bcafa296897c6f6356493c3535363637372f35393a3b3c3d3b3a36312a21180e030000000000000000000814212e3a47535f6a7884919e999083786d6064717e8b97a4b1b7aa9e9184776b76838f9c9f9d9a98978c7f7f8b98a3a2a1a0a0a39f9f9e9e9e9d9d9ea0a8b2bdc9c9beb3a9a19e9d9d9d9e9e9f9fa3a0a0a1a1a2a3a4a195887b6e6255483b2f22150800000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d80746763636363636363636363636363636363636363636363636363636363636363636363636365717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b0006121f2b37434e58626d727e827c746e7a8794969695949499929292929191919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191929292999496979996897d7063564a3d3023170a000000000000000005121e2b3845515e6b7884919eabb7bcb1a7a09d9b9b9b9b9b9c9fa6a5a5a5a5a9a19e9c9c9c9d9d9d95887b6e707d8996a3afaea39892909090909298a2aeab9e918578737f8c99a6afaca096919090909095a0acafa89b8e8275685b4f4235281c0f0200000000000000000000000b17222d3841495053555453514b525865727e8b98a5b1beb8ac9f9285796c5f52515e6b7784919eaab7b4a79a8d8174675a4e5764707d8a97a3b0bbaea194887b6e61554d515e6b7784919eaab7c1b5a89b8e8275685b53545454555553514b42392e23180c000000000003101c28343f4a545c666d72706e6869676665646d7a8794a0adb8ab9e928578686d7376726d62584e56626f7c8995a2afbcb0a3978a7d70645753606d798693a0acb9b8ac9f9285796c5f52505d697683909ca9b6bcafa296897c6f6356493c302316090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f2a36414c56606d7984919eaab4bfcbd7d0c2b7ab9f94887c6f62574d42362a1e11050000000000000000000000000004111e2b3744515e6a7784919daab7c4bcafa295897c6f62564f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f4f54616e7b8794a1aebac7baaea194877b6e6154483b2e2115080000000000000000000000000001080d1113141a1918171615151514141312100b131212121212121211111111111a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d111111111212120b10121314141414151515161617181819191a1b1b1413100c07010000000000000006111b262f3b454d53545453515764717e8a97a4b1bdb2a5988c7f7265595d677985929facb8b7aa9e9184776b564c4135343331302e2d36434f5c6976828f9ca9b5c2bcafa296897c6f6356493c302929292a2a24292c2d2e2f302e2d2a261f180f06000000000000000000000815222f3b4855626e7b88969f92867c6f665c64717e8b97a4b1b7ab9e9184786b75828f9992908d8b8a88817f8c98979694939399929292919191919196a0acb9c5c6b9ada197929191919192929299939494959596979895897c6f6256493c2f23160900000006121f2c3945525f6c7885929fabb8c5cdc0b3a79a8d80747070707070707070707070707070707070707070707070707070707070707070707070707070717e8b98a4b1becbcbbeb1a4988b7e7165584b3e3225180b000815212e3b47535f6a727f8b8f8981797d8a8a8a89888887868685858585858484848484848484848484848484848484848484848484848484848484848484848484848484848484848484858585868687898a8c8e8a7d7164574a3e3124170b000000000000000005121e2b3845515e6b7884919eabb7baafa59e9b98989898989898989898989898989ea0a8a9a9aaa195887b6e707d8a96a3a2a2aaa39f9d9d9d9d9fa2aaa1a29f92857873808d99a3a2a2a8a09d9d9d9d9da0a7a2a3a39c8f8275695c4f4236291c0f03000000000000000000000006111b262f383f444648474645404b5865727e8b98a5b1beb8ac9f9285796c5f52515e6b7784919eaab7b4a79a8d8174675a4e5764707d8a97a3b0bbaea194887b6e615548515e6b7784919eaab7c1b5a89b8e8275685b4f47474848484645403930271d1207000000000006121f2b3844505c666d6d66676562605b5359616d7a8794a0adb8ab9e9285786b616c70706c625f5756626f7c8995a2afbcb0a3978a7d70645753606d798693a0acb9b8ac9f9285796c5f52505d697683909ca9b6bcafa296897c6f6356493c30231609000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d1925303a45515d67737f8c98a3aebac7d3d3c7bbb0a69b8e8175695e52463a2d2014080000000000000000000000000004111e2b3744515e6a7784919daab7c4bcafa295897c6f625b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b616e7b8794a1aebac7bbaea194887b6e6155483b2e221508000000000000000000000000000000010407070e0d0b0a090908080707070603000006060505050505050504040e1a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d100404050505000003060707070708080809090a0a0b0b0c0d0d0e0e070604000000000000000000000b17222d38414d575e6161605d55626f7c8895a9b2bdb4a79a8e8174675b556b7784919eaab7b8ac9f928579685d524542413f3e3c3b3937434f5c6976828f9ca9b5c2bcafa296897c6f6356493c30231c1d1d1e181d202121222322211e1a140e0600000000000000000000000a1724303d4a5763707d8a90938c7f726a5f5465717e8b98a4b1b8ab9e9185786b74818d8a8683807f7d7c79818c8b8a89888786868685858584848484919eaab7c4c5b8ab9e928584848484858586868787878889898a8b8c8a7d7064574a3d3124170a00000006121f2c3844515c667986929facb9c5ccc2b5a89b8f817d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d808d9aa7b3c0cdcbbeb1a5988b7e7265584b3f3225180c000915222f3c4855626f7c86929c938e847d7e7e7d7c7b7b7a79797978787878787a7e7a777777777777777777777777777777777777777777777777777777777777777777777c7b7777777878787979797b7c7e7f81827c6f6255483c2f221509000000000000000005121e2b3845515e6b7884919eabb7b6aa9e938e8b8b8b8b8b8b8b8b8b8b8b8b8b8b9196a0acb6aea195887b6e717d8a979696959594949393939393949494959792867973808d97969695949493939393939494959697978f8376695c504336291d10030000000000000000000000000a141d262d3337393b3a3a383f4b5865727e8b98a5b1beb8ac9f9285796c5f52515e6b7784919eaab7b4a79a8d8174675a4e5764707d8a97a3b0bbaea194887b6e615548515e6b7784919eaab7c1b5a89b8e8275685b4f423a3b3b3c3a38342e271e150b0000000000000713202d3a4653606d78797674716f6c656562616d7a8794a0adb8ab9e9285786b64707e7d766e69605d626f7c8995a2afbcb0a3978a7d70645753606d798693a0acb9b8ac9f9285796c5f52505d697683909ca9b6bcafa296897c6f6356493c302316090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e2935404b55616d7a86929facb9c5cfd8cdc2b9ac9f92867b6e6154473b3025190e0200000000000000000000000004111e2b3744515e6a7784919daab7c4bcafa295897c6f686868686868686868686868686868686868686868686868686868686868686868686868686868686e7b8794a1aebac7bbaea195887b6e6255483b2f2215080000000000000000000000000000000000000001000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d10030000000000000000000000000000000000000000000000000101000000000000000000000000030f1b27333f49535e696e6e6d676b6a6d7a8696a1adb9b6a99c9083766965656976838f9ca9b6baaea298877a6d6054514f4e4c4b494746443f4f5c6976828f9ca9b5c2bcafa296897c6f6356493c3023161010070d1113141516171514120e09030000000000000000000000000916232f3c4855616b717e838881786d60585865717e8b98a4b1b8ab9e9285786b707d807d7a767372716f717e7f7e7d7c7b7a7979797978787877777b8894a1aebbbfb2a5988c7f77777778787879797a7a7b7b7c7d7e7e7f807c6f6255483c2f2215090000000713202d3a4653606d798699a3aebac0bfbfb6aa9e938f8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8d929da9b5c3c4c5beb2a5988b7f7265584c3f3225190c000d1a2734404d5a6773808d939e9d9691877f78706f6f6e6d6d676c6c6b6b6b717e8a857f79736e6a6a6a6a6a6a6a6a6a656c747e847e756e686a6a6a6a6a6a6a6a6a6a6d798686827c77736f6d66666d6e6f717374756f6a5f53473a2e211508000000000000000005121e2b3845515e6b7884919eabb7b5a89b8e817f7f7f7f7f7f7f7f7f7f7f7f7f7f84919eaab7aea195887b6e707d8a8a8989888887878787878787878788898a8b867973808a8a89898888878787878787878788898a8b8c8276695c504336291d1003000000000000000000000000020b141b22272b2d2e2d2d323f4b5865727e8b98a5b1beb8ac9f9285796c5f52515e6b7784919eaab7b4a79a8d8174675a4e5764707d8a97a3b0bbaea194887b6e615548515e6b7784919eaab7c1b5a89b8e8275685b4f42352e2e2f2d2c28231d150c03000000000005111e2a36414c566875818683817e7b7975726f6d6d7a8794a0adb8ab9e9285786b6875818a827b736d68646f7c8995a2afbcb0a3978a7d70645753606d798693a0acb9b8ac9f9285796c5f52505d697683909ca9b6bcafa296897c6f6356493c3023160900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c18242f3946525e6874818e9ba9b3becad6d3c7bbaea3998c7f7265564d41362a1e110500000000000000000000000005111e2b3844515e6b7784919eaab7c4bcafa295897c7575757575757575757575757575757575757575757575757575757575757575757575757575757575757b8794a1aebac7bbaea295887b6f6255483c2f2215090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d1003000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3744505b656e7b7b7a797776757885919eabb8b8ab9e9185787272727275818e9ba8b4bfb4aa95887b6e625c5e5c5a595756545350494f5c6976828f9ca9b5c2bcafa296897c6f6356493c3023160f0b060404060708090a0807050200000000000000000000000000000714202c38444f59616c71777b786d665c505865727e8b98a5b1b8ab9f9285786c6b7073706d67676564626c717371706f6e6d6d6c656c6b6b6b6a6f7b8895a2aebbbfb3a6998d80736a6a6b6b6c666d6d6d6e6e6f70717272736f6a5f53473a2e2115080000000714212d3a4754606d7a8793abb4b3b3b2b2b2b0a69e9b969696969696969696969696969696969696969696969696969696969696969696969696969696969a9da4aeb6b6b7b9bab2a5998c7f7266594c3f3326190c000713202d3a4653606d78818e939ea099928c81796e696161605c555f5f5e66737f8c928c84807b7773706d67605b54606c77818a918b827a706b625b5e5e5e5e5e5e626f7b88938f8984807c797774716e6964666769625f584e43372b1f1206030000000000000005121e2b3845515e6b7884919eabb7b1a4988b7e727272727272727272727272727683909ca9b6aea195887b6e6d797d7d7d7c7c7b7b7a7a7a7a7a7a7a7b7b7c7d7f7e716e7a7d7d7d7c7b7b7a7a7a7a7a7a7a7b7b7c7d7e7f7d706356493d3023160a0000000000000000000000000000020a11171b1f20222125323f4b5865727e8b98a5b1beb8ac9f9285796c5f52515e6b7784919eaab7b4a79a8d8174675a4e5764707d8a97a3b0bbaea194887b6e615548515e6b7784919eaab7c1b5a89b8e8275685b4f4235282222201f1c18120b030000000000000714202d3946525e68788592908d8b8885827f7c79767a8794a0adb8ab9e9285786b6976828f8f867f7a75706f7c8995a2afbcb0a3978a7d70645753606d798693a0acb9b8ac9f9285796c5f52505d697683909ca9b6bcafa296897c6f6356493c3023160900000000000000020608080b0a0a0a090909090808080707070603000005050404040404040404040404040404040404040404040007121d2a36414c5663707d8997a2adb9c6d2d7cbbfb5ab9c908376685e5246392d20140700000000000000000000000005121f2c3845525f6b7885929eabb8c5c2b6a99c8f82828282828282828282828282828282828282828282828282828282828282828282828282828282828282828f9ca8b5c2c8bbafa295887c6f6255493c2f2216090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d100300000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c78868786858483828185919eabb8b9ada1978c7f7f7f7f7f7f82909ca9b6bcb0a396897d7063696a696766646361605b53595c6976828f9ca9b5c2bcafa296897c6f6356493c30231f1c1713110d070501000000000000000000000000000000000000000004101c28333e47505a6164696e6d665c544a5865727e8b98a5abacac9f9285796c60636763605d5558575a616466656463616060605b5f5f5e5e626f7c8995a2afb1b2b4a79a8d8174675e5e5f5f5c6060616162626364656667625f584e43372b1f12060000000815212e3b4854616e7b8794a1a7a6a6a6a6a6a6a5a5a5a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a7a8a8a9a9aaabacaeb4a6998c7f7366594c403326190d0006121f2c3844505c666d78818e949fa39f938f837b6f6a615a514b52525b6874818e9b97918d8883807d7a756c665b6773808d939d948f857d726d605c544b51515764717e8a979b95918c898683817e7b6e61595b5c55534e463c31261b15130f0a04000000000005121e2b3845515e6b7884919eabb7b1a4988b7e716565656565656565656565697683909ca9b6aea195887b6e676d7070706f6f6e6e6d6d6d6d6d6d6d6e6e6f7072716c686e7170706f6f6e6e6d6d6d6d6d6d6e6f70707172706b6054483b2f22160900000000000000000000000000000000060b0f1213151825323f4b5865727e8b98a5b1beb8ac9f9285796c5f52515e6b7784919eaab7b4a79a8d8174675a4e5764707d8a97a3b0bbaea194887b6e615548515e6b7784919eaab7c1b5a89b8e8275685b4f4235281c151313100c0700000000000000000814212e3b4754616e7a87979d9a9897928f8c898582808d9aa6b3b8ab9e9285786b6a76839098928c86827d797c8995a2afbcb0a3978a7d70645753606d798693a0acb9b8ac9f9285796c5f52505d697683909ca9b6bcafa296897c6f6356493c30231609000000000003090e121415171717171616161515151414141312100c06121111111111111111111111111111111111111111111111110d1925303a4653606d7985929eabb8c5d1dcd1c6b9ac9f93877b6e6154473b2e23180c00000000000000000000000006121f2b3844505c667985929facb8b8b8b8ab9f948f8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8f949eaab7bcbdbcafa295897c6f6256493c2f2316090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d1003000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3744505b65778490989291908f8e9197a1adb9beb3a99c918c8c8c8c8c8c90949fabb7bdb1a4978a7e716d7677757472716f6e6c656866646976828f9ca9b5c2bcafa296897c6f6356493c2e2d2b2822201d1813110d0803000000000000000000000000000000000000000b16212c353e485055575f62605c544a4c5865727f8b989e9e9fa39f9286796c5f565a5754514b4c4a5055575958575655545353504952525663707c8996a3a4a4a5a7a89b8e8175685b51524a50535454545556565758595a55534e463c31261b0f030000000815222f3b4855626e7b88959a9a9a99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999a9a9b9b9c9c9d9e9fa3aaa2998d8073665a4d4033271a0d0003101c28343f4a545c666d78828f95a0a59e9590857c716c625b51484b55697683909ca19e9995908d8a8681786c60626f7c86929a9e9792877f746d665c554b49536773808d9aa7a09d999992908d8b8376695c504f4847433c342a2823221f1b150f070000000005121e2b3845515e6b7884919eabb7b1a4988b7e71655858585858585858585d697683909ca9b6aea195887b6e62606464636365696868686868686868676767676767676767676767676768686868696969696a69636464656360594f44382c2013070000000000000000000000000000000000000305060c1825323f4b5865727e8b98a5b1beb8ac9f9285796c5f52515e6b7784919eaab7b4a79a8d8174675a4e5764707d8a97a3b0bbaea194887b6e615548515e6b7784919eaab7c1b5a89b8e8275685b4f4235281c0f070604000000000000000000000a1623303d495663707c8996a9a7a9a29e9b9898928f8d929ca8b5b8ab9e9285786b6a7784919d9f98928e8a837c8995a2afbcb0a3978a7d70645753606d798693a0acb9b8ac9f9285796c5f52505d697683909ca9b6bcafa296897c6f6356493c3023160900000000060e151a1e212224242423232322222221212120201f1c171f1f1e1e1e1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1f2c3844505c6674818e9ba7b4c1cfdad4c8bbafa49a8b7e7265544a4034281c100400000000000000000000000713202d3a4653606d798698a3acacababababa69f9c9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9c9ea6b0aeafb0b2afa296897c6f6356493c302316090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d9aa7b3c0cdc3b6a99c908376695d5043362a1d10030000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27333f49536875828f9b9f9e9d9c9a9ea1a9b3bec4bbada39c9998989898989c9fa6b0afb0b2a5988b7f7279828482817f7e7c7b79777573716f76828f9ca9b5c2bcafa296897c6f6356493f3c3938332d2c2924201e19130f0b06000000000000000000000000000000000005101a232c363e45494d535553514a424c5865727f8b909191929998928679665b504d4a4745413f3e45494b4c4b4a4948474646443f454a5663707d8996969798999a9d9c8f8275695c4f453f444647474848494a4b4b4c4d4847433c342a20150a000000000916232f3c4956626f7c898e8e8d8d8d8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8d8e8e8f8f90909192989495978d8073675a4d4034271a0d00000c17232e38424a545c666d79839097a1a7a09791867e726d625a50515d677884919eababa7a09d9a958f8275665b606a717e88939fa299928b81786d675d55505b6576828f9ca9acaaaba39f9892867d6f635649423c3a37313334352f2e2b272019100700000005121e2b3845515e6b7884919eabb7b1a4988b7e7165584c4c4c4c4c4c4c505d697683909ca9b6aea195887b6e62555757626d727575757575757574747474747474747474747474747474747575757576767676766f6a5f5956544f473d33271c10040000000000000000000000000000000000060d1215181925323f4b5865727e8b98a5b1beb8ac9f9285796c5f52515e6b7784919eaab7b4a79a8d8174675a4e5764707d8a97a3b0bbaea194887b6e615548515e6b7784919eaab7c1b5a89b8e8275685b4f4235281c0f02000000000000000000000005111e2a36414c5666727f8c99a5b2b3adaba8aaa29f9c9a9ca4aeb9b8ab9e9285786e697885919eaaa39f9b91847c8995a2afbcb0a3978a7d70645753606d798693a0acb9b8ac9f9285796c5f52505d697683909ca9b6bcafa296897c6f6356493c30231609000000060f1820262b2e2f31313030302f2f2f2e2e2e2d2d2d2c28232c2b2b2b2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a28343f4a5464717d8a97a9b3bec9d5d8ccc0b6ac9c8f8276665c5144382c1f120600000000000000000000000714212d3a4754606d7a87939f9f9f9f9e9e9e9e9e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9e9e9f9fa3a0a1a2a4a5a7a396897c706356493d3023160a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2734414e5a6774818d9aa7b4c0cdc3b6a99d9083766a5d5043372a1d1004000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404b546874818e9ba5a4a3a2a1a1a4a9b1bbccc0b5aba49f9f9f9f9fa3a0a0a0a1a2a3a5a6998d80737f8b918f8d8c8a8987858382807e7c7a828f9ca9b5c2bcafa296897c6f6356504a4946443f3a39352f2d2a251f1c17110a020000000000000000000000000000000008111a242c33393c4247484644403d4a5764707e8483848586898b8e86796c6053463d3a39352f34393d3e403e3d3c3b3a3a3937333c4955626f7c8789898a8b8c8e90929083766a5d504334383a3a3a3b3b3c3d3e3f3f403c3a37312a22180e04000000000815212e3b4854616e7b8181818180807f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f808081818282838384868788898a8b8174685b4e4135281b0e000006111c263038424a545d676e7b85929ea5a9a19892887f726c625a53606d7a86939facb5afa59e9590837a6d615458616c73808d959fa39f938e82796d675d55606c7985929eabb8afa8a09792867d706b6054483e3e3e3f3f4041413c3b37322b22190f04000005121e2b3845515e6b7884919eabb7b1a4988b7e7165584b3f3f3f3f3f43505d697683909ca9b6aea195887b6e62554c5965727f8282828282818181818181818181818181818181818181818182828282838383827c6f62554948443d352b21160b00000000000000000000000000000000010911181e2224252b323f4b5865727e8b98a5b1beb8ac9f9285796c5f52515e6b7784919eaab7b4a79a8d8174675a4e5764707d8a97a3b0bbaea194887b6e61554a515e6b7784919eaab7c1b5a89b8e8275685b4f4235281c0f0200000000000000000000000714202d3946525e687683909da9aeaeadb6b5b4aeaca9a6a8aeb5b6b7ac9f92867f7b767985929facaea2988c7f7c8995a2afbcb0a3978a7d70645959606d798693a0acb9b8ac9f9285796c5f59595d697683909ca9b6bcafa296897c6f6356493c302316090000030e18212a31373a3b3e3d3d3d3c3c3c3c3b3b3b3a3a3a38342e3838383737373737373737373737373737373737373737373737373737372e3b4854616e7b8797a1adb9c6d2ddd2c5b8ac9f9286796d6053463a2d20130700000000000000000000000815212e3b4854616e7b87969292929292919191919190909090909090909090909090909090909090909090909090909090909090909090909090909090919192929993949697989a9b96897d7063564a3d3023170a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1b2834414e5b6774818e9aa7b4c1cdc3b6aa9d9083776a5d5044372a1d1104000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c6677839099989796959494989fa9bdc6bbafa499939292929299939394949597989a9a8e8175828e9b9c9a9997969892908e8c8a888787939facb9c6bcafa296897c6f63605c545553504a4745413a3936302b28221c140b020000000000000000000000000000000008121a22282d31373a3b3a38343c4955616c7077777778797c7e818175665b5044382d2c2924282d3031333231302e2d2d2d2b2e3b4754606a767b7c7c7d7e7f8183858883776a5e5144372c2d2d2e2e2f2f30313233342f2e2b262018100600000000000714202d3a46525e696e757574747373737373737272727272727272727272727272727272727272727272727272727272727272727272727272727272737374757576767778797a7b7c7d7e7d6f6356493c302316090000000a151e263038424b555e69707d8a939da8aaa29a93887f716c625a63707d8a99a4afaba49f938e837a6d685e52505a606d78839099a3a59d948f82796d675d636f7c8997a1adaea59e9591857d706b61594f4a4a4b4b4c4c4d4d4e4947433d342b20150a000005121e2b3845515e6b7884919eabb7b1a4988b7e7165584b3e3232323643505d697683909ca9b6aea195887b6e6255525f6b78858f8f8f8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8f8f8f8f90908c7f7265594c3f38332b23190f05000000000000000000000000000000020a131b23292e313238323f4b5865727e8b98a5b1beb8ac9f9285796c5f57575e6b7784919eaab7b4a79a8d8174675a575764707d8a97a3b0bbaea194887b6e615757575e6b7784919eaab7c2b5a89b8f8275685c4f4235291c0f0200000000000000000000000814212e3b4754616e7a87939fa1a1a1a1a9abb1b5afaca6a6a7a8a9aaaca399928c88837f8b98a2aeac9f92867a7c8995a2afbcb0a3978a7d70656565656d798693a0acb9b8ac9f9285796c65656565697683909ca9b6bcafa296897c6f6356493c3023160900000915202a333c4247484a4a4a4a49494948484847474746443f45454544444444444444444444444444444444444444444444444444444444444446535e697885929eabb8c5d1ded3c7baaea398887c6f6255493c2f22160700000000000000000000000714202d3a4753606d798486868585858585858484848484838383838383838383838383838383838383838383838383838383838383838383838383838484858586868787898a8c8d8e90897d7063564a3d3023170a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1b2835414e5b6874818e9ba7b4c1cec3b6aa9d9083776a5d5044372a1d110400000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d79868d8c8b8a898888888d98abb4bfb9ac9f9387858585868686878787898a8b8d8e8f82778491989b9fa2aaaaa29f9d9b999795999399a4afbbc7bcafa296897c726f6d666562605b5454514b4746413a38332d261d140a00000000000000000000000000000000000810171d1f262b2e2f2d2c2d3944505a61646a6a6b676d6f7274756f65544a3f3328201d181d21232426252423222120201f2b37434e5860696e6f707171727476797b7b6e6155483b2e22202121212223232425262722211f1b150e0600000000000005121e2a36424d575e61686867676766666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666767686869696a6b676d6e6f70716f6b6054483b2f221509000000030c151e26303a434d56616c74818e96a0abaca49a93887e716c616773808d9aaba8a199938c81796d685e565758585c666e7b86929fa9a69e948f82796d666674808d9aa9aaa29f938f837b706b615956565757575858595a5a5b56544e463d32271b0f030005121e2b3845515e6b7884919eabb7b1a4988b7e7165584b3e32252a3643505d697683909ca9b6aea195887b6e6255515e6b7884919b9b9b9b9b9b9b9b9a9a9a9a9a9a9a9a9a9a9a9a9a9a9b9b9b9b9c9c9c9c988c7f7265594c3f322721191107000000000000000000000000000000000a141c252d343a3e3f453f3f4c5965727f8c98a5b2bfb8ac9f9285796c646464646b7784919eaab7b4a79a8d81746764646464707d8a97a3b0bbaea194887b6e64646464646b7784919eaab7c2b5a99c8f8276695c4f4336291c100300000000000000000000000b1825323e4b5865717e8b9a95949494949d9fa7aba49f99999a9b9c9e9fa2a39f9995908b919baab0a69a8e81747c8995a2afbcb0a3978a7d727272727272798693a0acb9b8ac9f9285797272727272727683909ca9b6bcafa296897c6f6356493c3023160900020e1a26313c454d53555757575656565555555454545353504a525252515151505050505050505050505050505050505050505050505050505050504d576975828f9ca8b5c2cfdbd6cbbfb4aa988b7e7265584b3f2f24180d01000000000000000000000613202c3945515d676d7879797979787878787877777777777777777777777777777777777777777777777777777777777777777777777777777777777777787879797a7b7c7d7f808283837b6e6154483b2e2115080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020f1c2835424f5b6875828e9ba8b5c1cec3b7aa9d9084776a5d5144372a1e110400000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7981807f7e7d7d7c7b7b8899a3aebab7aa9d918479797979797a7a7a7b7c7d7f8082837e7581878b8f92989a9da0a7a8a8a6a4aba49fa4abb5c0ccc3b6a99c90827f7c7975726f6c6664605d5554524c46443f382f261c11060000000000000000000000000000000000060c11151a1e2122201f28333e485055575e5d555c6062656768655d5342382d2217110d1115171819181716151413131b27323c464e575e61636364656667656c6e6e695f53463a2d21131414151516171818191a1515120f0a0400000000000000020e1a25303b454d52545c5b5b5a5a5a595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959595a5b5b5c5c5d5d555d60616264656360594f43382c1f130700000000030c151e28313b44505a606d79849199a4afaca49a93877e716c6a7784919da79f9691877f756d6763636464646566666974808d97a2ada69f948f82786d6c7884919ea8a198928b81796e6962626363636364646465666667686260584e43372b1f13060005121e2b3845515e6b7884919eabb7b1a4988b7e7165584b3e32252a3643505d697683909ca9b6aea195887b6e6255515e6a7784919da8a8a8a8a59e9b9797979797979797979797979797999ca3a8a8a9a9a5988c7f7265594c3f3226190f070000000000000000000000000000000008111c262e373f464a4c524b4a4c5966727f8c99a5b2bfb8ac9f9285797171717171717784919eaab7b4a79a8d81747171717171717d8a97a3b0bbaea194887b717171717171717784919eaab7c3b6a99c908376695d5043362a1d100300000000000000000000020f1b2835424e5b6875818888888887878790959fa499938d8c8d8f909192989597999b9c989ba3adab9f94887c6f7c8995a2afbcb4a79b8e817f7f7f7f7f7f7f8c99a5b2bfb9ac9f92867f7f7f7f7f7f7f7f84919eabb7bcafa296897c6f6356493c302316090006121e2b37424d575f6264646363636262626161616060605c5f5f5f5e5e5e5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d6774808d9aa7b3c0cddadcd0c1b4a89b8e817568554b4035291d10040000000000000000000004101d2935404b555d606b6c6c6c6c6c6b6b6b6b6b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6b6b6c666d6d6e6f7172747576776e695e52463a2d2014070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020f1c2935424f5c6875828f9ba8b5c2cec4b7aa9d9184776a5e5144372b1e0600000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3945515d676d7473727271706f6e7986929facb9b8ac9f928579686c666c6d6d6d6e6f7072737576716f757b7e8285898d9195989c9fa3ababafacafb5bdc7cbc4b7ab9f94908c8985827f7c7975716d6765615e5653504a42382d22170b0000000000000000000000000000000000000003090e1214151317222c363e44494a51504b515356585b5c59534b422f261c11060105080a0b0d0b0a090807070a15202b343c454d53545656575859535b6061615f574d42362a1e1207070808090a0b0c0c0d090806030000000000000000000009141f29333b4246484f4e4e4e4d4d4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4d4d4e4e4f4f50504b51545556575856544f473d32271b0f030000000000030c161f29323e45515d676f7d87939fa9b3aca49992877e716f7c8996a09f9590847d736f6f6f707070717172727374747a85929fa8b0a69e948e81746f7c8996a1a19691867e756f6f6f6f6f6f70707071717172727374746f6a6054473b2e2215080005121e2b3845515e6b7884919eabb7b1a4988b7e7165584b3e3230303643505d697683909ca9b6aea195887b6e6255505d6a7783909daab5b5a99e938e8a8a8a8a8a8a8a8a8a8a8a8a8a8a8c919ca7b5b5b2a5988c7f7265594c3f3226190c0000000000000000000000000000000005101a232e3840495156585e5856515966737f8c99a6b2bfb9ac9f92867e7d7d7d7d7d7d7e85919eabb8b5a99c8f827e7d7d7d7d7d7e808d9aa6b3beb2a5988b7f7d7d7d7d7d7d7d7e85919eabb8c3b6aa9d9083776a5d5044372a1d110400000000000000000000000714212d3a4754606d7a7c7b7b7b7b7b7b8390989f93868080818283848587898a8c8e909298a2aea69c9083766f7c8995a2afbcb6a99d938e8c8c8c8c8c8c8c919ca7b4c0baaea399928c8c8c8c8c8c8c8c9196a1acb9bcafa296897c6f6356493c30231609000814212e3a47535f696e717070706f6f6f6f6e6e6e6d6d6d666c6c6b6b6b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a727f8c99a5b2bfccd8ddd1c4b7aa9e918477675d5145392c20130600000000000000000000010d18242f39434b51535e605f5f5f5f5f5e5e5e5e5e5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5e5e545c60606163646567686a6a615e574d42362a1e12050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1c2936424f5c6975828f9ca8b5c2cfc4b7aa9d9184776a5e51442d22170b00000000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b555d6067676665646362657884919eabb7baaea298877a6d615b60606061616264656768696565696e7275797d8084878b8f92999d9fa7abadb2b8babfc6bbb0a69f9c9997928f8c8885817d7a75716d6865605b544a3f33281c0f0300000000000000000000000000000000000000000206080807101a232c33393c3d4444404546494b4e4f4d494239301d140a00000000000000000000000000040e19222b333b42464849494a4b4c4950535555534d453b31261a0e020000000000000000010000000000000000000000000000020d17212930363a3b424241414040404040403f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f404041424243434441454748494a4b4948433d352b21160a00000000000000040d17202935414b55606b73808d97a1adb5aba39992877e7c818e9ba89d90837d7c7b7c7c7c7d7d7d7e7e7e7f8081817a7f8c96a1adb0a69d938d807c818e9ba99e91847d7c7c7b7b7b7c7c7c7c7d7d7d7e7e7f7f8080817c6f6256493c2f2316090005121e2b3845515e6b7884919eabb7b1a4988b7e7165584b3e3d3d3d3d43505d697683909ca9b6aea195887b6e6255505d697683909ca9b6b4a79b8e817e7d7d7d7d7d7d7d7d7d7d7d7d7d7f8c99a5b2bfb2a5988c7f7265594c3f3226190c000000000000000000000000000000000b16212c35404a525b62656b65625b596673808c99a6b3b7b6aea398928a8a8a8a8a8a8a8a9197a1adb5b5ab9f948f8a8a8a8a8a8a8a8d929da8b5b5b5a79b918b8a8a8a8a8a8a8a8a9197a1adb7b7b7aa9d9184776a5e5144372b1e060000000000000000000000000713202c3945525d686d6f6f6e6e6e6e6e7b86929f9991847a74757677797a7c7e7f818386929fac9f94897d706f7c8995a2afbcbaafa59d9b989898989898999ca3adb8c4bfb4aba39f98989898989898989ea1a8b2bdbcafa296897c6f6356493c30231609000815222f3b4855626e7b7e7d7d7d7c7c7c7b7b7b7a7a7a79797978787877777777777777777777777777777777777777777777777777777777777777777777777e8b97a4b1becad4d4d2c5b8aca096867a6d6053473a2d201407000000000000000000000007121d2831394045475253535252525252525151515151505050505050505050505050505050505050505050505050505050505050505050505050505151524b515354545657595a5b5d5d54524d453b30251a0e02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c2936434f5c6976828f9ca9b5c2cfc4b7ab9e9184786b5e493f33271b0f030000000000000000000000000000000000000000000000000000000000000000000000000000000c18242f39434b51535b5a5958575653697683909ca9b6bfb4aa95887b6f625553535454545657585a5b5c58575e6165666d7073777b7e82868b9095999ea1a9acaeb4b9bdb8b0aba9a9a29f9c9897928e8a86827e7a76716c665b5044382b1f12060000000000000000000000000000000000000000000000000008111a22282d3031372e34383a3c3f4142413d3730271e0b020000000000000000000000000000071019212931363a3b3c3d3e3e3f3f4446484846423b33291f140900000000000000000000000000000000000000000000000000050f171f252a2d2e353534343433333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333434353536362f35393a3b3c3d3e3c3b38322b23190f040000000000000000050e18242f3a434f59606d7985929ea9b3b5aba399928b888e939da99f9590898888888989898a8a8a8b8b8c8d8d887b7984919eaab4afa59c928d888e939ea9a196918a888888888888888989898a8a8a8b8b8c8d8d8b7e7165584b3e3225180b0005121e2b3845515e6b7884919eabb7b1a4988b7e7165584b494949494949505d697683909ca9b6aea195887b6e6255505c6976838f9ca9b6b2a5988b7f72717171717171717171717171717c8895a2aebbb2a5988c7f7265594c3f3226190c00000000000000000000000000000004101c28333e47525c636d7278726d605c6673808d99a6aaaaaaa9aaa39f97979797979797979ea1a9a8a8a8a8a69f9c979797979797979a9da4a8a8a8a8a8a39b9897979797979797979ea1a9aaaaababab9e9184786b5e51452d22171008000000000000000000000004111d2935414c565d6062626261616169717e8b939e9690837a6d676b686d6f7173747783909da49a8f82766b6f7c8995a2afbcbfb4aaa39f9f9f9f9f9f9f9fa2aab4bfcac5bcb4aaa29f9f9f9f9f9f9f9f9fa4abb5c0bcafa296897c6f6356493c30231609000e1a2734414d5a6774808a8a8a89898988888887878786868686858585848484838383838383838383838383838383838383838383838383838383838383838384919eaab7c4c7c7c7c7c8bdb2a895887b6e6255483b2f2215080000000000000000000000010c161f282f35393a4546464646454545454544444444444444444444444444444444444444444444444444444444444444444444444444444444444444454045464748494a4c4d4f50514846423b33291f140900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101d293643505c6976838f9ca9b6c2cfc5b8ab9f928578655b5044372b1f120500000000000000000000000000000000000000000000000000000000000000000000000000000007121d2731394045474e4d4c4b4a4f5b6875828e9ba8b5bdb0a3968a7d7063574a47474748494a4c4d4f504b4d5354545c606367696e72757a7e83888d91979b9fa3aaacb2b8bbb7b6b3adaba8a9a29f9b98928f8b86837e786c605346392d20130600000000000000000000000000000000000000000000000000000810171c2023242b23282c2d2f32343534312c251e150c00000000000000000000000000000000070f171f252a2d2e303031322d3337393b3b3a36312921180d030000000000000000000000000000000000000000000000000000050d141a1e20212928282727272626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262627282829292a24292c2d2e2f3132302f2c27211910070000000000000000000007131d28313d45515d67727f8c97a1adb9b5aba39f97959b9da5aaa79f9d969595959596969697979798999993867a717e8b98a2aebaaea49c99959b9ea5aaa8a19e97959595959595959696969697979798999996897d7063564a3d3023170a0005121e2b3845515e6b7884919eabb7b1a4988b7e71655856565656565656565d697683909ca9b6aea195887b6e6255505c6976838f9ca9b6b2a5988b7f726564646464646464646464646f7b8895a2aebbb2a5988c7f7265594c3f3226190c0000000000000000000000000000000714202c38444f59636e737f857f746d676773808d9a9d9d9d9d9d9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9d9d9d9e9e9e9e9e9285786b5f493f3327221a120800000000000000000000010d1924303a444c5254555555555457626c75818f96a0959083796d675e616264666d7a86929f9f93877c6f626f7c8995a2afbcbaaea398929292929292929298a2aebac6bfb4aaa29892929292929292929399a4afbbbcafa296897c6f6356493c30231609000b1824313e4b5764717e8a9796969695959594949493939a939292929191919090909090909090909090909090909090909090909090909090909090909090909196a0acb9bababababbbbbcb0a3968a7d7063574a3d3024170a000000000000000000000000040d161d24292c2d38393939393938383838383737373737373737373737373737373737373737373737373737373737373737373737373737373737382e34383a3a3b3c3e3f414243443b3a36302921170d0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101d2a3643505d697683909ca9b6c2c2c3b9ac9f9386796c605346392d201306000000000000000000000000000000000000000000000000000000000000000000000000000000010b151f272f35393a41403f3f414d5a6774808d9aa7b3beb1a5988b7e7265584b3f3a3a3b3c3d3f4042433e4246484b515356575e6165686d72767b8084898e92989ea1a8acb1b8bcbebab8b5b3adabaaa39f9c9993908a7d7063574a3d3024170a000000000000000000000000000000000000000000000000000000050b101416171e181c1f20232528292825211b140c030000000000000000000000000000000000050d141a1e21212323242522272b2d2e2e2d2a261f180f060000000000000000000000000000000000000000000000000000000002090e1214151c1b1b1b1a1a1919191919191919191919191919191919191919191919191919191919191919191919191919191919191919191a1a1b1b1c1c1d181d20212223242523221f1b160f070000000000000000000000010c161f2935404b55606d7985929ea9b3bdb5aeaca4a2a9a19e9d9d9d9d9d9d9d9d9e9e9fa3aaa1a1a2a39f9386796d7985929fabb8b6aea8a6a2a9a29f9d9d9d9d9d9d9d9d9d9d9d9e9e9f9fa4a0a1a1a2a3a296897c6f6356493c302316090005121e2b3845515e6b7884919eabb7b1a4988b7e716563636363636363636363697683909ca9b6aea195887b6e6255505c6976838f9ca9b6b2a5988b7f726558575757575757575757626f7b8895a2aebbb2a5988c7f7265594c3f3226190c0000000000000000000000000000000916232f3c4855616b73808b918b81796e6974808d91919090909090908f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f909090919191919292928679655b50443d342c241a10070000000000000000000008131e28323a4145474848484848505a616d7a84919a9f959082796d675c545763707d8999a3988e81756a626f7c8995a2afbcb8ac9f928685858585858586929facb8c5baaea29889868585858585858587939facb9bcafa296897c6f6356493c30231609000a1623303d495663707c8996a3a3a2a2a2a2a1a1a1a0a0a49f9f9f9e9e9e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ea0a8b2adadadadaeaeaeafb0a5988b7e7265584b3f3225180c00000000000000000000000000040c12181d20202b2d2c2c2c2c2c2b2b2b2b2b2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2b23282c2d2d2e303132343537372e2d2a251f170f050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101d2a3743505d6a7683909da9b4b5b6b7b8afa499877a6d6054473a2d21140700000000000000000000000000000000000000000000000000000000000000000000000000000000030d151d24292c2d343433333f4c5966727f8c99a5b2bfb3a6998d8073665a4d40332e2e2f313234353631363a3b404546494d5354565d61656a6e73797d81868b91969da0a7acb1b9bdc3c2bebab8b4aeacaba39991847a6d6054473a2d211407000000000000000000000000000000000000000000000000000000000004080a0a070c10131316181b1c1b19151009020000000000000000000000000000000000000003090e12141516161718171b1f202222211e1a140d0600000000000000000000000000000000000000000000000000000000000000020507080f0f0e0e0d0d0d0d0d0d0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d0d0e0f0f10070d111314151617181615130f0a0400000000000000000000000000040d18242f3a45515d67727f8c97a1adb9bfbbb9b1ada1979291919191919191919192929893949495969793867a6d74818e9aa8b2bdb9b4b3ada297929191919191919191919191919192939994949595969796897d7063564a3d3023170a0005121e2b3845515e6b7884919eabb7b1a4988b7e717070707070707070707070707683909ca9b6afa295887c6f6255505c6976838f9ca9b6b2a5988b7f7265584c4a4a4a4a4a4a4a55626f7b8895a2aebbb2a5988c7f7265594c3f3226190c0000000000000000000000000000000a1724303d4a5763707d8a929e938e837b6e717e8484848484838383838382828282828282828282828282828282828282828282828282828282828282828282828282828282828282838383848484848585858583786c60534e463e362c22190e04000000000000000000020c1620283035393a3c3c3b3b3f46525e68707d88939f9f948f82796d665c586673808d999f92867b6e61626f7c8995a2afbcb0a3978a7e797979797979798693a0acb9b8ac9f9286797979797979797983909ca9b6bcafa296897c6f6356493c30231609000a1623303d495663707c8996a3a6a6a5a4a4a3a3a2a2a1a1a1a1a0a0a0a49f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa49f9f9f9fa0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a1a1a1a2a2a3a4998d8073665a4d4033271a0d000000000000000000000000000001070d1013141f20201f1f1f1f1f1f1e1e1e1e1e1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1e1e181c1f20212123242627282a2a21201e1a140d05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111d2a3744505d6a7783909da7a7a8a9aaabada194877b6e6154483b2e2115080000000000000000000000000000000000000000000000000000000000000000000000000000000000030b12181d1f20282726313e4b5864717e8b97a4b1beb4a89b8e8175685b4e422d2221232425272829252a2d2e34383a3d4246484c5254585f62666d70757a7f848a90959da0a7acb2babec5c6c5bfbaafa59f92877c6f675d5145392c2013060000000000000000000000000000000000000000000000000000000000000000000000040607090c0e0f0e0c0904000000000000000000000000000000000000000000000002050708090a0b060b0f1213151514120e0903000000000000000000000000000000000000000000000000000000000000000000000000020201010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101020203000104060708090a0b090907030000000000000000000000000000000007131d2935404b55606d7985929eabb8c3c7c5b8ab9e9285848484848484848484858686878788888a8b8c887b6f6f7c8996a0acb9c5c5b8ab9f928584848484848484848484848485858686878788898a8b8c8b7e7265584b3f3225180c0005121e2b3845515e6b7884919eabb7b3a69a8d807d7c7c7c7c7c7c7c7c7c7c7c7c7d83909daab7afa295897c6f6256505c6976838f9ca9b6b2a5988b7f7265584c3f3e3e3e3e3e4855626f7b8895a2aebbb2a5988c7f7265594c3f3226190c0000000000000000000000000000000a1723303d4a5663707d87939f9d9590847b6e717777777777777676767676757575757575757575757575757575757575757575757575757575757575757575757575757575757576767676777777787878787976706c62605850483e342a20150a00000000000000000000040e161e24292c2d2f2f2f333f4a545b606b73808d96a09f948f81786d665f6a7784919e958c7f72695e626f7c8995a2afbcb0a3978a7d706c6c6c6c6d798693a0acb9b8ac9f9285796c6c6c6c6c6c7683909ca9b6bcafa296897c6f6356493c30231609000b1724313e4a5764717d8a979a999998989796969595959494949493939a939292929292929292929292929293939a93939393939393939393939393939393939393939393939494949495969697988e8175685b4f4235281c0f000000000000000000000000000000000104060712131313131212121212111111111111111111111111111111111111111111111111111111111111111111111111111111111111070c10131314151617191a1c1d1e1514120e090200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111e2a3744515d6a778490999a9b9b9c9d9fa2a995887b6f6255483c2f22150900000000000000000000000000000000000000000000000000000000000000000000000000000000000001070c1013141b1a24303d4a5763707d8a96a3b0bdb6a99c90837669544a3f33281c1617191a1c1d1a1e2123282c2d31363a3b4146474e53545c6063686d72797e838990959ea0a8adb3bcc1c7beb1a79e938b7f726a60554c4135291d1104000000000000000000000000000000000000000000000000000000000000000000000000000000000102020000000000000000000000000000000000000000000000000000000000000000000000030506080807050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d18242f3945515d67737f8c99a7b1bcc8c4b7aa9e91847977777777777777787879797a7a7b7c7d7e7f807a6d6b7784919eaab7c4c4b8ab9e91857a7777777777777777777777787979797a7b7b7c7d7e7f807c6f6255493c2f2216090005121e2b3845515e6b7884919eabb7b5a89d928d89898989898989898989898989899095a0acb8afa296897c6f6356505c6976838f9ca9b6b2a5988b7f7265584c3f323131313c4855626f7b8895a2aebbb2a5988c7f7265594c3f3226190c0000000000000000000000000000000916222f3c4854606b73808c949fa09691857c6f6a6b6a6a6a6a6a69696969696969696969696969696c787d7b7975716d676969696969696969696969696969696969696969696969696a6f767b7f8284868684827d766f6a615a50463c32261b0f0400000000000000000000040c13191d202122222b3844505b666c75727984919ea59e938e81786c656f7c8896999083786d6057626f7c8995a2afbcb0a3978a7d70645f5f606d798693a0acb9b8ac9f9285796c5f5f5f5f697683909ca9b6bcafa296897c6f6356493c30231609000d1a2733404d5a6673808d8e8d8d8c8b8b8a8a8989888888878787878686868685858585858586868686868686868686868686868686868686868686868686868686868687878787878888898a8b8b8c8276695d5043362a1d1000000000000000000000000000000000000000000506060606060505050505040404040404040404040404040404040404040404040404040404040404040404040404040404040400000406070708090b0c0e0f101108070502000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111e2a3744515d6a77838c8d8d8e8f8f9092979796897c6f6356493c302316090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000406070e1623303c4956636f7c8996a2afbcb7ab9e918478665b5044382b1f120a0c0d0f090e1214181c1f20252a2d3035393c43474a5053565d60666d71777d838a91969fa2a9afb9bdb6aca0958e81756d62584e433a2f24190d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060707060400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d2935404b55616e7b8895a0abb8bfbab9aca0968d80746b6a6a6a6a6a6b6b666d6d6e6e6f707172736d686673808c99abb5c0c0b9ada1978d80736a6a6a6a6a6a6a6a6a6b6b6c676d6d6e6e6f707172736f6a6054473b2e2215080005121e2b3845515e6b7884919eabb7b9aea49d9a96969696969696969696969696969da0a7b1afafa396897c706357555c6976838f9ca9b6b2a5988b7f7265584c3f3c3c3c3c3c4855626f7b8895a2aebbb2a5988c7f7265594c3f3226190c0000000000000000000000000000000714202c38444f59606c78828f98a2a19791857c6f695e555d5d5d5d5d5c5c5c5c5c5c5c5c5c5c5f6a74808a8885827e7a76726d6863605b535c5c5c5c5c5c5c5c5c5c5c5c5c5961696e757c82878c8f919292908e8a837c716c61584e43372b21160b000000000000000000000002080d11131415202d394653606c78827f727d8a939ea69e938e81776c73808d9692877c6f665c56626f7c8995a2afbcb0a3978a7d70645753606d798693a0acb9b8ac9f9285796c5f52525d697683909ca9b6bcafa296897c6f6356493c30231609000d192633404c5966737f828181807f7f7e7e7d7c7c7b7b7b7b7a7a7a7a797979797979797979797979797979797979797979797979797979797a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7b7b7b7c7d7e7f7f7c6f6255493c2f2216090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1723303d4a5663707d7f80818182838485878a8d897d7063564a3d3023170a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915222f3c4855626f7b8895a2aebbb9ac9f9286796c605346392d201306000102000205070c1013131a1e2124292d3137383f44464c52545c60646b70787e848b92979ea5adb2afa49a9183796d605b51463d31281e1308000000000000000000000000000000000000000000000000000000000003050607080808080707060603000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c1012131413100c0703000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d18242f3946535f697783909daab4b4aeacaaa89f93887d70665b5e5e5e5e5f5c606061616263646666615e63707c8999a3afb3b6afaca99f92877c6e62585e5e5e5e5e5e5e5e555c6061616262636465666260584e43372b1f13060005121e2b3845515e6b7884919eabb7beb3a9a19e9e9e9e9e9e9ea1a9a3a3a3a3aba49f9fa4aca2a3a3968a7d706364615a6976838f9ca9b6b2a5988b7f7265584c4949494949494955626f7b8895a2aebbb2a5988c7f7265594c3f3226190c00000000000000000000000000000004101c27333d44505b666e7b86929fa7a19791857b6e675c5150505050504f4f4f4f4f4f4f4f55626f7c889297928e8a86827e7a75706c65615e56544f4f4f4f4f4f4f4f525b636b707b81898f939a9c9e9f9f9d9b9590877e716a5f54473d32271b100300000000000000000000000001040a151e2c38444f5964717e8a857975828f98a2a59d938d80736f7c84898a7f726a5f5456626f7c8995a2afbcb0a3978a7d70645753606d798693a0acb9b8ac9f9285796c5f52505d697683909ca9b6bcafa296897c6f6356493c30231609000c1925323e4b57636d73757474737372717170706f6f6e6e6e6e6d6d6d6d666c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c656c6c6c6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6e6e6e6f6f707172736f6a6054473b2e2215080000000000000000000306060603000004040303020202020202010101010101010100000000000000000000000000000000000000000000000000000000000000000000010101010102020202030303030304040404050505050506050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916222f3c4854606b7073737474757677787a7d80817a6d6154473a2e2114070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b8794a1b5b6b7afa399877b6e6154473b2e21140800000000000000000406090e1214191d20262b2e34383a41454a50535961656c71787f858e939ea1a8aa9f93877c6f675d51493f342b1f160c01000000000000000000000000000000000000000000000000000000060b0f12131415151514141413120f0b060e0d0b0a08060503000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a11171c1f20201f1d1812100c06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d2a36424d5766727f8c99a7a7aba39f9d9c9b9a9184786c60535151514a5053545455555758595a5453606d7a86929fa8a6aca49f9f9e998f82756a5f53515151515151524b5153545455565758595a55544e463c32271b0f030005121e2b3845515e6b7884919eabb7b9ada1979291919191919197a1adafafafa49993939a95959697978a7d706d706c606976838f9ca9b6b2a5988b7f726558565656565656565656626f7b8895a2aebbb2a5988c7f7265594c3f3226190c000000000000000000000000000000000b162128333f4a545e69727f8c95a0a9a1979083796d605a5044434343434242424240454d5a6774808d939a9e9b99928f8b86827d78726d68636059544f48444149505c646d737d858e939c9fa4acaaacacaaa79f9992867c6f62594f44382c1f14090000000000000000000000000006111c2630384855606b7783908b7e717b86929fa8a59c928b7e716f787c7e726d62584e56626f7c8995a2afbcb0a3978a7d70645753606d798693a0acb9b8ac9f9285796c5f52505d697683909ca9b6bcafa296897c6f6356493c30231609000a16232f3b46515b636668686766666565646363626262616161616060605c5f5f5f5f5f5f5f5f5f5f5f5f5f6060605b60606060606060606060606060606060606060606060616161616263636465666260584e43372b1f130600000000000000060b0f1213120f0b06111010100f0f0f0f0e0e0e0e0e0e0e0e0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0e0e0e0e0e0f0f0f0f1010101010111111111112121212120807050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202c38444f5960636666676868696a686d7073746d685e5246392d2013070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8799a4a9aaabacab96897c706356493d3023160a00000000000000000000000205080d11151a1c23282b2f35383f44464f535b60666d727b818991969ea2988e81746a60554b40372d22190d040000000000000000000000000000000000000000000000000000020a11171b1f2021212222212120201f1c171c1b1918171513120f0b06070603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c151c23282c2d2d2c29241f1c17110e09030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010e1a26313b4855616e7b88959d9b98999291908f8e8d897d7063564a44453f4446474748494a4b4c4d47515d677783909d9c99979a9392919190887b6f625548444444444445404546474848494a4b4c4d4947433c342b20150a000005121e2b3845515e6b7884919eabb7b8ab9e9285848484848484919eabb8b9ac9f9387878788898a8b8c8a7d717a7d746d6676838f9ca9b6b2a5988b7f726563636363636363636363636f7b8895a2aebbb2a5988c7f7265594c3f3226190c00000000000000000000000000000000050b17222d38424d57606d7883919da8a99f958e81756c62564c41383a404547494c4b51535764707e82878c91969b9f9c99928e89847f7a75706b636059544f49535b606e737f8892979ea5acafb6b7b9b9b7b1aba3989083776b6054483b31251a0e020000000000000000000000020b17232e38424f5963707d8995908377737f8c96a0aca49f92877d706d6f716c625b514956626f7c8995a2afbcb0a3978a7d70645753606d798693a0acb9b8ac9f9285796c5f52505d697683909ca9b6bcafa296897c6f6356493c302316090006121e2a3540495157595c5b5a5a59585857575656555555545454545353504a52525252525253535353535353534950535353535353535353535353535353535353535354545454545555565758585955544e463c32271b0f030000000000020a11171c1f201f1c171e1e1d1d1c1c1c1b1b1b1b1b1b1b1b1a1a1a1a1a1a1a1a1a19191919191919191919191919191919191919191919191919191a1a1a1a1a1b1b1b1b1b1c1c1c1c1c1d1d1d1d1e1e1e1e1e1f1f1f1f1514120e090300000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c27333d474f5456595a5a5b5c5c565e61646668615e564c4135291d11050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c7986939c9c9d9e9fa3988b7e7265584b3f3225180c000000000000000000000000000001050a0f11171c1f24292e34383d414950545c60686e757d848f939f92857a6e61584e43392f251b10070000000000000000000000000000000000000000000000000000020b141b22272b2d2e2e2e2e2e2e2d2d2b2822292826252422201f1b17151312100c060603000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000610181e262e34383a3a39352f2c28231c1a140f0a04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000914212d3a46535f69778390918e8b898684838281807f7a6d6054473a2e34383a3a3b3b3c3d3e3f40404b556774808d918f8d8a888685858484827c6f6255483c373737382e34383a3a3b3b3c3d3e3f403c3b37322b22190f04000005121e2b3845515e6b7884919eabb7b1a4988b7e78787878787c8995a2afb5a89b8f82787a7b7c7d7e7f807b7e858a81786d76838f9ca9b6b2a5988b7f726f6f6f6f6f6f6f6f6f6f6f6f6f7c8895a2aebbb2a5988c7f7265594c3f3226190c000000000000000000000000000000000006111c262f3b44505c66717e8a96a1aca79e938b7e71685e524644464b51535659555d6062636c70767b8084898f939c9e9f9b96918c86817c76706b636059535b656c74808c939aa1a9afb9bbbfbab8b6b7b9b4aa9f95897d7063574d42362a1e120500000000000000000000000a141d28343f4a54606b76828f9c95897c6f7984919ea5aea39992857c6e6864615a51494956626f7c8995a2afbcb0a3978a7d70645753606d798693a0acb9b8ac9f9285796c5f52505d697683909ca9b6bcafa296897c6f6356493c3023160900020d19232e3740464b4c4f4e4e4d4c4c4b4b4a4949484848484747474746443f46464646464646464646464646463f44464646464646464646474747474747474747474747474747484848494a4b4c4c4947433c342b20150a0000000000060b141c22282b2d2b28222b2a2a2929292828282828282827272727272727272626262626262626262626262626262626262626262626262626262626262627272727282828282829292929292a2a2a2a2b2b2b2b2b2c2c2c21211e1a140d050000000000000000000000000000000000000000000000000000000000000000000000000000000000000b16212b353d44484a4c4d4e4e4f504c5254575a5b54524c443a3025190d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3744505b657885908f8f90919298948d8074675a4d4134271a0e010000000000000000000000000000000000060b1013191c23282c2f383f444a50565e616b707a828b928c7f72685e52463d31281d13090000000000000000000000000000000000000000000000000000000a141d262d3337393a3b3b3b3b3a3a3938332d36343332302e2d2b272222201f1c171312100c0604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d18222a30383f44464745403a38342e2a261f1b150e0903000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121e2a36424d5765727f8684817f7c797776757473726d685d5245392c282b2d2d2e2e2f3031332f3d4a5663707d868482807e7b7979787777756f6a5f53473a2e2b2b2b23282c2d2e2e2f2f303132332f2e2b272019100700000005121e2b3845515e6b7884919eabb7b1a4988b7e716b6b6b6f7c8995a2afb5a89b8f82756d6e6f707172737e8a92938e827976838f9ca9b6b3a79a8d807c7c7c7c7c7c7c7c7c7c7c7c7c7c7e8b97a4b1beb2a5988c7f7265594c3f3226190c0000000000000000000000000000000000000a141d28343f4a54606d7884919eabafa59e92857a6d61594f5053555d60636669676d6e706f6e6d6e73787d82888f949c9fa09e99928e89837d76706b615f606c77808d929fa4acb3bbc0bbb4aeaca9aaacb2b1a79c8f8275695e53463a2d2114060000000000000000000006111c262f3844505c666f7c89949f9b8f8275707d89939eababa29791847a6d675c53493f4956626f7c8995a2afbcb0a3978a7d70645753606d798693a0acb9b8ac9f9285796c5f52505d697683909ca9b6bcafa296897c6f6356493c30231609000007121c252e353b3e4042414140403f3e3e3d3d3c3c3b3b3b3b3a3a3a3a38342e3939393939393939393939392d33373939393a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3b3b3b3c3c3d3e3f403c3b37322b22190f0400000000060f181d262d33383938332d3737373636353535353535343434343434343433333333333333333333333333333333333333333333333333333333333333333333343434343435353535363636363637373737383838383839382e2d2a251f170f050000000000000000000000000000000000000000000000000000000000000000000000000000000000050f19232b33383c3d4040414142434146474a4d4e4746413a32281e130800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27333f495366737f8383828384868788898275685c4f4235291c0f020000000000000000000000000000000000000003080d11171c1f262d33383f444d525960686d757f8684796d60564c41342b1f160c01000000000000000000000000000000000000000000000000000006111b262f383f44464748484847474746443f444241403e3d3b3937332d2f2d2c2823201f1c1712100c07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c161f2a343c424a505353514b46443f3836312b26201a150d0701000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1a26313b4a56626d72797774726f6d676968676765605d564c4135291d1f20212122222425262f3c4855616b7079787573716f6d666b6b6a68625f584e43372b1f1e1e181c1f20212122232425262722221f1b150f070000000005121e2b3845515e6b7884919eabb7b1a4988b7e71655e626f7c8995a2afb5a89b8f8275686262636465727f8b959d948f8179838f9ca9b6b5a99d928d89898989898989898989898989898b909ba6b5b6b2a6998c7f7366594c403326190d000000000000000000000000000000000000020b17232e3844505c66727f8b99a3afada1978e81746b60545c6063676d707376787a7b7c7c7b7a78736f70757c82898f949da0a39f9b949089837d756e696d74818d929da4afb6bebdb5afaaa29f9c9ea0a8aeaa9e94877b6e6154483b2d22170b000000000000000000060f17222d38424d57606d7883909da69e93897d7075828f99a3afa9a0969083796d655b50444956626f7c8995a2afbcb0a3978a7d70645753606d798693a0acb9b8ac9f9285796c5f52505d697683909ca9b6bcafa296897c6f6356493c302316090000000a131c232a2f3233353534333332323130302f2f2f2e2e2e2e2d2d2d2b28232c2c2c2c2c2c2c2c2c2c2c2d22272b2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2e2e2e2f2f2f302f2f30303132332f2e2b272019100700000000030d1821292f383f4446443f454444434343424242424141414141414141404040404040404040404040404040404040404040404040404040404040404040404040404141414141424242424343434343444444444445454545453b3a36312921170d03000000000000000000000000000000000000000000000000000000000000000000000000000000000008111921272c2f3033333435353036393a3d40413a3935302820160c0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222d384b57636d737776767778797a7b7c7a6d6154473a2e2114070000000000000000000000000000000000000000000000060c10141b22272e343b41464f565d616d727b7b6e665c51443b3022190d040000000000000000000000000000000000000000000000000000000b17222d38414950535454555554545353504a504f4e4c4b4a4846443f3e3c3a38342e2d2c28231f1c18120f0a0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d28313c464e545c60605d5553504a46423b37322b262018130c0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141f2e3a46515b62666c66686562605c555c5b5a5854524c433a2f24191213141415161718202c38444f5961666c6669666462605c545e5d5c55534e463c31261a0f070c101313141515161718191a1615130f0a04000000000005121e2b3845515e6b7884919eabb7b1a4988b7e716558626f7c8995a2afb5a89b8f8275685c565758606d7883909a9e938e8282909ca9a9a9a8a49d9a9696969696969696969696969696979ba2a8a9a9aaa6998d8073665a4d4033271a0d0000000000000000000000000000000000000006111c28343f4a54616d7a86929facb3a99d93897c6f6362666d7075797c7f828586888989888684807c756d6f757c828991969fa4a69f9c959089827b73737f8c939da4aebbc0b9b1aba39f98929091969fa3aba6988b7e716553493f33271b0f0300000000000000060f182228333f4a545e69727f8c95a0aca59e91847a6e7b87929fabb2a89f958e81776c60594f4956626f7c8995a2afbcb0a3978a7d70645753606d798693a0acb9b8ac9f9285796c5f52505d697683909ca9b6bcafa296897c6f6356493c30231609000000010a12191e2325262928272b32383b3c3d3c3c3c3b3b3a3a3a3937332d38383737373636363636363636363636363636363636363737373838382e34383a3a3a3b3b3b3c3c3c3d3b3a37312a252622221f1b150f07000000000009141f29333b424a5053504a51515150504f4f4f4e4e4e4e4e4e4e4e4d4d4d4d4d4d4d4d4d4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4d4d4d4d4d4e4e4e4e4e4f4f4f4f4f505050505151515151525252524846423b33291f1409000000000000000000000000000000000000000000000000000000000000000000000000000000000000080f161c2022232627272829252a2d2e3133352e2d29251e160e0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111b2f3b46525b63666a69696a6b676d6e6f6d685e5246392d20130700000000000000000000000000000000000000000000000000030a11171c232830363d444c525b62696e6e695e544b4032291e1007000000000000000000000000000000000000000000000000000000030f1b27333f49535b6061616161616160605b5f5d5c5b595857555350494b4846443f3c3a38342e2c28231c1b15100b05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d18242f39434e585f666d6d6763605c54534d47433c373129241d160d06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003121d29343f4951545b605b54585653514b4f4e4d4b4745413a31281e130807070808090a101c27333d474f545b605b545a575553514b51514f4847433c342a20150a0000040607070808090a0b0c0d090806030000000000000005121e2b3845515e6b7884919eabb7b1a4988b7e716558626f7c8995a2afb5a89b8f8275685c4f4a505c666f7c87939f9e938e87939e9c9c9c9c9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9c9c9d9d9e9a8d8074675a4d4134271a0802000000000000000000000000000000000000000b17232e3846525e6876828f9ca9b5afa59c8f8275696c71787d8186898c8f92979596969496918d8881796e6a6f767d848d9399a0a8a79f9d938f86807e88939fa5aeb6c0b8b0a7a099928d8683848a9299a3a89b8e8175655b5044372b1f1205000000000000060f18212a343c44505b666e7b86929fa7b1aca19690837974818e99a3aeb1a79e938c80736b61574d56626f7c8995a2afbcb0a3978a7d70645753606d798693a0acb9b8ac9f9285796c5f52505d697683909ca9b6bcafa296897c6f6356493c302316090000000000070d12161919151f2b343d43484949494948484847474746443f454545444443434343434343434343434343434343434343434444444545453f44464747474848484949494847433c342a201615130f0a040000000000020e1a26313b454d545b605b5e5e5e5d5d5c5c5c5b5b5b5b5b5b5b5a5a5a5a5a5a5a5a595959595959595959595959595959595959595959595959595959595959595a5a5a5a5b5b5b5b5b5c5c5c5c5c5d5d5d5d5e5e5e5e5e5f5f5f54534d453b31251a0e02000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b10131617191a1b1b1c191d202124272821201d19130c040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000131e2a3540495257595d5c5c5d555d606162615e564c41362a1d1105000000000000000000000000000000000000000000000000000000060b11171f252a323a414651575e61615e574d42392e20170d0000000000000000000000000000000000000000000000000000000005121f2b3744505b656c6d6e6e6e6e6d6d6c666b6a696766656361605b53585553504a4946443f3a38342e2b26201c160f0a040000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b555f6a6f797a75706d66615f57534e47423c352f281f17110a02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010c18232d373f424a5053504a4c494645404241403f3a39352f281f160c010000000000000b16212c353d424a5053504a4d4b484645404444423c3a37312a22180e0300000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7b1a4988b7e716558626f7c8995a2afb5a89b8f8275685c4f3f4a54606b75828f9aa49e9a939792908f8f8f8f8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8f8f8f909091928e8174675b4e41342819130c0400000000000000000000000000000000000006111c2a36414c5665717e8b98a8b2b9ac9f93877b6e717e848a8e9298999c9fa2a9a3a2a9a19e9a938f837b6e656b7079808791959da4aba69e98928d8a939aa4afb7c0b7afa69e959087807a76777e87929fa69e9285786c605346392d2013060000000000030c18212a333c46505a606c78828f98a2aeb1aaa29f928a7d707b86929faab4afa59f93887d70695f5556626f7c8995a2afbcb0a3978a7d70645753606d798693a0acb9b8ac9f9285796c5f52505d697683909ca9b6bcafa296897c6f6356493c3023160900000000000002060a07121d27313d464e545656565555555454545353504952525151515050504f4f4f4f4f4f4f4f4f4f4f4f4f4f4f50505051515152524a505353545454555555565655534e463c31261a0f06030000000000000005121e2a36424d575f666c666b6b6a6a6a696968686868686867676767676767676666666666666666666666666666666666666666666666666666666666666666666667676767676868686869696969696a6a6a6a6b6b6b6b6b6c6b615e574d42362a1e120500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000407090a0d0d0e0e080d111314171a1b1413110d08020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020d19242e3740464b4c50504f504c5154555654524c443a3025190d010000000000000000000000000000000000000000000000000000000000060c1419202830353f454d535454524d453b30271d0e0500000000000000000000000000000000000000000000000000000006131f2b37434e58606c787a7b7b7b7a7a7a7979787775747371706e6c65676462605c545653504a4644403937312c27211b160e090200000000000000000000000000000000000000000000000000000000000000000000000000000000000613202c3945515d676f7c8485817d79746e69625f58534e45403a3128231c140c0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111b252d2f383f4446443f3f3c3a38342e3434322d2c29241e160d040000000000000005101a232c2f383f4446443f403e3c3a38342e37352f2e2b26201810060000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7b1a4988b7e716558626f7c8995a2afb5a89b8f8275685c4f42424f59626f7c87939faca49e9285838382828282818181818181818181818181818181818282828283848485868073675a4d403429241e160e040000000000000000000000000000000000000d1925303b4854616e7b8796a1adb9afa49a8d81747c8891979b9fa3a39f9fa2a9acafb2adaba59e959082776c60676d737c848d929fa3aaaaa39f99979fa4acb6c0b7afa59d948f837c736d686c717e8b949fa197887c6f6255493c2f22160800000000000b151e2a333c454e58616c73808c949faab1a79f98928a80776c74808d98a3aebaafa49a92857b6e675c56626f7c8995a2afbcb0a3978a7d70645858606d798693a0acb9b8ac9f9285796c5f58585d697683909ca9b6bcafa296897c6f6356493c302316090000000000000000000c18242f39434e586062636262626161616060605b5f5f5e5e5e5d5d5d5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5d5d5d5e5e5e5f5f5f5c60606061616162626263625f584e43372b1f120600000000000000000714212d3a46535f696e787878787777767676757575757474747474747474737373737373737373737373737373737373737373737373737373737373737373737373737474747474757575757676767676777777777778787878786e695e53463a2d2114070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010200010507070a0d0e07070501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007121c252e353b3e404443434441454748494746413a32281e13080000000000000000000000000000000000000000000000000000000000000002080e161e2429333b4246484746423b33291e150b000000000000000000000000000000000000000000000000000000000815222e3b4754606a7582878788888787868686858382817f7e7d7b797674716f6d666663605c5453514a47433c38332c27211a140d05000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d798491928e8a85807b756f6a625f57514b433d342e261e170e0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009131b1d262d33383938332d2f2d2c282328272521201d19130c0400000000000000000008111a1d262d33383938332d312f2d2c28232a2922211f1a150e06000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7b1a4988b7e716558626f7c8995a2afb5a89b8f8275685c4f423d47535f6a75828e9ba8ab9e92857a767675757575747474747474747474747474747475757575767677787879736e63584b3a3935302820160c0200000000000000000000000000000000000814212d3a46535e697884919eabb8b6ac9f92867a7a86929f9b989599929297999fa3abb5b8afa79f948b7e71655d606a6f79808a9298a1a9aeaca6a4acafb6beb8afa59d938e82796f6a605d626c76828f9ca6988c7f7265594c3f3025190d0100000007121d27303c454d575f6a707e88939fa6b0ab9f9590867e736c656e7b86929faab4b6aca2979083796d605a636f7c8996a2afbcb0a3978a7d70656565656d798693a0acb9b8ac9f9285796c65656565697683909ca9b6bcafa396897c706356493d3023160a000000000000000004101d2935404b55606a6f706f6f6f6e6e6d6d6d6c656c6b6b6b6a6a6a6969696969696969696969696969696969696a6a6a6b6b6b6c6c666d6d6d6e6e6e6f6f6f706e6a5f53473a2e21140800000000000000000815222e3b4855616e7b868585848484838382828281818181818181818080808080808080807f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f808080808081818181818282828282838383838484848484858585857b6e6154483b2e211508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a131c242a2f32333736362f35393a3b3c3a3936302820160c02000000000000000000000000000000000000000000000000000000000000000000040c1319212931363a3b3b3a36302920170c03000000000000000000000000000000000000000000000000000000000916222f3c4955626f7c8894949494949493999292908f8e8c8b8a888583807e7b7976736f6d6664605c54534e48443d38322a251f170f070100000000000000000000000000000000000000000000000000000000000000000000000000000c1926333f4c5966727f8c969f9b97928d87817c756e6a605d554f443f38302920170f06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090b141c22282b2d2b282223201f1c181b1a181413110d08010000000000000000000000080b141c22282b2d2b28222422201f1c181e1c1515120f0a0300000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7b1a4988b7e716558626f7c8995a2afb5a89b8f8275685c4f4237434e5863707d8996a0aca1978f82786c69686868686868686868686868686868686868686869696a6a6b6c6c67635c524a4746413a32281e1308000000000000000000000000000000000005121e2a36424d576875818e9ba8b5baaea2988a7d768390928f8b88878685878c9299a3afbbb9b0a69e9184786a605860676d737e8691969fa7b1b3b1b9bbc0bbb0a69e938e81786d675f58525a626f7c88949e9c8f827669564c41362a1d11050000000c18232e39424d575f696e7c86929aa4aaabaa9d90837b716c605e6973808d98a2aebab3a99f958d80746c6163707c8996a3afbcb0a3978a7d727272727272798693a0acb9b8ac9f9285797272727272727683909ca9b6bcb0a396897d7063564a3d3023170a000000000000000006131f2c3945515d676f7c7c7c7c7b7b7b7a7a7a797979787878777776767676767676767676767676767676767676767777777878787979797a7a7a7b7b7b7c7c7c7c6e6255483b2f22150800000000000000000714202d3a4753606d7a869291919190908f8f8f8e8e8e8e8e8e8e8d8d8d8d8d8d8d8d8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8d8d8d8d8e8e8e8e8e8f8f8f8f8f9090909091919191919292867a6d6054473a2d21140700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010a12191e2325262a292924292c2d2e2f2e2d2a251e160e05000000000000000000000000000000000000000000000000000000000000000000000002080f171f252a2d2e2e2d2a251f170e0500000000000000000000000000000000000000000000000000000000000b1825323e4b5865717e8b98a6a1a1a1a0a0a39f9e9d9c9a9998969892908d8b888683807c7975706d66625f58544f48433d3630292118120b0300000000000000000000000000000000000000000000000000000000000000000000000004111d2a3744505d6a778390979ea1a19e99928e88827b736d676159504a423b322921180f06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a11171c1f201f1c17161313100c070d0c070604010000000000000000000000000000020a11171c1f201f1c1718151313100c070f09080603000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7b1a4988b7e716558626f7c8995a2afb5a89b8f8275685c4f42313c4653606c7884919eaba99f948c7f726a60565b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5c5c5c5d5d5e5f5f5a5556575754524c443a3024190d0100000000000000000000000000000000020e1a25313f4c5966727f8c99a5b2bfb4aa9a8d81747d8885827e7c7a79787a7f87929fa8b2bdb9aca196897c6f6256555c606c717c8490959fa7b1bcc6c8c3b7ab9f948e81746d665d554e47535f6a76828f9c9e928578685e5246392d201307000004101c2834404b545f696e7b859198a2a09e9fa2988b7e716c615a56616d7a86929facb6bbb1a79d928a7e716963707d8a96a3b0bdb4a79a8d807e7e7e7e7e7e7f8b98a5b2beb9ac9f92867f7e7e7e7e7e7e7e84919eaab7bdb0a3968a7d7063574a3d3024170a00000000000000000714202d3a4753606d79868989888888878787868686858585848484838383828282828282828282828282828282838383848484858585868686878787888888898984786b5e5245382b1f1205000000000000000613202c3945515d677885919e9e9d9d9d9c9c9b9b9b9b9b9b9a9a9a9a9a9a9a9a999999999999999999999999999999999999999999999999999999999999999999999a9a9a9a9a9b9b9b9b9c9c9c9c9c9d9d9d9d9e9e9e9e9e918478675d5145392c201306000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070d131619191d1d1c191d2021222321201d19130c050000000000000000000000000000000000000000000000000000000000000000000000000000050d141a1e212121201e1a140d050000000000000000000000000000000000000000000000000000000000010e1a2734414d5a6774808d98999a9a9b9c9e9fa3aba4a6a7a6a4aaa29f9c9a979892908d8985827d79746f6a636059544f46423b3329241d150d050000000000000000000000000000000000000000000000000000000000000000000000000c1925323f4c5865727f858b91969fa2a39f9b948f878079706b605c544c443b332a21180f0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f1213120f0b06070604000001000000000000000000000000000000000000000000060b0f1213120f0b060907060400000200000000000000000000000000000000000000000000000000000000000000000005121e2b3845515e6b7884919eabb7b1a4988b7e716558626f7c8995a2afb5a89b8f8275685c4f42353744505b65737f8c99a4afa69f92877c6f685d5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5f5f5f5b6060606061616262636364615d564c4135291d11050000000000000000000000000000000000091724313e4a5764717d8a97a4b0bdb7ab9e918478707b7975716f6d6c686d727f8b96a1acb9bdb2a89a8d8073675a4b515a616a6f7a839095a0acb8c5cfc2b5a99c8f82796d605c544b43434e5864717e8a98a197877a6d6154473a2e211407000006131f2c3845515c666e7b859197a19e969192979f92877e706b60585e6873808d9aa4afbbb9aea49f92867b6e64707d8a97a3b0bbb5a99d928d8b8b8b8b8b8b8b919ba7b3c0baaea398928b8b8b8b8b8b8b8b9196a0acb9bdb0a3978a7d7064574a3d3124170a000000000000000006131f2c3945515d677885919595959494949393999292929191919090908f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f909090919191929292939993939494949595958f8376695c504336291d10030000000000000004111d2935404b556a7784909daaaaaaa9a9a9a8a8a8a8a7a7a7a7a7a7a7a7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a7a7a7a7a7a8a8a8a8a9a9a9a9a9aaaaaaaaaaaba99d9083766a554b4135291d11040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002070a0c0d1110080d11131415161413110d08020000000000000000000000000000000000000000000000000000000000000000000000000000000003090e1214151414110e0902000000000000000000000000000000000000000000000000000000000000000d1a2633404d596673808a8b8c8d8e8e909192999697999c9fa2aaa7aaa9a7aaa39f9d9998928e8a85817c76706b636059524d453e352f271f160e0500000000000000000000000000000000000000000000000000000000000000000000000b1824313e4a56626d72797f848c92989ea6a69e99928d847d736d665e564d453c332a21170d040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030606060300000000000000000000000000000000000000000000000000000000000000030606060300000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3845525e6b7885919eabb8b1a4988b7e716558626f7c8995a2afb5a89b8f8275685c4f423f403f4953616e7b87939facafa39991847a6d6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6b6c6c656c6d6d6d6d6e6e6f6f70716d685d5246392d20130700000000000000000000000000000000000915222f3c4855626f7b8895a2aebbb9ada196887b6e6e6d66656261605d606d7984919eabb7c2b6a99c8f837669564c45505860686e7984919daab7c4d0c3b6a99d90837a6d685e564d453c4753606d7985929f96897c6f6356493c3023160900000713202d3a4653606d798491979e96918b8485929f9992867d706a6058616e7b87939facb9b4aeaba2988e81756b717d8a97a4afafaeaea49d9a989898989898989ba3adb8c3bfb4aaa39f98989898989898989ea0a8b2b2b4b0a4978a7d7164574a3e3124170b000000000000000004101d2935404b556a7683909da2a2a1a1a0a0a0a39f9f9e9e9e9d9d9d9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9c9d9d9d9e9e9e9f9f9fa4a0a0a1a1a1a2a29a8d8174675a4e4134271b0e010000000000000003101c28343f4a546a7783909daaafaeaeadb6afacacacacababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababacacacafb5adadadaeaeaeafb0b0b1b1a99c8f8276695c4f4331261a0f0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004030001040607080907070501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002050708080705020000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a7e7e7f80818283848687898b8d8f9298979a9ea0a8abadaca9aaa29f9b97928d88827d776f6b615e5750454039312820160e05000000000000000000000000000000000000000000000000000000000000000000000915222e3a46515b62676d72797f868f949fa3aba39f96918880786e685e574d453c33291f160b0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3845525e6b7885919eabb8b1a4988b7e716558626f7c8995a2afb5a89b8f8275685c4f4b4c4c4d4f525e6975828f9cabb5aba0968e8178787878787878787878787878787878787878797979797a7a7a7b7b7c7c7d7d7a6d6154473a2e21140700000000000000000000000000000000000714212d3a4754606d7a8793aab4bfbdb2a8978a7d7064605c54555453525c6674818e9ba7b4c1b8ab9e928578685e5246464e56616e7b86929facb9c5d2c4b8ab9f9590837a6e685e574d4545515d6774818e9b988b7e7265584b3f3225180c000006131f2c3845515c6675828f95928c847e79808d9aa39892867c6f6a5f5f6976828f9ca8adaaa29f9b9892897c6f717e8b97a2a2a2a2a1a1a1a1a1a1a1a1a1a1a1a3a9b1bbc5c6bcb4aeaca1a1a1a1a1a1a2a2a3a3a4a4a5a7a9a4978a7e7164574b3e3124180b000000000000000005111d2935414c566a7683909da8a7a7a7a6a6a5a5a4a4a3a3a2a2a2a1a1a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a1a1a1a2a2a3a3a3a4a4a5a5a6a7a7a69a8d8073675a4d4034271a0d010000000000000006121f2b3844505c667884919ea3a2a1a1a1a0a49f9f9f9f9f9e9e9e9e9e9e9e9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9e9e9e9f9f9f9fa4a0a0a0a1a1a1a2a2a3a3a4a5a59d9084776a584e43372b1f120600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202c3945525d686d7172737374757678797b7c7e808385888b8d91969a9ea1a9acaeaeaba9a19e9a948f89837c756e69615a514b433a322820160e0400000000000000000000000000000000000000000000000000000000000000000006121e29343f4951555d60676d737b828b9299a1a9a8a19a938d827a6e695f574d453b31281d140a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3845525e6b7885919eabb8b1a4988b7e716558626f7c8995a2afb5a89b8f8275685c585859595a5c5d5764717d8a99a3afb2a89e938e8585858585858585858585858585858585858585868686868787878888898a8a7e7265584b3f3225180c00000000000000000000000000000000000713202d3a4653606d798698a3aebabfb2a5998c7f726659514b4947464a5465727f8c98a5b2bfb9ada197877a6d61544746525e6874808d99a3afbbc7c2c1bcb1a79f9590837a6e695f574d444b5563707d8a999a8d8074675a4d4134271a0e010004101c2834404b54616d7a838b857f79716e7b87939fa29892857c6f695f64707d8a96a1a19e98928e8a86817b6e717e8b96969595959595949494949494949494989fa9b4c0bfb4aaa39f949494949494959596969797989a9c9e978b7e7164584b3e3125180b00000000000000000713202d3946525d687884919c9b9b9a9a99999898989797969695959494939393939393939393939393939393939394949495959596969797979899999a9b9b9b8e8175685b4e4235281b0f02000000000000000713202d3a4653606d798592979695959494939a939292929292929191919191919190909090909090909090909090909090909090909090909090909090909090909091919191929292939993939494949495969697979898999285786a5f53473a2e2114080000000000000000000000000305060503000000000000000000000000000000000000000000000000000000000000000000000000000000000004080a0a0d0c0b0c0d0e08080602000000000000000000000000000000000000000000000000000000030709090b0a0a0a0a090909090808080707070706050300000606060606060606060606000003060707070708080808090909090a0a0a0a0b080705020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111d2935414c565d6064656667676869666d6e70717376797b7e8184898d91979a9fa3abaeb3adaba69f9c959089817b716c605d554c443a322820160b020000000000000000000000000000000000000000000000000000000000000000010d18232d373f434b51555c60696e757f879297a1a8aca49f9490847b6e695f574d433a2f261c1106000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2c3845525f6b7885929eabb8b1a4988b7e716563636f7c8995a2afb5a89b8f827568646565656667686a69606d7a86929facb9afa59e9792919191919191919191919191919191919292929299939393949495959695897c6f6256493c2f231609000000000000000000000000000000000006121f2c3844505c667985929facb8c1b4a89b8e8175685b4e403c3a3d4a5663707d8996a3b0bcbeb3a995887b6f6255484a54616d7a86929fabb5c0bab6b4b6b8b1a7a09591847b6e695f564c4754606d7a8692998f8376695c504336291d100300000c18232e3946525d686d7a7e7a726d676976828f9ca9a29791857b6e68606d7884919e97918b85817d7a756e69717e89898989888888888887878787878787888d98a3afbcbaaea398928787878787888889898a8a8a8c8d8f91938b7e7165584b3e3225180b00000000000000000714212e3a4754616d7a868f8f8e8e8e8d8d8c8c8b8b8a8a898989888887878686868686868686868686868686868787878888888989898a8a8b8b8c8c8d8e8f8f9083776a5d5044372a1d1104000000000000000916222f3c4955626f7c888c8b8988888887878686868585858585858584848484848484838383838383838383838383838383838383838383838383838383838383848484848585858686868687878787888889898a8b8b8c8c8d887b6e6255483b2f22150800000000000000000000060b0f1213120f0b0600000000000000000000000000000000000000000000000000000000000000000000000000050b10141617191818191a1b1514120e09030000000000000000000000000000000000000000000000040a0f1315161717171716161616151515141414141313120f0b131313131313131313131313130b101213141414141515151516161616171717171514120e09030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d1924303a444c52545758595a5b5b545c6061636466666c6e7174777c8084898e92999fa3aab0b8b0aba79f9d938e867e746d675e564c443a32281d140a00000000000000000000000000000000000000000000000000000000000000000006111b252d313940454b51575e616d727c859196a1a8afa69f9691847b6e695e554b42382d22170b020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2c3845525f6b7885929eabb8b1a4988b7e71707070707c8995a2afb5a89b8f82757171717272737475767570677683909da9b6b7afa9a19e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9e9f9f9fa3a0a0a0a0a1a1a2a094877a6d6154473a2e211407000000000000000000000000000000000003101c28343f4a546b7885929eabb8c3b6aa9d9083776a5d50442e393b4754616e7a8794abb5bfbcafa296897c6f635649505b66737f8c98a2aebdb7afa9a7a9abb1b1a7a09691847b6e685e554b515d6776838e8c898074675a4d4134271a0e01000007121d2935414c565e686d726d67605c64707d8a97a2a9a19791847a6d676673808c928c857f7975716d6761606d797c7c7c7c7c7b7b7b7b7b7a7a7a7a7a7a7b8894a1aebbb9ac9f92867a7a7a7a7a7b7b7c7c7d7d7e7f81838486877d7064574a3d3124170a00000000000000000815222e3b4855616e7b83838282818180807f7f7e7e7e7d7d7c7c7b7b7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7b7b7b7c7c7c7d7d7d7e7e7f8080818283838276695c504336291d1003000000000000000815212e3b4854616e7b807f7e7d7c7b7b7a7a797979797978787878787877777777777777777777777777777777777777777777777777777777777777777777777777777778787879797979797a7a7a7b7b7b7c7d7d7e7e7f8080807b6e6154483b2e2115080000000000000000070c11171b1f201f1b17110c07000000000000000000000000000000000000000000000000000000000000000000000810171c20232426252526272722211e1a150e06000000000000000000000000000000000000000000070f161b1f222324242423232323222222212121212020201f1b1720202020202020202020202020171c1f202021212121222222222323232324242421211e1a140d05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e28323a4145474b4b4c4d4e4f4a5053545658545b606264676a6f74787c81868d92989fa6aeb4b7b1aba59e98928a81796d685e564c443a2f261b110600000000000000000000000000000000000000000000000000000000000000000009131b1f282f353940454d525b626a6f7b849196a1a9b0a8a09691857b6e675d544a3f33281d140a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabb8b3a79a8d807d7d7d7d7d7f8c98a5b2b6a99d90837d7d7e7e7e7f7f80828382756973808d99aab4bfbbb3adaba49d9a99999999999999999999999999999a9a9b9b9b9c9c9d9d9e9fa394877b6e6154483b2e2115080000000000000000000000000000000000000c17232e44515e6b7784919eaab7c4b7aa9e9184776b5e51454545454753606d7a8699a3aebbbdb0a3968a7d7063574a53606c7884919eaab4baafa59d9b9d9fa7b1b1a8a09691847a6d675d544b5564717e827f7c746e64584c3f33261a0d000000000d1924303a444c565e6165605d5553606d7985929faba9a1969083796d616e7b86857f79726d6764605d555c676d6f706f6f6f6f6e6e6e6e6e6e6e6e6e6e7a8793a0adbab9ac9f9386796e6e6e6e6e6f6f70707171727476787a7b706c6155493c3023160a00000000000000000814212d3a47535f696e7676757574747473737272717170706f6f6f6e6e6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6e6e6e6f6f707070717172727374747576777670665a4e4235291c0f03000000000000000714202d3a46525e696e737271706f6e6e6e6d6d666c6c6c6c6b6b6b6b6b6b6b6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6b6b6b6c6c6c666c6d6d6d6e6e6e6f6f70707172727373746e695e53463a2d211407000000000000030b12181b22272b2d2b27221b18120b030000000000000000000000000000000000000000000000000000000000000008121a22282d30313332313234342e2d2b261f180f060000000000000000000000000000000000000007111921272c2f303131303030302f2f2f2e2e2e2e2d2d2d2d2b27222c2c2c2c2c2c2c2c2c2c2c2c2c23282b2d2d2d2e2e2e2e2f2f2f2f3030303031312e2d2a251f170f0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c1620283035393a3e3f404041423f444648494b4a50535558586062666c70747b80868f949fa2aab2bab8afaaa29f938e837a6d685e564c41382d22170b04000000000000000000000000000000000000000000000000000000000000000001090d161d24292f343b4246515860696e7b849197a2adb2a8a1979083796d665b50443c2f261b110600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101d2935404b556c7885929fabb8b5a99d928d8a8a8a8a8a8c919ba7b3b8ab9f95908a8a8b8b8b8c8c8d8f90837669707d8998a3aebac5beb5a99d928d8c8c8c8c8c8c8c8c8c8c8c8c8c8c8d8d8e8e8f8f90909191929994897c6f6356493c30231609000000000000000000000000000000000000061e2a3744515d6a7784909daab7c3b8ab9e9285786b544a5252525252515c677986929facb9bdb1a4978a7e7164574c5663707d8996a1adbcb6a99d938e90959fa9b3b2a8a0969083796d665c5055616c7175726f6a645c52473c3024170b0000000008131e28323a444c52545854514b515c6674818e9baab2a89f958e81756d696f7c7a726d67605c5553514b555c606363636262626262616161616161616d7a8793a0adbabbafa49a86796d61616161626263636464656769676d6e69615a5044392d201408000000000000000006121e2b37424d575f616a6969686867676666656565646463636262616160606060606060606060606060606060606161616262626363646464656666676868696a69665e54493e3226190d010000000000000005121e2a36424d575e61676664636262616160605c5f5f5f5f5f5f5e5e5e5e5e5e5e5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5e5e5e5e5f5f5f5b6060606161616162636364646565666767615e574d42362a1e12050000000000030c151d23282d33373937332d28231c150c06000000000000000000000000000000000000000000000000000000000005101a242c33393c3d403f3e3f40413b3a37312a21180e030000000000000000000000000000000000050f19232b32383b3c3e3d3d3d3d3c3c3c3c3b3b3b3a3a3a3a3937332d393939393939393939393939392e34383a3a3a3a3b3b3b3b3c3c3c3c3d3d3d3d3e3b3a36312921170d0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040e161e24292c2d31323334342e34383a3b3d3e3f4446484b4e54545b6063696e747b828b9298a1a8b2babcb4aea59d9590837a6d685e53493f332720150a00000000000000000000000000000000000000000000000000000000000000000000040c12181d232930363f464e575f696f7c85929fa4aeb2a9a0958f82786c60574e41382d22170b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515d677985929facafafaea49d9a9696969696989ba3adacacb1a79f9d979797989898999a9b8e8174686d7986929facb9c5c0b4a79a8d807f7f7f7f7f7f7f7f7f7f7f7f7f8080818181828283838485868787887f7265584b3f3225180c000000000000000000000000000000000003101d2a3643505d697683909ca9b6c3b8ac9f928579665c5f5f5f5f5f5f5f556b7885929eabb8beb1a5988b7e726558525d6875818e9ba8b2bbb0a69b8e81839097a1acb6b2a89f958f81786d605b515a61646866626058524a41362b1f130700000000020c162028323a4146474b4745414a5463707d8a98a2aeb1a79e938c7f736c6a6f6d67605d55514b4745434b51535656565655555555555454545454616d7a8794a0adbac0b6a093877a6d60545455555656575757595a555c60615e5750483e33281c10040000000000000000020e1a26313c454d53555d5c5c5b5b5b5a5a595958585757565656555554545353535353535353535353535353535454545555555656565757585859595a5b5c5c5d5c5a544c42382d21160a0000000000000000020e1a25303b454d52545a595856555555545453514b5252525252525251515151515151505050505050505050505050505050505050505050505050505050505050515151515252524a505353545454545555565657585859595a5a54534d453b31251a0e0200000000030c151e272e34383f4446443f38342e271e181008000000000000000000000000000000000000000000000000000000000b17222c363e44494a4c4b4b4c4d4e4847423c332a1f150900000000000000000000000000000000020d17212b353d4448494a4a4a4a49494949484848474747474646443f4646464646464646464646464646463f44464747474748484848494949494a4a4a4a4846423b33291f14090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c13191d2021242526272823282c2d2e302d3338393b3e43474a5053575e61696e767e869196a0a8b2babfbaafa7a09590837a6d655b50443c31261b0f040000000000000000000000000000000000000000000000000000000000000000000001070d12181f252a343d454d575f6a707d8a929da8b2b1a79e948c7f726a5f53493f33271c120700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a8698a2a2a2a2a1a1a1a1a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a1a1a1a2a39a8d817467677683909ca9b6c3c0b3a69a8d80737373737373737373737373737373747475757676777778797a7b7c796d6054473a2d211407000000000000000000000000000000000003101d293643505c6976838f9ca9b6c2baaea39886796d6c6c6c6c6c6c6c6c6c6c7884919eabb7bfb2a5998c7f72665954606d7a86929facb8b7ab9f94887c7b85929aa4afbbb1a79e938d80746d62595055575b5956544e4641382f241a0e030000000000040e1620283036393a3f3a393a4653606d7985929fabb8afa59f93887e716962605d55514b45403a39394045464949494949484848484847474754616e7a8794a1adbabaada094877a6d615447484849494a4a4b4c4e4b515354534d453e362c22170b0000000000000000000009151f2a333c42474850504f4f4e4e4d4d4c4c4b4b4b4a4a49494848474747474747474747474747474747474747474848484949494a4a4a4b4b4c4d4d4e4f5050504e49423a31261c100500000000000000000009141f29333b4246484d4c4b4a49484847474645404646454545454545444444444444444444444444444444444444444444444444444444444444444444444444444444454545463f444646474747484848494a4a4b4b4c4d4d4e4846423b33291f140900000000000a151e27303940454950535049444039302a221a12090100000000000000000000000000000000000000000106090b0c08101c28333e48505557595858595a5a55534d453c31261a0e0806060300000000000000000000000009141f29333d474f5456575757565656565555555454545453535350495353535353535353535353535353534a50535354545454555555555656565657575754534d453b31251a0e02000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d1113141818191a1b171c1f20212322282b2d2f3237383f44464d52575f616c717c849196a0a8b2bcc0b9b1a7a0958f82776c60584e43372b20150a00000000000000000000000000000000000000000000000000000000000000000000000001070c141a222b333c454e58616b74808d96a0acb9b0a69f92867b6e655b5044392e23180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b879496969595959494949493939393939393939393939393939393949494949597988e8175686774808d9aa7b3c0c1b8ac9f92867a6d666666666666666666666666676768686869696a6a6b676d6e6f6d675d5145392c201306000000000000000000000000000000000003101d2a3643505d697683909ca9b6c3bfb4aa93877a78787878787878787878787883909daab7c0b3a69a8d8073675a5565717e8b98a3aebab2a99c908376707d88939fa8b2b9b0a69d928c7f726b60564c4b4f4c4947433d342f261d130800000000000000050e161e252a2d2e322d2c3845515c6775828f9ba8b5bbafa49a92867b6e665c514b454039342f2c2e34383a3c3d3c3c3c3c3b3b3b3b3b3b4754616e7a8794a1adbabaaea194877b6e6154483b3c3c3d3d3e3e3f414045474846423b332c231a100500000000000000000000030e18212a31373a3b4343424241414140403f3f3e3e3d3d3c3c3c3b3b3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3b3b3b3c3c3d3d3d3e3e3f3f40414142434443423e3831281f150a00000000000000000000020d17212930363a3b403f3e3d3c3b3b3b3a3a38342e393938383838383838373737373737373737373737373737373737373737373737373737373737373737373737383838392d3338393a3a3a3b3b3b3c3c3d3d3e3f3f4040413b3a36312921170d030000000006111c263039424b51535b605b53514a423c342c241b130a01000000000000000000000000000000000000070d121618191514202d3944505a6164666564656767615f574d42372b1e141513120f0b06000000000000000000020e1a25303b454f59606364646363636362626261616161606060605b5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5c6060606161616162626262636363636464615e574d42362a1e120500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010407070b0c0d0d060c1012131516171c1f2022272b2d33383b42464d535a626a6f7a849196a0aab4bfc3b9b1a79e948b7f726a5f53473c32261b0f020000000000000000000000000000000000000000000000000000000000000000000000000003091019212a333c464f59606d7984919ea8b2baaea3989083786c60544a4034281c100d090806030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815212e3b4854616e7b878a8989898888888787878686868686868686868686868686868787878788898a8b8d83776a65727f8b98a5b2b7b5b3aea2988d8073675c595959595959595959595a5a5b5b5c5c5d5d5e555d606162605d554b4135291d1104000000000000000000000000000000000003101d2a3643505d697683909ca9b6c3c5b8ab9f928585858585858585858585858587929facb9bbb4a79b8e8174685b5c6775828f9baab4b9ada1978a7e716b74808d96a1adb9b8aea49f92877d6f685e544a3f3f3c3b38322b221d140b010000000000000000050c13191d202125212834404b5565727f8b98a9b3beb6aca2989083796d60584e43372f29232023282c2d3030302f2f2f2f2f2e2e2e3b4855616e7b8894a1aebbbbaea195887b6e6255483b2f2f30303131322f34383a3b3a363129211a1108000000000000000000000000060f181f262b2d2e373636353534343333323232313130302f2f2e2e2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2e2e2e2f2f2f303031313132333334353536373635322d261f160d030000000000000000000000050f171f252a2d2e343331302f2f2e2e2d2d2c28232c2c2c2c2b2b2b2b2b2b2b2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2b2b2b2b2c22282b2d2d2d2e2e2e2e2f3030313132323334342e2d2a251f170f0500000000000c17232e38424b545c60656c65605c544e463e362d251c130a01000000000000000000000000000000010911181e222526222123303c4955616c707372717273746e695f53473a2d212021201f1c17110a020000000000000005121e2a36424d57606b6f71707070706f6f6f6f6e6e6e6d6d6d6d6c656c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c666d6d6d6d6e6e6e6e6f6f6f6f70707070716e695e53463a2d211407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000003060708060b0f1213151b1c22282b30363c424650585f686e7b849198a2aebac2c3b9b0a69f92867c6f62584e43372b1e1308000000000000000000000000000000000000000000000000000000000000000000000000000000070f18212a343e45515c67717e8b96a0acb8b4aa9f958a7e71665c5144382c1f1d191515120f0a05020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a46535e69707d7d7c7c7c7c7b7b7b7a7a7a797979797979797979797979797a7a7a7a7b7b7c7d7f8080736663707d8996aaacaaa8a6a5aa9e9285796d60534c4c4c4c4c4c4c4c4d4d4e4e4e4f4f5050514b5154545554514b433a2f24180d01000000000000000000000000000000000004101d2a3743505d6a7683909da9b6c3c6baada297929292929292929292929292929299a3acacafb5a89b8f8275685c606d7985929facb8b8ab9e9184796d606d7984919ea6b0bbbbafa39991847a6d665b5044392f2e2b272019100b020000000000000000000002080d1113141818232e3c4955626f7c8897a2adb7b6afaa9f958d80736a5f53473a2e211813181c1f20232323232222222222222f3c4955626f7c8895a2afbbbbaea295887b6f6255483c2f23232424242623292c2d2e2d2a251f170f080000000000000000000000000000060e151a1e21222a2929282828272726262525242423232322222121202020202020202020202020202020212121222222232323242425252626272829292a292926211c150d0400000000000000000000000000050d141a1e2021272625232222222121201f1c181f1f1f1f1f1f1e1e1e1e1e1e1e1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1e1e1e1e1f1f171c1f202021212121222223232425252626272721211e1a140d05000000000003101c28343f4a545c666d7479726d665f5850483f372e251c130a00000000000000000000000000000009131b23292e31322f2e2b313d4a5764707e7f7e7e7f80817b6e6155483b2e2a2d2e2d2b28221c140b020000000000000714202d3a46525e696f7d7d7d7d7d7c7c7c7c7b7b7b7a7a7a7a797979797979797979797979797979797979797979797a7a7a7a7b7b7b7b7c7c7c7c7d7d7d7d7b6e6154483b2e21150800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306060a0f11171c1f252a31373f464e565e696e7c86929fa6b0bbc7c1baaea3988f82756a5f53473a3024190d01000000000000000000000000000000000000000000000000000000000000000000000000000000060f18222934404b55606d7884919ea8b1bcb1a79e9184796d6053463d32272a2622211f1b15120e09030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121e2a36424d57616b7070706f6f6f6e6e6e6e6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6e6e6e6f707273736e63616e7b8798a29f9e9b99989897978a7e7164574a404040404040404040414142424343444441454748494745413a31281d130700000000000000000000000000000000000004101d2a3743505d6a7683909da9b6c3cabeb3a9a29e9e9e9e9e9e9e9e9e9e9e9e9e9f9f9f9f9fa3a0a19c908376695d63707d8998a2aebab3a99a8d8074665d67707d8a949fabb7c0b5aba1968f82786c60554b4035291f1b160f070000000000000000000000000000010507070713202d394653606c7985929fabaaaca49f9d9b93877b6e6255483b2f2215070c10131316161616161515151623303d495663707c8996a3afb3b4afa295897c6f6256493c2f231617171819181c1f2021211e1a140d050000000000000000000000000000000003090e1214151d1d1c1c1b1b1a1a1919181818171716161515141414141414141414141414141414141414141515151616161717171818191a1a1b1c1d1d1d1c1916100a0300000000000000000000000000000002090e1214151a19181716151514141313100c071212121212121111111111111111111111111111111111111111111111111111111111111111111111111111111212120b0f1213131414141515151617171818191a1a1b1514120e090300000000000006121f2c3844505c666d7880857f786f6a615a51493f372e251b11080000000000000000000000000008121b252d353a3e3f3b3a373144515d6a77838c8b8b8c8d8b7f7265584c3f30363a3b3938332d261d140a0000000000000815212e3b4854616e7b878a8a8a89898989888888878787878686868686868686868686868686868686868686868686868787878788888888898989898a8a8a83766a5d5043372a1d1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060b0f141a1f262b343c444d575f6a717e8b949fabb7c1cbbfb4aa9e94887c6f62564c4135291d110400000000000000000000000000000000000000000000000000000000000000000000000000000000061018232f3944505c66717e8a95a0acb8b9aca0968b7e7165594f44383437332f2e2b26211e1a140e09030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1a25313b454f5961636363636262626161616160606060606060606060606060606060616161616264656766635c606c7985929a93918e8c8c8b8a8a888073675a4d403433333333333334343535353636372f35393a3b3c3a39352f281f160c0100000000000000000000000000000000000004111d2a3744505d6a7783909daab6c3c6b9ada297929292929292929292929292929292929292999394959184776a586774808d9aaab4b9ada197897c6f6355616b76828f9ca6b0b7b3ada89f948b7e71675d5145392c20130a040000000000000000000000000000000000000006121f2b3844505b6676838f9ca09e9a9a93918e8b887e7164584b3e3125180b00040607090a09090909080a1724303d4a5763707d8a96a3a6a6a7a9a296897c6f6356493c3023160a0b0b070c1013141514120e0903000000000000000000000000000000000000000206080810100f0f0e0e0e0d0d0c0c0b0b0a0a090909080807070707070707070707070707070707070708080809090a0a0a0b0b0c0c0d0e0e0f1011100f0d0a0500000000000000000000000000000000000000020507080d0c0b0a090808080707060400000605050505050505040404040404040404040404040404040404040404040404040404040404040404040404050505000003060607070708080809090a0a0b0c0c0d0d0e0807050200000000000000000713202d3a4653606d78828d928c837c716c625b51493f372d231a0f060000000000000000000000030d1a242d373f464a4c4847423c43505c6976838f989798978a7e7164574b3e3b42464846443f382f261c110600000000000814212e3b4754616e7b87949796969696959595949494949393939992929292929292929292929292929292929293999393949494949595959596969696979083766a5d5043372a1d1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e141a222a323b454e57626d76828f9ca6b0bbc6c6bcb0a69b8e8175685d5245392c201307000000000000000000000000000000000000000000000000000000000000000000000000000000000007121d28343f4a54606c7884919daab7bdb2a89d9083776b605448394044403c3a37312d2a261f1a140d08020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141f29333e474f55575756565655555554545453535353535353535353535353535354545454555657585a5a57505b6576838c89868482807f7e7d7d7c786d6053463a2d2626262626262727282829292a2a24292c2d2e2f2d2c29241d160d040000000000000000000000000000000000000004111e2a3744515d6a7784909daab7c3c5b8ab9e92858585858585858585858585858585858686868787888984786b5f6a7884919eabb7b8ab9e9185796c605359626f7c89939eaaaba9a29f9b9791857a6d6053473a2d2019140d05000000000000000000000000000000000000030f1c28333f4a546774818e9a96918d898684817e7b716c6256493d3024170a00000000000000000000000b1824313e4b5764717e8a979899999a9d9f96897d7063564a3d3023170a000000000406070807050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1825323f4b5865727e8b949e9591867e726d635b51493f352c21180c03000000000000000000010b151f2c363f4951575955534d45424f5b6875828e9ba4a396897c7063564940454d525453504a42382d22170b04000000000714202d3a4753606d7a8699a3a3a3a3a2a2a2a2a1a1a1a0a0a0a0a39f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9f9fa4a0a0a0a1a1a1a1a2a2a2a2a3a3a39c8f8276695c4f4336291c100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030910182029333c45505a626f7c88939eaab6c5cfc1b9ac9f92867a6d6054473a2d2114060000000000000000000000000000000000000000000000000000000000000000000000000000000000010b17232e3844505b66727f8c98a7b1bcb8aca095897c6f63544b4c4d504c4847433c3a36312a251f19140d05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d17212c353e44484a4a4949494948484847474746464646464646464646464646474747474848494a4c4d4d4b495363707d7f7c7a777573727171706f6d665c5044382b1f191919191a1a1b1b1b1c1c1d1d181d2021212221201d18130c04000000000000000000000000000000000000000004111e2a3744515d6a7784909daab7c3baada093877a7878787878787878787878787878797979797a7b7b7c7d6f63626f7b8896a1acb9b5ab9a8d8174665b5054606a75828f9ba69f9c97928e8b8782796d6053463a2d2a251e170e050000000000000000000000000000000000000b17222d3f4c5965727f8c908a84807d7a7774726e69625a5045392d21150800000000000000000000000c1925323f4c5865727f8b8b8b8c8d8e9092988a7d7064574a3d3124170a000000000000000000000000000000000000000000000000000000000004060707060401000000000000000000000000000000000000000000000000040607090a0b0c0b0a070705010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040607090b0c0d0d0d0c0a07070501000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c859196a098928a7f726d635b51473e332a1e150a00000000000000000007121d27313e48515b6265625f5751464d5a6774808d9aa7ab95887b6f6255484b51575e61605b544a3f332820150a000000000613202c3945515d677986929facb0afafafafaeaeaeadadadadb5afacacacacacacacacacacacacacacacacacacacafb5adadadaeaeaeaeafafafafb0a89b8f8275685c4f4235291c0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070e17202a333f4754606a75828f9ba9b3becac7bbafa3998a7d7064574a3d2e23170c00000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c28333f4a54616e7b8895a0acb8bcb1a79b8e8175665c51585a5d5955534e4846423b36302a251e170e07010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050f1a232c33383c3d3d3d3c3c3c3b3b3b3b3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3b3b3b3c3d3f4040384854606b7073706d6868666565646362605c544a3f34281c100d0d0d0d0d0e0e0f0f1010070d11131415161413110d070100000000000000000000000000000000000000000004111e2b3744515e6a7784919daab7c4baada093877a6d6b6b6b6b6b6b6b6b6b6b6b6c6c6c6c666c6d6e6f706f6b6066727f8c99a8b2bbafa399897d7063544a4e5863707c89959c94908a85827e7b766d675c51453b3936302920170d020000000000000000000000000000000000061623303c4956636f7d87837d7773706d676865625f5750483e34291d110500000000000000000000000814212e3b4754616e7b7e7e7f7f8081838588897d7063574a3d3024170a000000000000000000000000000000000000000000000000000000070c1013131413110d08010000000000000000000000000000000000000306070c1012131516181818171413110d080400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306070c1013141618191a1a1919171413110d080602000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915222e3b4854606a6f7b849197a19f918c7f726d62594f453c30261c110600000000000000000c18242f3943505a626d726e69625b524d5966737f8c99a6a499877a6d61544e545c60696e6c665b50443c32261b0e050000000713202d3a4653606d798699a3aaaaaaa9a9a9a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a8a9a9a9aaaaa89b8f8275685c4f4235291c0f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e18212b37434e5863707d8997a2adb9c6cbc0b5ab9a8d817467544a3f34281c10030000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222d3846535f697784909daab7c3b8ab9f9285796d605c64676a66625f5855534d46423b3630292018120b03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008111a21282c2f303030302f2f2f2e2e2e2e2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2e2e2e2e2f3132343338444f5960636663605d5659595857575553504a42382e23170b00000000010102020203030001040607080907060401000000000000000000000000000000000000000000000005111e2b3844515e6b7784919eaab7c4baada093877a6d605f5f5f5f5f5f5f5f5f5f5f5f5f5f5b606061626363605d687683909ca9b6b9ac9f92867a6d6053474754606b7783908f89837d7975716e69605c554b4d4746413b32291e140800000000000000000000000000000000000915222f3b4854606b6f7b76706c6763605d555855534d453e362d22170c0000000000000000000000000714202d3a46525e696e71727273737476797b7d796d6053463a2d201307000000000000000000000000000000000000000000000000050b1012181c1f2021201d19130c04000000000000000000000000000003060b0f1213181c1f2022232425252321201d1913100c0700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060c101213181d1f20232526272726252321201d1914120f0a03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007131f2c38434e5860696e7b859199a39b918c7f726b61574d42382e23170c0200000000000004101d2935404b55616c727f7b726d615e565865717e8b98a49f9386796d6053585f666d737b786c60584e43372b20170d0200000714212d3a4754606d7a87939e9e9d9d9d9c9c9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9c9c9c9d9d9d9e9c8f8376695c504336291d10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f1b27323c4653606d7985929eabb8c5d1c4b7aa9e918477665c5044382c1f120600000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c2b37424d576673808d99abb5bfbaaea2988a7d7063646e7377736f6a67615f57524d46413b3229231d150d0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000810161c2023242423232322222221212120202020202020202020202020202021212121222324252727323d474f5456595654524c4d4c4b4a4a4846443f3830261c110600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3845525e6b7885919eabb8c4baada093877a6d6054545454545454545454545454545454545455565654606d7a86939facb9b6a99d908376675d545454545964717e87827d76706d6664615e565859595954524c443b3025190e020000000000000000000000000000000007131f2c38434f5960696e696461595654514c4b4847423c332d241b100600000000000000000000000005111e2a36424d565e61656565666667666c6e706d675c5145382c1f13060000000000000000000000000000000000000000000000070f161c1d23282c2d2d2c29241e160d040000000000000000000000060b0f12171c1f2023282c2d2f30313231302e2d2a251f1c18120b060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030a0f11171c1f2024292c2d2f323233343332302e2d2925211f1a150f0a04000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27323d464e575f696f7d87929fa39f93877d70695f544a3f34281e130800000000000006131f2c3945515d67717e8a867f766e68615a64707d8a97a39e928578665c5c606a6f79808681756a5f54473e32291f140900000815212e3b4854616e7b879291919090908f8f8f8f8f8f8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8f8f8f8f8f9090909191919083776a5d5044372a1d11000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a151f2c3844515c6674818e9ba7b4c1d1c6b9ac9f9386796d6053463a2d201307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1a26313c4956626f7c8999a3aebbbeb3aa9a8d8174676c7380837f7b77736e69615e57524c443e342f271f180f060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b101416171716161616151515141414131313131313131313131313131414141415151617191a212b353d4448494c49474541403f3e3e3d3c3a38342e261e140a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2c3945525f6c7885929fabb8c5baada093877a6d606060606060606060606060606060606060606060606063707d8a99a4afbbb6ac9a8d807367616161616161616c787b76706b6362636363646465656666615e564c41362a1e110500000000000000000000000000000000030f1b27323d474f575e615e57554f4a4745413f3b3a37312a211b120900000000000000000000000000020e1925303b444d5254585858595a545b606163605c554b4034281c10040000000000000000000000000000000000000000000109111921272c2e34383a3a39352f281f160d0300000000000001050a0f11171b1f22282b2d2e34383a3c3d3e3f3e3d3a3936302c28231d17110a0200000000000000000000000000000000000000000000020200000000000000000000000000000000000000000000000000000000000000000000060b10151b1c23282c2d2f35383a3c3e3f4040403f3d3a3935302e2b26201b160d080100000000000000000000000000000000000000000000000000000000000000000000000000000000000a16212b343d454d56606b727f8c96a0a49992857b6e665c50443a3025190d020000000005121e2a36424d57606d798491928b827a706c60626f7c8995a29d9084776a5f666d727c838d92877c6f625a50443b3025190e02000714212d3a4754606d798485848484838383828282828282828282828181818181818181818181818181818181818182828282828282828283838384848485858074675a4e4134271b0e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404a5465717e8b98abb5c0cbc8bbafa49a877a6e6154473b2e211408000000000000000000000000000000000000000000000000000000000000000000000000000000000000000913202d3a4653606d7986929facb9c3b6aa9d90837767717e8a908c8884807b746e69615e564f454039312a211810070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000407090a0a0a09090908080808070707070707070707070707070707070707080808090a0c0f19232b32383b3d403d3a39352f323231302f2d2b28231c140c020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b3844505c667986929facb9c5baada093877a6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d73808c99abb5bbafa49a8a7d706d6d6d6d6e6e6e6e6e6e6e6e6e6f6f6f6f70707171727273736e685e5246392d20140700000000000000000000000000000000000a16212b353d454d5254524d49443e3a39352f2f2e2b261f180f0900000000000000000000000000000009141f29323b4246474b4b4c4c4d4a5053555653514b43392e23180c0000000000000000000000000000000000000000000009131b232b3238394045464745413a31281f150b0100000003080d11151b1b22272b2d3338393d40444648494b4b4b4a4746413a38342e28221c140b040000000000000000000000000000000000030608090e0f0707050100000000000000000000000000000000000000000000000000000000020a11171c1f262b2e34383a3d404547494b4c4d4d4c4c4a4746413b3a37312c272119130c0400000000000000000000000000000000000000000000000000000000000000000000000000000000040f19222b333c444f59606d7984919ea9a2979083786d60564c41362a1e1308000000000714212d3a46535e6973808c969f948f857e746d676e7b8894aa9c8f837669696e787f8690959a8f82766c61564d42362a1e1105000613202c3945515d676d777878777777767676757575757575757575757575757575757575757575757575757575757575757575757575757676767777787878746e64584c3f33261a0d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232e3c4955626f7c8899a3afbbc7ccc0b6ac95887b6f6255483c2f2215090000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2c3844515c667784909daab7c3b9ac9f9286796d7784919d9996918d86817b746e686159514b433c332a2219100700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007111921272c2f3033302d2c29242625242422201f1c17110a0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798699a3aebac7baaea194877b7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a82909ca9b6b9ac9f93877b7a7a7a7a7a7a7a7b7b7b7b7b7b7b7b7b7c7c7d7d7d7e7e7f7f807a6e6154473b2e2114080000000000000000000000000000000000040f19232b333b42464846423b39332d2c292422211e1a150e0600000000000000000000000000000000020d17202930363a3b3e3f3f40403f444648494645403930271d120700000000000000000000000000000000000000000006111b252d353d44484b515354514c433a31271d120703060b1013191d20262b2d3337393f4446494a515355565758585654524c46454039332d261d160d060000000000000000000000000000040a0f1215151b1c1413110d0802000000000000000000000000000000000000000000000000040a0c141c23282b3237383f4446494b51535658595a5a59585654524c4847433c383229241e160d0600000000000000000000000000000000000000000000000000000000000000000000000000000000071019212a323d44515c66717e8b97a1a9a0958b7f72685e52463a3025190d010000000815212e3b4854616e7b86929fa69f97928a81796f6d7a8698a29b8e81756c727b838c9299a09f948b7e71695e52463a2d2014070004111d2935414c555d606a6b6b6b6a6a6a69696868686868686868686868686868686868686868686868686868686868686868686868686969696a6a6a6b6b6b67645c52473c3024170b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714202d3a4753606d7a86929facb9c5d2bcafa396897c706356493d3023160a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c2834404a546875818e9ba8b4c1bbaea399897c6f7b88959ea1a09e99928e86807a706b605c554d453c342b22191007000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070f161b202223262321201d1919181717151312100b06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8793a0b4bfc0c0afa3978d87878787878787878787878787878787878787878787878787878790949fabb7bbafa49a9388878787878787878787888888888888888889898a8a8b8b8c8c897c6f6256493c2f231609000000000000000000000000000000000000071019212930363a3b3a36302d2821201d191514120e0903000000000000000000000000000000000000050e171f252a2d2e323232332d3338393b3d3a38342e271e150b000000000000000000000000000000000000000000010d18232d373f474f54545c60605d554c43392f24180f0f12171c1f252a2d3237383f44464a505356545c60626364656463615e5653514b443f382f2820170f06000000000000000000000000060e151b1f2122282921201d19130c04000000000000000000000000000000000000000000030a0f161b1e262e34383c43474a505356555d606265656667666563615e5655534e48433d352f281f17110a02000000000000000000000000000000000000000000000000000000000000000000000000000000070f18202834404a54606d7984919eaba79f92857a6d61564c41362a1d11050000020f1b2835424e5b6875818e989fa2a9a19e938e847c737985929f9a8d8074777f8690959fa3aba69f92857b6e6154473b2e21140800010d19242f3a434c51545e5f5e5e5d5d5d5c5c5c5c5c5c5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5b5c5c5c5c5c5d5d5d5e5e5e5f5a58524a41362b1f1408000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050401000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c677885919eabb8c4c9bcb0a396897d7063564a3d3023170a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c18232e404c5966737f8c99a6b2bfbfb5ab988b7f7279838b91969da4a39f99928d857d746d675f574e463c342b22190f06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040b1013161619161413110d080b0b0a090706030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894a1aeb4b4b3b3a99f979493939393939393939393939393939393939393939393939393939c9fa6b0bbc0b6aca49f9493939494949494949494949495959595959696969797989893867a6d6053473a2d20140700000000000000000000000000000000000000070f171f252a2d2e2d2a251f1c1413110d08080602000000000000000000000000000000000000000000050d14191e20212525252622282b2d2e302d2c28231d150c0300000000000000000000000000000000000000000006121e29343f4951596063666d6d675d554b403529231c1c1f23282b3036393c4347495053545b606366666d6f70717271706d6865605c55504a423a322921170d04000000000000000000010a101820262b2e2f35352e2d29241e160e0400000000000000000000000000000000000002090e151a21272c30383f44464e54545c606367676d6f717273737372706d6866625f58544f45413a3128221c140b02000000000000000000000000000000000000000000000000000000000000000000000000000000060e18232e3944505c6674818e9ba7ada2978e8174685e5246392d2014090000000d1a2633404d59667380868d92979ea1a59d969187807884919e998c7f7b828b92989fa7a39f9b95908b7e7164584b3e3125180b000008131e28313a41454751525151515050504f4f4f4f4f4f4f4f4f4f4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4f4f4f4f4f4f4f4f4f50505051515152524e4c4741382f241a0e0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000206080812110d0a0706040100000000000000000000000000000000000000000000000000000000000004101c2934404b556b7784919eaab7c4ccc0b5ab95897c6f6256493c2f2316090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000071724313d4a5764707d8a97a3b0bdc1b4a89b8e81756d787e848d929fa2aaa39f97928a80796e695f584e463d342b21180d04000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000407090a0d0a0706040100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c8995a2a8a8a7a6a6a6a6a5a1a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a9abb0b8c2bcb4aeaca5a1a0a0a0a0a0a1a1a1a1a1a1a1a1a1a2a2a2a2a3a3a4a4a59e928578675d5145382c1f13060000000000000000000000000000000000000000050d141a1e2021201e1a14100b060401000000000000000000000000000000000000000000000000000002090e11141418181919171c1f202223201f1c18120b03000000000000000000000000000000000000000000000916222e3a46515b626b7075797a6d675d51453e362b28282b2e34383a4146474e53535b6062666c707376797b7c7e7e7e7d7a77716d67605b544c443b33291f160b0200000000000000000a131c222a32373b3c41423a3935302820160b0200000000000000000000000000000001070d141a20262b32383e424a5053585f62666d7074777a7c7e7f80807f7f7d7a77736e6a636059524c433d332d261d140c0200000000000000000000000000000000000000000000000000000000000000000000000000000309121c28343f4a5466727f8c99a5b3a99f92867a6d6154473b31251a0e0200000c1925323f4b57636e737a80858c91979ea0a099928c8384919e9c8f82858f949fa2a19e99928e89837e786d6053463a2d2013070000010c161f282f35393a444545444444434343424242424242424242424242424242424242424242424242424242424242424242424242424343434444454545413f3c362f261d13080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090f1214151e1d1a171413110d07060400000000000000000000000000000000000000000000000000000004111d2935414c566b7784919eaab7c4c7bbafa499887b6f6255483c2f22150900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000916232f3c4956626f7c8995a2afbcc3b7aa9d908477666c7179808a9298a1a9a9a19e928d837b6f6a60584f473d332a1f160b020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724303d4a5763707d8a969c9b9b9a9a9999999999989898989898989898989898989898989898989898989898999ca3adb8c2bfb4aaa39f98989898989898999999999999999d9fa39f9a9a9b9b9c9d9d9e93867a6d6053473a2d20140700000000000000000000000000000000000000000003090e12141514120e09030000000000000000000000000000000000000000000000000000000000000000020507080b0c0c060b0f121315161313100c070000000000000000000000000000000000000000000000000b1824313e4a56626d727d818583796d605a50483f38333338393f44464c5254585f62656c6f74787c80838588898a8b8b8987837e79726c665d564d453b31281d140a0000000000000007111c252d343c4347484e4f4746413a32281d140a0000000000000000000000000000060b13181f252a31373d434850545c60646a6f74797c808486898b8c8d8d8c8b898784807b766f6b605d564f443f382f261e140c02000000000000000000000000000000000000000000000000000000000000000000000000060e141a1e2935404b5565727f8c98a5b2afa3998b7e7265574d42362a1e120500000a16232f3b47525c63686e737a7f858b91969da09f95909196a19e948f92989f9f9d97928c86817c77716d665c5044382b1f1206000000040d161e24292c2d3738383837373736363535353535353535353535353535353535353535353535353535353535353535353535353636363737373838383433302b241d140b01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060e151a1f21222b2a272421201d181413100c07070502000000000000000000000000000000000000000000000713202c3945525d687885929eabb8c5c6b9ac9f93867a6d6053473a2d20140700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815222e3b4855616e7b8894abb5c0c5b8ab9e9285786660676d747e869297a1a9ada49d9590857c6f6a60594f453c31281d140a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1825313e4b5864717e8b908f8f8e8d8d8c8c8c8c8c8c8c8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8b8c919ca7b4c0baaea398928b8b8b8b8c8c8c8c8c8c8c8c8c8c909598928d8d8e8f8f90909192897c6f6356493c3023160900000000000000000000000000000000000000000000000205070807050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000030606080a07060400000000000000000000000000000000000000000000000000000c1925323f4c5865727f898e928d80746c615a5046443f3f44464a5053565e61656a6f73787c8084898d909298969798979695908b857f786d685f574d433a2f261b11060000000000040f19232d373f464e53555b5c54524c443a2f261c120b0300000000000000000000060b11171d242930363c43474f545a61666d71767c8185898d9092999898999a99989696918c88827c756d686059504a423830261e140b0200000000000000000000000000000000000000000000000000000000000000000000090f181f262a303945515d6774818e9ba7b4b5ab9c908376695e53463a2d211407000007131f2a35404952565e61676d72797e848a90959c9f9d9ea1a8a69e9c9f9f9b95908b85807b756f6b65605c544a3f34281c10030000000009121b22282d30313232323231313131303030302f2f2f2f2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2e2f2f2f2f3030303031313132323232322f2e2b2720191007000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f1820262b2e2f383734302d2c2924201f1c181514120e090707050100000000000000000000000000000000010714212d3a4754606d7a8797a1adb9c6c4b7aa9e918477675d5145392c1f130600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8799a3afbbc6b9ac9f9386796d605d606c717c859297a1aaaea7a09792857c6f6b60574d433a2f261b110600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1724313d4a5764707d83838282818180807f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f8c99a5b2bfb8ac9f92867f7f7f7f7f7f7f7f7f7f7f7f7f8083909286808181828283848485877f7265584b3f3225180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1a2734414d5a6774808d9a9f928a7e706c625a53504a4a5053545c6063686d72777c8084898d9197999c9fa2aaa4a5a4a7a09d97928c827a6e695f554b41382d22170b01000000000a16212b353f4951585f626868615d564c42382d231d150c0701000000000003060b11171c23282f353b42464e535960636c70787e83888e92979a9d9fa3aba5a6a6a6a5a8a09d99948f89817a706b605b544a423830261d140a00000000000000000000000000000000000000000000000000000000000000000009121b212a31363b434c56606d7985929fabb8b9ac9f93877b6e6154483b2e2115080000020e19242e3740444c52555d60676d71787e83898f949fabacb2b0aaa399928e89837e79736e6963605953504a42382e23170b00000000050f1b242c34393d3e3f3f3f3e3e3e3e3d3d3d3d3c3c3c3c3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3c3c3c3c3d3d3d3d3e3e3e3f3f3f3f3c3b37322b22190e0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030e18212a31373a3b4544403d3a39352f2d2c292321211e1a161413110d080907060401000000000000000002050b121c28343f4a5463707d8996a9b3becabfb5ab9b8e817568554b4035291d100400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000613202d394653606c7986929facb9c5bbafa49a877b6e61545a616a6f7c859298a2aeb1a9a19792867d6f695f554b41382d22170b03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1623303c4955616c707776767575747373737372727272727272727272727272727272727272727272727272727c8895a2afbbb7aa9e918477727272727272727272737379808893988b7e747575767677787879726d62564a3d3124180b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815222f3b4855626e7b88949e9f92867e716c64605b54545b6063666d70757a7f83888d91969a9ea1a9a9acaeb4b1b1b1b1aca9a19e948f847b6e675d53493f33271e1308000000030f1b27323d47515b636a6f74756d685d544a3f342e271e18120e090909060c1012171c22282e343a40454d52585f626b6f767d848a90959a9ea2a9aaacafb5b2b3b3b2b2b2acaaa69f9c938e847d736c665c544a42382f261c11060000000000000000000000000000000000000000000000000000000000000006111b242d333b42464d555d68717e8b97a2adbabbafa49a8b7e7165584b3e3225180b000000030c1c252e323b41464c51555c60666d71777d828f9ca9b6bdb9ac9f9286817c76716d67615e57544f46443f3830261c1106000000030d17212c363e45494b4c4c4b4b4b4b4a4a4a4a4949494948484848474747474747474747474747474747474748484848494949494a4a4a4a4b4b4b4c4c4c4947433c342b20150a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915202a333c43474851504d4a4745413d3a38342f2e2d2a252321201d1918161413110d070c0b0a0a0a0b090e12151d232c3844505c6673808d9aa6b3c0c7bbaea3998a7e7164574b3e2f24180c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005121f2b3744505b657885929eabb8c5c0b6ac95897c6f625650585f6a6f7c86929fa4aeb3a9a29892857b6e675d53493f33271f1509000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814202d39444f5961646a69696868676766666666666565656565656565656565656565656565656565656565717e8a97a4b1bdb6a99c90837669656565656566666d737b828d939a9e9184796d68696a6a6b666d66625b51463a2e22150900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3a47535f6a76828f9ca39892877e77716c666967666c6f73797d82868c9095999ea1a8abadb2b6b8bab9b7b5b5b6b8b3ada69e969083796d655b50443a2f24190d01000007131f2c38444f59636d727c81827a6d665b504540393029241d1a17161617171c1f22282d33383f444b51575e616a6f757c838a91959d9fa7abadb3b7b9bbc0bfc0c0bfbebdb8b7b0aba59e96918780786d665c544a42382d22170f060000000000000000000000000000000000000000000000000000000000010c18222d363f454d53575e676d7a84919ea9b3bec0b6ac9a8d8074675a4d4134271a0e0000000b151e272e343b42464c52555c60666c71777d828f9ca9b5beb8ac9f9286807a746e69615f57534d47433c37312a22180e0300000009141f29333e48505557595858585857575757565656565555555554545454545454545454545454545454545454555555555656565657575757585858595955544e463c32271b0f030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020f1a26313c464e53555e5d5a5754514b494745403e3b3a3631302e2d2925252321201d181a181817161617181a1e21272f35414c56606d7985919eabb8c4c5b9ac9f92867a6d6154473a2e211407000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27333f495e6b7884919eabb7c4bdb0a3978a7d7064574a4e585f6a717e8a929da7b1b3aaa2979183796d655b50443c31261a0c0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004101c28333e474f55575e5d5c5c5b5a5a59595959595959585858585858585858585858585858585858585a6673808d99a6b3c0b5a89b8e8275685b545c60666d71797f8690949fa4a1978d80736b61585d545c605c5451493f34291d1206000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b37434e58626f7c88939ea399928b837d7977757476797c80848a8e92999da0a7abacb2b8b9b9b8b5aeacaaa8a8a9abadb2b0a8a0958f82776c60564c4135291d120700000915222f3b4854606b727f878e8f82786c605c514b423b352f2b262323222423282c2d33383f444a50555d60696e747c828990959da0a8abb1b8b9bec3c5c7c6c4c2c0bebdbdbebfbbb7afa8a199938d81786d665c544a3f332821180b020000000000000000000000000000000000000000000000000000000005111d29343f4850575f61696e79828f96a1adbcc5c2b5a99c8f8276695c4f4336291c10000007121d27303940454d53565d60676d72787e83898f949eabadb3b1aba298928d86807b746e69625f57534e47433c342a20150a0000020e1a25313b45505a616465656565646464646363636362626262616161616161616161616161616161616161616161626262626363636364646465656565656260584e43372b1f1306000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2b37434e585f626b6a6763605d555653514b4b4846423f3d3a393530322f2d2c29242725242423232425252a2d31394045525d68717e8a97a1adb9c5bbafa59b8e8174685d5246392d201307000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17222d44515e6b7784919eaab7c4beb1a4978b7e7164584b464e58616c74808d95a0acb8b3a9a0958f81776c60574d42372b1e150b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b17212c353e44494a51504f4f4e4e4d4d4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4c4b556875828f9ba8b5c0b3a79a8d8074675c60666d71787e848c92989fa6afa99f92877d706a60574d5053504a423f372d23180c010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020f1a26313c4754606a74818e97a1a39f95908a858482818385898d91969b9fa3abacb1b7b9bab8b3adababa39f9d9c9c9d9ea1a8acaea79e938b7e71685d5245392f24180c0000091623303c4956636f7c899399948d80736e605c544d4540393731302f2f302e34383a3f444a50545c60676d737b81878f939d9fa7acb1b8bcc2c6c8c5c4beb9b8b5b3b1b1b0b1b2b4b7b8b2aba49f938e81786d665b50443e332a1d140a000000000000000000000000000000000000000000000000000000000915212e3a45505a62696e737b828f949ea8b2bdcec3b6aa9d9083776a5d5044372a1d1100000c18232e39434b51575e61686d73797e848a90959c9e9e9fa2a9a7a09d9f9f98928d86817b746e69625f58534e463c31261b0f030005121e2a36424d57616c7172727271717171707070706f6f6f6f6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6f6f6f6f70707070717171727272726f6a6054473b2e22150800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3a47535f6a6e787773706d676663605c555754534d4c49474641413e3c3a39352f333231303030313231363a3e434b515c606d7a84919ea9b3bebdb3a99d93887c6f62564c4135291d110500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061e2b3744515e6a7784919daab7c4beb1a5988b7e7265584b3f46505a606d7983919da6b0bbb1a79e938c7f72695f53473e30271d120700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005101a232c33393c3d444343424241404040403f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f45515c677784919eaab7bfb2a5998c7f7266676d72797e848b91969fa3aab0adaba39992867c6f695e524646443f38302d251b1106000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a15202b37434e58616d7a85929aa4a7a09d9892908f8e8f92979a9ea1a8acaeb5b8bab9b4aeaca9a19e9a9992918f8f9091969a9fa3aba59e92857a6d60554b4035291d1004000815222e3b4855616e7b86929f9d928d80746d665f57514b47423f3d3c3c3d3f3f44464a50545b60666d717980868e92999ea6abb1b8bdc3c7c7c3bdb8b7b3adaba8a6a5a4a4a4a5a8aaacb2b5afa59e938e81786c605a50453c2f261b11060000000000000000000000000000000000000000000000000000000b1724313d4a56626c717b80858f949ea6b0bac4cfc4b7aa9e9184776b5e5144382b1e110004101c2834404b555c60696e747a7f858b91969d9f9e96919297a2a09590939aa19f99928e87817b756f6a625f584e43372b1f1206000714212d3a46535e69717e7f7f7e7e7e7e7d7d7d7d7c7c7c7c7b7b7b7b7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7b7b7b7b7c7c7c7c7d7d7d7d7e7e7e7f7f7f7c6f6255493c2f22160900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000815222f3b4855626e7c8483807d7a7673706d676764615e57595654524c4d4b4947454141403f3e3d3d3d3e3f4042464850555c606e74818e97a1adbbc0b5aba1978e81746a5f53443a3024190d0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004111e2a3744515d6a7784909daab7bebeb2a5988b7f7265584c3f3e45515c67707d89949eaab7b9afa59f92867b6e615a5042392e23180c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008111a21282d30313736363535343433333333333232323232323232323232323232323232323a4653606d7986929facb4b6b1a4978b7e71646d797f848b91969ea0a8a5a3a9a19e9c999892857b6e6154483b38342e261e1b13090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030f1b27323c46525e68707e88939fa5acaaa29f9d9c9a9c9ea2a9abadb2b9bab8b4aeacaaa29f9b97928d8a868482828384898e9299a1a9a1978d8073675d5145382c1f1306000714212d3a46535f6974818e99a39c928d80786e69605d55534d4b4a49494a4b4a5053545b60666c71787e858c92989fa3abb0b7bcc2c8c7c2bbb7b2acaaa9a19e9c9998979797999b9da0a8abadafa59e938c80736c61574d41382d22170b0200000000000000000000000000000000000000000000000000000b1825323e4b5865717e878d92989fa6b0b8c2ccd0c3b6a99d9083766a5d5043372a1d100006131f2c3845515c676d747b80868c92979ea0a39f938e8485929f9d90838791979ea39f99928e87817c756f6a5f53473a2e211508000815212e3b4854616e7b878c8b8b8b8b8a8a8a8a89898989888888888787878787878787878787878787878787878788888888898989898a8a8a8a8b8b8b8c8c83776a5d5044372a1d110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003101c28343f4a5465727f8c908d8a8683807c797674716e69686663615e565a585654514b4e4d4b4b4a49494a4b4d4d53545a61676d74808d939da9b2bebaafa49992857a6d61584e4332281e130800000000000000000000000000000000000000000000000000000000000000000000020608080a0909080807070604111e2a3744515d6a7784909daab0b2b5b2a5988c7f7265594c3f34404b55606b75828f9ca6b0bbbaaea3988f82766c61544b4034281c1004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000810171c2023242b2a2929282727262626262626262525252525252525252525252525252f3c4855626f7b8899a3a7a7a9aba396897d7064707d8a91969e9e9c9b9998979597918f8c8a8681796d6053473a2d28231c140c09000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a15202935414c56616c737f8c939ca4aeaeacaaa8a7a9abadb3b8b9b8b4aeacaba39f9c98928e8985817d7a77757576787c81869197a0a79e9285796d6053473a2d2014070005121e2a36424d57616e7b86929fa49c928d827b736d67625f57585656555758545c6063666c71787e838b91979fa2aaafb5bdc1c7c7c2bbb7b0aba8a09d9997918f8d8b8a8a8b8c8e9196999ea1a9aea59f93887e70695f53493f33271e130800000000000000000000000000000000000000000000000000000f1c2935424f5c6875828f979fa2aab0b8c2cad3cec1b5a89b8e8275685b4f4235281c0f000713202d3a4653606d7981868d92989ea1a8a098928b817a85929e998c7f7d858f949fa3a39f99938e87817c6f6255483c2f221509000814212e3b4754616e7a87949898989797979796969696959595959494949494949494949494949494949494949494949595959596969696979797989898989083766a5d5043372a1d100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121f2c3844505c6675818e9b9a9992908c898683807e7b787572706d6869676562605d555b5a5857575656575859575e61656c7079808d929da5afbbb4aea39f93877d70685e52463c3220160c02000000000000000000000000000000000000000000000000000000000000000003090e1214151616151514141413100c1d2a3744505d6a7783909daaa3a5a8aba5998c7f7266594c3f2e39434f59626f7c88949fabb7bfb4aa9f948a7e71665c5145382c1f160b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050b101416171e1d1c1c1b1b1a1a191919191919191919191919191919191919191924313e4b5764717e8a97999a9b9c9ea195887b6f626d798592999291908e8d8b8a888785827f7d7a756d675d5145392c2017110a020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040d1925303a44505a636d74818d929fa2aaaeb3b5b4b6b7b5b4b3adabaaa29f9b99928f8a85817d7974706d6769696a6a6f747c859095a0a2978b7e7164584b3e3125180b00020e1a26313b46535f69727f8c949fa49d9490867f79736e696765636262636566666d7074787e838a91959ea1a9aeb4bbc0c7c8c2bcb8b0aba69f9c96918c888582807e7e7d7e7f8184888c92979fa3aaa49a92857b6e655b50443a3025190d02000000000000000000000000000000000000000000000000000915222f3c4855626f7c859095a0a7b1bcc5d0d5c9bdb2a89a8d8073675a4d4034271a0d000815212e3b4854616e7b8692999fa2aaa59e9691867f757986939f9a8d80737a828c9299a0a8a49f9a938e8174685b4e4135281b0e000714202d3a4753606d7a8699a3a5a4a4a4a4a3a3a3a3a2a2a2a2a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a2a2a2a2a3a3a3a3a4a4a4a5a59c8f8276695c4f4336291c10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d7984919eaba39f9c999992908d8a8785827f7c7a787674716f6d67696866656463636364656667696e72767d848d929da4aeb9b1aaa29f918c7f726b60564c41342a200e040000000000000000000000000000000000000000000000000000000000000000060e151a1e2122232322222121201f1c181f2a3744505d6a778390989596989b9ea1998c807366594d4033303d47535f6a76828f9ca9b3bebcb0a69e9184796d6053463d33271c100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004080a0a1110100f0f0e0d0d0d0d0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0d192633404c5966737f8c8c8d8d8e8f919799877a6d6166717e888786848381807f7d7c7a787573706d68605d554b4035291d1106000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e28323e48515b606c78808a92989fa2aaaaababaaa9a7a9a29f9b98928e8a86827e7974706d6663605d555c5860626b6f7b839096a19b8f8275685c4f4235291c0f000009141f2a36424d57606c78829097a1a69f98928c85807b777472706f6f70727375797d81858a91959da0a7adb3babfc6c8c3bcb8b1aba69f9c948f8a84807c787573727171717275777b80858c92989fa7a2989083776c60564c41362a1e1308000000000000000000000000000000000000000000000000000815212e3a47535f6a6f7b839095a0aab3becaccc4b9aca096897d6f6356493c30231609000714202d3a46525e69737f8c949faaa29f938e847c726d7a879aa49b8e81746d777f8791969ea5a79f92867b6e6154483b2e2115080006131f2c3845515d677986929facb1b1b1b0b0b0b0afafafafaeaeaeaeadadadadadadadadadadadadadadadadadaeaeaeaeafafafafb0b0b0b0b1b1b1a89b8e8275685b4f4235281c0f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1824313e4b5764717e8a96a1a2a3a4a6aba39f9d9a9797918f8c89878582807e7c7a78767473727170707071727374777b7f838a91969da4aeb2ada79f98928b7f726d62594f443a3022180e0000000000000000000000000000000000000000000000000000000000000000060f1820262b2e2f302f2f2e2e2e2d2c29232b2b33404c5966737f868788898b8e9196988c807366594d40332b37434e5864707d8a97a1adb9c2b9ada1968b7e7164594f44382c1c11060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004030302020101000000000000000000000000000000000000000815222f3b4855626e7b7f808081818385878987786c60616c717b7a797776757372706f6d68696663615e56514b433a2f24180d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c16202c364044505b666c737e868d92989b9d9e9e9d9c9a9897928e8a85827e7a75716d6763605c5453514b4f4e545960696e7a849198989184776b5e5144382b1e110000030e1a26313b44505b666e7b859298a3aaa29f97928c8884817e7d7c7c7d7e808185898d91979da0a7acb1b9bec4c8c3bdb8b1aca79f9d948f89827d78736f6a69666564646466686a6e73797f8690959ea59f948b7e72685e52463a3025190d0100000000000000000000000000000000000000000000000006121f2b37434e585f696e7a839098a2aebac1c4bab0a69e9184776b6054483b2f2215090005121e2a36424d57606c78828f99a098928b81796f6a6e7b8895ac9c8f8276656c727c848e939fa0958b7e71695e53463a2d211407000713202d3a4653606d798699a3a9a8a8a8a7a7a7a7a7a7a7a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a6a7a7a7a7a7a7a7a8a8a8a9a89c8f8275695c4f4236291c0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101d293643505c6976838f9894959697999b9d9fa2aaa9a19e9b999697918f8d8b8987848381807e7e7d7c7c7d7e808184878b90949ea0a8aeada8a19e9590867e726d625b51473d32291e100700000000000000000000000000000000000000000000000000000000000000030c18212a31373a3b3d3c3c3b3b3a3a38342f3838383e4b57636d73797b7c7d7f8184888b8b7e7164584b3e3535313c4653606c7885929eabb8c5bdb2a99d9083776b615548382e23170b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000814212e3a47535f696e737373747476787a7c7d70655b5a616a6f6d6c65696866656462615e56595754524c45403a31281d130700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040e1a2428333f4a545b606c717a80858b8e919291908f8e8b8885817d7975716d6764605d5553504a4745404243474f565e686f7c86928f867d706356493d3023160a00000009141f28333f4a545e696f7c86929aa4aba9a29e9995918d8b8989888a8b8d8e92979a9ea1a9acb1b8bcc3c8c3bdb8b1aca7a09d959089827c76706c65625f585a5857575859575f62676d737b838e939da59f92857a6d61564c41362a1e1105000000000000000000000000000000000000000000000000030f1b26313c464e575e686e7b85929fa5afbcbab2a89f948b7e7265594f43382c1f130700020e1a25303b44505b666e7b87929591867e756d6763707c8996a39d9083776a606a6f7a818b92989083786c60574d42362a1e1205000714212e3a4754616d7a87949c9c9c9b9b9b9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9b9b9b9c9c9c9c908376695d5043362a1d10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1c2835424f5b68758186868788898b8d8e90929896999b9d9fa3a9a19e9c9a989596918f8e8d8b8a8a89898a8b8c8d9095989c9fa6acaba9a19e96918a837c716c625b51493f352b20170c00000000000000000000000000000000000000000000000000000000000000000b151e2a333c424748494948484747474540454545444446515b63666d6e6f707275787b7e807a6d615447424242424244505b6674818e9bacb6c0c4b8aca095897d7063544a3f34281c1003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006121e2b37424d575f62666666676869686d70706b615350585f6261605b535b5a58575554524c4c4a4746413a352f281f160c010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000081117222d38424a505a61686e737a7f828485858482817e7b7974706d6764605d5553514b46443f3a393532373d444d565f6a717e86827b706b6054483c2f221609000000030b17222d38424d57606a717e889399a2aaadaba7a09d9a989695959698999b9ea1a9abadb3b8bcc3c8c3bdb9b2aca8a09d95908a837d766f6a63605b53534e4d4b4b4a4b4c4e53555d60696e79818e939da2978d8073685e5246392d201307000000000000000000000000000000000000000000000000000a15202a343c454d565f69717e8a939eaab4b0a8a1969082776c6053463d32271b0f03000009141f28333f4a545f6974818d8e837c716c605d64717d8a97a49e9184786b5860676d757e86908a7e71655b50453b31251a0e02000815222e3b4855616e7b8890908f8f8f8e8e8e8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8e8e8e8f8f8f909084776a5d5144372a1e11000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e1b2834414d59656f75797a7b7c7d7e80828485878a8c8e919299979a9c9ea2a9a8a19e9c9b9998979696969798999a9da0a7a9a8a9a29f9a97918c847e786f6a615a51493f372d231a0e050000000000000000000000000000000000000000000000000000000000000007121d27303c454d535556565555545453514b5252515151515051545c606162636568696e72746d685e524f4f4f4f4f4e4e4a5464707d8a9aa4afbbc8bcb1a79b8e8175665c5044382b1f12060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020e1a26313c454d535559595a5a5b565d61636361594f464e5355545350494e4d4c4a49474641403d3a39353029241d160d040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006111c262f383f4450565e61686d7275777878777674716f6c6664605d5554514c4745403a38342e2c29272b323b444e58616c717a756e6960594f44382c2013070000000006111c262f3b454e58616c727f879298a1a9b0b1acaaa7a5a3a2a2a3a5a6a8abadb3b8b9bec4c7c3bcb8b2aca8a09e95918a837d76706b6260585350494743403f3e3e3e3f42474b51575f676d77808e939e9f92867a6d6154473a2e21140700000000000000000000000000000000000000000000000000030e18222a333b434d57616c75828f98a3aca69e9691847b6e655b5044372b21160a000000020b17222d38424d57616e7a8581796f6a625a5865727e8b98a59f928679685d555d606c717c8383786c6053493f33291f140900000713202d3a4653606d798283838382828281818180808080808080808080808080808080808080808080808080808080808080808080808181818282828383837f7265594c3f3226190c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c1925313d48535d6568676d6e6f7071737577797b7d7f818486888b8d8f92979597999a9c9e9fa4aba2a3a3a4a5a4a3aca49f9e9b9997928e89847f79716c655f5850483f372d251b110800000000000000000000000000000000000000000000000000000000000000000c18232e39424d575f62636262616161605c555f5e5e5e5e5d5d5d5d5d5c5c5c5c5c575f616567615e565b5b5b5b5b5b5b5b5b5b606d7a86939facb9c6c3b8ab9e9285796d6053463a2d20130700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009151f2a333c4247484c4d4d4e4e4c52545657554f473e4347484746443f42403f3d3c3a393630302e2d29251e18130c040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a141d262d333e444c52565d6065686a6b6b6a69676562605b5453514b4745413a39352f2c2823201d1b2029323c46505a61676d67615f574f473d33271c100400000000000a141d29333d46505a626d727e8692979fa6adb3b7b4b1b0afafb0b1b3b4b8b9bec4c6c5c0bbb9b1aba8a09e96918a847e78706b636059544e46443f3837323231313131373940454d555c656c77818e959c92897d7063564a3d3023170a00000000000000000000000000000000000000000000000000000610182129313c45505a616e7b86929fa09d948f847b6e695e53493f3327190f040000000006111c262f3c46525e686e79746d675f58505966737f8c99a6a399877a6d6054515a626a6e76796d665b5041382d21170d03000006131f2c3845515c676d757676767575757474747474747473737373737373737373737373737373737373737373737373737474747474747475757576767677726d63574a3e3125180c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000915202c37424b5359555d60616263646668656c6e70727577797c7e80838587898a8c8e8f9193999495969798989796969a93918e8c8985817d78736d67605b534e463e362d251b1309000000000000000000000000000000000000000000000000000000000000000004101c2834404b545f696e706f6f6e6e6d6d676c6b6b6b6b6a6a6a6a6969696969696969696968686868686868686868686868686868677884919eabb7c4c6b9ada197897c6f6356493c30231609000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030e18212a31373a3b4040404141414647494a48443e35373a3c3a3937332d3332312f2e2d2a252421201d19130d070100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020b141c2228323b41464c5254585b5e5f5e5d5c5b585553504a4745403a39352f2c29241f1c1713110e17202a343e4850555d605d55534d453d352b21160b000000000000020b17212b343e48515b626c707d858f949ea1a9aeb4b9bdbcbbbdbec0c1c4c3c2bfbab8b5afaca79f9d96918b847e78716c656159544f48433d37332d2b2625242425262b2f353c434b535b656d798390908a80776c605346392d201306000000000000000000000000000000000000000000000000000000060f171f2a333e46535f6973808c9695908a827a6e695f574d41382d2217070000000000000a141d2a36414d565e666d66605d554e4d5a6774808d9aa7ab94887b6e61554850575f62666d665c544a3f2f261b0f0500000004101c2834404b555c60696a69696968686867676767676767676767676767676767676767676767676767676767676767676767676767676868686969696a6a65635b51463a2e22160900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040f1b25303942484d4b5153545556585a535b6061636668676d6f717476787a7c7e7f81838486878889898a8b8b8a8a89888684827f7d7974706c66605d555049413c342d241b130a01000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c666e7b7c7c7b7b7a7a7a7979787878777777777676767676767575757575757575757575757575757575757575757475828f9ca8b5c2cabeb3a9998c7f7366594c403326190d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060f181f262b2e2f333333343035393a3d3d3c38332c2b2e2f2e2d2b27222725242221201e19171413110d080200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020a1117202930363a4145474b4f515252514f4e4b4846443f3a38352f2c29241f1d1812100c0604050e19222c363e434c5154514c46423c332b23190f0500000000000000050f19222c363f48515a616a6f7b828a92979fa3abacb2b4b7b8babbb9b8b6b5b4aeacaba39f9b95908a847e78716d66605b534f48443d38322b27221b1b181817181a1d242931394149535c676e7b83837d746c655b5044372b1f120500000000000000000000000000000000000000000000000000000000050d18212a36424d57606d79848b87837d756d685f574d453b2f261b1106000000000000020b1925303b444d545c605c54514b434e5b6875818e9ba8a296897c6f635649454e53545c605c544a42382d1d140a00000000000c18232e39434b51535c5d5d5c5c5c5b5b5b5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5b5b5b5c5c5c5d5d595751493f352a1e1206000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009141e2730373d3a40454748494a4b4d495053545759555c6062646769686d6f7173747678797a7b7c7d7e7e7f7e7d7c7b7a777572706d6763605b54514b443f382f2a221b120a010000000000000000000000000000000000000000000000000000000000000000000713202d3a4653606d798789898888878786868585858484848483838383838282828282828282828282828282828282828181818181818183919daab7c4c4c1b4a89b8e8175685b4e4235281b0f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060e151a1e21222626272724292d2e30302f2c28211f212221201f1b171a1917161413110d08070705010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060e171e252a2f35393a3f424445454443413e3c3938332d2c2924201d1913100c07030000000007101a242c313a41454745413a37312a2119110700000000000000000007101a242d363f47505860696e767e858d92999ea0a8a8aaacaeafacabaaa8aaa29f9c99928e89837e78716d66605c545049413e38332c271f1b17110f0a0b0b090e12181f272f38414b555e696e7776706c605b53493f33271b0f030000000000000000000000000000000000000000000000000000000000060f1a26313b45515d676e7b7e7b77706c615e564d453c33291d140a000000000000000008141f29323b424a5053504a4540434f5c6976828f9c9c9d978a7d7064574a3d42474a5053504a42382f261c0b02000000000007121d2730394045464f5050504f4f4f4e4e4e4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4e4e4e4f4f4f5050504c4a463f372d23180d010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c151e252c312f35393a3b3c3d3e403f4446484a4c4b515355585a565e616264666769666d6d6e6f7071727271706f6f6d67686663605c5553504a454039332d261d181009000000000000000000000000000000000000000000000000000000000000000000000006131f2c3845515c6678859195959494949a9392929191919190909090908f8f8f8f8f8f8f8f8f8f8f8f8f8e8e8e8e8e8e8e8e8e8e8e8e8e9195a0acb6b7b7b8b6a99c908376695d5043362a1d1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e121415191a1a1b191d2021232423201c161215151413120f0b060c0a09070705010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d14191e24292c2d3235373838373634322f2d2b28221f1d1813110d0804000000000000000008121a1f282f35393a39352f2b261f180f07000000000000000000000008121b242d353e464e575f616c717a81868c9196989b9d9fa2a49f9e9d9c9a98928f8b86817c77716d66605c54504a443f382f2c27211b160f0b06000000000001070d151d262f39434d575e616a69646159504941382d22170b0000000000000000000000000000000000000000000000000000000000000009141f2935404b555e696e716e6964615a524c443c332a21170b020000000000000000020d17202930383f4446443f383544505d6a778390909091928b7e7265584b3f37383f4446443f3830261d140a000000000000000b151e272e34383a4243434342424241414141414141404040404040404040404040404040404040404040404040404041414141414141424242434343443f3e3a352d251c110700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030c141b201d24292c2d2e2f30312d3337393b3d3f404547494b4d4c52545657595b545c606161626364656564636362605d55595653514b46443f38352f27221b140b0600000000000000000000000000000000000000000000000000000000000000000000000004111d2935414b55697683909ca2a1a1a0a49f9f9e9e9e9e9d9d9d9d9c9c9c9c9c9c9c9c9c9c9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9da0a8a9a9aaababacaa9d9083776a5d5044372a1d110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020608080d0d0d080d11131416171614100b0608090706050300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d13191d202125282b2c2b2a29282522201f1c1713100c0704010000000000000000000000080d161e24292c2d2c29241e1a140e060000000000000000000000000009121b232c343d454d535a61686d747a8084888c8e9192989a9391908f8d8a86827e7b756f6b64605c54504a443f38332d261d1c160f0a03000000000000000000030b141d27303b454d53545d5d57554f443f382f261b110600000000000000000000000000000000000000000000000000000000000000030c18242f39434d575e6164615e57555046413a322a21180f0500000000000000000000050e171e262e34383a38342e35424e5b6875818584838485867d7063564a3d302e34383a38342e261e150b0200000000000000030c151d23282c2d36373636363535353434343434343434343434343434343434343434343434343434343434343434343434343434353535363636373732312e2a231c130a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090f1513181d20202122232522272b2d2e302f34383a3c3e41414647494b4c4e4a5053545556565758585757565554514c4c4a4645403938332d29241d17110a02000000000000000000000000000000000000000000000000000000000000000000000000000613202c3945515d677884919ea0a0a39f9f9f9e9e9e9d9d9d9c9c9b9b9b9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9a9b9b9b9c9c9c9d9d9e9f9fa39d9184776a5e5144372b1e1100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010507070a0a0907040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001080d111314181c1e1f1f1e1c1b181513120f0b060400000000000000000000000000000000040c13191d2021201d19130e090300000000000000000000000000000009111a222b333b424650565d61686e73777b7f818485868786858382807d7975726e6963605953504a443f38342e27221b140b0b05000000000000000000000000020b151e29333b42464851504a49443e332d261d140a00000000000000000000000000000000000000000000000000000000000000000007121d27313b454d53545854534d49443e36302820180f06000000000000000000000000050c141c23282b2d2b282334404d59656f75787776777879706b6055483c2f23282c2d2c28231c150c03000000000000000000030b12181c1f20292a2a292929282828272727272727272727272727272727272727272727272727272727272727272727272727272828282929292a2a2625221e18110a0100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000401070d11131415161718171b1f20212423292c2d2f313036393a3c3e40413f44464748494a4b4b4c4b4a49484745413f3d3a38342e2b28221c18120b060000000000000000000000000000000000000000000000000000000000000000000000000000000714212d3a4754606d7a8796949393999292929191919090908f8f8f8e8e8e8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8d8e8e8e8f8f8f8f909191929299949184776b5e5144382b1e1100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010406070c0f11121211100e0b09060603000000000000000000000000000000000000000001080d11131413110d0801000000000000000000000000000000000000081019212931363e444c52565e61666a6f72757779797a7978777574706d6765615e57544f46443f38342e28231c17110a02000000000000000000000000000000030c17212931363a3b44433d3c393327221b140b02000000000000000000000000000000000000000000000000000000000000000000010b151f29333b4246484b4846423b39332a251e160e060000000000000000000000000000020a11171c1f201f1c24313d48535d65686b6a696a6b6c6360594f44382c201c1f201f1c17110a03000000000000000000000000070c1013131c1d1d1d1c1c1c1b1b1b1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1b1b1b1c1c1c1d1d1d191816120d07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000104060708090a060b0f12131517181c1f202225252a2d2e2f31332e34383a3a3b3c3d3e3f3f3e3d3c3c3a39352f302d2c28231f1c17110c0701000000000000000000000000000000000000000000000000000000000000000000000000000000000714212e3a4754616d7a878787878686868585858484848383838282828181818181818181818181818181818181818181818181818181828282828383848485868687878174685b4e4135281b0e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000204050504030100000000000000000000000000000000000000000000000000000001040607060401000000000000000000000000000000000000000000070f171f262a323a41464c5254585f6265686a666d6d6d666a696763605d5554524d48433d38342e28231c17110b06000000000000000000000000000000000000050f171f252a2d2e373631302d282117110a020000000000000000000000000000000000000000000000000000000000000000000000030d17212931363a3b3e3b3a36312d282219130c050000000000000000000000000000000000060b1012131210202c37414b53595b5f5d5d5e5f5f56554f473d33271c10121312100c06000000000000000000000000000000000406070f1010100f0f0f0e0e0e0e0e0e0e0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0e0e0e0e0e0e0e0f0f0f101010110c0c090601000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003050608070c1013141618191e202123242623282c2d2e2e2f303132323130302f2d2c292423201f1c18120f0b06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000713202d3946525e686e7a7b7a7a7a7979797878787777777676767575757474747474747474747474747474747474747474747474747475757576767677787879797a7b786c605346392d201306000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060d141a202830353b4146474e5355595b545c6061605c545c5a5753514b4746423b38322b28231c17110b06000000000000000000000000000000000000000000050d141a1e21212a2a2423201c170b060000000000000000000000000000000000000000000000000000000000000000000000000000050f171f252a2d2e312e2d2a251f1c170d08020000000000000000000000000000000000000000030607060f1a252f3941484d4e5251505152524a48443d352c21160b060706030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004060709080d111314161819171c1f20212223232425252424232221201d19171313100c070300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005111d2935414c565e686e6e6e6d6d6c666c6c6b6b6b6a6a6a69696868686767676767676767676767676767676767676767676767676868686969696a6a6b6c676d6d6e6c665b5044382b1f12060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e161e24293036393c4347484c4e4a50535453504a4f4d4a4745403b3a36302c271f1c17110b0600000000000000000000000000000000000000000000000003090e1214151e1d171614100b0500000000000000000000000000000000000000000000000000000000000000000000000000000000050d141a1e21212521211e1a14100b05000000000000000000000000000000000000000000000000000009131d272f373d40424544434445463d3c38332c231a0f050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001050707090b060c10121314151617181819181716151413110d08070604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010d1925303a444c565e6161616060605b5f5f5e5e5e5d5d5d5c5c5c5b5b5b5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5b5b5b5c5c5c5c5d5e5e555c606161605b544a3f33281c0f03000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040c13191e252a2d31373a3c3f423f44464746443f42413d3a38352f2d2a251f1b16100b06000000000000000000000000000000000000000000000000000000000205070811100a0a08040000000000000000000000000000000000000000000000000000000000000000000000000000000000000003090e121415181514120e090300000000000000000000000000000000000000000000000000000000020b151d252c313435383736373839302f2c27211a1108000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306070708090a0b0c0c0b0a090907060401000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008131e28323b444c52545454545353504a52525151515050504f4f4f4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4e4f4f4f4f505051514b5153545453504a42382d22170b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080d14191e20262b2e2f322e34383a3a3a38342e34302d2c2924201e1a140f0a0300000000000000000000000000000000000000000000000000000000000000000000040300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080b0807050200000000000000000000000000000000000000000000000000000000000000030b131a202427282c2a2a2b2c2c2323201c160f0800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020c162029323b4146474847474746443f454545444444434343424242414141414141414141414141414141414141414141414141414242424343434445404546474746443f382f261c11060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080e11151b1f21222623282c2d2e2d2c28232724201f1d1814110e0902000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002090f14181b1b1f1e1d1e1f1f171614100b05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040e1720293036393b3b3b3a3a3938332d383838373737363635353534343434343434343434343434343434343434343434343435353536363637372e34383a3a3b3938332d261d140a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002050a0f12151519171c1f2021201f1c171a171413100c07050200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004080c0e0f1211101112130a090704000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050e171e252a2d2e2e2e2d2d2d2b28222b2b2b2a2a2a29292928282827272727272727272727272727272727272727272727282828292929292a2b23282c2d2e2e2d2b28221c140b020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003060809060c101213141312100c060a0706040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001020504030405060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050d14191e202121212120201f1c171f1e1e1e1d1d1d1c1c1c1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1c1c1c1c1d1d1e181c1f202121201f1c17110a0200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000306070707060300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002080e1114141514141413120f0b06121111111010100f0f0f0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0e0f0f0f101010070c101313141413120f0b0600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020507080808070706060300000505040404030302020201010101010101010101010101010101010101010101010102020203030304000004060707080606030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + m_StreamData: + serializedVersion: 2 + offset: 0 + size: 0 + path: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 71c1514a6bd24e1e882cebbe1904ce04, type: 3} + m_Name: FGO-Main-Font SDF + m_EditorClassIdentifier: + hashCode: 1491039623 + material: {fileID: 3861585161733349673} + materialHashCode: -797811257 + m_Version: 1.1.0 + m_SourceFontFileGUID: 2757226890267cf49ab66d12478a74b3 + m_SourceFontFile_EditorRef: {fileID: 12800000, guid: 2757226890267cf49ab66d12478a74b3, type: 3} + m_SourceFontFile: {fileID: 12800000, guid: 2757226890267cf49ab66d12478a74b3, type: 3} + m_AtlasPopulationMode: 1 + m_FaceInfo: + m_FaceIndex: 0 + m_FamilyName: FOT-Fate_Go Skip + m_StyleName: B + m_PointSize: 90 + m_Scale: 1 + m_LineHeight: 115 + m_AscentLine: 79.200005 + m_CapLine: 71 + m_MeanLine: 49 + m_Baseline: 0 + m_DescentLine: -10.8 + m_SuperscriptOffset: 79.200005 + m_SuperscriptSize: 0.5 + m_SubscriptOffset: -10.8 + m_SubscriptSize: 0.5 + m_UnderlineOffset: -9 + m_UnderlineThickness: 4.5 + m_StrikethroughOffset: 19.6 + m_StrikethroughThickness: 4.5 + m_TabWidth: 32 + m_GlyphTable: + - m_Index: 1 + m_Metrics: + m_Width: 0 + m_Height: 0 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 0 + m_HorizontalAdvance: 31.5 + m_GlyphRect: + m_X: 0 + m_Y: 0 + m_Width: 0 + m_Height: 0 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 3 + m_Metrics: + m_Width: 26.359375 + m_Height: 29.609375 + m_HorizontalBearingX: 3.515625 + m_HorizontalBearingY: 70.828125 + m_HorizontalAdvance: 33.390625 + m_GlyphRect: + m_X: 735 + m_Y: 297 + m_Width: 27 + m_Height: 30 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 4 + m_Metrics: + m_Width: 55.265625 + m_Height: 74.421875 + m_HorizontalBearingX: 2.609375 + m_HorizontalBearingY: 70.375 + m_HorizontalAdvance: 60.296875 + m_GlyphRect: + m_X: 412 + m_Y: 177 + m_Width: 56 + m_Height: 76 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 7 + m_Metrics: + m_Width: 72.8125 + m_Height: 76.671875 + m_HorizontalBearingX: 3.421875 + m_HorizontalBearingY: 71.453125 + m_HorizontalAdvance: 77.765625 + m_GlyphRect: + m_X: 310 + m_Y: 472 + m_Width: 74 + m_Height: 78 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 8 + m_Metrics: + m_Width: 11.421875 + m_Height: 29.609375 + m_HorizontalBearingX: 10.625 + m_HorizontalBearingY: 70.921875 + m_HorizontalAdvance: 33.390625 + m_GlyphRect: + m_X: 85 + m_Y: 379 + m_Width: 13 + m_Height: 30 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 9 + m_Metrics: + m_Width: 27.71875 + m_Height: 93.953125 + m_HorizontalBearingX: 9.453125 + m_HorizontalBearingY: 75.953125 + m_HorizontalAdvance: 38.15625 + m_GlyphRect: + m_X: 408 + m_Y: 346 + m_Width: 29 + m_Height: 94 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 10 + m_Metrics: + m_Width: 27.71875 + m_Height: 93.953125 + m_HorizontalBearingX: 0.984375 + m_HorizontalBearingY: 75.953125 + m_HorizontalAdvance: 38.15625 + m_GlyphRect: + m_X: 850 + m_Y: 202 + m_Width: 29 + m_Height: 94 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 11 + m_Metrics: + m_Width: 34.015625 + m_Height: 35.640625 + m_HorizontalBearingX: 6.75 + m_HorizontalBearingY: 70.015625 + m_HorizontalAdvance: 47.609375 + m_GlyphRect: + m_X: 450 + m_Y: 975 + m_Width: 35 + m_Height: 37 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 13 + m_Metrics: + m_Width: 17.546875 + m_Height: 32.40625 + m_HorizontalBearingX: 3.875 + m_HorizontalBearingY: 13.953125 + m_HorizontalAdvance: 26.1875 + m_GlyphRect: + m_X: 828 + m_Y: 444 + m_Width: 19 + m_Height: 33 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 14 + m_Metrics: + m_Width: 31.140625 + m_Height: 8.8125 + m_HorizontalBearingX: 5.84375 + m_HorizontalBearingY: 26.90625 + m_HorizontalAdvance: 42.84375 + m_GlyphRect: + m_X: 966 + m_Y: 374 + m_Width: 32 + m_Height: 9 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 15 + m_Metrics: + m_Width: 16.65625 + m_Height: 16.5625 + m_HorizontalBearingX: 4.765625 + m_HorizontalBearingY: 11.96875 + m_HorizontalAdvance: 26.1875 + m_GlyphRect: + m_X: 367 + m_Y: 372 + m_Width: 18 + m_Height: 17 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 16 + m_Metrics: + m_Width: 32.84375 + m_Height: 75.6875 + m_HorizontalBearingX: 0.8125 + m_HorizontalBearingY: 71.734375 + m_HorizontalAdvance: 34.46875 + m_GlyphRect: + m_X: 403 + m_Y: 459 + m_Width: 34 + m_Height: 76 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 17 + m_Metrics: + m_Width: 58.9375 + m_Height: 76.859375 + m_HorizontalBearingX: 2.796875 + m_HorizontalBearingY: 71.640625 + m_HorizontalAdvance: 64.53125 + m_GlyphRect: + m_X: 10 + m_Y: 210 + m_Width: 60 + m_Height: 78 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 18 + m_Metrics: + m_Width: 34.640625 + m_Height: 74.875 + m_HorizontalBearingX: 8.015625 + m_HorizontalBearingY: 70.828125 + m_HorizontalAdvance: 64.53125 + m_GlyphRect: + m_X: 573 + m_Y: 107 + m_Width: 35 + m_Height: 76 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 19 + m_Metrics: + m_Width: 52.46875 + m_Height: 75.328125 + m_HorizontalBearingX: 4.59375 + m_HorizontalBearingY: 71.640625 + m_HorizontalAdvance: 64.53125 + m_GlyphRect: + m_X: 778 + m_Y: 105 + m_Width: 54 + m_Height: 76 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 20 + m_Metrics: + m_Width: 53.90625 + m_Height: 76.859375 + m_HorizontalBearingX: 4.5 + m_HorizontalBearingY: 71.640625 + m_HorizontalAdvance: 64.53125 + m_GlyphRect: + m_X: 554 + m_Y: 10 + m_Width: 55 + m_Height: 78 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 21 + m_Metrics: + m_Width: 58.953125 + m_Height: 74.96875 + m_HorizontalBearingX: 2.515625 + m_HorizontalBearingY: 70.921875 + m_HorizontalAdvance: 64.53125 + m_GlyphRect: + m_X: 865 + m_Y: 10 + m_Width: 60 + m_Height: 76 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 22 + m_Metrics: + m_Width: 52.5625 + m_Height: 76.765625 + m_HorizontalBearingX: 5.578125 + m_HorizontalBearingY: 71.453125 + m_HorizontalAdvance: 64.53125 + m_GlyphRect: + m_X: 851 + m_Y: 105 + m_Width: 54 + m_Height: 78 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 23 + m_Metrics: + m_Width: 55.890625 + m_Height: 76.953125 + m_HorizontalBearingX: 4.953125 + m_HorizontalBearingY: 71.734375 + m_HorizontalAdvance: 64.53125 + m_GlyphRect: + m_X: 702 + m_Y: 105 + m_Width: 57 + m_Height: 78 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 24 + m_Metrics: + m_Width: 52.75 + m_Height: 74.15625 + m_HorizontalBearingX: 6.65625 + m_HorizontalBearingY: 70.109375 + m_HorizontalAdvance: 64.53125 + m_GlyphRect: + m_X: 627 + m_Y: 110 + m_Width: 54 + m_Height: 76 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 25 + m_Metrics: + m_Width: 57.5 + m_Height: 76.859375 + m_HorizontalBearingX: 3.515625 + m_HorizontalBearingY: 71.640625 + m_HorizontalAdvance: 64.53125 + m_GlyphRect: + m_X: 924 + m_Y: 107 + m_Width: 59 + m_Height: 78 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 26 + m_Metrics: + m_Width: 55.796875 + m_Height: 76.6875 + m_HorizontalBearingX: 3.875 + m_HorizontalBearingY: 71.640625 + m_HorizontalAdvance: 64.53125 + m_GlyphRect: + m_X: 944 + m_Y: 10 + m_Width: 57 + m_Height: 78 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 27 + m_Metrics: + m_Width: 16.65625 + m_Height: 53.46875 + m_HorizontalBearingX: 4.765625 + m_HorizontalBearingY: 48.875 + m_HorizontalAdvance: 26.1875 + m_GlyphRect: + m_X: 243 + m_Y: 496 + m_Width: 18 + m_Height: 54 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 28 + m_Metrics: + m_Width: 17.546875 + m_Height: 67.328125 + m_HorizontalBearingX: 3.875 + m_HorizontalBearingY: 48.875 + m_HorizontalAdvance: 26.1875 + m_GlyphRect: + m_X: 350 + m_Y: 569 + m_Width: 19 + m_Height: 68 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 30 + m_Metrics: + m_Width: 55 + m_Height: 29.15625 + m_HorizontalBearingX: 5.84375 + m_HorizontalBearingY: 36.8125 + m_HorizontalAdvance: 66.59375 + m_GlyphRect: + m_X: 504 + m_Y: 975 + m_Width: 56 + m_Height: 30 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 34 + m_Metrics: + m_Width: 70.296875 + m_Height: 74.875 + m_HorizontalBearingX: 0.625 + m_HorizontalBearingY: 70.828125 + m_HorizontalAdvance: 71.453125 + m_GlyphRect: + m_X: 702 + m_Y: 10 + m_Width: 71 + m_Height: 76 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 35 + m_Metrics: + m_Width: 60.21875 + m_Height: 73.625 + m_HorizontalBearingX: 6.65625 + m_HorizontalBearingY: 69.9375 + m_HorizontalAdvance: 70.109375 + m_GlyphRect: + m_X: 328 + m_Y: 184 + m_Width: 61 + m_Height: 74 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 36 + m_Metrics: + m_Width: 64.890625 + m_Height: 76.859375 + m_HorizontalBearingX: 3.328125 + m_HorizontalBearingY: 71.546875 + m_HorizontalAdvance: 70.46875 + m_GlyphRect: + m_X: 331 + m_Y: 10 + m_Width: 66 + m_Height: 78 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 37 + m_Metrics: + m_Width: 66.609375 + m_Height: 73.703125 + m_HorizontalBearingX: 6.5625 + m_HorizontalBearingY: 70.015625 + m_HorizontalAdvance: 76.234375 + m_GlyphRect: + m_X: 416 + m_Y: 83 + m_Width: 68 + m_Height: 75 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 38 + m_Metrics: + m_Width: 55.359375 + m_Height: 74.421875 + m_HorizontalBearingX: 6.5625 + m_HorizontalBearingY: 70.375 + m_HorizontalAdvance: 64.34375 + m_GlyphRect: + m_X: 10 + m_Y: 403 + m_Width: 56 + m_Height: 76 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 39 + m_Metrics: + m_Width: 52.46875 + m_Height: 74.515625 + m_HorizontalBearingX: 7.734375 + m_HorizontalBearingY: 70.375 + m_HorizontalAdvance: 63.453125 + m_GlyphRect: + m_X: 792 + m_Y: 10 + m_Width: 54 + m_Height: 76 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 40 + m_Metrics: + m_Width: 66.703125 + m_Height: 76.953125 + m_HorizontalBearingX: 3.59375 + m_HorizontalBearingY: 71.734375 + m_HorizontalAdvance: 75.234375 + m_GlyphRect: + m_X: 147 + m_Y: 201 + m_Width: 68 + m_Height: 78 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 41 + m_Metrics: + m_Width: 63.8125 + m_Height: 75.0625 + m_HorizontalBearingX: 6.5625 + m_HorizontalBearingY: 70.921875 + m_HorizontalAdvance: 76.953125 + m_GlyphRect: + m_X: 85 + m_Y: 428 + m_Width: 65 + m_Height: 76 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 42 + m_Metrics: + m_Width: 14.390625 + m_Height: 74.96875 + m_HorizontalBearingX: 6.484375 + m_HorizontalBearingY: 70.828125 + m_HorizontalAdvance: 27.453125 + m_GlyphRect: + m_X: 89 + m_Y: 284 + m_Width: 15 + m_Height: 76 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 43 + m_Metrics: + m_Width: 43.828125 + m_Height: 75.96875 + m_HorizontalBearingX: 1.796875 + m_HorizontalBearingY: 70.921875 + m_HorizontalAdvance: 54.984375 + m_GlyphRect: + m_X: 123 + m_Y: 298 + m_Width: 45 + m_Height: 77 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 44 + m_Metrics: + m_Width: 60.390625 + m_Height: 75.15625 + m_HorizontalBearingX: 6.484375 + m_HorizontalBearingY: 70.921875 + m_HorizontalAdvance: 66.234375 + m_GlyphRect: + m_X: 328 + m_Y: 277 + m_Width: 61 + m_Height: 76 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 45 + m_Metrics: + m_Width: 54.8125 + m_Height: 74.96875 + m_HorizontalBearingX: 6.65625 + m_HorizontalBearingY: 70.921875 + m_HorizontalAdvance: 63.625 + m_GlyphRect: + m_X: 167 + m_Y: 106 + m_Width: 56 + m_Height: 76 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 46 + m_Metrics: + m_Width: 75.0625 + m_Height: 75.25 + m_HorizontalBearingX: 5.9375 + m_HorizontalBearingY: 71.015625 + m_HorizontalAdvance: 87.125 + m_GlyphRect: + m_X: 169 + m_Y: 10 + m_Width: 76 + m_Height: 77 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 47 + m_Metrics: + m_Width: 62.546875 + m_Height: 74.96875 + m_HorizontalBearingX: 6.390625 + m_HorizontalBearingY: 70.828125 + m_HorizontalAdvance: 75.328125 + m_GlyphRect: + m_X: 700 + m_Y: 202 + m_Width: 63 + m_Height: 76 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 48 + m_Metrics: + m_Width: 74.96875 + m_Height: 76.953125 + m_HorizontalBearingX: 3.59375 + m_HorizontalBearingY: 71.640625 + m_HorizontalAdvance: 82.171875 + m_GlyphRect: + m_X: 456 + m_Y: 396 + m_Width: 76 + m_Height: 78 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 49 + m_Metrics: + m_Width: 62.28125 + m_Height: 74.34375 + m_HorizontalBearingX: 6.5625 + m_HorizontalBearingY: 70.203125 + m_HorizontalAdvance: 71.734375 + m_GlyphRect: + m_X: 482 + m_Y: 301 + m_Width: 63 + m_Height: 76 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 50 + m_Metrics: + m_Width: 76.953125 + m_Height: 93.875 + m_HorizontalBearingX: 3.421875 + m_HorizontalBearingY: 71.640625 + m_HorizontalAdvance: 82.171875 + m_GlyphRect: + m_X: 731 + m_Y: 444 + m_Width: 78 + m_Height: 95 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 51 + m_Metrics: + m_Width: 66.15625 + m_Height: 74.609375 + m_HorizontalBearingX: 6.390625 + m_HorizontalBearingY: 70.015625 + m_HorizontalAdvance: 72.09375 + m_GlyphRect: + m_X: 242 + m_Y: 184 + m_Width: 67 + m_Height: 76 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 52 + m_Metrics: + m_Width: 56.609375 + m_Height: 77.140625 + m_HorizontalBearingX: 3.875 + m_HorizontalBearingY: 71.734375 + m_HorizontalAdvance: 63.625 + m_GlyphRect: + m_X: 234 + m_Y: 279 + m_Width: 58 + m_Height: 78 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 53 + m_Metrics: + m_Width: 65.25 + m_Height: 74.515625 + m_HorizontalBearingX: 1.625 + m_HorizontalBearingY: 70.375 + m_HorizontalAdvance: 68.40625 + m_GlyphRect: + m_X: 487 + m_Y: 206 + m_Width: 66 + m_Height: 76 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 54 + m_Metrics: + m_Width: 63.71875 + m_Height: 76.140625 + m_HorizontalBearingX: 6.390625 + m_HorizontalBearingY: 70.828125 + m_HorizontalAdvance: 76.3125 + m_GlyphRect: + m_X: 806 + m_Y: 348 + m_Width: 65 + m_Height: 77 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 55 + m_Metrics: + m_Width: 69.5625 + m_Height: 75.046875 + m_HorizontalBearingX: 0.453125 + m_HorizontalBearingY: 71.09375 + m_HorizontalAdvance: 70.46875 + m_GlyphRect: + m_X: 572 + m_Y: 279 + m_Width: 71 + m_Height: 76 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 56 + m_Metrics: + m_Width: 92.78125 + m_Height: 75.421875 + m_HorizontalBearingX: 1.265625 + m_HorizontalBearingY: 71.28125 + m_HorizontalAdvance: 95.125 + m_GlyphRect: + m_X: 890 + m_Y: 402 + m_Width: 94 + m_Height: 77 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 57 + m_Metrics: + m_Width: 69.03125 + m_Height: 75.515625 + m_HorizontalBearingX: 0.625 + m_HorizontalBearingY: 71.28125 + m_HorizontalAdvance: 70.109375 + m_GlyphRect: + m_X: 78 + m_Y: 523 + m_Width: 70 + m_Height: 77 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 58 + m_Metrics: + m_Width: 67.3125 + m_Height: 75.421875 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: 71.28125 + m_HorizontalAdvance: 67.5 + m_GlyphRect: + m_X: 551 + m_Y: 468 + m_Width: 68 + m_Height: 77 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 59 + m_Metrics: + m_Width: 59.390625 + m_Height: 74.0625 + m_HorizontalBearingX: 2.34375 + m_HorizontalBearingY: 70.375 + m_HorizontalAdvance: 64.078125 + m_GlyphRect: + m_X: 564 + m_Y: 374 + m_Width: 60 + m_Height: 75 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 64 + m_Metrics: + m_Width: 45 + m_Height: 6.21875 + m_HorizontalBearingX: 0 + m_HorizontalBearingY: -10.796875 + m_HorizontalAdvance: 45 + m_GlyphRect: + m_X: 105 + m_Y: 10 + m_Width: 45 + m_Height: 8 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 66 + m_Metrics: + m_Width: 50.671875 + m_Height: 53.734375 + m_HorizontalBearingX: 2.875 + m_HorizontalBearingY: 48.78125 + m_HorizontalAdvance: 54.90625 + m_GlyphRect: + m_X: 416 + m_Y: 10 + m_Width: 52 + m_Height: 54 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 67 + m_Metrics: + m_Width: 51.75 + m_Height: 80.375 + m_HorizontalBearingX: 6.296875 + m_HorizontalBearingY: 75.515625 + m_HorizontalAdvance: 60.84375 + m_GlyphRect: + m_X: 187 + m_Y: 376 + m_Width: 53 + m_Height: 81 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 68 + m_Metrics: + m_Width: 47.4375 + m_Height: 53.734375 + m_HorizontalBearingX: 4.046875 + m_HorizontalBearingY: 48.78125 + m_HorizontalAdvance: 54.265625 + m_GlyphRect: + m_X: 487 + m_Y: 10 + m_Width: 48 + m_Height: 54 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 69 + m_Metrics: + m_Width: 53.1875 + m_Height: 80.375 + m_HorizontalBearingX: 2.875 + m_HorizontalBearingY: 75.515625 + m_HorizontalAdvance: 62.375 + m_GlyphRect: + m_X: 628 + m_Y: 10 + m_Width: 55 + m_Height: 81 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 70 + m_Metrics: + m_Width: 49.140625 + m_Height: 53.734375 + m_HorizontalBearingX: 3.328125 + m_HorizontalBearingY: 48.78125 + m_HorizontalAdvance: 55.4375 + m_GlyphRect: + m_X: 10 + m_Y: 46 + m_Width: 50 + m_Height: 54 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 71 + m_Metrics: + m_Width: 35.46875 + m_Height: 79.28125 + m_HorizontalBearingX: 1.796875 + m_HorizontalBearingY: 75.234375 + m_HorizontalAdvance: 36.453125 + m_GlyphRect: + m_X: 311 + m_Y: 372 + m_Width: 37 + m_Height: 81 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 72 + m_Metrics: + m_Width: 50.9375 + m_Height: 78.296875 + m_HorizontalBearingX: 3.0625 + m_HorizontalBearingY: 52.015625 + m_HorizontalAdvance: 55.984375 + m_GlyphRect: + m_X: 503 + m_Y: 107 + m_Width: 51 + m_Height: 80 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 73 + m_Metrics: + m_Width: 47.609375 + m_Height: 79.5625 + m_HorizontalBearingX: 6.125 + m_HorizontalBearingY: 75.515625 + m_HorizontalAdvance: 59.578125 + m_GlyphRect: + m_X: 264 + m_Y: 10 + m_Width: 48 + m_Height: 81 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 74 + m_Metrics: + m_Width: 15.390625 + m_Height: 77.3125 + m_HorizontalBearingX: 5.125 + m_HorizontalBearingY: 73.265625 + m_HorizontalAdvance: 25.65625 + m_GlyphRect: + m_X: 79 + m_Y: 110 + m_Width: 16 + m_Height: 79 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 75 + m_Metrics: + m_Width: 31.859375 + m_Height: 99.640625 + m_HorizontalBearingX: -9.90625 + m_HorizontalBearingY: 73.265625 + m_HorizontalAdvance: 27.359375 + m_GlyphRect: + m_X: 259 + m_Y: 376 + m_Width: 32 + m_Height: 101 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 76 + m_Metrics: + m_Width: 47.796875 + m_Height: 79.75 + m_HorizontalBearingX: 6.296875 + m_HorizontalBearingY: 75.515625 + m_HorizontalAdvance: 53.375 + m_GlyphRect: + m_X: 898 + m_Y: 302 + m_Width: 49 + m_Height: 81 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 77 + m_Metrics: + m_Width: 13.046875 + m_Height: 79.203125 + m_HorizontalBearingX: 7.015625 + m_HorizontalBearingY: 75.0625 + m_HorizontalAdvance: 27.359375 + m_GlyphRect: + m_X: 114 + m_Y: 184 + m_Width: 14 + m_Height: 81 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 78 + m_Metrics: + m_Width: 76.671875 + m_Height: 53.1875 + m_HorizontalBearingX: 6.03125 + m_HorizontalBearingY: 49.140625 + m_HorizontalAdvance: 88.5625 + m_GlyphRect: + m_X: 242 + m_Y: 110 + m_Width: 77 + m_Height: 55 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 79 + m_Metrics: + m_Width: 47.609375 + m_Height: 53.28125 + m_HorizontalBearingX: 5.9375 + m_HorizontalBearingY: 49.234375 + m_HorizontalAdvance: 59.484375 + m_GlyphRect: + m_X: 782 + m_Y: 200 + m_Width: 49 + m_Height: 55 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 80 + m_Metrics: + m_Width: 54 + m_Height: 53.546875 + m_HorizontalBearingX: 2.875 + m_HorizontalBearingY: 48.6875 + m_HorizontalAdvance: 59.765625 + m_GlyphRect: + m_X: 338 + m_Y: 107 + m_Width: 55 + m_Height: 54 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 81 + m_Metrics: + m_Width: 51.828125 + m_Height: 75.0625 + m_HorizontalBearingX: 6.125 + m_HorizontalBearingY: 49.234375 + m_HorizontalAdvance: 60.5625 + m_GlyphRect: + m_X: 735 + m_Y: 348 + m_Width: 52 + m_Height: 76 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 82 + m_Metrics: + m_Width: 53.1875 + m_Height: 75.59375 + m_HorizontalBearingX: 2.25 + m_HorizontalBearingY: 49.765625 + m_HorizontalAdvance: 61.375 + m_GlyphRect: + m_X: 456 + m_Y: 493 + m_Width: 54 + m_Height: 76 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 83 + m_Metrics: + m_Width: 32.859375 + m_Height: 53.28125 + m_HorizontalBearingX: 6.203125 + m_HorizontalBearingY: 49.234375 + m_HorizontalAdvance: 40.5 + m_GlyphRect: + m_X: 114 + m_Y: 110 + m_Width: 34 + m_Height: 55 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 84 + m_Metrics: + m_Width: 42.671875 + m_Height: 53.546875 + m_HorizontalBearingX: 3.234375 + m_HorizontalBearingY: 48.78125 + m_HorizontalAdvance: 48.515625 + m_GlyphRect: + m_X: 105 + m_Y: 37 + m_Width: 43 + m_Height: 54 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 85 + m_Metrics: + m_Width: 34.65625 + m_Height: 70.921875 + m_HorizontalBearingX: 1.703125 + m_HorizontalBearingY: 65.875 + m_HorizontalAdvance: 37.265625 + m_GlyphRect: + m_X: 10 + m_Y: 119 + m_Width: 36 + m_Height: 72 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 86 + m_Metrics: + m_Width: 47.703125 + m_Height: 54 + m_HorizontalBearingX: 5.84375 + m_HorizontalBearingY: 49.140625 + m_HorizontalAdvance: 59.484375 + m_GlyphRect: + m_X: 782 + m_Y: 274 + m_Width: 49 + m_Height: 55 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 87 + m_Metrics: + m_Width: 52.65625 + m_Height: 52.921875 + m_HorizontalBearingX: 0.359375 + m_HorizontalBearingY: 49.140625 + m_HorizontalAdvance: 53.453125 + m_GlyphRect: + m_X: 662 + m_Y: 297 + m_Width: 54 + m_Height: 54 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 88 + m_Metrics: + m_Width: 82.796875 + m_Height: 53.1875 + m_HorizontalBearingX: 0.546875 + m_HorizontalBearingY: 49.140625 + m_HorizontalAdvance: 83.796875 + m_GlyphRect: + m_X: 573 + m_Y: 205 + m_Width: 84 + m_Height: 55 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 89 + m_Metrics: + m_Width: 53.734375 + m_Height: 53.28125 + m_HorizontalBearingX: 0.8125 + m_HorizontalBearingY: 49.046875 + m_HorizontalAdvance: 55.171875 + m_GlyphRect: + m_X: 408 + m_Y: 272 + m_Width: 55 + m_Height: 55 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 90 + m_Metrics: + m_Width: 54.890625 + m_Height: 75.421875 + m_HorizontalBearingX: 0.8125 + m_HorizontalBearingY: 49.046875 + m_HorizontalAdvance: 56.15625 + m_GlyphRect: + m_X: 10 + m_Y: 307 + m_Width: 56 + m_Height: 77 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 91 + m_Metrics: + m_Width: 46.890625 + m_Height: 51.921875 + m_HorizontalBearingX: 2.15625 + m_HorizontalBearingY: 48.328125 + m_HorizontalAdvance: 51.203125 + m_GlyphRect: + m_X: 966 + m_Y: 302 + m_Width: 48 + m_Height: 53 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 96 + m_Metrics: + m_Width: 17.640625 + m_Height: 32.5 + m_HorizontalBearingX: 4.234375 + m_HorizontalBearingY: 72.453125 + m_HorizontalAdvance: 27 + m_GlyphRect: + m_X: 413 + m_Y: 975 + m_Width: 18 + m_Height: 34 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 100 + m_Metrics: + m_Width: 52.75 + m_Height: 15.578125 + m_HorizontalBearingX: 3.234375 + m_HorizontalBearingY: 31.140625 + m_HorizontalAdvance: 59.21875 + m_GlyphRect: + m_X: 219 + m_Y: 988 + m_Width: 53 + m_Height: 17 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 194 + m_Metrics: + m_Width: 50.671875 + m_Height: 78.578125 + m_HorizontalBearingX: 2.875 + m_HorizontalBearingY: 73.625 + m_HorizontalAdvance: 54.90625 + m_GlyphRect: + m_X: 898 + m_Y: 204 + m_Width: 52 + m_Height: 79 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 200 + m_Metrics: + m_Width: 49.140625 + m_Height: 78.578125 + m_HorizontalBearingX: 3.328125 + m_HorizontalBearingY: 73.625 + m_HorizontalAdvance: 55.4375 + m_GlyphRect: + m_X: 662 + m_Y: 370 + m_Width: 50 + m_Height: 79 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 211 + m_Metrics: + m_Width: 54 + m_Height: 78.484375 + m_HorizontalBearingX: 2.875 + m_HorizontalBearingY: 73.625 + m_HorizontalAdvance: 59.765625 + m_GlyphRect: + m_X: 169 + m_Y: 476 + m_Width: 55 + m_Height: 79 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 217 + m_Metrics: + m_Width: 47.703125 + m_Height: 78.484375 + m_HorizontalBearingX: 5.84375 + m_HorizontalBearingY: 73.625 + m_HorizontalAdvance: 59.484375 + m_GlyphRect: + m_X: 10 + m_Y: 498 + m_Width: 49 + m_Height: 79 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 227 + m_Metrics: + m_Width: 42.671875 + m_Height: 77.84375 + m_HorizontalBearingX: 3.234375 + m_HorizontalBearingY: 73.078125 + m_HorizontalAdvance: 48.515625 + m_GlyphRect: + m_X: 969 + m_Y: 204 + m_Width: 43 + m_Height: 79 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 638 + m_Metrics: + m_Width: 20.6875 + m_Height: 20.703125 + m_HorizontalBearingX: 34.65625 + m_HorizontalBearingY: 44.28125 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 367 + m_Y: 408 + m_Width: 22 + m_Height: 22 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 639 + m_Metrics: + m_Width: 16.375 + m_Height: 54.8125 + m_HorizontalBearingX: 36.8125 + m_HorizontalBearingY: 61.65625 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 187 + m_Y: 298 + m_Width: 18 + m_Height: 56 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 660 + m_Metrics: + m_Width: 73.8125 + m_Height: 8.109375 + m_HorizontalBearingX: 8.09375 + m_HorizontalBearingY: 37.984375 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 265 + m_Y: 763 + m_Width: 74 + m_Height: 9 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 665 + m_Metrics: + m_Width: 78.84375 + m_Height: 23.671875 + m_HorizontalBearingX: 5.578125 + m_HorizontalBearingY: 45.09375 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 291 + m_Y: 988 + m_Width: 80 + m_Height: 25 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 668 + m_Metrics: + m_Width: 75.59375 + m_Height: 15.65625 + m_HorizontalBearingX: 7.203125 + m_HorizontalBearingY: 42.03125 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 10 + m_Y: 10 + m_Width: 76 + m_Height: 17 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 674 + m_Metrics: + m_Width: 27.8125 + m_Height: 87.296875 + m_HorizontalBearingX: 58.953125 + m_HorizontalBearingY: 77.84375 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 403 + m_Y: 554 + m_Width: 29 + m_Height: 88 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 675 + m_Metrics: + m_Width: 27.8125 + m_Height: 87.296875 + m_HorizontalBearingX: 3.234375 + m_HorizontalBearingY: 77.84375 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 10 + m_Y: 596 + m_Width: 29 + m_Height: 88 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 876 + m_Metrics: + m_Width: 62.265625 + m_Height: 48.609375 + m_HorizontalBearingX: 14.046875 + m_HorizontalBearingY: 45.453125 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 627 + m_Y: 958 + m_Width: 63 + m_Height: 50 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 887 + m_Metrics: + m_Width: 82.078125 + m_Height: 73.890625 + m_HorizontalBearingX: 3.6875 + m_HorizontalBearingY: 68.578125 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 10 + m_Y: 724 + m_Width: 83 + m_Height: 75 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 912 + m_Metrics: + m_Width: 55.890625 + m_Height: 59.484375 + m_HorizontalBearingX: 18.8125 + m_HorizontalBearingY: 55.53125 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 655 + m_Y: 767 + m_Width: 57 + m_Height: 60 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 925 + m_Metrics: + m_Width: 59.046875 + m_Height: 55.34375 + m_HorizontalBearingX: 16.828125 + m_HorizontalBearingY: 50.21875 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 733 + m_Y: 957 + m_Width: 60 + m_Height: 57 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 926 + m_Metrics: + m_Width: 76.5 + m_Height: 71.625 + m_HorizontalBearingX: 8.09375 + m_HorizontalBearingY: 67.3125 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 112 + m_Y: 775 + m_Width: 77 + m_Height: 73 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 927 + m_Metrics: + m_Width: 55.4375 + m_Height: 59.3125 + m_HorizontalBearingX: 15.125 + m_HorizontalBearingY: 53.1875 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 454 + m_Y: 588 + m_Width: 56 + m_Height: 61 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 929 + m_Metrics: + m_Width: 54.453125 + m_Height: 60.75 + m_HorizontalBearingX: 17.8125 + m_HorizontalBearingY: 55.4375 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 557 + m_Y: 668 + m_Width: 56 + m_Height: 62 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 930 + m_Metrics: + m_Width: 70.46875 + m_Height: 78.75 + m_HorizontalBearingX: 9.8125 + m_HorizontalBearingY: 73.171875 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 638 + m_Y: 563 + m_Width: 72 + m_Height: 80 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 931 + m_Metrics: + m_Width: 60.9375 + m_Height: 46.078125 + m_HorizontalBearingX: 14.484375 + m_HorizontalBearingY: 45.265625 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 827 + m_Y: 793 + m_Width: 62 + m_Height: 47 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 934 + m_Metrics: + m_Width: 77.5 + m_Height: 77.578125 + m_HorizontalBearingX: 4.3125 + m_HorizontalBearingY: 71.734375 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 828 + m_Y: 498 + m_Width: 78 + m_Height: 78 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 935 + m_Metrics: + m_Width: 74.6875 + m_Height: 78.75 + m_HorizontalBearingX: 5.046875 + m_HorizontalBearingY: 72.90625 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 358 + m_Y: 763 + m_Width: 75 + m_Height: 79 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 945 + m_Metrics: + m_Width: 82.171875 + m_Height: 76.046875 + m_HorizontalBearingX: 3.953125 + m_HorizontalBearingY: 71.1875 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 741 + m_Y: 684 + m_Width: 84 + m_Height: 77 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 948 + m_Metrics: + m_Width: 80.921875 + m_Height: 78.03125 + m_HorizontalBearingX: 6.203125 + m_HorizontalBearingY: 74.703125 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 452 + m_Y: 773 + m_Width: 82 + m_Height: 79 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 949 + m_Metrics: + m_Width: 76.5 + m_Height: 69.03125 + m_HorizontalBearingX: 4.765625 + m_HorizontalBearingY: 64.265625 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 828 + m_Y: 595 + m_Width: 78 + m_Height: 70 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 959 + m_Metrics: + m_Width: 55.4375 + m_Height: 54.28125 + m_HorizontalBearingX: 16.65625 + m_HorizontalBearingY: 49.6875 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 167 + m_Y: 574 + m_Width: 57 + m_Height: 55 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 962 + m_Metrics: + m_Width: 78.9375 + m_Height: 72.625 + m_HorizontalBearingX: 5.578125 + m_HorizontalBearingY: 67.40625 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 729 + m_Y: 558 + m_Width: 80 + m_Height: 74 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 964 + m_Metrics: + m_Width: 57.328125 + m_Height: 76.765625 + m_HorizontalBearingX: 22.765625 + m_HorizontalBearingY: 70.734375 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 952 + m_Y: 688 + m_Width: 59 + m_Height: 78 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 966 + m_Metrics: + m_Width: 79.90625 + m_Height: 77.140625 + m_HorizontalBearingX: 5.046875 + m_HorizontalBearingY: 71.375 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 925 + m_Y: 591 + m_Width: 80 + m_Height: 78 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 986 + m_Metrics: + m_Width: 77.671875 + m_Height: 66.140625 + m_HorizontalBearingX: 6.84375 + m_HorizontalBearingY: 61.375 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 557 + m_Y: 767 + m_Width: 79 + m_Height: 67 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 993 + m_Metrics: + m_Width: 63.1875 + m_Height: 46.984375 + m_HorizontalBearingX: 13.40625 + m_HorizontalBearingY: 44.734375 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 265 + m_Y: 674 + m_Width: 64 + m_Height: 48 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 997 + m_Metrics: + m_Width: 71.546875 + m_Height: 72.265625 + m_HorizontalBearingX: 10.265625 + m_HorizontalBearingY: 68.84375 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 219 + m_Y: 896 + m_Width: 72 + m_Height: 73 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 999 + m_Metrics: + m_Width: 84.421875 + m_Height: 73.4375 + m_HorizontalBearingX: 3.6875 + m_HorizontalBearingY: 67.59375 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 925 + m_Y: 498 + m_Width: 86 + m_Height: 74 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 1001 + m_Metrics: + m_Width: 67.234375 + m_Height: 67.5 + m_HorizontalBearingX: 11.609375 + m_HorizontalBearingY: 62.453125 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 733 + m_Y: 869 + m_Width: 68 + m_Height: 69 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 1007 + m_Metrics: + m_Width: 73.984375 + m_Height: 68.671875 + m_HorizontalBearingX: 9.71875 + m_HorizontalBearingY: 66.15625 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 733 + m_Y: 780 + m_Width: 75 + m_Height: 70 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 1021 + m_Metrics: + m_Width: 70.1875 + m_Height: 74.875 + m_HorizontalBearingX: 9.90625 + m_HorizontalBearingY: 70.828125 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 638 + m_Y: 468 + m_Width: 72 + m_Height: 76 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 1200 + m_Metrics: + m_Width: 82.625 + m_Height: 8.640625 + m_HorizontalBearingX: 3.6875 + m_HorizontalBearingY: 39.59375 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 310 + m_Y: 959 + m_Width: 84 + m_Height: 10 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 1350 + m_Metrics: + m_Width: 85.6875 + m_Height: 81.359375 + m_HorizontalBearingX: 2.609375 + m_HorizontalBearingY: 72.8125 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 159 + m_Y: 674 + m_Width: 87 + m_Height: 82 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 1406 + m_Metrics: + m_Width: 84.5 + m_Height: 84.234375 + m_HorizontalBearingX: 4.6875 + m_HorizontalBearingY: 75.59375 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 529 + m_Y: 564 + m_Width: 86 + m_Height: 85 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 1613 + m_Metrics: + m_Width: 87.921875 + m_Height: 84.515625 + m_HorizontalBearingX: 0.546875 + m_HorizontalBearingY: 76.234375 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 844 + m_Y: 688 + m_Width: 89 + m_Height: 86 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 1781 + m_Metrics: + m_Width: 81.984375 + m_Height: 82.34375 + m_HorizontalBearingX: 1.890625 + m_HorizontalBearingY: 73.4375 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 10 + m_Y: 818 + m_Width: 83 + m_Height: 83 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 1813 + m_Metrics: + m_Width: 83.875 + m_Height: 81.71875 + m_HorizontalBearingX: 2.609375 + m_HorizontalBearingY: 75.515625 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 350 + m_Y: 661 + m_Width: 85 + m_Height: 83 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2102 + m_Metrics: + m_Width: 86.3125 + m_Height: 81.171875 + m_HorizontalBearingX: 1.890625 + m_HorizontalBearingY: 72.265625 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 924 + m_Y: 793 + m_Width: 88 + m_Height: 82 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2204 + m_Metrics: + m_Width: 84.328125 + m_Height: 79.46875 + m_HorizontalBearingX: 2.796875 + m_HorizontalBearingY: 75.6875 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 414 + m_Y: 871 + m_Width: 86 + m_Height: 80 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2350 + m_Metrics: + m_Width: 87.125 + m_Height: 84.875 + m_HorizontalBearingX: 1.703125 + m_HorizontalBearingY: 76.140625 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 243 + m_Y: 569 + m_Width: 88 + m_Height: 86 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2464 + m_Metrics: + m_Width: 83.25 + m_Height: 84.859375 + m_HorizontalBearingX: 3.515625 + m_HorizontalBearingY: 76.3125 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 208 + m_Y: 791 + m_Width: 84 + m_Height: 86 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2519 + m_Metrics: + m_Width: 80.1875 + m_Height: 84.953125 + m_HorizontalBearingX: 4.859375 + m_HorizontalBearingY: 76.046875 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 58 + m_Y: 619 + m_Width: 82 + m_Height: 86 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2568 + m_Metrics: + m_Width: 83.515625 + m_Height: 85.046875 + m_HorizontalBearingX: 1.890625 + m_HorizontalBearingY: 76.3125 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 115 + m_Y: 896 + m_Width: 85 + m_Height: 86 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2603 + m_Metrics: + m_Width: 86.75 + m_Height: 84.234375 + m_HorizontalBearingX: 1.984375 + m_HorizontalBearingY: 76.140625 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 634 + m_Y: 662 + m_Width: 88 + m_Height: 86 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2645 + m_Metrics: + m_Width: 82.984375 + m_Height: 78.671875 + m_HorizontalBearingX: 3.6875 + m_HorizontalBearingY: 72.90625 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 311 + m_Y: 861 + m_Width: 84 + m_Height: 79 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2653 + m_Metrics: + m_Width: 84.953125 + m_Height: 82.34375 + m_HorizontalBearingX: 2.4375 + m_HorizontalBearingY: 76.40625 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 10 + m_Y: 920 + m_Width: 86 + m_Height: 83 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2654 + m_Metrics: + m_Width: 85.40625 + m_Height: 85.046875 + m_HorizontalBearingX: 1.890625 + m_HorizontalBearingY: 76.234375 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 627 + m_Y: 853 + m_Width: 87 + m_Height: 86 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2888 + m_Metrics: + m_Width: 84.234375 + m_Height: 84.59375 + m_HorizontalBearingX: 2.25 + m_HorizontalBearingY: 76.046875 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 820 + m_Y: 869 + m_Width: 85 + m_Height: 86 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 2979 + m_Metrics: + m_Width: 83.796875 + m_Height: 84.953125 + m_HorizontalBearingX: 2.0625 + m_HorizontalBearingY: 76.140625 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 454 + m_Y: 668 + m_Width: 84 + m_Height: 86 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 3887 + m_Metrics: + m_Width: 87.75 + m_Height: 84.0625 + m_HorizontalBearingX: 1.34375 + m_HorizontalBearingY: 75.328125 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 519 + m_Y: 871 + m_Width: 89 + m_Height: 85 + m_Scale: 1 + m_AtlasIndex: 0 + - m_Index: 3999 + m_Metrics: + m_Width: 80.71875 + m_Height: 83.609375 + m_HorizontalBearingX: 5.765625 + m_HorizontalBearingY: 75.59375 + m_HorizontalAdvance: 90 + m_GlyphRect: + m_X: 924 + m_Y: 894 + m_Width: 82 + m_Height: 85 + m_Scale: 1 + m_AtlasIndex: 0 + m_CharacterTable: + - m_ElementType: 1 + m_Unicode: 10 + m_GlyphIndex: 1 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 32 + m_GlyphIndex: 1 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 34 + m_GlyphIndex: 3 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 35 + m_GlyphIndex: 4 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 38 + m_GlyphIndex: 7 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 39 + m_GlyphIndex: 8 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 40 + m_GlyphIndex: 9 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 41 + m_GlyphIndex: 10 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 42 + m_GlyphIndex: 11 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 44 + m_GlyphIndex: 13 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 45 + m_GlyphIndex: 14 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 46 + m_GlyphIndex: 15 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 47 + m_GlyphIndex: 16 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 48 + m_GlyphIndex: 17 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 49 + m_GlyphIndex: 18 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 50 + m_GlyphIndex: 19 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 51 + m_GlyphIndex: 20 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 52 + m_GlyphIndex: 21 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 53 + m_GlyphIndex: 22 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 54 + m_GlyphIndex: 23 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 55 + m_GlyphIndex: 24 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 56 + m_GlyphIndex: 25 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 57 + m_GlyphIndex: 26 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 58 + m_GlyphIndex: 27 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 59 + m_GlyphIndex: 28 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 61 + m_GlyphIndex: 30 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 65 + m_GlyphIndex: 34 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 66 + m_GlyphIndex: 35 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 67 + m_GlyphIndex: 36 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 68 + m_GlyphIndex: 37 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 69 + m_GlyphIndex: 38 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 70 + m_GlyphIndex: 39 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 71 + m_GlyphIndex: 40 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 72 + m_GlyphIndex: 41 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 73 + m_GlyphIndex: 42 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 74 + m_GlyphIndex: 43 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 75 + m_GlyphIndex: 44 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 76 + m_GlyphIndex: 45 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 77 + m_GlyphIndex: 46 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 78 + m_GlyphIndex: 47 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 79 + m_GlyphIndex: 48 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 80 + m_GlyphIndex: 49 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 81 + m_GlyphIndex: 50 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 82 + m_GlyphIndex: 51 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 83 + m_GlyphIndex: 52 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 84 + m_GlyphIndex: 53 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 85 + m_GlyphIndex: 54 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 86 + m_GlyphIndex: 55 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 87 + m_GlyphIndex: 56 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 88 + m_GlyphIndex: 57 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 89 + m_GlyphIndex: 58 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 90 + m_GlyphIndex: 59 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 95 + m_GlyphIndex: 64 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 97 + m_GlyphIndex: 66 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 98 + m_GlyphIndex: 67 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 99 + m_GlyphIndex: 68 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 100 + m_GlyphIndex: 69 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 101 + m_GlyphIndex: 70 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 102 + m_GlyphIndex: 71 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 103 + m_GlyphIndex: 72 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 104 + m_GlyphIndex: 73 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 105 + m_GlyphIndex: 74 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 106 + m_GlyphIndex: 75 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 107 + m_GlyphIndex: 76 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 108 + m_GlyphIndex: 77 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 109 + m_GlyphIndex: 78 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 110 + m_GlyphIndex: 79 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 111 + m_GlyphIndex: 80 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 112 + m_GlyphIndex: 81 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 113 + m_GlyphIndex: 82 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 114 + m_GlyphIndex: 83 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 115 + m_GlyphIndex: 84 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 116 + m_GlyphIndex: 85 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 117 + m_GlyphIndex: 86 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 118 + m_GlyphIndex: 87 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 119 + m_GlyphIndex: 88 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 120 + m_GlyphIndex: 89 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 121 + m_GlyphIndex: 90 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 122 + m_GlyphIndex: 91 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 126 + m_GlyphIndex: 100 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 225 + m_GlyphIndex: 194 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 232 + m_GlyphIndex: 200 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 243 + m_GlyphIndex: 211 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 250 + m_GlyphIndex: 217 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 353 + m_GlyphIndex: 227 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 923 + m_GlyphIndex: 1021 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8217 + m_GlyphIndex: 96 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 8230 + m_GlyphIndex: 668 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 12387 + m_GlyphIndex: 876 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 12398 + m_GlyphIndex: 887 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 12423 + m_GlyphIndex: 912 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 12449 + m_GlyphIndex: 925 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 12450 + m_GlyphIndex: 926 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 12451 + m_GlyphIndex: 927 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 12453 + m_GlyphIndex: 929 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 12454 + m_GlyphIndex: 930 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 12455 + m_GlyphIndex: 931 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 12458 + m_GlyphIndex: 934 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 12459 + m_GlyphIndex: 935 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 12469 + m_GlyphIndex: 945 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 12472 + m_GlyphIndex: 948 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 12473 + m_GlyphIndex: 949 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 12483 + m_GlyphIndex: 959 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 12486 + m_GlyphIndex: 962 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 12488 + m_GlyphIndex: 964 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 12490 + m_GlyphIndex: 966 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 12510 + m_GlyphIndex: 986 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 12517 + m_GlyphIndex: 993 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 12521 + m_GlyphIndex: 997 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 12523 + m_GlyphIndex: 999 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 12525 + m_GlyphIndex: 1001 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 12531 + m_GlyphIndex: 1007 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 12539 + m_GlyphIndex: 638 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 12540 + m_GlyphIndex: 660 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 19968 + m_GlyphIndex: 1200 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 20462 + m_GlyphIndex: 2350 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 20877 + m_GlyphIndex: 2102 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 22411 + m_GlyphIndex: 1813 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 22763 + m_GlyphIndex: 2204 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 22799 + m_GlyphIndex: 1350 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 22934 + m_GlyphIndex: 3887 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 23633 + m_GlyphIndex: 1781 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 24120 + m_GlyphIndex: 2519 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 25484 + m_GlyphIndex: 2464 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 25913 + m_GlyphIndex: 1406 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 26143 + m_GlyphIndex: 2645 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 27700 + m_GlyphIndex: 2603 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 30427 + m_GlyphIndex: 2653 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 30528 + m_GlyphIndex: 2979 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 31532 + m_GlyphIndex: 2888 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 31934 + m_GlyphIndex: 2654 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 32051 + m_GlyphIndex: 2568 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 33256 + m_GlyphIndex: 3999 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 39438 + m_GlyphIndex: 1613 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 65288 + m_GlyphIndex: 674 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 65289 + m_GlyphIndex: 675 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 65306 + m_GlyphIndex: 639 + m_Scale: 1 + - m_ElementType: 1 + m_Unicode: 65374 + m_GlyphIndex: 665 + m_Scale: 1 + m_AtlasTextures: + - {fileID: -3736618144138935144} + m_AtlasTextureIndex: 0 + m_IsMultiAtlasTexturesEnabled: 0 + m_ClearDynamicDataOnBuild: 0 + m_UsedGlyphRects: + - m_X: 0 + m_Y: 0 + m_Width: 95 + m_Height: 36 + - m_X: 95 + m_Y: 0 + m_Width: 64 + m_Height: 27 + - m_X: 159 + m_Y: 0 + m_Width: 95 + m_Height: 96 + - m_X: 0 + m_Y: 36 + m_Width: 69 + m_Height: 73 + - m_X: 95 + m_Y: 27 + m_Width: 62 + m_Height: 73 + - m_X: 254 + m_Y: 0 + m_Width: 67 + m_Height: 100 + - m_X: 157 + m_Y: 96 + m_Width: 75 + m_Height: 95 + - m_X: 69 + m_Y: 100 + m_Width: 35 + m_Height: 98 + - m_X: 0 + m_Y: 109 + m_Width: 55 + m_Height: 91 + - m_X: 321 + m_Y: 0 + m_Width: 85 + m_Height: 97 + - m_X: 406 + m_Y: 0 + m_Width: 71 + m_Height: 73 + - m_X: 104 + m_Y: 100 + m_Width: 53 + m_Height: 74 + - m_X: 477 + m_Y: 0 + m_Width: 67 + m_Height: 73 + - m_X: 544 + m_Y: 0 + m_Width: 74 + m_Height: 97 + - m_X: 406 + m_Y: 73 + m_Width: 87 + m_Height: 94 + - m_X: 232 + m_Y: 100 + m_Width: 96 + m_Height: 74 + - m_X: 328 + m_Y: 97 + m_Width: 74 + m_Height: 73 + - m_X: 618 + m_Y: 0 + m_Width: 74 + m_Height: 100 + - m_X: 493 + m_Y: 97 + m_Width: 70 + m_Height: 99 + - m_X: 104 + m_Y: 174 + m_Width: 33 + m_Height: 100 + - m_X: 402 + m_Y: 167 + m_Width: 75 + m_Height: 95 + - m_X: 0 + m_Y: 200 + m_Width: 79 + m_Height: 97 + - m_X: 232 + m_Y: 174 + m_Width: 86 + m_Height: 95 + - m_X: 137 + m_Y: 191 + m_Width: 87 + m_Height: 97 + - m_X: 318 + m_Y: 174 + m_Width: 80 + m_Height: 93 + - m_X: 692 + m_Y: 0 + m_Width: 90 + m_Height: 95 + - m_X: 563 + m_Y: 97 + m_Width: 54 + m_Height: 95 + - m_X: 782 + m_Y: 0 + m_Width: 73 + m_Height: 95 + - m_X: 855 + m_Y: 0 + m_Width: 79 + m_Height: 95 + - m_X: 934 + m_Y: 0 + m_Width: 76 + m_Height: 97 + - m_X: 692 + m_Y: 95 + m_Width: 76 + m_Height: 97 + - m_X: 617 + m_Y: 100 + m_Width: 73 + m_Height: 95 + - m_X: 768 + m_Y: 95 + m_Width: 73 + m_Height: 95 + - m_X: 841 + m_Y: 95 + m_Width: 73 + m_Height: 97 + - m_X: 914 + m_Y: 97 + m_Width: 78 + m_Height: 97 + - m_X: 690 + m_Y: 192 + m_Width: 82 + m_Height: 95 + - m_X: 563 + m_Y: 195 + m_Width: 103 + m_Height: 74 + - m_X: 477 + m_Y: 196 + m_Width: 85 + m_Height: 95 + - m_X: 398 + m_Y: 262 + m_Width: 74 + m_Height: 74 + - m_X: 79 + m_Y: 274 + m_Width: 34 + m_Height: 95 + - m_X: 562 + m_Y: 269 + m_Width: 90 + m_Height: 95 + - m_X: 318 + m_Y: 267 + m_Width: 80 + m_Height: 95 + - m_X: 0 + m_Y: 297 + m_Width: 75 + m_Height: 96 + - m_X: 472 + m_Y: 291 + m_Width: 82 + m_Height: 95 + - m_X: 772 + m_Y: 190 + m_Width: 68 + m_Height: 74 + - m_X: 398 + m_Y: 336 + m_Width: 48 + m_Height: 113 + - m_X: 840 + m_Y: 192 + m_Width: 48 + m_Height: 113 + - m_X: 772 + m_Y: 264 + m_Width: 68 + m_Height: 74 + - m_X: 224 + m_Y: 269 + m_Width: 77 + m_Height: 97 + - m_X: 301 + m_Y: 362 + m_Width: 56 + m_Height: 100 + - m_X: 113 + m_Y: 288 + m_Width: 64 + m_Height: 96 + - m_X: 652 + m_Y: 287 + m_Width: 73 + m_Height: 73 + - m_X: 75 + m_Y: 369 + m_Width: 32 + m_Height: 49 + - m_X: 0 + m_Y: 393 + m_Width: 75 + m_Height: 95 + - m_X: 177 + m_Y: 366 + m_Width: 72 + m_Height: 100 + - m_X: 75 + m_Y: 418 + m_Width: 84 + m_Height: 95 + - m_X: 0 + m_Y: 488 + m_Width: 68 + m_Height: 98 + - m_X: 888 + m_Y: 194 + m_Width: 71 + m_Height: 98 + - m_X: 888 + m_Y: 292 + m_Width: 68 + m_Height: 100 + - m_X: 725 + m_Y: 338 + m_Width: 71 + m_Height: 95 + - m_X: 796 + m_Y: 338 + m_Width: 84 + m_Height: 96 + - m_X: 880 + m_Y: 392 + m_Width: 113 + m_Height: 96 + - m_X: 956 + m_Y: 292 + m_Width: 67 + m_Height: 72 + - m_X: 554 + m_Y: 364 + m_Width: 79 + m_Height: 94 + - m_X: 956 + m_Y: 364 + m_Width: 51 + m_Height: 28 + - m_X: 249 + m_Y: 366 + m_Width: 51 + m_Height: 120 + - m_X: 446 + m_Y: 386 + m_Width: 95 + m_Height: 97 + - m_X: 300 + m_Y: 462 + m_Width: 93 + m_Height: 97 + - m_X: 159 + m_Y: 466 + m_Width: 74 + m_Height: 98 + - m_X: 68 + m_Y: 513 + m_Width: 89 + m_Height: 96 + - m_X: 652 + m_Y: 360 + m_Width: 69 + m_Height: 98 + - m_X: 721 + m_Y: 434 + m_Width: 97 + m_Height: 114 + - m_X: 725 + m_Y: 287 + m_Width: 46 + m_Height: 49 + - m_X: 541 + m_Y: 458 + m_Width: 87 + m_Height: 96 + - m_X: 393 + m_Y: 449 + m_Width: 53 + m_Height: 95 + - m_X: 357 + m_Y: 362 + m_Width: 37 + m_Height: 36 + - m_X: 628 + m_Y: 458 + m_Width: 91 + m_Height: 95 + - m_X: 446 + m_Y: 483 + m_Width: 73 + m_Height: 95 + - m_X: 818 + m_Y: 488 + m_Width: 97 + m_Height: 97 + - m_X: 915 + m_Y: 488 + m_Width: 105 + m_Height: 93 + - m_X: 719 + m_Y: 548 + m_Width: 99 + m_Height: 93 + - m_X: 915 + m_Y: 581 + m_Width: 99 + m_Height: 97 + - m_X: 628 + m_Y: 553 + m_Width: 91 + m_Height: 99 + - m_X: 818 + m_Y: 585 + m_Width: 97 + m_Height: 89 + - m_X: 393 + m_Y: 544 + m_Width: 48 + m_Height: 107 + - m_X: 519 + m_Y: 554 + m_Width: 105 + m_Height: 104 + - m_X: 233 + m_Y: 559 + m_Width: 107 + m_Height: 105 + - m_X: 340 + m_Y: 651 + m_Width: 104 + m_Height: 102 + - m_X: 0 + m_Y: 586 + m_Width: 48 + m_Height: 107 + - m_X: 48 + m_Y: 609 + m_Width: 101 + m_Height: 105 + - m_X: 149 + m_Y: 664 + m_Width: 106 + m_Height: 101 + - m_X: 0 + m_Y: 714 + m_Width: 102 + m_Height: 94 + - m_X: 624 + m_Y: 652 + m_Width: 107 + m_Height: 105 + - m_X: 444 + m_Y: 658 + m_Width: 103 + m_Height: 105 + - m_X: 731 + m_Y: 674 + m_Width: 103 + m_Height: 96 + - m_X: 547 + m_Y: 757 + m_Width: 98 + m_Height: 86 + - m_X: 255 + m_Y: 753 + m_Width: 93 + m_Height: 28 + - m_X: 357 + m_Y: 398 + m_Width: 41 + m_Height: 41 + - m_X: 348 + m_Y: 753 + m_Width: 94 + m_Height: 98 + - m_X: 442 + m_Y: 763 + m_Width: 101 + m_Height: 98 + - m_X: 255 + m_Y: 664 + m_Width: 83 + m_Height: 67 + - m_X: 102 + m_Y: 765 + m_Width: 96 + m_Height: 92 + - m_X: 198 + m_Y: 781 + m_Width: 103 + m_Height: 105 + - m_X: 301 + m_Y: 851 + m_Width: 103 + m_Height: 98 + - m_X: 0 + m_Y: 808 + m_Width: 102 + m_Height: 102 + - m_X: 0 + m_Y: 910 + m_Width: 105 + m_Height: 102 + - m_X: 105 + m_Y: 886 + m_Width: 104 + m_Height: 105 + - m_X: 404 + m_Y: 861 + m_Width: 105 + m_Height: 99 + - m_X: 509 + m_Y: 861 + m_Width: 108 + m_Height: 104 + - m_X: 617 + m_Y: 843 + m_Width: 106 + m_Height: 105 + - m_X: 834 + m_Y: 678 + m_Width: 108 + m_Height: 105 + - m_X: 209 + m_Y: 886 + m_Width: 91 + m_Height: 92 + - m_X: 723 + m_Y: 770 + m_Width: 94 + m_Height: 89 + - m_X: 723 + m_Y: 859 + m_Width: 87 + m_Height: 88 + - m_X: 157 + m_Y: 564 + m_Width: 76 + m_Height: 74 + - m_X: 942 + m_Y: 678 + m_Width: 78 + m_Height: 97 + - m_X: 810 + m_Y: 859 + m_Width: 104 + m_Height: 105 + - m_X: 300 + m_Y: 949 + m_Width: 103 + m_Height: 29 + - m_X: 914 + m_Y: 783 + m_Width: 107 + m_Height: 101 + - m_X: 914 + m_Y: 884 + m_Width: 101 + m_Height: 104 + - m_X: 444 + m_Y: 578 + m_Width: 75 + m_Height: 80 + - m_X: 818 + m_Y: 434 + m_Width: 38 + m_Height: 52 + - m_X: 547 + m_Y: 658 + m_Width: 75 + m_Height: 81 + - m_X: 723 + m_Y: 947 + m_Width: 79 + m_Height: 76 + - m_X: 617 + m_Y: 948 + m_Width: 82 + m_Height: 69 + - m_X: 645 + m_Y: 757 + m_Width: 76 + m_Height: 79 + - m_X: 817 + m_Y: 783 + m_Width: 81 + m_Height: 66 + - m_X: 233 + m_Y: 486 + m_Width: 37 + m_Height: 73 + - m_X: 959 + m_Y: 194 + m_Width: 62 + m_Height: 98 + - m_X: 177 + m_Y: 288 + m_Width: 37 + m_Height: 75 + - m_X: 340 + m_Y: 559 + m_Width: 38 + m_Height: 87 + - m_X: 403 + m_Y: 965 + m_Width: 37 + m_Height: 53 + - m_X: 209 + m_Y: 978 + m_Width: 72 + m_Height: 36 + - m_X: 281 + m_Y: 978 + m_Width: 99 + m_Height: 44 + - m_X: 440 + m_Y: 965 + m_Width: 54 + m_Height: 56 + - m_X: 494 + m_Y: 965 + m_Width: 75 + m_Height: 49 + m_FreeGlyphRects: + - m_X: 157 + m_Y: 27 + m_Width: 2 + m_Height: 69 + - m_X: 69 + m_Y: 36 + m_Width: 26 + m_Height: 64 + - m_X: 232 + m_Y: 96 + m_Width: 22 + m_Height: 4 + - m_X: 321 + m_Y: 97 + m_Width: 7 + m_Height: 3 + - m_X: 493 + m_Y: 73 + m_Width: 51 + m_Height: 24 + - m_X: 402 + m_Y: 97 + m_Width: 4 + m_Height: 70 + - m_X: 55 + m_Y: 109 + m_Width: 14 + m_Height: 91 + - m_X: 55 + m_Y: 198 + m_Width: 49 + m_Height: 2 + - m_X: 137 + m_Y: 174 + m_Width: 20 + m_Height: 17 + - m_X: 328 + m_Y: 170 + m_Width: 74 + m_Height: 4 + - m_X: 617 + m_Y: 97 + m_Width: 1 + m_Height: 3 + - m_X: 914 + m_Y: 95 + m_Width: 20 + m_Height: 2 + - m_X: 690 + m_Y: 100 + m_Width: 2 + m_Height: 92 + - m_X: 563 + m_Y: 192 + m_Width: 54 + m_Height: 3 + - m_X: 477 + m_Y: 167 + m_Width: 16 + m_Height: 29 + - m_X: 398 + m_Y: 170 + m_Width: 4 + m_Height: 92 + - m_X: 79 + m_Y: 198 + m_Width: 25 + m_Height: 76 + - m_X: 562 + m_Y: 196 + m_Width: 1 + m_Height: 73 + - m_X: 472 + m_Y: 262 + m_Width: 5 + m_Height: 29 + - m_X: 768 + m_Y: 190 + m_Width: 4 + m_Height: 2 + - m_X: 840 + m_Y: 190 + m_Width: 1 + m_Height: 2 + - m_X: 224 + m_Y: 191 + m_Width: 8 + m_Height: 78 + - m_X: 301 + m_Y: 269 + m_Width: 17 + m_Height: 93 + - m_X: 113 + m_Y: 274 + m_Width: 24 + m_Height: 14 + - m_X: 666 + m_Y: 195 + m_Width: 24 + m_Height: 92 + - m_X: 652 + m_Y: 269 + m_Width: 38 + m_Height: 18 + - m_X: 75 + m_Y: 297 + m_Width: 4 + m_Height: 72 + - m_X: 107 + m_Y: 369 + m_Width: 6 + m_Height: 49 + - m_X: 107 + m_Y: 384 + m_Width: 70 + m_Height: 34 + - m_X: 888 + m_Y: 192 + m_Width: 26 + m_Height: 2 + - m_X: 840 + m_Y: 305 + m_Width: 48 + m_Height: 33 + - m_X: 880 + m_Y: 305 + m_Width: 8 + m_Height: 87 + - m_X: 554 + m_Y: 291 + m_Width: 8 + m_Height: 73 + - m_X: 446 + m_Y: 336 + m_Width: 26 + m_Height: 50 + - m_X: 300 + m_Y: 366 + m_Width: 1 + m_Height: 96 + - m_X: 159 + m_Y: 384 + m_Width: 18 + m_Height: 82 + - m_X: 68 + m_Y: 488 + m_Width: 7 + m_Height: 25 + - m_X: 721 + m_Y: 360 + m_Width: 4 + m_Height: 74 + - m_X: 721 + m_Y: 433 + m_Width: 75 + m_Height: 1 + - m_X: 725 + m_Y: 336 + m_Width: 47 + m_Height: 2 + - m_X: 771 + m_Y: 287 + m_Width: 1 + m_Height: 51 + - m_X: 541 + m_Y: 386 + m_Width: 13 + m_Height: 72 + - m_X: 633 + m_Y: 364 + m_Width: 19 + m_Height: 94 + - m_X: 993 + m_Y: 392 + m_Width: 30 + m_Height: 96 + - m_X: 1007 + m_Y: 364 + m_Width: 16 + m_Height: 124 + - m_X: 719 + m_Y: 458 + m_Width: 2 + m_Height: 90 + - m_X: 519 + m_Y: 483 + m_Width: 22 + m_Height: 71 + - m_X: 48 + m_Y: 586 + m_Width: 20 + m_Height: 23 + - m_X: 0 + m_Y: 693 + m_Width: 48 + m_Height: 21 + - m_X: 719 + m_Y: 641 + m_Width: 99 + m_Height: 11 + - m_X: 624 + m_Y: 554 + m_Width: 4 + m_Height: 98 + - m_X: 731 + m_Y: 641 + m_Width: 87 + m_Height: 33 + - m_X: 357 + m_Y: 439 + m_Width: 41 + m_Height: 10 + - m_X: 394 + m_Y: 362 + m_Width: 4 + m_Height: 36 + - m_X: 357 + m_Y: 439 + m_Width: 36 + m_Height: 23 + - m_X: 442 + m_Y: 753 + m_Width: 2 + m_Height: 10 + - m_X: 255 + m_Y: 731 + m_Width: 85 + m_Height: 22 + - m_X: 338 + m_Y: 664 + m_Width: 2 + m_Height: 89 + - m_X: 102 + m_Y: 714 + m_Width: 47 + m_Height: 51 + - m_X: 198 + m_Y: 765 + m_Width: 57 + m_Height: 16 + - m_X: 301 + m_Y: 781 + m_Width: 47 + m_Height: 70 + - m_X: 102 + m_Y: 857 + m_Width: 96 + m_Height: 29 + - m_X: 102 + m_Y: 857 + m_Width: 3 + m_Height: 53 + - m_X: 404 + m_Y: 851 + m_Width: 38 + m_Height: 10 + - m_X: 543 + m_Y: 763 + m_Width: 4 + m_Height: 98 + - m_X: 543 + m_Y: 843 + m_Width: 74 + m_Height: 18 + - m_X: 834 + m_Y: 674 + m_Width: 81 + m_Height: 4 + - m_X: 157 + m_Y: 513 + m_Width: 2 + m_Height: 51 + - m_X: 149 + m_Y: 638 + m_Width: 84 + m_Height: 26 + - m_X: 149 + m_Y: 609 + m_Width: 8 + m_Height: 55 + - m_X: 1014 + m_Y: 581 + m_Width: 9 + m_Height: 97 + - m_X: 300 + m_Y: 886 + m_Width: 1 + m_Height: 63 + - m_X: 1020 + m_Y: 364 + m_Width: 3 + m_Height: 419 + - m_X: 1021 + m_Y: 364 + m_Width: 2 + m_Height: 659 + - m_X: 942 + m_Y: 775 + m_Width: 81 + m_Height: 8 + - m_X: 1015 + m_Y: 884 + m_Width: 8 + m_Height: 139 + - m_X: 441 + m_Y: 544 + m_Width: 5 + m_Height: 34 + - m_X: 441 + m_Y: 544 + m_Width: 3 + m_Height: 107 + - m_X: 818 + m_Y: 486 + m_Width: 62 + m_Height: 2 + - m_X: 856 + m_Y: 434 + m_Width: 24 + m_Height: 54 + - m_X: 547 + m_Y: 739 + m_Width: 77 + m_Height: 18 + - m_X: 622 + m_Y: 658 + m_Width: 2 + m_Height: 99 + - m_X: 802 + m_Y: 947 + m_Width: 8 + m_Height: 76 + - m_X: 802 + m_Y: 988 + m_Width: 221 + m_Height: 35 + - m_X: 802 + m_Y: 964 + m_Width: 112 + m_Height: 59 + - m_X: 699 + m_Y: 948 + m_Width: 24 + m_Height: 75 + - m_X: 721 + m_Y: 757 + m_Width: 10 + m_Height: 13 + - m_X: 645 + m_Y: 836 + m_Width: 78 + m_Height: 7 + - m_X: 721 + m_Y: 757 + m_Width: 2 + m_Height: 86 + - m_X: 817 + m_Y: 770 + m_Width: 17 + m_Height: 13 + - m_X: 817 + m_Y: 849 + m_Width: 97 + m_Height: 10 + - m_X: 898 + m_Y: 783 + m_Width: 16 + m_Height: 76 + - m_X: 233 + m_Y: 466 + m_Width: 16 + m_Height: 20 + - m_X: 270 + m_Y: 486 + m_Width: 30 + m_Height: 73 + - m_X: 1010 + m_Y: 0 + m_Width: 13 + m_Height: 194 + - m_X: 1021 + m_Y: 0 + m_Width: 2 + m_Height: 292 + - m_X: 992 + m_Y: 97 + m_Width: 31 + m_Height: 97 + - m_X: 177 + m_Y: 363 + m_Width: 47 + m_Height: 3 + - m_X: 214 + m_Y: 288 + m_Width: 10 + m_Height: 78 + - m_X: 340 + m_Y: 646 + m_Width: 53 + m_Height: 5 + - m_X: 378 + m_Y: 559 + m_Width: 15 + m_Height: 92 + - m_X: 403 + m_Y: 949 + m_Width: 1 + m_Height: 16 + - m_X: 403 + m_Y: 960 + m_Width: 106 + m_Height: 5 + - m_X: 0 + m_Y: 1012 + m_Width: 209 + m_Height: 11 + - m_X: 105 + m_Y: 991 + m_Width: 104 + m_Height: 32 + - m_X: 0 + m_Y: 1022 + m_Width: 723 + m_Height: 1 + - m_X: 0 + m_Y: 1014 + m_Width: 281 + m_Height: 9 + - m_X: 380 + m_Y: 978 + m_Width: 23 + m_Height: 45 + - m_X: 494 + m_Y: 1017 + m_Width: 229 + m_Height: 6 + - m_X: 380 + m_Y: 1021 + m_Width: 343 + m_Height: 2 + - m_X: 380 + m_Y: 1018 + m_Width: 60 + m_Height: 5 + - m_X: 494 + m_Y: 1014 + m_Width: 123 + m_Height: 9 + - m_X: 569 + m_Y: 965 + m_Width: 48 + m_Height: 58 + m_fontInfo: + Name: + PointSize: 0 + Scale: 0 + CharacterCount: 0 + LineHeight: 0 + Baseline: 0 + Ascender: 0 + CapHeight: 0 + Descender: 0 + CenterLine: 0 + SuperscriptOffset: 0 + SubscriptOffset: 0 + SubSize: 0 + Underline: 0 + UnderlineThickness: 0 + strikethrough: 0 + strikethroughThickness: 0 + TabWidth: 0 + Padding: 0 + AtlasWidth: 0 + AtlasHeight: 0 + atlas: {fileID: 0} + m_AtlasWidth: 1024 + m_AtlasHeight: 1024 + m_AtlasPadding: 9 + m_AtlasRenderMode: 4165 + m_glyphInfoList: [] + m_KerningTable: + kerningPairs: [] + m_FontFeatureTable: + m_GlyphPairAdjustmentRecords: + - m_FirstAdjustmentRecord: + m_GlyphIndex: 3 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 36 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 3 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 20 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 20 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 36 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 3 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 36 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 36 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 36 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -3.1875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 58 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 36 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 89 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 36 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 90 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 41 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -9.53125 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 15 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 41 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -9.53125 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 17 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 41 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 36 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 47 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -3.1875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 3 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 47 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 47 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 47 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 58 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 51 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 3 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 51 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -11.09375 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 15 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 51 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -11.09375 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 17 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 51 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 36 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 53 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 53 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 53 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 58 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 3 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -9.53125 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 15 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 16 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -9.53125 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 17 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 36 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 50 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -9.53125 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 68 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -9.53125 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 70 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -9.53125 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 72 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -3.1875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 76 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -9.53125 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 82 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -3.1875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 85 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -9.53125 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 86 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -3.1875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 88 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 55 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 90 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -7.890625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 15 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 16 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -7.890625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 17 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 36 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 68 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 72 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 76 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 82 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -3.1875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 85 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 57 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -3.1875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 88 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 58 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 15 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 58 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 16 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 58 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 17 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 58 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -3.1875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 36 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 58 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -3.1875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 68 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 58 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 72 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 58 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 82 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 58 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 85 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 58 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 88 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 73 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.546875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 73 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 85 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 15 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 85 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 17 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 89 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 15 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 89 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -6.390625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 17 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 90 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 15 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 90 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 17 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 948 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -10.5 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 15 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 948 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -10.5 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 17 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 964 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -10.5 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 15 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 964 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -10.5 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 17 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 964 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.828125 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 993 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 964 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -5.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 997 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 964 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.828125 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 1001 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 964 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -5.75 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 1007 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 964 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -4.828125 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 1021 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 986 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0.96875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 993 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 1007 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -1.890625 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 997 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + - m_FirstAdjustmentRecord: + m_GlyphIndex: 1007 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: -0.96875 + m_YAdvance: 0 + m_SecondAdjustmentRecord: + m_GlyphIndex: 999 + m_GlyphValueRecord: + m_XPlacement: 0 + m_YPlacement: 0 + m_XAdvance: 0 + m_YAdvance: 0 + m_FeatureLookupFlags: 0 + fallbackFontAssets: [] + m_FallbackFontAssetTable: [] + m_CreationSettings: + sourceFontFileName: + sourceFontFileGUID: 2757226890267cf49ab66d12478a74b3 + pointSizeSamplingMode: 0 + pointSize: 90 + padding: 9 + packingMode: 0 + atlasWidth: 1024 + atlasHeight: 1024 + characterSetSelectionMode: 7 + characterSequence: + referencedFontAssetGUID: + referencedTextAssetGUID: + fontStyle: 0 + fontStyleModifier: 0 + renderMode: 4165 + includeFontFeatures: 0 + m_FontWeightTable: + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + - regularTypeface: {fileID: 0} + italicTypeface: {fileID: 0} + fontWeights: [] + normalStyle: 0 + normalSpacingOffset: 0 + boldStyle: 0.75 + boldSpacing: 7 + italicStyle: 35 + tabSize: 10 +--- !u!21 &3861585161733349673 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: FGO-Main-Font Atlas Material + m_Shader: {fileID: 4800000, guid: 68e6db2ebdc24f95958faec2be5558d6, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _Cube: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _FaceTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: -3736618144138935144} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OutlineTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _Ambient: 0.5 + - _Bevel: 0.5 + - _BevelClamp: 0 + - _BevelOffset: 0 + - _BevelRoundness: 0 + - _BevelWidth: 0 + - _BumpFace: 0 + - _BumpOutline: 0 + - _ColorMask: 15 + - _CullMode: 0 + - _Diffuse: 0.5 + - _FaceDilate: 0 + - _FaceUVSpeedX: 0 + - _FaceUVSpeedY: 0 + - _GlowInner: 0.05 + - _GlowOffset: 0 + - _GlowOuter: 0.05 + - _GlowPower: 0.75 + - _GradientScale: 10 + - _LightAngle: 3.1416 + - _MaskSoftnessX: 0 + - _MaskSoftnessY: 0 + - _OutlineSoftness: 0 + - _OutlineUVSpeedX: 0 + - _OutlineUVSpeedY: 0 + - _OutlineWidth: 0 + - _PerspectiveFilter: 0.875 + - _Reflectivity: 10 + - _ScaleRatioA: 0.9 + - _ScaleRatioB: 0.73125 + - _ScaleRatioC: 0.73125 + - _ScaleX: 1 + - _ScaleY: 1 + - _ShaderFlags: 0 + - _Sharpness: 0 + - _SpecularPower: 2 + - _Stencil: 0 + - _StencilComp: 8 + - _StencilOp: 0 + - _StencilReadMask: 255 + - _StencilWriteMask: 255 + - _TextureHeight: 1024 + - _TextureWidth: 1024 + - _UnderlayDilate: 0 + - _UnderlayOffsetX: 0 + - _UnderlayOffsetY: 0 + - _UnderlaySoftness: 0 + - _VertexOffsetX: 0 + - _VertexOffsetY: 0 + - _WeightBold: 0.75 + - _WeightNormal: 0 + m_Colors: + - _ClipRect: {r: -32767, g: -32767, b: 32767, a: 32767} + - _EnvMatrixRotation: {r: 0, g: 0, b: 0, a: 0} + - _FaceColor: {r: 1, g: 1, b: 1, a: 1} + - _GlowColor: {r: 0, g: 1, b: 0, a: 0.5} + - _MaskCoord: {r: 0, g: 0, b: 32767, a: 32767} + - _OutlineColor: {r: 0, g: 0, b: 0, a: 1} + - _ReflectFaceColor: {r: 0, g: 0, b: 0, a: 1} + - _ReflectOutlineColor: {r: 0, g: 0, b: 0, a: 1} + - _SpecularColor: {r: 1, g: 1, b: 1, a: 1} + - _UnderlayColor: {r: 0, g: 0, b: 0, a: 0.5} + m_BuildTextureStacks: [] diff --git a/Assets/FateFont/FGO-Main-Font SDF.asset.meta b/Assets/FateFont/FGO-Main-Font SDF.asset.meta new file mode 100644 index 0000000..65d7f17 --- /dev/null +++ b/Assets/FateFont/FGO-Main-Font SDF.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 38f9c70d045080845a18307715f00e15 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/FateFont/FGO-Main-Font.otf b/Assets/FateFont/FGO-Main-Font.otf new file mode 100644 index 0000000..cd8b3e3 Binary files /dev/null and b/Assets/FateFont/FGO-Main-Font.otf differ diff --git a/Assets/FateFont/FGO-Main-Font.otf.meta b/Assets/FateFont/FGO-Main-Font.otf.meta new file mode 100644 index 0000000..3d02018 --- /dev/null +++ b/Assets/FateFont/FGO-Main-Font.otf.meta @@ -0,0 +1,21 @@ +fileFormatVersion: 2 +guid: 2757226890267cf49ab66d12478a74b3 +TrueTypeFontImporter: + externalObjects: {} + serializedVersion: 4 + fontSize: 16 + forceTextureCase: -2 + characterSpacing: 0 + characterPadding: 1 + includeFontData: 1 + fontNames: + - FOT-Fate_Go Skip + fallbackFontReferences: [] + customCharacters: + fontRenderingMode: 0 + ascentCalculationMode: 1 + useLegacyBoundsCalculation: 0 + shouldRoundAdvanceValue: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/JsonDotNet.meta b/Assets/JsonDotNet.meta new file mode 100644 index 0000000..fe7cc66 --- /dev/null +++ b/Assets/JsonDotNet.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2d3ae983e90eed240b75c7d9c7f6d7ad +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/JsonDotNet/Assemblies.meta b/Assets/JsonDotNet/Assemblies.meta new file mode 100644 index 0000000..59ac16b --- /dev/null +++ b/Assets/JsonDotNet/Assemblies.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 577d9725f58264943855b8ac185531fe +folderAsset: yes +timeCreated: 1466788344 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/JsonDotNet/Assemblies/AOT.meta b/Assets/JsonDotNet/Assemblies/AOT.meta new file mode 100644 index 0000000..f9dba64 --- /dev/null +++ b/Assets/JsonDotNet/Assemblies/AOT.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 14f21d7a1e53a8c4e87b25526a7eb63c +folderAsset: yes +timeCreated: 1466788345 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/JsonDotNet/Assemblies/AOT/Newtonsoft.Json.XML b/Assets/JsonDotNet/Assemblies/AOT/Newtonsoft.Json.XML new file mode 100644 index 0000000..9a914af --- /dev/null +++ b/Assets/JsonDotNet/Assemblies/AOT/Newtonsoft.Json.XML @@ -0,0 +1,8015 @@ + + + + Newtonsoft.Json + + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Gets or sets a value indicating whether binary data reading should compatible with incorrect Json.NET 3.5 written binary. + + + true if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, false. + + + + + Gets or sets a value indicating whether the root object will be read as a JSON array. + + + true if the root object will be read as a JSON array; otherwise, false. + + + + + Gets or sets the used when reading values from BSON. + + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The stream. + + + + Initializes a new instance of the class. + + The reader. + + + + Initializes a new instance of the class. + + The stream. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The reader. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Reads the next JSON token from the stream. + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Changes the to Closed. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets or sets the used when writing values to BSON. + When set to no conversion will occur. + + The used when writing values to BSON. + + + + Initializes a new instance of the class. + + The stream. + + + + Initializes a new instance of the class. + + The writer. + + + + Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream. + + + + + Writes the end. + + The token. + + + + Writes out a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes the beginning of a JSON array. + + + + + Writes the beginning of a JSON object. + + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Closes this stream and the underlying stream. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value that represents a BSON object id. + + The Object ID value to write. + + + + Writes a BSON regex. + + The regex pattern. + The regex options. + + + + Represents a BSON Oid (object id). + + + + + Gets or sets the value of the Oid. + + The value of the Oid. + + + + Initializes a new instance of the class. + + The Oid value. + + + + Converts a binary value to and from a base 64 string value. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Create a custom object + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Creates an object which will then be populated by the serializer. + + Type of the object. + The created object. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Provides a base class for converting a to and from JSON. + + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + + + + + + + + + + + + + + + + + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from its name string value. + + + + + Gets or sets a value indicating whether the written enum text should be camel case. + + true if the written enum text will be camel case; otherwise, false. + + + + Gets or sets a value indicating whether integer values are allowed. + + true if integers are allowed; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + true if the written enum text will be camel case; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Json Converter for Vector2, Vector3 and Vector4. Only serializes x, y, (z) and (w) properties. + + + + + Default Constructor - All Vector types enabled by default + + + + + Selectively enable Vector types + + Use for Vector2 objects + Use for Vector3 objects + Use for Vector4 objects + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Converts a to and from a string (e.g. "1.2.3.4"). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from the ISO 8601 date format (e.g. 2008-04-12T12:53Z). + + + + + Gets or sets the date time styles used when converting a date to and from JSON. + + The date time styles used when converting a date to and from JSON. + + + + Gets or sets the date time format used when converting a date to and from JSON. + + The date time format used when converting a date to and from JSON. + + + + Gets or sets the culture used when converting a date to and from JSON. + + The culture used when converting a date to and from JSON. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Converts a to and from a JavaScript date constructor (e.g. new Date(52231943)). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts XML to and from JSON. + + + + + Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produces multiple root elements. + + The name of the deserialize root element. + + + + Gets or sets a flag to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + true if the array attibute is written to the XML; otherwise, false. + + + + Gets or sets a value indicating whether to write the root JSON object. + + true if the JSON root object is omitted; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The calling serializer. + The value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Checks if the attributeName is a namespace attribute. + + Attribute name to test. + The attribute name prefix if it has one, otherwise an empty string. + True if attribute name is for a namespace attribute, otherwise false. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Specifies how constructors are used when initializing objects during deserialization by the . + + + + + First attempt to use the public default constructor, then fall back to single paramatized constructor, then the non-public default constructor. + + + + + Json.NET will use a non-public default constructor before falling back to a paramatized constructor. + + + + + Specifies how dates are formatted when writing JSON text. + + + + + Dates are written in the ISO 8601 format, e.g. "2012-03-21T05:40Z". + + + + + Dates are written in the Microsoft JSON format, e.g. "\/Date(1198908717056)\/". + + + + + Specifies how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON text. + + + + + Date formatted strings are not parsed to a date type and are read as strings. + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Specifies how to treat the time value when converting between string and . + + + + + Treat as local time. If the object represents a Coordinated Universal Time (UTC), it is converted to the local time. + + + + + Treat as a UTC. If the object represents a local time, it is converted to a UTC. + + + + + Treat as a local time if a is being converted to a string. + If a string is being converted to , convert to a local time if a time zone is specified. + + + + + Time zone information should be preserved when converting. + + + + + Specifies float format handling options when writing special floating point numbers, e.g. , + and with . + + + + + Write special floating point values as strings in JSON, e.g. "NaN", "Infinity", "-Infinity". + + + + + Write special floating point values as symbols in JSON, e.g. NaN, Infinity, -Infinity. + Note that this will produce non-valid JSON. + + + + + Write special floating point values as the property's default value in JSON, e.g. 0.0 for a property, null for a property. + + + + + Specifies how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Floating point numbers are parsed to . + + + + + Floating point numbers are parsed to . + + + + + Specifies formatting options for the . + + + + + No special formatting is applied. This is the default. + + + + + Causes child objects to be indented according to the and settings. + + + + + Provides an interface for using pooled arrays. + + The array type content. + + + + Rent a array from the pool. This array must be returned when it is no longer needed. + + The minimum required length of the array. The returned array may be longer. + The rented array from the pool. This array must be returned when it is no longer needed. + + + + Return an array to the pool. + + The array that is being returned. + + + + Instructs the to use the specified constructor when deserializing that object. + + + + + Instructs the how to serialize the collection. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Instructs the to deserialize properties with no matching class member into the specified collection + and write values during serialization. + + + + + Gets or sets a value that indicates whether to write extension data when serializing the object. + + + true to write extension data when serializing the object; otherwise, false. The default is true. + + + + + Gets or sets a value that indicates whether to read extension data when deserializing the object. + + + true to read extension data when deserializing the object; otherwise, false. The default is true. + + + + + Initializes a new instance of the class. + + + + + Instructs the to always serialize the member, and require the member has a value. + + + + + Specifies how JSON comments are handled when loading JSON. + + + + + Ignore comments. + + + + + Load comments as a with type . + + + + + Specifies how line information is handled when loading JSON. + + + + + Ignore line information. + + + + + Load line information. + + + + + Represents a view of a . + + + + + Initializes a new instance of the class. + + The name. + + + + When overridden in a derived class, returns whether resetting an object changes its value. + + + true if resetting the component changes its value; otherwise, false. + + The component to test for reset capability. + + + + + When overridden in a derived class, gets the current value of the property on a component. + + + The value of a property for a given component. + + The component with the property for which to retrieve the value. + + + + + When overridden in a derived class, resets the value for this property of the component to the default value. + + The component with the property value that is to be reset to the default value. + + + + + When overridden in a derived class, sets the value of the component to a different value. + + The component with the property value that is to be set. + The new value. + + + + + When overridden in a derived class, determines a value indicating whether the value of this property needs to be persisted. + + + true if the property should be persisted; otherwise, false. + + The component with the property to be examined for persistence. + + + + + When overridden in a derived class, gets the type of the component this property is bound to. + + + A that represents the type of component this property is bound to. When the or methods are invoked, the object specified might be an instance of this type. + + + + + When overridden in a derived class, gets a value indicating whether this property is read-only. + + + true if the property is read-only; otherwise, false. + + + + + When overridden in a derived class, gets the type of the property. + + + A that represents the type of the property. + + + + + Gets the hash code for the name of the member. + + + + The hash code for the name of the member. + + + + + Specifies the settings used when loading JSON. + + + + + Gets or sets how JSON comments are handled when loading JSON. + + The JSON comment handling. + + + + Gets or sets how JSON line info is handled when loading JSON. + + The JSON line info handling. + + + + Specifies the settings used when merging JSON. + + + + + Gets or sets the method used when merging JSON arrays. + + The method used when merging JSON arrays. + + + + Gets or sets how how null value properties are merged. + + How null value properties are merged. + + + + Specifies how JSON arrays are merged together. + + + + Concatenate arrays. + + + Union arrays, skipping items that already exist. + + + Replace all array items. + + + Merge array items together, matched by index. + + + + Specifies how null value properties are merged. + + + + + The content's null value properties will be ignored during merging. + + + + + The content's null value properties will be merged. + + + + + Represents a raw JSON string. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class. + + The raw json. + + + + Creates an instance of with the content of the reader's current token. + + The reader. + An instance of with the content of the reader's current token. + + + + Represents a collection of objects. + + The type of token + + + + Gets the with the specified key. + + + + + + Compares tokens to determine whether they are equal. + + + + + Determines whether the specified objects are equal. + + The first object of type to compare. + The second object of type to compare. + + true if the specified objects are equal; otherwise, false. + + + + + Returns a hash code for the specified object. + + The for which a hash code is to be returned. + A hash code for the specified object. + The type of is a reference type and is null. + + + + Contains the LINQ to JSON extension methods. + + + + + Returns a collection of tokens that contains the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the descendants of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, and the descendants of every token in the source collection. + + + + Returns a collection of child properties of every object in the source collection. + + An of that contains the source collection. + An of that contains the properties of every object in the source collection. + + + + Returns a collection of child values of every object in the source collection with the given key. + + An of that contains the source collection. + The token key. + An of that contains the values of every token in the source collection with the given key. + + + + Returns a collection of child values of every object in the source collection. + + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child values of every object in the source collection with the given key. + + The type to convert the values to. + An of that contains the source collection. + The token key. + An that contains the converted values of every token in the source collection with the given key. + + + + Returns a collection of converted child values of every object in the source collection. + + The type to convert the values to. + An of that contains the source collection. + An that contains the converted values of every token in the source collection. + + + + Converts the value. + + The type to convert the value to. + A cast as a of . + A converted value. + + + + Converts the value. + + The source collection type. + The type to convert the value to. + A cast as a of . + A converted value. + + + + Returns a collection of child tokens of every array in the source collection. + + The source collection type. + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child tokens of every array in the source collection. + + An of that contains the source collection. + The type to convert the values to. + The source collection type. + An that contains the converted values of every token in the source collection. + + + + Returns the input typed as . + + An of that contains the source collection. + The input typed as . + + + + Returns the input typed as . + + The source collection type. + An of that contains the source collection. + The input typed as . + + + + Represents a JSON constructor. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets or sets the name of this constructor. + + The constructor name. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name. + + The constructor name. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a token that can contain other tokens. + + + + + Occurs when the list changes or an item in the list changes. + + + + + Occurs before an item is added to the collection. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Get the first child token of this token. + + + A containing the first child token of the . + + + + + Get the last child token of this token. + + + A containing the last child token of the . + + + + + Returns a collection of the child tokens of this token, in document order. + + + An of containing the child tokens of this , in document order. + + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + + A containing the child values of this , in document order. + + + + + Returns a collection of the descendant tokens for this token in document order. + + An containing the descendant tokens of the . + + + + Returns a collection of the tokens that contain this token, and all descendant tokens of this token, in document order. + + An containing this token, and all the descendant tokens of the . + + + + Adds the specified content as children of this . + + The content to be added. + + + + Adds the specified content as the first children of this . + + The content to be added. + + + + Creates an that can be used to add tokens to the . + + An that is ready to have content written to it. + + + + Replaces the children nodes of this token with the specified content. + + The content. + + + + Removes the child nodes from this token. + + + + + Merge the specified content into this . + + The content to be merged. + + + + Merge the specified content into this using . + + The content to be merged. + The used to merge the content. + + + + Gets the count of child JSON tokens. + + The count of child JSON tokens + + + + Represents a collection of objects. + + The type of token + + + + An empty collection of objects. + + + + + Initializes a new instance of the struct. + + The enumerable. + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + + + + Gets the with the specified key. + + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Represents a JSON object. + + + + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Occurs when a property value changes. + + + + + Occurs when a property value is changing. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Gets the node type for this . + + The type. + + + + Gets an of this object's properties. + + An of this object's properties. + + + + Gets a the specified name. + + The property name. + A with the specified name or null. + + + + Gets an of this object's property values. + + An of this object's property values. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the with the specified property name. + + + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified property name. + + Name of the property. + The with the specified property name. + + + + Gets the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + One of the enumeration values that specifies how the strings will be compared. + The with the specified property name. + + + + Tries to get the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + The value. + One of the enumeration values that specifies how the strings will be compared. + true if a value was successfully retrieved; otherwise, false. + + + + Adds the specified property name. + + Name of the property. + The value. + + + + Removes the property with the specified name. + + Name of the property. + true if item was successfully removed; otherwise, false. + + + + Tries the get value. + + Name of the property. + The value. + true if a value was successfully retrieved; otherwise, false. + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Returns the properties for this instance of a component. + + + A that represents the properties for this component instance. + + + + + Returns the properties for this instance of a component using the attribute array as a filter. + + An array of type that is used as a filter. + + A that represents the filtered properties for this component instance. + + + + + Returns a collection of custom attributes for this instance of a component. + + + An containing the attributes for this object. + + + + + Returns the class name of this instance of a component. + + + The class name of the object, or null if the class does not have a name. + + + + + Returns the name of this instance of a component. + + + The name of the object, or null if the object does not have a name. + + + + + Returns a type converter for this instance of a component. + + + A that is the converter for this object, or null if there is no for this object. + + + + + Returns the default event for this instance of a component. + + + An that represents the default event for this object, or null if this object does not have events. + + + + + Returns the default property for this instance of a component. + + + A that represents the default property for this object, or null if this object does not have properties. + + + + + Returns an editor of the specified type for this instance of a component. + + A that represents the editor for this object. + + An of the specified type that is the editor for this object, or null if the editor cannot be found. + + + + + Returns the events for this instance of a component using the specified attribute array as a filter. + + An array of type that is used as a filter. + + An that represents the filtered events for this component instance. + + + + + Returns the events for this instance of a component. + + + An that represents the events for this component instance. + + + + + Returns an object that contains the property described by the specified property descriptor. + + A that represents the property whose owner is to be found. + + An that represents the owner of the specified property. + + + + + Represents a JSON array. + + + + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the at the specified index. + + + + + + Determines the index of a specific item in the . + + The object to locate in the . + + The index of if found in the list; otherwise, -1. + + + + + Inserts an item to the at the specified index. + + The zero-based index at which should be inserted. + The object to insert into the . + + is not a valid index in the . + The is read-only. + + + + Removes the item at the specified index. + + The zero-based index of the item to remove. + + is not a valid index in the . + The is read-only. + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + + + + Adds an item to the . + + The object to add to the . + The is read-only. + + + + Removes all items from the . + + The is read-only. + + + + Determines whether the contains a specific value. + + The object to locate in the . + + true if is found in the ; otherwise, false. + + + + + Copies to. + + The array. + Index of the array. + + + + Gets a value indicating whether the is read-only. + + true if the is read-only; otherwise, false. + + + + Removes the first occurrence of a specific object from the . + + The object to remove from the . + + true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + + The is read-only. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Gets the at the reader's current position. + + + + + Initializes a new instance of the class. + + The token to read from. + + + + Reads the next JSON token from the stream. + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Gets the path of the current JSON token. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets the at the writer's current position. + + + + + Gets the token being writen. + + The token being writen. + + + + Initializes a new instance of the class writing to the given . + + The container being written to. + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream. + + + + + Closes this stream and the underlying stream. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end. + + The token. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes out a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Represents an abstract JSON token. + + + + + Gets a comparer that can compare two tokens for value equality. + + A that can compare two nodes for value equality. + + + + Gets or sets the parent. + + The parent. + + + + Gets the root of this . + + The root of this . + + + + Gets the node type for this . + + The type. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Compares the values of two tokens, including the values of all descendant tokens. + + The first to compare. + The second to compare. + true if the tokens are equal; otherwise false. + + + + Gets the next sibling token of this node. + + The that contains the next sibling token. + + + + Gets the previous sibling token of this node. + + The that contains the previous sibling token. + + + + Gets the path of the JSON token. + + + + + Adds the specified content immediately after this token. + + A content object that contains simple content or a collection of content objects to be added after this token. + + + + Adds the specified content immediately before this token. + + A content object that contains simple content or a collection of content objects to be added before this token. + + + + Returns a collection of the ancestor tokens of this token. + + A collection of the ancestor tokens of this token. + + + + Returns a collection of tokens that contain this token, and the ancestors of this token. + + A collection of tokens that contain this token, and the ancestors of this token. + + + + Returns a collection of the sibling tokens after this token, in document order. + + A collection of the sibling tokens after this tokens, in document order. + + + + Returns a collection of the sibling tokens before this token, in document order. + + A collection of the sibling tokens before this token, in document order. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets the with the specified key converted to the specified type. + + The type to convert the token to. + The token key. + The converted token value. + + + + Get the first child token of this token. + + A containing the first child token of the . + + + + Get the last child token of this token. + + A containing the last child token of the . + + + + Returns a collection of the child tokens of this token, in document order. + + An of containing the child tokens of this , in document order. + + + + Returns a collection of the child tokens of this token, in document order, filtered by the specified type. + + The type to filter the child tokens on. + A containing the child tokens of this , in document order. + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + A containing the child values of this , in document order. + + + + Removes this token from its parent. + + + + + Replaces this token with the specified token. + + The value. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Returns the indented JSON for this token. + + + The indented JSON for this token. + + + + + Returns the JSON for this token using the given formatting and converters. + + Indicates how the output is formatted. + A collection of which will be used when writing the token. + The JSON for this token using the given formatting and converters. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to []. + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from [] to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Creates an for this token. + + An that can be used to read this token and its descendants. + + + + Creates a from an object. + + The object that will be used to create . + A with the value of the specified object + + + + Creates a from an object using the specified . + + The object that will be used to create . + The that will be used when reading the object. + A with the value of the specified object + + + + Creates the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates a from a . + + An positioned at the token to read into this . + + An that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + An that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + Creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + An that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + An positioned at the token to read into this . + + An that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Selects a using a JPath expression. Selects the token that matches the object path. + + + A that contains a JPath expression. + + A , or null. + + + + Selects a using a JPath expression. Selects the token that matches the object path. + + + A that contains a JPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + A . + + + + Selects a collection of elements using a JPath expression. + + + A that contains a JPath expression. + + An that contains the selected elements. + + + + Selects a collection of elements using a JPath expression. + + + A that contains a JPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + An that contains the selected elements. + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A new instance of the . + + + + Adds an object to the annotation list of this . + + The annotation to add. + + + + Get the first annotation object of the specified type from this . + + The type of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets the first annotation object of the specified type from this . + + The of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets a collection of annotations of the specified type for this . + + The type of the annotations to retrieve. + An that contains the annotations for this . + + + + Gets a collection of annotations of the specified type for this . + + The of the annotations to retrieve. + An of that contains the annotations that match the specified type for this . + + + + Removes the annotations of the specified type from this . + + The type of annotations to remove. + + + + Removes the annotations of the specified type from this . + + The of annotations to remove. + + + + Represents a JSON property. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the property name. + + The property name. + + + + Gets or sets the property value. + + The property value. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Specifies the type of token. + + + + + No token type has been set. + + + + + A JSON object. + + + + + A JSON array. + + + + + A JSON constructor. + + + + + A JSON object property. + + + + + A comment. + + + + + An integer value. + + + + + A float value. + + + + + A string value. + + + + + A boolean value. + + + + + A null value. + + + + + An undefined value. + + + + + A date value. + + + + + A raw JSON value. + + + + + A collection of bytes value. + + + + + A Guid value. + + + + + A Uri value. + + + + + A TimeSpan value. + + + + + Represents a value in JSON (string, integer, date, etc). + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Creates a comment with the given value. + + The value. + A comment with the given value. + + + + Creates a string with the given value. + + The value. + A string with the given value. + + + + Creates a null value. + + A null value. + + + + Creates a undefined value. + + A undefined value. + + + + Gets the node type for this . + + The type. + + + + Gets or sets the underlying token value. + + The underlying token value. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Indicates whether the current object is equal to another object of the same type. + + + true if the current object is equal to the parameter; otherwise, false. + + An object to compare with this object. + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + The parameter is null. + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format provider. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + The format provider. + + A that represents this instance. + + + + + Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. + + An object to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return value has these meanings: + Value + Meaning + Less than zero + This instance is less than . + Zero + This instance is equal to . + Greater than zero + This instance is greater than . + + + is not the same type as this instance. + + + + + Specifies metadata property handling options for the . + + + + + Read metadata properties located at the start of a JSON object. + + + + + Read metadata properties located anywhere in a JSON object. Note that this setting will impact performance. + + + + + Do not try to read metadata properties. + + + + + Represents a trace writer that writes to the application's instances. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of Info will exclude Verbose messages and include Info, + Warning and Error messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Provides methods to get attributes. + + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Represents a trace writer. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of Info will exclude Verbose messages and include Info, + Warning and Error messages. + + The that will be used to filter the trace messages passed to the writer. + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Contract details for a used by the . + + + + + Gets or sets the default collection items . + + The converter. + + + + Gets or sets a value indicating whether the collection items preserve object references. + + true if collection items preserve object references; otherwise, false. + + + + Gets or sets the collection item reference loop handling. + + The reference loop handling. + + + + Gets or sets the collection item type name handling. + + The type name handling. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Represents a trace writer that writes to memory. When the trace message limit is + reached then old trace messages will be removed as new messages are added. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of Info will exclude Verbose messages and include Info, + Warning and Error messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Initializes a new instance of the class. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Returns an enumeration of the most recent trace messages. + + An enumeration of the most recent trace messages. + + + + Returns a of the most recent trace messages. + + + A of the most recent trace messages. + + + + + Provides methods to get attributes from a , , or . + + + + + Initializes a new instance of the class. + + The instance to get attributes for. This parameter should be a , , or . + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Contract details for a used by the . + + + + + Gets or sets the ISerializable object constructor. + + The ISerializable object constructor. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Provides data for the Error event. + + + + + Gets the current object the error event is being raised against. + + The current object the error event is being raised against. + + + + Gets the error context. + + The error context. + + + + Initializes a new instance of the class. + + The current object. + The error context. + + + + Resolves member mappings for a type, camel casing property names. + + + + + Initializes a new instance of the class. + + + + + Resolves the name of the property. + + Name of the property. + The property name camel cased. + + + + Used by to resolves a for a given . + + + + + Gets a value indicating whether members are being get and set using dynamic code generation. + This value is determined by the runtime permissions available. + + + true if using dynamic code generation; otherwise, false. + + + + + Gets or sets the default members search flags. + + The default members search flags. + + + + Gets or sets a value indicating whether compiler generated members should be serialized. + + + true if serialized compiler generated members; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the interface when serializing and deserializing types. + + + true if the interface will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the attribute when serializing and deserializing types. + + + true if the attribute will be ignored when serializing and deserializing types; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + If set to true the will use a cached shared with other resolvers of the same type. + Sharing the cache will significantly improve performance with multiple resolver instances because expensive reflection will only + happen once. This setting can cause unexpected behavior if different instances of the resolver are suppose to produce different + results. When set to false it is highly recommended to reuse instances with the . + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Gets the serializable members for the type. + + The type to get serializable members for. + The serializable members for the type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates the constructor parameters. + + The constructor to create properties for. + The type's member properties. + Properties for the given . + + + + Creates a for the given . + + The matching member property. + The constructor parameter. + A created for the given . + + + + Resolves the default for the contract. + + Type of the object. + The contract's default . + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Determines which contract type is created for the given type. + + Type of the object. + A for the given type. + + + + Creates properties for the given . + + The type to create properties for. + /// The member serialization mode for the type. + Properties for the given . + + + + Creates the used by the serializer to get and set values from a member. + + The member. + The used by the serializer to get and set values from a member. + + + + Creates a for the given . + + The member's parent . + The member to create a for. + A created for the given . + + + + Resolves the name of the property. + + Name of the property. + Resolved name of the property. + + + + Resolves the key of the dictionary. By default is used to resolve dictionary keys. + + Key of the dictionary. + Resolved key of the dictionary. + + + + Gets the resolved name of the property. + + Name of the property. + Name of the property. + + + + The default serialization binder used when resolving and loading classes from type names. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + The type of the object the formatter creates a new instance of. + + + + + Provides information surrounding an error. + + + + + Gets the error. + + The error. + + + + Gets the original object that caused the error. + + The original object that caused the error. + + + + Gets the member that caused the error. + + The member that caused the error. + + + + Gets the path of the JSON location where the error occurred. + + The path of the JSON location where the error occurred. + + + + Gets or sets a value indicating whether this is handled. + + true if handled; otherwise, false. + + + + Used by to resolves a for a given . + + + + + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Provides methods to get and set values. + + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Contract details for a used by the . + + + + + Gets the of the collection items. + + The of the collection items. + + + + Gets a value indicating whether the collection type is a multidimensional array. + + true if the collection type is a multidimensional array; otherwise, false. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the collection values. + + true if the creator has a parameter with the collection values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Handles serialization callback events. + + The object that raised the callback event. + The streaming context. + + + + Handles serialization error callback events. + + The object that raised the callback event. + The streaming context. + The error context. + + + + Sets extension data for an object during deserialization. + + The object to set extension data on. + The extension data key. + The extension data value. + + + + Gets extension data for an object during serialization. + + The object to set extension data on. + + + + Contract details for a used by the . + + + + + Gets the underlying type for the contract. + + The underlying type for the contract. + + + + Gets or sets the type created during deserialization. + + The type created during deserialization. + + + + Gets or sets whether this type contract is serialized as a reference. + + Whether this type contract is serialized as a reference. + + + + Gets or sets the default for this contract. + + The converter. + + + + Gets or sets all methods called immediately after deserialization of the object. + + The methods called immediately after deserialization of the object. + + + + Gets or sets all methods called during deserialization of the object. + + The methods called during deserialization of the object. + + + + Gets or sets all methods called after serialization of the object graph. + + The methods called after serialization of the object graph. + + + + Gets or sets all methods called before serialization of the object. + + The methods called before serialization of the object. + + + + Gets or sets all method called when an error is thrown during the serialization of the object. + + The methods called when an error is thrown during the serialization of the object. + + + + Gets or sets the method called immediately after deserialization of the object. + + The method called immediately after deserialization of the object. + + + + Gets or sets the method called during deserialization of the object. + + The method called during deserialization of the object. + + + + Gets or sets the method called after serialization of the object graph. + + The method called after serialization of the object graph. + + + + Gets or sets the method called before serialization of the object. + + The method called before serialization of the object. + + + + Gets or sets the method called when an error is thrown during the serialization of the object. + + The method called when an error is thrown during the serialization of the object. + + + + Gets or sets the default creator method used to create the object. + + The default creator method used to create the object. + + + + Gets or sets a value indicating whether the default creator is non public. + + true if the default object creator is non-public; otherwise, false. + + + + Contract details for a used by the . + + + + + Gets or sets the property name resolver. + + The property name resolver. + + + + Gets or sets the dictionary key resolver. + + The dictionary key resolver. + + + + Gets the of the dictionary keys. + + The of the dictionary keys. + + + + Gets the of the dictionary values. + + The of the dictionary values. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the dictionary values. + + true if the creator has a parameter with the dictionary values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Maps a JSON property to a .NET member or constructor parameter. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the type that declared this property. + + The type that declared this property. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets the name of the underlying member or parameter. + + The name of the underlying member or parameter. + + + + Gets the that will get and set the during serialization. + + The that will get and set the during serialization. + + + + Gets or sets the for this property. + + The for this property. + + + + Gets or sets the type of the property. + + The type of the property. + + + + Gets or sets the for the property. + If set this converter takes presidence over the contract converter for the property type. + + The converter. + + + + Gets or sets the member converter. + + The member converter. + + + + Gets or sets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets or sets a value indicating whether this is readable. + + true if readable; otherwise, false. + + + + Gets or sets a value indicating whether this is writable. + + true if writable; otherwise, false. + + + + Gets or sets a value indicating whether this has a member attribute. + + true if has a member attribute; otherwise, false. + + + + Gets the default value. + + The default value. + + + + Gets or sets a value indicating whether this is required. + + A value indicating whether this is required. + + + + Gets or sets a value indicating whether this property preserves object references. + + + true if this instance is reference; otherwise, false. + + + + + Gets or sets the property null value handling. + + The null value handling. + + + + Gets or sets the property default value handling. + + The default value handling. + + + + Gets or sets the property reference loop handling. + + The reference loop handling. + + + + Gets or sets the property object creation handling. + + The object creation handling. + + + + Gets or sets or sets the type name handling. + + The type name handling. + + + + Gets or sets a predicate used to determine whether the property should be serialize. + + A predicate used to determine whether the property should be serialize. + + + + Gets or sets a predicate used to determine whether the property should be deserialized. + + A predicate used to determine whether the property should be deserialized. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets an action used to set whether the property has been deserialized. + + An action used to set whether the property has been deserialized. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Gets or sets the converter used when serializing the property's collection items. + + The collection's items converter. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Gets or sets the the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets the the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + A collection of objects. + + + + + Initializes a new instance of the class. + + The type. + + + + When implemented in a derived class, extracts the key from the specified element. + + The element from which to extract the key. + The key for the specified element. + + + + Adds a object. + + The property to add to the collection. + + + + Gets the closest matching object. + First attempts to get an exact case match of propertyName and then + a case insensitive match. + + Name of the property. + A matching property if found. + + + + Gets a property by property name. + + The name of the property to get. + Type property name string comparison. + A matching property if found. + + + + Used to resolve references when serializing and deserializing JSON by the . + + + + + Resolves a reference to its object. + + The serialization context. + The reference to resolve. + The object that + + + + Gets the reference for the sepecified object. + + The serialization context. + The object to get a reference for. + The reference to the object. + + + + Determines whether the specified object is referenced. + + The serialization context. + The object to test for a reference. + + true if the specified object is referenced; otherwise, false. + + + + + Adds a reference to the specified object. + + The serialization context. + The reference. + The object to reference. + + + + Contract details for a used by the . + + + + + Gets or sets the object member serialization. + + The member object serialization. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Gets the object's properties. + + The object's properties. + + + + Gets the constructor parameters required for any non-default constructor + + + + + Gets a collection of instances that define the parameters used with . + + + + + Gets or sets the override constructor used to create the object. + This is set when a constructor is marked up using the + JsonConstructor attribute. + + The override constructor. + + + + Gets or sets the parametrized constructor used to create the object. + + The parametrized constructor. + + + + Gets or sets the function used to create the object. When set this function will override . + This function is called with a collection of arguments which are defined by the collection. + + The function used to create the object. + + + + Gets or sets the extension data setter. + + + + + Gets or sets the extension data getter. + + + + + Gets or sets the extension data value type. + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Lookup and create an instance of the JsonConverter type described by the argument. + + The JsonConverter type to create. + Optional arguments to pass to an initializing constructor of the JsonConverter. + If null, the default constructor is used. + + + + Create a factory function that can be used to create instances of a JsonConverter described by the + argument type. The returned function can then be used to either invoke the converter's default ctor, or any + parameterized constructors by way of an object array. + + + + + Get and set values for a using reflection. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + When applied to a method, specifies that the method is called when an error occurs serializing an object. + + + + + Represents a method that constructs an object. + + The object type to create. + + + + Specifies how strings are escaped when writing JSON text. + + + + + Only control characters (e.g. newline) are escaped. + + + + + All non-ASCII and control characters (e.g. newline) are escaped. + + + + + HTML (<, >, &, ', ") and control characters (e.g. newline) are escaped. + + + + + Converts the value to the specified type. If the value is unable to be converted, the + value is checked whether it assignable to the specified type. + + The value to convert. + The culture to use when converting. + The type to convert or cast the value to. + + The converted type. If conversion was unsuccessful, the initial value + is returned if assignable to the target type. + + + + + Gets a dictionary of the names and values of an Enum type. + + + + + + Gets a dictionary of the names and values of an Enum type. + + The enum type to get names and values for. + + + + + Builds a string. Unlike StringBuilder this class lets you reuse it's internal buffer. + + + + + Determines whether the collection is null or empty. + + The collection. + + true if the collection is null or empty; otherwise, false. + + + + + Adds the elements of the specified collection to the specified generic IList. + + The list to add to. + The collection of elements to add. + + + + Gets the type of the typed collection's items. + + The type. + The type of the typed collection's items. + + + + Gets the member's underlying type. + + The member. + The underlying type of the member. + + + + Determines whether the member is an indexed property. + + The member. + + true if the member is an indexed property; otherwise, false. + + + + + Determines whether the property is an indexed property. + + The property. + + true if the property is an indexed property; otherwise, false. + + + + + Gets the member's value on the object. + + The member. + The target object. + The member's value on the object. + + + + Sets the member's value on the target object. + + The member. + The target. + The value. + + + + Determines whether the specified MemberInfo can be read. + + The MemberInfo to determine whether can be read. + /// if set to true then allow the member to be gotten non-publicly. + + true if the specified MemberInfo can be read; otherwise, false. + + + + + Determines whether the specified MemberInfo can be set. + + The MemberInfo to determine whether can be set. + if set to true then allow the member to be set non-publicly. + if set to true then allow the member to be set if read-only. + + true if the specified MemberInfo can be set; otherwise, false. + + + + + Determines whether the string is all white space. Empty string will return false. + + The string to test whether it is all white space. + + true if the string is all white space; otherwise, false. + + + + + Nulls an empty string. + + The string. + Null if the string was null, otherwise the string unchanged. + + + + Indicating whether a property is required. + + + + + The property is not required. The default state. + + + + + The property must be defined in JSON but can be a null value. + + + + + The property must be defined in JSON and cannot be a null value. + + + + + The property is not required but it cannot be a null value. + + + + + Specifies reference handling options for the . + Note that references cannot be preserved when a value is set via a non-default constructor such as types that implement ISerializable. + + + + + + + + Do not preserve references when serializing types. + + + + + Preserve references when serializing into a JSON object structure. + + + + + Preserve references when serializing into a JSON array structure. + + + + + Preserve references when serializing. + + + + + Provides an interface to enable a class to return line and position information. + + + + + Gets a value indicating whether the class can return line information. + + + true if LineNumber and LinePosition can be provided; otherwise, false. + + + + + Gets the current line number. + + The current line number or 0 if no line information is available (for example, HasLineInfo returns false). + + + + Gets the current line position. + + The current line position or 0 if no line information is available (for example, HasLineInfo returns false). + + + + Instructs the how to serialize the collection. + + + + + Gets or sets a value indicating whether null items are allowed in the collection. + + true if null items are allowed in the collection; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a flag indicating whether the array can contain null items + + A flag indicating whether the array can contain null items. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the how to serialize the object. + + + + + Gets or sets the id. + + The id. + + + + Gets or sets the title. + + The title. + + + + Gets or sets the description. + + The description. + + + + Gets the collection's items converter. + + The collection's items converter. + + + + The parameter list to use when constructing the JsonConverter described by ItemConverterType. + If null, the default constructor is used. + When non-null, there must be a constructor defined in the JsonConverter that exactly matches the number, + order, and type of these parameters. + + + [JsonContainer(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + Gets or sets a value that indicates whether to preserve object references. + + + true to keep object reference; otherwise, false. The default is false. + + + + + Gets or sets a value that indicates whether to preserve collection's items references. + + + true to keep collection's items object references; otherwise, false. The default is false. + + + + + Gets or sets the reference loop handling used when serializing the collection's items. + + The reference loop handling. + + + + Gets or sets the type name handling used when serializing the collection's items. + + The type name handling. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Specifies default value handling options for the . + + + + + + + + + Include members where the member value is the same as the member's default value when serializing objects. + Included members are written to JSON. Has no effect when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + so that is is not written to JSON. + This option will ignore all default values (e.g. null for objects and nullable types; 0 for integers, + decimals and floating point numbers; and false for booleans). The default value ignored can be changed by + placing the on the property. + + + + + Members with a default value but no JSON will be set to their default value when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + and sets members to their default value when deserializing. + + + + + Instructs the to use the specified when serializing the member or class. + + + + + Gets the of the converter. + + The of the converter. + + + + The parameter list to use when constructing the JsonConverter described by ConverterType. + If null, the default constructor is used. + + + + + Initializes a new instance of the class. + + Type of the converter. + + + + Initializes a new instance of the class. + + Type of the converter. + Parameter list to use when constructing the JsonConverter. Can be null. + + + + Instructs the how to serialize the object. + + + + + Gets or sets the member serialization. + + The member serialization. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified member serialization. + + The member serialization. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Specifies the settings on a object. + + + + + Gets or sets how reference loops (e.g. a class referencing itself) is handled. + + Reference loop handling. + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + + Missing member handling. + + + + Gets or sets how objects are created during deserialization. + + The object creation handling. + + + + Gets or sets how null values are handled during serialization and deserialization. + + Null value handling. + + + + Gets or sets how null default are handled during serialization and deserialization. + + The default value handling. + + + + Gets or sets a collection that will be used during serialization. + + The converters. + + + + Gets or sets how object references are preserved by the serializer. + + The preserve references handling. + + + + Gets or sets how type name writing and reading is handled by the serializer. + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than TypeNameHandling.None. + + The type name handling. + + + + Gets or sets how metadata properties are used during deserialization. + + The metadata properties handling. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + + The type name assembly format. + + + + Gets or sets how constructors are used during deserialization. + + The constructor handling. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + The contract resolver. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets the used by the serializer when resolving references. + + The reference resolver. + + + + Gets or sets a function that creates the used by the serializer when resolving references. + + A function that creates the used by the serializer when resolving references. + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the error handler called during serialization and deserialization. + + The error handler called during serialization and deserialization. + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Get or set how and values are formatted when writing JSON text, and the expected date format when reading JSON text. + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + + + + + Indicates how JSON text output is formatted. + + + + + Get or set how dates are written to JSON text. + + + + + Get or set how time zones are handling during serialization and deserialization. + + + + + Get or set how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Get or set how special floating point numbers, e.g. , + and , + are written as JSON. + + + + + Get or set how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Get or set how strings are escaped when writing JSON text. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Gets a value indicating whether there will be a check for additional content after deserializing an object. + + + true if there will be a check for additional content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Specifies the member serialization options for the . + + + + + All public members are serialized by default. Members can be excluded using or . + This is the default member serialization mode. + + + + + Only members marked with or are serialized. + This member serialization mode can also be set by marking the class with . + + + + + All public and private fields are serialized. Members can be excluded using or . + This member serialization mode can also be set by marking the class with + and setting IgnoreSerializableAttribute on to false. + + + + + Specifies how object creation is handled by the . + + + + + Reuse existing objects, create new objects when needed. + + + + + Only reuse existing objects. + + + + + Always create new objects. + + + + + Represents a reader that provides fast, non-cached, forward-only access to JSON text data. + + + + + Initializes a new instance of the class with the specified . + + The TextReader containing the XML data to read. + + + + Gets or sets the reader's character buffer pool. + + + + + Reads the next JSON token from the stream. + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a []. + + A [] or a null reference if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Changes the state to closed. + + + + + Gets a value indicating whether the class can return line information. + + + true if LineNumber and LinePosition can be provided; otherwise, false. + + + + + Gets the current line number. + + + The current line number or 0 if no line information is available (for example, HasLineInfo returns false). + + + + + Gets the current line position. + + + The current line position or 0 if no line information is available (for example, HasLineInfo returns false). + + + + + Instructs the to always serialize the member with the specified name. + + + + + Gets or sets the converter used when serializing the property's collection items. + + The collection's items converter. + + + + The parameter list to use when constructing the JsonConverter described by ItemConverterType. + If null, the default constructor is used. + When non-null, there must be a constructor defined in the JsonConverter that exactly matches the number, + order, and type of these parameters. + + + [JsonProperty(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + Gets or sets the null value handling used when serializing this property. + + The null value handling. + + + + Gets or sets the default value handling used when serializing this property. + + The default value handling. + + + + Gets or sets the reference loop handling used when serializing this property. + + The reference loop handling. + + + + Gets or sets the object creation handling used when deserializing this property. + + The object creation handling. + + + + Gets or sets the type name handling used when serializing this property. + + The type name handling. + + + + Gets or sets whether this property's value is serialized as a reference. + + Whether this property's value is serialized as a reference. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets a value indicating whether this property is required. + + + A value indicating whether this property is required. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + Gets or sets the the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified name. + + Name of the property. + + + + Instructs the not to serialize the public field or public read/write property value. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets or sets the writer's character array pool. + + + + + Gets or sets how many IndentChars to write for each level in the hierarchy when is set to Formatting.Indented. + + + + + Gets or sets which character to use to quote attribute values. + + + + + Gets or sets which character to use for indenting when is set to Formatting.Indented. + + + + + Gets or sets a value indicating whether object names will be surrounded with quotes. + + + + + Creates an instance of the JsonWriter class using the specified . + + The TextWriter to write to. + + + + Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream. + + + + + Closes this stream and the underlying stream. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the specified end token. + + The end token to write. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes out a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes out the given white space. + + The string of white space characters. + + + + The exception thrown when an error occurs while reading JSON text. + + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + The exception thrown when an error occurs while reading JSON text. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Converts an object to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can read JSON. + + true if this can read JSON; otherwise, false. + + + + Gets a value indicating whether this can write JSON. + + true if this can write JSON; otherwise, false. + + + + Represents a collection of . + + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Specifies the state of the reader. + + + + + The Read method has not been called. + + + + + The end of the file has been reached successfully. + + + + + Reader is at a property. + + + + + Reader is at the start of an object. + + + + + Reader is in an object. + + + + + Reader is at the start of an array. + + + + + Reader is in an array. + + + + + The Close method has been called. + + + + + Reader has just read a value. + + + + + Reader is at the start of a constructor. + + + + + Reader in a constructor. + + + + + An error occurred that prevents the read operation from continuing. + + + + + The end of the file has been reached successfully. + + + + + Gets the current reader state. + + The current reader state. + + + + Gets or sets a value indicating whether the underlying stream or + should be closed when the reader is closed. + + + true to close the underlying stream or when + the reader is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether multiple pieces of JSON content can + be read from a continuous stream without erroring. + + + true to support reading multiple pieces of JSON content; otherwise false. The default is false. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + Get or set how time zones are handling when reading JSON. + + + + + Get or set how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Get or set how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Get or set how custom date formatted strings are parsed when reading JSON. + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + + + + + Gets the type of the current JSON token. + + + + + Gets the text value of the current JSON token. + + + + + Gets The Common Language Runtime (CLR) type for the current JSON token. + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Initializes a new instance of the class with the specified . + + + + + Reads the next JSON token from the stream. + + true if the next token was read successfully; false if there are no more tokens to read. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a []. + + A [] or a null reference if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Skips the children of the current token. + + + + + Sets the current token. + + The new token. + + + + Sets the current token and value. + + The new token. + The value. + + + + Sets the state based on current token type. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Changes the to Closed. + + + + + Provides methods for converting between common language runtime types and JSON types. + + + + + + + + Gets or sets a function that creates default . + Default settings are automatically used by serialization methods on , + and and on . + To serialize without using any default settings create a with + . + + + + + Represents JavaScript's boolean value true as a string. This field is read-only. + + + + + Represents JavaScript's boolean value false as a string. This field is read-only. + + + + + Represents JavaScript's null as a string. This field is read-only. + + + + + Represents JavaScript's undefined as a string. This field is read-only. + + + + + Represents JavaScript's positive infinity as a string. This field is read-only. + + + + + Represents JavaScript's negative infinity as a string. This field is read-only. + + + + + Represents JavaScript's NaN as a string. This field is read-only. + + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + The time zone handling when the date is converted to a string. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + The string escape handling. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Serializes the specified object to a JSON string. + + The object to serialize. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting. + + The object to serialize. + Indicates how the output is formatted. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a collection of . + + The object to serialize. + A collection converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting and a collection of . + + The object to serialize. + Indicates how the output is formatted. + A collection converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifing the type is optional. + + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using formatting and . + + The object to serialize. + Indicates how the output is formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + Indicates how the output is formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifing the type is optional. + + + A JSON string representation of the object. + + + + + Deserializes the JSON to a .NET object. + + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to a .NET object using . + + The JSON to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The JSON to deserialize. + The of object being deserialized. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The type of the object to deserialize to. + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the given anonymous type. + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be infered from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the given anonymous type using . + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be infered from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The type of the object to deserialize to. + The JSON to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The type of the object to deserialize to. + The object to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The JSON to deserialize. + The type of the object to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The JSON to deserialize. + The type of the object to deserialize to. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Populates the object with values from the JSON string. + + The JSON to populate values from. + The target object to populate values onto. + + + + Populates the object with values from the JSON string using . + + The JSON to populate values from. + The target object to populate values onto. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + + + + Serializes the XML node to a JSON string. + + The node to serialize. + A JSON string of the XmlNode. + + + + Serializes the XML node to a JSON string using formatting. + + The node to serialize. + Indicates how the output is formatted. + A JSON string of the XmlNode. + + + + Serializes the XML node to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output is formatted. + Omits writing the root object. + A JSON string of the XmlNode. + + + + Deserializes the XmlNode from a JSON string. + + The JSON string. + The deserialized XmlNode + + + + Deserializes the XmlNode from a JSON string nested in a root elment specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized XmlNode + + + + Deserializes the XmlNode from a JSON string nested in a root elment specified by + and writes a .NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A flag to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized XmlNode + + + + Serializes the to a JSON string. + + The node to convert to JSON. + A JSON string of the XNode. + + + + Serializes the to a JSON string using formatting. + + The node to convert to JSON. + Indicates how the output is formatted. + A JSON string of the XNode. + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output is formatted. + Omits writing the root object. + A JSON string of the XNode. + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized XNode + + + + Deserializes the from a JSON string nested in a root elment specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized XNode + + + + Deserializes the from a JSON string nested in a root elment specified by + and writes a .NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A flag to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized XNode + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Serializes and deserializes objects into and from the JSON format. + The enables you to control how objects are encoded into JSON. + + + + + Occurs when the errors during serialization and deserialization. + + + + + Gets or sets the used by the serializer when resolving references. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets how type name writing and reading is handled by the serializer. + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than TypeNameHandling.None. + + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + + The type name assembly format. + + + + Gets or sets how object references are preserved by the serializer. + + + + + Get or set how reference loops (e.g. a class referencing itself) is handled. + + + + + Get or set how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + + + + + Get or set how null values are handled during serialization and deserialization. + + + + + Get or set how null default are handled during serialization and deserialization. + + + + + Gets or sets how objects are created during deserialization. + + The object creation handling. + + + + Gets or sets how constructors are used during deserialization. + + The constructor handling. + + + + Gets or sets how metadata properties are used during deserialization. + + The metadata properties handling. + + + + Gets a collection that will be used during serialization. + + Collection that will be used during serialization. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Indicates how JSON text output is formatted. + + + + + Get or set how dates are written to JSON text. + + + + + Get or set how time zones are handling during serialization and deserialization. + + + + + Get or set how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Get or set how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Get or set how special floating point numbers, e.g. , + and , + are written as JSON text. + + + + + Get or set how strings are escaped when writing JSON text. + + + + + Get or set how and values are formatted when writing JSON text, and the expected date format when reading JSON text. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + + + + + Gets a value indicating whether there will be a check for additional JSON content after deserializing an object. + + + true if there will be a check for additional JSON content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Creates a new instance. + The will not use default settings + from . + + + A new instance. + The will not use default settings + from . + + + + + Creates a new instance using the specified . + The will not use default settings + from . + + The settings to be applied to the . + + A new instance using the specified . + The will not use default settings + from . + + + + + Creates a new instance. + The will use default settings + from . + + + A new instance. + The will use default settings + from . + + + + + Creates a new instance using the specified . + The will use default settings + from as well as the specified . + + The settings to be applied to the . + + A new instance using the specified . + The will use default settings + from as well as the specified . + + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to reader values from. + The target object to populate values onto. + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to reader values from. + The target object to populate values onto. + + + + Deserializes the JSON structure contained by the specified . + + The that contains the JSON structure to deserialize. + The being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The type of the object to deserialize. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Serializes the specified and writes the JSON structure + to a Stream using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Serializes the specified and writes the JSON structure + to a Stream using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifing the type is optional. + + + + + Serializes the specified and writes the JSON structure + to a Stream using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifing the type is optional. + + + + + Serializes the specified and writes the JSON structure + to a Stream using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Specifies missing member handling options for the . + + + + + Ignore a missing member and do not attempt to deserialize it. + + + + + Throw a when a missing member is encountered during deserialization. + + + + + Specifies null value handling options for the . + + + + + + + + + Include null values when serializing and deserializing objects. + + + + + Ignore null values when serializing and deserializing objects. + + + + + Specifies reference loop handling options for the . + + + + + Throw a when a loop is encountered. + + + + + Ignore loop references and do not serialize. + + + + + Serialize loop references. + + + + + Specifies type name handling options for the . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than TypeNameHandling.None. + + + + + Do not include the .NET type name when serializing types. + + + + + Include the .NET type name when serializing into a JSON object structure. + + + + + Include the .NET type name when serializing into a JSON array structure. + + + + + Always include the .NET type name when serializing. + + + + + Include the .NET type name when the type of the object being serialized is not the same as its declared type. + + + + + Specifies the type of JSON token. + + + + + This is returned by the if a method has not been called. + + + + + An object start token. + + + + + An array start token. + + + + + A constructor start token. + + + + + An object property name. + + + + + A comment. + + + + + Raw JSON. + + + + + An integer. + + + + + A float. + + + + + A string. + + + + + A boolean. + + + + + A null token. + + + + + An undefined token. + + + + + An object end token. + + + + + An array end token. + + + + + A constructor end token. + + + + + A Date. + + + + + Byte data. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets or sets a value indicating whether the underlying stream or + should be closed when the writer is closed. + + + true to close the underlying stream or when + the writer is closed; otherwise false. The default is true. + + + + + Gets the top. + + The top. + + + + Gets the state of the writer. + + + + + Gets the path of the writer. + + + + + Indicates how JSON text output is formatted. + + + + + Get or set how dates are written to JSON text. + + + + + Get or set how time zones are handling when writing JSON text. + + + + + Get or set how strings are escaped when writing JSON text. + + + + + Get or set how special floating point numbers, e.g. , + and , + are written to JSON text. + + + + + Get or set how and values are formatting when writing JSON text. + + + + + Gets or sets the culture used when writing JSON. Defaults to . + + + + + Creates an instance of the JsonWriter class. + + + + + Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream. + + + + + Closes this stream and the underlying stream. + + + + + Writes the beginning of a JSON object. + + + + + Writes the end of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the end of an array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end constructor. + + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes the end of the current JSON object or array. + + + + + Writes the current token and its children. + + The to read the token from. + + + + Writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + + + + Writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + A null value can be passed to the method for token's that don't have a value, e.g. . + + + + Writes the token. + + The to write. + + + + Writes the specified end token. + + The end token to write. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON without changing the writer's state. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes out a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes out the given white space. + + The string of white space characters. + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Sets the state of the JsonWriter, + + The JsonToken being written. + The value being written. + + + + Specifies the state of the . + + + + + An exception has been thrown, which has left the in an invalid state. + You may call the method to put the in the Closed state. + Any other method calls results in an being thrown. + + + + + The method has been called. + + + + + An object is being written. + + + + + A array is being written. + + + + + A constructor is being written. + + + + + A property is being written. + + + + + A write method has not been called. + + + + diff --git a/Assets/JsonDotNet/Assemblies/AOT/Newtonsoft.Json.XML.meta b/Assets/JsonDotNet/Assemblies/AOT/Newtonsoft.Json.XML.meta new file mode 100644 index 0000000..0e2097f --- /dev/null +++ b/Assets/JsonDotNet/Assemblies/AOT/Newtonsoft.Json.XML.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: aadad8ac54f29e44583510294ac5c312 +timeCreated: 1466788355 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/JsonDotNet/Assemblies/AOT/Newtonsoft.Json.dll b/Assets/JsonDotNet/Assemblies/AOT/Newtonsoft.Json.dll new file mode 100644 index 0000000..3d09325 Binary files /dev/null and b/Assets/JsonDotNet/Assemblies/AOT/Newtonsoft.Json.dll differ diff --git a/Assets/JsonDotNet/Assemblies/AOT/Newtonsoft.Json.dll.meta b/Assets/JsonDotNet/Assemblies/AOT/Newtonsoft.Json.dll.meta new file mode 100644 index 0000000..ea21e1f --- /dev/null +++ b/Assets/JsonDotNet/Assemblies/AOT/Newtonsoft.Json.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 6a3c684705042f345975d924f6983e36 +timeCreated: 1466788352 +licenseType: Store +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + platformData: + Android: + enabled: 1 + settings: + CPU: AnyCPU + Any: + enabled: 0 + settings: {} + Editor: + enabled: 0 + settings: + CPU: AnyCPU + DefaultValueInitialized: true + OS: AnyOS + Linux: + enabled: 0 + settings: + CPU: x86 + Linux64: + enabled: 0 + settings: + CPU: x86_64 + OSXIntel: + enabled: 0 + settings: + CPU: AnyCPU + OSXIntel64: + enabled: 0 + settings: + CPU: AnyCPU + SamsungTV: + enabled: 1 + settings: + STV_MODEL: STANDARD_13 + Tizen: + enabled: 1 + settings: {} + WebGL: + enabled: 1 + settings: {} + Win: + enabled: 0 + settings: + CPU: AnyCPU + Win64: + enabled: 0 + settings: + CPU: AnyCPU + WindowsStoreApps: + enabled: 1 + settings: + CPU: AnyCPU + DontProcess: False + PlaceholderPath: Assets/JsonDotNet/Assemblies/Standalone/Newtonsoft.Json.dll + SDK: AnySDK + ScriptingBackend: Il2Cpp + iOS: + enabled: 1 + settings: + CompileFlags: + FrameworkDependencies: + tvOS: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/JsonDotNet/Assemblies/Standalone.meta b/Assets/JsonDotNet/Assemblies/Standalone.meta new file mode 100644 index 0000000..242f110 --- /dev/null +++ b/Assets/JsonDotNet/Assemblies/Standalone.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 01ef782d02bb1994dbe418b69432552b +folderAsset: yes +timeCreated: 1466788344 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/JsonDotNet/Assemblies/Standalone/Newtonsoft.Json.XML b/Assets/JsonDotNet/Assemblies/Standalone/Newtonsoft.Json.XML new file mode 100644 index 0000000..4dbcd9e --- /dev/null +++ b/Assets/JsonDotNet/Assemblies/Standalone/Newtonsoft.Json.XML @@ -0,0 +1,8040 @@ + + + + Newtonsoft.Json + + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Gets or sets a value indicating whether binary data reading should compatible with incorrect Json.NET 3.5 written binary. + + + true if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, false. + + + + + Gets or sets a value indicating whether the root object will be read as a JSON array. + + + true if the root object will be read as a JSON array; otherwise, false. + + + + + Gets or sets the used when reading values from BSON. + + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The stream. + + + + Initializes a new instance of the class. + + The reader. + + + + Initializes a new instance of the class. + + The stream. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The reader. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Reads the next JSON token from the stream. + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Changes the to Closed. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets or sets the used when writing values to BSON. + When set to no conversion will occur. + + The used when writing values to BSON. + + + + Initializes a new instance of the class. + + The stream. + + + + Initializes a new instance of the class. + + The writer. + + + + Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream. + + + + + Writes the end. + + The token. + + + + Writes out a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes the beginning of a JSON array. + + + + + Writes the beginning of a JSON object. + + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Closes this stream and the underlying stream. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value that represents a BSON object id. + + The Object ID value to write. + + + + Writes a BSON regex. + + The regex pattern. + The regex options. + + + + Represents a BSON Oid (object id). + + + + + Gets or sets the value of the Oid. + + The value of the Oid. + + + + Initializes a new instance of the class. + + The Oid value. + + + + Converts a binary value to and from a base 64 string value. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Create a custom object + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Creates an object which will then be populated by the serializer. + + Type of the object. + The created object. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Provides a base class for converting a to and from JSON. + + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + + + + + + + + + + + + + + + + + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from its name string value. + + + + + Gets or sets a value indicating whether the written enum text should be camel case. + + true if the written enum text will be camel case; otherwise, false. + + + + Gets or sets a value indicating whether integer values are allowed. + + true if integers are allowed; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + true if the written enum text will be camel case; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Json Converter for Vector2, Vector3 and Vector4. Only serializes x, y, (z) and (w) properties. + + + + + Default Constructor - All Vector types enabled by default + + + + + Selectively enable Vector types + + Use for Vector2 objects + Use for Vector3 objects + Use for Vector4 objects + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Converts a to and from a string (e.g. "1.2.3.4"). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from the ISO 8601 date format (e.g. 2008-04-12T12:53Z). + + + + + Gets or sets the date time styles used when converting a date to and from JSON. + + The date time styles used when converting a date to and from JSON. + + + + Gets or sets the date time format used when converting a date to and from JSON. + + The date time format used when converting a date to and from JSON. + + + + Gets or sets the culture used when converting a date to and from JSON. + + The culture used when converting a date to and from JSON. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Converts a to and from a JavaScript date constructor (e.g. new Date(52231943)). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts XML to and from JSON. + + + + + Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produces multiple root elements. + + The name of the deserialize root element. + + + + Gets or sets a flag to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + true if the array attibute is written to the XML; otherwise, false. + + + + Gets or sets a value indicating whether to write the root JSON object. + + true if the JSON root object is omitted; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The calling serializer. + The value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Checks if the attributeName is a namespace attribute. + + Attribute name to test. + The attribute name prefix if it has one, otherwise an empty string. + True if attribute name is for a namespace attribute, otherwise false. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Specifies how constructors are used when initializing objects during deserialization by the . + + + + + First attempt to use the public default constructor, then fall back to single paramatized constructor, then the non-public default constructor. + + + + + Json.NET will use a non-public default constructor before falling back to a paramatized constructor. + + + + + Specifies how dates are formatted when writing JSON text. + + + + + Dates are written in the ISO 8601 format, e.g. "2012-03-21T05:40Z". + + + + + Dates are written in the Microsoft JSON format, e.g. "\/Date(1198908717056)\/". + + + + + Specifies how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON text. + + + + + Date formatted strings are not parsed to a date type and are read as strings. + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Specifies how to treat the time value when converting between string and . + + + + + Treat as local time. If the object represents a Coordinated Universal Time (UTC), it is converted to the local time. + + + + + Treat as a UTC. If the object represents a local time, it is converted to a UTC. + + + + + Treat as a local time if a is being converted to a string. + If a string is being converted to , convert to a local time if a time zone is specified. + + + + + Time zone information should be preserved when converting. + + + + + Specifies float format handling options when writing special floating point numbers, e.g. , + and with . + + + + + Write special floating point values as strings in JSON, e.g. "NaN", "Infinity", "-Infinity". + + + + + Write special floating point values as symbols in JSON, e.g. NaN, Infinity, -Infinity. + Note that this will produce non-valid JSON. + + + + + Write special floating point values as the property's default value in JSON, e.g. 0.0 for a property, null for a property. + + + + + Specifies how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Floating point numbers are parsed to . + + + + + Floating point numbers are parsed to . + + + + + Specifies formatting options for the . + + + + + No special formatting is applied. This is the default. + + + + + Causes child objects to be indented according to the and settings. + + + + + Provides an interface for using pooled arrays. + + The array type content. + + + + Rent a array from the pool. This array must be returned when it is no longer needed. + + The minimum required length of the array. The returned array may be longer. + The rented array from the pool. This array must be returned when it is no longer needed. + + + + Return an array to the pool. + + The array that is being returned. + + + + Instructs the to use the specified constructor when deserializing that object. + + + + + Instructs the how to serialize the collection. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Instructs the to deserialize properties with no matching class member into the specified collection + and write values during serialization. + + + + + Gets or sets a value that indicates whether to write extension data when serializing the object. + + + true to write extension data when serializing the object; otherwise, false. The default is true. + + + + + Gets or sets a value that indicates whether to read extension data when deserializing the object. + + + true to read extension data when deserializing the object; otherwise, false. The default is true. + + + + + Initializes a new instance of the class. + + + + + Instructs the to always serialize the member, and require the member has a value. + + + + + Specifies how JSON comments are handled when loading JSON. + + + + + Ignore comments. + + + + + Load comments as a with type . + + + + + Specifies how line information is handled when loading JSON. + + + + + Ignore line information. + + + + + Load line information. + + + + + Represents a view of a . + + + + + Initializes a new instance of the class. + + The name. + + + + When overridden in a derived class, returns whether resetting an object changes its value. + + + true if resetting the component changes its value; otherwise, false. + + The component to test for reset capability. + + + + + When overridden in a derived class, gets the current value of the property on a component. + + + The value of a property for a given component. + + The component with the property for which to retrieve the value. + + + + + When overridden in a derived class, resets the value for this property of the component to the default value. + + The component with the property value that is to be reset to the default value. + + + + + When overridden in a derived class, sets the value of the component to a different value. + + The component with the property value that is to be set. + The new value. + + + + + When overridden in a derived class, determines a value indicating whether the value of this property needs to be persisted. + + + true if the property should be persisted; otherwise, false. + + The component with the property to be examined for persistence. + + + + + When overridden in a derived class, gets the type of the component this property is bound to. + + + A that represents the type of component this property is bound to. When the or methods are invoked, the object specified might be an instance of this type. + + + + + When overridden in a derived class, gets a value indicating whether this property is read-only. + + + true if the property is read-only; otherwise, false. + + + + + When overridden in a derived class, gets the type of the property. + + + A that represents the type of the property. + + + + + Gets the hash code for the name of the member. + + + + The hash code for the name of the member. + + + + + Specifies the settings used when loading JSON. + + + + + Gets or sets how JSON comments are handled when loading JSON. + + The JSON comment handling. + + + + Gets or sets how JSON line info is handled when loading JSON. + + The JSON line info handling. + + + + Specifies the settings used when merging JSON. + + + + + Gets or sets the method used when merging JSON arrays. + + The method used when merging JSON arrays. + + + + Gets or sets how how null value properties are merged. + + How null value properties are merged. + + + + Specifies how JSON arrays are merged together. + + + + Concatenate arrays. + + + Union arrays, skipping items that already exist. + + + Replace all array items. + + + Merge array items together, matched by index. + + + + Specifies how null value properties are merged. + + + + + The content's null value properties will be ignored during merging. + + + + + The content's null value properties will be merged. + + + + + Represents a raw JSON string. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class. + + The raw json. + + + + Creates an instance of with the content of the reader's current token. + + The reader. + An instance of with the content of the reader's current token. + + + + Represents a collection of objects. + + The type of token + + + + Gets the with the specified key. + + + + + + Compares tokens to determine whether they are equal. + + + + + Determines whether the specified objects are equal. + + The first object of type to compare. + The second object of type to compare. + + true if the specified objects are equal; otherwise, false. + + + + + Returns a hash code for the specified object. + + The for which a hash code is to be returned. + A hash code for the specified object. + The type of is a reference type and is null. + + + + Contains the LINQ to JSON extension methods. + + + + + Returns a collection of tokens that contains the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the descendants of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, and the descendants of every token in the source collection. + + + + Returns a collection of child properties of every object in the source collection. + + An of that contains the source collection. + An of that contains the properties of every object in the source collection. + + + + Returns a collection of child values of every object in the source collection with the given key. + + An of that contains the source collection. + The token key. + An of that contains the values of every token in the source collection with the given key. + + + + Returns a collection of child values of every object in the source collection. + + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child values of every object in the source collection with the given key. + + The type to convert the values to. + An of that contains the source collection. + The token key. + An that contains the converted values of every token in the source collection with the given key. + + + + Returns a collection of converted child values of every object in the source collection. + + The type to convert the values to. + An of that contains the source collection. + An that contains the converted values of every token in the source collection. + + + + Converts the value. + + The type to convert the value to. + A cast as a of . + A converted value. + + + + Converts the value. + + The source collection type. + The type to convert the value to. + A cast as a of . + A converted value. + + + + Returns a collection of child tokens of every array in the source collection. + + The source collection type. + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child tokens of every array in the source collection. + + An of that contains the source collection. + The type to convert the values to. + The source collection type. + An that contains the converted values of every token in the source collection. + + + + Returns the input typed as . + + An of that contains the source collection. + The input typed as . + + + + Returns the input typed as . + + The source collection type. + An of that contains the source collection. + The input typed as . + + + + Represents a JSON constructor. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets or sets the name of this constructor. + + The constructor name. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name. + + The constructor name. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a token that can contain other tokens. + + + + + Occurs when the list changes or an item in the list changes. + + + + + Occurs before an item is added to the collection. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Get the first child token of this token. + + + A containing the first child token of the . + + + + + Get the last child token of this token. + + + A containing the last child token of the . + + + + + Returns a collection of the child tokens of this token, in document order. + + + An of containing the child tokens of this , in document order. + + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + + A containing the child values of this , in document order. + + + + + Returns a collection of the descendant tokens for this token in document order. + + An containing the descendant tokens of the . + + + + Returns a collection of the tokens that contain this token, and all descendant tokens of this token, in document order. + + An containing this token, and all the descendant tokens of the . + + + + Adds the specified content as children of this . + + The content to be added. + + + + Adds the specified content as the first children of this . + + The content to be added. + + + + Creates an that can be used to add tokens to the . + + An that is ready to have content written to it. + + + + Replaces the children nodes of this token with the specified content. + + The content. + + + + Removes the child nodes from this token. + + + + + Merge the specified content into this . + + The content to be merged. + + + + Merge the specified content into this using . + + The content to be merged. + The used to merge the content. + + + + Gets the count of child JSON tokens. + + The count of child JSON tokens + + + + Represents a collection of objects. + + The type of token + + + + An empty collection of objects. + + + + + Initializes a new instance of the struct. + + The enumerable. + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + + + + Gets the with the specified key. + + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Represents a JSON object. + + + + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Occurs when a property value changes. + + + + + Occurs when a property value is changing. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Gets the node type for this . + + The type. + + + + Gets an of this object's properties. + + An of this object's properties. + + + + Gets a the specified name. + + The property name. + A with the specified name or null. + + + + Gets an of this object's property values. + + An of this object's property values. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the with the specified property name. + + + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified property name. + + Name of the property. + The with the specified property name. + + + + Gets the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + One of the enumeration values that specifies how the strings will be compared. + The with the specified property name. + + + + Tries to get the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + The value. + One of the enumeration values that specifies how the strings will be compared. + true if a value was successfully retrieved; otherwise, false. + + + + Adds the specified property name. + + Name of the property. + The value. + + + + Removes the property with the specified name. + + Name of the property. + true if item was successfully removed; otherwise, false. + + + + Tries the get value. + + Name of the property. + The value. + true if a value was successfully retrieved; otherwise, false. + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Returns the properties for this instance of a component. + + + A that represents the properties for this component instance. + + + + + Returns the properties for this instance of a component using the attribute array as a filter. + + An array of type that is used as a filter. + + A that represents the filtered properties for this component instance. + + + + + Returns a collection of custom attributes for this instance of a component. + + + An containing the attributes for this object. + + + + + Returns the class name of this instance of a component. + + + The class name of the object, or null if the class does not have a name. + + + + + Returns the name of this instance of a component. + + + The name of the object, or null if the object does not have a name. + + + + + Returns a type converter for this instance of a component. + + + A that is the converter for this object, or null if there is no for this object. + + + + + Returns the default event for this instance of a component. + + + An that represents the default event for this object, or null if this object does not have events. + + + + + Returns the default property for this instance of a component. + + + A that represents the default property for this object, or null if this object does not have properties. + + + + + Returns an editor of the specified type for this instance of a component. + + A that represents the editor for this object. + + An of the specified type that is the editor for this object, or null if the editor cannot be found. + + + + + Returns the events for this instance of a component using the specified attribute array as a filter. + + An array of type that is used as a filter. + + An that represents the filtered events for this component instance. + + + + + Returns the events for this instance of a component. + + + An that represents the events for this component instance. + + + + + Returns an object that contains the property described by the specified property descriptor. + + A that represents the property whose owner is to be found. + + An that represents the owner of the specified property. + + + + + Represents a JSON array. + + + + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the at the specified index. + + + + + + Determines the index of a specific item in the . + + The object to locate in the . + + The index of if found in the list; otherwise, -1. + + + + + Inserts an item to the at the specified index. + + The zero-based index at which should be inserted. + The object to insert into the . + + is not a valid index in the . + The is read-only. + + + + Removes the item at the specified index. + + The zero-based index of the item to remove. + + is not a valid index in the . + The is read-only. + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + + + + Adds an item to the . + + The object to add to the . + The is read-only. + + + + Removes all items from the . + + The is read-only. + + + + Determines whether the contains a specific value. + + The object to locate in the . + + true if is found in the ; otherwise, false. + + + + + Copies to. + + The array. + Index of the array. + + + + Gets a value indicating whether the is read-only. + + true if the is read-only; otherwise, false. + + + + Removes the first occurrence of a specific object from the . + + The object to remove from the . + + true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + + The is read-only. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Gets the at the reader's current position. + + + + + Initializes a new instance of the class. + + The token to read from. + + + + Reads the next JSON token from the stream. + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Gets the path of the current JSON token. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets the at the writer's current position. + + + + + Gets the token being writen. + + The token being writen. + + + + Initializes a new instance of the class writing to the given . + + The container being written to. + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream. + + + + + Closes this stream and the underlying stream. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end. + + The token. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes out a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Represents an abstract JSON token. + + + + + Gets a comparer that can compare two tokens for value equality. + + A that can compare two nodes for value equality. + + + + Gets or sets the parent. + + The parent. + + + + Gets the root of this . + + The root of this . + + + + Gets the node type for this . + + The type. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Compares the values of two tokens, including the values of all descendant tokens. + + The first to compare. + The second to compare. + true if the tokens are equal; otherwise false. + + + + Gets the next sibling token of this node. + + The that contains the next sibling token. + + + + Gets the previous sibling token of this node. + + The that contains the previous sibling token. + + + + Gets the path of the JSON token. + + + + + Adds the specified content immediately after this token. + + A content object that contains simple content or a collection of content objects to be added after this token. + + + + Adds the specified content immediately before this token. + + A content object that contains simple content or a collection of content objects to be added before this token. + + + + Returns a collection of the ancestor tokens of this token. + + A collection of the ancestor tokens of this token. + + + + Returns a collection of tokens that contain this token, and the ancestors of this token. + + A collection of tokens that contain this token, and the ancestors of this token. + + + + Returns a collection of the sibling tokens after this token, in document order. + + A collection of the sibling tokens after this tokens, in document order. + + + + Returns a collection of the sibling tokens before this token, in document order. + + A collection of the sibling tokens before this token, in document order. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets the with the specified key converted to the specified type. + + The type to convert the token to. + The token key. + The converted token value. + + + + Get the first child token of this token. + + A containing the first child token of the . + + + + Get the last child token of this token. + + A containing the last child token of the . + + + + Returns a collection of the child tokens of this token, in document order. + + An of containing the child tokens of this , in document order. + + + + Returns a collection of the child tokens of this token, in document order, filtered by the specified type. + + The type to filter the child tokens on. + A containing the child tokens of this , in document order. + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + A containing the child values of this , in document order. + + + + Removes this token from its parent. + + + + + Replaces this token with the specified token. + + The value. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Returns the indented JSON for this token. + + + The indented JSON for this token. + + + + + Returns the JSON for this token using the given formatting and converters. + + Indicates how the output is formatted. + A collection of which will be used when writing the token. + The JSON for this token using the given formatting and converters. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to []. + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from [] to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Creates an for this token. + + An that can be used to read this token and its descendants. + + + + Creates a from an object. + + The object that will be used to create . + A with the value of the specified object + + + + Creates a from an object using the specified . + + The object that will be used to create . + The that will be used when reading the object. + A with the value of the specified object + + + + Creates the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates a from a . + + An positioned at the token to read into this . + + An that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + An that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + Creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + An that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + An positioned at the token to read into this . + + An that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Selects a using a JPath expression. Selects the token that matches the object path. + + + A that contains a JPath expression. + + A , or null. + + + + Selects a using a JPath expression. Selects the token that matches the object path. + + + A that contains a JPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + A . + + + + Selects a collection of elements using a JPath expression. + + + A that contains a JPath expression. + + An that contains the selected elements. + + + + Selects a collection of elements using a JPath expression. + + + A that contains a JPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + An that contains the selected elements. + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A new instance of the . + + + + Adds an object to the annotation list of this . + + The annotation to add. + + + + Get the first annotation object of the specified type from this . + + The type of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets the first annotation object of the specified type from this . + + The of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets a collection of annotations of the specified type for this . + + The type of the annotations to retrieve. + An that contains the annotations for this . + + + + Gets a collection of annotations of the specified type for this . + + The of the annotations to retrieve. + An of that contains the annotations that match the specified type for this . + + + + Removes the annotations of the specified type from this . + + The type of annotations to remove. + + + + Removes the annotations of the specified type from this . + + The of annotations to remove. + + + + Represents a JSON property. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the property name. + + The property name. + + + + Gets or sets the property value. + + The property value. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Specifies the type of token. + + + + + No token type has been set. + + + + + A JSON object. + + + + + A JSON array. + + + + + A JSON constructor. + + + + + A JSON object property. + + + + + A comment. + + + + + An integer value. + + + + + A float value. + + + + + A string value. + + + + + A boolean value. + + + + + A null value. + + + + + An undefined value. + + + + + A date value. + + + + + A raw JSON value. + + + + + A collection of bytes value. + + + + + A Guid value. + + + + + A Uri value. + + + + + A TimeSpan value. + + + + + Represents a value in JSON (string, integer, date, etc). + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Creates a comment with the given value. + + The value. + A comment with the given value. + + + + Creates a string with the given value. + + The value. + A string with the given value. + + + + Creates a null value. + + A null value. + + + + Creates a undefined value. + + A undefined value. + + + + Gets the node type for this . + + The type. + + + + Gets or sets the underlying token value. + + The underlying token value. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Indicates whether the current object is equal to another object of the same type. + + + true if the current object is equal to the parameter; otherwise, false. + + An object to compare with this object. + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + The parameter is null. + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format provider. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + The format provider. + + A that represents this instance. + + + + + Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. + + An object to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return value has these meanings: + Value + Meaning + Less than zero + This instance is less than . + Zero + This instance is equal to . + Greater than zero + This instance is greater than . + + + is not the same type as this instance. + + + + + Specifies metadata property handling options for the . + + + + + Read metadata properties located at the start of a JSON object. + + + + + Read metadata properties located anywhere in a JSON object. Note that this setting will impact performance. + + + + + Do not try to read metadata properties. + + + + + Represents a trace writer that writes to the application's instances. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of Info will exclude Verbose messages and include Info, + Warning and Error messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Provides methods to get attributes. + + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Represents a trace writer. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of Info will exclude Verbose messages and include Info, + Warning and Error messages. + + The that will be used to filter the trace messages passed to the writer. + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Contract details for a used by the . + + + + + Gets or sets the default collection items . + + The converter. + + + + Gets or sets a value indicating whether the collection items preserve object references. + + true if collection items preserve object references; otherwise, false. + + + + Gets or sets the collection item reference loop handling. + + The reference loop handling. + + + + Gets or sets the collection item type name handling. + + The type name handling. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Represents a trace writer that writes to memory. When the trace message limit is + reached then old trace messages will be removed as new messages are added. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of Info will exclude Verbose messages and include Info, + Warning and Error messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Initializes a new instance of the class. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Returns an enumeration of the most recent trace messages. + + An enumeration of the most recent trace messages. + + + + Returns a of the most recent trace messages. + + + A of the most recent trace messages. + + + + + Provides methods to get attributes from a , , or . + + + + + Initializes a new instance of the class. + + The instance to get attributes for. This parameter should be a , , or . + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Contract details for a used by the . + + + + + Gets or sets the ISerializable object constructor. + + The ISerializable object constructor. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides data for the Error event. + + + + + Gets the current object the error event is being raised against. + + The current object the error event is being raised against. + + + + Gets the error context. + + The error context. + + + + Initializes a new instance of the class. + + The current object. + The error context. + + + + Resolves member mappings for a type, camel casing property names. + + + + + Initializes a new instance of the class. + + + + + Resolves the name of the property. + + Name of the property. + The property name camel cased. + + + + Used by to resolves a for a given . + + + + + Gets a value indicating whether members are being get and set using dynamic code generation. + This value is determined by the runtime permissions available. + + + true if using dynamic code generation; otherwise, false. + + + + + Gets or sets the default members search flags. + + The default members search flags. + + + + Gets or sets a value indicating whether compiler generated members should be serialized. + + + true if serialized compiler generated members; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the interface when serializing and deserializing types. + + + true if the interface will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the attribute when serializing and deserializing types. + + + true if the attribute will be ignored when serializing and deserializing types; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + If set to true the will use a cached shared with other resolvers of the same type. + Sharing the cache will significantly improve performance with multiple resolver instances because expensive reflection will only + happen once. This setting can cause unexpected behavior if different instances of the resolver are suppose to produce different + results. When set to false it is highly recommended to reuse instances with the . + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Gets the serializable members for the type. + + The type to get serializable members for. + The serializable members for the type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates the constructor parameters. + + The constructor to create properties for. + The type's member properties. + Properties for the given . + + + + Creates a for the given . + + The matching member property. + The constructor parameter. + A created for the given . + + + + Resolves the default for the contract. + + Type of the object. + The contract's default . + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Determines which contract type is created for the given type. + + Type of the object. + A for the given type. + + + + Creates properties for the given . + + The type to create properties for. + /// The member serialization mode for the type. + Properties for the given . + + + + Creates the used by the serializer to get and set values from a member. + + The member. + The used by the serializer to get and set values from a member. + + + + Creates a for the given . + + The member's parent . + The member to create a for. + A created for the given . + + + + Resolves the name of the property. + + Name of the property. + Resolved name of the property. + + + + Resolves the key of the dictionary. By default is used to resolve dictionary keys. + + Key of the dictionary. + Resolved key of the dictionary. + + + + Gets the resolved name of the property. + + Name of the property. + Name of the property. + + + + The default serialization binder used when resolving and loading classes from type names. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + The type of the object the formatter creates a new instance of. + + + + + Provides information surrounding an error. + + + + + Gets the error. + + The error. + + + + Gets the original object that caused the error. + + The original object that caused the error. + + + + Gets the member that caused the error. + + The member that caused the error. + + + + Gets the path of the JSON location where the error occurred. + + The path of the JSON location where the error occurred. + + + + Gets or sets a value indicating whether this is handled. + + true if handled; otherwise, false. + + + + Used by to resolves a for a given . + + + + + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Provides methods to get and set values. + + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Contract details for a used by the . + + + + + Gets the of the collection items. + + The of the collection items. + + + + Gets a value indicating whether the collection type is a multidimensional array. + + true if the collection type is a multidimensional array; otherwise, false. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the collection values. + + true if the creator has a parameter with the collection values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Handles serialization callback events. + + The object that raised the callback event. + The streaming context. + + + + Handles serialization error callback events. + + The object that raised the callback event. + The streaming context. + The error context. + + + + Sets extension data for an object during deserialization. + + The object to set extension data on. + The extension data key. + The extension data value. + + + + Gets extension data for an object during serialization. + + The object to set extension data on. + + + + Contract details for a used by the . + + + + + Gets the underlying type for the contract. + + The underlying type for the contract. + + + + Gets or sets the type created during deserialization. + + The type created during deserialization. + + + + Gets or sets whether this type contract is serialized as a reference. + + Whether this type contract is serialized as a reference. + + + + Gets or sets the default for this contract. + + The converter. + + + + Gets or sets all methods called immediately after deserialization of the object. + + The methods called immediately after deserialization of the object. + + + + Gets or sets all methods called during deserialization of the object. + + The methods called during deserialization of the object. + + + + Gets or sets all methods called after serialization of the object graph. + + The methods called after serialization of the object graph. + + + + Gets or sets all methods called before serialization of the object. + + The methods called before serialization of the object. + + + + Gets or sets all method called when an error is thrown during the serialization of the object. + + The methods called when an error is thrown during the serialization of the object. + + + + Gets or sets the method called immediately after deserialization of the object. + + The method called immediately after deserialization of the object. + + + + Gets or sets the method called during deserialization of the object. + + The method called during deserialization of the object. + + + + Gets or sets the method called after serialization of the object graph. + + The method called after serialization of the object graph. + + + + Gets or sets the method called before serialization of the object. + + The method called before serialization of the object. + + + + Gets or sets the method called when an error is thrown during the serialization of the object. + + The method called when an error is thrown during the serialization of the object. + + + + Gets or sets the default creator method used to create the object. + + The default creator method used to create the object. + + + + Gets or sets a value indicating whether the default creator is non public. + + true if the default object creator is non-public; otherwise, false. + + + + Contract details for a used by the . + + + + + Gets or sets the property name resolver. + + The property name resolver. + + + + Gets or sets the dictionary key resolver. + + The dictionary key resolver. + + + + Gets the of the dictionary keys. + + The of the dictionary keys. + + + + Gets the of the dictionary values. + + The of the dictionary values. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the dictionary values. + + true if the creator has a parameter with the dictionary values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Maps a JSON property to a .NET member or constructor parameter. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the type that declared this property. + + The type that declared this property. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets the name of the underlying member or parameter. + + The name of the underlying member or parameter. + + + + Gets the that will get and set the during serialization. + + The that will get and set the during serialization. + + + + Gets or sets the for this property. + + The for this property. + + + + Gets or sets the type of the property. + + The type of the property. + + + + Gets or sets the for the property. + If set this converter takes presidence over the contract converter for the property type. + + The converter. + + + + Gets or sets the member converter. + + The member converter. + + + + Gets or sets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets or sets a value indicating whether this is readable. + + true if readable; otherwise, false. + + + + Gets or sets a value indicating whether this is writable. + + true if writable; otherwise, false. + + + + Gets or sets a value indicating whether this has a member attribute. + + true if has a member attribute; otherwise, false. + + + + Gets the default value. + + The default value. + + + + Gets or sets a value indicating whether this is required. + + A value indicating whether this is required. + + + + Gets or sets a value indicating whether this property preserves object references. + + + true if this instance is reference; otherwise, false. + + + + + Gets or sets the property null value handling. + + The null value handling. + + + + Gets or sets the property default value handling. + + The default value handling. + + + + Gets or sets the property reference loop handling. + + The reference loop handling. + + + + Gets or sets the property object creation handling. + + The object creation handling. + + + + Gets or sets or sets the type name handling. + + The type name handling. + + + + Gets or sets a predicate used to determine whether the property should be serialize. + + A predicate used to determine whether the property should be serialize. + + + + Gets or sets a predicate used to determine whether the property should be deserialized. + + A predicate used to determine whether the property should be deserialized. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets an action used to set whether the property has been deserialized. + + An action used to set whether the property has been deserialized. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Gets or sets the converter used when serializing the property's collection items. + + The collection's items converter. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Gets or sets the the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets the the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + A collection of objects. + + + + + Initializes a new instance of the class. + + The type. + + + + When implemented in a derived class, extracts the key from the specified element. + + The element from which to extract the key. + The key for the specified element. + + + + Adds a object. + + The property to add to the collection. + + + + Gets the closest matching object. + First attempts to get an exact case match of propertyName and then + a case insensitive match. + + Name of the property. + A matching property if found. + + + + Gets a property by property name. + + The name of the property to get. + Type property name string comparison. + A matching property if found. + + + + Used to resolve references when serializing and deserializing JSON by the . + + + + + Resolves a reference to its object. + + The serialization context. + The reference to resolve. + The object that + + + + Gets the reference for the sepecified object. + + The serialization context. + The object to get a reference for. + The reference to the object. + + + + Determines whether the specified object is referenced. + + The serialization context. + The object to test for a reference. + + true if the specified object is referenced; otherwise, false. + + + + + Adds a reference to the specified object. + + The serialization context. + The reference. + The object to reference. + + + + Contract details for a used by the . + + + + + Gets or sets the object member serialization. + + The member object serialization. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Gets the object's properties. + + The object's properties. + + + + Gets the constructor parameters required for any non-default constructor + + + + + Gets a collection of instances that define the parameters used with . + + + + + Gets or sets the override constructor used to create the object. + This is set when a constructor is marked up using the + JsonConstructor attribute. + + The override constructor. + + + + Gets or sets the parametrized constructor used to create the object. + + The parametrized constructor. + + + + Gets or sets the function used to create the object. When set this function will override . + This function is called with a collection of arguments which are defined by the collection. + + The function used to create the object. + + + + Gets or sets the extension data setter. + + + + + Gets or sets the extension data getter. + + + + + Gets or sets the extension data value type. + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Lookup and create an instance of the JsonConverter type described by the argument. + + The JsonConverter type to create. + Optional arguments to pass to an initializing constructor of the JsonConverter. + If null, the default constructor is used. + + + + Create a factory function that can be used to create instances of a JsonConverter described by the + argument type. The returned function can then be used to either invoke the converter's default ctor, or any + parameterized constructors by way of an object array. + + + + + Get and set values for a using reflection. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + When applied to a method, specifies that the method is called when an error occurs serializing an object. + + + + + Represents a method that constructs an object. + + The object type to create. + + + + Specifies how strings are escaped when writing JSON text. + + + + + Only control characters (e.g. newline) are escaped. + + + + + All non-ASCII and control characters (e.g. newline) are escaped. + + + + + HTML (<, >, &, ', ") and control characters (e.g. newline) are escaped. + + + + + Converts the value to the specified type. If the value is unable to be converted, the + value is checked whether it assignable to the specified type. + + The value to convert. + The culture to use when converting. + The type to convert or cast the value to. + + The converted type. If conversion was unsuccessful, the initial value + is returned if assignable to the target type. + + + + + Gets a dictionary of the names and values of an Enum type. + + + + + + Gets a dictionary of the names and values of an Enum type. + + The enum type to get names and values for. + + + + + Builds a string. Unlike StringBuilder this class lets you reuse it's internal buffer. + + + + + Determines whether the collection is null or empty. + + The collection. + + true if the collection is null or empty; otherwise, false. + + + + + Adds the elements of the specified collection to the specified generic IList. + + The list to add to. + The collection of elements to add. + + + + Gets the type of the typed collection's items. + + The type. + The type of the typed collection's items. + + + + Gets the member's underlying type. + + The member. + The underlying type of the member. + + + + Determines whether the member is an indexed property. + + The member. + + true if the member is an indexed property; otherwise, false. + + + + + Determines whether the property is an indexed property. + + The property. + + true if the property is an indexed property; otherwise, false. + + + + + Gets the member's value on the object. + + The member. + The target object. + The member's value on the object. + + + + Sets the member's value on the target object. + + The member. + The target. + The value. + + + + Determines whether the specified MemberInfo can be read. + + The MemberInfo to determine whether can be read. + /// if set to true then allow the member to be gotten non-publicly. + + true if the specified MemberInfo can be read; otherwise, false. + + + + + Determines whether the specified MemberInfo can be set. + + The MemberInfo to determine whether can be set. + if set to true then allow the member to be set non-publicly. + if set to true then allow the member to be set if read-only. + + true if the specified MemberInfo can be set; otherwise, false. + + + + + Determines whether the string is all white space. Empty string will return false. + + The string to test whether it is all white space. + + true if the string is all white space; otherwise, false. + + + + + Nulls an empty string. + + The string. + Null if the string was null, otherwise the string unchanged. + + + + Indicating whether a property is required. + + + + + The property is not required. The default state. + + + + + The property must be defined in JSON but can be a null value. + + + + + The property must be defined in JSON and cannot be a null value. + + + + + The property is not required but it cannot be a null value. + + + + + Specifies reference handling options for the . + Note that references cannot be preserved when a value is set via a non-default constructor such as types that implement ISerializable. + + + + + + + + Do not preserve references when serializing types. + + + + + Preserve references when serializing into a JSON object structure. + + + + + Preserve references when serializing into a JSON array structure. + + + + + Preserve references when serializing. + + + + + Provides an interface to enable a class to return line and position information. + + + + + Gets a value indicating whether the class can return line information. + + + true if LineNumber and LinePosition can be provided; otherwise, false. + + + + + Gets the current line number. + + The current line number or 0 if no line information is available (for example, HasLineInfo returns false). + + + + Gets the current line position. + + The current line position or 0 if no line information is available (for example, HasLineInfo returns false). + + + + Instructs the how to serialize the collection. + + + + + Gets or sets a value indicating whether null items are allowed in the collection. + + true if null items are allowed in the collection; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a flag indicating whether the array can contain null items + + A flag indicating whether the array can contain null items. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the how to serialize the object. + + + + + Gets or sets the id. + + The id. + + + + Gets or sets the title. + + The title. + + + + Gets or sets the description. + + The description. + + + + Gets the collection's items converter. + + The collection's items converter. + + + + The parameter list to use when constructing the JsonConverter described by ItemConverterType. + If null, the default constructor is used. + When non-null, there must be a constructor defined in the JsonConverter that exactly matches the number, + order, and type of these parameters. + + + [JsonContainer(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + Gets or sets a value that indicates whether to preserve object references. + + + true to keep object reference; otherwise, false. The default is false. + + + + + Gets or sets a value that indicates whether to preserve collection's items references. + + + true to keep collection's items object references; otherwise, false. The default is false. + + + + + Gets or sets the reference loop handling used when serializing the collection's items. + + The reference loop handling. + + + + Gets or sets the type name handling used when serializing the collection's items. + + The type name handling. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Specifies default value handling options for the . + + + + + + + + + Include members where the member value is the same as the member's default value when serializing objects. + Included members are written to JSON. Has no effect when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + so that is is not written to JSON. + This option will ignore all default values (e.g. null for objects and nullable types; 0 for integers, + decimals and floating point numbers; and false for booleans). The default value ignored can be changed by + placing the on the property. + + + + + Members with a default value but no JSON will be set to their default value when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + and sets members to their default value when deserializing. + + + + + Instructs the to use the specified when serializing the member or class. + + + + + Gets the of the converter. + + The of the converter. + + + + The parameter list to use when constructing the JsonConverter described by ConverterType. + If null, the default constructor is used. + + + + + Initializes a new instance of the class. + + Type of the converter. + + + + Initializes a new instance of the class. + + Type of the converter. + Parameter list to use when constructing the JsonConverter. Can be null. + + + + Instructs the how to serialize the object. + + + + + Gets or sets the member serialization. + + The member serialization. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified member serialization. + + The member serialization. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Specifies the settings on a object. + + + + + Gets or sets how reference loops (e.g. a class referencing itself) is handled. + + Reference loop handling. + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + + Missing member handling. + + + + Gets or sets how objects are created during deserialization. + + The object creation handling. + + + + Gets or sets how null values are handled during serialization and deserialization. + + Null value handling. + + + + Gets or sets how null default are handled during serialization and deserialization. + + The default value handling. + + + + Gets or sets a collection that will be used during serialization. + + The converters. + + + + Gets or sets how object references are preserved by the serializer. + + The preserve references handling. + + + + Gets or sets how type name writing and reading is handled by the serializer. + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than TypeNameHandling.None. + + The type name handling. + + + + Gets or sets how metadata properties are used during deserialization. + + The metadata properties handling. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + + The type name assembly format. + + + + Gets or sets how constructors are used during deserialization. + + The constructor handling. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + The contract resolver. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets the used by the serializer when resolving references. + + The reference resolver. + + + + Gets or sets a function that creates the used by the serializer when resolving references. + + A function that creates the used by the serializer when resolving references. + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the error handler called during serialization and deserialization. + + The error handler called during serialization and deserialization. + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Get or set how and values are formatted when writing JSON text, and the expected date format when reading JSON text. + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + + + + + Indicates how JSON text output is formatted. + + + + + Get or set how dates are written to JSON text. + + + + + Get or set how time zones are handling during serialization and deserialization. + + + + + Get or set how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Get or set how special floating point numbers, e.g. , + and , + are written as JSON. + + + + + Get or set how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Get or set how strings are escaped when writing JSON text. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Gets a value indicating whether there will be a check for additional content after deserializing an object. + + + true if there will be a check for additional content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Specifies the member serialization options for the . + + + + + All public members are serialized by default. Members can be excluded using or . + This is the default member serialization mode. + + + + + Only members marked with or are serialized. + This member serialization mode can also be set by marking the class with . + + + + + All public and private fields are serialized. Members can be excluded using or . + This member serialization mode can also be set by marking the class with + and setting IgnoreSerializableAttribute on to false. + + + + + Specifies how object creation is handled by the . + + + + + Reuse existing objects, create new objects when needed. + + + + + Only reuse existing objects. + + + + + Always create new objects. + + + + + Represents a reader that provides fast, non-cached, forward-only access to JSON text data. + + + + + Initializes a new instance of the class with the specified . + + The TextReader containing the XML data to read. + + + + Gets or sets the reader's character buffer pool. + + + + + Reads the next JSON token from the stream. + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a []. + + A [] or a null reference if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Changes the state to closed. + + + + + Gets a value indicating whether the class can return line information. + + + true if LineNumber and LinePosition can be provided; otherwise, false. + + + + + Gets the current line number. + + + The current line number or 0 if no line information is available (for example, HasLineInfo returns false). + + + + + Gets the current line position. + + + The current line position or 0 if no line information is available (for example, HasLineInfo returns false). + + + + + Instructs the to always serialize the member with the specified name. + + + + + Gets or sets the converter used when serializing the property's collection items. + + The collection's items converter. + + + + The parameter list to use when constructing the JsonConverter described by ItemConverterType. + If null, the default constructor is used. + When non-null, there must be a constructor defined in the JsonConverter that exactly matches the number, + order, and type of these parameters. + + + [JsonProperty(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + Gets or sets the null value handling used when serializing this property. + + The null value handling. + + + + Gets or sets the default value handling used when serializing this property. + + The default value handling. + + + + Gets or sets the reference loop handling used when serializing this property. + + The reference loop handling. + + + + Gets or sets the object creation handling used when deserializing this property. + + The object creation handling. + + + + Gets or sets the type name handling used when serializing this property. + + The type name handling. + + + + Gets or sets whether this property's value is serialized as a reference. + + Whether this property's value is serialized as a reference. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets a value indicating whether this property is required. + + + A value indicating whether this property is required. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + Gets or sets the the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified name. + + Name of the property. + + + + Instructs the not to serialize the public field or public read/write property value. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets or sets the writer's character array pool. + + + + + Gets or sets how many IndentChars to write for each level in the hierarchy when is set to Formatting.Indented. + + + + + Gets or sets which character to use to quote attribute values. + + + + + Gets or sets which character to use for indenting when is set to Formatting.Indented. + + + + + Gets or sets a value indicating whether object names will be surrounded with quotes. + + + + + Creates an instance of the JsonWriter class using the specified . + + The TextWriter to write to. + + + + Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream. + + + + + Closes this stream and the underlying stream. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the specified end token. + + The end token to write. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes out a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes out the given white space. + + The string of white space characters. + + + + The exception thrown when an error occurs while reading JSON text. + + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + The exception thrown when an error occurs while reading JSON text. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Converts an object to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can read JSON. + + true if this can read JSON; otherwise, false. + + + + Gets a value indicating whether this can write JSON. + + true if this can write JSON; otherwise, false. + + + + Represents a collection of . + + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Specifies the state of the reader. + + + + + The Read method has not been called. + + + + + The end of the file has been reached successfully. + + + + + Reader is at a property. + + + + + Reader is at the start of an object. + + + + + Reader is in an object. + + + + + Reader is at the start of an array. + + + + + Reader is in an array. + + + + + The Close method has been called. + + + + + Reader has just read a value. + + + + + Reader is at the start of a constructor. + + + + + Reader in a constructor. + + + + + An error occurred that prevents the read operation from continuing. + + + + + The end of the file has been reached successfully. + + + + + Gets the current reader state. + + The current reader state. + + + + Gets or sets a value indicating whether the underlying stream or + should be closed when the reader is closed. + + + true to close the underlying stream or when + the reader is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether multiple pieces of JSON content can + be read from a continuous stream without erroring. + + + true to support reading multiple pieces of JSON content; otherwise false. The default is false. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + Get or set how time zones are handling when reading JSON. + + + + + Get or set how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Get or set how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Get or set how custom date formatted strings are parsed when reading JSON. + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + + + + + Gets the type of the current JSON token. + + + + + Gets the text value of the current JSON token. + + + + + Gets The Common Language Runtime (CLR) type for the current JSON token. + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Initializes a new instance of the class with the specified . + + + + + Reads the next JSON token from the stream. + + true if the next token was read successfully; false if there are no more tokens to read. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a []. + + A [] or a null reference if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Skips the children of the current token. + + + + + Sets the current token. + + The new token. + + + + Sets the current token and value. + + The new token. + The value. + + + + Sets the state based on current token type. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Changes the to Closed. + + + + + Provides methods for converting between common language runtime types and JSON types. + + + + + + + + Gets or sets a function that creates default . + Default settings are automatically used by serialization methods on , + and and on . + To serialize without using any default settings create a with + . + + + + + Represents JavaScript's boolean value true as a string. This field is read-only. + + + + + Represents JavaScript's boolean value false as a string. This field is read-only. + + + + + Represents JavaScript's null as a string. This field is read-only. + + + + + Represents JavaScript's undefined as a string. This field is read-only. + + + + + Represents JavaScript's positive infinity as a string. This field is read-only. + + + + + Represents JavaScript's negative infinity as a string. This field is read-only. + + + + + Represents JavaScript's NaN as a string. This field is read-only. + + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + The time zone handling when the date is converted to a string. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + The string escape handling. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Serializes the specified object to a JSON string. + + The object to serialize. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting. + + The object to serialize. + Indicates how the output is formatted. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a collection of . + + The object to serialize. + A collection converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting and a collection of . + + The object to serialize. + Indicates how the output is formatted. + A collection converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifing the type is optional. + + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using formatting and . + + The object to serialize. + Indicates how the output is formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + Indicates how the output is formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifing the type is optional. + + + A JSON string representation of the object. + + + + + Deserializes the JSON to a .NET object. + + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to a .NET object using . + + The JSON to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The JSON to deserialize. + The of object being deserialized. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The type of the object to deserialize to. + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the given anonymous type. + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be infered from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the given anonymous type using . + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be infered from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The type of the object to deserialize to. + The JSON to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The type of the object to deserialize to. + The object to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The JSON to deserialize. + The type of the object to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The JSON to deserialize. + The type of the object to deserialize to. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Populates the object with values from the JSON string. + + The JSON to populate values from. + The target object to populate values onto. + + + + Populates the object with values from the JSON string using . + + The JSON to populate values from. + The target object to populate values onto. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + + + + Serializes the XML node to a JSON string. + + The node to serialize. + A JSON string of the XmlNode. + + + + Serializes the XML node to a JSON string using formatting. + + The node to serialize. + Indicates how the output is formatted. + A JSON string of the XmlNode. + + + + Serializes the XML node to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output is formatted. + Omits writing the root object. + A JSON string of the XmlNode. + + + + Deserializes the XmlNode from a JSON string. + + The JSON string. + The deserialized XmlNode + + + + Deserializes the XmlNode from a JSON string nested in a root elment specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized XmlNode + + + + Deserializes the XmlNode from a JSON string nested in a root elment specified by + and writes a .NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A flag to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized XmlNode + + + + Serializes the to a JSON string. + + The node to convert to JSON. + A JSON string of the XNode. + + + + Serializes the to a JSON string using formatting. + + The node to convert to JSON. + Indicates how the output is formatted. + A JSON string of the XNode. + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output is formatted. + Omits writing the root object. + A JSON string of the XNode. + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized XNode + + + + Deserializes the from a JSON string nested in a root elment specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized XNode + + + + Deserializes the from a JSON string nested in a root elment specified by + and writes a .NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A flag to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized XNode + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Serializes and deserializes objects into and from the JSON format. + The enables you to control how objects are encoded into JSON. + + + + + Occurs when the errors during serialization and deserialization. + + + + + Gets or sets the used by the serializer when resolving references. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets how type name writing and reading is handled by the serializer. + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than TypeNameHandling.None. + + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + + The type name assembly format. + + + + Gets or sets how object references are preserved by the serializer. + + + + + Get or set how reference loops (e.g. a class referencing itself) is handled. + + + + + Get or set how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + + + + + Get or set how null values are handled during serialization and deserialization. + + + + + Get or set how null default are handled during serialization and deserialization. + + + + + Gets or sets how objects are created during deserialization. + + The object creation handling. + + + + Gets or sets how constructors are used during deserialization. + + The constructor handling. + + + + Gets or sets how metadata properties are used during deserialization. + + The metadata properties handling. + + + + Gets a collection that will be used during serialization. + + Collection that will be used during serialization. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Indicates how JSON text output is formatted. + + + + + Get or set how dates are written to JSON text. + + + + + Get or set how time zones are handling during serialization and deserialization. + + + + + Get or set how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Get or set how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Get or set how special floating point numbers, e.g. , + and , + are written as JSON text. + + + + + Get or set how strings are escaped when writing JSON text. + + + + + Get or set how and values are formatted when writing JSON text, and the expected date format when reading JSON text. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + + + + + Gets a value indicating whether there will be a check for additional JSON content after deserializing an object. + + + true if there will be a check for additional JSON content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Creates a new instance. + The will not use default settings + from . + + + A new instance. + The will not use default settings + from . + + + + + Creates a new instance using the specified . + The will not use default settings + from . + + The settings to be applied to the . + + A new instance using the specified . + The will not use default settings + from . + + + + + Creates a new instance. + The will use default settings + from . + + + A new instance. + The will use default settings + from . + + + + + Creates a new instance using the specified . + The will use default settings + from as well as the specified . + + The settings to be applied to the . + + A new instance using the specified . + The will use default settings + from as well as the specified . + + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to reader values from. + The target object to populate values onto. + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to reader values from. + The target object to populate values onto. + + + + Deserializes the JSON structure contained by the specified . + + The that contains the JSON structure to deserialize. + The being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The type of the object to deserialize. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Serializes the specified and writes the JSON structure + to a Stream using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Serializes the specified and writes the JSON structure + to a Stream using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifing the type is optional. + + + + + Serializes the specified and writes the JSON structure + to a Stream using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifing the type is optional. + + + + + Serializes the specified and writes the JSON structure + to a Stream using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Specifies missing member handling options for the . + + + + + Ignore a missing member and do not attempt to deserialize it. + + + + + Throw a when a missing member is encountered during deserialization. + + + + + Specifies null value handling options for the . + + + + + + + + + Include null values when serializing and deserializing objects. + + + + + Ignore null values when serializing and deserializing objects. + + + + + Specifies reference loop handling options for the . + + + + + Throw a when a loop is encountered. + + + + + Ignore loop references and do not serialize. + + + + + Serialize loop references. + + + + + Specifies type name handling options for the . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than TypeNameHandling.None. + + + + + Do not include the .NET type name when serializing types. + + + + + Include the .NET type name when serializing into a JSON object structure. + + + + + Include the .NET type name when serializing into a JSON array structure. + + + + + Always include the .NET type name when serializing. + + + + + Include the .NET type name when the type of the object being serialized is not the same as its declared type. + + + + + Specifies the type of JSON token. + + + + + This is returned by the if a method has not been called. + + + + + An object start token. + + + + + An array start token. + + + + + A constructor start token. + + + + + An object property name. + + + + + A comment. + + + + + Raw JSON. + + + + + An integer. + + + + + A float. + + + + + A string. + + + + + A boolean. + + + + + A null token. + + + + + An undefined token. + + + + + An object end token. + + + + + An array end token. + + + + + A constructor end token. + + + + + A Date. + + + + + Byte data. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets or sets a value indicating whether the underlying stream or + should be closed when the writer is closed. + + + true to close the underlying stream or when + the writer is closed; otherwise false. The default is true. + + + + + Gets the top. + + The top. + + + + Gets the state of the writer. + + + + + Gets the path of the writer. + + + + + Indicates how JSON text output is formatted. + + + + + Get or set how dates are written to JSON text. + + + + + Get or set how time zones are handling when writing JSON text. + + + + + Get or set how strings are escaped when writing JSON text. + + + + + Get or set how special floating point numbers, e.g. , + and , + are written to JSON text. + + + + + Get or set how and values are formatting when writing JSON text. + + + + + Gets or sets the culture used when writing JSON. Defaults to . + + + + + Creates an instance of the JsonWriter class. + + + + + Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream. + + + + + Closes this stream and the underlying stream. + + + + + Writes the beginning of a JSON object. + + + + + Writes the end of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the end of an array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end constructor. + + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes the end of the current JSON object or array. + + + + + Writes the current token and its children. + + The to read the token from. + + + + Writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + + + + Writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + A null value can be passed to the method for token's that don't have a value, e.g. . + + + + Writes the token. + + The to write. + + + + Writes the specified end token. + + The end token to write. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON without changing the writer's state. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes out a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes out the given white space. + + The string of white space characters. + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Sets the state of the JsonWriter, + + The JsonToken being written. + The value being written. + + + + Specifies the state of the . + + + + + An exception has been thrown, which has left the in an invalid state. + You may call the method to put the in the Closed state. + Any other method calls results in an being thrown. + + + + + The method has been called. + + + + + An object is being written. + + + + + A array is being written. + + + + + A constructor is being written. + + + + + A property is being written. + + + + + A write method has not been called. + + + + diff --git a/Assets/JsonDotNet/Assemblies/Standalone/Newtonsoft.Json.XML.meta b/Assets/JsonDotNet/Assemblies/Standalone/Newtonsoft.Json.XML.meta new file mode 100644 index 0000000..7623f10 --- /dev/null +++ b/Assets/JsonDotNet/Assemblies/Standalone/Newtonsoft.Json.XML.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d6807fedb8dcaf04682d2c84f0ab753f +timeCreated: 1466788355 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/JsonDotNet/Assemblies/Standalone/Newtonsoft.Json.dll b/Assets/JsonDotNet/Assemblies/Standalone/Newtonsoft.Json.dll new file mode 100644 index 0000000..cea08b2 Binary files /dev/null and b/Assets/JsonDotNet/Assemblies/Standalone/Newtonsoft.Json.dll differ diff --git a/Assets/JsonDotNet/Assemblies/Standalone/Newtonsoft.Json.dll.meta b/Assets/JsonDotNet/Assemblies/Standalone/Newtonsoft.Json.dll.meta new file mode 100644 index 0000000..e130150 --- /dev/null +++ b/Assets/JsonDotNet/Assemblies/Standalone/Newtonsoft.Json.dll.meta @@ -0,0 +1,75 @@ +fileFormatVersion: 2 +guid: 17aef65a15b471f468b5fbeb4ff0c6a1 +timeCreated: 1466788349 +licenseType: Store +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + platformData: + Android: + enabled: 0 + settings: + CPU: AnyCPU + Any: + enabled: 0 + settings: {} + Editor: + enabled: 1 + settings: + CPU: AnyCPU + DefaultValueInitialized: true + OS: AnyOS + Linux: + enabled: 1 + settings: + CPU: x86 + Linux64: + enabled: 1 + settings: + CPU: x86_64 + LinuxUniversal: + enabled: 1 + settings: + CPU: AnyCPU + OSXIntel: + enabled: 1 + settings: + CPU: AnyCPU + OSXIntel64: + enabled: 1 + settings: + CPU: AnyCPU + OSXUniversal: + enabled: 1 + settings: + CPU: AnyCPU + SamsungTV: + enabled: 0 + settings: + STV_MODEL: STANDARD_13 + Win: + enabled: 1 + settings: + CPU: AnyCPU + Win64: + enabled: 1 + settings: + CPU: AnyCPU + WindowsStoreApps: + enabled: 0 + settings: + CPU: AnyCPU + DontProcess: False + PlaceholderPath: + SDK: AnySDK + ScriptingBackend: Il2Cpp + iOS: + enabled: 0 + settings: + CompileFlags: + FrameworkDependencies: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/JsonDotNet/Assemblies/Windows.meta b/Assets/JsonDotNet/Assemblies/Windows.meta new file mode 100644 index 0000000..0c47db5 --- /dev/null +++ b/Assets/JsonDotNet/Assemblies/Windows.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 1418141139a6ac443b18cb05c0643a29 +folderAsset: yes +timeCreated: 1466788345 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/JsonDotNet/Assemblies/Windows/Newtonsoft.Json.XML b/Assets/JsonDotNet/Assemblies/Windows/Newtonsoft.Json.XML new file mode 100644 index 0000000..ed0eec5 --- /dev/null +++ b/Assets/JsonDotNet/Assemblies/Windows/Newtonsoft.Json.XML @@ -0,0 +1,7977 @@ + + + + Newtonsoft.Json + + + + + Represents a BSON Oid (object id). + + + + + Gets or sets the value of the Oid. + + The value of the Oid. + + + + Initializes a new instance of the class. + + The Oid value. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Gets or sets a value indicating whether binary data reading should compatible with incorrect Json.NET 3.5 written binary. + + + true if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, false. + + + + + Gets or sets a value indicating whether the root object will be read as a JSON array. + + + true if the root object will be read as a JSON array; otherwise, false. + + + + + Gets or sets the used when reading values from BSON. + + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The stream. + + + + Initializes a new instance of the class. + + The reader. + + + + Initializes a new instance of the class. + + The stream. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The reader. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Reads the next JSON token from the stream. + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Changes the to Closed. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets or sets the used when writing values to BSON. + When set to no conversion will occur. + + The used when writing values to BSON. + + + + Initializes a new instance of the class. + + The stream. + + + + Initializes a new instance of the class. + + The writer. + + + + Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream. + + + + + Writes the end. + + The token. + + + + Writes out a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes the beginning of a JSON array. + + + + + Writes the beginning of a JSON object. + + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Closes this stream and the underlying stream. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value that represents a BSON object id. + + The Object ID value to write. + + + + Writes a BSON regex. + + The regex pattern. + The regex options. + + + + Specifies how constructors are used when initializing objects during deserialization by the . + + + + + First attempt to use the public default constructor, then fall back to single paramatized constructor, then the non-public default constructor. + + + + + Json.NET will use a non-public default constructor before falling back to a paramatized constructor. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Create a custom object + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Creates an object which will then be populated by the serializer. + + Type of the object. + The created object. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Provides a base class for converting a to and from JSON. + + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a F# discriminated union type to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + + + + + + + + + + + + + + Converts an ExpandoObject to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + + + + + + + + Converts a to and from the ISO 8601 date format (e.g. 2008-04-12T12:53Z). + + + + + Gets or sets the date time styles used when converting a date to and from JSON. + + The date time styles used when converting a date to and from JSON. + + + + Gets or sets the date time format used when converting a date to and from JSON. + + The date time format used when converting a date to and from JSON. + + + + Gets or sets the culture used when converting a date to and from JSON. + + The culture used when converting a date to and from JSON. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Converts a to and from a JavaScript date constructor (e.g. new Date(52231943)). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from its name string value. + + + + + Gets or sets a value indicating whether the written enum text should be camel case. + + true if the written enum text will be camel case; otherwise, false. + + + + Gets or sets a value indicating whether integer values are allowed. + + true if integers are allowed; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + true if the written enum text will be camel case; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Json Converter for Vector2, Vector3 and Vector4. Only serializes x, y, (z) and (w) properties. + + + + + Default Constructor - All Vector types enabled by default + + + + + Selectively enable Vector types + + Use for Vector2 objects + Use for Vector3 objects + Use for Vector4 objects + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Converts a to and from a string (e.g. "1.2.3.4"). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts XML to and from JSON. + + + + + Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produces multiple root elements. + + The name of the deserialize root element. + + + + Gets or sets a flag to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + true if the array attibute is written to the XML; otherwise, false. + + + + Gets or sets a value indicating whether to write the root JSON object. + + true if the JSON root object is omitted; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The calling serializer. + The value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Checks if the attributeName is a namespace attribute. + + Attribute name to test. + The attribute name prefix if it has one, otherwise an empty string. + True if attribute name is for a namespace attribute, otherwise false. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Specifies how dates are formatted when writing JSON text. + + + + + Dates are written in the ISO 8601 format, e.g. "2012-03-21T05:40Z". + + + + + Dates are written in the Microsoft JSON format, e.g. "\/Date(1198908717056)\/". + + + + + Specifies how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON text. + + + + + Date formatted strings are not parsed to a date type and are read as strings. + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Specifies how to treat the time value when converting between string and . + + + + + Treat as local time. If the object represents a Coordinated Universal Time (UTC), it is converted to the local time. + + + + + Treat as a UTC. If the object represents a local time, it is converted to a UTC. + + + + + Treat as a local time if a is being converted to a string. + If a string is being converted to , convert to a local time if a time zone is specified. + + + + + Time zone information should be preserved when converting. + + + + + Specifies default value handling options for the . + + + + + + + + + Include members where the member value is the same as the member's default value when serializing objects. + Included members are written to JSON. Has no effect when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + so that is is not written to JSON. + This option will ignore all default values (e.g. null for objects and nullable types; 0 for integers, + decimals and floating point numbers; and false for booleans). The default value ignored can be changed by + placing the on the property. + + + + + Members with a default value but no JSON will be set to their default value when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + and sets members to their default value when deserializing. + + + + + Specifies float format handling options when writing special floating point numbers, e.g. , + and with . + + + + + Write special floating point values as strings in JSON, e.g. "NaN", "Infinity", "-Infinity". + + + + + Write special floating point values as symbols in JSON, e.g. NaN, Infinity, -Infinity. + Note that this will produce non-valid JSON. + + + + + Write special floating point values as the property's default value in JSON, e.g. 0.0 for a property, null for a property. + + + + + Specifies how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Floating point numbers are parsed to . + + + + + Floating point numbers are parsed to . + + + + + Specifies formatting options for the . + + + + + No special formatting is applied. This is the default. + + + + + Causes child objects to be indented according to the and settings. + + + + + Provides an interface for using pooled arrays. + + The array type content. + + + + Rent a array from the pool. This array must be returned when it is no longer needed. + + The minimum required length of the array. The returned array may be longer. + The rented array from the pool. This array must be returned when it is no longer needed. + + + + Return an array to the pool. + + The array that is being returned. + + + + Provides an interface to enable a class to return line and position information. + + + + + Gets a value indicating whether the class can return line information. + + + true if LineNumber and LinePosition can be provided; otherwise, false. + + + + + Gets the current line number. + + The current line number or 0 if no line information is available (for example, HasLineInfo returns false). + + + + Gets the current line position. + + The current line position or 0 if no line information is available (for example, HasLineInfo returns false). + + + + Instructs the how to serialize the collection. + + + + + Gets or sets a value indicating whether null items are allowed in the collection. + + true if null items are allowed in the collection; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a flag indicating whether the array can contain null items + + A flag indicating whether the array can contain null items. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to use the specified constructor when deserializing that object. + + + + + Instructs the how to serialize the object. + + + + + Gets or sets the id. + + The id. + + + + Gets or sets the title. + + The title. + + + + Gets or sets the description. + + The description. + + + + Gets the collection's items converter. + + The collection's items converter. + + + + The parameter list to use when constructing the JsonConverter described by ItemConverterType. + If null, the default constructor is used. + When non-null, there must be a constructor defined in the JsonConverter that exactly matches the number, + order, and type of these parameters. + + + [JsonContainer(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + Gets or sets a value that indicates whether to preserve object references. + + + true to keep object reference; otherwise, false. The default is false. + + + + + Gets or sets a value that indicates whether to preserve collection's items references. + + + true to keep collection's items object references; otherwise, false. The default is false. + + + + + Gets or sets the reference loop handling used when serializing the collection's items. + + The reference loop handling. + + + + Gets or sets the type name handling used when serializing the collection's items. + + The type name handling. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Provides methods for converting between common language runtime types and JSON types. + + + + + + + + Gets or sets a function that creates default . + Default settings are automatically used by serialization methods on , + and and on . + To serialize without using any default settings create a with + . + + + + + Represents JavaScript's boolean value true as a string. This field is read-only. + + + + + Represents JavaScript's boolean value false as a string. This field is read-only. + + + + + Represents JavaScript's null as a string. This field is read-only. + + + + + Represents JavaScript's undefined as a string. This field is read-only. + + + + + Represents JavaScript's positive infinity as a string. This field is read-only. + + + + + Represents JavaScript's negative infinity as a string. This field is read-only. + + + + + Represents JavaScript's NaN as a string. This field is read-only. + + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + The time zone handling when the date is converted to a string. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + The string escape handling. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Serializes the specified object to a JSON string. + + The object to serialize. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting. + + The object to serialize. + Indicates how the output is formatted. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a collection of . + + The object to serialize. + A collection converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting and a collection of . + + The object to serialize. + Indicates how the output is formatted. + A collection converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifing the type is optional. + + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using formatting and . + + The object to serialize. + Indicates how the output is formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + Indicates how the output is formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifing the type is optional. + + + A JSON string representation of the object. + + + + + Asynchronously serializes the specified object to a JSON string. + Serialization will happen on a new thread. + + The object to serialize. + + A task that represents the asynchronous serialize operation. The value of the TResult parameter contains a JSON string representation of the object. + + + + + Asynchronously serializes the specified object to a JSON string using formatting. + Serialization will happen on a new thread. + + The object to serialize. + Indicates how the output is formatted. + + A task that represents the asynchronous serialize operation. The value of the TResult parameter contains a JSON string representation of the object. + + + + + Asynchronously serializes the specified object to a JSON string using formatting and a collection of . + Serialization will happen on a new thread. + + The object to serialize. + Indicates how the output is formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A task that represents the asynchronous serialize operation. The value of the TResult parameter contains a JSON string representation of the object. + + + + + Deserializes the JSON to a .NET object. + + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to a .NET object using . + + The JSON to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The JSON to deserialize. + The of object being deserialized. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The type of the object to deserialize to. + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the given anonymous type. + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be infered from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the given anonymous type using . + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be infered from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The type of the object to deserialize to. + The JSON to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The type of the object to deserialize to. + The object to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The JSON to deserialize. + The type of the object to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The JSON to deserialize. + The type of the object to deserialize to. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Asynchronously deserializes the JSON to the specified .NET type. + Deserialization will happen on a new thread. + + The type of the object to deserialize to. + The JSON to deserialize. + + A task that represents the asynchronous deserialize operation. The value of the TResult parameter contains the deserialized object from the JSON string. + + + + + Asynchronously deserializes the JSON to the specified .NET type using . + Deserialization will happen on a new thread. + + The type of the object to deserialize to. + The JSON to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + + A task that represents the asynchronous deserialize operation. The value of the TResult parameter contains the deserialized object from the JSON string. + + + + + Asynchronously deserializes the JSON to the specified .NET type. + Deserialization will happen on a new thread. + + The JSON to deserialize. + + A task that represents the asynchronous deserialize operation. The value of the TResult parameter contains the deserialized object from the JSON string. + + + + + Asynchronously deserializes the JSON to the specified .NET type using . + Deserialization will happen on a new thread. + + The JSON to deserialize. + The type of the object to deserialize to. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + + A task that represents the asynchronous deserialize operation. The value of the TResult parameter contains the deserialized object from the JSON string. + + + + + Populates the object with values from the JSON string. + + The JSON to populate values from. + The target object to populate values onto. + + + + Populates the object with values from the JSON string using . + + The JSON to populate values from. + The target object to populate values onto. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + + + + Asynchronously populates the object with values from the JSON string using . + + The JSON to populate values from. + The target object to populate values onto. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + + A task that represents the asynchronous populate operation. + + + + + Serializes the to a JSON string. + + The node to convert to JSON. + A JSON string of the XNode. + + + + Serializes the to a JSON string using formatting. + + The node to convert to JSON. + Indicates how the output is formatted. + A JSON string of the XNode. + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output is formatted. + Omits writing the root object. + A JSON string of the XNode. + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized XNode + + + + Deserializes the from a JSON string nested in a root elment specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized XNode + + + + Deserializes the from a JSON string nested in a root elment specified by + and writes a .NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A flag to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized XNode + + + + Converts an object to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can read JSON. + + true if this can read JSON; otherwise, false. + + + + Gets a value indicating whether this can write JSON. + + true if this can write JSON; otherwise, false. + + + + Instructs the to use the specified when serializing the member or class. + + + + + Gets the of the converter. + + The of the converter. + + + + The parameter list to use when constructing the JsonConverter described by ConverterType. + If null, the default constructor is used. + + + + + Initializes a new instance of the class. + + Type of the converter. + + + + Initializes a new instance of the class. + + Type of the converter. + Parameter list to use when constructing the JsonConverter. Can be null. + + + + Represents a collection of . + + + + + Instructs the how to serialize the collection. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + Instructs the to deserialize properties with no matching class member into the specified collection + and write values during serialization. + + + + + Gets or sets a value that indicates whether to write extension data when serializing the object. + + + true to write extension data when serializing the object; otherwise, false. The default is true. + + + + + Gets or sets a value that indicates whether to read extension data when deserializing the object. + + + true to read extension data when deserializing the object; otherwise, false. The default is true. + + + + + Initializes a new instance of the class. + + + + + Instructs the not to serialize the public field or public read/write property value. + + + + + Instructs the how to serialize the object. + + + + + Gets or sets the member serialization. + + The member serialization. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified member serialization. + + The member serialization. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to always serialize the member with the specified name. + + + + + Gets or sets the converter used when serializing the property's collection items. + + The collection's items converter. + + + + The parameter list to use when constructing the JsonConverter described by ItemConverterType. + If null, the default constructor is used. + When non-null, there must be a constructor defined in the JsonConverter that exactly matches the number, + order, and type of these parameters. + + + [JsonProperty(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + Gets or sets the null value handling used when serializing this property. + + The null value handling. + + + + Gets or sets the default value handling used when serializing this property. + + The default value handling. + + + + Gets or sets the reference loop handling used when serializing this property. + + The reference loop handling. + + + + Gets or sets the object creation handling used when deserializing this property. + + The object creation handling. + + + + Gets or sets the type name handling used when serializing this property. + + The type name handling. + + + + Gets or sets whether this property's value is serialized as a reference. + + Whether this property's value is serialized as a reference. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets a value indicating whether this property is required. + + + A value indicating whether this property is required. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + Gets or sets the the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified name. + + Name of the property. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Specifies the state of the reader. + + + + + The Read method has not been called. + + + + + The end of the file has been reached successfully. + + + + + Reader is at a property. + + + + + Reader is at the start of an object. + + + + + Reader is in an object. + + + + + Reader is at the start of an array. + + + + + Reader is in an array. + + + + + The Close method has been called. + + + + + Reader has just read a value. + + + + + Reader is at the start of a constructor. + + + + + Reader in a constructor. + + + + + An error occurred that prevents the read operation from continuing. + + + + + The end of the file has been reached successfully. + + + + + Gets the current reader state. + + The current reader state. + + + + Gets or sets a value indicating whether the underlying stream or + should be closed when the reader is closed. + + + true to close the underlying stream or when + the reader is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether multiple pieces of JSON content can + be read from a continuous stream without erroring. + + + true to support reading multiple pieces of JSON content; otherwise false. The default is false. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + Get or set how time zones are handling when reading JSON. + + + + + Get or set how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Get or set how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Get or set how custom date formatted strings are parsed when reading JSON. + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + + + + + Gets the type of the current JSON token. + + + + + Gets the text value of the current JSON token. + + + + + Gets The Common Language Runtime (CLR) type for the current JSON token. + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Initializes a new instance of the class with the specified . + + + + + Reads the next JSON token from the stream. + + true if the next token was read successfully; false if there are no more tokens to read. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a []. + + A [] or a null reference if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Skips the children of the current token. + + + + + Sets the current token. + + The new token. + + + + Sets the current token and value. + + The new token. + The value. + + + + Sets the state based on current token type. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Changes the to Closed. + + + + + The exception thrown when an error occurs while reading JSON text. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + Instructs the to always serialize the member, and require the member has a value. + + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + Serializes and deserializes objects into and from the JSON format. + The enables you to control how objects are encoded into JSON. + + + + + Occurs when the errors during serialization and deserialization. + + + + + Gets or sets the used by the serializer when resolving references. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets how type name writing and reading is handled by the serializer. + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than TypeNameHandling.None. + + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + + The type name assembly format. + + + + Gets or sets how object references are preserved by the serializer. + + + + + Get or set how reference loops (e.g. a class referencing itself) is handled. + + + + + Get or set how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + + + + + Get or set how null values are handled during serialization and deserialization. + + + + + Get or set how null default are handled during serialization and deserialization. + + + + + Gets or sets how objects are created during deserialization. + + The object creation handling. + + + + Gets or sets how constructors are used during deserialization. + + The constructor handling. + + + + Gets or sets how metadata properties are used during deserialization. + + The metadata properties handling. + + + + Gets a collection that will be used during serialization. + + Collection that will be used during serialization. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Indicates how JSON text output is formatted. + + + + + Get or set how dates are written to JSON text. + + + + + Get or set how time zones are handling during serialization and deserialization. + + + + + Get or set how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Get or set how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Get or set how special floating point numbers, e.g. , + and , + are written as JSON text. + + + + + Get or set how strings are escaped when writing JSON text. + + + + + Get or set how and values are formatted when writing JSON text, and the expected date format when reading JSON text. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + + + + + Gets a value indicating whether there will be a check for additional JSON content after deserializing an object. + + + true if there will be a check for additional JSON content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Creates a new instance. + The will not use default settings + from . + + + A new instance. + The will not use default settings + from . + + + + + Creates a new instance using the specified . + The will not use default settings + from . + + The settings to be applied to the . + + A new instance using the specified . + The will not use default settings + from . + + + + + Creates a new instance. + The will use default settings + from . + + + A new instance. + The will use default settings + from . + + + + + Creates a new instance using the specified . + The will use default settings + from as well as the specified . + + The settings to be applied to the . + + A new instance using the specified . + The will use default settings + from as well as the specified . + + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to reader values from. + The target object to populate values onto. + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to reader values from. + The target object to populate values onto. + + + + Deserializes the JSON structure contained by the specified . + + The that contains the JSON structure to deserialize. + The being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The type of the object to deserialize. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Serializes the specified and writes the JSON structure + to a Stream using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Serializes the specified and writes the JSON structure + to a Stream using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifing the type is optional. + + + + + Serializes the specified and writes the JSON structure + to a Stream using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifing the type is optional. + + + + + Serializes the specified and writes the JSON structure + to a Stream using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Specifies the settings on a object. + + + + + Gets or sets how reference loops (e.g. a class referencing itself) is handled. + + Reference loop handling. + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + + Missing member handling. + + + + Gets or sets how objects are created during deserialization. + + The object creation handling. + + + + Gets or sets how null values are handled during serialization and deserialization. + + Null value handling. + + + + Gets or sets how null default are handled during serialization and deserialization. + + The default value handling. + + + + Gets or sets a collection that will be used during serialization. + + The converters. + + + + Gets or sets how object references are preserved by the serializer. + + The preserve references handling. + + + + Gets or sets how type name writing and reading is handled by the serializer. + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than TypeNameHandling.None. + + The type name handling. + + + + Gets or sets how metadata properties are used during deserialization. + + The metadata properties handling. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + + The type name assembly format. + + + + Gets or sets how constructors are used during deserialization. + + The constructor handling. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + The contract resolver. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets the used by the serializer when resolving references. + + The reference resolver. + + + + Gets or sets a function that creates the used by the serializer when resolving references. + + A function that creates the used by the serializer when resolving references. + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the error handler called during serialization and deserialization. + + The error handler called during serialization and deserialization. + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Get or set how and values are formatted when writing JSON text, and the expected date format when reading JSON text. + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + + + + + Indicates how JSON text output is formatted. + + + + + Get or set how dates are written to JSON text. + + + + + Get or set how time zones are handling during serialization and deserialization. + + + + + Get or set how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Get or set how special floating point numbers, e.g. , + and , + are written as JSON. + + + + + Get or set how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Get or set how strings are escaped when writing JSON text. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Gets a value indicating whether there will be a check for additional content after deserializing an object. + + + true if there will be a check for additional content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Represents a reader that provides fast, non-cached, forward-only access to JSON text data. + + + + + Initializes a new instance of the class with the specified . + + The TextReader containing the XML data to read. + + + + Gets or sets the reader's character buffer pool. + + + + + Reads the next JSON token from the stream. + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a []. + + A [] or a null reference if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the stream as a . + + A . This method will return null at the end of an array. + + + + Changes the state to closed. + + + + + Gets a value indicating whether the class can return line information. + + + true if LineNumber and LinePosition can be provided; otherwise, false. + + + + + Gets the current line number. + + + The current line number or 0 if no line information is available (for example, HasLineInfo returns false). + + + + + Gets the current line position. + + + The current line position or 0 if no line information is available (for example, HasLineInfo returns false). + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets or sets the writer's character array pool. + + + + + Gets or sets how many IndentChars to write for each level in the hierarchy when is set to Formatting.Indented. + + + + + Gets or sets which character to use to quote attribute values. + + + + + Gets or sets which character to use for indenting when is set to Formatting.Indented. + + + + + Gets or sets a value indicating whether object names will be surrounded with quotes. + + + + + Creates an instance of the JsonWriter class using the specified . + + The TextWriter to write to. + + + + Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream. + + + + + Closes this stream and the underlying stream. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the specified end token. + + The end token to write. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes out a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes out the given white space. + + The string of white space characters. + + + + Specifies the type of JSON token. + + + + + This is returned by the if a method has not been called. + + + + + An object start token. + + + + + An array start token. + + + + + A constructor start token. + + + + + An object property name. + + + + + A comment. + + + + + Raw JSON. + + + + + An integer. + + + + + A float. + + + + + A string. + + + + + A boolean. + + + + + A null token. + + + + + An undefined token. + + + + + An object end token. + + + + + An array end token. + + + + + A constructor end token. + + + + + A Date. + + + + + Byte data. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets or sets a value indicating whether the underlying stream or + should be closed when the writer is closed. + + + true to close the underlying stream or when + the writer is closed; otherwise false. The default is true. + + + + + Gets the top. + + The top. + + + + Gets the state of the writer. + + + + + Gets the path of the writer. + + + + + Indicates how JSON text output is formatted. + + + + + Get or set how dates are written to JSON text. + + + + + Get or set how time zones are handling when writing JSON text. + + + + + Get or set how strings are escaped when writing JSON text. + + + + + Get or set how special floating point numbers, e.g. , + and , + are written to JSON text. + + + + + Get or set how and values are formatting when writing JSON text. + + + + + Gets or sets the culture used when writing JSON. Defaults to . + + + + + Creates an instance of the JsonWriter class. + + + + + Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream. + + + + + Closes this stream and the underlying stream. + + + + + Writes the beginning of a JSON object. + + + + + Writes the end of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the end of an array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end constructor. + + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes the end of the current JSON object or array. + + + + + Writes the current token and its children. + + The to read the token from. + + + + Writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + + + + Writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + A null value can be passed to the method for token's that don't have a value, e.g. . + + + + Writes the token. + + The to write. + + + + Writes the specified end token. + + The end token to write. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON without changing the writer's state. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes out a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes out the given white space. + + The string of white space characters. + + + + Releases unmanaged and - optionally - managed resources + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Sets the state of the JsonWriter, + + The JsonToken being written. + The value being written. + + + + The exception thrown when an error occurs while reading JSON text. + + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + Specifies how JSON comments are handled when loading JSON. + + + + + Ignore comments. + + + + + Load comments as a with type . + + + + + Specifies how line information is handled when loading JSON. + + + + + Ignore line information. + + + + + Load line information. + + + + + Contains the LINQ to JSON extension methods. + + + + + Returns a collection of tokens that contains the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the descendants of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, and the descendants of every token in the source collection. + + + + Returns a collection of child properties of every object in the source collection. + + An of that contains the source collection. + An of that contains the properties of every object in the source collection. + + + + Returns a collection of child values of every object in the source collection with the given key. + + An of that contains the source collection. + The token key. + An of that contains the values of every token in the source collection with the given key. + + + + Returns a collection of child values of every object in the source collection. + + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child values of every object in the source collection with the given key. + + The type to convert the values to. + An of that contains the source collection. + The token key. + An that contains the converted values of every token in the source collection with the given key. + + + + Returns a collection of converted child values of every object in the source collection. + + The type to convert the values to. + An of that contains the source collection. + An that contains the converted values of every token in the source collection. + + + + Converts the value. + + The type to convert the value to. + A cast as a of . + A converted value. + + + + Converts the value. + + The source collection type. + The type to convert the value to. + A cast as a of . + A converted value. + + + + Returns a collection of child tokens of every array in the source collection. + + The source collection type. + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child tokens of every array in the source collection. + + An of that contains the source collection. + The type to convert the values to. + The source collection type. + An that contains the converted values of every token in the source collection. + + + + Returns the input typed as . + + An of that contains the source collection. + The input typed as . + + + + Returns the input typed as . + + The source collection type. + An of that contains the source collection. + The input typed as . + + + + Represents a collection of objects. + + The type of token + + + + Gets the with the specified key. + + + + + + Represents a JSON array. + + + + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the at the specified index. + + + + + + Determines the index of a specific item in the . + + The object to locate in the . + + The index of if found in the list; otherwise, -1. + + + + + Inserts an item to the at the specified index. + + The zero-based index at which should be inserted. + The object to insert into the . + + is not a valid index in the . + The is read-only. + + + + Removes the item at the specified index. + + The zero-based index of the item to remove. + + is not a valid index in the . + The is read-only. + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + + + + Adds an item to the . + + The object to add to the . + The is read-only. + + + + Removes all items from the . + + The is read-only. + + + + Determines whether the contains a specific value. + + The object to locate in the . + + true if is found in the ; otherwise, false. + + + + + Copies to. + + The array. + Index of the array. + + + + Gets a value indicating whether the is read-only. + + true if the is read-only; otherwise, false. + + + + Removes the first occurrence of a specific object from the . + + The object to remove from the . + + true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + + The is read-only. + + + + Represents a JSON constructor. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets or sets the name of this constructor. + + The constructor name. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name. + + The constructor name. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a token that can contain other tokens. + + + + + Occurs when the items list of the collection has changed, or the collection is reset. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Raises the event. + + The instance containing the event data. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Get the first child token of this token. + + + A containing the first child token of the . + + + + + Get the last child token of this token. + + + A containing the last child token of the . + + + + + Returns a collection of the child tokens of this token, in document order. + + + An of containing the child tokens of this , in document order. + + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + + A containing the child values of this , in document order. + + + + + Returns a collection of the descendant tokens for this token in document order. + + An containing the descendant tokens of the . + + + + Returns a collection of the tokens that contain this token, and all descendant tokens of this token, in document order. + + An containing this token, and all the descendant tokens of the . + + + + Adds the specified content as children of this . + + The content to be added. + + + + Adds the specified content as the first children of this . + + The content to be added. + + + + Creates an that can be used to add tokens to the . + + An that is ready to have content written to it. + + + + Replaces the children nodes of this token with the specified content. + + The content. + + + + Removes the child nodes from this token. + + + + + Merge the specified content into this . + + The content to be merged. + + + + Merge the specified content into this using . + + The content to be merged. + The used to merge the content. + + + + Gets the count of child JSON tokens. + + The count of child JSON tokens + + + + Represents a collection of objects. + + The type of token + + + + An empty collection of objects. + + + + + Initializes a new instance of the struct. + + The enumerable. + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + + + + Gets the with the specified key. + + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Represents a JSON object. + + + + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Occurs when a property value changes. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Gets the node type for this . + + The type. + + + + Gets an of this object's properties. + + An of this object's properties. + + + + Gets a the specified name. + + The property name. + A with the specified name or null. + + + + Gets an of this object's property values. + + An of this object's property values. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the with the specified property name. + + + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified property name. + + Name of the property. + The with the specified property name. + + + + Gets the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + One of the enumeration values that specifies how the strings will be compared. + The with the specified property name. + + + + Tries to get the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + The value. + One of the enumeration values that specifies how the strings will be compared. + true if a value was successfully retrieved; otherwise, false. + + + + Adds the specified property name. + + Name of the property. + The value. + + + + Removes the property with the specified name. + + Name of the property. + true if item was successfully removed; otherwise, false. + + + + Tries the get value. + + Name of the property. + The value. + true if a value was successfully retrieved; otherwise, false. + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Represents a JSON property. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the property name. + + The property name. + + + + Gets or sets the property value. + + The property value. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a raw JSON string. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class. + + The raw json. + + + + Creates an instance of with the content of the reader's current token. + + The reader. + An instance of with the content of the reader's current token. + + + + Specifies the settings used when loading JSON. + + + + + Gets or sets how JSON comments are handled when loading JSON. + + The JSON comment handling. + + + + Gets or sets how JSON line info is handled when loading JSON. + + The JSON line info handling. + + + + Specifies the settings used when merging JSON. + + + + + Gets or sets the method used when merging JSON arrays. + + The method used when merging JSON arrays. + + + + Gets or sets how how null value properties are merged. + + How null value properties are merged. + + + + Represents an abstract JSON token. + + + + + Gets a comparer that can compare two tokens for value equality. + + A that can compare two nodes for value equality. + + + + Gets or sets the parent. + + The parent. + + + + Gets the root of this . + + The root of this . + + + + Gets the node type for this . + + The type. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Compares the values of two tokens, including the values of all descendant tokens. + + The first to compare. + The second to compare. + true if the tokens are equal; otherwise false. + + + + Gets the next sibling token of this node. + + The that contains the next sibling token. + + + + Gets the previous sibling token of this node. + + The that contains the previous sibling token. + + + + Gets the path of the JSON token. + + + + + Adds the specified content immediately after this token. + + A content object that contains simple content or a collection of content objects to be added after this token. + + + + Adds the specified content immediately before this token. + + A content object that contains simple content or a collection of content objects to be added before this token. + + + + Returns a collection of the ancestor tokens of this token. + + A collection of the ancestor tokens of this token. + + + + Returns a collection of tokens that contain this token, and the ancestors of this token. + + A collection of tokens that contain this token, and the ancestors of this token. + + + + Returns a collection of the sibling tokens after this token, in document order. + + A collection of the sibling tokens after this tokens, in document order. + + + + Returns a collection of the sibling tokens before this token, in document order. + + A collection of the sibling tokens before this token, in document order. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets the with the specified key converted to the specified type. + + The type to convert the token to. + The token key. + The converted token value. + + + + Get the first child token of this token. + + A containing the first child token of the . + + + + Get the last child token of this token. + + A containing the last child token of the . + + + + Returns a collection of the child tokens of this token, in document order. + + An of containing the child tokens of this , in document order. + + + + Returns a collection of the child tokens of this token, in document order, filtered by the specified type. + + The type to filter the child tokens on. + A containing the child tokens of this , in document order. + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + A containing the child values of this , in document order. + + + + Removes this token from its parent. + + + + + Replaces this token with the specified token. + + The value. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Returns the indented JSON for this token. + + + The indented JSON for this token. + + + + + Returns the JSON for this token using the given formatting and converters. + + Indicates how the output is formatted. + A collection of which will be used when writing the token. + The JSON for this token using the given formatting and converters. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to []. + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from [] to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Creates an for this token. + + An that can be used to read this token and its descendants. + + + + Creates a from an object. + + The object that will be used to create . + A with the value of the specified object + + + + Creates a from an object using the specified . + + The object that will be used to create . + The that will be used when reading the object. + A with the value of the specified object + + + + Creates the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates a from a . + + An positioned at the token to read into this . + + An that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + An that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + Creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + An that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + An positioned at the token to read into this . + + An that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Selects a using a JPath expression. Selects the token that matches the object path. + + + A that contains a JPath expression. + + A , or null. + + + + Selects a using a JPath expression. Selects the token that matches the object path. + + + A that contains a JPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + A . + + + + Selects a collection of elements using a JPath expression. + + + A that contains a JPath expression. + + An that contains the selected elements. + + + + Selects a collection of elements using a JPath expression. + + + A that contains a JPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + An that contains the selected elements. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A new instance of the . + + + + Adds an object to the annotation list of this . + + The annotation to add. + + + + Get the first annotation object of the specified type from this . + + The type of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets the first annotation object of the specified type from this . + + The of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets a collection of annotations of the specified type for this . + + The type of the annotations to retrieve. + An that contains the annotations for this . + + + + Gets a collection of annotations of the specified type for this . + + The of the annotations to retrieve. + An of that contains the annotations that match the specified type for this . + + + + Removes the annotations of the specified type from this . + + The type of annotations to remove. + + + + Removes the annotations of the specified type from this . + + The of annotations to remove. + + + + Compares tokens to determine whether they are equal. + + + + + Determines whether the specified objects are equal. + + The first object of type to compare. + The second object of type to compare. + + true if the specified objects are equal; otherwise, false. + + + + + Returns a hash code for the specified object. + + The for which a hash code is to be returned. + A hash code for the specified object. + The type of is a reference type and is null. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Gets the at the reader's current position. + + + + + Initializes a new instance of the class. + + The token to read from. + + + + Reads the next JSON token from the stream. + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Gets the path of the current JSON token. + + + + + Specifies the type of token. + + + + + No token type has been set. + + + + + A JSON object. + + + + + A JSON array. + + + + + A JSON constructor. + + + + + A JSON object property. + + + + + A comment. + + + + + An integer value. + + + + + A float value. + + + + + A string value. + + + + + A boolean value. + + + + + A null value. + + + + + An undefined value. + + + + + A date value. + + + + + A raw JSON value. + + + + + A collection of bytes value. + + + + + A Guid value. + + + + + A Uri value. + + + + + A TimeSpan value. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets the at the writer's current position. + + + + + Gets the token being writen. + + The token being writen. + + + + Initializes a new instance of the class writing to the given . + + The container being written to. + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the underlying streams and also flushes the underlying stream. + + + + + Closes this stream and the underlying stream. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end. + + The token. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes out a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Represents a value in JSON (string, integer, date, etc). + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Creates a comment with the given value. + + The value. + A comment with the given value. + + + + Creates a string with the given value. + + The value. + A string with the given value. + + + + Creates a null value. + + A null value. + + + + Creates a undefined value. + + A undefined value. + + + + Gets the node type for this . + + The type. + + + + Gets or sets the underlying token value. + + The underlying token value. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Indicates whether the current object is equal to another object of the same type. + + + true if the current object is equal to the parameter; otherwise, false. + + An object to compare with this object. + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + The parameter is null. + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format provider. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + The format provider. + + A that represents this instance. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. + + An object to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the objects being compared. The return value has these meanings: + Value + Meaning + Less than zero + This instance is less than . + Zero + This instance is equal to . + Greater than zero + This instance is greater than . + + + is not the same type as this instance. + + + + + Specifies how JSON arrays are merged together. + + + + Concatenate arrays. + + + Union arrays, skipping items that already exist. + + + Replace all array items. + + + Merge array items together, matched by index. + + + + Specifies how null value properties are merged. + + + + + The content's null value properties will be ignored during merging. + + + + + The content's null value properties will be merged. + + + + + Specifies the member serialization options for the . + + + + + All public members are serialized by default. Members can be excluded using or . + This is the default member serialization mode. + + + + + Only members marked with or are serialized. + This member serialization mode can also be set by marking the class with . + + + + + All public and private fields are serialized. Members can be excluded using or . + This member serialization mode can also be set by marking the class with + and setting IgnoreSerializableAttribute on to false. + + + + + Specifies metadata property handling options for the . + + + + + Read metadata properties located at the start of a JSON object. + + + + + Read metadata properties located anywhere in a JSON object. Note that this setting will impact performance. + + + + + Do not try to read metadata properties. + + + + + Specifies missing member handling options for the . + + + + + Ignore a missing member and do not attempt to deserialize it. + + + + + Throw a when a missing member is encountered during deserialization. + + + + + Specifies null value handling options for the . + + + + + + + + + Include null values when serializing and deserializing objects. + + + + + Ignore null values when serializing and deserializing objects. + + + + + Specifies how object creation is handled by the . + + + + + Reuse existing objects, create new objects when needed. + + + + + Only reuse existing objects. + + + + + Always create new objects. + + + + + Specifies reference handling options for the . + Note that references cannot be preserved when a value is set via a non-default constructor such as types that implement ISerializable. + + + + + + + + Do not preserve references when serializing types. + + + + + Preserve references when serializing into a JSON object structure. + + + + + Preserve references when serializing into a JSON array structure. + + + + + Preserve references when serializing. + + + + + Specifies reference loop handling options for the . + + + + + Throw a when a loop is encountered. + + + + + Ignore loop references and do not serialize. + + + + + Serialize loop references. + + + + + Indicating whether a property is required. + + + + + The property is not required. The default state. + + + + + The property must be defined in JSON but can be a null value. + + + + + The property must be defined in JSON and cannot be a null value. + + + + + The property is not required but it cannot be a null value. + + + + + Allows users to control class loading and mandate what class to load. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object + The type of the object the formatter creates a new instance of. + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Resolves member mappings for a type, camel casing property names. + + + + + Initializes a new instance of the class. + + + + + Resolves the name of the property. + + Name of the property. + The property name camel cased. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Used by to resolves a for a given . + + + + + Gets a value indicating whether members are being get and set using dynamic code generation. + This value is determined by the runtime permissions available. + + + true if using dynamic code generation; otherwise, false. + + + + + Gets or sets a value indicating whether compiler generated members should be serialized. + + + true if serialized compiler generated members; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + If set to true the will use a cached shared with other resolvers of the same type. + Sharing the cache will significantly improve performance with multiple resolver instances because expensive reflection will only + happen once. This setting can cause unexpected behavior if different instances of the resolver are suppose to produce different + results. When set to false it is highly recommended to reuse instances with the . + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Gets the serializable members for the type. + + The type to get serializable members for. + The serializable members for the type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates the constructor parameters. + + The constructor to create properties for. + The type's member properties. + Properties for the given . + + + + Creates a for the given . + + The matching member property. + The constructor parameter. + A created for the given . + + + + Resolves the default for the contract. + + Type of the object. + The contract's default . + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Determines which contract type is created for the given type. + + Type of the object. + A for the given type. + + + + Creates properties for the given . + + The type to create properties for. + /// The member serialization mode for the type. + Properties for the given . + + + + Creates the used by the serializer to get and set values from a member. + + The member. + The used by the serializer to get and set values from a member. + + + + Creates a for the given . + + The member's parent . + The member to create a for. + A created for the given . + + + + Resolves the name of the property. + + Name of the property. + Resolved name of the property. + + + + Resolves the key of the dictionary. By default is used to resolve dictionary keys. + + Key of the dictionary. + Resolved key of the dictionary. + + + + Gets the resolved name of the property. + + Name of the property. + Name of the property. + + + + The default serialization binder used when resolving and loading classes from type names. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + The type of the object the formatter creates a new instance of. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Provides information surrounding an error. + + + + + Gets the error. + + The error. + + + + Gets the original object that caused the error. + + The original object that caused the error. + + + + Gets the member that caused the error. + + The member that caused the error. + + + + Gets the path of the JSON location where the error occurred. + + The path of the JSON location where the error occurred. + + + + Gets or sets a value indicating whether this is handled. + + true if handled; otherwise, false. + + + + Provides data for the Error event. + + + + + Gets the current object the error event is being raised against. + + The current object the error event is being raised against. + + + + Gets the error context. + + The error context. + + + + Initializes a new instance of the class. + + The current object. + The error context. + + + + Provides methods to get attributes. + + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Used by to resolves a for a given . + + + + + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used to resolve references when serializing and deserializing JSON by the . + + + + + Resolves a reference to its object. + + The serialization context. + The reference to resolve. + The object that + + + + Gets the reference for the sepecified object. + + The serialization context. + The object to get a reference for. + The reference to the object. + + + + Determines whether the specified object is referenced. + + The serialization context. + The object to test for a reference. + + true if the specified object is referenced; otherwise, false. + + + + + Adds a reference to the specified object. + + The serialization context. + The reference. + The object to reference. + + + + Represents a trace writer. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of Info will exclude Verbose messages and include Info, + Warning and Error messages. + + The that will be used to filter the trace messages passed to the writer. + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Provides methods to get and set values. + + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Contract details for a used by the . + + + + + Gets the of the collection items. + + The of the collection items. + + + + Gets a value indicating whether the collection type is a multidimensional array. + + true if the collection type is a multidimensional array; otherwise, false. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the collection values. + + true if the creator has a parameter with the collection values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the default collection items . + + The converter. + + + + Gets or sets a value indicating whether the collection items preserve object references. + + true if collection items preserve object references; otherwise, false. + + + + Gets or sets the collection item reference loop handling. + + The reference loop handling. + + + + Gets or sets the collection item type name handling. + + The type name handling. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Handles serialization callback events. + + The object that raised the callback event. + The streaming context. + + + + Handles serialization error callback events. + + The object that raised the callback event. + The streaming context. + The error context. + + + + Sets extension data for an object during deserialization. + + The object to set extension data on. + The extension data key. + The extension data value. + + + + Gets extension data for an object during serialization. + + The object to set extension data on. + + + + Contract details for a used by the . + + + + + Gets the underlying type for the contract. + + The underlying type for the contract. + + + + Gets or sets the type created during deserialization. + + The type created during deserialization. + + + + Gets or sets whether this type contract is serialized as a reference. + + Whether this type contract is serialized as a reference. + + + + Gets or sets the default for this contract. + + The converter. + + + + Gets or sets all methods called immediately after deserialization of the object. + + The methods called immediately after deserialization of the object. + + + + Gets or sets all methods called during deserialization of the object. + + The methods called during deserialization of the object. + + + + Gets or sets all methods called after serialization of the object graph. + + The methods called after serialization of the object graph. + + + + Gets or sets all methods called before serialization of the object. + + The methods called before serialization of the object. + + + + Gets or sets all method called when an error is thrown during the serialization of the object. + + The methods called when an error is thrown during the serialization of the object. + + + + Gets or sets the method called immediately after deserialization of the object. + + The method called immediately after deserialization of the object. + + + + Gets or sets the method called during deserialization of the object. + + The method called during deserialization of the object. + + + + Gets or sets the method called after serialization of the object graph. + + The method called after serialization of the object graph. + + + + Gets or sets the method called before serialization of the object. + + The method called before serialization of the object. + + + + Gets or sets the method called when an error is thrown during the serialization of the object. + + The method called when an error is thrown during the serialization of the object. + + + + Gets or sets the default creator method used to create the object. + + The default creator method used to create the object. + + + + Gets or sets a value indicating whether the default creator is non public. + + true if the default object creator is non-public; otherwise, false. + + + + Contract details for a used by the . + + + + + Gets or sets the property name resolver. + + The property name resolver. + + + + Gets or sets the dictionary key resolver. + + The dictionary key resolver. + + + + Gets the of the dictionary keys. + + The of the dictionary keys. + + + + Gets the of the dictionary values. + + The of the dictionary values. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the dictionary values. + + true if the creator has a parameter with the dictionary values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets the object's properties. + + The object's properties. + + + + Gets or sets the property name resolver. + + The property name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object member serialization. + + The member object serialization. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Gets the object's properties. + + The object's properties. + + + + Gets the constructor parameters required for any non-default constructor + + + + + Gets a collection of instances that define the parameters used with . + + + + + Gets or sets the override constructor used to create the object. + This is set when a constructor is marked up using the + JsonConstructor attribute. + + The override constructor. + + + + Gets or sets the parametrized constructor used to create the object. + + The parametrized constructor. + + + + Gets or sets the function used to create the object. When set this function will override . + This function is called with a collection of arguments which are defined by the collection. + + The function used to create the object. + + + + Gets or sets the extension data setter. + + + + + Gets or sets the extension data getter. + + + + + Gets or sets the extension data value type. + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Maps a JSON property to a .NET member or constructor parameter. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the type that declared this property. + + The type that declared this property. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets the name of the underlying member or parameter. + + The name of the underlying member or parameter. + + + + Gets the that will get and set the during serialization. + + The that will get and set the during serialization. + + + + Gets or sets the for this property. + + The for this property. + + + + Gets or sets the type of the property. + + The type of the property. + + + + Gets or sets the for the property. + If set this converter takes presidence over the contract converter for the property type. + + The converter. + + + + Gets or sets the member converter. + + The member converter. + + + + Gets or sets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets or sets a value indicating whether this is readable. + + true if readable; otherwise, false. + + + + Gets or sets a value indicating whether this is writable. + + true if writable; otherwise, false. + + + + Gets or sets a value indicating whether this has a member attribute. + + true if has a member attribute; otherwise, false. + + + + Gets the default value. + + The default value. + + + + Gets or sets a value indicating whether this is required. + + A value indicating whether this is required. + + + + Gets or sets a value indicating whether this property preserves object references. + + + true if this instance is reference; otherwise, false. + + + + + Gets or sets the property null value handling. + + The null value handling. + + + + Gets or sets the property default value handling. + + The default value handling. + + + + Gets or sets the property reference loop handling. + + The reference loop handling. + + + + Gets or sets the property object creation handling. + + The object creation handling. + + + + Gets or sets or sets the type name handling. + + The type name handling. + + + + Gets or sets a predicate used to determine whether the property should be serialize. + + A predicate used to determine whether the property should be serialize. + + + + Gets or sets a predicate used to determine whether the property should be deserialized. + + A predicate used to determine whether the property should be deserialized. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets an action used to set whether the property has been deserialized. + + An action used to set whether the property has been deserialized. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Gets or sets the converter used when serializing the property's collection items. + + The collection's items converter. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Gets or sets the the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets the the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + A collection of objects. + + + + + Initializes a new instance of the class. + + The type. + + + + When implemented in a derived class, extracts the key from the specified element. + + The element from which to extract the key. + The key for the specified element. + + + + Adds a object. + + The property to add to the collection. + + + + Gets the closest matching object. + First attempts to get an exact case match of propertyName and then + a case insensitive match. + + Name of the property. + A matching property if found. + + + + Gets a property by property name. + + The name of the property to get. + Type property name string comparison. + A matching property if found. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Lookup and create an instance of the JsonConverter type described by the argument. + + The JsonConverter type to create. + Optional arguments to pass to an initializing constructor of the JsonConverter. + If null, the default constructor is used. + + + + Create a factory function that can be used to create instances of a JsonConverter described by the + argument type. The returned function can then be used to either invoke the converter's default ctor, or any + parameterized constructors by way of an object array. + + + + + Represents a trace writer that writes to memory. When the trace message limit is + reached then old trace messages will be removed as new messages are added. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of Info will exclude Verbose messages and include Info, + Warning and Error messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Initializes a new instance of the class. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Returns an enumeration of the most recent trace messages. + + An enumeration of the most recent trace messages. + + + + Returns a of the most recent trace messages. + + + A of the most recent trace messages. + + + + + Represents a method that constructs an object. + + The object type to create. + + + + When applied to a method, specifies that the method is called when an error occurs serializing an object. + + + + + Provides methods to get attributes from a , , or . + + + + + Initializes a new instance of the class. + + The instance to get attributes for. This parameter should be a , , or . + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Get and set values for a using reflection. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Specifies how strings are escaped when writing JSON text. + + + + + Only control characters (e.g. newline) are escaped. + + + + + All non-ASCII and control characters (e.g. newline) are escaped. + + + + + HTML (<, >, &, ', ") and control characters (e.g. newline) are escaped. + + + + + Specifies what messages to output for the class. + + + + + Output no tracing and debugging messages. + + + + + Output error-handling messages. + + + + + Output warnings and error-handling messages. + + + + + Output informational messages, warnings, and error-handling messages. + + + + + Output all debugging and tracing messages. + + + + + Specifies type name handling options for the . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than TypeNameHandling.None. + + + + + Do not include the .NET type name when serializing types. + + + + + Include the .NET type name when serializing into a JSON object structure. + + + + + Include the .NET type name when serializing into a JSON array structure. + + + + + Always include the .NET type name when serializing. + + + + + Include the .NET type name when the type of the object being serialized is not the same as its declared type. + + + + + Determines whether the collection is null or empty. + + The collection. + + true if the collection is null or empty; otherwise, false. + + + + + Adds the elements of the specified collection to the specified generic IList. + + The list to add to. + The collection of elements to add. + + + + Converts the value to the specified type. If the value is unable to be converted, the + value is checked whether it assignable to the specified type. + + The value to convert. + The culture to use when converting. + The type to convert or cast the value to. + + The converted type. If conversion was unsuccessful, the initial value + is returned if assignable to the target type. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic that returns a result + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Returns a Restrictions object which includes our current restrictions merged + with a restriction limiting our type + + + + + Gets a dictionary of the names and values of an Enum type. + + + + + + Gets a dictionary of the names and values of an Enum type. + + The enum type to get names and values for. + + + + + Gets the type of the typed collection's items. + + The type. + The type of the typed collection's items. + + + + Gets the member's underlying type. + + The member. + The underlying type of the member. + + + + Determines whether the member is an indexed property. + + The member. + + true if the member is an indexed property; otherwise, false. + + + + + Determines whether the property is an indexed property. + + The property. + + true if the property is an indexed property; otherwise, false. + + + + + Gets the member's value on the object. + + The member. + The target object. + The member's value on the object. + + + + Sets the member's value on the target object. + + The member. + The target. + The value. + + + + Determines whether the specified MemberInfo can be read. + + The MemberInfo to determine whether can be read. + /// if set to true then allow the member to be gotten non-publicly. + + true if the specified MemberInfo can be read; otherwise, false. + + + + + Determines whether the specified MemberInfo can be set. + + The MemberInfo to determine whether can be set. + if set to true then allow the member to be set non-publicly. + if set to true then allow the member to be set if read-only. + + true if the specified MemberInfo can be set; otherwise, false. + + + + + Builds a string. Unlike StringBuilder this class lets you reuse it's internal buffer. + + + + + Determines whether the string is all white space. Empty string will return false. + + The string to test whether it is all white space. + + true if the string is all white space; otherwise, false. + + + + + Nulls an empty string. + + The string. + Null if the string was null, otherwise the string unchanged. + + + + Specifies the state of the . + + + + + An exception has been thrown, which has left the in an invalid state. + You may call the method to put the in the Closed state. + Any other method calls results in an being thrown. + + + + + The method has been called. + + + + + An object is being written. + + + + + A array is being written. + + + + + A constructor is being written. + + + + + A property is being written. + + + + + A write method has not been called. + + + + + Indicates the method that will be used during deserialization for locating and loading assemblies. + + + + + In simple mode, the assembly used during deserialization need not match exactly the assembly used during serialization. Specifically, the version numbers need not match as the LoadWithPartialName method is used to load the assembly. + + + + + In full mode, the assembly used during deserialization must match exactly the assembly used during serialization. The Load method of the Assembly class is used to load the assembly. + + + + diff --git a/Assets/JsonDotNet/Assemblies/Windows/Newtonsoft.Json.XML.meta b/Assets/JsonDotNet/Assemblies/Windows/Newtonsoft.Json.XML.meta new file mode 100644 index 0000000..c4619d0 --- /dev/null +++ b/Assets/JsonDotNet/Assemblies/Windows/Newtonsoft.Json.XML.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 36f7323c55864364d8bb88c736e4bca6 +timeCreated: 1466788355 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/JsonDotNet/Assemblies/Windows/Newtonsoft.Json.dll b/Assets/JsonDotNet/Assemblies/Windows/Newtonsoft.Json.dll new file mode 100644 index 0000000..05a0d4b Binary files /dev/null and b/Assets/JsonDotNet/Assemblies/Windows/Newtonsoft.Json.dll differ diff --git a/Assets/JsonDotNet/Assemblies/Windows/Newtonsoft.Json.dll.meta b/Assets/JsonDotNet/Assemblies/Windows/Newtonsoft.Json.dll.meta new file mode 100644 index 0000000..b91baae --- /dev/null +++ b/Assets/JsonDotNet/Assemblies/Windows/Newtonsoft.Json.dll.meta @@ -0,0 +1,67 @@ +fileFormatVersion: 2 +guid: 9b6ba260dada0ea4a871a42011f8b87d +timeCreated: 1466788355 +licenseType: Store +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + platformData: + Android: + enabled: 0 + settings: + CPU: AnyCPU + Any: + enabled: 0 + settings: {} + Editor: + enabled: 0 + settings: + CPU: AnyCPU + DefaultValueInitialized: true + OS: AnyOS + Linux: + enabled: 0 + settings: + CPU: x86 + Linux64: + enabled: 0 + settings: + CPU: x86_64 + OSXIntel: + enabled: 0 + settings: + CPU: AnyCPU + OSXIntel64: + enabled: 0 + settings: + CPU: AnyCPU + SamsungTV: + enabled: 0 + settings: + STV_MODEL: STANDARD_13 + Win: + enabled: 0 + settings: + CPU: AnyCPU + Win64: + enabled: 0 + settings: + CPU: AnyCPU + WindowsStoreApps: + enabled: 1 + settings: + CPU: AnyCPU + DontProcess: False + PlaceholderPath: Assets/JsonDotNet/Assemblies/Standalone/Newtonsoft.Json.dll + SDK: AnySDK + ScriptingBackend: DotNet + iOS: + enabled: 0 + settings: + CompileFlags: + FrameworkDependencies: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/JsonDotNet/Documentation.meta b/Assets/JsonDotNet/Documentation.meta new file mode 100644 index 0000000..cda8075 --- /dev/null +++ b/Assets/JsonDotNet/Documentation.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 76f828f47ce26cc43991113c6a39dbbf +folderAsset: yes +timeCreated: 1466010535 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/JsonDotNet/Documentation/Json Net for Unity 2.0.1.pdf b/Assets/JsonDotNet/Documentation/Json Net for Unity 2.0.1.pdf new file mode 100644 index 0000000..4f7651d Binary files /dev/null and b/Assets/JsonDotNet/Documentation/Json Net for Unity 2.0.1.pdf differ diff --git a/Assets/JsonDotNet/Documentation/Json Net for Unity 2.0.1.pdf.meta b/Assets/JsonDotNet/Documentation/Json Net for Unity 2.0.1.pdf.meta new file mode 100644 index 0000000..e5d0257 --- /dev/null +++ b/Assets/JsonDotNet/Documentation/Json Net for Unity 2.0.1.pdf.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4e7d9a07cc3f02a41a575406e7230846 +timeCreated: 1466788421 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/JsonDotNet/JsonDotNet201Source.zip b/Assets/JsonDotNet/JsonDotNet201Source.zip new file mode 100644 index 0000000..23b699a Binary files /dev/null and b/Assets/JsonDotNet/JsonDotNet201Source.zip differ diff --git a/Assets/JsonDotNet/JsonDotNet201Source.zip.meta b/Assets/JsonDotNet/JsonDotNet201Source.zip.meta new file mode 100644 index 0000000..c846be6 --- /dev/null +++ b/Assets/JsonDotNet/JsonDotNet201Source.zip.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9a6f8c7c1ea72ce46831c5e1b6150d0c +timeCreated: 1466790933 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/JsonDotNet/link.xml b/Assets/JsonDotNet/link.xml new file mode 100644 index 0000000..cf188f8 --- /dev/null +++ b/Assets/JsonDotNet/link.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Assets/JsonDotNet/link.xml.meta b/Assets/JsonDotNet/link.xml.meta new file mode 100644 index 0000000..1e0e273 --- /dev/null +++ b/Assets/JsonDotNet/link.xml.meta @@ -0,0 +1,6 @@ +fileFormatVersion: 2 +guid: 06314f49bdda26043963578d60a0a7ee +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NuGet.config b/Assets/NuGet.config new file mode 100644 index 0000000..ca70369 --- /dev/null +++ b/Assets/NuGet.config @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Assets/NuGet.config.meta b/Assets/NuGet.config.meta new file mode 100644 index 0000000..f4eef4d --- /dev/null +++ b/Assets/NuGet.config.meta @@ -0,0 +1,32 @@ +fileFormatVersion: 2 +guid: 5cc05c52565f25146a4a06af974ea38d +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Override Controller.overrideController b/Assets/Override Controller.overrideController new file mode 100644 index 0000000..ee4a728 --- /dev/null +++ b/Assets/Override Controller.overrideController @@ -0,0 +1,15 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!221 &22100000 +AnimatorOverrideController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Override Controller + m_Controller: {fileID: 9100000, guid: 7246327de0f250c4f86276bece4ffd47, type: 2} + m_Clips: + - m_OriginalClip: {fileID: 7400000, guid: 82294251fb277ec408c8be9afa890897, type: 2} + m_OverrideClip: {fileID: 0} + - m_OriginalClip: {fileID: 7400000, guid: 882c60c955de4f24ab7bbe6ba32a59ea, type: 2} + m_OverrideClip: {fileID: 0} diff --git a/Assets/Override Controller.overrideController.meta b/Assets/Override Controller.overrideController.meta new file mode 100644 index 0000000..37c0c47 --- /dev/null +++ b/Assets/Override Controller.overrideController.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0919e19fb8da694419976b32618b1731 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ParticleAdditive.mat b/Assets/ParticleAdditive.mat new file mode 100644 index 0000000..37b2637 --- /dev/null +++ b/Assets/ParticleAdditive.mat @@ -0,0 +1,99 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: ParticleAdditive + m_Shader: {fileID: 211, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _ALPHABLEND_ON + m_LightmapFlags: 0 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 3000 + stringTagMap: + RenderType: Transparent + disabledShaderPasses: + - ALWAYS + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BlendOp: 0 + - _BumpScale: 1 + - _CameraFadingEnabled: 0 + - _CameraFarFadeDistance: 2 + - _CameraNearFadeDistance: 1 + - _ColorMode: 0 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DistortionBlend: 0.5 + - _DistortionEnabled: 0 + - _DistortionStrength: 1 + - _DistortionStrengthScaled: 0 + - _DstBlend: 1 + - _EmissionEnabled: 0 + - _FlipbookMode: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _LightingEnabled: 0 + - _Metallic: 0 + - _Mode: 4 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SoftParticlesEnabled: 0 + - _SoftParticlesFarFadeDistance: 1 + - _SoftParticlesNearFadeDistance: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 5 + - _UVSec: 0 + - _ZWrite: 0 + m_Colors: + - _CameraFadeParams: {r: 0, g: Infinity, b: 0, a: 0} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _ColorAddSubDiff: {r: 0, g: 0, b: 0, a: 0} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SoftParticleFadeParams: {r: 0, g: 0, b: 0, a: 0} + m_BuildTextureStacks: [] diff --git a/Assets/ParticleAdditive.mat.meta b/Assets/ParticleAdditive.mat.meta new file mode 100644 index 0000000..68609b8 --- /dev/null +++ b/Assets/ParticleAdditive.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1bac49c670089404fb108d9219385a04 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins.meta b/Assets/Plugins.meta new file mode 100644 index 0000000..3780a70 --- /dev/null +++ b/Assets/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5b84c09358da2e14eb4f7d56759955a9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Android.meta b/Assets/Plugins/Android.meta new file mode 100644 index 0000000..2c22357 --- /dev/null +++ b/Assets/Plugins/Android.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5e3226f0e08166440a0b72d22dbe8041 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Android/AndroidManifest.xml b/Assets/Plugins/Android/AndroidManifest.xml new file mode 100644 index 0000000..aa55c60 --- /dev/null +++ b/Assets/Plugins/Android/AndroidManifest.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Assets/Plugins/Android/AndroidManifest.xml.meta b/Assets/Plugins/Android/AndroidManifest.xml.meta new file mode 100644 index 0000000..5f96681 --- /dev/null +++ b/Assets/Plugins/Android/AndroidManifest.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6f847bc00b9e16b48be78c70e9406e14 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/WebGL.meta b/Assets/Plugins/WebGL.meta new file mode 100644 index 0000000..627f081 --- /dev/null +++ b/Assets/Plugins/WebGL.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3aec1ffd6a9dca044905ba064134ff78 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/WebGL/DownloadFile.jslib b/Assets/Plugins/WebGL/DownloadFile.jslib new file mode 100644 index 0000000..83e00cc --- /dev/null +++ b/Assets/Plugins/WebGL/DownloadFile.jslib @@ -0,0 +1,23 @@ +var DownloadFilePlugin = { + DownloadFileJsLib : function(array, size, fileNamePtr) + { + var fileName = UTF8ToString(fileNamePtr); + + var bytes = new Uint8Array(size); + for (var i = 0; i < size; i++) + { + bytes[i] = HEAPU8[array + i]; + } + + var blob = new Blob([bytes]); + var link = document.createElement('a'); + link.href = window.URL.createObjectURL(blob); + link.download = fileName; + + var event = document.createEvent("MouseEvents"); + event.initMouseEvent("click"); + link.dispatchEvent(event); + window.URL.revokeObjectURL(link.href); + } +}; +mergeInto(LibraryManager.library, DownloadFilePlugin); \ No newline at end of file diff --git a/Assets/Plugins/WebGL/DownloadFile.jslib.meta b/Assets/Plugins/WebGL/DownloadFile.jslib.meta new file mode 100644 index 0000000..9629f46 --- /dev/null +++ b/Assets/Plugins/WebGL/DownloadFile.jslib.meta @@ -0,0 +1,32 @@ +fileFormatVersion: 2 +guid: c10c80cdf256ba54ca9ee842cf79dd7b +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/WebGL/TransparentBackground.jslib b/Assets/Plugins/WebGL/TransparentBackground.jslib new file mode 100644 index 0000000..d446e21 --- /dev/null +++ b/Assets/Plugins/WebGL/TransparentBackground.jslib @@ -0,0 +1,15 @@ +// https://support.unity.com/hc/en-us/articles/208892946-How-can-I-make-the-canvas-transparent-on-WebGL- +var LibraryGLClear = { + glClear: function(mask) + { + if (mask == 0x00004000) + { + var v = GLctx.getParameter(GLctx.COLOR_WRITEMASK); + if (!v[0] && !v[1] && !v[2] && v[3]) + // We are trying to clear alpha only -- skip. + return; + } + GLctx.clear(mask); + } +}; +mergeInto(LibraryManager.library, LibraryGLClear); \ No newline at end of file diff --git a/Assets/Plugins/WebGL/TransparentBackground.jslib.meta b/Assets/Plugins/WebGL/TransparentBackground.jslib.meta new file mode 100644 index 0000000..bc2d79b --- /dev/null +++ b/Assets/Plugins/WebGL/TransparentBackground.jslib.meta @@ -0,0 +1,69 @@ +fileFormatVersion: 2 +guid: 4f7905633b54f854baf3b5a3525007c9 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + : Any + second: + enabled: 0 + settings: + Exclude Editor: 1 + Exclude Linux64: 1 + Exclude OSXUniversal: 1 + Exclude WebGL: 1 + Exclude Win: 1 + Exclude Win64: 1 + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + CPU: AnyCPU + DefaultValueInitialized: true + OS: AnyOS + - first: + Standalone: Linux64 + second: + enabled: 0 + settings: + CPU: None + - first: + Standalone: OSXUniversal + second: + enabled: 0 + settings: + CPU: None + - first: + Standalone: Win + second: + enabled: 0 + settings: + CPU: x86 + - first: + Standalone: Win64 + second: + enabled: 0 + settings: + CPU: x86_64 + - first: + WebGL: WebGL + second: + enabled: 0 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/WebGL/UploadFile.jslib b/Assets/Plugins/WebGL/UploadFile.jslib new file mode 100644 index 0000000..32ac6cf --- /dev/null +++ b/Assets/Plugins/WebGL/UploadFile.jslib @@ -0,0 +1,165 @@ +var UploadFilePlugin = { + UploadFileJsLib: function(gameObjectName, methodName, fileExtension) { + var gameObject = UTF8ToString(gameObjectName); + var method = UTF8ToString(methodName); + var format = UTF8ToString(fileExtension); + var unitycanvas = document.getElementById('unity-canvas'); + if(!document.getElementById('UploadFileInput')) + { + var fileInput = document.createElement('input'); + fileInput.setAttribute('type', 'file'); + fileInput.setAttribute('id', 'UploadFileInput'); + fileInput.setAttribute('accept', 'image/x-png, image/jpeg, image/jpg'); + fileInput.style.visibility = 'hidden'; + fileInput.style.display = 'none'; + fileInput.onclick = function (event) + { + this.value = null; + var element = document.getElementById('UploadFileInput'); + element.parentNode.removeChild(element); + unitycanvas.removeEventListener('click', OpenFileDialog, false); + }; + fileInput.onchange = function (event) + { + if(event.target.value != null) + { + var fn = event.target.files[0].name; + var ext = fn.substring(fn.lastIndexOf('.')+1, fn.length) + console.log('Filename: '+event.target.files[0].name+' / Extension: '+ext); + var arr = JSON.stringify({"blob":URL.createObjectURL(event.target.files[0]), "name":event.target.files[0].name}); + if(ext == format) SendMessage(gameObject, method, arr); + else console.log('File extension not allowed: '+ext); + } + }; + document.body.appendChild(fileInput); + } + var OpenFileDialog = function() + { + document.getElementById('UploadFileInput').click(); + }; + unitycanvas.addEventListener('click', OpenFileDialog, false); + }, + UploadTextureJsLib: function(gameObjectName, methodName, maxSize, imageFormat) { + var gameObject = UTF8ToString(gameObjectName); + var method = UTF8ToString(methodName); + var format = UTF8ToString(imageFormat); + var unitycanvas = document.getElementById('unity-canvas'); + if(!document.getElementById('UploadTextureInput')) + { + var fileInput = document.createElement('input'); + fileInput.setAttribute('type', 'file'); + fileInput.setAttribute('id', 'UploadTextureInput'); + if(format == "png") + { + fileInput.setAttribute('accept', '.png'); + } + else + { + fileInput.setAttribute('accept', '.jpg, .jpeg, .png'); + } + fileInput.style.visibility = 'hidden'; + fileInput.style.display = 'none'; + fileInput.onclick = function (event) + { + this.value = null; + var element = document.getElementById('UploadTextureInput'); + element.parentNode.removeChild(element); + unitycanvas.removeEventListener('click', OpenFileDialog, false); + }; + fileInput.onchange = function (event) + { + if(event.target.value != null) + { + var fn = event.target.files[0].name; + var ext = fn.substring(fn.lastIndexOf('.')+1, fn.length) + console.log('Filename: '+event.target.files[0].name+' / Extension: '+ext); + if((format == "png" && ext == format) || (format == "jpg" && (ext == format || ext == "jpeg" || ext == "png"))) + { + format = ext; + var arr = JSON.stringify({"blob":URL.createObjectURL(event.target.files[0]), "name":event.target.files[0].name}); + if(maxSize > 0) resize_image(event.target.files[0]) + else SendMessage(gameObject, method, arr); + } + else console.log('File extension not allowed: '+ext); + } + }; + document.body.appendChild(fileInput); + } + var OpenFileDialog = function() + { + document.getElementById('UploadTextureInput').click(); + }; + unitycanvas.addEventListener('click', OpenFileDialog, false); + + //resize image function + function resize_image(file) + { + var reader = new FileReader(); + reader.onloadend = function() + { + var tempImg = new Image(); + tempImg.src = reader.result; + tempImg.onload = function() + { + var tempW = tempImg.width; + var tempH = tempImg.height; + if (tempW > tempH) + { + if (tempW > maxSize) + { + tempH *= maxSize / tempW; + tempW = maxSize; + } + } + else + { + if (tempH > maxSize) + { + tempW *= maxSize / tempH; + tempH = maxSize; + } + } + var dataURL = ""; + var newBLOB = null; + try + { + if(document.getElementById('img-canvas')) document.getElementById('img-canvas').remove(); + var canvas = document.createElement('canvas'); + canvas.setAttribute('id', 'img-canvas'); + canvas.width = tempW; + canvas.height = tempH; + var ctx = canvas.getContext("2d"); + ctx.drawImage(this, 0, 0, tempW, tempH); + if(format == "png") dataURL = canvas.toDataURL("image/png"); + else dataURL = canvas.toDataURL("image/jpeg"); + function dataURItoBlob(dataURI) + { + var mime = dataURI.split(',')[0].split(':')[1].split(';')[0]; + var binary = atob(dataURI.split(',')[1]); + var array = []; + for (var i = 0; i < binary.length; i++) + { + array.push(binary.charCodeAt(i)); + } + return new Blob([new Uint8Array(array)], {type: mime}); + } + newBLOB = ((window.URL || window.webkitURL) || URL).createObjectURL(dataURItoBlob(dataURL)); + } + catch(err) + { + alert('Error: ' + err.message); + } + finally + { + if(newBLOB === null) alert('Error: Empty URL...'); + + var arr = JSON.stringify({"blob":newBLOB, "name":event.target.files[0].name}); + SendMessage(gameObject, method, arr); + } + }//end tempImg.onload + }//end reader.onloadend + reader.readAsDataURL(file); + }//end resize_image + }//end UploadTexture +}; +mergeInto(LibraryManager.library, UploadFilePlugin); \ No newline at end of file diff --git a/Assets/Plugins/WebGL/UploadFile.jslib.meta b/Assets/Plugins/WebGL/UploadFile.jslib.meta new file mode 100644 index 0000000..e00b134 --- /dev/null +++ b/Assets/Plugins/WebGL/UploadFile.jslib.meta @@ -0,0 +1,32 @@ +fileFormatVersion: 2 +guid: 7a7270b7edd8db1459b5d058d3d76f70 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + WebGL: WebGL + second: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/libapng.meta b/Assets/Plugins/libapng.meta new file mode 100644 index 0000000..3d73604 --- /dev/null +++ b/Assets/Plugins/libapng.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6c1aa30ed76f0414098c23d2d01e12b7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs.meta b/Assets/Prefabs.meta new file mode 100644 index 0000000..815aab4 --- /dev/null +++ b/Assets/Prefabs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a9517545de08a714ea98c139b1ec8f7e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/Camera.prefab b/Assets/Prefabs/Camera.prefab new file mode 100644 index 0000000..1210e07 --- /dev/null +++ b/Assets/Prefabs/Camera.prefab @@ -0,0 +1,84 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &2643716285177954892 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2643716285177954889} + - component: {fileID: 2643716285177954894} + - component: {fileID: 2643716285177954895} + m_Layer: 0 + m_Name: Camera + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2643716285177954889 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2643716285177954892} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 20.3, z: -39} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!20 &2643716285177954894 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2643716285177954892} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0} + m_projectionMatrixMode: 1 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_GateFitMode: 2 + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0.24 + y: 0 + width: 0.56 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 1 + orthographic size: 20.27 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!81 &2643716285177954895 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2643716285177954892} + m_Enabled: 1 diff --git a/Assets/Prefabs/Camera.prefab.meta b/Assets/Prefabs/Camera.prefab.meta new file mode 100644 index 0000000..94f9630 --- /dev/null +++ b/Assets/Prefabs/Camera.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6e92b65c635811545b96e40e5ce028a6 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/TogglePanel.prefab b/Assets/Prefabs/TogglePanel.prefab new file mode 100644 index 0000000..7b2aa35 --- /dev/null +++ b/Assets/Prefabs/TogglePanel.prefab @@ -0,0 +1,833 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &2483047302050765209 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1273916970115783418} + - component: {fileID: 4876819883808034812} + - component: {fileID: 2915133226976636062} + - component: {fileID: 4280510029476076582} + m_Layer: 5 + m_Name: TogglePanel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1273916970115783418 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2483047302050765209} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 5455786334746280101} + - {fileID: 5455786334812910317} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -39.5} + m_SizeDelta: {x: 0.0000038146973, y: -1059} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4876819883808034812 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2483047302050765209} + m_CullTransparentMesh: 1 +--- !u!114 &2915133226976636062 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2483047302050765209} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &4280510029476076582 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2483047302050765209} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 1 + m_Spacing: -56.92 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &5455786332966004592 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5455786332966004593} + m_Layer: 5 + m_Name: Handle Slide Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5455786332966004593 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5455786332966004592} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 5455786334096184176} + m_Father: {fileID: 5455786334812910317} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &5455786333163586981 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5455786333163586978} + - component: {fileID: 5455786333163586976} + - component: {fileID: 5455786333163586979} + m_Layer: 5 + m_Name: Fill + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5455786333163586978 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5455786333163586981} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 5455786334070537535} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 10, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5455786333163586976 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5455786333163586981} + m_CullTransparentMesh: 0 +--- !u!114 &5455786333163586979 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5455786333163586981} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &5455786333257345762 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5455786333257345763} + - component: {fileID: 5455786333257345761} + - component: {fileID: 5455786333257345760} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5455786333257345763 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5455786333257345762} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 5455786334812910317} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5455786333257345761 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5455786333257345762} + m_CullTransparentMesh: 0 +--- !u!114 &5455786333257345760 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5455786333257345762} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &5455786333764296788 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5455786333764296789} + - component: {fileID: 5455786333764296787} + - component: {fileID: 5455786333764296786} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5455786333764296789 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5455786333764296788} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 5455786334629437974} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5455786333764296787 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5455786333764296788} + m_CullTransparentMesh: 0 +--- !u!114 &5455786333764296786 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5455786333764296788} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &5455786334070537534 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5455786334070537535} + m_Layer: 5 + m_Name: Fill Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5455786334070537535 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5455786334070537534} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 5455786333163586978} + m_Father: {fileID: 5455786334812910317} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: -5, y: 0} + m_SizeDelta: {x: -20, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &5455786334096184179 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5455786334096184176} + - component: {fileID: 5455786334096184177} + - component: {fileID: 5455786334096184190} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5455786334096184176 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5455786334096184179} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 5455786332966004593} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5455786334096184177 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5455786334096184179} + m_CullTransparentMesh: 0 +--- !u!114 &5455786334096184190 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5455786334096184179} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &5455786334441902874 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5455786334441902875} + - component: {fileID: 5455786334441902873} + - component: {fileID: 5455786334441902872} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5455786334441902875 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5455786334441902874} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 5455786334746280101} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 89, y: -10.5} + m_SizeDelta: {x: 132, y: 17} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5455786334441902873 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5455786334441902874} + m_CullTransparentMesh: 0 +--- !u!114 &5455786334441902872 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5455786334441902874} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: B1 +--- !u!1 &5455786334629437993 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5455786334629437974} + - component: {fileID: 5455786334629437972} + - component: {fileID: 5455786334629437975} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5455786334629437974 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5455786334629437993} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 5455786333764296789} + m_Father: {fileID: 5455786334746280101} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 10, y: -10} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5455786334629437972 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5455786334629437993} + m_CullTransparentMesh: 0 +--- !u!114 &5455786334629437975 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5455786334629437993} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &5455786334746280100 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5455786334746280101} + - component: {fileID: 5455786334746280098} + m_Layer: 5 + m_Name: Toggle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5455786334746280101 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5455786334746280100} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 5455786334629437974} + - {fileID: 5455786334441902875} + m_Father: {fileID: 1273916970115783418} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &5455786334746280098 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5455786334746280100} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 5455786334629437975} + toggleTransition: 1 + graphic: {fileID: 5455786333764296786} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 0} + m_TargetAssemblyTypeName: AnimController, Assembly-CSharp + m_MethodName: startAnim + m_Mode: 3 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + m_IsOn: 0 +--- !u!1 &5455786334812910319 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5455786334812910317} + - component: {fileID: 5455786334812910316} + m_Layer: 5 + m_Name: Slider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5455786334812910317 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5455786334812910319} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 5455786333257345763} + - {fileID: 5455786334070537535} + - {fileID: 5455786332966004593} + m_Father: {fileID: 1273916970115783418} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 115.68, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &5455786334812910316 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5455786334812910319} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 5455786334096184190} + m_FillRect: {fileID: 5455786333163586978} + m_HandleRect: {fileID: 5455786334096184176} + m_Direction: 0 + m_MinValue: 0 + m_MaxValue: 5 + m_WholeNumbers: 0 + m_Value: 1 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 0} + m_TargetAssemblyTypeName: AnimController, Assembly-CSharp + m_MethodName: changeSpeed + m_Mode: 3 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 diff --git a/Assets/Prefabs/TogglePanel.prefab.meta b/Assets/Prefabs/TogglePanel.prefab.meta new file mode 100644 index 0000000..f7dd681 --- /dev/null +++ b/Assets/Prefabs/TogglePanel.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a13150b5bf8834e48888c9d65bf8c45c +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources.meta b/Assets/Resources.meta new file mode 100644 index 0000000..1463751 --- /dev/null +++ b/Assets/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 36fc02c039d2df34ba15eeda1f71f4e9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/39510.bytes b/Assets/Resources/39510.bytes new file mode 100644 index 0000000..96eae90 Binary files /dev/null and b/Assets/Resources/39510.bytes differ diff --git a/Assets/Resources/39510.bytes.meta b/Assets/Resources/39510.bytes.meta new file mode 100644 index 0000000..3e09e5c --- /dev/null +++ b/Assets/Resources/39510.bytes.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9a1e19c65f9ff0f4bbbe82ded49fa582 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/CostumeContainer.prefab b/Assets/Resources/CostumeContainer.prefab new file mode 100644 index 0000000..fba9a5f --- /dev/null +++ b/Assets/Resources/CostumeContainer.prefab @@ -0,0 +1,409 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &269644721433666747 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1544482334689097633} + - component: {fileID: 8471379317459450286} + - component: {fileID: 8328382684265022784} + - component: {fileID: 1140435749176685464} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1544482334689097633 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 269644721433666747} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 3032924066208325113} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &8471379317459450286 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 269644721433666747} + m_CullTransparentMesh: 1 +--- !u!114 &8328382684265022784 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 269644721433666747} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1140435749176685464 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 269644721433666747} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 8328382684265022784} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &546581852058831155 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3032924066208325113} + - component: {fileID: 6080550738025595584} + - component: {fileID: -3914672698461002814} + m_Layer: 5 + m_Name: CostumeContainer + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3032924066208325113 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 546581852058831155} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2910472484422425129} + - {fileID: 8280903987976552003} + - {fileID: 1544482334689097633} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 160} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6080550738025595584 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 546581852058831155} + m_CullTransparentMesh: 1 +--- !u!114 &-3914672698461002814 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 546581852058831155} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &5648301406189857772 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8280903987976552003} + - component: {fileID: 6210033884412067720} + - component: {fileID: 4950420759908701312} + m_Layer: 5 + m_Name: Name + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8280903987976552003 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5648301406189857772} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 3032924066208325113} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 305, y: -80} + m_SizeDelta: {x: 295, y: 140} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6210033884412067720 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5648301406189857772} + m_CullTransparentMesh: 1 +--- !u!114 &4950420759908701312 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5648301406189857772} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 123321123 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 42.05 + m_fontSizeBase: 48 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 48 + m_fontStyle: 1 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &9048731633154384619 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2910472484422425129} + - component: {fileID: 222263388974751596} + - component: {fileID: 2594458429713344427} + m_Layer: 5 + m_Name: Face + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2910472484422425129 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9048731633154384619} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 3032924066208325113} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 80, y: -80} + m_SizeDelta: {x: 140, y: 140} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &222263388974751596 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9048731633154384619} + m_CullTransparentMesh: 1 +--- !u!114 &2594458429713344427 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9048731633154384619} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 diff --git a/Assets/Resources/CostumeContainer.prefab.meta b/Assets/Resources/CostumeContainer.prefab.meta new file mode 100644 index 0000000..ba304eb --- /dev/null +++ b/Assets/Resources/CostumeContainer.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b431e74c8f36fe949b79836e79a472da +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/DatabaseContainer.prefab b/Assets/Resources/DatabaseContainer.prefab new file mode 100644 index 0000000..e9f1ce4 --- /dev/null +++ b/Assets/Resources/DatabaseContainer.prefab @@ -0,0 +1,333 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &269644721433666747 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1544482334689097633} + - component: {fileID: 8471379317459450286} + - component: {fileID: 8328382684265022784} + - component: {fileID: 1140435749176685464} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1544482334689097633 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 269644721433666747} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 8280903987976552003} + m_Father: {fileID: 3032924066208325113} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &8471379317459450286 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 269644721433666747} + m_CullTransparentMesh: 1 +--- !u!114 &8328382684265022784 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 269644721433666747} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1140435749176685464 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 269644721433666747} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 8328382684265022784} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &546581852058831155 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3032924066208325113} + - component: {fileID: 6080550738025595584} + - component: {fileID: -3914672698461002814} + m_Layer: 5 + m_Name: DatabaseContainer + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3032924066208325113 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 546581852058831155} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1544482334689097633} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 470, y: 100} + m_Pivot: {x: 0, y: 0} +--- !u!222 &6080550738025595584 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 546581852058831155} + m_CullTransparentMesh: 1 +--- !u!114 &-3914672698461002814 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 546581852058831155} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &5648301406189857772 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8280903987976552003} + - component: {fileID: 6210033884412067720} + - component: {fileID: 4950420759908701312} + m_Layer: 5 + m_Name: Name + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8280903987976552003 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5648301406189857772} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1544482334689097633} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6210033884412067720 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5648301406189857772} + m_CullTransparentMesh: 1 +--- !u!114 &4950420759908701312 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5648301406189857772} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Atlas Academy + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 48 + m_fontSizeBase: 48 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 48 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} diff --git a/Assets/Resources/DatabaseContainer.prefab.meta b/Assets/Resources/DatabaseContainer.prefab.meta new file mode 100644 index 0000000..52a5a73 --- /dev/null +++ b/Assets/Resources/DatabaseContainer.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 7a063a8dfe272054994f335656dddcec +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/ErrorText.prefab b/Assets/Resources/ErrorText.prefab new file mode 100644 index 0000000..b725d28 --- /dev/null +++ b/Assets/Resources/ErrorText.prefab @@ -0,0 +1,93 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &6479342721563695892 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6479342721563695895} + - component: {fileID: 6479342721563695889} + - component: {fileID: 6479342721563695894} + m_Layer: 5 + m_Name: ErrorText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6479342721563695895 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6479342721563695892} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 400, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6479342721563695889 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6479342721563695892} + m_CullTransparentMesh: 1 +--- !u!114 &6479342721563695894 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6479342721563695892} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 0, b: 0, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 50 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 60 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 0 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'New Texta + + a + + a + + a + + a + + a + +' diff --git a/Assets/Resources/ErrorText.prefab.meta b/Assets/Resources/ErrorText.prefab.meta new file mode 100644 index 0000000..b6b0edc --- /dev/null +++ b/Assets/Resources/ErrorText.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8897396d11e6956439a1901b7e4cf1a5 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/MeshToggle.prefab b/Assets/Resources/MeshToggle.prefab new file mode 100644 index 0000000..9faba98 --- /dev/null +++ b/Assets/Resources/MeshToggle.prefab @@ -0,0 +1,449 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &2672712937761550937 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 797933732813302693} + - component: {fileID: 340048000906473966} + m_Layer: 5 + m_Name: Toggle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &797933732813302693 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2672712937761550937} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 3786017647449105987} + - {fileID: 7523563852095254119} + m_Father: {fileID: 8386370709772443615} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &340048000906473966 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2672712937761550937} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 2337758357658385124} + toggleTransition: 1 + graphic: {fileID: 1260606432677892517} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 1 +--- !u!1 &2685671113665461738 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2468537567894287840} + - component: {fileID: 6889922747984538568} + - component: {fileID: 1260606432677892517} + m_Layer: 5 + m_Name: Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2468537567894287840 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2685671113665461738} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 3786017647449105987} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6889922747984538568 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2685671113665461738} + m_CullTransparentMesh: 1 +--- !u!114 &1260606432677892517 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2685671113665461738} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &3250018106204258943 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7523563852095254119} + - component: {fileID: 4570863220087094537} + - component: {fileID: 3923246709878035687} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7523563852095254119 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3250018106204258943} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 797933732813302693} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 47.5, y: 0} + m_SizeDelta: {x: -95, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4570863220087094537 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3250018106204258943} + m_CullTransparentMesh: 1 +--- !u!114 &3923246709878035687 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3250018106204258943} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: New Text + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 45 + m_fontSizeBase: 45 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 1 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &3920107843660720169 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8386370709772443615} + - component: {fileID: 5258480183764969739} + - component: {fileID: 3838442685695678169} + m_Layer: 5 + m_Name: MeshToggle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8386370709772443615 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3920107843660720169} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 797933732813302693} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 125} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5258480183764969739 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3920107843660720169} + m_CullTransparentMesh: 1 +--- !u!114 &3838442685695678169 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3920107843660720169} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &8194244726552559097 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3786017647449105987} + - component: {fileID: 8257685674796100929} + - component: {fileID: 2337758357658385124} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &3786017647449105987 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8194244726552559097} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2468537567894287840} + m_Father: {fileID: 797933732813302693} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 10, y: 0} + m_SizeDelta: {x: 80, y: -30} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &8257685674796100929 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8194244726552559097} + m_CullTransparentMesh: 1 +--- !u!114 &2337758357658385124 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8194244726552559097} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 diff --git a/Assets/Resources/MeshToggle.prefab.meta b/Assets/Resources/MeshToggle.prefab.meta new file mode 100644 index 0000000..8386e76 --- /dev/null +++ b/Assets/Resources/MeshToggle.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: eabd49995f1735344a3e0db3fa2ab3d9 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/NoblePhantasm.meta b/Assets/Resources/NoblePhantasm.meta new file mode 100644 index 0000000..9c45033 --- /dev/null +++ b/Assets/Resources/NoblePhantasm.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d634f7ffe4093a347af6b72886c5bfe8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/NoblePhantasm/403800.bytes b/Assets/Resources/NoblePhantasm/403800.bytes new file mode 100644 index 0000000..8771218 Binary files /dev/null and b/Assets/Resources/NoblePhantasm/403800.bytes differ diff --git a/Assets/Resources/NoblePhantasm/403800.bytes.meta b/Assets/Resources/NoblePhantasm/403800.bytes.meta new file mode 100644 index 0000000..1154aaa --- /dev/null +++ b/Assets/Resources/NoblePhantasm/403800.bytes.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 855b9920034d47542b595e11470c873d +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/NoblePhantasm/Sequence.meta b/Assets/Resources/NoblePhantasm/Sequence.meta new file mode 100644 index 0000000..9f2a0a8 --- /dev/null +++ b/Assets/Resources/NoblePhantasm/Sequence.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 473c8132495fb3f43a506469ed1ff16f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/NoblePhantasm/Sequence/403800.bytes b/Assets/Resources/NoblePhantasm/Sequence/403800.bytes new file mode 100644 index 0000000..86bd353 Binary files /dev/null and b/Assets/Resources/NoblePhantasm/Sequence/403800.bytes differ diff --git a/Assets/Resources/NoblePhantasm/Sequence/403800.bytes.meta b/Assets/Resources/NoblePhantasm/Sequence/403800.bytes.meta new file mode 100644 index 0000000..4505fe7 --- /dev/null +++ b/Assets/Resources/NoblePhantasm/Sequence/403800.bytes.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3d1a7cf6410f0c74d995dc3fe104d320 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/ServantContainer.prefab b/Assets/Resources/ServantContainer.prefab new file mode 100644 index 0000000..3a4e328 --- /dev/null +++ b/Assets/Resources/ServantContainer.prefab @@ -0,0 +1,575 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &2269709973293962119 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2824836721475186271} + - component: {fileID: 8544933538563441593} + - component: {fileID: 8817852681075237961} + m_Layer: 5 + m_Name: Face + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2824836721475186271 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2269709973293962119} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4895914039706963616} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 10, y: -10} + m_SizeDelta: {x: 140, y: 140} + m_Pivot: {x: 0, y: 1} +--- !u!222 &8544933538563441593 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2269709973293962119} + m_CullTransparentMesh: 1 +--- !u!114 &8817852681075237961 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2269709973293962119} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &2683148470702474876 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4895914039706963616} + - component: {fileID: 7297134862040441548} + - component: {fileID: 1083462758947427628} + - component: {fileID: 1368786044027191097} + m_Layer: 5 + m_Name: ServantContainer + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4895914039706963616 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2683148470702474876} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2824836721475186271} + - {fileID: 6006532510489906736} + - {fileID: 2854388657181704982} + - {fileID: 1439622579955440991} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 160} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7297134862040441548 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2683148470702474876} + m_CullTransparentMesh: 1 +--- !u!114 &1083462758947427628 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2683148470702474876} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.7830189, g: 0.7830189, b: 0.7830189, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &1368786044027191097 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2683148470702474876} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8f4f0afd5a5cafa4c9b498907eb2f207, type: 3} + m_Name: + m_EditorClassIdentifier: + Servant: + name: + id: 0 + collectionNo: 0 + type: + flag: + className: + attribute: + rarity: 0 + atkMax: 0 + hpMax: 0 + face: + costumes: [] + FaceUrl: + Face: {fileID: 8817852681075237961} + Name: {fileID: 3256956950538866516} + ID: {fileID: 7348213115414543844} + Button: {fileID: 6313229896781360832} +--- !u!1 &4208517248634477661 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6006532510489906736} + - component: {fileID: 916352583923284142} + - component: {fileID: 7348213115414543844} + m_Layer: 5 + m_Name: ID + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6006532510489906736 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4208517248634477661} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4895914039706963616} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 160, y: -10} + m_SizeDelta: {x: 135, y: 140} + m_Pivot: {x: 0, y: 1} +--- !u!222 &916352583923284142 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4208517248634477661} + m_CullTransparentMesh: 1 +--- !u!114 &7348213115414543844 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4208517248634477661} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 9943610 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 24.8 + m_fontSizeBase: 48 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 48 + m_fontStyle: 1 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &7710788098924502891 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1439622579955440991} + - component: {fileID: 1359979299189610432} + - component: {fileID: 5882262210981600222} + - component: {fileID: 6313229896781360832} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1439622579955440991 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7710788098924502891} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4895914039706963616} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1359979299189610432 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7710788098924502891} + m_CullTransparentMesh: 1 +--- !u!114 &5882262210981600222 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7710788098924502891} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &6313229896781360832 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7710788098924502891} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 5882262210981600222} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &7993765027500051659 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2854388657181704982} + - component: {fileID: 6391413467197485542} + - component: {fileID: 3256956950538866516} + m_Layer: 5 + m_Name: Name + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2854388657181704982 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7993765027500051659} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 4895914039706963616} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 310, y: -10} + m_SizeDelta: {x: 338.5, y: 140} + m_Pivot: {x: 0, y: 1} +--- !u!222 &6391413467197485542 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7993765027500051659} + m_CullTransparentMesh: 1 +--- !u!114 &3256956950538866516 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7993765027500051659} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Beast IV + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 48 + m_fontSizeBase: 48 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 48 + m_fontStyle: 1 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} diff --git a/Assets/Resources/ServantContainer.prefab.meta b/Assets/Resources/ServantContainer.prefab.meta new file mode 100644 index 0000000..1090f6d --- /dev/null +++ b/Assets/Resources/ServantContainer.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2bda7ff4eaf889343894016c17417cba +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ScenePanel.prefab b/Assets/ScenePanel.prefab new file mode 100644 index 0000000..bd2973a --- /dev/null +++ b/Assets/ScenePanel.prefab @@ -0,0 +1,276 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &5584442607264144722 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5584442607264144721} + - component: {fileID: 5584442607264144727} + - component: {fileID: 5584442607264144720} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5584442607264144721 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5584442607264144722} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 5584442607579438795} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &5584442607264144727 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5584442607264144722} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 5 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &5584442607264144720 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5584442607264144722} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!1 &5584442607579438788 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5584442607579438795} + - component: {fileID: 5584442607579438792} + - component: {fileID: 5584442607579438793} + - component: {fileID: 5584442607579438794} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5584442607579438795 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5584442607579438788} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 5584442607264144721} + m_Father: {fileID: 5584442607740697635} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!222 &5584442607579438792 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5584442607579438788} + m_CullTransparentMesh: 1 +--- !u!114 &5584442607579438793 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5584442607579438788} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &5584442607579438794 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5584442607579438788} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!1 &5584442607740697660 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5584442607740697635} + - component: {fileID: 5584442607740697632} + - component: {fileID: 5584442607740697633} + - component: {fileID: 5584442607740697634} + m_Layer: 5 + m_Name: ScenePanel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5584442607740697635 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5584442607740697660} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 5584442607579438795} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: -0.000061035156, y: -25} + m_SizeDelta: {x: 410, y: 225} + m_Pivot: {x: 0.5, y: 1} +--- !u!222 &5584442607740697632 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5584442607740697660} + m_CullTransparentMesh: 1 +--- !u!114 &5584442607740697633 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5584442607740697660} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.19607843} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &5584442607740697634 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5584442607740697660} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 5584442607264144721} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 1 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 45 + m_Viewport: {fileID: 5584442607579438795} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 0} + m_HorizontalScrollbarVisibility: 2 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: -3 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] diff --git a/Assets/ScenePanel.prefab.meta b/Assets/ScenePanel.prefab.meta new file mode 100644 index 0000000..16f8600 --- /dev/null +++ b/Assets/ScenePanel.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 73cd158a510fe584cb64b1c54d1edc2f +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes.meta b/Assets/Scenes.meta new file mode 100644 index 0000000..11843db --- /dev/null +++ b/Assets/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6624a2351da394f44ac9490d92bc2c0d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/FateNew.unity b/Assets/Scenes/FateNew.unity new file mode 100644 index 0000000..2e748dc --- /dev/null +++ b/Assets/Scenes/FateNew.unity @@ -0,0 +1,32629 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0.1839229, g: 0.22907549, b: 0.303225, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 1 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 1278537712} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &3787751 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3787752} + - component: {fileID: 3787754} + - component: {fileID: 3787753} + m_Layer: 5 + m_Name: CharactersListPanel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &3787752 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3787751} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 532730164} + - {fileID: 1757045815} + - {fileID: 5584442607537429346} + - {fileID: 1924500983} + m_Father: {fileID: 1795849913} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: -24.999512} + m_SizeDelta: {x: 1200, y: -250} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &3787753 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3787751} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.6666667, g: 0.6666667, b: 0.6666667, a: 0.3137255} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &3787754 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3787751} + m_CullTransparentMesh: 1 +--- !u!1 &14667582 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 14667583} + m_Layer: 5 + m_Name: Fill Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &14667583 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 14667582} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 512526467} + m_Father: {fileID: 291205685} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: -5, y: 0} + m_SizeDelta: {x: -20, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &33074900 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 33074901} + - component: {fileID: 33074904} + - component: {fileID: 33074903} + - component: {fileID: 33074902} + m_Layer: 5 + m_Name: Date + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &33074901 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 33074900} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 155616670} + m_Father: {fileID: 825046902} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 231.25, y: -37.5} + m_SizeDelta: {x: 167.5, y: 75} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &33074902 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 33074900} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 33074903} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1629128743} + m_TargetAssemblyTypeName: UIController, Assembly-CSharp + m_MethodName: OrderBy + m_Mode: 5 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: Date + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &33074903 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 33074900} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &33074904 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 33074900} + m_CullTransparentMesh: 1 +--- !u!1 &46812989 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 46812990} + - component: {fileID: 46812992} + - component: {fileID: 46812991} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &46812990 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 46812989} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2120611123} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: -100, y: -15} + m_SizeDelta: {x: 100, y: 30} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &46812991 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 46812989} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 2757226890267cf49ab66d12478a74b3, type: 3} + m_FontSize: 30 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 63 + m_Alignment: 7 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Speed +--- !u!222 &46812992 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 46812989} + m_CullTransparentMesh: 1 +--- !u!1 &66285757 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 66285758} + - component: {fileID: 66285760} + - component: {fileID: 66285759} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &66285758 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 66285757} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 789430827} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &66285759 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 66285757} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: ID + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 30 + m_fontSizeBase: 30 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &66285760 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 66285757} + m_CullTransparentMesh: 1 +--- !u!1 &78225925 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 78225926} + - component: {fileID: 78225929} + - component: {fileID: 78225928} + - component: {fileID: 78225927} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &78225926 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 78225925} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1140426497} + m_Father: {fileID: 231515582} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &78225927 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 78225925} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 78225928} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1629128743} + m_TargetAssemblyTypeName: UIController, Assembly-CSharp + m_MethodName: ToggleFiltering + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &78225928 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 78225925} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &78225929 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 78225925} + m_CullTransparentMesh: 1 +--- !u!1 &83053480 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 83053481} + - component: {fileID: 83053483} + - component: {fileID: 83053482} + - component: {fileID: 83053484} + m_Layer: 5 + m_Name: ScreenshotArea + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &83053481 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 83053480} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 420837372} + - {fileID: 788461591} + - {fileID: 256083678} + - {fileID: 1324206427} + - {fileID: 176338705} + m_Father: {fileID: 1795849913} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -431.75488, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &83053482 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 83053480} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 1, a: 0.23529412} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &83053483 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 83053480} + m_CullTransparentMesh: 1 +--- !u!114 &83053484 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 83053480} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 86710e43de46f6f4bac7c8e50813a599, type: 3} + m_Name: + m_EditorClassIdentifier: + m_AspectMode: 3 + m_AspectRatio: 1 +--- !u!1 &91295567 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 91295568} + - component: {fileID: 91295570} + - component: {fileID: 91295569} + m_Layer: 5 + m_Name: Panel (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &91295568 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 91295567} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 922663355} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 10, y: 0} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &91295569 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 91295567} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &91295570 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 91295567} + m_CullTransparentMesh: 1 +--- !u!1 &105503889 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 105503890} + - component: {fileID: 105503893} + - component: {fileID: 105503892} + - component: {fileID: 105503891} + m_Layer: 5 + m_Name: LeftButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &105503890 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 105503889} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 168637575} + m_Father: {fileID: 1464018680} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0.000061035156, y: 0.00012207031} + m_SizeDelta: {x: 60, y: 0} + m_Pivot: {x: 0.9999999, y: 0.5} +--- !u!114 &105503891 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 105503889} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 0 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 105503892} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &105503892 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 105503889} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &105503893 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 105503889} + m_CullTransparentMesh: 1 +--- !u!1 &123349437 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 123349438} + - component: {fileID: 123349440} + - component: {fileID: 123349439} + m_Layer: 5 + m_Name: FilePickerInfo + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &123349438 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 123349437} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1601237271} + m_Father: {fileID: 1795849913} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 1000, y: 500} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &123349439 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 123349437} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &123349440 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 123349437} + m_CullTransparentMesh: 1 +--- !u!1 &133189758 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 133189759} + - component: {fileID: 133189761} + - component: {fileID: 133189760} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &133189759 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 133189758} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1806041143} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0.00012207031, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &133189760 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 133189758} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Camera + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 36 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &133189761 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 133189758} + m_CullTransparentMesh: 1 +--- !u!1 &142576033 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 142576034} + - component: {fileID: 142576037} + - component: {fileID: 142576036} + - component: {fileID: 142576035} + m_Layer: 5 + m_Name: MeshesListButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &142576034 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 142576033} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 953248310} + m_Father: {fileID: 553753992} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 360, y: 100} + m_Pivot: {x: 0, y: 0} +--- !u!114 &142576035 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 142576033} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 142576036} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1629128743} + m_TargetAssemblyTypeName: UIController, Assembly-CSharp + m_MethodName: ToggleVisibleButton + m_Mode: 2 + m_Arguments: + m_ObjectArgument: {fileID: 6144536940590394059} + m_ObjectArgumentAssemblyTypeName: UnityEngine.GameObject, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &142576036 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 142576033} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &142576037 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 142576033} + m_CullTransparentMesh: 1 +--- !u!1 &146651656 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 146651657} + - component: {fileID: 146651659} + - component: {fileID: 146651658} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &146651657 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 146651656} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 176338705} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &146651658 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 146651656} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Screenshot Area + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 36 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &146651659 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 146651656} + m_CullTransparentMesh: 1 +--- !u!1 &152391107 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 152391108} + - component: {fileID: 152391110} + - component: {fileID: 152391109} + m_Layer: 5 + m_Name: Text (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &152391108 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 152391107} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1903512253} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: -121, y: 15} + m_SizeDelta: {x: 122.0919, y: 30} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &152391109 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 152391107} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 2757226890267cf49ab66d12478a74b3, type: 3} + m_FontSize: 30 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 63 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Shader +--- !u!222 &152391110 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 152391107} + m_CullTransparentMesh: 1 +--- !u!1 &155616669 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 155616670} + - component: {fileID: 155616672} + - component: {fileID: 155616671} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &155616670 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 155616669} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 33074901} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &155616671 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 155616669} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Date + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 30 + m_fontSizeBase: 30 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &155616672 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 155616669} + m_CullTransparentMesh: 1 +--- !u!1 &168435799 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 168435800} + - component: {fileID: 168435802} + - component: {fileID: 168435801} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &168435800 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 168435799} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1478549761} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &168435801 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 168435799} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &168435802 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 168435799} + m_CullTransparentMesh: 1 +--- !u!1 &168637574 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 168637575} + - component: {fileID: 168637577} + - component: {fileID: 168637576} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &168637575 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 168637574} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 105503890} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &168637576 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 168637574} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 2757226890267cf49ab66d12478a74b3, type: 3} + m_FontSize: 24 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: < +--- !u!222 &168637577 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 168637574} + m_CullTransparentMesh: 1 +--- !u!1 &175956194 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 175956195} + - component: {fileID: 175956197} + - component: {fileID: 175956196} + m_Layer: 5 + m_Name: Item Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &175956195 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 175956194} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 432149917} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 10, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &175956196 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 175956194} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &175956197 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 175956194} + m_CullTransparentMesh: 1 +--- !u!1 &176338704 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 176338705} + - component: {fileID: 176338707} + - component: {fileID: 176338706} + m_Layer: 5 + m_Name: Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &176338705 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 176338704} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 146651657} + m_Father: {fileID: 83053481} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 10, y: -10} + m_SizeDelta: {x: 366, y: 82} + m_Pivot: {x: 0, y: 1} +--- !u!114 &176338706 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 176338704} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.7058824} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &176338707 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 176338704} + m_CullTransparentMesh: 1 +--- !u!1 &180814945 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 180814946} + - component: {fileID: 180814948} + - component: {fileID: 180814947} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &180814946 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 180814945} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1422332926} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &180814947 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 180814945} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &180814948 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 180814945} + m_CullTransparentMesh: 1 +--- !u!1 &200655629 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 200655630} + m_Layer: 5 + m_Name: Sliding Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &200655630 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 200655629} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 892227527} + m_Father: {fileID: 2108200432} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &222269744 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 222269745} + - component: {fileID: 222269747} + - component: {fileID: 222269746} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &222269745 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 222269744} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1169300951} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0.99999285} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &222269746 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 222269744} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &222269747 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 222269744} + m_CullTransparentMesh: 1 +--- !u!1 &231515581 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 231515582} + - component: {fileID: 231515584} + - component: {fileID: 231515583} + m_Layer: 5 + m_Name: TextureFilterButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &231515582 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 231515581} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 78225926} + m_Father: {fileID: 6144536939855760294} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: -525} + m_SizeDelta: {x: 853, y: 100} + m_Pivot: {x: 0, y: 0} +--- !u!114 &231515583 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 231515581} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &231515584 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 231515581} + m_CullTransparentMesh: 1 +--- !u!1 &238250953 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 238250954} + m_Layer: 5 + m_Name: Sliding Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &238250954 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 238250953} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1280518978} + m_Father: {fileID: 1768565094} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &240971854 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 240971855} + - component: {fileID: 240971857} + - component: {fileID: 240971856} + m_Layer: 5 + m_Name: Item Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &240971855 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 240971854} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1152238945} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &240971856 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 240971854} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &240971857 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 240971854} + m_CullTransparentMesh: 1 +--- !u!1 &255280555 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 255280556} + - component: {fileID: 255280559} + - component: {fileID: 255280558} + - component: {fileID: 255280557} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &255280556 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 255280555} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 680755636} + m_Father: {fileID: 1867591815} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &255280557 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 255280555} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 255280558} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1134227394} + m_TargetAssemblyTypeName: Screenshot, Assembly-CSharp + m_MethodName: StartAnimRecord + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &255280558 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 255280555} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &255280559 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 255280555} + m_CullTransparentMesh: 1 +--- !u!1 &256083677 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 256083678} + - component: {fileID: 256083680} + - component: {fileID: 256083679} + m_Layer: 5 + m_Name: Panel (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &256083678 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 256083677} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 83053481} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 10, y: 0} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &256083679 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 256083677} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &256083680 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 256083677} + m_CullTransparentMesh: 1 +--- !u!1 &279547835 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 279547836} + - component: {fileID: 279547839} + - component: {fileID: 279547838} + - component: {fileID: 279547837} + m_Layer: 5 + m_Name: LeftButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &279547836 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 279547835} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1532913569} + m_Father: {fileID: 2082327792} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: -0.0043945312, y: -0.0014038086} + m_SizeDelta: {x: 160, y: 0} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &279547837 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 279547835} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 0 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 279547838} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &279547838 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 279547835} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &279547839 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 279547835} + m_CullTransparentMesh: 1 +--- !u!1 &282010329 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 282010330} + m_Layer: 5 + m_Name: Fill Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &282010330 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 282010329} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 877353367} + m_Father: {fileID: 450634483} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: -5, y: 0} + m_SizeDelta: {x: -20, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &291205684 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 291205685} + - component: {fileID: 291205686} + m_Layer: 5 + m_Name: MoveSpeedSlider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &291205685 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 291205684} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2041360092} + - {fileID: 1475437439} + - {fileID: 14667583} + - {fileID: 576072275} + - {fileID: 1800095227} + m_Father: {fileID: 2041497182} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 30, y: -182} + m_SizeDelta: {x: 400, y: 75} + m_Pivot: {x: 0, y: 1} +--- !u!114 &291205686 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 291205684} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1936480423} + m_FillRect: {fileID: 512526467} + m_HandleRect: {fileID: 1936480422} + m_Direction: 0 + m_MinValue: 0.01 + m_MaxValue: 5 + m_WholeNumbers: 0 + m_Value: 0.5 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1800095229} + m_TargetAssemblyTypeName: SliderDisplay, Assembly-CSharp + m_MethodName: UpdateDisplay + m_Mode: 0 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 1134227393} + m_TargetAssemblyTypeName: CameraOrbit, Assembly-CSharp + m_MethodName: SetMoveSpeed + m_Mode: 0 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &294445500 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 294445501} + - component: {fileID: 294445504} + - component: {fileID: 294445503} + - component: {fileID: 294445502} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &294445501 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 294445500} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1198509157} + m_Father: {fileID: 817349588} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -17, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &294445502 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 294445500} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!114 &294445503 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 294445500} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &294445504 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 294445500} + m_CullTransparentMesh: 1 +--- !u!1 &300513928 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 300513929} + - component: {fileID: 300513931} + - component: {fileID: 300513930} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &300513929 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 300513928} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1971428427} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &300513930 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 300513928} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 3D mode toggle + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 30.71 + m_fontSizeBase: 30.71 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &300513931 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 300513928} + m_CullTransparentMesh: 1 +--- !u!1 &301878243 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 301878244} + - component: {fileID: 301878246} + - component: {fileID: 301878245} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &301878244 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 301878243} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1601237271} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -30, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &301878245 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 301878243} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 'Texture file has to be in .png format and it needs to have the same filename + as the texture you want to replace. + + + Press this prompt to continue' + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 48 + m_fontSizeBase: 48 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &301878246 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 301878243} + m_CullTransparentMesh: 1 +--- !u!1 &303575082 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 303575083} + - component: {fileID: 303575085} + - component: {fileID: 303575084} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &303575083 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 303575082} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 0.75, z: 1} + m_Children: [] + m_Father: {fileID: 1166923769} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 75, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &303575084 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 303575082} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &303575085 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 303575082} + m_CullTransparentMesh: 1 +--- !u!1 &309974990 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 309974991} + - component: {fileID: 309974993} + - component: {fileID: 309974992} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &309974991 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 309974990} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 450634483} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &309974992 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 309974990} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &309974993 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 309974990} + m_CullTransparentMesh: 1 +--- !u!1 &311768527 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 311768528} + - component: {fileID: 311768531} + - component: {fileID: 311768530} + - component: {fileID: 311768529} + m_Layer: 5 + m_Name: CreditsButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &311768528 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 311768527} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1563841759} + m_Father: {fileID: 553753992} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 360, y: 100} + m_Pivot: {x: 1, y: 0} +--- !u!114 &311768529 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 311768527} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 311768530} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1629128743} + m_TargetAssemblyTypeName: UIController, Assembly-CSharp + m_MethodName: ToggleVisibleButton + m_Mode: 2 + m_Arguments: + m_ObjectArgument: {fileID: 1030230480} + m_ObjectArgumentAssemblyTypeName: UnityEngine.GameObject, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &311768530 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 311768527} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &311768531 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 311768527} + m_CullTransparentMesh: 1 +--- !u!1 &314759979 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 314759980} + - component: {fileID: 314759982} + - component: {fileID: 314759981} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &314759980 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 314759979} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1903512253} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &314759981 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 314759979} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.8301887, g: 0.8301887, b: 0.8301887, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &314759982 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 314759979} + m_CullTransparentMesh: 1 +--- !u!1 &322154411 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 322154412} + - component: {fileID: 322154415} + - component: {fileID: 322154414} + - component: {fileID: 322154413} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &322154412 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 322154411} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1255164663} + m_Father: {fileID: 1513490774} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -17, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &322154413 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 322154411} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!114 &322154414 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 322154411} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &322154415 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 322154411} + m_CullTransparentMesh: 1 +--- !u!1 &393246413 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 393246414} + - component: {fileID: 393246416} + - component: {fileID: 393246415} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &393246414 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 393246413} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 457990609} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.03807615, y: 0} + m_AnchorMax: {x: 0.03807615, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 75, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &393246415 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 393246413} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &393246416 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 393246413} + m_CullTransparentMesh: 1 +--- !u!1 &399285039 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 399285040} + - component: {fileID: 399285042} + - component: {fileID: 399285041} + m_Layer: 5 + m_Name: Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &399285040 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 399285039} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 922663355} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 10} + m_Pivot: {x: 0.5, y: 0} +--- !u!114 &399285041 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 399285039} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &399285042 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 399285039} + m_CullTransparentMesh: 1 +--- !u!1 &414983547 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 414983548} + m_Layer: 0 + m_Name: SceneCenter + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &414983548 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 414983547} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1001 &417423727 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 5584442607537429346} + m_Modifications: + - target: {fileID: 5584442607264144721, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_SizeDelta.y + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 5584442607264144727, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_Spacing + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 5584442607264144727, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_ChildControlWidth + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5584442607579438788, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5584442607579438795, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_AnchorMax.x + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5584442607579438795, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5584442607579438795, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_SizeDelta.x + value: -47 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697633, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_Sprite + value: + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697634, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_MovementType + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697634, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_VerticalScrollbar + value: + objectReference: {fileID: 930806657} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_RootOrder + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_SizeDelta.x + value: 500 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_SizeDelta.y + value: -0.00012207031 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_AnchoredPosition.x + value: 700 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697660, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_Name + value: ServantList2 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697660, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} +--- !u!1 &417722379 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 417722380} + - component: {fileID: 417722382} + - component: {fileID: 417722381} + m_Layer: 5 + m_Name: Panel (3) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &417722380 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 417722379} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 922663355} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 10, y: 0} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &417722381 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 417722379} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &417722382 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 417722379} + m_CullTransparentMesh: 1 +--- !u!1 &420837371 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 420837372} + - component: {fileID: 420837374} + - component: {fileID: 420837373} + m_Layer: 5 + m_Name: Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &420837372 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 420837371} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 83053481} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 10} + m_Pivot: {x: 0.5, y: 0} +--- !u!114 &420837373 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 420837371} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &420837374 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 420837371} + m_CullTransparentMesh: 1 +--- !u!1 &429802295 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 429802296} + - component: {fileID: 429802299} + - component: {fileID: 429802298} + - component: {fileID: 429802297} + m_Layer: 5 + m_Name: Name + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &429802296 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 429802295} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1248073482} + m_Father: {fileID: 825046902} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 566.25, y: -37.5} + m_SizeDelta: {x: 167.5, y: 75} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &429802297 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 429802295} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 429802298} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1629128743} + m_TargetAssemblyTypeName: UIController, Assembly-CSharp + m_MethodName: OrderBy + m_Mode: 5 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: Name + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &429802298 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 429802295} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &429802299 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 429802295} + m_CullTransparentMesh: 1 +--- !u!1 &432149916 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 432149917} + - component: {fileID: 432149918} + m_Layer: 5 + m_Name: Item + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &432149917 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 432149916} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 738275132} + - {fileID: 175956195} + - {fileID: 1085728948} + m_Father: {fileID: 1255164663} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 35} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &432149918 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 432149916} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 738275133} + toggleTransition: 1 + graphic: {fileID: 175956196} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 1 +--- !u!1 &440561372 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 440561373} + - component: {fileID: 440561374} + m_Layer: 5 + m_Name: Text Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &440561373 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 440561372} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1917739042} + - {fileID: 828999972} + m_Father: {fileID: 1340416477} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &440561374 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 440561372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: {x: -8, y: -5, z: -8, w: -5} + m_Softness: {x: 0, y: 0} +--- !u!1 &448109305 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 448109306} + - component: {fileID: 448109309} + - component: {fileID: 448109308} + - component: {fileID: 448109307} + m_Layer: 5 + m_Name: Scrollbar Vertical + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &448109306 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 448109305} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1422332926} + m_Father: {fileID: 1924500983} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 50, y: -10} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &448109307 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 448109305} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 180814947} + m_HandleRect: {fileID: 180814946} + m_Direction: 2 + m_Value: 0 + m_Size: 1 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &448109308 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 448109305} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &448109309 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 448109305} + m_CullTransparentMesh: 1 +--- !u!1 &450634482 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 450634483} + - component: {fileID: 450634484} + m_Layer: 5 + m_Name: ZoomSpeedSlider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &450634483 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 450634482} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1067406014} + - {fileID: 309974991} + - {fileID: 282010330} + - {fileID: 457990609} + - {fileID: 1369057219} + m_Father: {fileID: 2041497182} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 30, y: -326} + m_SizeDelta: {x: 400, y: 75} + m_Pivot: {x: 0, y: 1} +--- !u!114 &450634484 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 450634482} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 393246415} + m_FillRect: {fileID: 877353367} + m_HandleRect: {fileID: 393246414} + m_Direction: 0 + m_MinValue: 0.01 + m_MaxValue: 5 + m_WholeNumbers: 0 + m_Value: 0.2 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1369057221} + m_TargetAssemblyTypeName: SliderDisplay, Assembly-CSharp + m_MethodName: UpdateDisplay + m_Mode: 0 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 1134227393} + m_TargetAssemblyTypeName: CameraOrbit, Assembly-CSharp + m_MethodName: SetZoomSpeed + m_Mode: 0 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &456023902 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 456023903} + - component: {fileID: 456023905} + - component: {fileID: 456023904} + m_Layer: 5 + m_Name: Panel (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &456023903 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 456023902} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 922663355} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -10} + m_SizeDelta: {x: 0, y: 10} + m_Pivot: {x: 0.5, y: 0} +--- !u!114 &456023904 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 456023902} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &456023905 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 456023902} + m_CullTransparentMesh: 1 +--- !u!1 &457990608 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 457990609} + m_Layer: 5 + m_Name: Handle Slide Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &457990609 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 457990608} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 393246414} + m_Father: {fileID: 450634483} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &473929457 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + m_PrefabInstance: {fileID: 1766272574} + m_PrefabAsset: {fileID: 0} +--- !u!1 &491643500 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 491643501} + - component: {fileID: 491643503} + - component: {fileID: 491643502} + m_Layer: 5 + m_Name: CreditsPanel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &491643501 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 491643500} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1776824538} + - {fileID: 1045690870} + m_Father: {fileID: 1042785514} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 540, y: -1273.51} + m_SizeDelta: {x: 540, y: 200} + m_Pivot: {x: 1, y: 0} +--- !u!114 &491643502 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 491643500} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &491643503 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 491643500} + m_CullTransparentMesh: 1 +--- !u!1 &512526466 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 512526467} + - component: {fileID: 512526469} + - component: {fileID: 512526468} + m_Layer: 5 + m_Name: Fill + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &512526467 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 512526466} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 14667583} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0.098196395, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 10, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &512526468 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 512526466} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &512526469 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 512526466} + m_CullTransparentMesh: 1 +--- !u!1 &532172405 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 532172406} + - component: {fileID: 532172409} + - component: {fileID: 532172408} + - component: {fileID: 532172407} + m_Layer: 5 + m_Name: Scrollbar Vertical + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &532172406 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 532172405} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1478549761} + m_Father: {fileID: 6144536940590394068} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 50, y: -17} + m_Pivot: {x: 1, y: 1} +--- !u!114 &532172407 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 532172405} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 168435801} + m_HandleRect: {fileID: 168435800} + m_Direction: 2 + m_Value: 0 + m_Size: 1 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &532172408 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 532172405} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &532172409 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 532172405} + m_CullTransparentMesh: 1 +--- !u!1 &532639357 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 532639358} + m_Layer: 5 + m_Name: Sliding Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &532639358 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 532639357} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1639192707} + m_Father: {fileID: 874067378} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &532730163 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 532730164} + - component: {fileID: 532730167} + - component: {fileID: 532730166} + - component: {fileID: 532730165} + m_Layer: 5 + m_Name: Servants + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &532730164 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 532730163} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 894008367} + m_Father: {fileID: 3787752} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 300, y: -50} + m_SizeDelta: {x: 600, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &532730165 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 532730163} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 0 + m_TargetGraphic: {fileID: 532730166} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 5584442607537429373} + m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 + - m_Target: {fileID: 1924500982} + m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 532730165} + m_TargetAssemblyTypeName: UnityEngine.UI.Selectable, UnityEngine.UI + m_MethodName: set_interactable + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 1757045816} + m_TargetAssemblyTypeName: UnityEngine.UI.Selectable, UnityEngine.UI + m_MethodName: set_interactable + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 +--- !u!114 &532730166 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 532730163} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &532730167 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 532730163} + m_CullTransparentMesh: 1 +--- !u!1 &542113850 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554119470} + - component: {fileID: 553583258} + m_Layer: 5 + m_Name: R + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542114604 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554107440} + - component: {fileID: 553567714} + - component: {fileID: 553565984} + m_Layer: 5 + m_Name: Hue + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542115182 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554103416} + m_Layer: 5 + m_Name: Handle Slide Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542117262 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 553931800} + - component: {fileID: 553807976} + - component: {fileID: 553591186} + - component: {fileID: 553566098} + - component: {fileID: 553613322} + m_Layer: 5 + m_Name: Preset (8) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!1 &542118062 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554131376} + - component: {fileID: 553622022} + - component: {fileID: 553608486} + - component: {fileID: 553553134} + m_Layer: 5 + m_Name: Slider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542118244 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554101956} + - component: {fileID: 553840910} + - component: {fileID: 553550590} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542119456 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554103904} + - component: {fileID: 553559590} + m_Layer: 5 + m_Name: ColorBox + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542119730 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554128800} + - component: {fileID: 553612988} + m_Layer: 5 + m_Name: A + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542120926 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554139172} + m_Layer: 5 + m_Name: Handle Slide Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542124744 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554148868} + - component: {fileID: 553875160} + - component: {fileID: 553605256} + - component: {fileID: 553633400} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542125494 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554138530} + m_Layer: 5 + m_Name: Handle Slide Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542133984 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554125516} + m_Layer: 5 + m_Name: Handle Slide Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542137018 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554080750} + - component: {fileID: 553792770} + - component: {fileID: 553616536} + - component: {fileID: 553570344} + - component: {fileID: 553575752} + m_Layer: 5 + m_Name: Preset (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542141224 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554089558} + - component: {fileID: 553810850} + - component: {fileID: 553586562} + - component: {fileID: 553636676} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542141628 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554147628} + - component: {fileID: 553584420} + m_Layer: 5 + m_Name: Toggle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542141784 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554083206} + m_Layer: 5 + m_Name: ColorBox Container + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542143444 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554138972} + - component: {fileID: 553643778} + - component: {fileID: 553822858} + - component: {fileID: 553598690} + - component: {fileID: 553605024} + m_Layer: 5 + m_Name: BoxSlider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542291442 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554150542} + m_Layer: 5 + m_Name: Handle Slide Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542293416 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554148580} + - component: {fileID: 553628542} + m_Layer: 5 + m_Name: G + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542293566 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 553939908} + - component: {fileID: 553823896} + - component: {fileID: 553627090} + - component: {fileID: 553622466} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542314444 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554122588} + - component: {fileID: 553868770} + - component: {fileID: 553608460} + - component: {fileID: 553580540} + m_Layer: 5 + m_Name: Fill + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542316138 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554109594} + - component: {fileID: 553784932} + - component: {fileID: 553572370} + - component: {fileID: 553550688} + - component: {fileID: 553565594} + m_Layer: 5 + m_Name: Preset (3) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!1 &542317070 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554156892} + - component: {fileID: 553861978} + - component: {fileID: 553641954} + - component: {fileID: 553579770} + - component: {fileID: 553627228} + m_Layer: 5 + m_Name: Preset (5) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!1 &542320942 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554136800} + - component: {fileID: 553590778} + - component: {fileID: 553639156} + - component: {fileID: 553587876} + m_Layer: 5 + m_Name: Slider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542320978 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554152968} + - component: {fileID: 553604900} + - component: {fileID: 114482409903082650} + m_Layer: 5 + m_Name: Sliders + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542322594 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554139594} + - component: {fileID: 553608774} + m_Layer: 5 + m_Name: B + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542322764 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554078266} + - component: {fileID: 554009830} + - component: {fileID: 553616326} + - component: {fileID: 553638022} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!1 &542323164 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554170824} + m_Layer: 5 + m_Name: Handle Slide Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542323240 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554116874} + - component: {fileID: 553819344} + - component: {fileID: 553641124} + - component: {fileID: 553613300} + - component: {fileID: 553571352} + m_Layer: 5 + m_Name: Preset (10) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!1 &542323562 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554081856} + - component: {fileID: 553816362} + - component: {fileID: 553577760} + - component: {fileID: 553405298} + - component: {fileID: 553552518} + m_Layer: 5 + m_Name: Create Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542323896 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554132584} + - component: {fileID: 114821406329110360} + m_Layer: 5 + m_Name: HSVField + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542323916 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 553926800} + - component: {fileID: 553583436} + m_Layer: 5 + m_Name: V + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!1 &542325346 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554156104} + - component: {fileID: 553833616} + - component: {fileID: 553618656} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542327772 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554119280} + - component: {fileID: 553618296} + - component: {fileID: 553599894} + - component: {fileID: 553642072} + m_Layer: 5 + m_Name: Slider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542327916 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554153430} + - component: {fileID: 553824664} + - component: {fileID: 553616978} + - component: {fileID: 553565056} + - component: {fileID: 553618640} + m_Layer: 5 + m_Name: Preset (4) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!1 &542329420 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554079786} + - component: {fileID: 553558762} + - component: {fileID: 114827312663447016} + m_Layer: 5 + m_Name: ColorField + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542330208 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554131112} + - component: {fileID: 553829866} + - component: {fileID: 553614116} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542331830 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554155292} + - component: {fileID: 553790454} + - component: {fileID: 553606406} + m_Layer: 5 + m_Name: Color + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542332842 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554126104} + - component: {fileID: 553644672} + - component: {fileID: 553579056} + - component: {fileID: 553609336} + m_Layer: 5 + m_Name: Slider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542334938 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554126506} + - component: {fileID: 553607880} + - component: {fileID: 553557060} + - component: {fileID: 553624150} + m_Layer: 5 + m_Name: Slider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542335258 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554085278} + - component: {fileID: 553798892} + - component: {fileID: 553594768} + - component: {fileID: 553615098} + - component: {fileID: 553595344} + m_Layer: 5 + m_Name: Preset (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542335870 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554109866} + - component: {fileID: 553632702} + m_Layer: 5 + m_Name: Seperator + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!1 &542336184 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554132724} + m_Layer: 5 + m_Name: Handle Slide Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542337046 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554163106} + - component: {fileID: 553781916} + - component: {fileID: 553638546} + - component: {fileID: 553553832} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542337084 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554146550} + - component: {fileID: 554024268} + - component: {fileID: 553577678} + - component: {fileID: 553631204} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542338292 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554113674} + - component: {fileID: 553836548} + - component: {fileID: 553642692} + - component: {fileID: 553581844} + - component: {fileID: 553552022} + m_Layer: 5 + m_Name: Preset (7) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!1 &542343710 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 553929380} + m_Layer: 5 + m_Name: Handle Slide Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542344880 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 553937442} + - component: {fileID: 553795900} + - component: {fileID: 553557590} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542347092 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554127192} + - component: {fileID: 553573528} + m_Layer: 5 + m_Name: H + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!1 &542348014 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554136032} + - component: {fileID: 553827732} + - component: {fileID: 553579662} + - component: {fileID: 553599988} + - component: {fileID: 553557654} + m_Layer: 5 + m_Name: Preset (6) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!1 &542349854 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554140320} + - component: {fileID: 554010070} + - component: {fileID: 553556204} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542354316 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554170284} + - component: {fileID: 553835892} + - component: {fileID: 553637976} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542355904 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554120338} + m_Layer: 5 + m_Name: Handle Slide Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542356268 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554133010} + - component: {fileID: 554013382} + - component: {fileID: 553568594} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542359600 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554155438} + - component: {fileID: 553824204} + - component: {fileID: 553626776} + - component: {fileID: 553553678} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542361736 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554164580} + - component: {fileID: 553818224} + - component: {fileID: 553635408} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542362468 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554152208} + - component: {fileID: 553612102} + - component: {fileID: 553620408} + - component: {fileID: 553562448} + m_Layer: 5 + m_Name: Slider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542365066 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554160214} + - component: {fileID: 553827804} + - component: {fileID: 553603846} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542366052 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554135584} + - component: {fileID: 553822968} + - component: {fileID: 553609224} + - component: {fileID: 553630056} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542366372 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554120590} + - component: {fileID: 553807946} + - component: {fileID: 553641354} + - component: {fileID: 553644664} + - component: {fileID: 114932489353410744} + - component: {fileID: 114517941581483574} + m_Layer: 5 + m_Name: Picker 2.0 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542366672 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554121262} + - component: {fileID: 553787694} + - component: {fileID: 553597850} + - component: {fileID: 553552314} + - component: {fileID: 553592750} + m_Layer: 5 + m_Name: Preset (0) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542366914 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554083384} + - component: {fileID: 553597318} + - component: {fileID: 553404900} + - component: {fileID: 554023796} + - component: {fileID: 553403882} + - component: {fileID: 114096566894606538} + m_Layer: 5 + m_Name: Presets + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542369290 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554080188} + - component: {fileID: 553566128} + - component: {fileID: 553573178} + - component: {fileID: 553645686} + m_Layer: 5 + m_Name: Slider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542372262 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554103500} + - component: {fileID: 553821746} + - component: {fileID: 553565936} + - component: {fileID: 553623552} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &542373550 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 554123698} + - component: {fileID: 553571886} + m_Layer: 5 + m_Name: S + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!1 &549399990 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 549399991} + - component: {fileID: 549399993} + - component: {fileID: 549399992} + m_Layer: 5 + m_Name: Screenshots + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &549399991 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 549399990} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1466389665} + m_Father: {fileID: 1042785514} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 270, y: -688.81} + m_SizeDelta: {x: 540, y: 67} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &549399992 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 549399990} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.6666667, g: 0.6666667, b: 0.6666667, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &549399993 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 549399990} + m_CullTransparentMesh: 1 +--- !u!114 &553403882 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542366914} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.1544118, g: 0.1544118, b: 0.1544118, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 2 + m_PreserveAspect: 0 + m_FillCenter: 0 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &553404900 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542366914} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 1 + m_Right: 1 + m_Top: 1 + m_Bottom: 1 + m_ChildAlignment: 0 + m_Spacing: 1 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &553405298 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542323562} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 553577760} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &553550590 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542118244} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &553550688 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542316138} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 553572370} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 553597318} + m_TargetAssemblyTypeName: + m_MethodName: PresetSelect + m_Mode: 2 + m_Arguments: + m_ObjectArgument: {fileID: 553572370} + m_ObjectArgumentAssemblyTypeName: UnityEngine.UI.Image, UnityEngine.UI + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &553552022 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542338292} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 20 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &553552314 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542366672} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 553597850} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 553597318} + m_TargetAssemblyTypeName: + m_MethodName: PresetSelect + m_Mode: 2 + m_Arguments: + m_ObjectArgument: {fileID: 553597850} + m_ObjectArgumentAssemblyTypeName: UnityEngine.UI.Image, UnityEngine.UI + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &553552518 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542323562} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 20 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &553553134 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542118062} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c600592efa0cf25479655321bf4fb08a, type: 3} + m_Name: + m_EditorClassIdentifier: + hsvpicker: {fileID: 553644664} + type: 3 +--- !u!114 &553553678 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542359600} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7ca76dd9ad6eb204c9b0481aece34497, type: 3} + m_Name: + m_EditorClassIdentifier: + picker: {fileID: 553644664} + type: 3 + direction: 0 +--- !u!114 &553553832 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542337046} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7ca76dd9ad6eb204c9b0481aece34497, type: 3} + m_Name: + m_EditorClassIdentifier: + picker: {fileID: 553644664} + type: 4 + direction: 2 +--- !u!114 &553556204 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542349854} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &553557060 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542334938} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 16 + m_FlexibleWidth: 1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &553557590 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542344880} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &553557654 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542348014} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 20 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &553558762 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542329420} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 0 + m_Bottom: 5 + m_ChildAlignment: 0 + m_Spacing: 10 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &553559590 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542119456} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 86710e43de46f6f4bac7c8e50813a599, type: 3} + m_Name: + m_EditorClassIdentifier: + m_AspectMode: 3 + m_AspectRatio: 1 +--- !u!114 &553562448 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542362468} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c600592efa0cf25479655321bf4fb08a, type: 3} + m_Name: + m_EditorClassIdentifier: + hsvpicker: {fileID: 553644664} + type: 0 +--- !u!114 &553565056 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542327916} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 553616978} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 553597318} + m_TargetAssemblyTypeName: + m_MethodName: PresetSelect + m_Mode: 2 + m_Arguments: + m_ObjectArgument: {fileID: 553616978} + m_ObjectArgumentAssemblyTypeName: UnityEngine.UI.Image, UnityEngine.UI + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &553565594 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542316138} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 20 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &553565936 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542372262} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 2 +--- !u!114 &553565984 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542114604} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c600592efa0cf25479655321bf4fb08a, type: 3} + m_Name: + m_EditorClassIdentifier: + hsvpicker: {fileID: 553644664} + type: 4 +--- !u!114 &553566098 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542117262} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 553591186} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 553597318} + m_TargetAssemblyTypeName: + m_MethodName: PresetSelect + m_Mode: 2 + m_Arguments: + m_ObjectArgument: {fileID: 553591186} + m_ObjectArgumentAssemblyTypeName: UnityEngine.UI.Image, UnityEngine.UI + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &553566128 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542369290} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 553614116} + m_FillRect: {fileID: 0} + m_HandleRect: {fileID: 554131112} + m_Direction: 0 + m_MinValue: 0 + m_MaxValue: 1 + m_WholeNumbers: 0 + m_Value: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &553567714 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542114604} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 553603846} + m_FillRect: {fileID: 0} + m_HandleRect: {fileID: 554160214} + m_Direction: 2 + m_MinValue: 0 + m_MaxValue: 1 + m_WholeNumbers: 0 + m_Value: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &553568594 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542356268} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &553570344 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542137018} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 553616536} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 553597318} + m_TargetAssemblyTypeName: + m_MethodName: PresetSelect + m_Mode: 2 + m_Arguments: + m_ObjectArgument: {fileID: 553616536} + m_ObjectArgumentAssemblyTypeName: UnityEngine.UI.Image, UnityEngine.UI + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &553571352 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542323240} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 20 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &553571886 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542373550} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 5 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &553572370 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542316138} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &553573178 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542369290} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 16 + m_FlexibleWidth: 1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &553573528 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542347092} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 5 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &553575752 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542137018} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 20 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &553577678 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542337084} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 2 +--- !u!114 &553577760 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542323562} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &553579056 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542332842} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 16 + m_FlexibleWidth: 1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &553579662 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542348014} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &553579770 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542317070} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 553641954} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 553597318} + m_TargetAssemblyTypeName: + m_MethodName: PresetSelect + m_Mode: 2 + m_Arguments: + m_ObjectArgument: {fileID: 553641954} + m_ObjectArgumentAssemblyTypeName: UnityEngine.UI.Image, UnityEngine.UI + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &553580540 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542314444} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6bca58eb07ad66b498a2f158bcb13225, type: 3} + m_Name: + m_EditorClassIdentifier: + picker: {fileID: 553644664} +--- !u!114 &553581844 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542338292} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 553642692} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 553597318} + m_TargetAssemblyTypeName: + m_MethodName: PresetSelect + m_Mode: 2 + m_Arguments: + m_ObjectArgument: {fileID: 553642692} + m_ObjectArgumentAssemblyTypeName: UnityEngine.UI.Image, UnityEngine.UI + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &553583258 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542113850} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 5 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &553583436 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542323916} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 5 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &553584420 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542141628} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 16.5 + m_FlexibleWidth: 1 + m_FlexibleHeight: 1 + m_LayoutPriority: 1 +--- !u!114 &553586562 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542141224} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 2 +--- !u!114 &553587876 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542320942} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c600592efa0cf25479655321bf4fb08a, type: 3} + m_Name: + m_EditorClassIdentifier: + hsvpicker: {fileID: 553644664} + type: 1 +--- !u!114 &553590778 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542320942} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 553568594} + m_FillRect: {fileID: 0} + m_HandleRect: {fileID: 554133010} + m_Direction: 0 + m_MinValue: 0 + m_MaxValue: 1 + m_WholeNumbers: 0 + m_Value: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &553591186 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542117262} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &553592750 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542366672} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 18 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &553594768 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542335258} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.21366784, g: 0.7647059, b: 0.30867442, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &553595344 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542335258} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 20 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &553597318 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542366914} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0923373e76e77402c9c53a2f1250ad3e, type: 3} + m_Name: + m_EditorClassIdentifier: + picker: {fileID: 553644664} + presets: + - {fileID: 542366672} + - {fileID: 542335258} + - {fileID: 542137018} + - {fileID: 542316138} + - {fileID: 542327916} + - {fileID: 542317070} + - {fileID: 542348014} + - {fileID: 542338292} + - {fileID: 542117262} + - {fileID: 1674745585685688} + - {fileID: 542323240} + createPresetImage: {fileID: 553577760} +--- !u!114 &553597850 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542366672} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.7647059, g: 0.19117647, b: 0.19117647, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &553598690 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542143444} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!114 &553599894 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542327772} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 16 + m_FlexibleWidth: 1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &553599988 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542348014} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 553579662} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 553597318} + m_TargetAssemblyTypeName: + m_MethodName: PresetSelect + m_Mode: 2 + m_Arguments: + m_ObjectArgument: {fileID: 553579662} + m_ObjectArgumentAssemblyTypeName: UnityEngine.UI.Image, UnityEngine.UI + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &553603846 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542365066} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &553604900 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542320978} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &553605024 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542143444} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1e4240873631f724496efec97d7151b3, type: 3} + m_Name: + m_EditorClassIdentifier: + picker: {fileID: 553644664} +--- !u!114 &553605256 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542124744} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 2 +--- !u!114 &553606406 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542331830} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.39215687} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 0 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &553607880 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542334938} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 553637976} + m_FillRect: {fileID: 0} + m_HandleRect: {fileID: 554170284} + m_Direction: 0 + m_MinValue: 0 + m_MaxValue: 1 + m_WholeNumbers: 0 + m_Value: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &553608460 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542314444} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &553608486 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542118062} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 16 + m_FlexibleWidth: 1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &553608774 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542322594} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 5 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &553609224 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542366052} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 2 +--- !u!114 &553609336 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542332842} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c600592efa0cf25479655321bf4fb08a, type: 3} + m_Name: + m_EditorClassIdentifier: + hsvpicker: {fileID: 553644664} + type: 4 +--- !u!114 &553612102 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542362468} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 553557590} + m_FillRect: {fileID: 0} + m_HandleRect: {fileID: 553937442} + m_Direction: 0 + m_MinValue: 0 + m_MaxValue: 1 + m_WholeNumbers: 0 + m_Value: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &553612988 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542119730} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 5 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &553613300 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542323240} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 553641124} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 553597318} + m_TargetAssemblyTypeName: + m_MethodName: PresetSelect + m_Mode: 2 + m_Arguments: + m_ObjectArgument: {fileID: 553641124} + m_ObjectArgumentAssemblyTypeName: UnityEngine.UI.Image, UnityEngine.UI + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &553613322 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542117262} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 20 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &553614116 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542330208} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &553615098 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542335258} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 553594768} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 553597318} + m_TargetAssemblyTypeName: + m_MethodName: PresetSelect + m_Mode: 2 + m_Arguments: + m_ObjectArgument: {fileID: 553594768} + m_ObjectArgumentAssemblyTypeName: UnityEngine.UI.Image, UnityEngine.UI + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &553616326 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542322764} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 2757226890267cf49ab66d12478a74b3, type: 3} + m_FontSize: 14 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: + +--- !u!114 &553616536 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542137018} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.7205882, g: 0.5700394, b: 0.1748486, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &553616978 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542327916} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &553618296 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542327772} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 553556204} + m_FillRect: {fileID: 0} + m_HandleRect: {fileID: 554140320} + m_Direction: 0 + m_MinValue: 0 + m_MaxValue: 1 + m_WholeNumbers: 0 + m_Value: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &553618640 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542327916} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 20 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &553618656 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542325346} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &553620408 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542362468} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 16 + m_FlexibleWidth: 1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &553622022 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542118062} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 553618656} + m_FillRect: {fileID: 0} + m_HandleRect: {fileID: 554156104} + m_Direction: 0 + m_MinValue: 0 + m_MaxValue: 1 + m_WholeNumbers: 0 + m_Value: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &553622466 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542293566} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7ca76dd9ad6eb204c9b0481aece34497, type: 3} + m_Name: + m_EditorClassIdentifier: + picker: {fileID: 553644664} + type: 0 + direction: 0 +--- !u!114 &553623552 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542372262} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7ca76dd9ad6eb204c9b0481aece34497, type: 3} + m_Name: + m_EditorClassIdentifier: + picker: {fileID: 553644664} + type: 6 + direction: 0 +--- !u!114 &553624150 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542334938} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c600592efa0cf25479655321bf4fb08a, type: 3} + m_Name: + m_EditorClassIdentifier: + hsvpicker: {fileID: 553644664} + type: 2 +--- !u!114 &553626776 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542359600} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 2 +--- !u!114 &553627090 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542293566} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 2 +--- !u!114 &553627228 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542317070} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 20 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &553628542 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542293416} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 5 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &553630056 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542366052} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7ca76dd9ad6eb204c9b0481aece34497, type: 3} + m_Name: + m_EditorClassIdentifier: + picker: {fileID: 553644664} + type: 1 + direction: 0 +--- !u!114 &553631204 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542337084} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7ca76dd9ad6eb204c9b0481aece34497, type: 3} + m_Name: + m_EditorClassIdentifier: + picker: {fileID: 553644664} + type: 2 + direction: 0 +--- !u!114 &553632702 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542335870} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: 1 + m_FlexibleHeight: 1 + m_LayoutPriority: 1 +--- !u!114 &553633400 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542124744} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7ca76dd9ad6eb204c9b0481aece34497, type: 3} + m_Name: + m_EditorClassIdentifier: + picker: {fileID: 553644664} + type: 5 + direction: 0 +--- !u!114 &553635408 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542361736} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &553636676 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542141224} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7ca76dd9ad6eb204c9b0481aece34497, type: 3} + m_Name: + m_EditorClassIdentifier: + picker: {fileID: 553644664} + type: 4 + direction: 0 +--- !u!114 &553637976 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542354316} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &553638022 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542322764} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e19747de3f5aca642ab2be37e372fb86, type: 3} + m_Name: + m_EditorClassIdentifier: + m_EffectColor: {r: 0, g: 0, b: 0, a: 0.5} + m_EffectDistance: {x: 1, y: -1} + m_UseGraphicAlpha: 1 +--- !u!114 &553638546 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542337046} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 2 + height: 1 +--- !u!114 &553639156 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542320942} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 16 + m_FlexibleWidth: 1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &553641124 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542323240} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &553641354 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542366372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &553641954 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542317070} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &553642072 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542327772} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c600592efa0cf25479655321bf4fb08a, type: 3} + m_Name: + m_EditorClassIdentifier: + hsvpicker: {fileID: 553644664} + type: 6 +--- !u!114 &553642692 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542338292} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &553643778 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542143444} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 37c44bc94a9a7f241b5b552f3ff89458, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 0 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 553598690} + m_HandleRect: {fileID: 554101956} + m_MinValue: 0 + m_MaxValue: 1 + m_WholeNumbers: 0 + m_Value: 1 + m_ValueY: 1 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &553644664 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542366372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8262e4a8322117f4da079921eaa72834, type: 3} + m_Name: + m_EditorClassIdentifier: + _color: {r: 0, g: 0, b: 0, a: 0} + Setup: + ShowRgb: 1 + ShowHsv: 0 + ShowAlpha: 1 + ShowColorBox: 1 + ShowColorSliderToggle: 0 + ShowHeader: 3 + RgbSliders: + Elements: + - {fileID: 554119470} + - {fileID: 554148580} + - {fileID: 554139594} + HsvSliders: + Elements: + - {fileID: 554127192} + - {fileID: 554123698} + - {fileID: 553926800} + ColorToggleElement: + Elements: + - {fileID: 554147628} + AlphaSlidiers: + Elements: + - {fileID: 554128800} + ColorHeader: + Elements: + - {fileID: 554079786} + ColorCode: + Elements: + - {fileID: 4169313659256192241} + ColorPreview: + Elements: + - {fileID: 554079786} + ColorBox: + Elements: + - {fileID: 554132584} + SliderToggleButtonText: {fileID: 7008529064706881233} + PresetColorsId: default + DefaultPresetColors: + - {r: 1, g: 0, b: 0, a: 1} + - {r: 0, g: 1, b: 0, a: 1} + - {r: 0, g: 0, b: 1, a: 1} + - {r: 0, g: 0, b: 0, a: 1} + - {r: 1, g: 1, b: 1, a: 1} + onValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &553644672 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542332842} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 553635408} + m_FillRect: {fileID: 0} + m_HandleRect: {fileID: 554164580} + m_Direction: 0 + m_MinValue: 0 + m_MaxValue: 1 + m_WholeNumbers: 0 + m_Value: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &553645686 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542369290} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c600592efa0cf25479655321bf4fb08a, type: 3} + m_Name: + m_EditorClassIdentifier: + hsvpicker: {fileID: 553644664} + type: 5 +--- !u!1 &553753991 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 553753992} + - component: {fileID: 553753994} + - component: {fileID: 553753993} + m_Layer: 5 + m_Name: BottomBarBG + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &553753992 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 553753991} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1161442436} + - {fileID: 142576034} + - {fileID: 311768528} + m_Father: {fileID: 1795849913} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 100} + m_Pivot: {x: 0.5, y: 0} +--- !u!114 &553753993 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 553753991} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.6666667, g: 0.6666667, b: 0.6666667, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &553753994 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 553753991} + m_CullTransparentMesh: 1 +--- !u!222 &553781916 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542337046} + m_CullTransparentMesh: 0 +--- !u!222 &553784932 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542316138} + m_CullTransparentMesh: 0 +--- !u!222 &553787694 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542366672} + m_CullTransparentMesh: 0 +--- !u!222 &553790454 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542331830} + m_CullTransparentMesh: 0 +--- !u!222 &553792770 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542137018} + m_CullTransparentMesh: 0 +--- !u!222 &553795900 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542344880} + m_CullTransparentMesh: 0 +--- !u!222 &553798892 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542335258} + m_CullTransparentMesh: 0 +--- !u!222 &553807946 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542366372} + m_CullTransparentMesh: 0 +--- !u!222 &553807976 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542117262} + m_CullTransparentMesh: 0 +--- !u!222 &553810850 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542141224} + m_CullTransparentMesh: 0 +--- !u!222 &553816362 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542323562} + m_CullTransparentMesh: 0 +--- !u!222 &553818224 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542361736} + m_CullTransparentMesh: 0 +--- !u!222 &553819344 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542323240} + m_CullTransparentMesh: 0 +--- !u!222 &553821746 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542372262} + m_CullTransparentMesh: 0 +--- !u!222 &553822858 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542143444} + m_CullTransparentMesh: 0 +--- !u!222 &553822968 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542366052} + m_CullTransparentMesh: 0 +--- !u!222 &553823896 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542293566} + m_CullTransparentMesh: 0 +--- !u!222 &553824204 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542359600} + m_CullTransparentMesh: 0 +--- !u!222 &553824664 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542327916} + m_CullTransparentMesh: 0 +--- !u!222 &553827732 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542348014} + m_CullTransparentMesh: 0 +--- !u!222 &553827804 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542365066} + m_CullTransparentMesh: 0 +--- !u!222 &553829866 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542330208} + m_CullTransparentMesh: 0 +--- !u!222 &553833616 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542325346} + m_CullTransparentMesh: 0 +--- !u!222 &553835892 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542354316} + m_CullTransparentMesh: 0 +--- !u!222 &553836548 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542338292} + m_CullTransparentMesh: 0 +--- !u!222 &553840910 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542118244} + m_CullTransparentMesh: 0 +--- !u!222 &553861978 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542317070} + m_CullTransparentMesh: 0 +--- !u!222 &553868770 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542314444} + m_CullTransparentMesh: 0 +--- !u!222 &553875160 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542124744} + m_CullTransparentMesh: 0 +--- !u!224 &553926800 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542323916} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 4825120512563369830} + - {fileID: 554119280} + - {fileID: 5897650027748826219} + m_Father: {fileID: 554152968} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 117, y: -104.5} + m_SizeDelta: {x: 234, y: 16} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &553929380 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542343710} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 554133010} + m_Father: {fileID: 554136800} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &553931800 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542117262} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554083384} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 185.45453, y: -10} + m_SizeDelta: {x: 21.818182, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &553937442 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542344880} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554103416} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 5, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &553939908 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542293566} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554152208} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &554009830 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542322764} + m_CullTransparentMesh: 0 +--- !u!222 &554010070 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542349854} + m_CullTransparentMesh: 0 +--- !u!222 &554013382 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542356268} + m_CullTransparentMesh: 0 +--- !u!222 &554023796 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542366914} + m_CullTransparentMesh: 0 +--- !u!222 &554024268 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542337084} + m_CullTransparentMesh: 0 +--- !u!224 &554078266 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542322764} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554081856} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554079786 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542329420} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 554155292} + - {fileID: 4169313659256192241} + m_Father: {fileID: 554120590} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 120, y: -5} + m_SizeDelta: {x: 234, y: 35} + m_Pivot: {x: 0.5, y: 1} +--- !u!224 &554080188 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542369290} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 554148868} + - {fileID: 554150542} + m_Father: {fileID: 554123698} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 112, y: -8} + m_SizeDelta: {x: 174, y: 16} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554080750 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542137018} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554083384} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 51, y: -10} + m_SizeDelta: {x: 20, y: 18} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554081856 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542323562} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 554078266} + m_Father: {fileID: 554083384} + m_RootOrder: 11 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 72, y: -10} + m_SizeDelta: {x: 20, y: 18} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554083206 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542141784} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 554103904} + m_Father: {fileID: 554132584} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -12.5, y: 0} + m_SizeDelta: {x: -35, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554083384 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542366914} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 554121262} + - {fileID: 554085278} + - {fileID: 554080750} + - {fileID: 554109594} + - {fileID: 554153430} + - {fileID: 554156892} + - {fileID: 554136032} + - {fileID: 554113674} + - {fileID: 553931800} + - {fileID: 224121285110107042} + - {fileID: 554116874} + - {fileID: 554081856} + m_Father: {fileID: 554120590} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 120, y: -434.02} + m_SizeDelta: {x: 234, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554085278 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542335258} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554083384} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 30, y: -10} + m_SizeDelta: {x: 20, y: 18} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554089558 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542141224} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554126104} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554101956 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542118244} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554120338} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554103416 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542115182} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 553937442} + m_Father: {fileID: 554152208} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554103500 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542372262} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554119280} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554103904 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542119456} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 554138972} + m_Father: {fileID: 554083206} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -19, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554107440 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542114604} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 554163106} + - {fileID: 554132724} + m_Father: {fileID: 554132584} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -25, y: -5} + m_SizeDelta: {x: 20, y: -10} + m_Pivot: {x: 0, y: 1} +--- !u!224 &554109594 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542316138} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554083384} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 76.36363, y: -10} + m_SizeDelta: {x: 21.818182, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554109866 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542335870} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554152968} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 120, y: -48} + m_SizeDelta: {x: 240, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554113674 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542338292} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554083384} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 163.63635, y: -10} + m_SizeDelta: {x: 21.818182, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554116874 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542323240} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554083384} + m_RootOrder: 10 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 207.2727, y: -10} + m_SizeDelta: {x: 21.818182, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554119280 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542327772} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 554103500} + - {fileID: 554170824} + m_Father: {fileID: 553926800} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 112, y: -8} + m_SizeDelta: {x: 174, y: 16} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554119470 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542113850} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 8363915172514838617} + - {fileID: 554152208} + - {fileID: 4015938747959160258} + m_Father: {fileID: 554152968} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 117, y: -24.5} + m_SizeDelta: {x: 234, y: 16} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554120338 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542355904} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 554101956} + m_Father: {fileID: 554138972} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554120590 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542366372} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 674.18146} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 554079786} + - {fileID: 554132584} + - {fileID: 554152968} + - {fileID: 554083384} + m_Father: {fileID: 1947754233} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: -14.125977, y: 339.85193} + m_SizeDelta: {x: 240, y: 447.02} + m_Pivot: {x: 0, y: 1} +--- !u!224 &554121262 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542366672} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554083384} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 10, y: -10} + m_SizeDelta: {x: 18, y: 18} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554122588 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542314444} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554155292} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554123698 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542373550} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2382031564592239453} + - {fileID: 554080188} + - {fileID: 7727097370603474837} + m_Father: {fileID: 554152968} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 117, y: -88.5} + m_SizeDelta: {x: 234, y: 16} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554125516 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542133984} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 554164580} + m_Father: {fileID: 554126104} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554126104 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542332842} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 554089558} + - {fileID: 554125516} + m_Father: {fileID: 554127192} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 112, y: -8} + m_SizeDelta: {x: 174, y: 16} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554126506 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542334938} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 554146550} + - {fileID: 554139172} + m_Father: {fileID: 554139594} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 112, y: -8} + m_SizeDelta: {x: 174, y: 16} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554127192 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542347092} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 8959667198017361303} + - {fileID: 554126104} + - {fileID: 3294327889178383312} + m_Father: {fileID: 554152968} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 117, y: -72.5} + m_SizeDelta: {x: 234, y: 16} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554128800 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542119730} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 473728277152551495} + - {fileID: 554131376} + - {fileID: 7903871146752953575} + m_Father: {fileID: 554152968} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 117, y: -142.51} + m_SizeDelta: {x: 234, y: 123.02} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554131112 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542330208} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554150542} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 5, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554131376 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542118062} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 554155438} + - {fileID: 554138530} + m_Father: {fileID: 554128800} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 112, y: -8} + m_SizeDelta: {x: 174, y: 16} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554132584 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542323896} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 554083206} + - {fileID: 554107440} + m_Father: {fileID: 554120590} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 120, y: -130} + m_SizeDelta: {x: 234, y: 180} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554132724 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542336184} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 554160214} + m_Father: {fileID: 554107440} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554133010 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542356268} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 553929380} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 5, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554135584 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542366052} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554136800} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554136032 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542348014} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554083384} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 141.81818, y: -10} + m_SizeDelta: {x: 21.818182, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554136800 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542320942} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 554135584} + - {fileID: 553929380} + m_Father: {fileID: 554148580} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 112, y: -8} + m_SizeDelta: {x: 174, y: 16} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554138530 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542125494} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 554156104} + m_Father: {fileID: 554131376} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554138972 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542143444} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 554120338} + m_Father: {fileID: 554103904} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554139172 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542120926} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 554170284} + m_Father: {fileID: 554126506} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554139594 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542322594} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 7199539175679579108} + - {fileID: 554126506} + - {fileID: 6902966852753885536} + m_Father: {fileID: 554152968} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 117, y: -56.5} + m_SizeDelta: {x: 234, y: 16} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554140320 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542349854} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554170824} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 5, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554146550 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542337084} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554126506} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554147628 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542141628} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 224606281165395940} + m_Father: {fileID: 554152968} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 117, y: -8.25} + m_SizeDelta: {x: 234, y: 16.5} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554148580 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542293416} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 7788215078558405877} + - {fileID: 554136800} + - {fileID: 1435323633702087203} + m_Father: {fileID: 554152968} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 117, y: -40.5} + m_SizeDelta: {x: 234, y: 16} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554148868 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542124744} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554080188} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554150542 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542291442} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 554131112} + m_Father: {fileID: 554080188} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554152208 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542362468} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 553939908} + - {fileID: 554103416} + m_Father: {fileID: 554119470} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 112, y: -8} + m_SizeDelta: {x: 174, y: 16} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554152968 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542320978} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 554147628} + - {fileID: 554119470} + - {fileID: 554148580} + - {fileID: 554139594} + - {fileID: 554109866} + - {fileID: 554127192} + - {fileID: 554123698} + - {fileID: 553926800} + - {fileID: 224930228093022608} + - {fileID: 554128800} + m_Father: {fileID: 554120590} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 120, y: -220} + m_SizeDelta: {x: 234, y: 204.01999} + m_Pivot: {x: 0.5, y: 1} +--- !u!224 &554153430 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542327916} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554083384} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 98.181816, y: -10} + m_SizeDelta: {x: 21.818182, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554155292 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542331830} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 554122588} + m_Father: {fileID: 554079786} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 59.5, y: -15} + m_SizeDelta: {x: 115, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554155438 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542359600} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554131376} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554156104 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542325346} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554138530} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 5, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554156892 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542317070} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554083384} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 120, y: -10} + m_SizeDelta: {x: 21.818182, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554160214 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542365066} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554132724} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 8} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554163106 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542337046} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554107440} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554164580 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542361736} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554125516} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 5, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554170284 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542354316} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554139172} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 5, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &554170824 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542323164} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 554140320} + m_Father: {fileID: 554119280} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &576072274 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 576072275} + m_Layer: 5 + m_Name: Handle Slide Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &576072275 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 576072274} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1936480422} + m_Father: {fileID: 291205685} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &577221391 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 577221392} + - component: {fileID: 577221394} + - component: {fileID: 577221393} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &577221392 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 577221391} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1491570626} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &577221393 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 577221391} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Gif Area + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 36 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &577221394 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 577221391} + m_CullTransparentMesh: 1 +--- !u!1 &597051192 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 597051193} + - component: {fileID: 597051195} + - component: {fileID: 597051194} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &597051193 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 597051192} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1467839382} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &597051194 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 597051192} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: ID + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 30 + m_fontSizeBase: 30 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &597051195 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 597051192} + m_CullTransparentMesh: 1 +--- !u!1 &606179427 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 606179428} + - component: {fileID: 606179430} + - component: {fileID: 606179429} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &606179428 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 606179427} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1757045815} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &606179429 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 606179427} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 2757226890267cf49ab66d12478a74b3, type: 3} + m_FontSize: 42 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 4 + m_MaxSize: 42 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Enemies +--- !u!222 &606179430 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 606179427} + m_CullTransparentMesh: 1 +--- !u!1 &622277434 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 622277435} + - component: {fileID: 622277437} + - component: {fileID: 622277436} + m_Layer: 5 + m_Name: TextureUpload + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &622277435 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 622277434} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1337549312} + m_Father: {fileID: 6144536939855760294} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: -420} + m_SizeDelta: {x: 853, y: 100} + m_Pivot: {x: 0, y: 0} +--- !u!114 &622277436 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 622277434} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &622277437 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 622277434} + m_CullTransparentMesh: 1 +--- !u!1 &633136284 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 633136285} + - component: {fileID: 633136288} + - component: {fileID: 633136287} + - component: {fileID: 633136286} + m_Layer: 5 + m_Name: Scrollbar Vertical + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &633136285 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 633136284} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1117514380} + m_Father: {fileID: 473929457} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 50, y: -10} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &633136286 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 633136284} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 835771905} + m_HandleRect: {fileID: 835771904} + m_Direction: 2 + m_Value: 0 + m_Size: 1 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &633136287 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 633136284} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &633136288 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 633136284} + m_CullTransparentMesh: 1 +--- !u!1 &633479765 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 633479766} + - component: {fileID: 633479769} + - component: {fileID: 633479768} + - component: {fileID: 633479767} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &633479766 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 633479765} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2106879506} + m_Father: {fileID: 1563309375} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &633479767 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 633479765} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 633479768} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1134227394} + m_TargetAssemblyTypeName: Screenshot, Assembly-CSharp + m_MethodName: ScreenshotDefault + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &633479768 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 633479765} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &633479769 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 633479765} + m_CullTransparentMesh: 1 +--- !u!1 &647312857 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 647312858} + - component: {fileID: 647312861} + - component: {fileID: 647312860} + - component: {fileID: 647312859} + m_Layer: 5 + m_Name: LoadNP + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &647312858 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 647312857} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1995750242} + m_Father: {fileID: 1795849913} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -160} + m_SizeDelta: {x: 160, y: 60} + m_Pivot: {x: 1, y: 1} +--- !u!114 &647312859 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 647312857} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 647312860} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1629128745} + m_TargetAssemblyTypeName: FateViewerMain, Assembly-CSharp + m_MethodName: LoadNP + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &647312860 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 647312857} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &647312861 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 647312857} + m_CullTransparentMesh: 1 +--- !u!1 &653034729 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 653034730} + - component: {fileID: 653034731} + m_Layer: 5 + m_Name: Text Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &653034730 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 653034729} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1633144320} + - {fileID: 1937635513} + m_Father: {fileID: 1934371272} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &653034731 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 653034729} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: {x: -8, y: -5, z: -8, w: -5} + m_Softness: {x: 0, y: 0} +--- !u!1 &680755635 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 680755636} + - component: {fileID: 680755638} + - component: {fileID: 680755637} + m_Layer: 5 + m_Name: Name + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &680755636 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 680755635} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 255280556} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &680755637 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 680755635} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Record Current Anim + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 48 + m_fontSizeBase: 48 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 48 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &680755638 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 680755635} + m_CullTransparentMesh: 1 +--- !u!1 &683251585 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 683251586} + - component: {fileID: 683251589} + - component: {fileID: 683251588} + - component: {fileID: 683251587} + m_Layer: 5 + m_Name: GifHeight + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &683251586 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 683251585} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2013695332} + m_Father: {fileID: 1068444690} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 120, y: -205} + m_SizeDelta: {x: 160, y: 42.571} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &683251587 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 683251585} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 683251588} + m_TextViewport: {fileID: 2013695332} + m_TextComponent: {fileID: 1883444035} + m_Placeholder: {fileID: 767057059} + m_VerticalScrollbar: {fileID: 0} + m_VerticalScrollbarEventHandler: {fileID: 0} + m_LayoutGroup: {fileID: 0} + m_ScrollSensitivity: 1 + m_ContentType: 2 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 4 + m_LineType: 0 + m_HideMobileInput: 0 + m_HideSoftKeyboard: 0 + m_CharacterValidation: 2 + m_RegexValue: + m_GlobalPointSize: 25 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnSubmit: + m_PersistentCalls: + m_Calls: [] + m_OnSelect: + m_PersistentCalls: + m_Calls: [] + m_OnDeselect: + m_PersistentCalls: + m_Calls: [] + m_OnTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnEndTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_OnTouchScreenKeyboardStatusChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: 1024 + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_RichText: 1 + m_GlobalFontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_OnFocusSelectAll: 1 + m_ResetOnDeActivation: 1 + m_RestoreOriginalTextOnEscape: 1 + m_isRichTextEditingAllowed: 0 + m_LineLimit: 0 + m_InputValidator: {fileID: 0} +--- !u!114 &683251588 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 683251585} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &683251589 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 683251585} + m_CullTransparentMesh: 1 +--- !u!1 &697543529 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 697543530} + - component: {fileID: 697543532} + - component: {fileID: 697543531} + m_Layer: 5 + m_Name: Text (TMP) (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &697543530 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 697543529} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1068444690} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 0, y: -100} + m_SizeDelta: {x: 29.26001, y: 42.571} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &697543531 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 697543529} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: x + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4278190080 + m_fontColor: {r: 0, g: 0, b: 0, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 36 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &697543532 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 697543529} + m_CullTransparentMesh: 1 +--- !u!1 &738275131 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 738275132} + - component: {fileID: 738275134} + - component: {fileID: 738275133} + m_Layer: 5 + m_Name: Item Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &738275132 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 738275131} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 432149917} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &738275133 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 738275131} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &738275134 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 738275131} + m_CullTransparentMesh: 1 +--- !u!1 &746460225 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 746460226} + - component: {fileID: 746460228} + - component: {fileID: 746460227} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &746460226 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 746460225} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1966410154} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &746460227 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 746460225} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 2757226890267cf49ab66d12478a74b3, type: 3} + m_FontSize: 24 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: '>' +--- !u!222 &746460228 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 746460225} + m_CullTransparentMesh: 1 +--- !u!1 &749479953 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 749479954} + - component: {fileID: 749479956} + - component: {fileID: 749479955} + m_Layer: 5 + m_Name: ScreenshotSettings + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &749479954 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 749479953} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1068444690} + m_Father: {fileID: 1042785514} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 270, y: -864.41003} + m_SizeDelta: {x: 540, y: 284.2} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &749479955 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 749479953} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.6666667, g: 0.6666667, b: 0.6666667, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &749479956 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 749479953} + m_CullTransparentMesh: 1 +--- !u!1 &767057056 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 767057057} + - component: {fileID: 767057060} + - component: {fileID: 767057059} + - component: {fileID: 767057058} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &767057057 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 767057056} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2013695332} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &767057058 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 767057056} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 1 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &767057059 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 767057056} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Enter text... + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 2150773298 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 25 + m_fontSizeBase: 25 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 2 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 1 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &767057060 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 767057056} + m_CullTransparentMesh: 1 +--- !u!1 &768565284 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 768565285} + - component: {fileID: 768565287} + - component: {fileID: 768565286} + m_Layer: 5 + m_Name: Name + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &768565285 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 768565284} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1337549312} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &768565286 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 768565284} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Replace Texture (PC only) + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 48 + m_fontSizeBase: 48 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 48 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &768565287 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 768565284} + m_CullTransparentMesh: 1 +--- !u!1 &776964550 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 776964551} + m_Layer: 5 + m_Name: Fill Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &776964551 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 776964550} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1995491226} + m_Father: {fileID: 1903512253} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: -5, y: 0} + m_SizeDelta: {x: -20, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &788461590 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 788461591} + - component: {fileID: 788461593} + - component: {fileID: 788461592} + m_Layer: 5 + m_Name: Panel (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &788461591 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 788461590} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 83053481} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -10} + m_SizeDelta: {x: 0, y: 10} + m_Pivot: {x: 0.5, y: 0} +--- !u!114 &788461592 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 788461590} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &788461593 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 788461590} + m_CullTransparentMesh: 1 +--- !u!1 &789104129 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 789104130} + - component: {fileID: 789104132} + - component: {fileID: 789104131} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &789104130 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 789104129} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1145987506} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &789104131 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 789104129} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: "1024\u200B" + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 25 + m_fontSizeBase: 25 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 1 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &789104132 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 789104129} + m_CullTransparentMesh: 1 +--- !u!1 &789430826 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 789430827} + - component: {fileID: 789430830} + - component: {fileID: 789430829} + - component: {fileID: 789430828} + m_Layer: 5 + m_Name: ID + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &789430827 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 789430826} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 66285758} + m_Father: {fileID: 1775523607} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 398.75, y: -37.5} + m_SizeDelta: {x: 167.5, y: 75} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &789430828 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 789430826} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 789430829} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1629128743} + m_TargetAssemblyTypeName: UIController, Assembly-CSharp + m_MethodName: OrderBy + m_Mode: 5 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: ID + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &789430829 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 789430826} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &789430830 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 789430826} + m_CullTransparentMesh: 1 +--- !u!1 &792181426 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 792181427} + - component: {fileID: 792181429} + - component: {fileID: 792181428} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &792181427 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 792181426} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2073514568} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &792181428 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 792181426} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 50 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 133 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: < +--- !u!222 &792181429 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 792181426} + m_CullTransparentMesh: 1 +--- !u!114 &807643021 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 5584442607740697634, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + m_PrefabInstance: {fileID: 417423727} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &814772307 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 814772308} + - component: {fileID: 814772310} + - component: {fileID: 814772309} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &814772308 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 814772307} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 0.75, z: 1} + m_Children: [] + m_Father: {fileID: 1136636355} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.91, y: 0} + m_AnchorMax: {x: 0.91, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 75, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &814772309 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 814772307} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &814772310 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 814772307} + m_CullTransparentMesh: 1 +--- !u!1 &817349587 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 817349588} + - component: {fileID: 817349591} + - component: {fileID: 817349590} + - component: {fileID: 817349589} + m_Layer: 5 + m_Name: Template + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &817349588 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 817349587} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 294445501} + - {fileID: 1770639626} + m_Father: {fileID: 2082327792} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 2} + m_SizeDelta: {x: 0, y: 1400} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &817349589 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 817349587} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 1198509157} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 2 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 45 + m_Viewport: {fileID: 294445501} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 1770639627} + m_HorizontalScrollbarVisibility: 0 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: 0 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &817349590 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 817349587} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &817349591 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 817349587} + m_CullTransparentMesh: 1 +--- !u!1 &825046901 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 825046902} + - component: {fileID: 825046905} + - component: {fileID: 825046904} + - component: {fileID: 825046903} + m_Layer: 5 + m_Name: BGPanel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &825046902 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 825046901} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 874258504} + - {fileID: 33074901} + - {fileID: 1467839382} + - {fileID: 429802296} + m_Father: {fileID: 5584442607537429346} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 650, y: 75} + m_Pivot: {x: 0, y: 1} +--- !u!114 &825046903 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 825046901} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &825046904 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 825046901} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.6666667, g: 0.6666667, b: 0.6666667, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &825046905 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 825046901} + m_CullTransparentMesh: 1 +--- !u!1 &828999971 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 828999972} + - component: {fileID: 828999974} + - component: {fileID: 828999973} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &828999972 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 828999971} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 440561373} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &828999973 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 828999971} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: "1024\u200B" + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 25 + m_fontSizeBase: 25 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 1 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &828999974 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 828999971} + m_CullTransparentMesh: 1 +--- !u!1 &829969186 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 829969187} + - component: {fileID: 829969190} + - component: {fileID: 829969189} + - component: {fileID: 829969188} + m_Layer: 5 + m_Name: Date + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &829969187 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 829969186} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1557162220} + m_Father: {fileID: 1775523607} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 231.25, y: -37.5} + m_SizeDelta: {x: 167.5, y: 75} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &829969188 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 829969186} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 829969189} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1629128743} + m_TargetAssemblyTypeName: UIController, Assembly-CSharp + m_MethodName: OrderBy + m_Mode: 5 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: Date + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &829969189 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 829969186} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &829969190 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 829969186} + m_CullTransparentMesh: 1 +--- !u!1 &835771903 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 835771904} + - component: {fileID: 835771906} + - component: {fileID: 835771905} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &835771904 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 835771903} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1117514380} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &835771905 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 835771903} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &835771906 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 835771903} + m_CullTransparentMesh: 1 +--- !u!1 &870154645 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 870154646} + - component: {fileID: 870154649} + - component: {fileID: 870154648} + - component: {fileID: 870154647} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &870154646 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 870154645} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 915102314} + m_Father: {fileID: 1963536239} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &870154647 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 870154645} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 870154648} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1629128743} + m_TargetAssemblyTypeName: UIController, Assembly-CSharp + m_MethodName: FlipCharacter + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &870154648 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 870154645} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &870154649 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 870154645} + m_CullTransparentMesh: 1 +--- !u!1 &874067377 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 874067378} + - component: {fileID: 874067381} + - component: {fileID: 874067380} + - component: {fileID: 874067379} + m_Layer: 5 + m_Name: Scrollbar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &874067378 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 874067377} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 532639358} + m_Father: {fileID: 1513490774} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 0} + m_Pivot: {x: 1, y: 1} +--- !u!114 &874067379 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 874067377} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1639192708} + m_HandleRect: {fileID: 1639192707} + m_Direction: 2 + m_Value: 0 + m_Size: 0.81333333 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &874067380 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 874067377} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &874067381 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 874067377} + m_CullTransparentMesh: 1 +--- !u!1 &874258503 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 874258504} + - component: {fileID: 874258505} + m_Layer: 5 + m_Name: Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &874258504 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 874258503} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1635515878} + m_Father: {fileID: 825046902} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 73.75, y: -37.5} + m_SizeDelta: {x: 147.5, y: 75} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &874258505 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 874258503} + m_CullTransparentMesh: 1 +--- !u!1 &877353366 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 877353367} + - component: {fileID: 877353369} + - component: {fileID: 877353368} + m_Layer: 5 + m_Name: Fill + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &877353367 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 877353366} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 282010330} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0.03807615, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 10, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &877353368 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 877353366} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &877353369 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 877353366} + m_CullTransparentMesh: 1 +--- !u!1 &892227526 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 892227527} + - component: {fileID: 892227528} + - component: {fileID: 892227529} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &892227527 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 892227526} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 200655630} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &892227528 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 892227526} + m_CullTransparentMesh: 1 +--- !u!114 &892227529 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 892227526} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &894008366 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 894008367} + - component: {fileID: 894008369} + - component: {fileID: 894008368} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &894008367 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 894008366} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 532730164} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &894008368 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 894008366} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 2757226890267cf49ab66d12478a74b3, type: 3} + m_FontSize: 42 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 55 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Servants +--- !u!222 &894008369 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 894008366} + m_CullTransparentMesh: 1 +--- !u!1 &894745902 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 894745903} + - component: {fileID: 894745906} + - component: {fileID: 894745905} + - component: {fileID: 894745904} + m_Layer: 5 + m_Name: ErrorScrollView + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &894745903 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 894745902} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1154623539} + - {fileID: 1768565094} + - {fileID: 1682781253} + m_Father: {fileID: 1269587798} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 0, y: -440} + m_SizeDelta: {x: 800, y: 1120} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &894745904 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 894745902} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 1705203302} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 1 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 1154623539} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 0} + m_HorizontalScrollbarVisibility: 2 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: -3 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &894745905 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 894745902} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &894745906 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 894745902} + m_CullTransparentMesh: 1 +--- !u!1 &915102313 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 915102314} + - component: {fileID: 915102316} + - component: {fileID: 915102315} + m_Layer: 5 + m_Name: Name + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &915102314 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 915102313} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 870154646} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &915102315 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 915102313} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Mirror Character + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 48 + m_fontSizeBase: 48 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 48 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &915102316 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 915102313} + m_CullTransparentMesh: 1 +--- !u!1 &922663354 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 922663355} + - component: {fileID: 922663357} + - component: {fileID: 922663356} + m_Layer: 5 + m_Name: GifArea + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &922663355 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 922663354} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 399285040} + - {fileID: 456023903} + - {fileID: 91295568} + - {fileID: 417722380} + - {fileID: 1491570626} + m_Father: {fileID: 1795849913} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 1528.2, y: 1286} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &922663356 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 922663354} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 1, b: 0, a: 0.23529412} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &922663357 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 922663354} + m_CullTransparentMesh: 1 +--- !u!1 &925091078 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 925091079} + - component: {fileID: 925091082} + - component: {fileID: 925091081} + - component: {fileID: 925091080} + m_Layer: 5 + m_Name: CharactersListButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &925091079 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 925091078} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1958713235} + m_Father: {fileID: 1304524551} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 300, y: 0} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &925091080 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 925091078} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 925091081} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1629128743} + m_TargetAssemblyTypeName: UIController, Assembly-CSharp + m_MethodName: ToggleVisibleButton + m_Mode: 2 + m_Arguments: + m_ObjectArgument: {fileID: 3787751} + m_ObjectArgumentAssemblyTypeName: UnityEngine.GameObject, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &925091081 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 925091078} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &925091082 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 925091078} + m_CullTransparentMesh: 1 +--- !u!1 &930806655 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 930806656} + - component: {fileID: 930806659} + - component: {fileID: 930806658} + - component: {fileID: 930806657} + m_Layer: 5 + m_Name: Scrollbar Vertical + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &930806656 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 930806655} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1228398355} + m_Father: {fileID: 1044199563} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 50, y: 0} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &930806657 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 930806655} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 2009433917} + m_HandleRect: {fileID: 2009433916} + m_Direction: 2 + m_Value: 0 + m_Size: 1 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &930806658 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 930806655} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.6666667, g: 0.6666667, b: 0.6666667, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &930806659 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 930806655} + m_CullTransparentMesh: 1 +--- !u!1 &953248309 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 953248310} + - component: {fileID: 953248312} + - component: {fileID: 953248311} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &953248310 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 953248309} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 142576034} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &953248311 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 953248309} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Properties + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 50 + m_fontSizeBase: 50 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &953248312 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 953248309} + m_CullTransparentMesh: 1 +--- !u!1 &1016600977 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1016600978} + - component: {fileID: 1016600981} + - component: {fileID: 1016600980} + - component: {fileID: 1016600979} + m_Layer: 5 + m_Name: Scrollbar Vertical + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1016600978 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1016600977} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1568295833} + m_Father: {fileID: 1030230481} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: -17} + m_Pivot: {x: 1, y: 1} +--- !u!114 &1016600979 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1016600977} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1655994647} + m_HandleRect: {fileID: 1655994646} + m_Direction: 2 + m_Value: 0 + m_Size: 0.82857144 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1016600980 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1016600977} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1016600981 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1016600977} + m_CullTransparentMesh: 1 +--- !u!1 &1019656804 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1019656805} + - component: {fileID: 1019656808} + - component: {fileID: 1019656807} + - component: {fileID: 1019656806} + m_Layer: 5 + m_Name: Name + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1019656805 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1019656804} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1511445304} + m_Father: {fileID: 1775523607} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 566.25, y: -37.5} + m_SizeDelta: {x: 167.5, y: 75} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1019656806 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1019656804} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1019656807} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1629128743} + m_TargetAssemblyTypeName: UIController, Assembly-CSharp + m_MethodName: OrderBy + m_Mode: 5 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: Name + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &1019656807 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1019656804} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1019656808 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1019656804} + m_CullTransparentMesh: 1 +--- !u!1 &1030230480 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1030230481} + - component: {fileID: 1030230484} + - component: {fileID: 1030230483} + - component: {fileID: 1030230482} + m_Layer: 5 + m_Name: SettingsBar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1030230481 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1030230480} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2142715264} + - {fileID: 1016600978} + m_Father: {fileID: 1795849913} + m_RootOrder: 7 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -25} + m_SizeDelta: {x: 540, y: -250} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &1030230482 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1030230480} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 1404419001} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 2 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 45 + m_Viewport: {fileID: 2142715264} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 1016600979} + m_HorizontalScrollbarVisibility: 2 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: -3 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1030230483 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1030230480} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1030230484 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1030230480} + m_CullTransparentMesh: 1 +--- !u!1 &1042785513 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1042785514} + - component: {fileID: 1042785517} + - component: {fileID: 1042785516} + - component: {fileID: 1042785515} + m_Layer: 5 + m_Name: SettingsBar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1042785514 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1042785513} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1243768362} + - {fileID: 2051375977} + - {fileID: 1806041143} + - {fileID: 1684536182} + - {fileID: 549399991} + - {fileID: 749479954} + - {fileID: 1336599967} + - {fileID: 491643501} + m_Father: {fileID: 1404419001} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 523, y: 300} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1042785515 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1042785513} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 0 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &1042785516 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1042785513} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.6666667, g: 0.6666667, b: 0.6666667, a: 0.3137255} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1042785517 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1042785513} + m_CullTransparentMesh: 1 +--- !u!224 &1044199563 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + m_PrefabInstance: {fileID: 417423727} + m_PrefabAsset: {fileID: 0} +--- !u!1 &1045690869 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1045690870} + - component: {fileID: 1045690872} + - component: {fileID: 1045690871} + m_Layer: 5 + m_Name: Text (TMP) (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1045690870 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1045690869} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 491643501} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: -0.000061035156, y: 0.000061035156} + m_SizeDelta: {x: 456, y: 100} + m_Pivot: {x: 0.5, y: 0} +--- !u!114 &1045690871 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1045690869} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: In cooperation with Atlas Academy community + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 30.5 + m_fontSizeBase: 30.5 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1045690872 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1045690869} + m_CullTransparentMesh: 1 +--- !u!1 &1065452731 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1065452732} + - component: {fileID: 1065452734} + - component: {fileID: 1065452733} + m_Layer: 5 + m_Name: Item Checkmark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1065452732 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1065452731} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1152238945} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 10, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1065452733 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1065452731} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1065452734 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1065452731} + m_CullTransparentMesh: 1 +--- !u!1 &1067406013 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1067406014} + - component: {fileID: 1067406016} + - component: {fileID: 1067406015} + m_Layer: 5 + m_Name: Name + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1067406014 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1067406013} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 450634483} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 75} + m_SizeDelta: {x: 327.3, y: 50} + m_Pivot: {x: 0, y: 0} +--- !u!114 &1067406015 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1067406013} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 2757226890267cf49ab66d12478a74b3, type: 3} + m_FontSize: 35 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Zoom Speed +--- !u!222 &1067406016 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1067406013} + m_CullTransparentMesh: 1 +--- !u!1 &1068444689 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1068444690} + - component: {fileID: 1068444692} + - component: {fileID: 1068444691} + m_Layer: 5 + m_Name: Resolution + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1068444690 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1068444689} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1273918213} + - {fileID: 1934371272} + - {fileID: 697543530} + - {fileID: 1337976894} + - {fileID: 1598173324} + - {fileID: 1340416477} + - {fileID: 1324126500} + - {fileID: 683251586} + m_Father: {fileID: 749479954} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0.00012207031, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1068444691 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1068444689} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1068444692 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1068444689} + m_CullTransparentMesh: 1 +--- !u!1 &1085728947 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1085728948} + - component: {fileID: 1085728950} + - component: {fileID: 1085728949} + m_Layer: 5 + m_Name: Item Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1085728948 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1085728947} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 432149917} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 5, y: -0.5} + m_SizeDelta: {x: -30, y: -3} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1085728949 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1085728947} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 2757226890267cf49ab66d12478a74b3, type: 3} + m_FontSize: 25 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Option A +--- !u!222 &1085728950 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1085728947} + m_CullTransparentMesh: 1 +--- !u!1 &1117514379 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1117514380} + m_Layer: 5 + m_Name: Sliding Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1117514380 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1117514379} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 835771904} + m_Father: {fileID: 633136285} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1120324146 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1120324147} + - component: {fileID: 1120324150} + - component: {fileID: 1120324149} + - component: {fileID: 1120324148} + m_Layer: 5 + m_Name: ColorPickerDrag + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1120324147 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1120324146} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 674.18146} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1947754233} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 105.874146, y: 354.45193} + m_SizeDelta: {x: 60, y: 60} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1120324148 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1120324146} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f32beaa0f6204644c9b5c9ee82ee6984, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Delegates: [] + alsoDrag: {fileID: 0} + alsoDragOffset: {x: 0, y: 0, z: 0} +--- !u!114 &1120324149 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1120324146} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10915, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1120324150 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1120324146} + m_CullTransparentMesh: 1 +--- !u!1 &1123903222 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1123903225} + - component: {fileID: 1123903224} + - component: {fileID: 1123903223} + m_Layer: 5 + m_Name: Item Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1123903223 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1123903222} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 2757226890267cf49ab66d12478a74b3, type: 3} + m_FontSize: 60 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 138 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Option A +--- !u!222 &1123903224 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1123903222} + m_CullTransparentMesh: 1 +--- !u!224 &1123903225 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1123903222} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1152238945} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 5, y: -0.5} + m_SizeDelta: {x: -30, y: -3} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1134227392 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 2643716285177954892, guid: 6e92b65c635811545b96e40e5ce028a6, type: 3} + m_PrefabInstance: {fileID: 1931490994} + m_PrefabAsset: {fileID: 0} +--- !u!114 &1134227393 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1134227392} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 278fb6ec5b3d906479f56f047f620777, type: 3} + m_Name: + m_EditorClassIdentifier: + TargetCenter: {x: 0, y: 0, z: 0} + camZoomMin: 1 + camZoomMax: 15 + camZoom: 2.4 + moveSpeed: 0.5 + zoomSpeed: 0.2 +--- !u!114 &1134227394 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1134227392} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 16e36c739b6e83d43b3787f158318a87, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &1134227398 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1134227392} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: df0c736ae643c464986a460f3f8686f1, type: 3} + m_Name: + m_EditorClassIdentifier: + CameraTargetHelper: {fileID: 0} + TargetCenter: {x: 0, y: 0, z: 0} + camZoom: 2.4 + camHeight: 0.87 + targetHeight: 0.87 + fov: 45 +--- !u!1 &1136636354 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1136636355} + m_Layer: 5 + m_Name: Handle Slide Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1136636355 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1136636354} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 814772308} + m_Father: {fileID: 1903512253} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1140426496 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1140426497} + - component: {fileID: 1140426499} + - component: {fileID: 1140426498} + m_Layer: 5 + m_Name: Name + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1140426497 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1140426496} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 78225926} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1140426498 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1140426496} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Toggle Texture Filtering + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 48 + m_fontSizeBase: 48 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 48 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1140426499 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1140426496} + m_CullTransparentMesh: 1 +--- !u!1 &1145987505 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1145987506} + - component: {fileID: 1145987507} + m_Layer: 5 + m_Name: Text Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1145987506 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1145987505} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1263874591} + - {fileID: 789104130} + m_Father: {fileID: 1337976894} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1145987507 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1145987505} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: {x: -8, y: -5, z: -8, w: -5} + m_Softness: {x: 0, y: 0} +--- !u!1 &1152238944 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1152238945} + - component: {fileID: 1152238946} + m_Layer: 5 + m_Name: Item + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1152238945 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1152238944} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 240971855} + - {fileID: 1065452732} + - {fileID: 1123903225} + m_Father: {fileID: 1198509157} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 70} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1152238946 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1152238944} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 240971856} + toggleTransition: 1 + graphic: {fileID: 1065452733} + m_Group: {fileID: 0} + onValueChanged: + m_PersistentCalls: + m_Calls: [] + m_IsOn: 1 +--- !u!1 &1154623538 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1154623539} + - component: {fileID: 1154623542} + - component: {fileID: 1154623541} + - component: {fileID: 1154623540} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1154623539 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1154623538} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1705203302} + m_Father: {fileID: 894745903} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1154623540 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1154623538} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!114 &1154623541 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1154623538} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1154623542 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1154623538} + m_CullTransparentMesh: 1 +--- !u!1 &1161063151 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1161063152} + - component: {fileID: 1161063155} + - component: {fileID: 1161063154} + - component: {fileID: 1161063153} + m_Layer: 5 + m_Name: RightButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1161063152 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1161063151} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1938820394} + m_Father: {fileID: 2082327792} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0.00390625, y: -0.0002975464} + m_SizeDelta: {x: 160, y: 0} + m_Pivot: {x: 0.0000009946525, y: 0.49999997} +--- !u!114 &1161063153 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1161063151} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 0 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1161063154} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1161063154 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1161063151} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1161063155 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1161063151} + m_CullTransparentMesh: 1 +--- !u!1 &1161442435 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1161442436} + - component: {fileID: 1161442438} + - component: {fileID: 1161442437} + m_Layer: 5 + m_Name: TimeControls + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1161442436 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1161442435} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2120611123} + - {fileID: 2073514568} + - {fileID: 1246995910} + m_Father: {fileID: 553753992} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -920, y: 100} + m_Pivot: {x: 0.5, y: 0} +--- !u!114 &1161442437 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1161442435} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1161442438 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1161442435} + m_CullTransparentMesh: 1 +--- !u!1 &1166923768 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1166923769} + m_Layer: 5 + m_Name: Handle Slide Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1166923769 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1166923768} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 303575083} + m_Father: {fileID: 2120611123} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1169300950 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1169300951} + m_Layer: 5 + m_Name: Sliding Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1169300951 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1169300950} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 222269745} + m_Father: {fileID: 1770639626} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1179146380 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1179146381} + - component: {fileID: 1179146383} + - component: {fileID: 1179146382} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1179146381 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1179146380} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1903512253} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: -121, y: -15} + m_SizeDelta: {x: 122.0919, y: 30} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &1179146382 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1179146380} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 2757226890267cf49ab66d12478a74b3, type: 3} + m_FontSize: 30 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 63 + m_Alignment: 7 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Cutoff +--- !u!222 &1179146383 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1179146380} + m_CullTransparentMesh: 1 +--- !u!1 &1186027991 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1186027993} + - component: {fileID: 1186027992} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &1186027992 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1186027991} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 0 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &1186027993 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1186027991} + m_LocalRotation: {x: 0.9659258, y: 0, z: 0, w: 0.2588191} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 150, y: 0, z: 0} +--- !u!1 &1198509156 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1198509157} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1198509157 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1198509156} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1152238945} + m_Father: {fileID: 294445501} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 70} + m_Pivot: {x: 0.5, y: 1} +--- !u!1 &1209094548 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1209094549} + - component: {fileID: 1209094552} + - component: {fileID: 1209094551} + - component: {fileID: 1209094550} + m_Layer: 5 + m_Name: Slider Display + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1209094549 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1209094548} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2120611123} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 100, y: 0} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &1209094550 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1209094548} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 463f2c721f4b1d04ca7d262a66b5f8e3, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &1209094551 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1209094548} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 2757226890267cf49ab66d12478a74b3, type: 3} + m_FontSize: 43 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 63 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 100 +--- !u!222 &1209094552 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1209094548} + m_CullTransparentMesh: 1 +--- !u!1 &1228398354 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1228398355} + m_Layer: 5 + m_Name: Sliding Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1228398355 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1228398354} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2009433916} + m_Father: {fileID: 930806656} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1243768361 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1243768362} + - component: {fileID: 1243768364} + - component: {fileID: 1243768363} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1243768362 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1243768361} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2038854073} + m_Father: {fileID: 1042785514} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 270, y: -33.5} + m_SizeDelta: {x: 540, y: 67} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1243768363 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1243768361} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.6666667, g: 0.6666667, b: 0.6666667, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1243768364 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1243768361} + m_CullTransparentMesh: 1 +--- !u!1 &1246995909 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1246995910} + - component: {fileID: 1246995913} + - component: {fileID: 1246995912} + - component: {fileID: 1246995911} + m_Layer: 5 + m_Name: RightButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1246995910 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1246995909} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1505422408} + m_Father: {fileID: 1161442436} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 100, y: 0} + m_SizeDelta: {x: 100, y: 0} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &1246995911 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1246995909} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 0 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1246995912} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1629128745} + m_TargetAssemblyTypeName: FateViewerMain, Assembly-CSharp + m_MethodName: ChangeAnimationFrame + m_Mode: 3 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 1 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &1246995912 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1246995909} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1246995913 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1246995909} + m_CullTransparentMesh: 1 +--- !u!1 &1248073481 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1248073482} + - component: {fileID: 1248073484} + - component: {fileID: 1248073483} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1248073482 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1248073481} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 429802296} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1248073483 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1248073481} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Name + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 30 + m_fontSizeBase: 30 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1248073484 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1248073481} + m_CullTransparentMesh: 1 +--- !u!1 &1255164662 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1255164663} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1255164663 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1255164662} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 432149917} + m_Father: {fileID: 322154412} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 28} + m_Pivot: {x: 0.5, y: 1} +--- !u!1 &1259265219 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1259265222} + - component: {fileID: 1259265221} + - component: {fileID: 1259265220} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1259265220 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1259265219} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalAxis: Horizontal + m_VerticalAxis: Vertical + m_SubmitButton: Submit + m_CancelButton: Cancel + m_InputActionsPerSecond: 10 + m_RepeatDelay: 0.5 + m_ForceModuleActive: 0 +--- !u!114 &1259265221 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1259265219} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &1259265222 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1259265219} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1263228559 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1263228560} + m_Layer: 5 + m_Name: Sliding Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1263228560 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1263228559} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1499306720} + m_Father: {fileID: 1682781253} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1263874590 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1263874591} + - component: {fileID: 1263874594} + - component: {fileID: 1263874593} + - component: {fileID: 1263874592} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1263874591 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1263874590} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1145987506} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1263874592 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1263874590} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 1 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &1263874593 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1263874590} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Enter text... + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 2150773298 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 25 + m_fontSizeBase: 25 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 2 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 1 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1263874594 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1263874590} + m_CullTransparentMesh: 1 +--- !u!1 &1269587794 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1269587798} + - component: {fileID: 1269587797} + - component: {fileID: 1269587796} + - component: {fileID: 1269587795} + - component: {fileID: 1269587799} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1269587795 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1269587794} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1269587796 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1269587794} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 1 + m_ReferencePixelsPerUnit: 200 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 2000, y: 2000} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &1269587797 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1269587794} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &1269587798 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1269587794} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 1962495171} + - {fileID: 1795849913} + - {fileID: 894745903} + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!114 &1269587799 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1269587794} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 04b7f5d5c02504e4bb1b88be0835b9e8, type: 3} + m_Name: + m_EditorClassIdentifier: + sceneWidth: 1 + sceneHeight: 1 +--- !u!1 &1273918212 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1273918213} + - component: {fileID: 1273918215} + - component: {fileID: 1273918214} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1273918213 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1273918212} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1068444690} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0.00012207031, y: 0} + m_SizeDelta: {x: 0, y: 95} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &1273918214 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1273918212} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 'Screenshot Resolution + + (0 = screen resolution)' + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 36 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1273918215 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1273918212} + m_CullTransparentMesh: 1 +--- !u!850595691 &1278537712 +LightingSettings: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Settings.lighting + serializedVersion: 3 + m_GIWorkflowMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 1 + m_RealtimeEnvironmentLighting: 1 + m_BounceScale: 1 + m_AlbedoBoost: 1 + m_IndirectOutputScale: 1 + m_UsingShadowmask: 1 + m_BakeBackend: 1 + m_LightmapMaxSize: 1024 + m_BakeResolution: 40 + m_Padding: 2 + m_TextureCompression: 1 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAO: 0 + m_MixedBakeMode: 2 + m_LightmapsBakeMode: 1 + m_FilterMode: 1 + m_LightmapParameters: {fileID: 15204, guid: 0000000000000000f000000000000000, type: 0} + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_RealtimeResolution: 2 + m_ForceWhiteAlbedo: 0 + m_ForceUpdates: 0 + m_FinalGather: 0 + m_FinalGatherRayCount: 256 + m_FinalGatherFiltering: 1 + m_PVRCulling: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_LightProbeSampleCountMultiplier: 4 + m_PVRBounces: 2 + m_PVRMinBounces: 2 + m_PVREnvironmentMIS: 0 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 +--- !u!1 &1280518977 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1280518978} + - component: {fileID: 1280518980} + - component: {fileID: 1280518979} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1280518978 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1280518977} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 238250954} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1280518979 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1280518977} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1280518980 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1280518977} + m_CullTransparentMesh: 1 +--- !u!1 &1304524550 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1304524551} + - component: {fileID: 1304524553} + - component: {fileID: 1304524552} + m_Layer: 5 + m_Name: TopBarBG + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1304524551 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1304524550} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2082327792} + - {fileID: 925091079} + m_Father: {fileID: 1795849913} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 150} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &1304524552 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1304524550} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.6666667, g: 0.6666667, b: 0.6666667, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1304524553 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1304524550} + m_CullTransparentMesh: 1 +--- !u!1 &1324126499 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1324126500} + - component: {fileID: 1324126502} + - component: {fileID: 1324126501} + m_Layer: 5 + m_Name: Text (TMP) (3) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1324126500 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1324126499} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1068444690} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 0, y: -205} + m_SizeDelta: {x: 29.26001, y: 42.571} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &1324126501 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1324126499} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: x + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4278190080 + m_fontColor: {r: 0, g: 0, b: 0, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 36 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1324126502 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1324126499} + m_CullTransparentMesh: 1 +--- !u!1 &1324206426 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1324206427} + - component: {fileID: 1324206429} + - component: {fileID: 1324206428} + m_Layer: 5 + m_Name: Panel (3) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1324206427 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1324206426} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 83053481} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 10, y: 0} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &1324206428 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1324206426} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 1} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1324206429 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1324206426} + m_CullTransparentMesh: 1 +--- !u!1 &1336599966 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1336599967} + - component: {fileID: 1336599969} + - component: {fileID: 1336599968} + m_Layer: 5 + m_Name: Credits + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1336599967 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1336599966} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1347856243} + m_Father: {fileID: 1042785514} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 270, y: -1040.01} + m_SizeDelta: {x: 540, y: 67} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1336599968 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1336599966} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.6666667, g: 0.6666667, b: 0.6666667, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1336599969 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1336599966} + m_CullTransparentMesh: 1 +--- !u!1 &1337549311 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1337549312} + - component: {fileID: 1337549315} + - component: {fileID: 1337549314} + - component: {fileID: 1337549313} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1337549312 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1337549311} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 768565285} + m_Father: {fileID: 622277435} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1337549313 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1337549311} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1337549314} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1629128741} + m_TargetAssemblyTypeName: FateModelBuilder, Assembly-CSharp + m_MethodName: ReplaceTexture + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 1337549313} + m_TargetAssemblyTypeName: UnityEngine.UI.Selectable, UnityEngine.UI + m_MethodName: set_interactable + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 123349437} + m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 +--- !u!114 &1337549314 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1337549311} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1337549315 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1337549311} + m_CullTransparentMesh: 1 +--- !u!1 &1337976893 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1337976894} + - component: {fileID: 1337976897} + - component: {fileID: 1337976896} + - component: {fileID: 1337976895} + m_Layer: 5 + m_Name: SSHeight + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1337976894 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1337976893} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1145987506} + m_Father: {fileID: 1068444690} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 120, y: -99.99998} + m_SizeDelta: {x: 160, y: 42.571} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &1337976895 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1337976893} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1337976896} + m_TextViewport: {fileID: 1145987506} + m_TextComponent: {fileID: 789104131} + m_Placeholder: {fileID: 1263874593} + m_VerticalScrollbar: {fileID: 0} + m_VerticalScrollbarEventHandler: {fileID: 0} + m_LayoutGroup: {fileID: 0} + m_ScrollSensitivity: 1 + m_ContentType: 2 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 4 + m_LineType: 0 + m_HideMobileInput: 0 + m_HideSoftKeyboard: 0 + m_CharacterValidation: 2 + m_RegexValue: + m_GlobalPointSize: 25 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnSubmit: + m_PersistentCalls: + m_Calls: [] + m_OnSelect: + m_PersistentCalls: + m_Calls: [] + m_OnDeselect: + m_PersistentCalls: + m_Calls: [] + m_OnTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnEndTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_OnTouchScreenKeyboardStatusChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: 1024 + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_RichText: 1 + m_GlobalFontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_OnFocusSelectAll: 1 + m_ResetOnDeActivation: 1 + m_RestoreOriginalTextOnEscape: 1 + m_isRichTextEditingAllowed: 0 + m_LineLimit: 0 + m_InputValidator: {fileID: 0} +--- !u!114 &1337976896 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1337976893} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1337976897 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1337976893} + m_CullTransparentMesh: 1 +--- !u!1 &1340416476 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1340416477} + - component: {fileID: 1340416480} + - component: {fileID: 1340416479} + - component: {fileID: 1340416478} + m_Layer: 5 + m_Name: GifWidth + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1340416477 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1340416476} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 440561373} + m_Father: {fileID: 1068444690} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: -120, y: -205} + m_SizeDelta: {x: 160, y: 42.571} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &1340416478 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1340416476} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1340416479} + m_TextViewport: {fileID: 440561373} + m_TextComponent: {fileID: 828999973} + m_Placeholder: {fileID: 1917739044} + m_VerticalScrollbar: {fileID: 0} + m_VerticalScrollbarEventHandler: {fileID: 0} + m_LayoutGroup: {fileID: 0} + m_ScrollSensitivity: 1 + m_ContentType: 2 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 4 + m_LineType: 0 + m_HideMobileInput: 0 + m_HideSoftKeyboard: 0 + m_CharacterValidation: 2 + m_RegexValue: + m_GlobalPointSize: 25 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnSubmit: + m_PersistentCalls: + m_Calls: [] + m_OnSelect: + m_PersistentCalls: + m_Calls: [] + m_OnDeselect: + m_PersistentCalls: + m_Calls: [] + m_OnTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnEndTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_OnTouchScreenKeyboardStatusChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: 1024 + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_RichText: 1 + m_GlobalFontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_OnFocusSelectAll: 1 + m_ResetOnDeActivation: 1 + m_RestoreOriginalTextOnEscape: 1 + m_isRichTextEditingAllowed: 0 + m_LineLimit: 0 + m_InputValidator: {fileID: 0} +--- !u!114 &1340416479 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1340416476} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1340416480 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1340416476} + m_CullTransparentMesh: 1 +--- !u!1 &1347856242 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1347856243} + - component: {fileID: 1347856245} + - component: {fileID: 1347856244} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1347856243 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1347856242} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1336599967} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0.00012207031, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1347856244 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1347856242} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Credits + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 36 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1347856245 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1347856242} + m_CullTransparentMesh: 1 +--- !u!1 &1352404747 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1352404748} + - component: {fileID: 1352404751} + - component: {fileID: 1352404750} + - component: {fileID: 1352404749} + m_Layer: 5 + m_Name: Slider Display + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1352404748 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1352404747} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1903512253} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 100, y: 0} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &1352404749 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1352404747} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 463f2c721f4b1d04ca7d262a66b5f8e3, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &1352404750 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1352404747} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 2757226890267cf49ab66d12478a74b3, type: 3} + m_FontSize: 43 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 63 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 91 +--- !u!222 &1352404751 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1352404747} + m_CullTransparentMesh: 1 +--- !u!1 &1369057218 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1369057219} + - component: {fileID: 1369057222} + - component: {fileID: 1369057221} + - component: {fileID: 1369057220} + m_Layer: 5 + m_Name: SliderDisplay + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1369057219 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1369057218} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 450634483} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 98.9, y: 0} + m_SizeDelta: {x: 79.15, y: 30} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &1369057220 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1369057218} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 2757226890267cf49ab66d12478a74b3, type: 3} + m_FontSize: 25 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 1 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 0.2 +--- !u!114 &1369057221 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1369057218} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 463f2c721f4b1d04ca7d262a66b5f8e3, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!222 &1369057222 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1369057218} + m_CullTransparentMesh: 1 +--- !u!1 &1388151343 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1388151346} + - component: {fileID: 1388151345} + - component: {fileID: 1388151344} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1388151344 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1388151343} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 2757226890267cf49ab66d12478a74b3, type: 3} + m_FontSize: 80 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 80 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: +--- !u!222 &1388151345 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1388151343} + m_CullTransparentMesh: 1 +--- !u!224 &1388151346 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1388151343} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2082327792} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -7.5, y: -0.5} + m_SizeDelta: {x: -35, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1404419000 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1404419001} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1404419001 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1404419000} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1042785514} + m_Father: {fileID: 2142715264} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 300} + m_Pivot: {x: 0, y: 1} +--- !u!1 &1422332925 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1422332926} + m_Layer: 5 + m_Name: Sliding Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1422332926 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1422332925} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 180814946} + m_Father: {fileID: 448109306} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1464018679 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1464018680} + - component: {fileID: 1464018683} + - component: {fileID: 1464018682} + - component: {fileID: 1464018681} + m_Layer: 5 + m_Name: BackgroundDropdown + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1464018680 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1464018679} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1545826699} + - {fileID: 1864743053} + - {fileID: 1513490774} + - {fileID: 105503890} + - {fileID: 1966410154} + m_Father: {fileID: 2051375977} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 250, y: 60} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1464018681 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1464018679} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0d0b652f32a2cc243917e4028fa0f046, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 0 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1464018682} + m_Template: {fileID: 1513490774} + m_CaptionText: {fileID: 1545826700} + m_CaptionImage: {fileID: 0} + m_ItemText: {fileID: 1085728949} + m_ItemImage: {fileID: 0} + m_Value: 0 + m_Options: + m_Options: + - m_Text: Unity Default + m_Image: {fileID: 0} + - m_Text: Solid Color + m_Image: {fileID: 0} + - m_Text: VOID + m_Image: {fileID: 0} + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_AlphaFadeSpeed: 0.15 +--- !u!114 &1464018682 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1464018679} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1464018683 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1464018679} + m_CullTransparentMesh: 1 +--- !u!1 &1466389664 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1466389665} + - component: {fileID: 1466389667} + - component: {fileID: 1466389666} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1466389665 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1466389664} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 549399991} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0.00012207031, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1466389666 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1466389664} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Screenshots + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 36 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1466389667 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1466389664} + m_CullTransparentMesh: 1 +--- !u!1 &1467839381 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1467839382} + - component: {fileID: 1467839385} + - component: {fileID: 1467839384} + - component: {fileID: 1467839383} + m_Layer: 5 + m_Name: ID + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1467839382 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1467839381} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 597051193} + m_Father: {fileID: 825046902} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 398.75, y: -37.5} + m_SizeDelta: {x: 167.5, y: 75} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1467839383 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1467839381} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1467839384} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1629128743} + m_TargetAssemblyTypeName: UIController, Assembly-CSharp + m_MethodName: OrderBy + m_Mode: 5 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: ID + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &1467839384 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1467839381} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1467839385 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1467839381} + m_CullTransparentMesh: 1 +--- !u!1 &1475437438 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1475437439} + - component: {fileID: 1475437441} + - component: {fileID: 1475437440} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1475437439 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1475437438} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 291205685} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1475437440 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1475437438} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1475437441 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1475437438} + m_CullTransparentMesh: 1 +--- !u!1 &1478549760 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1478549761} + m_Layer: 5 + m_Name: Sliding Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1478549761 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1478549760} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 168435800} + m_Father: {fileID: 532172406} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1491570625 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1491570626} + - component: {fileID: 1491570628} + - component: {fileID: 1491570627} + m_Layer: 5 + m_Name: Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1491570626 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1491570625} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 577221392} + m_Father: {fileID: 922663355} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -10, y: -10} + m_SizeDelta: {x: 366, y: 82} + m_Pivot: {x: 1, y: 1} +--- !u!114 &1491570627 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1491570625} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.7058824} + m_RaycastTarget: 0 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1491570628 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1491570625} + m_CullTransparentMesh: 1 +--- !u!1 &1499306719 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1499306720} + - component: {fileID: 1499306722} + - component: {fileID: 1499306721} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1499306720 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1499306719} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1263228560} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.3333333} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1499306721 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1499306719} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1499306722 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1499306719} + m_CullTransparentMesh: 1 +--- !u!1 &1505422407 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1505422408} + - component: {fileID: 1505422410} + - component: {fileID: 1505422409} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1505422408 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1505422407} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1246995910} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1505422409 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1505422407} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 50 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 133 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: '>' +--- !u!222 &1505422410 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1505422407} + m_CullTransparentMesh: 1 +--- !u!1001 &1509624403 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 3787752} + m_Modifications: + - target: {fileID: 5584442607264144721, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_SizeDelta.y + value: 75 + objectReference: {fileID: 0} + - target: {fileID: 5584442607264144727, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_Spacing + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 5584442607264144727, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_Padding.m_Top + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 5584442607264144727, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_ChildControlWidth + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5584442607579438788, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5584442607579438795, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607579438795, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607579438795, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_SizeDelta.x + value: -47 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697634, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_MovementType + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697634, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_ScrollSensitivity + value: 90 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697634, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_VerticalScrollbar + value: + objectReference: {fileID: 448109307} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_RootOrder + value: 3 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_SizeDelta.x + value: 700 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_SizeDelta.y + value: -100.00012 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_AnchoredPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_AnchoredPosition.y + value: -50 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697660, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_Name + value: EnemiesList + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697660, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} +--- !u!1 &1511445303 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1511445304} + - component: {fileID: 1511445306} + - component: {fileID: 1511445305} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1511445304 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1511445303} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1019656805} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1511445305 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1511445303} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Name + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 30 + m_fontSizeBase: 30 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1511445306 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1511445303} + m_CullTransparentMesh: 1 +--- !u!1 &1513490773 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1513490774} + - component: {fileID: 1513490777} + - component: {fileID: 1513490776} + - component: {fileID: 1513490775} + m_Layer: 5 + m_Name: Template + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1513490774 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1513490773} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 322154412} + - {fileID: 874067378} + m_Father: {fileID: 1464018680} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 2} + m_SizeDelta: {x: 0, y: 150} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &1513490775 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1513490773} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 1255164663} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 2 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 45 + m_Viewport: {fileID: 322154412} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 874067379} + m_HorizontalScrollbarVisibility: 0 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: 0 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1513490776 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1513490773} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1513490777 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1513490773} + m_CullTransparentMesh: 1 +--- !u!1 &1532913568 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1532913569} + - component: {fileID: 1532913571} + - component: {fileID: 1532913570} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1532913569 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1532913568} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 279547836} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1532913570 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1532913568} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 99 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 133 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: < +--- !u!222 &1532913571 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1532913568} + m_CullTransparentMesh: 1 +--- !u!1 &1535567145 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1535567146} + - component: {fileID: 1535567148} + - component: {fileID: 1535567147} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1535567146 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1535567145} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1962495171} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1535567147 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1535567145} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 2757226890267cf49ab66d12478a74b3, type: 3} + m_FontSize: 26 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 5 + m_MaxSize: 90 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Hide UI +--- !u!222 &1535567148 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1535567145} + m_CullTransparentMesh: 1 +--- !u!1 &1545826698 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1545826699} + - component: {fileID: 1545826701} + - component: {fileID: 1545826700} + m_Layer: 5 + m_Name: Label + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1545826699 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1545826698} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1464018680} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: -7.5, y: -0.5000038} + m_SizeDelta: {x: -35, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1545826700 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1545826698} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 2757226890267cf49ab66d12478a74b3, type: 3} + m_FontSize: 25 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 0 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Unity Default +--- !u!222 &1545826701 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1545826698} + m_CullTransparentMesh: 1 +--- !u!1 &1557162219 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1557162220} + - component: {fileID: 1557162222} + - component: {fileID: 1557162221} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1557162220 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1557162219} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 829969187} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1557162221 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1557162219} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Date + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 30 + m_fontSizeBase: 30 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1557162222 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1557162219} + m_CullTransparentMesh: 1 +--- !u!1 &1563309374 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1563309375} + - component: {fileID: 1563309377} + - component: {fileID: 1563309376} + m_Layer: 5 + m_Name: ScreenshotB + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1563309375 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1563309374} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 633479766} + m_Father: {fileID: 6144536939855760294} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: -210} + m_SizeDelta: {x: 853, y: 100} + m_Pivot: {x: 0, y: 0} +--- !u!114 &1563309376 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1563309374} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1563309377 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1563309374} + m_CullTransparentMesh: 1 +--- !u!1 &1563841758 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1563841759} + - component: {fileID: 1563841761} + - component: {fileID: 1563841760} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1563841759 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1563841758} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 311768528} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1563841760 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1563841758} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Settings + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 50 + m_fontSizeBase: 50 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1563841761 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1563841758} + m_CullTransparentMesh: 1 +--- !u!1 &1566159004 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1566159005} + - component: {fileID: 1566159007} + - component: {fileID: 1566159006} + m_Layer: 5 + m_Name: Fill + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1566159005 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1566159004} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1683688901} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 10, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1566159006 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1566159004} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1566159007 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1566159004} + m_CullTransparentMesh: 1 +--- !u!1 &1568295832 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1568295833} + m_Layer: 5 + m_Name: Sliding Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1568295833 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1568295832} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1655994646} + m_Father: {fileID: 1016600978} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1586939657 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1586939658} + - component: {fileID: 1586939660} + - component: {fileID: 1586939659} + m_Layer: 5 + m_Name: Arrow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1586939658 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1586939657} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2082327792} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -15, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1586939659 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1586939657} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10915, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1586939660 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1586939657} + m_CullTransparentMesh: 1 +--- !u!1 &1590487161 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1590487162} + - component: {fileID: 1590487164} + - component: {fileID: 1590487163} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1590487162 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1590487161} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1941527402} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1590487163 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1590487161} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 'sort by:' + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 30 + m_fontSizeBase: 30 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1590487164 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1590487161} + m_CullTransparentMesh: 1 +--- !u!1 &1598173323 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1598173324} + - component: {fileID: 1598173326} + - component: {fileID: 1598173325} + m_Layer: 5 + m_Name: Text (TMP) (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1598173324 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1598173323} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1068444690} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0.00012207031, y: -146.00003} + m_SizeDelta: {x: 0, y: 55} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &1598173325 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1598173323} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Gif Resolution + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 36 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1598173326 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1598173323} + m_CullTransparentMesh: 1 +--- !u!1 &1601237270 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1601237271} + - component: {fileID: 1601237274} + - component: {fileID: 1601237273} + - component: {fileID: 1601237272} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1601237271 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1601237270} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 301878244} + m_Father: {fileID: 123349438} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 1000, y: 500} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1601237272 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1601237270} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1601237273} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 123349437} + m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 1337549313} + m_TargetAssemblyTypeName: UnityEngine.UI.Selectable, UnityEngine.UI + m_MethodName: set_interactable + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 +--- !u!114 &1601237273 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1601237270} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1601237274 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1601237270} + m_CullTransparentMesh: 1 +--- !u!1 &1615931756 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1615931757} + - component: {fileID: 1615931759} + - component: {fileID: 1615931758} + m_Layer: 5 + m_Name: Background + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1615931757 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1615931756} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2120611123} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1615931758 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1615931756} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.8301887, g: 0.8301887, b: 0.8301887, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1615931759 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1615931756} + m_CullTransparentMesh: 1 +--- !u!1 &1629128740 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1629128742} + - component: {fileID: 1629128745} + - component: {fileID: 1629128744} + - component: {fileID: 1629128743} + - component: {fileID: 1629128741} + - component: {fileID: 1629128748} + - component: {fileID: 1629128746} + - component: {fileID: 1629128747} + - component: {fileID: 1629128751} + - component: {fileID: 1629128750} + - component: {fileID: 1629128749} + m_Layer: 0 + m_Name: SceneController + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1629128741 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1629128740} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2635ae45de879d24f8ef8ed4092a90b7, type: 3} + m_Name: + m_EditorClassIdentifier: + ParticleMaterial: {fileID: 2100000, guid: 1bac49c670089404fb108d9219385a04, type: 2} + LoadingInProgress: 0 + AnimatorController: {fileID: 22100000, guid: 0919e19fb8da694419976b32618b1731, type: 2} +--- !u!4 &1629128742 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1629128740} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1629128743 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1629128740} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 205f98a68ac16e5408e2a84efdf1ede8, type: 3} + m_Name: + m_EditorClassIdentifier: + KnobsVisible: 0 + LoadedCharaButton: {fileID: 6579709008394472268} + BackgroundDropdown: {fileID: 1464018681} + BodyAnimationDropdown: {fileID: 2082327791} + MeshesListContent: {fileID: 6144536939855760294} + ServantList: {fileID: 5584442607537429347} + EnemiesList: {fileID: 1924500984} + ServantCostumeList: {fileID: 807643021} + EnemyCostumeList: {fileID: 1654274484} + CutoffSlider: {fileID: 1903512254} + ReloadTextureButton: {fileID: 1337549313} + SSWidth: {fileID: 1934371273} + SSHeight: {fileID: 1337976895} + GifWidth: {fileID: 1340416478} + GifHeight: {fileID: 683251587} + SSVisual: {fileID: 83053484} + GifVisual: {fileID: 922663355} + CameraSettingsPanel: {fileID: 1684536181} + ColorPickerPanel: {fileID: 1947754232} + ColorPicker: {fileID: 542366372} +--- !u!114 &1629128744 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1629128740} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 07843c4377dd7cb4495bedfa1057ddc7, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &1629128745 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1629128740} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dec20ea0ce00a8e42973c5a4f74e55e2, type: 3} + m_Name: + m_EditorClassIdentifier: + AAAPI: https://api.atlasacademy.io/export/ + Region: JP + debugUrl: s.a.test/website/modelViewer.html + SpawnedServants: [] + AnimationName: + Servants: + Entries: [] + Enemies: + Entries: [] + Cam: {fileID: 0} + TimeScale: 1 + TimeScaleSlider: {fileID: 2120611124} +--- !u!114 &1629128746 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1629128740} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9299d9abed8fe544d9243415030b02fb, type: 3} + m_Name: + m_EditorClassIdentifier: + KeyStrokes: +--- !u!114 &1629128747 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1629128740} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 08f59ad0b3dd34047a946f66d2d85b81, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &1629128748 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1629128740} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a27da48354afb9a4faf06ab69ecb72df, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &1629128749 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1629128740} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fa66f75ff0e8a134b8014ca7a6e65689, type: 3} + m_Name: + m_EditorClassIdentifier: + stop: 0 +--- !u!114 &1629128750 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1629128740} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d1fedddfa0089b345a878136430804db, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &1629128751 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1629128740} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f325cabb713fda64883a9da908c774ed, type: 3} + m_Name: + m_EditorClassIdentifier: + TextureReady: 0 +--- !u!1 &1633144319 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1633144320} + - component: {fileID: 1633144323} + - component: {fileID: 1633144322} + - component: {fileID: 1633144321} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1633144320 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1633144319} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 653034730} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1633144321 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1633144319} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 1 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &1633144322 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1633144319} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Enter text... + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 2150773298 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 25 + m_fontSizeBase: 25 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 2 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 1 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1633144323 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1633144319} + m_CullTransparentMesh: 1 +--- !u!1 &1635515877 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1635515878} + - component: {fileID: 1635515880} + - component: {fileID: 1635515879} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1635515878 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1635515877} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 874258504} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1635515879 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1635515877} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 'sort by:' + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 30 + m_fontSizeBase: 30 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1635515880 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1635515877} + m_CullTransparentMesh: 1 +--- !u!1 &1639192706 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1639192707} + - component: {fileID: 1639192709} + - component: {fileID: 1639192708} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1639192707 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1639192706} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 532639358} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0.81333333} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1639192708 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1639192706} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1639192709 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1639192706} + m_CullTransparentMesh: 1 +--- !u!114 &1654274484 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 5584442607740697634, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + m_PrefabInstance: {fileID: 1766272574} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &1655994645 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1655994646} + - component: {fileID: 1655994648} + - component: {fileID: 1655994647} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1655994646 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1655994645} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1568295833} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0.82857144} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1655994647 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1655994645} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1655994648 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1655994645} + m_CullTransparentMesh: 1 +--- !u!1 &1679240987 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1679240988} + - component: {fileID: 1679240990} + - component: {fileID: 1679240989} + m_Layer: 5 + m_Name: CutoffSlider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1679240988 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1679240987} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1903512253} + m_Father: {fileID: 6144536939855760294} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 426.5, y: -630} + m_SizeDelta: {x: 853, y: 100} + m_Pivot: {x: 0.5, y: 0} +--- !u!114 &1679240989 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1679240987} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1679240990 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1679240987} + m_CullTransparentMesh: 1 +--- !u!1 &1682781252 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1682781253} + - component: {fileID: 1682781256} + - component: {fileID: 1682781255} + - component: {fileID: 1682781254} + m_Layer: 5 + m_Name: Scrollbar Vertical + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1682781253 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1682781252} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1263228560} + m_Father: {fileID: 894745903} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: -17} + m_Pivot: {x: 1, y: 1} +--- !u!114 &1682781254 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1682781252} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1499306721} + m_HandleRect: {fileID: 1499306720} + m_Direction: 2 + m_Value: 1 + m_Size: 0.6666667 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1682781255 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1682781252} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1682781256 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1682781252} + m_CullTransparentMesh: 1 +--- !u!1 &1683688900 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1683688901} + m_Layer: 5 + m_Name: Fill Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1683688901 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1683688900} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1566159005} + m_Father: {fileID: 2120611123} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.25} + m_AnchorMax: {x: 1, y: 0.75} + m_AnchoredPosition: {x: -5, y: 0} + m_SizeDelta: {x: -20, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1684536181 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1684536182} + - component: {fileID: 1684536184} + - component: {fileID: 1684536183} + m_Layer: 5 + m_Name: CameraSettings + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1684536182 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1684536181} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2041497182} + - {fileID: 1971428427} + m_Father: {fileID: 1042785514} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 540, y: -444.655} + m_SizeDelta: {x: 540, y: 421.31} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &1684536183 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1684536181} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.19607843} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1684536184 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1684536181} + m_CullTransparentMesh: 1 +--- !u!1 &1705203301 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1705203302} + - component: {fileID: 1705203304} + - component: {fileID: 1705203303} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1705203302 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1705203301} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1154623539} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.00010157506} + m_SizeDelta: {x: 0.000061035, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1705203303 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1705203301} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 5 + m_Right: 0 + m_Top: 5 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 10 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &1705203304 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1705203301} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!1 &1757045814 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1757045815} + - component: {fileID: 1757045818} + - component: {fileID: 1757045817} + - component: {fileID: 1757045816} + m_Layer: 5 + m_Name: Enemies + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1757045815 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1757045814} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 606179428} + m_Father: {fileID: 3787752} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 900, y: -50} + m_SizeDelta: {x: 600, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1757045816 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1757045814} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1757045817} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 5584442607537429373} + m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 1924500982} + m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 + - m_Target: {fileID: 1757045816} + m_TargetAssemblyTypeName: UnityEngine.UI.Selectable, UnityEngine.UI + m_MethodName: set_interactable + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 532730165} + m_TargetAssemblyTypeName: UnityEngine.UI.Selectable, UnityEngine.UI + m_MethodName: set_interactable + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 1 + m_CallState: 2 +--- !u!114 &1757045817 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1757045814} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1757045818 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1757045814} + m_CullTransparentMesh: 1 +--- !u!1001 &1766272574 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 1924500983} + m_Modifications: + - target: {fileID: 5584442607264144721, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_SizeDelta.y + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 5584442607264144727, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_Spacing + value: 5 + objectReference: {fileID: 0} + - target: {fileID: 5584442607264144727, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_ChildControlWidth + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5584442607579438788, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5584442607579438795, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607579438795, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_AnchorMax.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607579438795, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_SizeDelta.x + value: -47 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697634, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_MovementType + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697634, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_VerticalScrollbar + value: + objectReference: {fileID: 633136286} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_Pivot.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_Pivot.y + value: 0.5 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_RootOrder + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_AnchorMax.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_AnchorMax.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_AnchorMin.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_AnchorMin.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_SizeDelta.x + value: 500 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_SizeDelta.y + value: -0.00024414062 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_AnchoredPosition.x + value: 705 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_AnchoredPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697660, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_Name + value: EnemiesList2 + objectReference: {fileID: 0} + - target: {fileID: 5584442607740697660, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + propertyPath: m_IsActive + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} +--- !u!1 &1768565093 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1768565094} + - component: {fileID: 1768565097} + - component: {fileID: 1768565096} + - component: {fileID: 1768565095} + m_Layer: 5 + m_Name: Scrollbar Horizontal + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1768565094 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1768565093} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 238250954} + m_Father: {fileID: 894745903} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -17, y: 20} + m_Pivot: {x: 0, y: 0} +--- !u!114 &1768565095 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1768565093} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1280518979} + m_HandleRect: {fileID: 1280518978} + m_Direction: 0 + m_Value: 0 + m_Size: 1 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1768565096 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1768565093} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1768565097 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1768565093} + m_CullTransparentMesh: 1 +--- !u!1 &1770639625 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1770639626} + - component: {fileID: 1770639629} + - component: {fileID: 1770639628} + - component: {fileID: 1770639627} + m_Layer: 5 + m_Name: Scrollbar + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1770639626 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1770639625} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1169300951} + m_Father: {fileID: 817349588} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 0} + m_Pivot: {x: 1, y: 1} +--- !u!114 &1770639627 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1770639625} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 222269746} + m_HandleRect: {fileID: 222269745} + m_Direction: 2 + m_Value: 0 + m_Size: 0.99999285 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1770639628 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1770639625} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1770639629 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1770639625} + m_CullTransparentMesh: 1 +--- !u!1 &1775523606 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1775523607} + - component: {fileID: 1775523610} + - component: {fileID: 1775523609} + - component: {fileID: 1775523608} + m_Layer: 5 + m_Name: BGPanel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1775523607 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1775523606} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1941527402} + - {fileID: 829969187} + - {fileID: 789430827} + - {fileID: 1019656805} + m_Father: {fileID: 1924500983} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 650, y: 75} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1775523608 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1775523606} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &1775523609 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1775523606} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.6666667, g: 0.6666667, b: 0.6666667, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1775523610 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1775523606} + m_CullTransparentMesh: 1 +--- !u!1 &1776824537 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1776824538} + - component: {fileID: 1776824540} + - component: {fileID: 1776824539} + m_Layer: 5 + m_Name: Text (TMP) (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1776824538 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1776824537} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 491643501} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: -0.000061035156, y: 0} + m_SizeDelta: {x: 456, y: 120} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &1776824539 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1776824537} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Made by Katboi01 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 40 + m_fontSizeBase: 40 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1776824540 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1776824537} + m_CullTransparentMesh: 1 +--- !u!1 &1795849912 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1795849913} + - component: {fileID: 1795849914} + m_Layer: 5 + m_Name: UI + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1795849913 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1795849912} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1304524551} + - {fileID: 553753992} + - {fileID: 647312858} + - {fileID: 1947754233} + - {fileID: 6144536940590394068} + - {fileID: 3787752} + - {fileID: 123349438} + - {fileID: 1030230481} + - {fileID: 83053481} + - {fileID: 922663355} + m_Father: {fileID: 1269587798} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1795849914 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1795849912} + m_CullTransparentMesh: 1 +--- !u!1 &1800095226 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1800095227} + - component: {fileID: 1800095230} + - component: {fileID: 1800095229} + - component: {fileID: 1800095228} + m_Layer: 5 + m_Name: SliderDisplay + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1800095227 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1800095226} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 291205685} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: 98.9, y: 0} + m_SizeDelta: {x: 79.15, y: 30} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &1800095228 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1800095226} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 2757226890267cf49ab66d12478a74b3, type: 3} + m_FontSize: 25 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 40 + m_Alignment: 1 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 0.5 +--- !u!114 &1800095229 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1800095226} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 463f2c721f4b1d04ca7d262a66b5f8e3, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!222 &1800095230 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1800095226} + m_CullTransparentMesh: 1 +--- !u!1 &1806041142 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1806041143} + - component: {fileID: 1806041145} + - component: {fileID: 1806041144} + m_Layer: 5 + m_Name: Camera + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1806041143 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1806041142} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 133189759} + m_Father: {fileID: 1042785514} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 270, y: -200.5} + m_SizeDelta: {x: 540, y: 67} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1806041144 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1806041142} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.6666667, g: 0.6666667, b: 0.6666667, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1806041145 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1806041142} + m_CullTransparentMesh: 1 +--- !u!1 &1864743052 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1864743053} + - component: {fileID: 1864743055} + - component: {fileID: 1864743054} + m_Layer: 5 + m_Name: Arrow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1864743053 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1864743052} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1464018680} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -15, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1864743054 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1864743052} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10915, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1864743055 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1864743052} + m_CullTransparentMesh: 1 +--- !u!1 &1867591814 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1867591815} + - component: {fileID: 1867591817} + - component: {fileID: 1867591816} + m_Layer: 5 + m_Name: RecordB + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1867591815 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1867591814} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 255280556} + m_Father: {fileID: 6144536939855760294} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: -315} + m_SizeDelta: {x: 853, y: 100} + m_Pivot: {x: 0, y: 0} +--- !u!114 &1867591816 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1867591814} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1867591817 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1867591814} + m_CullTransparentMesh: 1 +--- !u!1 &1883444033 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1883444034} + - component: {fileID: 1883444036} + - component: {fileID: 1883444035} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1883444034 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1883444033} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2013695332} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1883444035 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1883444033} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: "1024\u200B" + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 25 + m_fontSizeBase: 25 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 1 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1883444036 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1883444033} + m_CullTransparentMesh: 1 +--- !u!1 &1903512252 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1903512253} + - component: {fileID: 1903512254} + m_Layer: 5 + m_Name: Slider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1903512253 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1903512252} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 152391108} + - {fileID: 1179146381} + - {fileID: 314759980} + - {fileID: 776964551} + - {fileID: 1136636355} + - {fileID: 1352404748} + m_Father: {fileID: 1679240988} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 5, y: -50} + m_SizeDelta: {x: -230, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1903512254 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1903512252} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 814772309} + m_FillRect: {fileID: 1995491226} + m_HandleRect: {fileID: 814772308} + m_Direction: 0 + m_MinValue: 0 + m_MaxValue: 100 + m_WholeNumbers: 1 + m_Value: 91 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1352404749} + m_TargetAssemblyTypeName: SliderDisplay, Assembly-CSharp + m_MethodName: UpdateDisplayInt + m_Mode: 0 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &1917739041 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1917739042} + - component: {fileID: 1917739045} + - component: {fileID: 1917739044} + - component: {fileID: 1917739043} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1917739042 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1917739041} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 440561373} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1917739043 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1917739041} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 1 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &1917739044 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1917739041} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Enter text... + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 2150773298 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 25 + m_fontSizeBase: 25 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 2 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 1 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1917739045 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1917739041} + m_CullTransparentMesh: 1 +--- !u!1 &1924500982 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 5584442607740697660, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + m_PrefabInstance: {fileID: 1509624403} + m_PrefabAsset: {fileID: 0} +--- !u!224 &1924500983 stripped +RectTransform: + m_CorrespondingSourceObject: {fileID: 5584442607740697635, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + m_PrefabInstance: {fileID: 1509624403} + m_PrefabAsset: {fileID: 0} +--- !u!114 &1924500984 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 5584442607740697634, guid: 73cd158a510fe584cb64b1c54d1edc2f, type: 3} + m_PrefabInstance: {fileID: 1509624403} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1924500982} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1001 &1931490994 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 2643716285177954889, guid: 6e92b65c635811545b96e40e5ce028a6, type: 3} + propertyPath: m_RootOrder + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 2643716285177954889, guid: 6e92b65c635811545b96e40e5ce028a6, type: 3} + propertyPath: m_LocalPosition.x + value: -5 + objectReference: {fileID: 0} + - target: {fileID: 2643716285177954889, guid: 6e92b65c635811545b96e40e5ce028a6, type: 3} + propertyPath: m_LocalPosition.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 2643716285177954889, guid: 6e92b65c635811545b96e40e5ce028a6, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2643716285177954889, guid: 6e92b65c635811545b96e40e5ce028a6, type: 3} + propertyPath: m_LocalRotation.w + value: 0.7071068 + objectReference: {fileID: 0} + - target: {fileID: 2643716285177954889, guid: 6e92b65c635811545b96e40e5ce028a6, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2643716285177954889, guid: 6e92b65c635811545b96e40e5ce028a6, type: 3} + propertyPath: m_LocalRotation.y + value: 0.7071068 + objectReference: {fileID: 0} + - target: {fileID: 2643716285177954889, guid: 6e92b65c635811545b96e40e5ce028a6, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2643716285177954889, guid: 6e92b65c635811545b96e40e5ce028a6, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2643716285177954889, guid: 6e92b65c635811545b96e40e5ce028a6, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 90 + objectReference: {fileID: 0} + - target: {fileID: 2643716285177954889, guid: 6e92b65c635811545b96e40e5ce028a6, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2643716285177954892, guid: 6e92b65c635811545b96e40e5ce028a6, type: 3} + propertyPath: m_Name + value: Camera + objectReference: {fileID: 0} + - target: {fileID: 2643716285177954892, guid: 6e92b65c635811545b96e40e5ce028a6, type: 3} + propertyPath: m_TagString + value: MainCamera + objectReference: {fileID: 0} + - target: {fileID: 2643716285177954894, guid: 6e92b65c635811545b96e40e5ce028a6, type: 3} + propertyPath: m_ClearFlags + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 2643716285177954894, guid: 6e92b65c635811545b96e40e5ce028a6, type: 3} + propertyPath: orthographic + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 2643716285177954894, guid: 6e92b65c635811545b96e40e5ce028a6, type: 3} + propertyPath: field of view + value: 60 + objectReference: {fileID: 0} + - target: {fileID: 2643716285177954894, guid: 6e92b65c635811545b96e40e5ce028a6, type: 3} + propertyPath: m_TargetTexture + value: + objectReference: {fileID: 0} + - target: {fileID: 2643716285177954894, guid: 6e92b65c635811545b96e40e5ce028a6, type: 3} + propertyPath: near clip plane + value: 0.01 + objectReference: {fileID: 0} + - target: {fileID: 2643716285177954894, guid: 6e92b65c635811545b96e40e5ce028a6, type: 3} + propertyPath: orthographic size + value: 1.5 + objectReference: {fileID: 0} + - target: {fileID: 2643716285177954894, guid: 6e92b65c635811545b96e40e5ce028a6, type: 3} + propertyPath: m_BackGroundColor.b + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2643716285177954894, guid: 6e92b65c635811545b96e40e5ce028a6, type: 3} + propertyPath: m_BackGroundColor.g + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2643716285177954894, guid: 6e92b65c635811545b96e40e5ce028a6, type: 3} + propertyPath: m_BackGroundColor.r + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2643716285177954894, guid: 6e92b65c635811545b96e40e5ce028a6, type: 3} + propertyPath: m_NormalizedViewPortRect.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2643716285177954894, guid: 6e92b65c635811545b96e40e5ce028a6, type: 3} + propertyPath: m_NormalizedViewPortRect.width + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 6e92b65c635811545b96e40e5ce028a6, type: 3} +--- !u!1 &1934371271 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1934371272} + - component: {fileID: 1934371275} + - component: {fileID: 1934371274} + - component: {fileID: 1934371273} + m_Layer: 5 + m_Name: SSWidth + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1934371272 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1934371271} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 653034730} + m_Father: {fileID: 1068444690} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: -120, y: -100} + m_SizeDelta: {x: 160, y: 42.571} + m_Pivot: {x: 0.5, y: 1} +--- !u!114 &1934371273 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1934371271} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1934371274} + m_TextViewport: {fileID: 653034730} + m_TextComponent: {fileID: 1937635514} + m_Placeholder: {fileID: 1633144322} + m_VerticalScrollbar: {fileID: 0} + m_VerticalScrollbarEventHandler: {fileID: 0} + m_LayoutGroup: {fileID: 0} + m_ScrollSensitivity: 1 + m_ContentType: 2 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 4 + m_LineType: 0 + m_HideMobileInput: 0 + m_HideSoftKeyboard: 0 + m_CharacterValidation: 2 + m_RegexValue: + m_GlobalPointSize: 25 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnSubmit: + m_PersistentCalls: + m_Calls: [] + m_OnSelect: + m_PersistentCalls: + m_Calls: [] + m_OnDeselect: + m_PersistentCalls: + m_Calls: [] + m_OnTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnEndTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_OnTouchScreenKeyboardStatusChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: 1024 + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_RichText: 1 + m_GlobalFontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_OnFocusSelectAll: 1 + m_ResetOnDeActivation: 1 + m_RestoreOriginalTextOnEscape: 1 + m_isRichTextEditingAllowed: 0 + m_LineLimit: 0 + m_InputValidator: {fileID: 0} +--- !u!114 &1934371274 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1934371271} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1934371275 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1934371271} + m_CullTransparentMesh: 1 +--- !u!1 &1936480421 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1936480422} + - component: {fileID: 1936480424} + - component: {fileID: 1936480423} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1936480422 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1936480421} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 576072275} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.098196395, y: 0} + m_AnchorMax: {x: 0.098196395, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 75, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1936480423 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1936480421} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1936480424 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1936480421} + m_CullTransparentMesh: 1 +--- !u!1 &1937635512 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1937635513} + - component: {fileID: 1937635515} + - component: {fileID: 1937635514} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1937635513 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1937635512} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 653034730} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1937635514 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1937635512} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: "1024\u200B" + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 25 + m_fontSizeBase: 25 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 1 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1937635515 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1937635512} + m_CullTransparentMesh: 1 +--- !u!1 &1938820393 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1938820394} + - component: {fileID: 1938820396} + - component: {fileID: 1938820395} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1938820394 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1938820393} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1161063152} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1938820395 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1938820393} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 99 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 133 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: '>' +--- !u!222 &1938820396 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1938820393} + m_CullTransparentMesh: 1 +--- !u!1 &1941527401 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1941527402} + - component: {fileID: 1941527403} + m_Layer: 5 + m_Name: Panel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1941527402 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1941527401} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1590487162} + m_Father: {fileID: 1775523607} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 73.75, y: -37.5} + m_SizeDelta: {x: 147.5, y: 75} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1941527403 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1941527401} + m_CullTransparentMesh: 1 +--- !u!1 &1947754232 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1947754233} + m_Layer: 0 + m_Name: ColorPicker + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!4 &1947754233 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1947754232} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 801.1, y: -206.9, z: -674.18146} + m_LocalScale: {x: 2.5, y: 2.5, z: 1} + m_Children: + - {fileID: 554120590} + - {fileID: 1120324147} + m_Father: {fileID: 1795849913} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1958713234 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1958713235} + - component: {fileID: 1958713237} + - component: {fileID: 1958713236} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1958713235 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1958713234} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 925091079} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1958713236 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1958713234} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Characters List + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 50 + m_fontSizeBase: 50 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1958713237 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1958713234} + m_CullTransparentMesh: 1 +--- !u!1 &1962495170 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1962495171} + - component: {fileID: 1962495174} + - component: {fileID: 1962495173} + - component: {fileID: 1962495172} + m_Layer: 5 + m_Name: HideUI + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1962495171 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1962495170} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1535567146} + m_Father: {fileID: 1269587798} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 104.70001, y: 32.05005} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1962495172 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1962495170} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 0 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1962495173} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1962495173 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1962495170} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1962495174 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1962495170} + m_CullTransparentMesh: 1 +--- !u!1 &1963536238 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1963536239} + - component: {fileID: 1963536241} + - component: {fileID: 1963536240} + m_Layer: 5 + m_Name: FlipButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1963536239 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1963536238} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 870154646} + m_Father: {fileID: 6144536939855760294} + m_RootOrder: 6 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: -735} + m_SizeDelta: {x: 853, y: 100} + m_Pivot: {x: 0, y: 0} +--- !u!114 &1963536240 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1963536238} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1963536241 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1963536238} + m_CullTransparentMesh: 1 +--- !u!1 &1966410153 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1966410154} + - component: {fileID: 1966410157} + - component: {fileID: 1966410156} + - component: {fileID: 1966410155} + m_Layer: 5 + m_Name: RightButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1966410154 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1966410153} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 746460226} + m_Father: {fileID: 1464018680} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0.00390625, y: 0.00095558167} + m_SizeDelta: {x: 60, y: 0} + m_Pivot: {x: -0.00000024586916, y: 0.5000014} +--- !u!114 &1966410155 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1966410153} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 0 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1966410156} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1966410156 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1966410153} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1966410157 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1966410153} + m_CullTransparentMesh: 1 +--- !u!1 &1971428426 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1971428427} + - component: {fileID: 1971428430} + - component: {fileID: 1971428429} + - component: {fileID: 1971428428} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1971428427 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1971428426} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 300513929} + m_Father: {fileID: 1684536182} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 38, y: -27} + m_SizeDelta: {x: 180, y: 80} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1971428428 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1971428426} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 1971428429} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1629128745} + m_TargetAssemblyTypeName: FateViewerMain, Assembly-CSharp + m_MethodName: ToggleCameraMode + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &1971428429 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1971428426} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1971428430 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1971428426} + m_CullTransparentMesh: 1 +--- !u!1 &1995491225 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1995491226} + - component: {fileID: 1995491228} + - component: {fileID: 1995491227} + m_Layer: 5 + m_Name: Fill + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1995491226 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1995491225} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 776964551} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0.91, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 10, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1995491227 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1995491225} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1995491228 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1995491225} + m_CullTransparentMesh: 1 +--- !u!1 &1995750241 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1995750242} + - component: {fileID: 1995750244} + - component: {fileID: 1995750243} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1995750242 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1995750241} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 647312858} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1995750243 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1995750241} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Load NP + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 30 + m_fontSizeBase: 30 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1995750244 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1995750241} + m_CullTransparentMesh: 1 +--- !u!1 &2009433915 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2009433916} + - component: {fileID: 2009433918} + - component: {fileID: 2009433917} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2009433916 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2009433915} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1228398355} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2009433917 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2009433915} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &2009433918 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2009433915} + m_CullTransparentMesh: 1 +--- !u!1 &2013695331 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2013695332} + - component: {fileID: 2013695333} + m_Layer: 5 + m_Name: Text Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2013695332 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2013695331} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 767057057} + - {fileID: 1883444034} + m_Father: {fileID: 683251586} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2013695333 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2013695331} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: {x: -8, y: -5, z: -8, w: -5} + m_Softness: {x: 0, y: 0} +--- !u!1 &2038854072 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2038854073} + - component: {fileID: 2038854075} + - component: {fileID: 2038854074} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2038854073 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2038854072} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1243768362} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0.00012207031, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2038854074 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2038854072} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Background + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 36 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &2038854075 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2038854072} + m_CullTransparentMesh: 1 +--- !u!1 &2041360091 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2041360092} + - component: {fileID: 2041360094} + - component: {fileID: 2041360093} + m_Layer: 5 + m_Name: Name + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2041360092 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2041360091} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 291205685} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 75} + m_SizeDelta: {x: 327.3, y: 50} + m_Pivot: {x: 0, y: 0} +--- !u!114 &2041360093 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2041360091} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 2757226890267cf49ab66d12478a74b3, type: 3} + m_FontSize: 35 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 0 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Movement Speed +--- !u!222 &2041360094 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2041360091} + m_CullTransparentMesh: 1 +--- !u!1 &2041497181 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2041497182} + - component: {fileID: 2041497184} + - component: {fileID: 2041497183} + m_Layer: 5 + m_Name: CameraModeFree + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2041497182 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2041497181} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 450634483} + - {fileID: 291205685} + m_Father: {fileID: 1684536182} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2041497183 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2041497181} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &2041497184 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2041497181} + m_CullTransparentMesh: 1 +--- !u!1 &2051375976 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2051375977} + m_Layer: 5 + m_Name: BackgroundDropdow + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2051375977 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2051375976} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1464018680} + m_Father: {fileID: 1042785514} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 270, y: -117} + m_SizeDelta: {x: 540, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &2073514567 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2073514568} + - component: {fileID: 2073514571} + - component: {fileID: 2073514570} + - component: {fileID: 2073514569} + m_Layer: 5 + m_Name: LeftButton + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2073514568 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2073514567} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 792181427} + m_Father: {fileID: 1161442436} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: -100, y: 0} + m_SizeDelta: {x: 100, y: 0} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &2073514569 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2073514567} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 0 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 2073514570} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1629128745} + m_TargetAssemblyTypeName: FateViewerMain, Assembly-CSharp + m_MethodName: ChangeAnimationFrame + m_Mode: 3 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: -1 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &2073514570 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2073514567} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &2073514571 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2073514567} + m_CullTransparentMesh: 1 +--- !u!1 &2082327790 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2082327792} + - component: {fileID: 2082327794} + - component: {fileID: 2082327793} + - component: {fileID: 2082327791} + m_Layer: 5 + m_Name: BodyAnimationDropdown + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &2082327791 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2082327790} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0d0b652f32a2cc243917e4028fa0f046, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 0 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 2082327793} + m_Template: {fileID: 817349588} + m_CaptionText: {fileID: 1388151344} + m_CaptionImage: {fileID: 0} + m_ItemText: {fileID: 1123903223} + m_ItemImage: {fileID: 0} + m_Value: 0 + m_Options: + m_Options: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_AlphaFadeSpeed: 0.15 +--- !u!224 &2082327792 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2082327790} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1388151346} + - {fileID: 1586939658} + - {fileID: 817349588} + - {fileID: 279547836} + - {fileID: 1161063152} + m_Father: {fileID: 1304524551} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 150, y: 0} + m_SizeDelta: {x: -620, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2082327793 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2082327790} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &2082327794 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2082327790} + m_CullTransparentMesh: 1 +--- !u!1 &2106626117 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2106626118} + - component: {fileID: 2106626120} + - component: {fileID: 2106626119} + m_Layer: 5 + m_Name: Text (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2106626118 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2106626117} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 2120611123} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: -100, y: 15} + m_SizeDelta: {x: 100, y: 30} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &2106626119 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2106626117} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 12800000, guid: 2757226890267cf49ab66d12478a74b3, type: 3} + m_FontSize: 30 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 10 + m_MaxSize: 63 + m_Alignment: 4 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: Anim +--- !u!222 &2106626120 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2106626117} + m_CullTransparentMesh: 1 +--- !u!1 &2106879505 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2106879506} + - component: {fileID: 2106879508} + - component: {fileID: 2106879507} + m_Layer: 5 + m_Name: Name + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2106879506 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2106879505} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 633479766} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2106879507 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2106879505} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Screenshot + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 48 + m_fontSizeBase: 48 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 48 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &2106879508 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2106879505} + m_CullTransparentMesh: 1 +--- !u!1 &2108200430 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2108200432} + - component: {fileID: 2108200434} + - component: {fileID: 2108200433} + - component: {fileID: 2108200431} + m_Layer: 5 + m_Name: Scrollbar Vertical + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &2108200431 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2108200430} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 892227529} + m_HandleRect: {fileID: 892227527} + m_Direction: 2 + m_Value: 1 + m_Size: 1 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!224 &2108200432 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2108200430} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 200655630} + m_Father: {fileID: 5584442607537429346} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 50, y: 0} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &2108200433 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2108200430} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.6666667, g: 0.6666667, b: 0.6666667, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &2108200434 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2108200430} + m_CullTransparentMesh: 1 +--- !u!1 &2120611122 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2120611123} + - component: {fileID: 2120611124} + m_Layer: 5 + m_Name: Slider + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2120611123 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2120611122} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 2106626118} + - {fileID: 46812990} + - {fileID: 1615931757} + - {fileID: 1683688901} + - {fileID: 1166923769} + - {fileID: 1209094549} + m_Father: {fileID: 1161442436} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -200, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2120611124 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2120611122} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 67db9e8f0e2ae9c40bc1e2b64352a6b4, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 303575084} + m_FillRect: {fileID: 1566159005} + m_HandleRect: {fileID: 303575083} + m_Direction: 0 + m_MinValue: 0 + m_MaxValue: 200 + m_WholeNumbers: 1 + m_Value: 100 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 1209094550} + m_TargetAssemblyTypeName: SliderDisplay, Assembly-CSharp + m_MethodName: UpdateDisplayInt + m_Mode: 0 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 + - m_Target: {fileID: 1629128745} + m_TargetAssemblyTypeName: FateViewerMain, Assembly-CSharp + m_MethodName: ChangeAnimationTimeScale + m_Mode: 0 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!1 &2142715263 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2142715264} + - component: {fileID: 2142715267} + - component: {fileID: 2142715266} + - component: {fileID: 2142715265} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2142715264 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2142715263} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1404419001} + m_Father: {fileID: 1030230481} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -17, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &2142715265 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2142715263} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!114 &2142715266 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2142715263} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &2142715267 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2142715263} + m_CullTransparentMesh: 1 +--- !u!1 &1674745585685688 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224121285110107042} + - component: {fileID: 222742022964780110} + - component: {fileID: 114046119935790280} + - component: {fileID: 114331424145281188} + - component: {fileID: 114488889788923506} + m_Layer: 5 + m_Name: Preset (9) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!1 &1746647804506606 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224930228093022608} + - component: {fileID: 114523753496290566} + m_Layer: 5 + m_Name: Seperator + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &1907768355692460 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 224606281165395940} + - component: {fileID: 222940278713741148} + - component: {fileID: 114560075965599384} + - component: {fileID: 114202566578646242} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!222 &82716323908673588 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6907588750369844997} + m_CullTransparentMesh: 0 +--- !u!114 &114046119935790280 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1674745585685688} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &114096566894606538 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542366914} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: 20 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 20 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &114202566578646242 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1907768355692460} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 114560075965599384} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 553644664} + m_TargetAssemblyTypeName: + m_MethodName: ToggleColorSliders + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &114331424145281188 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1674745585685688} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Highlighted + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 114046119935790280} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 553597318} + m_TargetAssemblyTypeName: + m_MethodName: PresetSelect + m_Mode: 2 + m_Arguments: + m_ObjectArgument: {fileID: 114046119935790280} + m_ObjectArgumentAssemblyTypeName: UnityEngine.UI.Image, UnityEngine.UI + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 +--- !u!114 &114482409903082650 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542320978} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &114488889788923506 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1674745585685688} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 20 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &114517941581483574 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542366372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 5 + m_Bottom: 3 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 1 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &114523753496290566 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1746647804506606} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 16.5 + m_FlexibleWidth: 1 + m_FlexibleHeight: 1 + m_LayoutPriority: 1 +--- !u!114 &114560075965599384 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1907768355692460} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &114821406329110360 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542323896} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: 180 + m_MinHeight: -1 + m_PreferredWidth: -1 + m_PreferredHeight: 180 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &114827312663447016 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542329420} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: 234 + m_MinHeight: 35 + m_PreferredWidth: 234 + m_PreferredHeight: 35 + m_FlexibleWidth: -1 + m_FlexibleHeight: 1 + m_LayoutPriority: 1 +--- !u!114 &114932489353410744 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 542366372} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!114 &204193883015774389 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4471776815937546360} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6b10e832a32d2d14facd8a3f489ee8d6, type: 3} + m_Name: + m_EditorClassIdentifier: + picker: {fileID: 553644664} + type: 5 + prefix: + minValue: 0 + maxValue: 255 + precision: 0 + label: {fileID: 2623613524347753397} +--- !u!222 &213637333190321531 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8531705015974375179} + m_CullTransparentMesh: 0 +--- !u!1 &218002562157223982 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8934624731657003546} + - component: {fileID: 8852710412511160453} + - component: {fileID: 4153803816723473563} + - component: {fileID: 4582872099071365509} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!222 &222742022964780110 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1674745585685688} + m_CullTransparentMesh: 0 +--- !u!222 &222940278713741148 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1907768355692460} + m_CullTransparentMesh: 0 +--- !u!224 &224121285110107042 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1674745585685688} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554083384} + m_RootOrder: 9 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 207.2727, y: -10} + m_SizeDelta: {x: 21.818182, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &224606281165395940 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1907768355692460} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 9041678561163386004} + m_Father: {fileID: 554147628} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 40, y: 0} + m_Pivot: {x: 1, y: 0.5} +--- !u!224 &224930228093022608 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1746647804506606} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554152968} + m_RootOrder: 8 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 117, y: -72.75} + m_SizeDelta: {x: 234, y: 16.5} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &246681887557569947 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 638592118665767269} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6b10e832a32d2d14facd8a3f489ee8d6, type: 3} + m_Name: + m_EditorClassIdentifier: + picker: {fileID: 553644664} + type: 0 + prefix: + minValue: 0 + maxValue: 255 + precision: 0 + label: {fileID: 8727449310084067176} +--- !u!114 &326370227789953482 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7641416708503595339} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Hex Value + m_isRightToLeft: 0 + m_fontAsset: {fileID: 0} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 2150773298 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 14 + m_fontSizeBase: 14 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 2 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!224 &473728277152551495 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9172626564939914257} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554128800} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 12.5, y: -20.11} + m_SizeDelta: {x: 15, y: 40.22} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &498551765304685454 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5735452446185864275} + - component: {fileID: 3510103390032088739} + - component: {fileID: 4987650653048156177} + m_Layer: 5 + m_Name: Name + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!222 &628392443337719999 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6579709008394472268} + m_CullTransparentMesh: 1 +--- !u!1 &638592118665767269 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4015938747959160258} + - component: {fileID: 4815532606080720582} + - component: {fileID: 8727449310084067176} + - component: {fileID: 246681887557569947} + - component: {fileID: 6851359060816634231} + m_Layer: 5 + m_Name: ValueText (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &640936484958766280 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2283392972224005323} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 25 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &735463863904960548 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7359695223238246194} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 25 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!222 &789383229834214903 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1349046912185477523} + m_CullTransparentMesh: 1 +--- !u!1 &903194461317642495 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7788215078558405877} + - component: {fileID: 5555109017089347321} + - component: {fileID: 7119704302172521627} + - component: {fileID: 2042142436380176208} + m_Layer: 5 + m_Name: LeftText (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!222 &954791425797512585 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5564423364567595321} + m_CullTransparentMesh: 1 +--- !u!114 &1008419450121323169 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5936607301631976216} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 48 + m_fontSizeBase: 48 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 48 + m_fontStyle: 1 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &1122818899011118872 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3294327889178383312} + - component: {fileID: 6858478970182308623} + - component: {fileID: 3328068044371919194} + - component: {fileID: 7781454040694967167} + - component: {fileID: 2912009343134212043} + m_Layer: 5 + m_Name: ValueText (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1322921995008137996 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8609503635634449602} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &1349046912185477523 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3328623545560022076} + - component: {fileID: 789383229834214903} + - component: {fileID: 1759049575827363583} + m_Layer: 5 + m_Name: Name + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1435323633702087203 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6130897358208460371} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554148580} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 216.5, y: -7.825} + m_SizeDelta: {x: 25, y: 15.65} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1546497038905106877 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6579709008394472268} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!224 &1642161876584311992 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4438387642249094124} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 3260072591933161206} + - {fileID: 2464881756614729628} + m_Father: {fileID: 4169313659256192241} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: -0.5} + m_SizeDelta: {x: -20, y: -13} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1693810055096060785 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8363915172514838617} + - component: {fileID: 3318676811526404565} + - component: {fileID: 7304662682640537848} + - component: {fileID: 6574345136474915971} + m_Layer: 5 + m_Name: LeftText (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1759049575827363583 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1349046912185477523} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: DB Entry Missing + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 48 + m_fontSizeBase: 48 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 48 + m_fontStyle: 1 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!114 &1985840245609071006 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4471776815937546360} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 25 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &2042142436380176208 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 903194461317642495} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: G + m_isRightToLeft: 0 + m_fontAsset: {fileID: 0} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 14 + m_fontSizeBase: 14 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &2202553818398375164 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8609503635634449602} + m_CullTransparentMesh: 1 +--- !u!1 &2283392972224005323 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5897650027748826219} + - component: {fileID: 4547297681374317838} + - component: {fileID: 4472125889700086524} + - component: {fileID: 2356398483393321686} + - component: {fileID: 640936484958766280} + m_Layer: 5 + m_Name: ValueText (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &2356398483393321686 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2283392972224005323} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 0 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 0} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 14 + m_fontSizeBase: 14 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!224 &2382031564592239453 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7754538783155890520} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554123698} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 12.5, y: -7.825} + m_SizeDelta: {x: 15, y: 15.65} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2392714571304978664 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3369072135885438589} + m_CullTransparentMesh: 0 +--- !u!224 &2464881756614729628 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5727840976213593286} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1642161876584311992} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2534709192623279408 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7359695223238246194} + m_CullTransparentMesh: 0 +--- !u!222 &2569057211238577257 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6130897358208460371} + m_CullTransparentMesh: 0 +--- !u!114 &2623613524347753397 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4471776815937546360} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 0 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 0} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 14 + m_fontSizeBase: 14 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!114 &2832871768837126417 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4114929747232940469} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 15 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!222 &2865786703336798942 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8837949055348244271} + m_CullTransparentMesh: 0 +--- !u!114 &2912009343134212043 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1122818899011118872} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 25 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!222 &2975306691432479697 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6874730834334770884} + m_CullTransparentMesh: 1 +--- !u!224 &3167577696270103013 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5564423364567595321} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 5708152862001074458} + - {fileID: 4278355592749511029} + - {fileID: 5735452446185864275} + - {fileID: 8934624731657003546} + m_Father: {fileID: 5584442607467674128} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 326.5, y: -85} + m_SizeDelta: {x: 653, y: 160} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &3260072591933161206 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7641416708503595339} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1642161876584311992} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &3294327889178383312 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1122818899011118872} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554127192} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 216.5, y: -7.825} + m_SizeDelta: {x: 25, y: 15.65} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3296249732236970180 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9172626564939914257} + m_CullTransparentMesh: 0 +--- !u!222 &3318676811526404565 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1693810055096060785} + m_CullTransparentMesh: 0 +--- !u!114 &3328068044371919194 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1122818899011118872} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6b10e832a32d2d14facd8a3f489ee8d6, type: 3} + m_Name: + m_EditorClassIdentifier: + picker: {fileID: 553644664} + type: 4 + prefix: + minValue: 0 + maxValue: 255 + precision: 0 + label: {fileID: 7781454040694967167} +--- !u!224 &3328623545560022076 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1349046912185477523} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 5311170813488821726} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &3369072135885438589 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4825120512563369830} + - component: {fileID: 2392714571304978664} + - component: {fileID: 7490516904239424979} + - component: {fileID: 4167811880529890516} + m_Layer: 5 + m_Name: LeftText (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &3408750873509070655 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6874730834334770884} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &3425697863592473363 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4114929747232940469} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: H + m_isRightToLeft: 0 + m_fontAsset: {fileID: 0} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 14 + m_fontSizeBase: 14 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &3510103390032088739 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 498551765304685454} + m_CullTransparentMesh: 1 +--- !u!114 &3584950246777251936 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8531705015974375179} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &3940818608575380095 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4471776815937546360} + m_CullTransparentMesh: 0 +--- !u!224 &4015938747959160258 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 638592118665767269} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554119470} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 216.5, y: -7.825} + m_SizeDelta: {x: 25, y: 15.65} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &4114929747232940469 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8959667198017361303} + - component: {fileID: 7167468495852890449} + - component: {fileID: 2832871768837126417} + - component: {fileID: 3425697863592473363} + m_Layer: 5 + m_Name: LeftText (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &4153803816723473563 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 218002562157223982} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &4167811880529890516 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3369072135885438589} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: V + m_isRightToLeft: 0 + m_fontAsset: {fileID: 0} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 14 + m_fontSizeBase: 14 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!224 &4169313659256192241 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8531705015974375179} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1642161876584311992} + m_Father: {fileID: 554079786} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 179.5, y: -15} + m_SizeDelta: {x: 105, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &4200748357392322653 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8837949055348244271} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 15 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!224 &4278355592749511029 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5936607301631976216} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 3167577696270103013} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 160, y: -10} + m_SizeDelta: {x: 135, y: 140} + m_Pivot: {x: 0, y: 1} +--- !u!1 &4438387642249094124 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1642161876584311992} + - component: {fileID: 7663297940741139160} + m_Layer: 5 + m_Name: Text Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &4471776815937546360 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7727097370603474837} + - component: {fileID: 3940818608575380095} + - component: {fileID: 204193883015774389} + - component: {fileID: 2623613524347753397} + - component: {fileID: 1985840245609071006} + m_Layer: 5 + m_Name: ValueText (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &4472125889700086524 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2283392972224005323} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6b10e832a32d2d14facd8a3f489ee8d6, type: 3} + m_Name: + m_EditorClassIdentifier: + picker: {fileID: 553644664} + type: 6 + prefix: + minValue: 0 + maxValue: 255 + precision: 0 + label: {fileID: 2356398483393321686} +--- !u!222 &4547297681374317838 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2283392972224005323} + m_CullTransparentMesh: 0 +--- !u!114 &4582872099071365509 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 218002562157223982} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 4153803816723473563} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!222 &4815532606080720582 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 638592118665767269} + m_CullTransparentMesh: 0 +--- !u!224 &4825120512563369830 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3369072135885438589} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 553926800} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 12.5, y: -7.825} + m_SizeDelta: {x: 15, y: 15.65} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &4987650653048156177 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 498551765304685454} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Custom (from url) + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 3861585161733349673, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 48 + m_fontSizeBase: 48 + m_fontWeight: 400 + m_enableAutoSizing: 1 + m_fontSizeMin: 18 + m_fontSizeMax: 48 + m_fontStyle: 1 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &5025139864860155983 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7754538783155890520} + m_CullTransparentMesh: 0 +--- !u!224 &5311170813488821726 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6874730834334770884} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 3328623545560022076} + m_Father: {fileID: 8560524208243384198} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &5337678098250197505 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9172626564939914257} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: A + m_isRightToLeft: 0 + m_fontAsset: {fileID: 0} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 36 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!114 &5349439746512639741 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7359695223238246194} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 0 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 0} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 14 + m_fontSizeBase: 14 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!114 &5493264123390558226 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8837949055348244271} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: B + m_isRightToLeft: 0 + m_fontAsset: {fileID: 0} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 14 + m_fontSizeBase: 14 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &5555109017089347321 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 903194461317642495} + m_CullTransparentMesh: 0 +--- !u!1 &5564423364567595321 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3167577696270103013} + - component: {fileID: 954791425797512585} + - component: {fileID: 7425735823730469481} + - component: {fileID: 5564423364567595322} + m_Layer: 5 + m_Name: CustomServant + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!114 &5564423364567595322 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5564423364567595321} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a01796aebecefbc4abcaada5de90d3a3, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!224 &5584442607467674128 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5584442607467674131} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 3167577696270103013} + m_Father: {fileID: 5584442607648881034} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 75} + m_Pivot: {x: 0, y: 1} +--- !u!114 &5584442607467674129 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5584442607467674131} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!1 &5584442607467674131 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5584442607467674128} + - component: {fileID: 5584442607467674134} + - component: {fileID: 5584442607467674129} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &5584442607467674134 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5584442607467674131} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 75 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 5 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!114 &5584442607537429344 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5584442607537429373} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.19607843} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &5584442607537429345 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5584442607537429373} + m_CullTransparentMesh: 1 +--- !u!224 &5584442607537429346 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5584442607537429373} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 5584442607648881034} + - {fileID: 2108200432} + - {fileID: 1044199563} + - {fileID: 825046902} + m_Father: {fileID: 3787752} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: -50} + m_SizeDelta: {x: 700, y: -100.00012} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &5584442607537429347 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5584442607537429373} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 5584442607467674128} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 2 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 90 + m_Viewport: {fileID: 5584442607648881034} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 2108200431} + m_HorizontalScrollbarVisibility: 2 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: -3 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &5584442607537429373 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5584442607537429346} + - component: {fileID: 5584442607537429345} + - component: {fileID: 5584442607537429344} + - component: {fileID: 5584442607537429347} + m_Layer: 5 + m_Name: ServantList + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!1 &5584442607648881029 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5584442607648881034} + - component: {fileID: 5584442607648881033} + - component: {fileID: 5584442607648881032} + - component: {fileID: 5584442607648881035} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &5584442607648881032 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5584442607648881029} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &5584442607648881033 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5584442607648881029} + m_CullTransparentMesh: 1 +--- !u!224 &5584442607648881034 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5584442607648881029} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 5584442607467674128} + m_Father: {fileID: 5584442607537429346} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -47, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &5584442607648881035 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5584442607648881029} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!224 &5708152862001074458 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8609503635634449602} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 3167577696270103013} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 10, y: -10} + m_SizeDelta: {x: 140, y: 140} + m_Pivot: {x: 0, y: 1} +--- !u!1 &5727840976213593286 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2464881756614729628} + - component: {fileID: 7519892819015922752} + - component: {fileID: 7547463640738131609} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &5735452446185864275 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 498551765304685454} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 3167577696270103013} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 310, y: -10} + m_SizeDelta: {x: 338.5, y: 140} + m_Pivot: {x: 0, y: 1} +--- !u!224 &5897650027748826219 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2283392972224005323} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 553926800} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 216.5, y: -7.825} + m_SizeDelta: {x: 25, y: 15.65} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &5936607301631976216 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4278355592749511029} + - component: {fileID: 7256197374093543403} + - component: {fileID: 1008419450121323169} + m_Layer: 5 + m_Name: ID + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &5983506486527734247 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6874730834334770884} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 3408750873509070655} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &6130897358208460371 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1435323633702087203} + - component: {fileID: 2569057211238577257} + - component: {fileID: 8761871054996683511} + - component: {fileID: 8839826583642111081} + - component: {fileID: 7515813696081993268} + m_Layer: 5 + m_Name: ValueText (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &6144536939855760288 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6144536939855760293} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 5 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 5 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &6144536939855760293 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6144536939855760294} + - component: {fileID: 6144536939855760288} + - component: {fileID: 6144536939855760295} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6144536939855760294 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6144536939855760293} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 8560524208243384198} + - {fileID: 1563309375} + - {fileID: 1867591815} + - {fileID: 622277435} + - {fileID: 231515582} + - {fileID: 1679240988} + - {fileID: 1963536239} + m_Father: {fileID: 6144536940747376700} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 735} + m_Pivot: {x: 0, y: 1} +--- !u!114 &6144536939855760295 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6144536939855760293} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 2 +--- !u!1 &6144536940590394059 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6144536940590394068} + - component: {fileID: 6144536940590394071} + - component: {fileID: 6144536940590394070} + - component: {fileID: 6144536940590394069} + m_Layer: 5 + m_Name: PropertiesList + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &6144536940590394068 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6144536940590394059} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 6144536940747376700} + - {fileID: 532172406} + m_Father: {fileID: 1795849913} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: -25} + m_SizeDelta: {x: 900, y: -250} + m_Pivot: {x: 0, y: 0.5} +--- !u!114 &6144536940590394069 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6144536940590394059} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 6144536939855760294} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 2 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 45 + m_Viewport: {fileID: 6144536940747376700} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 532172407} + m_HorizontalScrollbarVisibility: 2 + m_VerticalScrollbarVisibility: 2 + m_HorizontalScrollbarSpacing: -3 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &6144536940590394070 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6144536940590394059} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.19607843} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &6144536940590394071 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6144536940590394059} + m_CullTransparentMesh: 1 +--- !u!1 &6144536940747376691 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6144536940747376700} + - component: {fileID: 6144536940747376703} + - component: {fileID: 6144536940747376702} + - component: {fileID: 6144536940747376701} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6144536940747376700 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6144536940747376691} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 6144536939855760294} + m_Father: {fileID: 6144536940590394068} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -47, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &6144536940747376701 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6144536940747376691} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!114 &6144536940747376702 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6144536940747376691} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &6144536940747376703 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6144536940747376691} + m_CullTransparentMesh: 1 +--- !u!114 &6198154978583833320 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7359695223238246194} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6b10e832a32d2d14facd8a3f489ee8d6, type: 3} + m_Name: + m_EditorClassIdentifier: + picker: {fileID: 553644664} + type: 2 + prefix: + minValue: 0 + maxValue: 255 + precision: 0 + label: {fileID: 5349439746512639741} +--- !u!114 &6451240432414158640 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8023621447766168199} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 25 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &6574345136474915971 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1693810055096060785} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: R + m_isRightToLeft: 0 + m_fontAsset: {fileID: 0} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 14 + m_fontSizeBase: 14 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &6579709008394472268 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8560524208243384198} + - component: {fileID: 628392443337719999} + - component: {fileID: 1546497038905106877} + m_Layer: 5 + m_Name: DatabaseContainer + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &6613296664125084420 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7754538783155890520} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 15 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &6758970411369410631 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8531705015974375179} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d85c534b3c1560544b09d0996dfeba84, type: 3} + m_Name: + m_EditorClassIdentifier: + hsvpicker: {fileID: 553644664} + displayAlpha: 0 +--- !u!114 &6851359060816634231 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 638592118665767269} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 25 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!222 &6858478970182308623 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1122818899011118872} + m_CullTransparentMesh: 0 +--- !u!1 &6874730834334770884 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5311170813488821726} + - component: {fileID: 2975306691432479697} + - component: {fileID: 3408750873509070655} + - component: {fileID: 5983506486527734247} + m_Layer: 5 + m_Name: Button + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6902966852753885536 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7359695223238246194} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554139594} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 216.5, y: -7.825} + m_SizeDelta: {x: 25, y: 15.65} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &6907588750369844997 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9041678561163386004} + - component: {fileID: 82716323908673588} + - component: {fileID: 7008529064706881233} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &6915891107441331041 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8023621447766168199} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6b10e832a32d2d14facd8a3f489ee8d6, type: 3} + m_Name: + m_EditorClassIdentifier: + picker: {fileID: 553644664} + type: 3 + prefix: + minValue: 0 + maxValue: 255 + precision: 0 + label: {fileID: 7954934987945472005} +--- !u!114 &7008529064706881233 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6907588750369844997} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: HSV + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 38f9c70d045080845a18307715f00e15, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 36 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 1 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!114 &7119704302172521627 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 903194461317642495} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 15 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!222 &7167468495852890449 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4114929747232940469} + m_CullTransparentMesh: 0 +--- !u!224 &7199539175679579108 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8837949055348244271} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554139594} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 12.5, y: -7.825} + m_SizeDelta: {x: 15, y: 15.65} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7235006221854491001 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7641416708503595339} + m_CullTransparentMesh: 0 +--- !u!222 &7256197374093543403 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5936607301631976216} + m_CullTransparentMesh: 1 +--- !u!114 &7304662682640537848 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1693810055096060785} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 15 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &7359695223238246194 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6902966852753885536} + - component: {fileID: 2534709192623279408} + - component: {fileID: 6198154978583833320} + - component: {fileID: 5349439746512639741} + - component: {fileID: 735463863904960548} + m_Layer: 5 + m_Name: ValueText (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &7425735823730469481 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5564423364567595321} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &7490516904239424979 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3369072135885438589} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 15 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!114 &7515813696081993268 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6130897358208460371} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 25 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!222 &7519892819015922752 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5727840976213593286} + m_CullTransparentMesh: 0 +--- !u!114 &7547463640738131609 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5727840976213593286} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: "\u200B" + m_isRightToLeft: 0 + m_fontAsset: {fileID: 0} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 14 + m_fontSizeBase: 14 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &7641416708503595339 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3260072591933161206} + - component: {fileID: 7235006221854491001} + - component: {fileID: 326370227789953482} + m_Layer: 5 + m_Name: Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &7663297940741139160 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4438387642249094124} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: {x: 0, y: 0, z: 0, w: 0} + m_Softness: {x: 0, y: 0} +--- !u!224 &7727097370603474837 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4471776815937546360} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554123698} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 216.5, y: -7.825} + m_SizeDelta: {x: 25, y: 15.65} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &7754538783155890520 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2382031564592239453} + - component: {fileID: 5025139864860155983} + - component: {fileID: 6613296664125084420} + - component: {fileID: 8731585516766016877} + m_Layer: 5 + m_Name: LeftText (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &7781454040694967167 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1122818899011118872} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 0 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 0} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 14 + m_fontSizeBase: 14 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!224 &7788215078558405877 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 903194461317642495} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554148580} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 12.5, y: -7.825} + m_SizeDelta: {x: 15, y: 15.65} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &7903871146752953575 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8023621447766168199} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554128800} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 216.5, y: -61.51} + m_SizeDelta: {x: 25, y: 123.02} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &7954934987945472005 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8023621447766168199} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 0 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 0} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 36 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!1 &8023621447766168199 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7903871146752953575} + - component: {fileID: 8541247699904688999} + - component: {fileID: 6915891107441331041} + - component: {fileID: 7954934987945472005} + - component: {fileID: 6451240432414158640} + m_Layer: 5 + m_Name: ValueText (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &8214791301437702427 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9172626564939914257} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: -1 + m_MinHeight: -1 + m_PreferredWidth: 15 + m_PreferredHeight: -1 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!224 &8363915172514838617 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1693810055096060785} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554119470} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 12.5, y: -7.825} + m_SizeDelta: {x: 15, y: 15.65} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &8531705015974375179 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4169313659256192241} + - component: {fileID: 213637333190321531} + - component: {fileID: 3584950246777251936} + - component: {fileID: 8789071363488878643} + - component: {fileID: 6758970411369410631} + m_Layer: 5 + m_Name: InputField (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!222 &8541247699904688999 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8023621447766168199} + m_CullTransparentMesh: 0 +--- !u!224 &8560524208243384198 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6579709008394472268} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 5311170813488821726} + m_Father: {fileID: 6144536939855760294} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 0, y: -105} + m_SizeDelta: {x: 853, y: 100} + m_Pivot: {x: 0, y: 0} +--- !u!1 &8609503635634449602 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5708152862001074458} + - component: {fileID: 2202553818398375164} + - component: {fileID: 1322921995008137996} + m_Layer: 5 + m_Name: Face + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &8727449310084067176 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 638592118665767269} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 0 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 0} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 14 + m_fontSizeBase: 14 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!114 &8731585516766016877 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7754538783155890520} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: S + m_isRightToLeft: 0 + m_fontAsset: {fileID: 0} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 14 + m_fontSizeBase: 14 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!114 &8761871054996683511 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6130897358208460371} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6b10e832a32d2d14facd8a3f489ee8d6, type: 3} + m_Name: + m_EditorClassIdentifier: + picker: {fileID: 553644664} + type: 1 + prefix: + minValue: 0 + maxValue: 255 + precision: 0 + label: {fileID: 8839826583642111081} +--- !u!114 &8789071363488878643 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8531705015974375179} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 3584950246777251936} + m_TextViewport: {fileID: 1642161876584311992} + m_TextComponent: {fileID: 7547463640738131609} + m_Placeholder: {fileID: 326370227789953482} + m_VerticalScrollbar: {fileID: 0} + m_VerticalScrollbarEventHandler: {fileID: 0} + m_LayoutGroup: {fileID: 0} + m_ScrollSensitivity: 1 + m_ContentType: 0 + m_InputType: 0 + m_AsteriskChar: 42 + m_KeyboardType: 0 + m_LineType: 0 + m_HideMobileInput: 0 + m_HideSoftKeyboard: 0 + m_CharacterValidation: 0 + m_RegexValue: + m_GlobalPointSize: 14 + m_CharacterLimit: 0 + m_OnEndEdit: + m_PersistentCalls: + m_Calls: [] + m_OnSubmit: + m_PersistentCalls: + m_Calls: [] + m_OnSelect: + m_PersistentCalls: + m_Calls: [] + m_OnDeselect: + m_PersistentCalls: + m_Calls: [] + m_OnTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnEndTextSelection: + m_PersistentCalls: + m_Calls: [] + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] + m_OnTouchScreenKeyboardStatusChanged: + m_PersistentCalls: + m_Calls: [] + m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_CustomCaretColor: 0 + m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} + m_Text: + m_CaretBlinkRate: 0.85 + m_CaretWidth: 1 + m_ReadOnly: 0 + m_RichText: 1 + m_GlobalFontAsset: {fileID: 0} + m_OnFocusSelectAll: 1 + m_ResetOnDeActivation: 1 + m_RestoreOriginalTextOnEscape: 1 + m_isRichTextEditingAllowed: 0 + m_LineLimit: 0 + m_InputValidator: {fileID: 0} +--- !u!1 &8837949055348244271 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7199539175679579108} + - component: {fileID: 2865786703336798942} + - component: {fileID: 4200748357392322653} + - component: {fileID: 5493264123390558226} + m_Layer: 5 + m_Name: LeftText (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &8839826583642111081 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6130897358208460371} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: 0 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 0} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4281479730 + m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 14 + m_fontSizeBase: 14 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 1 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &8852710412511160453 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 218002562157223982} + m_CullTransparentMesh: 1 +--- !u!224 &8934624731657003546 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 218002562157223982} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 3167577696270103013} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &8959667198017361303 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4114929747232940469} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 554127192} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 12.5, y: -7.825} + m_SizeDelta: {x: 15, y: 15.65} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!224 &9041678561163386004 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6907588750369844997} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 224606281165395940} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &9172626564939914257 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 473728277152551495} + - component: {fileID: 3296249732236970180} + - component: {fileID: 8214791301437702427} + - component: {fileID: 5337678098250197505} + m_Layer: 5 + m_Name: LeftText (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 diff --git a/Assets/Scenes/FateNew.unity.meta b/Assets/Scenes/FateNew.unity.meta new file mode 100644 index 0000000..716c7b3 --- /dev/null +++ b/Assets/Scenes/FateNew.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a3d777777a093134c91f7e3d483e330e +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts.meta b/Assets/Scripts.meta new file mode 100644 index 0000000..6ad7faf --- /dev/null +++ b/Assets/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a047d1cbf51c57f408fa031d28ed53ee +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Apng.meta b/Assets/Scripts/Apng.meta new file mode 100644 index 0000000..31be90f --- /dev/null +++ b/Assets/Scripts/Apng.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 055f725890d872b4bb22fa493ed06356 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Apng/SharpApng.cs b/Assets/Scripts/Apng/SharpApng.cs new file mode 100644 index 0000000..4d15f81 --- /dev/null +++ b/Assets/Scripts/Apng/SharpApng.cs @@ -0,0 +1,281 @@ +/* HaRepacker - WZ extractor and repacker + * Copyright (C) 2009, 2010 haha01haha01 + + * This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + along with this program. If not, see .*/ + +namespace SharpApng +{ + using System; + using System.Collections.Generic; + using System.Drawing; + using System.IO; + using System.Linq; + using System.Runtime.InteropServices; + using System.Text; + using uGIF; + using UnityEngine; + + public class Frame : IDisposable + { + #region Fields + + private Image m_bmp; + private int m_den; + private int m_num; + + #endregion Fields + + #region Constructors + + public Frame(Image bmp, int num, int den) + { + this.m_num = num; + this.m_den = den; + this.m_bmp = bmp; + } + + #endregion Constructors + + #region Properties + + public Image Bitmap + { + get + { + return m_bmp; + } + set + { + m_bmp = value; + } + } + + public int DelayDen + { + get + { + return m_den; + } + set + { + m_den = value; + } + } + + public int DelayNum + { + get + { + return m_num; + } + set + { + m_num = value; + } + } + + #endregion Properties + + #region Methods + + public void Dispose() + { + } + + #endregion Methods + } + + internal class Apng : IDisposable + { + #region Fields + + private List m_frames = new List(); + + #endregion Fields + + #region Constructors + + public Apng() + { + } + + #endregion Constructors + + #region Indexers + + public Frame this[int index] + { + get + { + if (index < m_frames.Count) return m_frames[index]; + else return null; + } + set + { + if (index < m_frames.Count) m_frames[index] = value; + } + } + + #endregion Indexers + + #region Methods + + public void AddFrame(Frame frame) + { + m_frames.Add(frame); + } + + public void AddFrame(Image bmp, int num, int den) + { + m_frames.Add(new Frame(bmp, num, den)); + } + + public void Dispose() + { + foreach (Frame frame in m_frames) + frame.Dispose(); + m_frames.Clear(); + } + + public void WriteApng(string path, bool firstFrameHidden, bool disposeAfter) + { + Size maxSize = new Size(m_frames.Max(f => f.Bitmap.width), m_frames.Max(f => f.Bitmap.height)); + for (int i = 0; i < m_frames.Count; i++) + { + Frame frame = m_frames[i]; + //if (frame.Bitmap.Width != maxSize.Width || frame.Bitmap.Height != maxSize.Height) + //frame.Bitmap = ExtendImage(frame.Bitmap, maxSize); + ApngBasicWrapper.CreateFrameManaged(frame.Bitmap, frame.DelayNum, frame.DelayDen, i); + } + ApngBasicWrapper.SaveApngManaged(path, m_frames.Count, maxSize.Width, maxSize.Height, firstFrameHidden); + if (disposeAfter) Dispose(); + } + + private static Image ExtendImage(Image source, Size newSize) + { + Image result = new Image(newSize.Width, newSize.Height); + //using (Graphics g = Graphics.FromImage(result)) + //{ + // g.DrawImageUnscaled(source, 0, 0); + //} + return result; + } + + #endregion Methods + } + + internal static class ApngBasicWrapper + { + #region Fields + + private const string apngdll = "apng64.dll"; + private const int PIXEL_DEPTH = 4; + + #endregion Fields + + #region Methods + + internal static void CreateFrameManaged(Image source, int num, int den, int i) + { + IntPtr ptr = MarshalByteArray(TranslateImage(source)); + CreateFrame(ptr, num, den, i, source.width * source.height * PIXEL_DEPTH); + ReleaseData(ptr); + } + + internal static void SaveApngManaged(string path, int frameCount, int width, int height, bool firstFrameHidden) + { + IntPtr pathPtr = MarshalString(path); + byte firstFrame = firstFrameHidden ? (byte)1 : (byte)0; + SaveAPNG(pathPtr, frameCount, width, height, PIXEL_DEPTH, firstFrame); + + var bufferSize = GetBufferSize(); + //Call and return the pointer + IntPtr returnedPtr = GetBufferContent(); + + //Create new Variable to Store the result + byte[] returnedResult = new byte[bufferSize]; + + //Copy from result pointer to the C# variable + Marshal.Copy(returnedPtr, returnedResult, 0, bufferSize); + File.WriteAllBytes(path, returnedResult); + + Debug.Log("saved"); + ReleaseData(pathPtr); + } + + [DllImport(apngdll, CallingConvention = CallingConvention.StdCall)] + private static extern void CreateFrame(IntPtr pdata, int num, int den, int i, int len); + + [DllImport(apngdll)] + private static extern void SaveAPNG(IntPtr path, int frameCount, int width, int height, int bytesPerPixel, byte firstFrameHidden); + + [DllImport(apngdll)] + private static extern int GetBufferSize(); + + [DllImport(apngdll)] + private static extern IntPtr GetBufferContent(); + + private static IntPtr MarshalByteArray(byte[] source) + { + int size = Marshal.SizeOf(source[0]) * source.Length; + IntPtr pnt = Marshal.AllocHGlobal(size); + Marshal.Copy(source, 0, pnt, source.Length); + return pnt; + } + + private static IntPtr MarshalString(string source) + { + byte[] toMarshal = Encoding.ASCII.GetBytes(source); + int size = Marshal.SizeOf(source[0]) * source.Length; + IntPtr pnt = Marshal.AllocHGlobal(size + Marshal.SizeOf(source[0])); + Marshal.Copy(toMarshal, 0, pnt, source.Length); + //Marshal.Copy(new byte[] { 0 }, 0, new IntPtr(pnt.ToInt32() + size), 1); + return pnt; + } + + private static void ReleaseData(IntPtr ptr) + { + Marshal.FreeHGlobal(ptr); + } + + static byte[] TranslateImage(Image texture) + { + int width = texture.width, height = texture.height; + Color32[] original = new Color32[texture.pixels.Length]; + texture.pixels.CopyTo(original, 0); + byte[] result = new byte[texture.width * texture.height * PIXEL_DEPTH]; + + int p = 0; + Debug.Log("1"); + for (int y = 0; y < height; y++) + { + for (int x = 0; x < width; x++) + { + int index = (y * width + x); + int index2 = ((height-y-1) * width + x); + result[index * PIXEL_DEPTH] = original[index2].b; + result[index * PIXEL_DEPTH + 1] = original[index2].g; + result[index * PIXEL_DEPTH + 2] = original[index2].r; + result[index * PIXEL_DEPTH + 3] = original[index2].a; + } + p += 1; + } + Debug.Log("2"); + + return result; + } + + #endregion Methods + } +} \ No newline at end of file diff --git a/Assets/Scripts/Apng/SharpApng.cs.meta b/Assets/Scripts/Apng/SharpApng.cs.meta new file mode 100644 index 0000000..a79f7ea --- /dev/null +++ b/Assets/Scripts/Apng/SharpApng.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: de9592c4ae9713d41ae7a9ae40d1b549 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/CameraOrbit.cs b/Assets/Scripts/CameraOrbit.cs new file mode 100644 index 0000000..1b0e3af --- /dev/null +++ b/Assets/Scripts/CameraOrbit.cs @@ -0,0 +1,125 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; + +public class CameraOrbit : MonoBehaviour +{ + public static CameraOrbit Instance; + bool controlOn; + + [Header("Light")] + public Vector3 TargetCenter; + + EventSystem eventSystem; + + [Header("Orbit Camera")] + public float camZoomMin = 1, camZoomMax = 15; + + public float camZoom = 2.4f; + public float moveSpeed = 1; + public float zoomSpeed = 1f; + + private void Awake() + { + Instance = this; + eventSystem = EventSystem.current; + } + + void Update() + { + OrbitAround(false); + } + + float baseZoom; + float baseDist; + Vector2 lastMouse; + Vector2 lastTouch; + int lastTouchCount; + + void OrbitAround(bool aroundCharacter = false) + { + Vector2 mouse = Input.mousePosition; + Vector2 mouseDelta = (mouse - lastMouse) * Time.deltaTime; + Vector2 touchDelta = Vector2.zero; + lastMouse = mouse; + + TargetCenter = Vector3.zero; + + Vector3 position = transform.position; + + if (Input.GetMouseButtonDown(0) && Input.touchCount == 0 && !eventSystem.IsPointerOverGameObject()) + { + controlOn = true; + } + if (Input.GetMouseButton(0) && controlOn) + { + position -= mouseDelta.x * moveSpeed * transform.right; + position -= mouseDelta.y * moveSpeed * transform.up; + } + else + { + controlOn = false; + } + + Vector2 touch0 = Vector2.zero, touch1; + if (Input.touchCount > 0 && !eventSystem.IsPointerOverGameObject(0)) + { + touch0 = Input.GetTouch(0).position; + if (lastTouchCount > Input.touchCount || lastTouch == -Vector2.one) + { + touchDelta = Vector2.zero; + } + else + { + touchDelta = (touch0 - lastTouch) * Time.deltaTime; + } + lastTouch = touch0; + } + else + { + lastTouch = -Vector2.one; + baseDist = 0; + lastTouchCount = 0; + } + if (Input.touchCount == 1 && !eventSystem.IsPointerOverGameObject(0)) + { + position -= touchDelta.x * moveSpeed * transform.right; + position -= touchDelta.y * moveSpeed * transform.up; + lastTouchCount = 1; + } + else if (Input.touchCount >= 2 && !eventSystem.IsPointerOverGameObject(0)) + { + touch1 = Input.GetTouch(1).position; + if (baseDist == 0) + { + baseDist = Vector2.Distance(touch0, touch1); + baseZoom = camZoom; + } + camZoom = baseZoom - (Vector2.Distance(touch0, touch1) - baseDist) * 0.01f; + lastTouchCount = 2; + } + + if (!eventSystem.IsPointerOverGameObject()) + { + camZoom -= Input.mouseScrollDelta.y * zoomSpeed; + } + + camZoom = Mathf.Clamp(camZoom, camZoomMin, camZoomMax); + float camDist = camZoom; + Camera.main.orthographicSize = camDist; + transform.position = position; + } + + public void SetZoomSpeed(float value) + { + zoomSpeed = value; + } + + public void SetMoveSpeed(float value) + { + moveSpeed = value; + } +} diff --git a/Assets/Scripts/CameraOrbit.cs.meta b/Assets/Scripts/CameraOrbit.cs.meta new file mode 100644 index 0000000..e6424d9 --- /dev/null +++ b/Assets/Scripts/CameraOrbit.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 278fb6ec5b3d906479f56f047f620777 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/CameraOrbit3D.cs b/Assets/Scripts/CameraOrbit3D.cs new file mode 100644 index 0000000..f30953f --- /dev/null +++ b/Assets/Scripts/CameraOrbit3D.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; + +public class CameraOrbit3D : MonoBehaviour +{ + public static bool CameraLock = true; + public static int CameraMode = 0; + private Camera cam; + bool controlOn, heightOn; + + public GameObject CameraTargetHelper; + public Vector3 TargetCenter; + + EventSystem eventSystem; + + [Header("Orbit Camera")] + float camHeightMin = 2, camHeightMax = 2; + float targetHeightMin = -100, targetHeightMax = 100f; + + public float camZoom = 2.4f; + public float camHeight = 0.87f; + public float targetHeight = 0.87f; + public float fov = 45; + + private void Awake() + { + cam = GetComponentInChildren(); + eventSystem = EventSystem.current; + CameraLock = false; + } + + void Update() + { + OrbitAround(false); + } + + float baseZoom; + float baseDist; + Vector2 lastMouse; + Vector2 lastTouch; + int lastTouchCount; + + #region Camera + /// + /// Orbit camera around world center + /// + void OrbitAround(bool aroundCharacter = false) + { + CameraOrbit original = GetComponent(); + Vector2 mouse = Input.mousePosition; + Vector2 mouseDelta = (mouse - lastMouse) * Time.deltaTime; + Vector2 touchDelta = Vector2.zero; + lastMouse = mouse; + + TargetCenter = Vector3.zero; + + cam.fieldOfView = fov; + Vector3 position = transform.position; + Vector3 rotation = cam.transform.localEulerAngles; + + if (Input.GetMouseButtonDown(0) && Input.touchCount == 0 && !eventSystem.IsPointerOverGameObject()) + { + controlOn = true; + } + if (Input.GetMouseButton(0) && controlOn) + { + position -= mouseDelta.x * original.moveSpeed * transform.right; + camHeight -= mouseDelta.y * original.moveSpeed; + } + else + { + controlOn = false; + } + + if (Input.GetMouseButtonDown(1) && Input.touchCount == 0 && !eventSystem.IsPointerOverGameObject()) + { + heightOn = true; + } + if (Input.GetMouseButton(1) && heightOn) + { + targetHeight -= mouseDelta.y * 0.5f; + targetHeight = Mathf.Clamp(targetHeight, targetHeightMin, targetHeightMax); + } + else + { + heightOn = false; + } + + + Vector2 touch0 = Vector2.zero, touch1; + if (Input.touchCount > 0 && !eventSystem.IsPointerOverGameObject(0)) + { + touch0 = Input.GetTouch(0).position; + if (lastTouchCount > Input.touchCount || lastTouch == -Vector2.one) + { + touchDelta = Vector2.zero; + } + else + { + touchDelta = (touch0 - lastTouch) * Time.deltaTime; + } + lastTouch = touch0; + } + else + { + lastTouch = -Vector2.one; + baseDist = 0; + lastTouchCount = 0; + } + if (Input.touchCount == 1 && !eventSystem.IsPointerOverGameObject(0)) + { + position -= touchDelta.x * original.moveSpeed * transform.right; + camHeight -= touchDelta.y * original.moveSpeed; + lastTouchCount = 1; + } + else if(Input.touchCount >= 2 && !eventSystem.IsPointerOverGameObject(0)) + { + touch1 = Input.GetTouch(1).position; + if (baseDist == 0) + { + baseDist = Vector2.Distance(touch0, touch1); + baseZoom = camZoom; + } + camZoom = baseZoom - (Vector2.Distance(touch0, touch1) - baseDist) * 0.01f; + targetHeight -= touchDelta.y * 0.5f; + targetHeight = Mathf.Clamp(targetHeight, targetHeightMin, targetHeightMax); + lastTouchCount = 2; + } + + if (!eventSystem.IsPointerOverGameObject()) + { + camZoom -= Input.mouseScrollDelta.y * original.zoomSpeed; + } + camZoom = Mathf.Clamp(camZoom, original.camZoomMin, original.camZoomMax); + float camDist = camZoom; + camHeightMax = targetHeight + camDist; + camHeightMin = targetHeight - camDist; + camHeight = Mathf.Clamp(camHeight, camHeightMin, camHeightMax); + + Vector3 target = TargetCenter + targetHeight * Vector3.up; //set target offsets + + position.y = TargetCenter.y + camHeight; //set camera height + transform.position = position; //set final position of camera at target + + //Debug.Log(rotation); + transform.LookAt(target); //look at target position + transform.position = target - transform.forward * camDist; //move away from target + } + #endregion +} diff --git a/Assets/Scripts/CameraOrbit3D.cs.meta b/Assets/Scripts/CameraOrbit3D.cs.meta new file mode 100644 index 0000000..0cf851a --- /dev/null +++ b/Assets/Scripts/CameraOrbit3D.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: df0c736ae643c464986a460f3f8686f1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Error.cs b/Assets/Scripts/Error.cs new file mode 100644 index 0000000..fe995f5 --- /dev/null +++ b/Assets/Scripts/Error.cs @@ -0,0 +1,30 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.UI; + +public class Error : MonoBehaviour +{ + public static GameObject ErrorText; + public static GameObject CanvasContent; + + private void Awake() + { + ErrorText = Resources.Load("ErrorText") as GameObject; + CanvasContent = GameObject.Find("Canvas/ErrorScrollView/Viewport/Content"); + } + + public static void Log(Color color, string message, float time = 5) + { + Log(message, color, time); + } + + public static void Log(string message, Color color, float time = 5) + { + Debug.Log(message); + Text text = Instantiate(ErrorText, CanvasContent.transform).GetComponent(); + text.text = message; + text.color = color; + Destroy(text.gameObject, CanvasContent.transform.childCount + 1 * time); + } +} \ No newline at end of file diff --git a/Assets/Scripts/Error.cs.meta b/Assets/Scripts/Error.cs.meta new file mode 100644 index 0000000..bfe8db4 --- /dev/null +++ b/Assets/Scripts/Error.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 07843c4377dd7cb4495bedfa1057ddc7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/FateAssetManager.cs b/Assets/Scripts/FateAssetManager.cs new file mode 100644 index 0000000..e8422a7 --- /dev/null +++ b/Assets/Scripts/FateAssetManager.cs @@ -0,0 +1,69 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Networking; + +public class FateAssetManager : MonoBehaviour +{ + public static FateAssetManager Instance; + + void Awake() + { + Instance = this; + } + + public static IEnumerator DownloadTexture(string url, System.Action callback) + { + Texture2D outTex = null; + Debug.Log("Downloading Texture " + url); + UnityWebRequest www = UnityWebRequestTexture.GetTexture(url); + yield return www.SendWebRequest(); + + if (www.result != UnityWebRequest.Result.Success) + { + Debug.Log(www.error); + } + else + { + outTex = ((DownloadHandlerTexture)www.downloadHandler).texture; + outTex.wrapMode = TextureWrapMode.Clamp; + } + callback(outTex); + } + + public static IEnumerator DownloadText(string url, System.Action callback) + { + UnityWebRequest www = UnityWebRequest.Get(url); + yield return www.SendWebRequest(); + if (www.result != UnityWebRequest.Result.Success) + { + Debug.Log(url); + Debug.Log(www.error); + callback(null); + } + else + { + var str = www.downloadHandler.text; + callback(str); + } + } + + public static IEnumerator DownloadBundle(string url, System.Action callback) + { + Error.Log(Color.green, $"Downloading bundle from {url}"); + UnityWebRequest www = UnityWebRequestAssetBundle.GetAssetBundle(url); + yield return www.SendWebRequest(); + AssetBundle bundlea = null; + if (www.result != UnityWebRequest.Result.Success) + { + Error.Log(Color.red, www.error); + } + else + { + bundlea = DownloadHandlerAssetBundle.GetContent(www); + } + + callback(bundlea); + } + +} diff --git a/Assets/Scripts/FateAssetManager.cs.meta b/Assets/Scripts/FateAssetManager.cs.meta new file mode 100644 index 0000000..a851af8 --- /dev/null +++ b/Assets/Scripts/FateAssetManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a27da48354afb9a4faf06ab69ecb72df +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/FateModelBuilder.cs b/Assets/Scripts/FateModelBuilder.cs new file mode 100644 index 0000000..405e663 --- /dev/null +++ b/Assets/Scripts/FateModelBuilder.cs @@ -0,0 +1,487 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +using UnityEngine; +using UnityEngine.Networking; +using UnityEngine.UI; + +public class FateModelBuilder : MonoBehaviour +{ + public Material ParticleMaterial; + public static FateModelBuilder Instance; + public bool LoadingInProgress = false; + + public AnimatorOverrideController AnimatorController; + + private void Awake() + { + Instance = this; + } + + public IEnumerator ReplaceServant(string id) + { + if (LoadingInProgress) + { + Error.Log(Color.red, "Loading already in progress!"); + yield break; + } + if (FateViewerMain.SelectedServant != null) + { + FateViewerMain.SelectedServant.DeleteModel(); + } + yield return LoadServant(id); + } + + public IEnumerator LoadServant(string id) + { + if (LoadingInProgress) yield break; + LoadingInProgress = true; + + var Servants = FateViewerMain.Instance.Servants; + int idNum = int.Parse(id); + var urlBase = $"{FateViewerMain.AAContent}Servants/{idNum}"; + + var costume = Servants.GetAllCostumes().FirstOrDefault(s => s.battleCharaId == idNum); + if (costume != null) + { + var servant = Servants.Entries.First(s => s.costumes.Contains(costume)); + + var lcButt = UIController.Instance.LoadedCharaButton; + lcButt.GetComponentInChildren().text = servant.name + " - AA database"; + lcButt.GetComponentInChildren